@knpkv/control-center 0.3.0 → 0.4.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.
- package/README.md +52 -9
- package/dist/client/.vite/manifest.json +183 -170
- package/dist/client/assets/{ActiveWorkPage-DJQgGZeV.js → ActiveWorkPage-Dd1mxPrq.js} +2 -2
- package/dist/client/assets/{ActiveWorkPage-DJQgGZeV.js.map → ActiveWorkPage-Dd1mxPrq.js.map} +1 -1
- package/dist/client/assets/AgentPage-C3LThgPZ.js +3 -0
- package/dist/client/assets/AgentPage-C3LThgPZ.js.map +1 -0
- package/dist/client/assets/{AtlassianOAuthCallbackPage-D1F1xE_2.js → AtlassianOAuthCallbackPage-BPoF6oKf.js} +2 -2
- package/dist/client/assets/{AtlassianOAuthCallbackPage-D1F1xE_2.js.map → AtlassianOAuthCallbackPage-BPoF6oKf.js.map} +1 -1
- package/dist/client/assets/AuthorizedSharePage-jjqu6W_f.js +2 -0
- package/dist/client/assets/AuthorizedSharePage-jjqu6W_f.js.map +1 -0
- package/dist/client/assets/BrowserCrypto-BMbjhcvP.js +2 -0
- package/dist/client/assets/{BrowserCrypto-DVWR7DFd.js.map → BrowserCrypto-BMbjhcvP.js.map} +1 -1
- package/dist/client/assets/BrowserSessionHydrator-BC1ymLkL.js +2 -0
- package/dist/client/assets/BrowserSessionHydrator-BC1ymLkL.js.map +1 -0
- package/dist/client/assets/CommandSearch-WwAVDrD9.js +2 -0
- package/dist/client/assets/{CommandSearch-CP_QCbkm.js.map → CommandSearch-WwAVDrD9.js.map} +1 -1
- package/dist/client/assets/ItemsPage-CKK_KkJ2.js +2 -0
- package/dist/client/assets/{ItemsPage-BGFUkRL2.js.map → ItemsPage-CKK_KkJ2.js.map} +1 -1
- package/dist/client/assets/{PairPage-DIgzx0K2.js → PairPage-DA6cmyqF.js} +2 -2
- package/dist/client/assets/{PairPage-DIgzx0K2.js.map → PairPage-DA6cmyqF.js.map} +1 -1
- package/dist/client/assets/PortfolioOverview-CEI4gpXi.js +2 -0
- package/dist/client/assets/PortfolioOverview-CEI4gpXi.js.map +1 -0
- package/dist/client/assets/PullRequestReviewPanel-D7AKnwL-.js +6 -0
- package/dist/client/assets/PullRequestReviewPanel-D7AKnwL-.js.map +1 -0
- package/dist/client/assets/ReleaseRoute-CbPW3qUT.js +2 -0
- package/dist/client/assets/{ReleaseRoute-DXJ8Jg60.js.map → ReleaseRoute-CbPW3qUT.js.map} +1 -1
- package/dist/client/assets/ReleaseWorkset-BluAe7Sq.js +2 -0
- package/dist/client/assets/{ReleaseWorkset-Dtzalmji.js.map → ReleaseWorkset-BluAe7Sq.js.map} +1 -1
- package/dist/client/assets/ServicesPage-_B89DAvG.js +2 -0
- package/dist/client/assets/ServicesPage-_B89DAvG.js.map +1 -0
- package/dist/client/assets/TimelinePage-DvpgD8AY.js +2 -0
- package/dist/client/assets/TimelinePage-DvpgD8AY.js.map +1 -0
- package/dist/client/assets/WorkspaceEntityLink-DPj6MKI2.js +2 -0
- package/dist/client/assets/{WorkspaceEntityLink-AdZ_T-Wk.js.map → WorkspaceEntityLink-DPj6MKI2.js.map} +1 -1
- package/dist/client/assets/WorkspaceEntityRoute-B01fxxB3.js +3 -0
- package/dist/client/assets/WorkspaceEntityRoute-B01fxxB3.js.map +1 -0
- package/dist/client/assets/{WorkspaceHomeLink-XbKSPths.js → WorkspaceHomeLink-CkJfzO25.js} +2 -2
- package/dist/client/assets/{WorkspaceHomeLink-XbKSPths.js.map → WorkspaceHomeLink-CkJfzO25.js.map} +1 -1
- package/dist/client/assets/WorkspacePullRequestDetails-HwDgp12e.js +3 -0
- package/dist/client/assets/WorkspacePullRequestDetails-HwDgp12e.js.map +1 -0
- package/dist/client/assets/{WorkspaceReleaseLayout-cfboC5Qh.js → WorkspaceReleaseLayout-CGHi8eoo.js} +2 -2
- package/dist/client/assets/{WorkspaceReleaseLayout-cfboC5Qh.js.map → WorkspaceReleaseLayout-CGHi8eoo.js.map} +1 -1
- package/dist/client/assets/{WorkspaceSettingsPage-Fy7Wx8Y2.js → WorkspaceSettingsPage-DyoGiGJG.js} +2 -2
- package/dist/client/assets/{WorkspaceSettingsPage-Fy7Wx8Y2.js.map → WorkspaceSettingsPage-DyoGiGJG.js.map} +1 -1
- package/dist/client/assets/agent-api-CeONl_8w.js +19 -0
- package/dist/client/assets/agent-api-CeONl_8w.js.map +1 -0
- package/dist/client/assets/authenticatedMutationClient-DYaieXUe.js +2 -0
- package/dist/client/assets/{authenticatedMutationClient-Ccwguc3i.js.map → authenticatedMutationClient-DYaieXUe.js.map} +1 -1
- package/dist/client/assets/authorizedShareTransport-cxBoQzQ2.js +2 -0
- package/dist/client/assets/{authorizedShareTransport-DZHgFEkh.js.map → authorizedShareTransport-cxBoQzQ2.js.map} +1 -1
- package/dist/client/assets/client-DKS82kT_.js +5 -0
- package/dist/client/assets/client-DKS82kT_.js.map +1 -0
- package/dist/client/assets/connectionTestTransport-I_Ga9UNs.js +2 -0
- package/dist/client/assets/{connectionTestTransport-BQ55d6Me.js.map → connectionTestTransport-I_Ga9UNs.js.map} +1 -1
- package/dist/client/assets/index-C7_FDTU7.js +11 -0
- package/dist/client/assets/index-C7_FDTU7.js.map +1 -0
- package/dist/client/assets/{patterns-5N-j-AD2-BwypFm-e.js → patterns-5N-j-AD2-B9qgekXA.js} +2 -2
- package/dist/client/assets/{patterns-5N-j-AD2-BwypFm-e.js.map → patterns-5N-j-AD2-B9qgekXA.js.map} +1 -1
- package/dist/client/assets/{presentPortfolio-D3ZIcnqt.js → presentPortfolio-C_JsoSWg.js} +2 -2
- package/dist/client/assets/presentPortfolio-C_JsoSWg.js.map +1 -0
- package/dist/client/assets/{presentWorkspaceItems-Bmh4oEbH.js → presentWorkspaceItems-DboAfwGc.js} +2 -2
- package/dist/client/assets/{presentWorkspaceItems-Bmh4oEbH.js.map → presentWorkspaceItems-DboAfwGc.js.map} +1 -1
- package/dist/client/assets/{pullRequestReviewFailures-S74M-fOk.js → pullRequestReviewFailures-DHmYwffV.js} +2 -2
- package/dist/client/assets/{pullRequestReviewFailures-S74M-fOk.js.map → pullRequestReviewFailures-DHmYwffV.js.map} +1 -1
- package/dist/client/assets/pullRequestReviewThreadReplay-Vy1k53qE.js +2 -0
- package/dist/client/assets/pullRequestReviewThreadReplay-Vy1k53qE.js.map +1 -0
- package/dist/client/assets/releaseRoutes-t9uCfs5T.js +2 -0
- package/dist/client/assets/{releaseRoutes-BCuIdZyA.js.map → releaseRoutes-t9uCfs5T.js.map} +1 -1
- package/dist/client/assets/serviceOnboarding-DLINCon7.js +2 -0
- package/dist/client/assets/{serviceOnboarding-Jg_0yNjf.js.map → serviceOnboarding-DLINCon7.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceDefaultLanding-CzlDdEF-.js → useWorkspaceDefaultLanding-CC5ImHkL.js} +3 -3
- package/dist/client/assets/{useWorkspaceDefaultLanding-CzlDdEF-.js.map → useWorkspaceDefaultLanding-CC5ImHkL.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceItems-Cd3MPke2.js → useWorkspaceItems-B1X-JNwq.js} +2 -2
- package/dist/client/assets/{useWorkspaceItems-Cd3MPke2.js.map → useWorkspaceItems-B1X-JNwq.js.map} +1 -1
- package/dist/client/assets/workspaceEntityRoutes-2TejMrzb.js +2 -0
- package/dist/client/assets/workspaceEntityRoutes-2TejMrzb.js.map +1 -0
- package/dist/client/assets/workspaceScrollCapture-BsjcWVsk.js +2 -0
- package/dist/client/assets/workspaceScrollCapture-BsjcWVsk.js.map +1 -0
- package/dist/client/assets/workspaceSettingsTransport-Dw2hueXv.js +2 -0
- package/dist/client/assets/{workspaceSettingsTransport-CZWYL5T7.js.map → workspaceSettingsTransport-Dw2hueXv.js.map} +1 -1
- package/dist/client/build-graph.json +17 -0
- package/dist/client/index.html +1 -1
- package/dist/server/api/agent.d.ts +563 -44
- package/dist/server/api/agent.d.ts.map +1 -1
- package/dist/server/api/deliveryGraph.d.ts +454 -454
- package/dist/server/api/index.d.ts +1 -1
- package/dist/server/api/index.d.ts.map +1 -1
- package/dist/server/api/index.js +4 -4
- package/dist/server/api/liveEvents.d.ts +20 -0
- package/dist/server/api/liveEvents.d.ts.map +1 -1
- package/dist/server/api/portfolio.d.ts +23 -0
- package/dist/server/api/portfolio.d.ts.map +1 -1
- package/dist/server/api/shares.d.ts +2 -2
- package/dist/server/assets/{BindConfig-DIsf2Rnh.js → BindConfig-Bj282xDC.js} +2094 -290
- package/dist/server/assets/BindConfig-Bj282xDC.js.map +1 -0
- package/dist/server/assets/{CodePipelineStateDecoder-CVf1A2zG.js → CodePipelineStateDecoder-CNiFRgSi.js} +2 -2
- package/dist/server/assets/{CodePipelineStateDecoder-CVf1A2zG.js.map → CodePipelineStateDecoder-CNiFRgSi.js.map} +1 -1
- package/dist/server/assets/{agent-CyZ40zs1.js → agent-ZvwskOQu.js} +160 -10
- package/dist/server/assets/agent-ZvwskOQu.js.map +1 -0
- package/dist/server/assets/{controlCenterApi-ZUX3Y-LE.js → controlCenterApi-5j3gOXgE.js} +5 -5
- package/dist/server/assets/{controlCenterApi-ZUX3Y-LE.js.map → controlCenterApi-5j3gOXgE.js.map} +1 -1
- package/dist/server/assets/{descriptor-CKtTnhef.js → descriptor-CCvNzSZL.js} +10 -10
- package/dist/server/assets/{descriptor-CKtTnhef.js.map → descriptor-CCvNzSZL.js.map} +1 -1
- package/dist/server/assets/{failures-mgYDkUZy.js → failures-CesHLYbN.js} +2 -2
- package/dist/server/assets/{failures-mgYDkUZy.js.map → failures-CesHLYbN.js.map} +1 -1
- package/dist/server/assets/{firstPartyServices-D7b8BOek.js → firstPartyServices-Cdzjcs2H.js} +2 -2
- package/dist/server/assets/{firstPartyServices-D7b8BOek.js.map → firstPartyServices-Cdzjcs2H.js.map} +1 -1
- package/dist/server/assets/{manualPluginSynchronization-DFlhKvav.js → manualPluginSynchronization-CzIhZ_Dw.js} +5 -5
- package/dist/server/assets/{manualPluginSynchronization-DFlhKvav.js.map → manualPluginSynchronization-CzIhZ_Dw.js.map} +1 -1
- package/dist/server/assets/{plugins-D__oMDpI.js → plugins-DiPrfzV8.js} +2 -2
- package/dist/server/assets/{plugins-D__oMDpI.js.map → plugins-DiPrfzV8.js.map} +1 -1
- package/dist/server/assets/{readiness-BhA-Nr9c.js → readiness-BtntBhDj.js} +3 -3
- package/dist/server/assets/{readiness-BhA-Nr9c.js.map → readiness-BtntBhDj.js.map} +1 -1
- package/dist/server/assets/{relationshipInferenceMaterialization-DYBcaWhQ.js → relationshipInferenceMaterialization-CR6xyMNL.js} +1121 -159
- package/dist/server/assets/relationshipInferenceMaterialization-CR6xyMNL.js.map +1 -0
- package/dist/server/assets/{workspaceSettings-BE713Oe8.js → workspaceSettings-C2Zsk6RI.js} +2784 -2700
- package/dist/server/assets/workspaceSettings-C2Zsk6RI.js.map +1 -0
- package/dist/server/build-graph.json +117 -4
- package/dist/server/domain/actors.d.ts +12 -12
- package/dist/server/domain/deliveryGraph.d.ts +49 -49
- package/dist/server/domain/governedAction/bindings.d.ts +24 -12
- package/dist/server/domain/governedAction/bindings.d.ts.map +1 -1
- package/dist/server/domain/governedAction/lifecycle.d.ts +8 -8
- package/dist/server/domain/governedAction/model.d.ts +39 -18
- package/dist/server/domain/governedAction/model.d.ts.map +1 -1
- package/dist/server/domain/governedAction/stateMachine.d.ts +34 -34
- package/dist/server/domain/index.js +6 -6
- package/dist/server/domain/normalizedIssue.d.ts +1 -1
- package/dist/server/domain/prReview.d.ts +38 -0
- package/dist/server/domain/prReview.d.ts.map +1 -1
- package/dist/server/domain/prReviewReconciliation.d.ts +56 -0
- package/dist/server/domain/prReviewReconciliation.d.ts.map +1 -0
- package/dist/server/domain/prReviewRevision.d.ts +1 -0
- package/dist/server/domain/prReviewRevision.d.ts.map +1 -1
- package/dist/server/domain/readiness/model.d.ts +3 -3
- package/dist/server/domain/release.d.ts +3 -3
- package/dist/server/domain/releasePublication.d.ts +4 -0
- package/dist/server/domain/releasePublication.d.ts.map +1 -0
- package/dist/server/index.js +8 -8
- package/dist/server/server/agent/AgentJobWorker.d.ts +10 -1
- package/dist/server/server/agent/AgentJobWorker.d.ts.map +1 -1
- package/dist/server/server/agent/ReleaseAgentPrompt.d.ts.map +1 -1
- package/dist/server/server/agent/internal/AgentJobTaskExecutor.d.ts +4 -3
- package/dist/server/server/agent/internal/AgentJobTaskExecutor.d.ts.map +1 -1
- package/dist/server/server/agent/internal/PrReviewSandboxSession.d.ts +17 -1
- package/dist/server/server/agent/internal/PrReviewSandboxSession.d.ts.map +1 -1
- package/dist/server/server/agent/internal/PrReviewTaskExecutor.d.ts +76 -2
- package/dist/server/server/agent/internal/PrReviewTaskExecutor.d.ts.map +1 -1
- package/dist/server/server/agent/internal/PrReviewTelemetry.d.ts +27 -0
- package/dist/server/server/agent/internal/PrReviewTelemetry.d.ts.map +1 -0
- package/dist/server/server/api/ApplicationServices.d.ts +39 -5
- package/dist/server/server/api/ApplicationServices.d.ts.map +1 -1
- package/dist/server/server/api/Handlers.d.ts.map +1 -1
- package/dist/server/server/api/RequestBoundary.d.ts.map +1 -1
- package/dist/server/server/application/GovernedReviewSuggestionPublicationGateway.d.ts.map +1 -1
- package/dist/server/server/application/ReviewSuggestionPublicationGateway.d.ts +4 -0
- package/dist/server/server/application/ReviewSuggestionPublicationGateway.d.ts.map +1 -1
- package/dist/server/server/application/index.d.ts +1 -0
- package/dist/server/server/application/index.d.ts.map +1 -1
- package/dist/server/server/application/liveEvents.d.ts.map +1 -1
- package/dist/server/server/application/pipelineExecutionProjection.d.ts +6 -6
- package/dist/server/server/application/portfolioSnapshots.d.ts +2014 -4
- package/dist/server/server/application/portfolioSnapshots.d.ts.map +1 -1
- package/dist/server/server/application/pullRequestReviews.d.ts.map +1 -1
- package/dist/server/server/application/releaseAgent.d.ts +11 -3
- package/dist/server/server/application/releaseAgent.d.ts.map +1 -1
- package/dist/server/server/application/releasePublicationIntent.d.ts +7 -0
- package/dist/server/server/application/releasePublicationIntent.d.ts.map +1 -0
- package/dist/server/server/application/releasePublicationMetadata.d.ts +61 -0
- package/dist/server/server/application/releasePublicationMetadata.d.ts.map +1 -0
- package/dist/server/server/application/releasePublicationSubmissions.d.ts +3699 -0
- package/dist/server/server/application/releasePublicationSubmissions.d.ts.map +1 -0
- package/dist/server/server/application/releaseSynchronization.d.ts.map +1 -1
- package/dist/server/server/cli.js +8 -8
- package/dist/server/server/cli.js.map +1 -1
- package/dist/server/server/governance/governedActionDigests.d.ts +233 -218
- package/dist/server/server/governance/governedActionDigests.d.ts.map +1 -1
- package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts +3 -4
- package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts.map +1 -1
- package/dist/server/server/governance/internal/execution-store/begin.d.ts.map +1 -1
- package/dist/server/server/governance/internal/execution-store/dispatch-inbox.d.ts +1 -1
- package/dist/server/server/governance/internal/execution-store/dispatch-outcome.d.ts +8 -8
- package/dist/server/server/governance/internal/execution-store/provider-outcome-fold.d.ts +2 -2
- package/dist/server/server/governance/internal/execution-store/reconciliation-inbox.d.ts +1 -1
- package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts +36 -30
- package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts.map +1 -1
- package/dist/server/server/index.js +5 -5
- package/dist/server/server/internal/codepipeline-state-probe.js +1 -1
- package/dist/server/server/persistence/Database.d.ts +1 -1
- package/dist/server/server/persistence/Database.d.ts.map +1 -1
- package/dist/server/server/persistence/Persistence.d.ts +1539 -577
- package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
- package/dist/server/server/persistence/backup/BackupArchive.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/agentJobModels.d.ts +345 -8
- package/dist/server/server/persistence/repositories/agentJobModels.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/agentJobRepository.d.ts +654 -192
- package/dist/server/server/persistence/repositories/agentJobRepository.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +138 -138
- package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +25 -25
- package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +111 -111
- package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +27 -27
- package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +48 -48
- package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +111 -111
- package/dist/server/server/persistence/repositories/governed-action/codec.d.ts +255 -234
- package/dist/server/server/persistence/repositories/governed-action/codec.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/contract.d.ts +66 -46
- package/dist/server/server/persistence/repositories/governed-action/contract.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/read.d.ts +664 -190
- package/dist/server/server/persistence/repositories/governed-action/read.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts +676 -206
- package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts +37 -31
- package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts +44 -32
- package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/write.d.ts +44 -32
- package/dist/server/server/persistence/repositories/governed-action/write.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governedActionRepository.d.ts +674 -205
- package/dist/server/server/persistence/repositories/governedActionRepository.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/internal/reviewSuggestionRevisions.d.ts +85 -4
- package/dist/server/server/persistence/repositories/internal/reviewSuggestionRevisions.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/models.d.ts +9 -9
- package/dist/server/server/persistence/repositories/peopleRepository.d.ts +36 -36
- package/dist/server/server/persistence/repositories/providerAccountRepository.d.ts +1 -1
- package/dist/server/server/persistence/repositories/readiness/assessments.d.ts +6 -6
- package/dist/server/server/persistence/repositories/readiness/contract.d.ts +450 -450
- package/dist/server/server/persistence/repositories/readiness/queue.d.ts +14 -14
- package/dist/server/server/persistence/repositories/readinessRepository.d.ts +7 -7
- package/dist/server/server/persistence/repositories/releaseRepository.d.ts +18 -18
- package/dist/server/server/persistence/repositories/retentionRepository.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/timelineRepository.d.ts +4 -4
- package/dist/server/server/plugins/atlassian/AtlassianOAuthGrants.d.ts.map +1 -1
- package/dist/server/server/plugins/atlassian/AtlassianOAuthScopes.d.ts +9 -0
- package/dist/server/server/plugins/atlassian/AtlassianOAuthScopes.d.ts.map +1 -0
- package/dist/server/server/plugins/atlassian/AtlassianProfiles.d.ts.map +1 -1
- package/dist/server/server/plugins/codecommit/CodeCommitPluginDefinition.d.ts.map +1 -1
- package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts +2 -2
- package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts.map +1 -1
- package/dist/server/server/plugins/jira/JiraReadProvider.d.ts.map +1 -1
- package/dist/server/server/plugins/jira/JiraReleaseVersionLimits.d.ts +8 -0
- package/dist/server/server/plugins/jira/JiraReleaseVersionLimits.d.ts.map +1 -0
- package/dist/server/server/plugins/jira/index.d.ts +1 -1
- package/dist/server/server/plugins/jira/index.d.ts.map +1 -1
- package/dist/server/server/runtime/Bootstrap.d.ts +1 -1
- package/dist/server/server/runtime/Bootstrap.d.ts.map +1 -1
- package/dist/server/server/runtime/ControlCenterServer.d.ts +3 -3
- package/dist/server/server/runtime/ControlCenterServer.d.ts.map +1 -1
- package/dist/server/server/runtime/PrReviewWorkerStartup.d.ts +11 -1
- package/dist/server/server/runtime/PrReviewWorkerStartup.d.ts.map +1 -1
- package/dist/server/server/runtime/RetentionStartup.d.ts.map +1 -1
- package/dist/server/server/runtime/ServerLifecycle.d.ts.map +1 -1
- package/dist/server/server/secrets/SecretStore.d.ts.map +1 -1
- package/package.json +9 -8
- package/dist/client/assets/AgentPage-DGL93TJU.js +0 -3
- package/dist/client/assets/AgentPage-DGL93TJU.js.map +0 -1
- package/dist/client/assets/AuthorizedSharePage-DCQUFY2I.js +0 -2
- package/dist/client/assets/AuthorizedSharePage-DCQUFY2I.js.map +0 -1
- package/dist/client/assets/BrowserCrypto-DVWR7DFd.js +0 -2
- package/dist/client/assets/BrowserSessionHydrator-DE46feEX.js +0 -2
- package/dist/client/assets/BrowserSessionHydrator-DE46feEX.js.map +0 -1
- package/dist/client/assets/CommandSearch-CP_QCbkm.js +0 -2
- package/dist/client/assets/ItemsPage-BGFUkRL2.js +0 -2
- package/dist/client/assets/PortfolioOverview-D45rk8Hl.js +0 -2
- package/dist/client/assets/PortfolioOverview-D45rk8Hl.js.map +0 -1
- package/dist/client/assets/PullRequestReviewPanel-CqPtjhVW.js +0 -6
- package/dist/client/assets/PullRequestReviewPanel-CqPtjhVW.js.map +0 -1
- package/dist/client/assets/ReleaseRoute-DXJ8Jg60.js +0 -2
- package/dist/client/assets/ReleaseWorkset-Dtzalmji.js +0 -2
- package/dist/client/assets/ServicesPage-DGcUjd2H.js +0 -2
- package/dist/client/assets/ServicesPage-DGcUjd2H.js.map +0 -1
- package/dist/client/assets/TimelinePage-Bq1RTQlP.js +0 -2
- package/dist/client/assets/TimelinePage-Bq1RTQlP.js.map +0 -1
- package/dist/client/assets/WorkspaceEntityLink-AdZ_T-Wk.js +0 -2
- package/dist/client/assets/WorkspaceEntityRoute-Bxxnc8us.js +0 -3
- package/dist/client/assets/WorkspaceEntityRoute-Bxxnc8us.js.map +0 -1
- package/dist/client/assets/WorkspacePullRequestDetails-BErJ5bk8.js +0 -3
- package/dist/client/assets/WorkspacePullRequestDetails-BErJ5bk8.js.map +0 -1
- package/dist/client/assets/agent-api-QVqt4a0O.js +0 -19
- package/dist/client/assets/agent-api-QVqt4a0O.js.map +0 -1
- package/dist/client/assets/authenticatedMutationClient-Ccwguc3i.js +0 -2
- package/dist/client/assets/authorizedShareTransport-DZHgFEkh.js +0 -2
- package/dist/client/assets/client-D27unen8.js +0 -5
- package/dist/client/assets/client-D27unen8.js.map +0 -1
- package/dist/client/assets/connectionTestTransport-BQ55d6Me.js +0 -2
- package/dist/client/assets/index-j5ze816l.js +0 -11
- package/dist/client/assets/index-j5ze816l.js.map +0 -1
- package/dist/client/assets/presentPortfolio-D3ZIcnqt.js.map +0 -1
- package/dist/client/assets/pullRequestReviewThreadReplay-oljKM7Xz.js +0 -2
- package/dist/client/assets/pullRequestReviewThreadReplay-oljKM7Xz.js.map +0 -1
- package/dist/client/assets/releaseRoutes-BCuIdZyA.js +0 -2
- package/dist/client/assets/serviceOnboarding-Jg_0yNjf.js +0 -2
- package/dist/client/assets/workspaceScrollCapture-CJ4QUptr.js +0 -2
- package/dist/client/assets/workspaceScrollCapture-CJ4QUptr.js.map +0 -1
- package/dist/client/assets/workspaceSettingsTransport-CZWYL5T7.js +0 -2
- package/dist/server/assets/BindConfig-DIsf2Rnh.js.map +0 -1
- package/dist/server/assets/agent-CyZ40zs1.js.map +0 -1
- package/dist/server/assets/relationshipInferenceMaterialization-DYBcaWhQ.js.map +0 -1
- package/dist/server/assets/workspaceSettings-BE713Oe8.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manualPluginSynchronization-DFlhKvav.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 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
|
+
{"version":3,"file":"manualPluginSynchronization-CzIhZ_Dw.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 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":";;;;;;;;;;;;;;;;AAcA,IAAM,iBAAe,OAAO,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC;AACpE,IAAM,oBAAkB,OAAO,YAAY,OAAO,OAAO,OAAO,OAAO,CAAC;AACxE,IAAM,iBAA0B;AAChC,IAAM,kBAA4B;AAClC,IAAM,gBAAkC;AACxC,IAAM,cAAY,OAAO,MAAM,CAC7B,OAAO,QACP,OAAO,OAAO,EAAE,MAAM,OAAO,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC,EAAE,CAAC,CAC1E,CAAC;AACD,IAAM,mCAAmC,OAAO,OAAO;CACrD,YAAY;CACZ,YAAY;CACZ,iBAAiB;AACnB,CAAC;AACD,IAAM,qCAAqC,OAAO,OAAO;CACvD,MAAM;CACN,YAAY;CACZ,iBAAiB;CACjB,WAAW;AACb,CAAC;AACD,IAAM,mCAAmC,OAAO,OAAO;CACrD,MAAM;CACN,QAAQ,OAAO,YAAY,OAAO,QAAQ,gBAAgB,CAAC;AAC7D,CAAC;AACD,IAAM,+BAA+B,OAAO,OAAO;CACjD,UAAU;CACV,OAAO;CACP,UAAU;CACV,SAAS;AACX,CAAC;AACD,IAAM,sCAAsC,OAAO,OAAO;CACxD,MAAM;CACN,UAAU,OAAO,YAAY,OAAO,OAAO,OAAO,GAAG,CAAC;AACxD,CAAC;AACD,IAAM,qCAAqC,OAAO,OAAO;CACvD,MAAM;CACN,SAAS,OAAO,YAAY,OAAO,MAAM,mCAAmC,CAAC;AAC/E,CAAC;;AAGD,IAAM,gCAAgC;CACpC,cAAc;CACd,iBAAiB,OAAO,YAAY,OAAO,OAAO,OAAO,GAAG,CAAC;CAC7D,aAAa;CACb,iBAAiB;CACjB,eAAe;CACf,WAAW;CACX,WAAW;CACX,iBAAiB,OAAO,YAAY,OAAO,MAAM,gCAAgC,CAAC;CAClF,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CACf,2BAA2B;CAC3B,mBAAmB,OAAO,YAAY,OAAO,MAAM,kCAAkC,CAAC;CACtF,aAAa,OAAO,YAAY,OAAO,OAAO,OAAO,GAAG,CAAC;CACzD,kBAAkB,OAAO,YAAY,OAAO,OAAO;CACnD,iBAAiB,OAAO,YAAY,OAAO,OAAO,OAAO,GAAG,CAAC;CAC7D,mBAAmB;CACnB,WAAW;CACX,YAAY;CACZ,YAAY,OAAO,YAAY,OAAO,OAAO,4BAA4B,CAAC;CAC1E,WAAW;CACX,cAAc;CACd,gBAAgB,OAAO,YAAY,OAAO,MAAM,gCAAgC,CAAC;CACjF,iBAAiB,OAAO,YAAY,OAAO,MAAM,gCAAgC,CAAC;CAClF,0BAA0B;CAC1B,WAAW;CACX,cAAc;CACd,QAAQ,OAAO,YAAY,OAAO,MAAM,kCAAkC,CAAC;AAC7E;;AAGA,IAAa,+BAAoD,IAAI,IAAI,OAAO,KAAK,6BAA6B,CAAC;AAEnH,IAAM,2BAA2B,OAAO,OAAO;CAC7C,QAAQ,OAAO,YAAY,OAAO,OAAO,WAAS,CAAC;CACnD,GAAG;AACL,CAAC;;AAID,IAAa,mCAAb,cAAsD,OAAO,iBAAmD,CAAC,CAC/G,oCACA;CACE,gBAAgB,OAAO,OAAO,MAAM,OAAO,UAAU,GAAG,OAAO,WAAW,GAAG,OAAO,YAAY,GAAG,CAAC;CACpG,SAAS,OAAO,OAAO,MAAM,OAAO,UAAU,GAAG,OAAO,WAAW,GAAG,OAAO,YAAY,GAAG,CAAC;AAC/F,CACF,CAAC,CAAC,CAAC;AAEH,IAAM,eAAa,gBAAwB,YACzC,IAAI,iCAAiC;CAAE;CAAgB;AAAQ,CAAC;AAElE,IAAM,mBAAmB,OAAO,GAAG,8CAA8C,CAAC,CAAC,WAAU,OAAqB;CAChH,OAAO,OAAO,OAAO,oBAAoB,wBAAwB,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,KACnF,OAAO,eAAe,YAAU,wCAAwC,MAAM,OAAO,CAAC,CACxF;AACF,CAAC;AAED,IAAM,aAAW,OAAkC,UAAkB,YAA4B;CAC/F,MAAM,aAAa,OAAO,KAAK;CAC/B,QAAQ,eAAe,KAAA,KAAa,WAAW,WAAW,IAAI,WAAW,WAAA,CAAY,MAAM,GAAG,OAAO;AACvG;AAEA,IAAM,qBAAmB,OAAkC,YAAmC;CAC5F,MAAM,aAAa,OAAO,KAAK;CAC/B,OAAO,eAAe,KAAA,KAAa,WAAW,WAAW,IAAI,OAAO,WAAW,MAAM,GAAG,OAAO;AACjG;AAEA,IAAM,eAAa,UACjB,OAAO,UAAU,WAAW,QAAS,OAAO,QAAQ;;AAGtD,IAAa,kBACX,UAC8D;CAC9D,QAAQ,OAAO,kBAAkB,OAAO,GAAxC;EACE,KAAK;EACL,KAAK,WACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,cACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,IAAM,sBAAsB,OAAO,GAAG,gDAAgD,CAAC,CAAC,WACtF,OACA,SACmE;CACnE,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO;CAClD,MAAM,YAAY,OAAO,OAAO,oBAAoB,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,KACvE,OAAO,eAAe,YAAU,yCAAyC,OAAO,CAAC,CACnF;CACA,OAAO,SAAS,UAAU,SAAS;AACrC,CAAC;AAOD,IAAM,gBACJ,SACA,cAEA,YAAY,KAAA,KAAa,SAAS,MAAM,QAAQ,MAAM,YAAY,UAAU,MAAM,UAAU,IAAI,IAC5F,YACA;AAEN,IAAM,mBACJ,aACsC;CACtC,IAAI,SAAS,SAAS,QAAQ,GAAG,OAAO;CACxC,IAAI,SAAS,SAAS,SAAS,GAAG,OAAO;CACzC,IAAI,SAAS,SAAS,SAAS,GAAG,OAAO;CACzC,IAAI,SAAS,SAAS,KAAK,SAAS,OAAO,WAAW,WAAW,WAAW,GAAG,OAAO;CACtF,OAAO;AACT;AAEA,IAAM,gBAAgB,eAAwD;CAC5E,MAAM,eAAe,kBAAgB,WAAW,cAAc,GAAG;CACjE,MAAM,cAAc,kBAAgB,WAAW,aAAa,GAAG;CAC/D,OAAO,iBAAiB,QAAQ,gBAAgB,OAAO,OAAO,GAAG,aAAa,QAAQ;AACxF;;AAGA,IAAa,6BAA6B,OAAO,GAC/C,4CACF,CAAC,CAAC,WACA,QAC8F;CAC9F,MAAM,4BAAY,IAAI,IAAuC;CAC7D,KAAK,MAAM,SAAS,QAAQ;EAC1B,IACE,MAAM,SAAS,kBACd,MAAM,eAAe,+BACpB,MAAM,eAAe,gCACrB,MAAM,eAAe,4BACrB,MAAM,eAAe,2BACvB;EACF,MAAM,aAAa,OAAO,iBAAiB,KAAK;EAChD,MAAM,eAAe,kBAAgB,WAAW,cAAc,GAAG;EACjE,IAAI,iBAAiB,MAAM;EAC3B,MAAM,cAAc,MAAM,eAAe,8BACrC,OACA,kBAAgB,WAAW,aAAa,GAAG;EAC/C,IAAI,MAAM,eAAe,+BAA+B,gBAAgB,MAAM;EAC9E,MAAM,WAAW;GACf;GACA;GACA,iBAAiB,WAAW,mBAAmB;EACjD;EACA,MAAM,MAAM,gBAAgB,OACxB,GAAG,aAAa,yBAAyB,OAAO,SAAS,mBAAmB,EAAE,MAC9E,GAAG,aAAa,uBAAuB;EAC3C,IAAI,CAAC,UAAU,IAAI,GAAG,KAAK,UAAU,QAAA,IACnC,OAAO,OAAO,YAAU,kDAAkD,MAAM,OAAO;EAEzF,UAAU,IAAI,KAAK,QAAQ;CAC7B;CACA,OAAO,CAAC,GAAG,UAAU,OAAO,CAAC;AAC/B,CAAC;AAOD,IAAM,kBAAkB,eAAwE;CAC9F,MAAM,eAAe,kBAAgB,WAAW,cAAc,GAAG;CACjE,OAAO,iBAAiB,OACpB,OACA;EAAE;EAAc,iBAAiB,WAAW,mBAAmB;CAAK;AAC1E;AAEA,IAAM,+BACJ,aACA,cACY;CAEZ,IADqB,kBAAgB,UAAU,cAAc,GACzD,MAAiB,YAAY,cAAc,OAAO;CACtD,MAAM,mBAAmB,UAAU,mBAAmB;CACtD,OAAO,YAAY,oBAAoB,QAAQ,qBAAqB,QAClE,YAAY,oBAAoB;AACpC;;AAGA,IAAa,kCAAkC,OAAO,GACpD,gDACF,CAAC,CAAC,WACA,cACA,eACiF;CACjF,MAAM,+BAAe,IAAI,IAAY;CACrC,MAAM,uBAAsD,CAAC;CAC7D,KAAK,MAAM,SAAS,eAClB,IAAI,MAAM,eAAe,6BAA6B;EACpD,MAAM,MAAM,eAAe,OAAO,iBAAiB,KAAK,CAAC;EACzD,IAAI,QAAQ,MAAM,qBAAqB,KAAK,GAAG;CACjD,OAAO,IAAI,MAAM,eAAe,4BAA4B,MAAM,eAAe,2BAA2B;EAC1G,MAAM,MAAM,aAAa,OAAO,iBAAiB,KAAK,CAAC;EACvD,IAAI,QAAQ,MAAM,aAAa,IAAI,GAAG;CACxC;CAEF,IAAI,aAAa,SAAS,KAAK,qBAAqB,WAAW,GAAG,OAAO,CAAC;CAE1E,MAAM,aAAkC,CAAC;CACzC,KAAK,MAAM,SAAS,cAAc;EAChC,IAAI,MAAM,SAAS,kBAAkB,MAAM,eAAe,8BAA8B;EACxF,MAAM,aAAa,OAAO,iBAAiB,KAAK;EAChD,MAAM,MAAM,aAAa,UAAU;EACnC,IACG,QAAQ,QAAQ,aAAa,IAAI,GAAG,KACrC,qBAAqB,MAAM,gBAAgB,4BAA4B,aAAa,UAAU,CAAC,GAC/F,WAAW,KAAK,KAAK;CACzB;CACA,OAAO;AACT,CAAC;;AAGD,IAAa,2BAA2B,OAAO,GAAG,qCAAqC,CAAC,CAAC,WACvF,OACA,eAC2E;CAC3E,MAAM,aAAa,OAAO,iBAAiB,KAAK;CAChD,MAAM,cAAc,UAAQ,WAAW,aAAa,MAAM,mBAAmB,GAAG;CAChF,MAAM,eAAe,UAAQ,WAAW,cAAc,WAAW,GAAG;CACpE,MAAM,8BAAc,IAAI,IAAkC;CAC1D,MAAM,+BAAe,IAAI,IAAkC;CAC3D,IAAI;CAEJ,KAAK,MAAM,WAAW,eAAe;EACnC,IAAI,QAAQ,SAAS,kBAAkB,QAAQ,YAAY,MAAM,SAAS;EAC1E,IACE,QAAQ,eAAe,+BACvB,QAAQ,eAAe,4BACvB,QAAQ,eAAe,2BACvB;EACF,MAAM,oBAAoB,OAAO,iBAAiB,OAAO;EACzD,IAAI,UAAQ,kBAAkB,cAAc,WAAW,GAAG,MAAM,cAAc;EAC9E,MAAM,YAAY;GAAE,YAAY;GAAmB,OAAO;EAAQ;EAClE,IAAI,QAAQ,eAAe,6BAA6B;GACtD,IACE,WAAW,oBAAoB,QAC/B,WAAW,oBAAoB,KAAA,KAC/B,kBAAkB,oBAAoB,QACtC,kBAAkB,oBAAoB,KAAA,KACtC,kBAAkB,oBAAoB,WAAW,iBACjD;GACF,cAAc,aAAa,aAAa,SAAS;GACjD;EACF;EACA,IAAI,UAAQ,kBAAkB,aAAa,IAAI,GAAG,MAAM,aAAa;EACrE,IAAI,QAAQ,eAAe,0BAA0B;GACnD,MAAM,YAAY,kBAAgB,kBAAkB,WAAW,GAAG;GAClE,IAAI,cAAc,MAAM,YAAY,IAAI,WAAW,aAAa,YAAY,IAAI,SAAS,GAAG,SAAS,CAAC;GACtG;EACF;EACA,MAAM,oBAAoB,kBAAgB,kBAAkB,mBAAmB,GAAG;EAClF,IAAI,sBAAsB,MACxB,aAAa,IAAI,mBAAmB,aAAa,aAAa,IAAI,iBAAiB,GAAG,SAAS,CAAC;CAEpG;CAEA,MAAM,kBAAkB,aAAa,WAAW,UAAU,CAAC,EAAA,CAAG,SAAS,UAAU;EAC/E,MAAM,OAAO,kBAAgB,MAAM,MAAM,GAAG;EAC5C,MAAM,eAAe,MAAM,WAAW,CAAC,EAAA,CAAG,SAAS,QAAQ,UAAU;GACnE,MAAM,aAAa,kBAAgB,OAAO,MAAM,GAAG;GACnD,OAAO,eAAe,OAAO,CAAC,IAAI,CAAC;IAAE;IAAO,MAAM;IAAY,UAAU,OAAO,YAAY,QAAQ;GAAE,CAAC;EACxG,CAAC,CAAC,CAAC,MAAM,MAAM,UAAU,KAAK,WAAW,MAAM,YAAY,KAAK,QAAQ,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,WAAW,IAAI;EAC3G,OAAO,SAAS,OAAO,CAAC,IAAI,CAAC;GAAE,aAAa,MAAM,SAAS,UAAU;GAAG;GAAa;EAAK,CAAC;CAC7F,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG;CACf,MAAM,aAAa,IAAI,IAAI,eAAe,KAAK,EAAE,QAAQ,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;CACjF,MAAM,8BAAc,IAAI,IAAoB;CAC5C,KAAK,MAAM,SAAS,gBAClB,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,YAAY,QAAQ,SAAS;EAC7D,MAAM,aAAa,MAAM,YAAY;EACrC,IAAI,eAAe,KAAA,GAAW;EAC9B,MAAM,MAAM,GAAG,MAAM,KAAK,QAAQ;EAClC,IAAI,CAAC,YAAY,IAAI,GAAG,GAAG,YAAY,IAAI,KAAK,KAAK;CACvD;CAEF,MAAM,UAAU,OAAO,OAAO,QAC5B,CAAC,GAAG,aAAa,QAAQ,CAAC,IACzB,CAAC,mBAAmB,aACnB,OAAO,IAAI,aAAY;EACrB,MAAM,SAAS,QAAQ;EACvB,MAAM,YAAY,UAAQ,OAAO,WAAW,iBAAiB,GAAG;EAChE,MAAM,aAAa,UAAQ,OAAO,YAAY,mBAAmB,GAAG;EACpE,OAAO;GACL;GACA;GACA;GACA,QAAQ,eAAe,YAAU,OAAO,MAAM,CAAC;GAC/C,WAAW,OAAO,oBAAoB,OAAO,WAAW,QAAQ,MAAM,OAAO;GAC7E,WAAW,OAAO,oBAAoB,OAAO,WAAW,QAAQ,MAAM,OAAO;GAC7E,WAAW,kBAAgB,OAAO,WAAW,GAAG;GAChD,UAAU,kBAAgB,OAAO,YAAY,UAAU,GAAG;GAC1D,UAAU,kBAAgB,OAAO,YAAY,UAAU,GAAG;GAC1D,OAAO,kBAAgB,OAAO,YAAY,OAAO,GAAG;GACpD,SAAS,kBAAgB,OAAO,YAAY,SAAS,GAAG;GACxD,QAAQ,kBAAgB,OAAO,cAAc,GAAG;GAChD,0BAA0B,kBAAgB,OAAO,0BAA0B,GAAG;GAC9E,WAAW,kBAAgB,OAAO,WAAW,GAAG;GAChD,cAAc,kBAAgB,OAAO,cAAc,GAAG;GACtD,WAAW,CACT,IAAI,OAAO,kBAAkB,CAAC,EAAA,CAAG,KAAK,UAAU,WAAW;IACzD,MAAM,UAAQ,SAAS,MAAM,GAAG,WAAW,SAAS,OAAO,QAAQ,CAAC,KAAK,GAAG;IAC5E,WAAW;IACX,QAAQ;GACV,EAAE,GACF,IAAI,OAAO,mBAAmB,CAAC,EAAA,CAAG,KAAK,UAAU,WAAW;IAC1D,MAAM,UAAQ,SAAS,MAAM,GAAG,WAAW,UAAU,OAAO,QAAQ,CAAC,KAAK,GAAG;IAC7E,WAAW;IACX,QAAQ;GACV,EAAE,CACJ,CAAC,CAAC,MAAM,GAAG,GAAG;EAChB;CACF,CAAC,GACH,EAAE,aAAa,EAAE,CACnB;CACA,QAAQ,MAAM,MAAM,UAAU;EAC5B,MAAM,mBAAmB,WAAW,IAAI,KAAK,SAAS,KAAK,QAAQ,WAAW,IAAI,MAAM,SAAS,KAAK,QACpG,KAAK,UAAU,cAAc,MAAM,SAAS;EAC9C,IAAI,oBAAoB,GAAG,OAAO;EAClC,MAAM,YAAY,YAAY,IAAI,GAAG,KAAK,UAAU,QAAQ,KAAK,YAAY;EAC7E,MAAM,aAAa,YAAY,IAAI,GAAG,MAAM,UAAU,QAAQ,MAAM,YAAY;EAChF,IAAI,cAAc,KAAA,KAAa,eAAe,KAAA,GAAW;GACvD,MAAM,sBAAsB,aAAa,OAAO,qBAAqB,cAAc,OAAO;GAC1F,IAAI,uBAAuB,GAAG,OAAO;EACvC;EACA,OAAO,KAAK,WAAW,cAAc,MAAM,UAAU,KACnD,KAAK,kBAAkB,cAAc,MAAM,iBAAiB;CAChE,CAAC;CACD,MAAM,iBAAiB,QAAQ,MAAM,GAAG,GAAG;CAC3C,MAAM,cAAc,KAAK,IAAI,WAAW,eAAe,GAAG,QAAQ,MAAM;CACxE,MAAM,oBAAoB,WAAW,oBAAoB,UAAU,cAAc,eAAe;CAEhG,MAAM,gBAAgB;EACpB,GAAG,eAAe,KAAK,EAAE,WAAW,IAAI;EACxC,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK;EACxE,GAAG,QAAQ,KAAK,EAAE,gBAAgB,SAAS,CAAC,CAAC,QAC1C,MAAM,OAAO,UAAU,CAAC,WAAW,IAAI,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,KAAK,MAAM,QAAQ,IAAI,MAAM,KACrG,CAAC,CAAC,KAAK;CACT,CAAC,CAAC,MAAM,GAAG,GAAG;CACd,MAAM,sBAAsB,IAAI,IAAI,eAAe,KAAK,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;CACtF,MAAM,SAAS,cAAc,KAAK,SAAS;EACzC,MAAM,QAAQ,YAAY,IAAI,IAAI,CAAC,EAAE;EACrC,MAAM,eAAe,QAAQ,QAAQ,WAAW,OAAO,cAAc,IAAI;EACzE,MAAM,0BAA0B,eAAe,QAAQ,WAAW,OAAO,cAAc,IAAI,CAAC,CAAC;EAC7F,MAAM,mBAAmB,KAAK,IAC5B,OAAO,eAAe,GACtB,oBAAoB,IAAI,IAAI,CAAC,EAAE,eAAe,GAC9C,aAAa,MACf;EACA,OAAO;GACL;GACA,QAAQ,UAAU,KAAA,IACd,gBAAgB,aAAa,KAAK,EAAE,aAAa,MAAM,CAAC,IACxD,eAAe,YAAU,MAAM,MAAM,CAAC;GAC1C,aAAa;GACb,mBAAmB,OAAO,oBAAoB,WAC3C,WAAW,oBAAoB,UAChC,mBAAmB;EACvB;CACF,CAAC;CACD,MAAM,iBAAiB,WAAW,iBAAiB,MAAM,EAAE,iBAAiB,kBAAgB,YAAY,GAAG,MAAM,IAAI,CAAC,EAClH;CACJ,MAAM,mBAAmB,WAAW,mBAAmB,CAAC,EAAA,CAAG,SAAS,WAAW;EAC7E,MAAM,aAAa,kBAAgB,OAAO,YAAY,GAAG;EACzD,OAAO,eAAe,OAAO,CAAC,IAAI,CAAC;GACjC;GACA,YAAY,kBAAgB,OAAO,YAAY,GAAG;GAClD,iBAAiB,kBAAgB,OAAO,iBAAiB,GAAG;EAC9D,CAAC;CACH,CAAC,CAAC,CAAC,QAAQ,QAAQ,OAAO,YACxB,QAAQ,WAAW,EAAE,iBAAiB,eAAe,OAAO,UAAU,MAAM,KAC9E,CAAC,CAAC,MAAM,GAAG,GAAG;CACd,MAAM,kBAAkB,OAAO,OAAO,SACnC,WAAW,qBAAqB,CAAC,EAAA,CAAG,MAAM,GAAG,GAAG,IAChD,UAAU,UACT,OAAO,IAAI,aAAY;EACrB,OAAO;GACL,MAAM,UAAQ,SAAS,MAAM,mBAAmB,OAAO,QAAQ,CAAC,KAAK,GAAG;GACxE,YAAY,kBAAgB,SAAS,YAAY,GAAG;GACpD,iBAAiB,kBAAgB,SAAS,iBAAiB,GAAG;GAC9D,WAAW,OAAO,oBAAoB,SAAS,WAAW,MAAM,OAAO;GACvE,QAAQ;EACV;CACF,CAAC,GACH,EAAE,aAAa,EAAE,CACnB;CACA,OAAO,OAAO,OAAO,oBAAoB,qBAAqB,CAAC,CAAC;EAC9D,MAAM;EACN;EACA;EACA,QAAQ,eAAe,YAAU,WAAW,MAAM,CAAC;EACnD,iBAAiB,UACf,kBAAgB,WAAW,iBAAiB,GAAG,KAAK,kBAAgB,gBAAgB,GAAG,GACvF,MAAM,UACN,GACF;EACA,iBAAiB,WAAW,mBAAmB;EAC/C,eAAe,kBAAgB,WAAW,eAAe,GAAG;EAC5D,WAAW,OAAO,oBAAoB,WAAW,WAAW,MAAM,OAAO;EACzE,WAAW,OAAO,oBAAoB,WAAW,WAAW,MAAM,OAAO;EACzE,aAAa,kBAAgB,WAAW,aAAa,GAAG;EACxD,eAAe,kBAAgB,WAAW,eAAe,GAAG;EAC5D,eAAe,kBAAgB,WAAW,eAAe,GAAG;EAC5D,eAAe,kBAAgB,WAAW,eAAe,GAAG;EAC5D,2BAA2B,kBAAgB,WAAW,2BAA2B,GAAG;EACpF;EACA;EACA,SAAS;EACT;EACA;EACA,iBAAiB,KAAK,IAAI,WAAW,mBAAmB,GAAG,CAAC;EAC5D;CACF,CAAC,CAAC,CAAC,KACD,OAAO,eAAe,YAAU,uCAAuC,MAAM,OAAO,CAAC,CACvF;AACF,CAAC;;;ACxdD,IAAM,iBACJ,IAAI,sBAAsB;CACxB,WAAW;CACX,gBAAgB;AAClB,CAAC;AAEH,IAAM,eAAe,OAAO,GAAG,8CAA8C,CAAC,CAAC,WAC7E,aACA,YACA;CACA,MAAM,gBAAgB,OAAO,YAAY,qBAAqB,IAC5D,WAAW,aACX,WAAW,kBACb;CACA,OAAO;EACL,aAAa,WAAW;EACxB,oBAAoB,WAAW;EAC/B,YAAY,WAAW;EACvB,oBAAoB,WAAW;EAC/B,uBAAuB,OAAO,OAAO,aAAa,IAAI,cAAc,MAAM,WAAW;CACvF;AACF,CAAC;;AAGD,IAAa,wCAAwC,OAAO,GAC1D,wCACF,CAAC,CAAC,WACA,aACA,aACA,oBAIA;CACA,OAAO,OAAO,YAAY,SAAS,OAAO,IAAI,aAAY;EACxD,MAAM,aAAa,OAAO,YAAY,kBAAkB,IAAI,aAAa,kBAAkB;EAE3F,OAAO;GAAE;GAAY,WAAA,OADI,aAAa,aAAa,UAAU;EAC9B;CACjC,CAAC,CAAC;AACJ,CAAC;;AAGD,IAAa,uCAAuC,OAAO,GACzD,uCACF,CAAC,CAAC,WACA,aACA,UAC6E;CAC7E,MAAM,aAAa,OAAO,YAAY,kBAAkB,IACtD,SAAS,aACT,SAAS,kBACX,CAAC,CAAC,KACA,OAAO,SAAS,6BAA6B,SAAS,CAAC,CACzD;CACA,MAAM,UAAU,OAAO,aAAa,aAAa,UAAU;CAC3D,IACE,CAAC,WAAW,aACZ,QAAQ,eAAe,SAAS,cAChC,QAAQ,uBAAuB,SAAS,sBACxC,QAAQ,0BAA0B,SAAS,uBAE3C,OAAO,OAAO,SAAS;AAE3B,CAAC;;;ACdD,IAAM,4BAA4B,eAChC,eAAe,+BACf,eAAe,gCACf,eAAe,4BACf,eAAe;AAEjB,IAAM,wBAAwB,UAC5B,MAAM,SAAS,kBAAkB,yBAAyB,MAAM,UAAU;AAE5E,IAAM,2BAA2B,UAC/B,MAAM,SAAS,qBAAqB,yBAAyB,MAAM,UAAU;AAE/E,IAAM,0BAA0B,UAC9B,GAAG,MAAM,WAAW,QAAQ,MAAM;AAUpC,IAAM,eAAe,OAAO,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC;AACpE,IAAM,kBAAkB,OAAO,YAAY,OAAO,OAAO,OAAO,OAAO,CAAC;AACxE,IAAM,YAAY,OAAO,MAAM,CAC7B,OAAO,QACP,OAAO,OAAO,EAAE,MAAM,OAAO,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC,EAAE,CAAC,CAC1E,CAAC;AACD,IAAM,mBAAmB,OAAO,OAAO;CACrC,KAAK;CACL,QAAQ,OAAO,YAAY,OAAO,OAAO,SAAS,CAAC;CACnD,UAAU,OAAO,YAAY,OAAO,OAAO,SAAS,CAAC;CACrD,gBAAgB,OAAO,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC;CAC/D,YAAY;CACZ,cAAc;CACd,cAAc;CACd,cAAc;CACd,cAAc;CACd,WAAW;CACX,aAAa;CACb,WAAW;CACX,cAAc;CACd,kBAAkB;CAClB,aAAa;CACb,UAAU;CACV,SAAS;CACT,gBAAgB,OAAO,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC;CAC/D,iBAAiB,OAAO,YAAY,OAAO,MAAM,OAAO,MAAM,CAAC;CAC/D,uBAAuB,OAAO,YAAY,OAAO,MAAM,OAAO,MAAM,CAAC;CACrE,eAAe;CACf,UAAU;CACV,iBAAiB,OAAO,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC;CAChE,UAAU,OAAO,YAAY,OAAO,OAAO;CAC3C,QAAQ,OAAO,YAAY,OAAO,OAAO;CACzC,eAAe;CACf,QAAQ;CACR,WAAW;CACX,UAAU,OAAO,YAAY,OAAO,OAAO;EACzC,UAAU;EACV,OAAO;EACP,OAAO;EACP,KAAK;CACP,CAAC,CAAC;AACJ,CAAC;AACD,IAAM,wBAAwB,OAAO,OAAO;CAC1C,KAAK;CACL,QAAQ,OAAO,YAAY,OAAO,OAAO,SAAS,CAAC;CACnD,UAAU,OAAO,YAAY,OAAO,OAAO,SAAS,CAAC;CACrD,gBAAgB,OAAO,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC;AACjE,CAAC;AACD,IAAM,2CAAgD,IAAI,IAAI;CAC5D;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,IAAM,8BAAmD,IAAI,IAAI,OAAO,KAAK,0BAA0B,MAAM,CAAC;AAC9G,IAAM,oBAAoB,OAAO,OAAO;CACtC,aAAa,OAAO,OAAO,MAAM,OAAO,UAAU,GAAG,OAAO,WAAW,GAAG,OAAO,YAAY,GAAG,CAAC;CACjG,SAAS,OAAO,OAAO,MAAM,OAAO,UAAU,GAAG,OAAO,WAAW,GAAG,OAAO,YAAY,GAAG,CAAC;CAC7F,WAAW,OAAO,SAAS;EAAC;EAAc;EAAa;EAAa;EAAY;CAAW,CAAC;AAC9F,CAAC;AACD,IAAM,gCAAgC,OAAO,OAAO;CAClD,aAAa,OAAO,MAAM,OAAO,OAAO,EACtC,UAAU,OAAO,OAAO,OAAO,MAAM,EACvC,CAAC,CAAC;CACF,iBAAiB,OAAO,MAAM,OAAO,MAAM;AAC7C,CAAC;AACD,IAAM,eAAe,OAAO,OAAO;CACjC,WAAW,OAAO,YAAY,iBAAiB;CAC/C,OAAO,OAAO,YAAY,aAAa;AACzC,CAAC;;AAED,IAAa,2CAAb,cAA8D,OAAO,iBAEnE,CAAC,CAAC,4CAA4C;CAC9C,gBAAgB,OAAO,OAAO,MAAM,OAAO,UAAU,GAAG,OAAO,WAAW,GAAG,OAAO,YAAY,GAAG,CAAC;CACpG,SAAS,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,UAAU,GAAG,OAAO,WAAW,GAAG,OAAO,YAAY,GAAG,CAAC,CAAC;AAC9G,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAM,aAAa,gBAAwB,UAAyB,SAClE,IAAI,yCAAyC;CAAE;CAAgB;AAAQ,CAAC;AAE1E,IAAM,oBAAoB,OAAO,GAAG,sDAAsD,CAAC,CAAC,WAC1F,OACA;CACA,OAAO,OAAO,OAAO,oBAAoB,gBAAgB,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,KAC3E,OAAO,eAAe,UAAU,wCAAwC,MAAM,OAAO,CAAC,CACxF;AACF,CAAC;AAED,IAAM,WAAW,OAAkC,UAAkB,YAA4B;CAC/F,MAAM,aAAa,OAAO,KAAK;CAC/B,QAAQ,eAAe,KAAA,KAAa,WAAW,WAAW,IAAI,WAAW,WAAA,CAAY,MAAM,GAAG,OAAO;AACvG;AAEA,IAAM,mBAAmB,OAAkC,YAAmC;CAC5F,MAAM,aAAa,OAAO,KAAK;CAC/B,OAAO,eAAe,KAAA,KAAa,WAAW,WAAW,IAAI,OAAO,WAAW,MAAM,GAAG,OAAO;AACjG;AAEA,IAAM,aAAa,UACjB,OAAO,UAAU,WAAW,QAAS,OAAO,QAAQ;AAEtD,IAAM,iCAAiC,OAAO,GAC5C,mEACF,CAAC,CAAC,WACA,OACA,SACA,gBACiF;CACjF,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO;CAClD,OAAO,OAAO,OAAO,oBAAoB,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,KAC5D,OAAO,eAAe,UAAU,gBAAgB,OAAO,CAAC,CAC1D;AACF,CAAC;AAED,IAAM,yBAAyB,OAAO,GAAG,2DAA2D,CAAC,CAAC,WACpG,OACA;CACA,MAAM,aAAa,OAAO,oBAAoB,yBAAyB,CAAC,CAAC,MAAM,UAAU;CACzF,IAAI,OAAO,UAAU,UAAU,GAAG,OAAO,WAAW;CACpD,IACE,OAAO,KAAK,MAAM,UAAU,CAAC,CAAC,MAAM,QAClC,CAAC,yBAAyB,IAAI,GAAG,MAChC,CAAC,6BAA6B,IAAI,GAAG,KAAK,4BAA4B,IAAI,GAAG,EAChF,GAEA,OAAO,OAAO,UAAU,uCAAuC,MAAM,OAAO;CAG9E,MAAM,SAAS,OAAO,OAAO,oBAAoB,qBAAqB,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,KACxF,OAAO,eAAe,UAAU,uCAAuC,MAAM,OAAO,CAAC,CACvF;CACA,MAAM,MAAM,QAAQ,OAAO,KAAK,MAAM,mBAAmB,GAAG;CAC5D,OAAO,OAAO,OAAO,oBAAoB,yBAAyB,CAAC,CAAC;EAClE;EACA,QAAQ,QAAQ,UAAU,OAAO,MAAM,GAAG,WAAW,GAAG;EACxD,UAAU,OAAO,aAAa,QAAQ,OAAO,aAAa,KAAA,IACtD,OACA,QAAQ,UAAU,OAAO,QAAQ,GAAG,WAAW,GAAG;EACtD,gBAAgB,OAAO,kBAAkB;CAC3C,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,UAAU,uCAAuC,MAAM,OAAO,CAAC,CAAC;AAChG,CAAC;AAED,IAAM,uBAAuB,OAAO,GAAG,yDAAyD,CAAC,CAAC,WAChG,OACA,SACA;CACA,OAAO,OAAO,OAAO,oBAAoB,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,KAC5D,OAAO,eAAe,UAAU,qCAAqC,OAAO,CAAC,CAC/E;AACF,CAAC;AAED,IAAM,kCAAkC,OAAO,GAC7C,oEACF,CAAC,CAAC,WAAU,OAAqB;CAC/B,IAAI,MAAM,eAAe,mBAAmB,OAAO;CACnD,MAAM,UAAU,OAAO,oBAAoB,0BAA0B,CAAC,CAAC,MAAM,UAAU;CACvF,IAAI,OAAO,UAAU,OAAO,GAAG;EAC7B,IAAI,OAAO,OAAO,MAAM,YAAY,eAAe,GACjD,OAAO,OAAO,UAAU,iDAAiD,MAAM,OAAO;EAExF,OAAO;CACT;CACA,MAAM,aAAa,QAAQ;CAC3B,MAAM,WAAW,OAAO,OAAO,QAAQ,WAAW,WAAW,YAC3D,OAAO,IAAI,aAAY;EACrB,OAAO;GACL,QAAQ,QAAQ;GAChB,WAAW,OAAO,qBAAqB,QAAQ,WAAW,MAAM,OAAO;GACvE,SAAS,QAAQ;GACjB,WAAW,QAAQ;GACnB,sBAAsB,QAAQ;EAChC;CACF,CAAC,CAAC;CACJ,MAAM,cAAc,WAAW,gBAAgB,KAAA,IAC3C,KAAA,IACA,OAAO,OAAO,QAAQ,WAAW,cAAc,eAC/C,OAAO,IAAI,aAAY;EACrB,OAAO;GACL,GAAG;GACH,WAAW,OAAO,qBAAqB,WAAW,WAAW,MAAM,OAAO;EAC5E;CACF,CAAC,CAAC;CACN,MAAM,eAAkC,WAAW,gBAAgB;CACnE,OAAO;EACL,eAAe,WAAW;EAC1B,gBAAgB,WAAW;EAC3B,WAAW,OAAO,qBAAqB,WAAW,WAAW,MAAM,OAAO;EAC1E,WAAW,OAAO,qBAAqB,WAAW,WAAW,MAAM,OAAO;EAC1E,SAAS,WAAW;EACpB;EACA;EACA,gBAAgB,WAAW;EAC3B,cAAc,WAAW,aAAa,KAAK,iBAAiB;GAC1D,gBAAgB,YAAY;GAC5B,aAAa,YAAY;GACzB,QAAQ,YAAY;GACpB,UAAU,YAAY;GACtB,UAAU,YAAY;GACtB,OAAO,YAAY;EACrB,EAAE;EACF,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY;EACnD,GAAI,WAAW,wBAAwB,KAAA,IAAY,CAAC,IAAI,EACtD,qBAAqB,WAAW,oBAClC;EACA,GAAI,WAAW,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,kBAAkB,WAAW,iBAAiB;CACvG;AACF,CAAC;AAED,IAAM,iBAAiB,eAA8D;CACnF,QAAQ,YAAR;EACE,KAAK;EACL,KAAK,cACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK;EACL,KAAK,mBACH,OAAO;EACT,KAAK;EACL,KAAK,8BACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK;EACL,KAAK,uBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,IAAM,eACJ,UACgF;CAChF,QAAQ,OAAO,YAAY,GAA3B;EACE,KAAK,aACH,OAAO;EACT,KAAK;EACL,KAAK,qBACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,IAAM,wBAAwB,UAA0E;CACtG,QAAQ,OAAO,YAAY,GAA3B;EACE,KAAK,QACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,IAAM,sBAAsB,UAA6C;CACvE,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO;CAClD,MAAM,QAAQ,yCAAyC,KAAK,KAAK;CACjE,IAAI,UAAU,MAAM,OAAO;CAC3B,MAAM,QAAQ,OAAO,MAAM,MAAM,CAAC;CAClC,MAAM,UAAU,OAAO,MAAM,MAAM,CAAC;CACpC,MAAM,UAAU,OAAO,MAAM,MAAM,CAAC;CACpC,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,UAAU,UAAU,EAAE,CAAC;AACpE;AAEA,IAAM,qBAAqB,OAAO,GAAG,wDAAwD,CAAC,CAAC,WAC7F,OACA,MACA,eAIA;CACA,MAAM,aAAa,OAAO,kBAAkB,KAAK;CACjD,QAAQ,MAAR;EACE,KAAK,SAAS;GACZ,MAAM,kBAAkB,OAAO,uBAAuB,KAAK;GAC3D,OAAO;IACL,YAAY,gBAAgB;IAC5B,SAAS;KACP,MAAM;KACN,GAAG;IACL;GACF;EACF;EACA,KAAK,gBAAgB;GACnB,MAAM,eAAe,OAAO,+BAC1B,WAAW,cACX,MAAM,SACN,2CACF;GACA,MAAM,mBAAmB,OAAO,+BAC9B,WAAW,kBACX,MAAM,SACN,2CACF;GACA,MAAM,SAAS,UAAU,WAAW,MAAM;GAC1C,OAAO;IACL,YAAY,QAAQ,MAAM,mBAAmB,MAAM,mBAAmB,GAAG;IACzE,SAAS;KACP,MAAM;KACN,YAAY,QAAQ,WAAW,YAAY,WAAW,GAAG;KACzD,cAAc,QAAQ,WAAW,cAAc,WAAW,GAAG;KAC7D,cAAc,QAAQ,WAAW,cAAc,WAAW,GAAG;KAC7D,cAAc,QAAQ,WAAW,cAAc,MAAM,UAAU,GAAG;KAClE,aAAa,YAAY,WAAW,gBAAgB,qBAAqB,MAAM,MAAM,OAAO,SAAS,KAAK;KAC1G,WAAW,qBAAqB,MAAM;KACtC,aAAa,gBAAgB,WAAW,aAAa,GAAM;KAC3D,iBAAiB,gBAAgB,WAAW,WAAW,GAAG;KAC1D,cAAc,gBAAgB,WAAW,cAAc,GAAG;KAC1D,mBAAmB,gBAAgB,WAAW,WAAW,GAAG;KAC5D,WAAW,iBAAiB,OAAO,OAAO,SAAS,UAAU,YAAY;KACzE,WAAW,qBAAqB,OAAO,OAAO,SAAS,UAAU,gBAAgB;IACnF;GACF;EACF;EACA,KAAK,QAAQ;GACX,MAAM,iBAAiB,OAAO,gCAAgC,KAAK;GACnE,OAAO;IACL,YAAY,QAAQ,MAAM,mBAAmB,MAAM,mBAAmB,GAAG;IACzE,SAAS;KACP,MAAM;KACN,UAAU,QAAQ,WAAW,YAAY,WAAW,SAAS,WAAW,GAAG;KAC3E,UAAU,QACR,WAAW,mBAAmB,QAAQ,WAAW,mBAAmB,KAAA,IAChE,WAAW,WACX,OAAO,WAAW,cAAc,GACpC,MAAM,UACN,GACF;KACA,QAAQ,UAAU,WAAW,MAAM,CAAC,EAAE,YAAY,MAAM,eAAe,eAAe;KACtF,GAAI,WAAW,oBAAoB,KAAA,IAAY,CAAC,IAAI,EAClD,iBAAiB,WAAW,gBACzB,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CACxB,QAAQ,KAAK,OAAO,SAAS,IAAI,SAAS,KAAK,IAAI,UAAU,OAAO,KAAK,QAAQ,GAAG,MAAM,KAAK,CAAC,CAChG,MAAM,GAAG,GAAG,EACjB;KACA,GAAI,WAAW,0BAA0B,KAAA,IAAY,CAAC,IAAI,EACxD,uBAAuB,WAAW,sBAC/B,KAAK,YAAY,QAAQ,KAAK,CAAC,CAAC,CAChC,QACE,SAAS,OAAO,aACf,QAAQ,SAAS,KAAK,QAAQ,UAAU,OAAO,SAAS,QAAQ,OAAO,MAAM,KACjF,CAAC,CACA,MAAM,GAAG,GAAG,EACjB;KACA,GAAI,kBAAkB,CAAC;IACzB;GACF;EACF;EACA,KAAK,sBAAsB;GACzB,MAAM,UAAU,OAAO,yBAAyB,OAAO,aAAa,CAAC,CAAC,KACpE,OAAO,UAAU,UAAU,UAAU,MAAM,gBAAgB,MAAM,OAAO,CAAC,CAC3E;GACA,IAAI,QAAQ,SAAS,sBACnB,OAAO,OAAO,UAAU,4CAA4C,MAAM,OAAO;GAEnF,OAAO;IACL,YAAY,QAAQ,GAAG,QAAQ,aAAa,GAAG,QAAQ,eAAe,QAAQ,aAAa,GAAG;IAC9F;GACF;EACF;EACA,KAAK,cAAc;GACjB,MAAM,gBAAgB,OAAO,OAAO,oBAAoB,aAAa,CAAC,CAAC,WAAW,aAAa,CAAC,CAAC,KAC/F,OAAO,eAAe,UAAU,6CAA6C,MAAM,OAAO,CAAC,CAC7F;GACA,MAAM,SAAS,eAAe,UAAU,WAAW,MAAM,CAAC;GAC1D,OAAO;IACL,YAAY,QAAQ,MAAM,mBAAmB,MAAM,mBAAmB,GAAG;IACzE,SAAS;KACP,MAAM;KACN;KACA,UAAU,QAAQ,WAAW,UAAU,MAAM,UAAU,GAAG;KAC1D,QAAQ,WAAW,WAAW,YAAY,WAAW,YACnD,cACA,WAAW,YACT,gBACA;IACN;GACF;EACF;EACA,KAAK,cAAc;GACjB,MAAM,YAAY,OAAO,+BACvB,WAAW,UAAU,OACrB,MAAM,SACN,yCACF;GACA,MAAM,UAAU,OAAO,+BACrB,WAAW,UAAU,KACrB,MAAM,SACN,yCACF;GACA,IACE,cAAc,QACd,YAAY,QACZ,SAAS,MAAM,SAAS,SAAS,IAAI,GACrC,OAAO,OAAO,UAAU,2CAA2C,MAAM,OAAO;GAClF,MAAM,SAAS,gBAAgB,WAAW,QAAQ,GAAG;GACrD,MAAM,YAAY,gBAAgB,WAAW,WAAW,GAAG;GAC3D,MAAM,kBAAkB,cAAc,QAAQ,YAAY,OACtD,KACC,SAAS,cAAc,OAAO,IAAI,SAAS,cAAc,SAAS,KAAK;GAC5E,MAAM,kBAAkB,WAAW,oBACjC,WAAW,UAAU,aAAa,QAAQ,WAAW,UAAU,aAAa,KAAA,IACxE,kBACA,mBAAmB,WAAW,SAAS,QAAQ;GAErD,OAAO;IACL,YAAY,QAAQ,MAAM,mBAAmB,MAAM,mBAAmB,GAAG;IACzE,SAAS;KACP,MAAM;KACN,iBAAiB,KAAK,IACpB,GACA,KAAK,MAAM,eAAe,CAC5B;KACA,UAAU,WAAW,YAAY;KACjC,eAAe,WAAW,kBAAkB,cAAc,WAAW,kBAAkB,aACnF,WAAW,gBACX,WAAW,UAAU,UAAU,YAC/B,YACA;KACJ,GAAI,OAAO,WAAW,WAAW,YAAY,EAAE,QAAQ,WAAW,OAAO,IAAI,CAAC;KAC9E,aAAa,gBAAgB,WAAW,aAAa,GAAK;KAC1D;KACA,GAAI,WAAW,OAAO,CAAC,IAAI,EAAE,OAAO;KACpC,GAAI,cAAc,OAAO,CAAC,IAAI,EAAE,UAAU;KAC1C;IACF;GACF;EACF;CACF;AACF,CAAC;AAED,IAAM,aAAa,OAAO,GAAG,gDAAgD,CAAC,CAAC,WAC7E,eACA,UACA,SACA;CACA,MAAM,QAAQ,OAAO,OAAO,WAAW,SAAS,aAAa,SAAS,aAAa,QAAQ,CAAC,CAAC,CAAC,CAAC,KAC7F,OAAO,eAAe,UAAU,uCAAuC,OAAO,CAAC,CACjF;CACA,MAAM,SAAS,OAAO,cAAc,OAAO,WAAW,KAAK,CAAC,CAAC,KAC3D,OAAO,eAAe,UAAU,qCAAqC,OAAO,CAAC,CAC/E;CACA,MAAM,MAAM,SAAS,UAAU,MAAM;CACrC,OAAO,GAAG,IAAI,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,MAAM,GAAG,EAAE,EAAE,IAAI,IAAI,MAAM,IAAI,EAAE,EAAE,IAAI,IAAI,MAAM,IAAI,EAAE,EAAE,GAAG,IAAI,MAAM,IAAI,EAAE;AAC/G,CAAC;AAED,IAAM,kBACJ,OACA,uBACI;CACJ,oBAAoB,MAAM;CAC1B,YAAY,MAAM;CAClB;AACF;AAEA,IAAM,aAAa,OAAO,GAAG,gDAAgD,CAAC,CAAC,WAC7E,aACA,OACA,mBACA;CACA,MAAM,QAAQ,OAAO,YAAY,SAAS,qBACxC,MAAM,aACN,eAAe,OAAO,iBAAiB,CACzC,CAAC,CAAC,KAAK,OAAO,MAAM;CACpB,IAAI,OAAO,UAAU,KAAK,GAAG,OAAO,MAAM;CAC1C,IAAI,MAAM,QAAQ,SAAS,uBAAuB,OAAO;CACzD,OAAO,OAAO,MAAM;AACtB,CAAC;AAED,IAAM,iBAAiB,OAAO,GAAG,oDAAoD,CAAC,CAAC,WACrF,aACA,aACA,UACA;CACA,MAAM,QAAQ,OAAO,YAAY,cAAc,KAAK,aAAa;EAC/D,MAAM;EACN;EACA,UAAU;CACZ,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM;CACrB,IAAI,OAAO,UAAU,KAAK,GACxB,OAAO,MAAM,QAAQ,SAAS,qBAAqB,MAAM,QAAQ,QAAQ;CAE3E,IAAI,MAAM,QAAQ,SAAS,uBAAuB,OAAO;CACzD,OAAO,OAAO,MAAM;AACtB,CAAC;AAED,IAAM,sBACJ,OACA,MACA,eACG,GAAG,MAAM,YAAY,QAAQ,MAAM,mBAAmB,QAAQ,MAAM,WAAW,QAAQ,KAAK,QAAQ;AAEzG,IAAM,cAAc,OAAO,GAAG,iDAAiD,CAAC,CAAC,WAC/E,eACA,OACA,mBACA,SACA;CACA,OAAO,SAAS,KACd,OAAO,WACL,eACA,mBAAmB,OAAO,UAAU,iBAAiB,GACrD,OACF,CACF;AACF,CAAC;AAED,IAAM,YAAY,OAAO,GAAG,+CAA+C,CAAC,CAAC,WAC3E,eACA,OACA,mBACA,SACA;CACA,OAAO,YAAY,KACjB,OAAO,WAAW,eAAe,mBAAmB,OAAO,eAAe,iBAAiB,GAAG,OAAO,CACvG;AACF,CAAC;AAED,IAAM,eAAe,OAAO,GAAG,kDAAkD,CAAC,CAAC,WACjF,eACA,OACA,mBACA,SACA;CACA,OAAO,UAAU,KACf,OAAO,WACL,eACA,mBAAmB,OAAO,WAAW,iBAAiB,GACtD,OACF,CACF;AACF,CAAC;AAED,IAAM,mBAAmB,OAAO,GAAG,sDAAsD,CAAC,CAAC,WACzF,eACA,OACA,mBACA,SACA;CACA,OAAO,YAAY,KACjB,OAAO,WACL,eACA,mBAAmB,OAAO,gBAAgB,iBAAiB,GAC3D,OACF,CACF;AACF,CAAC;AAED,IAAM,kBACJ,OACA,OACA,iBACA,eACI;CACJ,GAAG,eAAe,OAAO,MAAM,iBAAiB;CAChD,UAAU,MAAM;CAChB;CACA;CACA,gBAAgB,MAAM;CACtB,gBAAgB,MAAM;CACtB,4BAA4B,2BAA2B,KAAK,CAAC;AAC/D;AAEA,IAAM,kBAAkB,MAAoB,UAC1C,SAAS,MAAM,MAAM,KAAK,KAAK,IAAI,OAAO;AAE5C,IAAM,iBACJ,MACA,UACY,MAAM,SAAS,OAAO;AAEpC,IAAM,+BAA+B,OAAO,GAC1C,uDACF,CAAC,CAAC,WACA,aACA,eACA,OACA,OACA;CACA,MAAM,WAAW,OAAO,WAAW,aAAa,OAAO,MAAM,iBAAiB;CAC9E,MAAM,WAAW,UAAU,aACxB,OAAO,YAAY,eAAe,OAAO,MAAM,mBAAmB,MAAM,OAAO;CAClF,MAAM,yBAAyB;EAC7B,GAAG,eAAe,OAAO,OAAO,UAAU,eAAe,mBAAmB,MAAM,YAAY,MAAM,SAAS;EAC7G,gBAAgB,eAAe,MAAM,aAAa,MAAM,UAAU;CACpE;CACA,IAAI,aAAa,MAAM;EACrB,OAAO,YAAY,SAAS,OAAO,MAAM,aAAa;GACpD;GACA,YAAY;GACZ,gBAAgB;GAChB,WAAW,MAAM;EACnB,CAAC;EACD;CACF;CACA,IAAI,SAAS,eAAe,YAC1B,OAAO,OAAO,UAAU,+CAA+C,MAAM,OAAO;CAEtF,MAAM,YAAY;EAChB,GAAG;EACH,gBAAgB,eAAe,SAAS,eAAe,gBAAgB,MAAM,UAAU;EACvF,gBAAgB,eAAe,SAAS,eAAe,gBAAgB,uBAAuB,cAAc;CAC9G;CACA,IACE,SAAS,eAAe,aAAa,UAAU,YAC/C,cAAc,SAAS,eAAe,WAAW,UAAU,SAAS,KACpE,SAAS,YAAY,SAAS,eAAe,gBAAgB,UAAU,cAAc,KACrF,SAAS,YAAY,SAAS,eAAe,gBAAgB,UAAU,cAAc,GACrF;CACF,OAAO,YAAY,SAAS,qBAAqB,MAAM,aAAa,UAAU;EAC5E,gBAAgB;EAChB,kBAAkB,SAAS;EAC3B,WAAW,MAAM;CACnB,CAAC;AACH,CAAC;AAED,IAAM,2BAA2B,SAC/B,SAAS,eAAe,IAAI,SAAS,UAAU,SAAS,wBAAwB,SAAS,iBAAiB,IAAI;AAEhH,IAAM,kCAAkC,OAAO,GAC7C,qEACF,CAAC,CAAC,WACA,aACA,OACA,OACA;CACA,IAAI,MAAM,eAAe,6BACvB,QAAQ,OAAO,WAAW,aAAa,OAAO,MAAM,iBAAiB,OAAO;CAE9E,MAAM,OAAO,cAAc,MAAM,UAAU;CAC3C,IAAI,SAAS,cAAc,OAAO;CAClC,MAAM,WAAW,OAAO,WAAW,aAAa,OAAO,MAAM,iBAAiB;CAC9E,IAAI,aAAa,QAAQ,SAAS,eAAe,aAAa,MAAM,UAAU,OAAO;CACrF,MAAM,oBAAoB,OAAO,eAAe,aAAa,MAAM,aAAa,SAAS,QAAQ;CACjG,OAAO,mBAAmB,WAAW,gBAAgB,aACnD,kBAAkB,WAAW,0BAA0B,wBAAwB,IAAI;AACvF,CAAC;AAED,IAAM,0BACJ,SACA,UACA,6BAIG;CACH,IAAI,YAAY,KAAA,KAAa,aAAa,KAAA,GACxC,OAAO;EAAE,cAAc,KAAA;EAAW,0BAA0B;CAAM;CAEpE,MAAM,+BAAe,IAAI,IAA8D;CACvF,MAAM,SAAS,gBAAwE;EACrF,MAAM,WAAW,aAAa,IAAI,YAAY,cAAc;EAC5D,MAAM,QAAQ,aAAa,KAAA,IACvB,YAAY,QACZ,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,SAAS,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC;EAC1D,MAAM,WAAW,UAAU,aAAa,QAAQ,CAAC,YAAY,WAAW,WAAW;EACnF,aAAa,IACX,YAAY,gBACZ;GAAE,GAAG;GAAU;EAAM,CACvB;CACF;CACA,KAAK,MAAM,eAAe,WAAW,CAAC,GAAG;EACvC,MAAM,QAAQ,2BACV,YAAY,MAAM,QAAQ,SAAS,SAAS,SAAS,IACrD,YAAY;EAChB,IAAI,MAAM,SAAS,GAAG,MAAM;GAAE,GAAG;GAAa;EAAM,CAAC;CACvD;CACA,KAAK,MAAM,eAAe,YAAY,CAAC,GAAG,MAAM,WAAW;CAC3D,MAAM,cAAc,CAAC,GAAG,aAAa,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,UAAU;EACnE,MAAM,kBAAkB,KAAK,MAAM,OAAO,SAAS,SAAS,SAAS;EACrE,MAAM,mBAAmB,MAAM,MAAM,OAAO,SAAS,SAAS,SAAS;EACvE,OAAO,OAAO,eAAe,IAAI,OAAO,gBAAgB;CAC1D,CAAC;CACD,MAAM,UAAU,YAAY,MAAM,GAAG;CACrC,OAAO;EACL,cAAc,YAAY,MAAM,GAAG,GAAG;EACtC,0BAA0B,QAAQ,MAAM,EAAE,YAAY,MAAM,OAAO,SAAS,SAAS,SAAS,CAAC;CACjG;AACF;AAEA,IAAM,+BACJ,SACA,aAC+B;CAC/B,IAAI,YAAY,KAAA,GAAW,OAAO;CAClC,IAAI,aAAa,KAAA,GAAW,OAAO;CACnC,MAAM,cAAc,IAAI,IAAI,SAAS,KAAK,EAAE,SAAS,EAAE,CAAC;CACxD,OAAO,CAAC,GAAG,UAAU,GAAG,QAAQ,QAAQ,EAAE,SAAS,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE;AACvF;AAEA,IAAM,4BACJ,SACA,aAC4B;CAC5B,IAAI,YAAY,KAAA,GAAW,OAAO;CAClC,IAAI,aAAa,KAAA,GAAW,OAAO;CACnC,MAAM,WAAW,IAAI,IAAI,QAAQ,KAAK,YAAY,CAAC,QAAQ,QAAQ,OAAO,CAAC,CAAC;CAC5E,KAAK,MAAM,WAAW,UAAU,SAAS,IAAI,QAAQ,QAAQ,OAAO;CACpE,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,CAAC,CAAC,MAAM,GAAG,GAAG;AAC9F;AAEA,IAAM,sBAAsB,aAAqD;CAC/E,MAAM,gBAAgB,OAAO,QAAQ;CACrC,OAAO,OAAO,cAAc,aAAa,KAAK,gBAAgB,IAAI,gBAAgB;AACpF;AAEA,IAAM,8BAA8B,YAAsC;CACxE,IAAI,QAAQ,gBAAgB,aAAa,MAAM,OAAO;CACtD,MAAM,uBAAuB,mBAAmB,QAAQ,QAAQ;CAChE,IACE,yBAAyB,QACzB,QAAQ,UAAU,MAAM,EAAE,aAAa,WAAW,oBAAoB,MAAM,MAC5E,OAAO;CACT,OAAO;EAAE,GAAG;EAAS,gBAAgB;GAAE,GAAG,QAAQ;GAAgB,UAAU;EAAM;CAAE;AACtF;AAEA,IAAM,6BACJ,SACA,UACA,gBACA,oBAIG;CACH,IAAI,YAAY,KAAA,KAAa,aAAa,KAAA,GAAW,OAAO;EAAE,UAAU;EAAU;CAAe;CACjG,MAAM,uBAAuB,mBAAmB,eAAe;CAC/D,IAAI,yBAAyB,QAAQ,SAAS,MAAM,EAAE,aAAa,WAAW,oBAAoB,GAChG,OAAO;EAAE,UAAU;EAAU;CAAe;CAE9C,MAAM,iBAAiB,QAAQ,MAAM,EAAE,aAAa,WAAW,oBAAoB;CACnF,IAAI,mBAAmB,KAAA,GACrB,OAAO;EACL,UAAU;EACV,gBAAgB,mBAAmB,KAAA,IAAY,KAAA,IAAY;GAAE,GAAG;GAAgB,UAAU;EAAM;CAClG;CAEF,MAAM,aAAa,SAAS,UAAU;CAStC,OAAO;EACL,UATe,aACb,CACA,gBACA,GAAG,CAAC,GAAG,QAAQ,CAAC,CACb,MAAM,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,CAAC,CACjD,MAAM,GAAG,GAAG,CACjB,CAAC,CAAC,MAAM,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,IAChD,yBAAyB,CAAC,cAAc,GAAG,QAAQ;EAGrD,gBAAgB,cAAc,mBAAmB,KAAA,IAC7C;GAAE,GAAG;GAAgB,UAAU;EAAM,IACrC;CACN;AACF;AAEA,IAAM,gCAAgC,SAAsB,aAAuC;CACjG,MAAM,mBAAmB,uBACvB,QAAQ,cACR,SAAS,cACT,SAAS,kBAAkB,aAAa,IAC1C;CACA,MAAM,wBAAwB,QAAQ,iBAAiB,aACpD,SAAS,iBAAiB,UAAU,SAAS,YAAY;CAC5D,MAAM,cAAc,SAAS,qBAAqB,aAAa,QAC3D,4BAA4B,QAAQ,aAAa,SAAS,WAAW,IACrE,SAAS;CACb,MAAM,eAAe,SAAS,gBAAgB,aAAa,QACvD;EACA,UAAU,yBAAyB,QAAQ,UAAU,SAAS,QAAQ;EACtE,gBAAgB,SAAS;CAC3B,IACE,0BACA,QAAQ,UACR,SAAS,UACT,SAAS,gBACT,SAAS,QACX;CACF,MAAM,mBAAmB,iBAAiB,2BACtC;EACA,UAAU;EACV,cAAc,SAAS,kBAAkB,gBAAgB,QAAQ,kBAAkB,gBAAgB;CACrG,IACE,SAAS;CACb,MAAM,SAAsB;EAC1B,GAAG;EACH,GAAG;EACH,GAAI,iBAAiB,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,iBAAiB,aAAa;EACrG,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY;EACnD,GAAI,aAAa,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,aAAa,SAAS;EACjF,GAAI,aAAa,mBAAmB,KAAA,IAAY,CAAC,IAAI,EAAE,gBAAgB,aAAa,eAAe;EACnG,GAAI,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB;CAC/D;CACA,OAAO,wBAAwB;EAAE,GAAG;EAAQ,SAAS,QAAQ,WAAW;EAAM,cAAc;CAAS,IAAI;AAC3G;AAEA,IAAM,yBAAyB,MAAmB,UAChD,KAAK,UAAU,OAAO,WAAW,qBAAqB,CAAC,CAAC,IAAI,CAAC,MAC3D,KAAK,UAAU,OAAO,WAAW,qBAAqB,CAAC,CAAC,KAAK,CAAC;AAElE,IAAM,8BAA8B,OAAO,eAAe,uBAAuB;AAEjF,IAAM,iCAAiC,OAAO,GAC5C,oEACF,CAAC,CAAC,WACA,SACA,SACA;CAoBA,QAAO,OAnBe,OAAO,QAC3B,UACC,WACC,OAAO,IAAI,aAAY;EACrB,IAAI,OAAO,UAAU,aAAa,OAAO,gBAAgB,MAAM,OAAO,CAAC;EACvE,MAAM,SAAS,OAAO,OAAO,oBAAoB,2BAA2B,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,KAChG,OAAO,eAAe,UAAU,2CAA2C,OAAO,CAAC,CACrF;EACA,IACE,OAAO,SAAS,kBACf,OAAO,eAAe,+BACrB,OAAO,eAAe,gCACtB,OAAO,eAAe,4BACtB,OAAO,eAAe,2BACxB,OAAO,CAAC;EACV,OAAO,CAAC,MAAM;CAChB,CAAC,GACH,EAAE,aAAa,EAAE,CACnB,EAAA,CACc,KAAK;AACrB,CAAC;AAED,IAAM,wBAAwB,OAAO,GAAG,2DAA2D,CAAC,CAAC,WACnG,aACA,OACA,SACA,WACA;CAOA,OAAO,OAAO,+BAA+B,OANtB,YAAY,cAAc,qBAC/C,MAAM,aACN,MAAM,oBACN,MAAM,WACN,SACF,GACsD,OAAO;AAC/D,CAAC;AAED,IAAM,aAAa,OAAO,GAAG,gDAAgD,CAAC,CAAC,WAC7E,aACA,aACA,OACA,SACA;CACA,MAAM,UAAU,OAAO,OAAO,aAAa,uBAAuB,CAAC,CAAC,KAAK,CAAC,CAAC,KACzE,OAAO,eAAe,UAAU,2CAA2C,OAAO,CAAC,CACrF;CACA,OAAO,OAAO,YAAY,cAAc,MAAM,aAAa,OAAO;AACpE,CAAC;AAED,IAAM,gCAAgC,OAAO,GAC3C,mEACF,CAAC,CAAC,WACA,aACA,eACA,OACA,UACA,QACA,SACA,iBACA;CACA,MAAM,WAAW;EACf,oBAAoB,MAAM;EAC1B,YAAY,MAAM;EAClB,gBAAgB,kBAAkB,KAAK,MAAM;CAC/C;CACA,MAAM,SAAS,OAAO,YAAY,OAAO,2BAA2B,MAAM,aAAa,QAAQ,CAAC,CAAC,KAAK,OAAO,MAAM;CACnH,IAAI,OAAO,UAAU,MAAM,KAAK,OAAO,QAAQ,SAAS,uBAAuB,OAAO,OAAO,OAAO;CACpG,KAAK,MAAM,UAAU,gBAAgB,OAAO,GAAG;EAC7C,MAAM,aAAa,OAAO;EAC1B,IACE,WAAW,SAAS,iBACpB,WAAW,MAAM,SAAS,YAC1B,WAAW,MAAM,aAAa,YAC9B,WAAW,UAAU,SAAS,YAC9B,WAAW,MAAM,SAAS,WACzB,OAAO,UAAU,MAAM,KACtB,OAAO,QAAQ,OAAO,YACtB,WAAW,MAAM,aAAa,OAAO,QAAQ,OAAO,UACtD;EACF,MAAM,8BAA8B,iBAAiB,KACnD,OAAO,WACL,eACA,mBAAmB,OAAO,mBAAmB,GAAG,SAAS,eAAe,WAAW,MAAM,UAAU,GACnG,OACF,CACF;EACA,IAAI,WAAW,iBAAiB,6BAA6B;EAC7D,MAAM,UAAU,OAAO,YAAY,OAAO,qBACxC,MAAM,aACN;GACE,GAAG;GACH,WAAW;IACT,MAAM;IACN,YAAY,WAAW,UAAU;IACjC,SAAS,eAAe,WAAW,UAAU,YAAY,MAAM,WAAW;GAC5E;EACF,GACA,OAAO,UACP,MAAM,WACR;EACA,gBAAgB,IAAI,QAAQ,WAAW,cAAc,OAAO;CAC9D;CACA,IAAI,OAAO,UAAU,MAAM,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU;CACjE,MAAM,eAAe,iBAAiB,KACpC,OAAO,WACL,eACA,mBAAmB,OAAO,mBAAmB,GAAG,SAAS,eAAe,OAAO,QAAQ,OAAO,UAAU,GACxG,OACF,CACF;CACA,MAAM,qBAAqB,OAAO,YAAY,OAAO,kBAAkB,MAAM,aAAa,YAAY,CAAC,CAAC,KACtG,OAAO,MACT;CACA,IAAI,OAAO,UAAU,kBAAkB,KAAK,mBAAmB,QAAQ,SAAS,uBAC9E,OAAO,OAAO,mBAAmB;CAEnC,IAAI,OAAO,UAAU,kBAAkB,KAAK,mBAAmB,QAAQ,WAAW,UAAU,SAAS,UAAU;EAC7G,MAAM,UAAU,OAAO,YAAY,OAAO,qBACxC,MAAM,aACN;GACE,GAAG,mBAAmB,QAAQ;GAC9B,WAAW;IAAE,MAAM;IAAU,YAAY,MAAM;GAAY;EAC7D,GACA,mBAAmB,QAAQ,UAC3B,MAAM,WACR;EACA,gBAAgB,IAAI,QAAQ,WAAW,cAAc,OAAO;CAC9D,OAAO,IAAI,OAAO,UAAU,kBAAkB,GAAG;EAC/C,MAAM,aAAa,OAAO,OAAO,oBAAoB,OAAO,OAAO,cAAc,CAAC,CAAC,CAAC;GAClF,OAAO;IAAE,MAAM;IAAS,UAAU,OAAO,QAAQ,OAAO;GAAS;GACjE;GACA,WAAW;IAAE,MAAM;IAAU,YAAY,MAAM;GAAY;GAC3D,MAAM;GACN,OAAO;IAAE,MAAM;IAAU;IAAU,aAAa,MAAM;GAAY;EACpE,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,UAAU,6CAA6C,OAAO,CAAC,CAAC;EAC9F,MAAM,UAAU,OAAO,YAAY,OAAO,qBAAqB,MAAM,aAAa,YAAY,MAAM,WAAW;EAC/G,gBAAgB,IAAI,QAAQ,WAAW,cAAc,OAAO;CAC9D;AACF,CAAC;AAED,IAAM,0BAA0B,OAAO,GACrC,kDACF,CAAC,CAAC,WACA,aACA,eACA,OACA,OACA,eACA,iBACA,wBACA,iBACA;CACA,MAAM,OAAO,cAAc,MAAM,UAAU;CAC3C,IAAI,SAAS,MAAM,OAAO;EAAE,uBAAuB;EAAG,WAAW;EAAG,oBAAoB;CAAE;CAC1F,MAAM,WAAW,OAAO,WAAW,aAAa,OAAO,MAAM,iBAAiB;CAC9E,MAAM,eAAe,OAAO,mBAAmB,OAAO,MAAM,aAAa;CACzE,MAAM,WAAW,UAAU,aACxB,OAAO,YAAY,eAAe,OAAO,MAAM,mBAAmB,MAAM,OAAO;CAClF,MAAM,oBAAoB,aAAa,OACnC,OACA,OAAO,eAAe,aAAa,MAAM,aAAa,QAAQ;CAClE,MAAM,iBAAiB,mBAAmB,WAAW;CACrD,MAAM,mBAAmB,UAAU,eAAe,aAAa,MAAM,YACnE,aAAa,QAAQ,SAAS,UAC9B,gBAAgB,SAAS,UACzB,mBAAmB,WAAW,gBAAgB;CAChD,MAAM,wBACJ,oBAAoB,gBAAgB,SAAS,UAAU,aAAa,QAAQ,SAAS,SACjF;EAAE,GAAG;EAAc,SAAS,6BAA6B,gBAAgB,aAAa,OAAO;CAAE,IAC/F,aAAa,QAAQ,SAAS,SAC9B;EAAE,GAAG;EAAc,SAAS,2BAA2B,aAAa,OAAO;CAAE,IAC7E;CACN,MAAM,iBAAiB,oBACrB,gBAAgB,SAAS,UACzB,sBAAsB,QAAQ,SAAS,UACvC,CAAC,sBAAsB,gBAAgB,sBAAsB,OAAO;CACtE,MAAM,2BAA2B,mBAAmB;CACpD,MAAM,gBAAgB,wBAAwB,IAAI;CAClD,MAAM,kBAAkB,aAAa,OACjC,OACA;EACA,GAAG,eACD,OACA,OACA,SAAS,eAAe,iBACxB,MAAM,SACR;EACA,gBAAgB,eAAe,SAAS,eAAe,gBAAgB,MAAM,UAAU;EACvF,gBAAgB,eAAe,SAAS,eAAe,gBAAgB,MAAM,WAAW;CAC1F;CACF,MAAM,wBAAwB,aAAa,QAAQ,oBAAoB,SACrE,CAAC,cAAc,SAAS,eAAe,WAAW,gBAAgB,SAAS,KAC3E,CAAC,SAAS,YAAY,SAAS,eAAe,gBAAgB,gBAAgB,cAAc,KAC5F,CAAC,SAAS,YAAY,SAAS,eAAe,gBAAgB,gBAAgB,cAAc;CAE9F,IACE,aAAa,QACb,SAAS,eAAe,aAAa,MAAM,YAC3C,mBAAmB,WAAW,gBAAgB,aAC9C,kBAAkB,WAAW,4BAA4B,iBACzD,CAAC,yBACD,CAAC,0BACD;EACA,IAAI,sBAAsB,QAAQ,SAAS,gBAAgB,sBAAsB,QAAQ,WAAW,KAAA,GAClG,OAAO,8BACL,aACA,eACA,OACA,UACA,sBAAsB,QAAQ,QAC9B,MAAM,SACN,eACF;EAEF,OAAO;GAAE,uBAAuB;GAAG,WAAW;GAAG,oBAAoB;EAAE;CACzE;CAEA,MAAM,YAAY,aAAa,OAC3B,OAAO,YAAY,SAAS,OAAO,MAAM,aAAa;EACtD;EACA,YAAY;EACZ,gBAAgB,eAAe,OAAO,OAAO,MAAM,YAAY,MAAM,SAAS;EAC9E,WAAW,MAAM;CACnB,CAAC,IACC,0BAA0B,SAAS,eAAe,aAAa,MAAM,WACrE,WACA,4BAA4B,SAAS,eAAe,aAAa,MAAM,YAAY,CAAC,wBACpF,WACA,OAAO,YAAY,SAAS,qBAAqB,MAAM,aAAa,UAAU;EAC9E,gBAAgB,mBAAmB,eACjC,OACA,OACA,SAAS,eAAe,iBACxB,MAAM,SACR;EACA,kBAAkB,SAAS;EAC3B,WAAW,MAAM;CACnB,CAAC;CACH,MAAM,qBAAqB,eAAe,MAAM,mBAAmB,WAAW,sBAAsB,KAAK,CAAC;CAC1G,MAAM,SAAS,OAAO,UAAU,eAAe,OAAO,MAAM,mBAAmB,MAAM,OAAO;CAC5F,MAAM,QAAQ;EACZ,mBAAmB,CAAC;GAClB,YAAY;IACV,aAAa,MAAM;IACnB;IACA;IACA,sBAAsB,eAAe,KAAK,UAAU,QAAQ;IAC5D,8BAA8B,mBAAmB,WAAW,sBAAsB;IAClF,yBAAyB;IACzB,aAAa;IACb,YAAY;IACZ,YAAY,sBAAsB;IAClC,OAAO,MAAM;IACb,SAAS,sBAAsB;GACjC;GACA,YAAY,MAAM;EACpB,CAAC;EACD,OAAO,sBAAsB,OACzB,CAAC;GACD,aAAa,MAAM;GACnB;GACA,cAAc;GACd,YAAY;IAAE,MAAM;IAAY,QAAQ;KAAE,MAAM;KAAU;KAAU,YAAY;IAAK;GAAE;GACvF,WAAW,MAAM;EACnB,CAAC,IACC,CAAC;EACL,eAAe,CAAC;EAChB,gBAAgB,CAAC;EACjB,eAAe,CAAC;CAClB;CACA,MAAM,UAAU,OAAO,WAAW,aAAa,MAAM,aAAa,OAAO,MAAM,OAAO;CACtF,IAAI,sBAAsB,QAAQ,SAAS,gBAAgB,sBAAsB,QAAQ,WAAW,KAAA,GAClG,OAAO,8BACL,aACA,eACA,OACA,UACA,sBAAsB,QAAQ,QAC9B,MAAM,SACN,eACF;CAEF,OAAO;EAAE,GAAG;EAAS,oBAAoB;CAAE;AAC7C,CAAC;AAED,IAAM,qBAAqB,OAAO,GAAG,mDAAmD,CAAC,CAAC,WACxF,aACA,eACA,OACA,UACA,OACA;CACA,MAAM,aAAa,OAAO,OAAO,oBAAoB,iBAAiB,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,KACxF,OAAO,eAAe,UAAU,yCAAyC,MAAM,OAAO,CAAC,CACzF;CACA,MAAM,YAAY,OAAO,aAAa,eAAe,OAAO,MAAM,mBAAmB,MAAM,OAAO;CAClG,MAAM,WAAW,OAAO,YAAY,SAAS,IAAI,MAAM,aAAa,SAAS,CAAC,CAAC,KAAK,OAAO,MAAM;CACjG,IAAI,OAAO,UAAU,QAAQ,KAAK,SAAS,QAAQ,SAAS,uBAC1D,OAAO,OAAO,SAAS;CAEzB,MAAM,WAAW,OAAO,UAAU,QAAQ,IAAI,SAAS,UAAU;CACjE,MAAM,iBAAiB,UAAU,QAAQ,gBAAgB,MACtD,EAAE,oBAAoB,YAAY,wBACjC,uBAAuB,MAAM,sBAC7B,eAAe,MAAM,cACrB,sBAAsB,MAAM,iBAChC;CACA,MAAM,aAAa,mBAAmB,KAAA,IAClC,MAAM,aACN,eAAe,eAAe,gBAAgB,MAAM,UAAU;CAOlE,MAAM,kBAAkB;EAAE,GANX,eACb,OACA,OACA,gBAAgB,mBAAmB,MAAM,YACzC,MAAM,SAEqB;EAAQ,gBAAgB;CAAW;CAChE,MAAM,mBAAmB,KAAK,IAC5B,IACC,SAAS,cAAc,MAAM,WAAW,IAAI,SAAS,cAAc,UAAU,KAAK,GACrF;CACA,MAAM,oBAAoB,SAAS,gBAAgB,oBAAoB;CACvE,MAAM,YAAuB,mBAAmB,oBAC5C;EACA,MAAM;EACN,aAAa,MAAM;EACnB,cAAc,MAAM;EACpB,YAAY;GAAE,MAAM;GAAY,gBAAgB;EAAgB;EAChE,kBAAkB;EAClB;EACA,gBAAgB,MAAM;CACxB,IACE;EACA,MAAM;EACN,aAAa,MAAM;EACnB,cAAc,MAAM;EACpB,YAAY;GACV,MAAM;GACN,UAAU,gBAAgB;GAC1B,gBAAgB;EAClB;EACA,kBAAkB;EAClB;EACA,gBAAgB,MAAM;CACxB;CACF,MAAM,UAAU,OAAO,OAAO,oBAAoB,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC;EACxE,WAAW,UAAU,QAAQ,aAAa,MAAM;EAChD;EACA,IAAI;EACJ,WAAW,WAAW;EACtB,OAAO,mBAAmB,SAAS;EACnC,iBAAiB,UAAU,QAAQ,mBAAmB,CAAC;EACvD,aAAa,WAAW;EACxB,iBAAiB,CACf,GAAI,UAAU,QAAQ,gBAAgB,QACnC,EAAE,oBAAoB,YAAY,wBACjC,uBAAuB,MAAM,sBAC7B,eAAe,MAAM,cACrB,sBAAsB,MAAM,iBAChC,KAAK,CAAC,GACN,eACF;EACA,sBAAsB,UAAU,QAAQ,wBAAwB,CAAC;EACjE,WAAW,MAAM;EACjB,SAAS,WAAW;EACpB,aAAa,MAAM;CACrB,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,UAAU,8BAA8B,MAAM,OAAO,CAAC,CAAC;CACrF,IAAI,aAAa,MACf,OAAO,YAAY,SAAS,OAAO,MAAM,aAAa,OAAO;MACxD,IACL,mBAAmB,KAAA,KACnB,eAAe,aAAa,gBAAgB,YAC5C,CAAC,cAAc,eAAe,WAAW,gBAAgB,SAAS,KAClE,CAAC,SAAS,YAAY,eAAe,gBAAgB,gBAAgB,cAAc,KACnF,CAAC,SAAS,YAAY,eAAe,gBAAgB,gBAAgB,cAAc,KACnF,SAAS,QAAQ,gBAAgB,QAAQ,eACzC,SAAS,QAAQ,YAAY,QAAQ,WACrC,SAAS,QAAQ,cAAc,QAAQ,WAEvC,OAAO,YAAY,SAAS,OAAO,MAAM,aAAa,SAAS,SAAS,QAAQ;CAElF,MAAM,SAAS,OAAO,iBAAiB,eAAe,OAAO,MAAM,mBAAmB,MAAM,OAAO;CACnG,MAAM,eAAe,OAAO,YAAY,cAAc,KAAK,MAAM,aAAa;EAC5E,MAAM;EACN;CACF,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM;CACrB,IAAI,OAAO,UAAU,YAAY,GAAG,OAAO,EAAE,WAAW,EAAE;CAC1D,IAAI,aAAa,QAAQ,SAAS,uBAAuB,OAAO,OAAO,aAAa;CAcpF,OAAO,EAAE,YAAW,OAbG,WAAW,aAAa,MAAM,aAAa;EAChE,mBAAmB,CAAC;EACpB,OAAO,CAAC;GACN,aAAa,MAAM;GACnB;GACA,cAAc;GACd,YAAY;IAAE,MAAM;IAAY,QAAQ;KAAE,MAAM;KAAW;IAAU;GAAE;GACvE,WAAW,MAAM;EACnB,CAAC;EACD,eAAe,CAAC;EAChB,gBAAgB,CAAC;EACjB,eAAe,CAAC;CAClB,GAAG,MAAM,OAAO,EAAA,CACY,UAAU;AACxC,CAAC;AAED,IAAM,6BAA6B,OAAO,GACxC,qDACF,CAAC,CAAC,WACA,aACA,OACA,OACA;CACA,MAAM,WAAW,OAAO,WAAW,aAAa,OAAO,MAAM,iBAAiB;CAC9E,IAAI,aAAa,MAAM,OAAO,EAAE,uBAAuB,EAAE;CACzD,MAAM,UAAU,OAAO,eAAe,aAAa,MAAM,aAAa,SAAS,QAAQ;CACvF,IAAI,YAAY,MAAM,OAAO,OAAO,UAAU,2CAA2C,MAAM,OAAO;CACtG,IAAI,SAAS,eAAe,aAAa,MAAM,YAAY,QAAQ,WAAW,gBAAgB,WAC5F,OAAO,EAAE,uBAAuB,EAAE;CAEpC,MAAM,YAAY,SAAS,eAAe,aAAa,MAAM,WACzD,WACA,OAAO,YAAY,SAAS,qBAAqB,MAAM,aAAa,SAAS,UAAU;EACvF,gBAAgB,eACd,OACA,OACA,SAAS,eAAe,iBACxB,SAAS,eAAe,SAC1B;EACA,kBAAkB,SAAS;EAC3B,WAAW,MAAM;CACnB,CAAC;CACH,MAAM,qBAAqB,eAAe,KAAK,QAAQ,WAAW,qBAAqB,CAAC;CAiBxF,OAAO,EAAE,wBAAuB,OAhBT,WAAW,aAAa,MAAM,aAAa;EAChE,mBAAmB,CAAC;GAClB,YAAY;IACV,GAAG,QAAQ;IACX;IACA,sBAAsB,eAAe,KAAK,UAAU,QAAQ;IAC5D,8BAA8B,QAAQ,WAAW;IACjD,aAAa;GACf;GACA,YAAY,MAAM;EACpB,CAAC;EACD,OAAO,CAAC;EACR,eAAe,CAAC;EAChB,gBAAgB,CAAC;EACjB,eAAe,CAAC;CAClB,GAAG,MAAM,OAAO,EAAA,CACwB,sBAAsB;AAChE,CAAC;AAED,IAAM,oBAAoB,OAAO,GAAG,kDAAkD,CAAC,CAAC,WACtF,aACA,eACA,OACA,OACA;CACA,MAAM,WAAW;EACf,oBAAoB,MAAM;EAC1B,YAAY,MAAM;EAClB,gBAAgB,kBAAkB,KAAK,MAAM,cAAc;CAC7D;CACA,MAAM,WAAW,OAAO,YAAY,OAAO,2BAA2B,MAAM,aAAa,QAAQ,CAAC,CAAC,KACjG,OAAO,MACT;CACA,IAAI,OAAO,UAAU,QAAQ,KAAK,SAAS,QAAQ,SAAS,uBAC1D,OAAO,OAAO,SAAS;CAEzB,MAAM,WAAW,OAAO,UAAU,QAAQ,IACtC,SAAS,QAAQ,OAAO,WACxB,SAAS,KACT,OAAO,WACL,eACA,mBAAmB,OAAO,UAAU,MAAM,cAAc,GACxD,MAAM,OACR,CACF;CACF,MAAM,SAAS,MAAM,cAAc,QAAQ,MAAM,UAAU,SAAS,CAAC,CAAC,UAAU,MAC5E;EAAE,MAAM;EAAa,WAAW,MAAM,UAAU,SAAS;CAAE,IAC3D;EAAE,MAAM;EAAY,MAAM,qBAAqB,MAAM,WAAW;CAAE;CACtE,MAAM,SAAS,OAAO,OAAO,oBAAoB,OAAO,OAAO,MAAM,CAAC,CAAC,CAAC;EACtE;EACA,aAAa,MAAM;EACnB;EACA,UAAU,MAAM;EAChB,kBAAkB,OAAO,UAAU,QAAQ,IAAI,SAAS,QAAQ,OAAO,mBAAmB,CAAC,QAAQ;CACrG,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,UAAU,6BAA6B,MAAM,OAAO,CAAC,CAAC;CACpF,IACE,OAAO,UAAU,QAAQ,KACzB,SAAS,QAAQ,OAAO,gBAAgB,OAAO,eAC/C,SAAS,QAAQ,OAAO,aAAa,OAAO,YAC5C,SAAS,QAAQ,OAAO,OAAO,SAAS,OAAO,OAAO,SACrD,SAAS,QAAQ,OAAO,OAAO,SAAS,aACrC,SAAS,QAAQ,OAAO,OAAO,UAAU,OAAO,OAAO,SAAS,aAAa,OAAO,OAAO,OAAO,MAClG,SAAS,QAAQ,OAAO,OAAO,eAC9B,OAAO,OAAO,SAAS,cAAc,OAAO,OAAO,YAAY,MAEpE,OAAO;CAET,IAAI,OAAO,UAAU,QAAQ,GAC3B,OAAO,YAAY,OAAO,aACxB,MAAM,aACN,QACA,SAAS,QAAQ,UACjB,MAAM,WACR;MAEA,OAAO,YAAY,OAAO,aAAa,MAAM,aAAa,QAAQ,MAAM,WAAW;CAErF,OAAO;AACT,CAAC;AAED,IAAM,+BAA+B,OAAO,GAC1C,kEACF,CAAC,CAAC,WACA,aACA,OACA,MACA;CACA,IAAI,MAAM,eAAe,YAAY,OAAO;CAC5C,MAAM,SAAS,OAAO,OAAO,QAC3B,KAAK,SACJ,UACC,OAAO,IAAI,aAAY;EACrB,IAAI,MAAM,SAAS,gBAAgB,OAAO;EAC1C,MAAM,WAAW,OAAO,YAAY,OAAO,2BAA2B,MAAM,aAAa;GACvF,oBAAoB,MAAM;GAC1B,YAAY,MAAM;GAClB,gBAAgB,kBAAkB,KAAK,MAAM,cAAc;EAC7D,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM;EACrB,IAAI,OAAO,UAAU,QAAQ,KAAK,SAAS,QAAQ,SAAS,uBAC1D,OAAO,OAAO,SAAS;EAEzB,MAAM,eAAe,OAAO,UAAU,QAAQ,IAC1C,IACA,SAAS,QAAQ,YACjB,SAAS,QAAQ,OAAO,gBAAgB,MAAM,eAC5C,SAAS,QAAQ,OAAO,aAAa,MAAM,SACzC,IACA;EAER,MAAM,UAAU,OAAO,OAAO,oBAAoB,aAAa,CAAC,CAC9D,GAAG,MAAM,QAAQ,mBAAmB,cACtC,CAAC,CAAC,KAAK,OAAO,eAAe,UAAU,+CAA+C,MAAM,OAAO,CAAC,CAAC;EACrG,OAAO;GAAE,GAAG;GAAO;EAAQ;CAC7B,CAAC,GACH,EAAE,aAAa,EAAE,CACnB;CACA,OAAO;EAAE,GAAG;EAAM;CAAO;AAC3B,CAAC;AAED,IAAM,qBAAqB,UAAyD;CAClF,MAAM,UAAU,OAAO,oBAAoB,iBAAiB,CAAC,CAAC,MAAM,YAAY;CAChF,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,QAAQ;CAC9C,OAAO;AACT;AAEA,IAAM,sBAAsB,OAAO,GAAG,oDAAoD,CAAC,CAAC,WAC1F,aACA,eACA,OACA,UACA,OACA;CACA,MAAM,UAAU,OAAO,WAAW,aAAa,OAAO,MAAM,QAAQ,iBAAiB;CACrF,IAAI,YAAY,MAAM,OAAO,OAAO,UAAU,uCAAuC,MAAM,OAAO;CAElG,IADoB,cAAc,MAAM,QAAQ,UAC5C,MAAgB,MAAM,OAAO,OAAO,UAAU,2CAA2C,MAAM,OAAO;CAC1G,MAAM,SAAS,OAAO,UAAU,eAAe,OAAO,MAAM,QAAQ,mBAAmB,MAAM,OAAO;CACpG,MAAM,aAAa,WAAW,KAC5B,OAAO,WACL,eACA,mBAAmB,OAAO,YAAY,MAAM,UAAU,GACtD,MAAM,OACR,CACF;CACA,MAAM,kBAAkB,gBAAgB,KACtC,OAAO,WACL,eACA,mBAAmB,OAAO,kBAAkB,MAAM,UAAU,GAC5D,MAAM,OACR,CACF;CACA,MAAM,cAAc,OAAO,oBAAoB,YAAY,CAAC,CAAC,MAAM,IAAI;CACvE,MAAM,YAAY,OAAO,UAAU,WAAW,KAAK,YAAY,QAAQ,cAAc,KAAA,IACjF,YAAY,QAAQ,YACpB,kBAAkB,KAAK;CAC3B,MAAM,QAAmC,OAAO,UAAU,WAAW,KAAK,YAAY,QAAQ,UAAU,KAAA,IACpG,YAAY,QAAQ,QACpB;EAAE,MAAM;EAAS,OAAO,MAAM;CAAQ;CAC1C,MAAM,SAAS,QAAQ;CACvB,MAAM,aAAa,KAAK,IACtB,IACC,SAAS,cAAc,MAAM,WAAW,IAAI,SAAS,cAAc,OAAO,cAAc,KAAK,GAChG;CACA,MAAM,SACJ,MAAM,iBAAiB,SAAS,YAC5B;EAAE,MAAM;EAAW,WAAW,MAAM;CAAY,IAChD;EAAE,GAAG,MAAM;EAAkB,WAAW,MAAM;CAAY;CAChE,MAAM,oBAAoB,SAAS,gBAAgB,oBAAoB;CACvE,MAAM,YAAuB,aAAa,oBACtC;EACA,MAAM;EACN,aAAa,MAAM;EACnB,cAAc;EACd,YAAY;GAAE,MAAM;GAAY,gBAAgB;EAAO;EACvD,kBAAkB,OAAO;EACzB;EACA,gBAAgB,MAAM;CACxB,IACE;EACA,MAAM;EACN,aAAa,MAAM;EACnB,cAAc;EACd,YAAY;GACV,MAAM;GACN,UAAU,OAAO;GACjB,gBAAgB;EAClB;EACA,kBAAkB,OAAO;EACzB;EACA,gBAAgB,MAAM;CACxB;CACF,MAAM,UAAU,OAAO,WAAW,aAAa,MAAM,aAAa;EAChE,mBAAmB,CAAC;EACpB,OAAO,CAAC;EACR,eAAe,CAAC;GACd,aAAa,MAAM;GACnB;GACA,eAAe;GACf,aAAa;IACX,MAAM;IACN,oBAAoB,MAAM;IAC1B,gBAAgB,QAAQ;IACxB,sBAAsB,eAAe,KAAK,QAAQ,QAAQ;GAC5D;GACA,UAAU;IAAE,MAAM;IAAU,WAAW;GAAsC;GAC7E,YAAY,MAAM;GAClB,YAAY,MAAM;GAClB,YAAY;GACZ;GACA,WAAW;IACT,gBAAgB;IAChB,aAAa,SAAS,IAAI,MAAM,aAAa,EAC3C,MAAM,SAAS,UAAU,aAC3B,CAAC;IACD,WAAW;GACb;EACF,CAAC;EACD,gBAAgB,CAAC;GACf,aAAa,MAAM;GACnB;GACA;GACA,eAAe;GACf;GACA;GACA,YAAY,MAAM;GAClB,2BAA2B;EAC7B,CAAC;EACD,eAAe,CAAC;CAClB,GAAG,MAAM,OAAO;CAChB,OAAO;EACL,mBAAmB,QAAQ;EAC3B,oBAAoB,QAAQ;CAC9B;AACF,CAAC;AAED,IAAM,0BAA0B,OAAO,GACrC,yDACF,CAAC,CAAC,WACA,aACA,eACA,OACA,OACA;CACA,MAAM,kBAAkB,OAAO,GAAG,iEAAiE,CAAC,CAAC,WACnG,WACA;EACA,IAAI,UAAU,eAAe,WAAW;GACtC,MAAM,YAAY,OAAO,aAAa,eAAe,OAAO,UAAU,mBAAmB,MAAM,OAAO;GACtG,MAAM,UAAU,OAAO,YAAY,SAAS,IAAI,MAAM,aAAa,SAAS,CAAC,CAAC,KAAK,OAAO,MAAM;GAChG,IAAI,OAAO,UAAU,OAAO,GAAG;IAC7B,IAAI,QAAQ,QAAQ,SAAS,uBAC3B,OAAO,OAAO,UAAU,4CAA4C,MAAM,OAAO;IAEnF,OAAO,OAAO,QAAQ;GACxB;GACA,MAAM,SAAS,OAAO,iBAAiB,eAAe,OAAO,UAAU,mBAAmB,MAAM,OAAO;GACvG,MAAM,eAAe,OAAO,YAAY,cAAc,KAAK,MAAM,aAAa;IAC5E,MAAM;IACN;GACF,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM;GACrB,IAAI,OAAO,UAAU,YAAY,KAAK,aAAa,QAAQ,SAAS,uBAClE,OAAO,OAAO,aAAa;GAE7B,OAAO;IACL,QAAQ;IACR,MAAM;IACN,MAAM,OAAO,UAAU,YAAY,IAC/B,OACA;KACA,aAAa,MAAM;KACnB;KACA,cAAc;KACd,YAAY;MAAE,MAAM;MAAY,QAAQ;OAAE,MAAM;OAAW;MAAU;KAAE;KACvE,WAAW,MAAM;IACnB;IACF;IACA;GACF;EACF;EACA,MAAM,SAAS,OAAO,WAAW,aAAa,OAAO,UAAU,iBAAiB;EAChF,MAAM,OAAO,cAAc,UAAU,UAAU;EAC/C,IAAI,WAAW,MAAM,OAAO,OAAO,UAAU,4CAA4C,MAAM,OAAO;EACtG,IAAI,SAAS,MAAM,OAAO,OAAO,UAAU,gDAAgD,MAAM,OAAO;EACxG,OAAO;GACL;GACA;GACA,MAAM;GACN,QAAQ,OAAO,UAAU,eAAe,OAAO,UAAU,mBAAmB,MAAM,OAAO;GACzF,WAAW;EACb;CACF,CAAC;CACD,MAAM,SAAS,OAAO,gBAAgB,MAAM,IAAI;CAChD,MAAM,SAAS,OAAO,gBAAgB,MAAM,EAAE;CAC9C,MAAM,OAAO,OAAO,OAAO,oBAAoB,gBAAgB,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC,KACvF,OAAO,eAAe,UAAU,wCAAwC,MAAM,OAAO,CAAC,CACxF;CACA,MAAM,mBAAmB,OAAO,UAAU,OAAO;CACjD,IAAI,qBAAqB,MACvB,OAAO,OAAO,UAAU,qDAAqD,MAAM,OAAO;CAE5F,MAAM,oBAAmD,OAAO,cAAc,OAC1E;EAAE,MAAM;EAAW,WAAW,OAAO;CAAU,IAC/C;CACJ,MAAM,iBAAiB,eAAe,KACpC,OAAO,WACL,eACA,mBAAmB,OAAO,gBAAgB,MAAM,cAAc,GAC9D,MAAM,OACR,CACF;CACA,MAAM,WAAW,OAAO,YAAY,cAAc,KAAK,MAAM,aAAa;EACxE,MAAM;EACN;EACA,UAAU;CACZ,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM;CACrB,IAAI,OAAO,UAAU,QAAQ,KAAK,SAAS,QAAQ,SAAS,uBAC1D,OAAO,OAAO,SAAS;CAEzB,MAAM,WAAW,OAAO,UAAU,QAAQ,KAAK,SAAS,QAAQ,SAAS,iBACrE,SAAS,QAAQ,QACjB;CACJ,MAAM,WAAW,eAAe,MAAM,UAAU,YAAY,KAAK,CAAC;CAClE,MAAM,QAA6B,CAAC;CACpC,IAAI,OAAO,SAAS,MAAM,MAAM,KAAK,OAAO,IAAI;CAChD,IAAI,OAAO,SAAS,QAAQ,OAAO,KAAK,WAAW,OAAO,QAAQ,MAAM,KAAK,OAAO,IAAI;CACxF,MAAM,UAAU,OAAO,WACrB,aACA,MAAM,aACN;EACE,mBAAmB,CAAC;EACpB;EACA,eAAe,CAAC;EAChB,gBAAgB,CAAC;EACjB,eAAe,CACb;GACE,aAAa,MAAM;GACnB;GACA,2BAA2B;GAC3B;GACA,oBAAoB,UAAU,YAAY;GAC1C;GACA,cAAc,OAAO;GACrB,gBAAgB,OAAO;GACvB,cAAc,OAAO;GACrB,gBAAgB,OAAO;GACvB,OAAO;GACP,WAAW;IAAE,MAAM;IAAY,aAAa,MAAM;GAAW;GAC7D,YAAY;IACV,MAAM;IACN,OAAO,MAAM;IACb,WAAW,eAAe,MAAM,WAAW;GAC7C;GACA,YAAY;IACV,MAAM;IACN,oBAAoB,MAAM;IAC1B,gBAAgB,iBAAiB;IACjC,sBAAsB,eAAe,KAAK,iBAAiB,QAAQ;GACrE;GACA,YAAY;IAAE,MAAM;IAAU,WAAW;GAAsC;GAC/E,kBAAkB,OAAO,OAAO,QAC9B,MAAM,cACL,eACC,WAAW,eAAe,mBAAmB,OAAO,kBAAkB,UAAU,GAAG,MAAM,OAAO,CAAC,CAAC,KAChG,OAAO,IAAI,gBAAgB,IAAI,CACjC,CACJ;GACA,YAAY,MAAM;EACpB,CACF;CACF,GACA,MAAM,OACR;CACA,OAAO;EAAE,WAAW,QAAQ;EAAW,mBAAmB,QAAQ;CAAkB;AACtF,CAAC;AAED,IAAM,mCAAmC,UAA0D;CACjG,IAAI,MAAM,SAAS,kBAAkB,MAAM,eAAe,cAAc,OAAO;CAC/E,MAAM,WAAW,OAAO,oBAAoB,6BAA6B,CAAC,CAAC,MAAM,UAAU;CAC3F,OAAO,OAAO,UAAU,QAAQ,KAAK,CAAC,SAAS,QAAQ,gBAAgB,SAAS,aAAa;AAC/F;AAEA,IAAM,gCACJ,OACA,UAEA,MAAM,SAAS,yBACf,MAAM,qBAAqB,cAC3B,MAAM,KAAK,eAAe,aAC1B,MAAM,GAAG,eAAe,MAAM,cAC9B,MAAM,GAAG,sBAAsB,MAAM;AAEvC,IAAM,uCAAuC,OAAO,GAClD,0EACF,CAAC,CAAC,WACA,aACA,eACA,OACA,gBACA;CACA,IAAI,oBAAoB;CACxB,KAAK,MAAM,SAAS,gBAAgB;EAClC,IAAI,CAAC,gCAAgC,KAAK,GAAG;EAC7C,MAAM,SAAS,OAAO,WAAW,aAAa,OAAO,MAAM,iBAAiB;EAC5E,IAAI,WAAW,MAAM,OAAO,OAAO,UAAU,4CAA4C,MAAM,OAAO;EACtG,MAAM,cAAc,OAAO,UAAU,eAAe,OAAO,MAAM,mBAAmB,MAAM,OAAO;EACjG,MAAM,eAAe,OAAO,YAAY,cAAc,KAAK,MAAM,aAAa;GAC5E,MAAM;GACN,QAAQ;GACR,OAAO;EACT,CAAC;EACD,IAAI,aAAa,SAAS,qBAAqB;EAC/C,IAAI,aAAa,MAAM,WACrB,OAAO,OAAO,UAAU,sDAAsD,MAAM,OAAO;EAE7F,MAAM,yBAAyB,IAAI,IACjC,OAAO,OAAO,QACZ,eAAe,QAAQ,UAAU,6BAA6B,OAAO,KAAK,CAAC,IAC1E,EAAE,qBACD,WACE,eACA,mBAAmB,OAAO,gBAAgB,cAAc,GACxD,MAAM,OACR,CAAC,CAAC,KAAK,OAAO,IAAI,eAAe,IAAI,CAAC,CAC1C,CACF;EACA,MAAM,UAAU,aAAa,MAAM,cAAc,QAC9C,iBACC,aAAa,SAAS,cACtB,aAAa,mBAAmB,aAChC,aAAa,iBAAiB,eAC9B,aAAa,mBAAmB,WAChC,aAAa,WAAW,SAAS,YACjC,aAAa,WAAW,uBAAuB,MAAM,sBACrD,aAAa,WAAW,mBAAmB,OAAO,YAClD,CAAC,uBAAuB,IAAI,aAAa,cAAc,CAC3D;EACA,IAAI,QAAQ,WAAW,GAAG;EAE1B,KAAK,MAAM,YAAY,SAAS;GAC9B,IAAI,SAAS,UAAU,SAAS,cAAc,SAAS,UAAU,SAAS,cAAc;GACxF,MAAM,UAAU,OAAO,WAAW,aAAa,MAAM,aAAa;IAChE,mBAAmB,CAAC;IACpB,OAAO,CAAC;IACR,eAAe,CAAC;IAChB,gBAAgB,CAAC;IACjB,eAAe,CAAC;KACd,GAAG;KACH,UAAU,eAAe,KAAK,SAAS,WAAW,CAAC;KACnD,oBAAoB,SAAS;KAC7B,WAAW;MACT,MAAM;MACN,aAAa,MAAM;MACnB,QAAQ;KACV;KACA,YAAY;MACV,MAAM;MACN,oBAAoB,MAAM;MAC1B,gBAAgB,OAAO;MACvB,sBAAsB,eAAe,KAAK,OAAO,QAAQ;KAC3D;KACA,YAAY;MAAE,MAAM;MAAU,WAAW;KAAsC;KAC/E,YAAY,MAAM;IACpB,CAAC;GACH,GAAG,MAAM,OAAO;GAChB,qBAAqB,QAAQ;EAC/B;CACF;CACA,OAAO;AACT,CAAC;;;;;;AAgCD,IAAa,kCAAkC,OAAO,GACpD,qDACF,CAAC,CAAC,WACA,OACA,MAKA;CACA,MAAM,gBAAgB,OAAO,OAAO;CACpC,MAAM,cAAc,OAAO;CAC3B,MAAM,0BAA0B,OAAO,GACrC,6DACF,CAAC,CAAC,WAAU,gBAAyC;EACnD,IAAI,MAAM,sBAAsB,KAAA,GAC9B,OAAO,qCAAqC,aAAa,MAAM,iBAAiB;EAElF,MAAM,WAAW,eAAe;EAChC,MAAM,sBAAsB,OAAO,6BAA6B,aAAa,OAAO,IAAI;EACxF,MAAM,qBAAqB,oBAAoB,OAAO,OAAO,uBAAuB;EACpF,MAAM,0BAA0B,mBAAmB,WAAW,IAC1D,CAAC,IACD,OAAO,YAAY,cAAc,qCACjC,MAAM,aACN,MAAM,oBACN,MAAM,WACN,kBACF;EACF,MAAM,yBAAyB,mBAAmB,WAAW,IACzD,CAAC,IACD,OAAO,+BAA+B,yBAAyB,mBAAmB,EAAE,EAAE,WAAW,UAAU;EAC/G,MAAM,YAAY,OAAO,YAAY,cAAc,4BACjD,MAAM,aACN,MAAM,oBACN,MAAM,YACN,MAAM,WACN,MAAM,kBACN,qBACA,MAAM,aACN,MAAM,gBACR;EACA,MAAM,WAAW,IAAI,IAAI,UAAU,gBAAgB;EACnD,MAAM,iBAAiB,oBAAoB,OAAO,QAAQ,EAAE,cAAc,SAAS,IAAI,OAAO,CAAC;EAC/F,MAAM,+BAA+B,IAAI,IACvC,eAAe,SAAS,UACtB,MAAM,SAAS,kBAAkB,cAAc,MAAM,UAAU,MAAM,eACjE,CAAC,MAAM,iBAAiB,IACxB,CAAC,CACP,CACF;EACA,MAAM,uBAAuB,OAAO,OAAO,OACzC,oBAAoB,SACnB,UACC,CAAC,SAAS,IAAI,MAAM,OAAO,KACzB,MAAM,SAAS,kBACf,CAAC,6BAA6B,IAAI,MAAM,iBAAiB,IACvD,gCAAgC,aAAa,OAAO,KAAK,IACzD,OAAO,QAAQ,KAAK,CAC5B;EACA,MAAM,6BAA6B,IAAI,IACrC,eAAe,OAAO,uBAAuB,CAAC,CAAC,IAAI,sBAAsB,CAC3E;EACA,MAAM,kBAAkB,CACtB,GAAG,eAAe,OAAO,oBAAoB,GAC7C,GAAG,uBAAuB,QAAQ,UAAU,2BAA2B,IAAI,uBAAuB,KAAK,CAAC,CAAC,CAC3G;EACA,MAAM,wBAAwB,gBAAgB;EAC9C,MAAM,oBAAoB,0BAA0B,KAAA,IAChD,CAAC,IACD,OAAO,2BAA2B,eAAe,CAAC,CAAC,KACnD,OAAO,UAAU,UAAU,UAAU,MAAM,gBAAgB,MAAM,OAAO,CAAC,CAC3E;EACF,MAAM,uBAAuB,0BAA0B,KAAA,KAAa,kBAAkB,WAAW,IAC7F,CAAC,IACD,OAAO,sBAAsB,aAAa,OAAO,sBAAsB,SAAS,iBAAiB;EACrG,MAAM,oCAAoB,IAAI,IAAqC;EACnE,KAAK,MAAM,SAAS,CAAC,GAAG,gBAAgB,GAAG,oBAAoB,GAC7D,IAAI,qBAAqB,KAAK,GAAG,kBAAkB,IAAI,MAAM,SAAS,KAAK;EAE7E,MAAM,iBAAiB,CAAC,GAAG,kBAAkB,OAAO,CAAC;EACrD,MAAM,qBAAqB,0BAA0B,KAAA,IACjD,CAAC,IACD,OAAO,gCAAgC,gBAAgB,eAAe,CAAC,CAAC,KACxE,OAAO,UAAU,UAAU,UAAU,MAAM,gBAAgB,MAAM,OAAO,CAAC,CAC3E;EACF,MAAM,oBAAoB,IAAI,IAC5B,eAAe,SAAS,UAAU,MAAM,SAAS,iBAAiB,CAAC,MAAM,cAAc,IAAI,CAAC,CAAC,CAC/F;EACA,MAAM,yBAAyB,oBAAoB,OAAO,SAAS,UAAU;GAC3E,IACE,SAAS,IAAI,MAAM,OAAO,KAC1B,MAAM,SAAS,kBACf,cAAc,MAAM,UAAU,MAAM,gBACpC,6BAA6B,IAAI,MAAM,iBAAiB,GACxD,OAAO,CAAC;GACV,MAAM,aAAa,OAAO,oBAAoB,gBAAgB,CAAC,CAAC,MAAM,UAAU;GAChF,IACE,OAAO,UAAU,UAAU,KAC3B,WAAW,QAAQ,WAAW,QAC9B,WAAW,QAAQ,WAAW,KAAA,GAC9B,OAAO,CAAC;GACV,OAAO,CAAC;IAAE;IAAO,gBAAgB,kBAAkB,KAAK,WAAW,QAAQ,MAAM;GAAE,CAAC;EACtF,CAAC;EACD,MAAM,6BAA6B,IAAI,IACrC,OAAO,OAAO,OACZ,CAAC,GAAG,IAAI,IAAI,uBAAuB,KAAK,EAAE,qBAAqB,cAAc,CAAC,CAAC,CAAC,CAAC,QAC9E,mBAAmB,CAAC,kBAAkB,IAAI,cAAc,CAC3D,IACC,mBACC,OAAO,IAAI,aAAY;GACrB,MAAM,SAAS,OAAO,YAAY,OAAO,2BAA2B,MAAM,aAAa;IACrF,oBAAoB,MAAM;IAC1B,YAAY,MAAM;IAClB;GACF,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM;GACrB,IAAI,OAAO,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,QAAQ,OAAO;GAC5D,IAAI,OAAO,QAAQ,SAAS,uBAAuB,OAAO;GAC1D,OAAO,OAAO,OAAO;EACvB,CAAC,GACH,EAAE,aAAa,EAAE,CACnB,CACF;EACA,MAAM,2BAA2B,uBAAuB,QACrD,EAAE,qBAAqB,kBAAkB,IAAI,cAAc,KAAK,2BAA2B,IAAI,cAAc,CAChH,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK;EAC1B,MAAM,kCAAkB,IAAI,IAAqC;EACjE,KACE,MAAM,SAAS;GACb,GAAG;GACH,GAAG;GACH,GAAG,mBAAmB,QAAQ,EAAE,cAAc,CAAC,SAAS,IAAI,OAAO,CAAC;EACtE,GACA,gBAAgB,IAAI,MAAM,SAAS,KAAK;EAC1C,MAAM,eAAe,CAAC,GAAG,gBAAgB,OAAO,CAAC;EACjD,MAAM,yBAAyB,IAAI,IAAI,qBAAqB,KAAK,EAAE,cAAc,OAAO,CAAC;EACzF,MAAM,kCAAkC,IAAI,IAAI,mBAAmB,KAAK,EAAE,cAAc,OAAO,CAAC;EAChG,IAAI,wBAAwB;EAC5B,IAAI,qBAAqB;EACzB,IAAI,oBAAoB;EACxB,IAAI,YAAY;EAChB,IAAI,cAAc;EAClB,IAAI,oBAAoB;EACxB,IAAI,qBAAqB;EAEzB,KAAK,MAAM,SAAS,gBAAgB;GAClC,IAAI,MAAM,SAAS,gBAAgB;GACnC,eAAe,OAAO,kBAAkB,aAAa,eAAe,OAAO,KAAK;EAClF;EACA,MAAM,kCAAkB,IAAI,IAA4C;EACxE,IACE,yBAAyB,SAAS,KAAK,aAAa,MACjD,UAAU,MAAM,SAAS,kBAAkB,cAAc,MAAM,UAAU,MAAM,YAClF,GAEA,KAAK,MAAM,UAAU,OAAO,YAAY,OAAO,oBAAoB,MAAM,WAAW,GAClF,gBAAgB,IAAI,OAAO,WAAW,cAAc,MAAM;EAG9D,KAAK,MAAM,SAAS,0BAA0B;GAC5C,IAAI,MAAM,SAAS,gBAAgB;GACnC,MAAM,aAAa,OAAO,oBAAoB,gBAAgB,CAAC,CAAC,MAAM,UAAU;GAChF,MAAM,SAAS,OAAO,UAAU,UAAU,IAAI,WAAW,QAAQ,SAAS;GAC1E,IAAI,WAAW,QAAQ,WAAW,KAAA,GAAW;GAC7C,MAAM,WAAW,OAAO,WAAW,aAAa,OAAO,MAAM,iBAAiB;GAC9E,IAAI,aAAa,MAAM;GACvB,OAAO,8BACL,aACA,eACA,OACA,SAAS,UACT,QACA,MAAM,SACN,eACF;EACF;EACA,KAAK,MAAM,SAAS,cAClB,IAAI,MAAM,SAAS,gBAAgB;GACjC,IAAI,MAAM,eAAe,WAAW;IAClC,cAAc,OAAO,mBACnB,aACA,eACA,OACA,UACA,KACF,EAAA,CAAG;IACH;GACF;GACA,IAAI,MAAM,eAAe,6BAA6B;IACpD,OAAO,6BAA6B,aAAa,eAAe,OAAO,KAAK;IAC5E;GACF;GACA,MAAM,iBAAiB,uBAAuB,IAAI,MAAM,OAAO;GAC/D,MAAM,2BAA2B,MAAM,eAAe,gCACpD,gCAAgC,IAAI,MAAM,OAAO;GACnD,MAAM,UAAU,OAAO,wBACrB,aACA,eACA,OACA,OACA,MAAM,eAAe,+BAA+B,iBAAiB,gBACrE,4BAA4B,gBAC5B,gBACA,eACF;GACA,yBAAyB,QAAQ;GACjC,aAAa,QAAQ;GACrB,sBAAsB,QAAQ;EAChC,OAAO,IAAI,MAAM,SAAS,mBACxB,0BAA0B,OAAO,2BAA2B,aAAa,OAAO,KAAK,EAAA,CAAG;EAG5F,KAAK,MAAM,SAAS,gBAAgB;GAClC,IAAI,MAAM,SAAS,kBAAkB;GACrC,MAAM,UAAU,OAAO,oBACrB,aACA,eACA,OACA,UACA,KACF;GACA,qBAAqB,QAAQ;GAC7B,sBAAsB,QAAQ;EAChC;EACA,KAAK,MAAM,SAAS,gBAAgB;GAClC,IAAI,MAAM,SAAS,uBAAuB;GAC1C,MAAM,UAAU,OAAO,wBAAwB,aAAa,eAAe,OAAO,KAAK;GACvF,aAAa,QAAQ;GACrB,qBAAqB,QAAQ;EAC/B;EACA,qBAAqB,OAAO,qCAC1B,aACA,eACA,OACA,cACF;EACA,IAAI,eAAe,SAAS,KAAK,wBAAwB,GAAG;GAC1D,MAAM,YAAY,OAAO,iCACvB,cACC,aAAa,WAAW,eAAe,UAAU,wBAAwB,GAC1E,OACA,QACF;GACA,sBAAsB,UAAU;GAChC,qBAAqB,UAAU;GAC/B,aAAa,UAAU;GACvB,qBAAqB,UAAU;EACjC;EACA,OAAO;GACL,eAAe,UAAU;GACzB,oBAAoB,eAAe;GACnC;GACA;GACA;GACA;GACA;GACA;GACA;EACF;CACF,CAAC;CACD,OAAO,OAAO,YAAY,kBAAkB,eAC1C,MAAM,aACN,uBACF;AACF,CAAC;;;AC1gED,IAAM,+BAA+B;AACrC,IAAM,yCAAyC;AAC/C,IAAM,6BAA6B;AACnC,IAAM,uBAAuB;AAG7B,IAAM,sBACJ,QACA,cAEA,OAAO,SAAS,YACZ;CAAE,MAAM;CAAW;AAAU,IAC7B;CACA,GAAG;CACH;CACA,SAAS,OAAO,YAAY,QAAQ,SAAS,MAAM,WAAW,OAAO,OAAO,KAAK,IAC7E,OAAO,UACP;AACN;;AAkBJ,IAAa,sCACX,YACmC;CACnC,MAAM,6BAAa,IAAI,IAAwC;CAC/D,KAAK,MAAM,UAAU,SAAS,WAAW,IAAI,OAAO,YAAY,MAAM;CACtE,OAAO,EAAE,MAAM,eAAe,OAAO,cAAc,WAAW,IAAI,UAAU,CAAC,EAAE;AACjF;AAEA,IAAM,kBACJ,YACA,YACG,WAAW,KAAK,OAAO;;AAG5B,IAAa,oCAAoC,mCAAmC;CAClF;EAAE,YAAY;EAAc,WAAW,wBAAwB,YAAY;EAAG,MAAM;CAAe;CACnG;EAAE,YAAY;EAAgB,WAAW,wBAAwB,cAAc;EAAG,MAAM;CAAe;CACvG;EAAE,YAAY;EAAQ,WAAW,wBAAwB,MAAM;EAAG,MAAM;CAAe;CACvF;EAAE,YAAY;EAAY,WAAW,wBAAwB,UAAU;EAAG,MAAM;CAAe;CAC/F;EAAE,YAAY;EAAc,WAAW,wBAAwB,YAAY;EAAG,MAAM;CAAe;AACrG,CAAC;AAED,IAAM,oBAAoB,IAAI,8BAA8B,EAAE,SAAS,KAAK,CAAC;AAE7E,IAAM,sBACJ,YAEA,QAAQ,SAAS,wBAAwB,IAAI,4BAA4B,IAAI,YAAY;AAE3F,IAAM,oCAAoB,IAAI,IAAI;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,IAAM,mBAAmB,YACvB,UAAU,YAAY,SAAS,MAAM,KACrC,OAAO,QAAQ,SAAS,YACxB,kBAAkB,IAAI,QAAQ,IAAI;AAEpC,IAAM,iBAAiB,YAA2C;CAChE,IAAI,gBAAgB,OAAO,GAAG,OAAO;CACrC,IACE,UAAU,YAAY,SAAS,MAAM,KACrC,QAAQ,SAAS,4CAEjB,OAAO,IAAI,+BAA+B;EACxC,WAAW;EACX,gBAAgB;CAClB,CAAC;CAEH,IACE,UAAU,YAAY,SAAS,MAAM,KACrC,QAAQ,SAAS,iCACjB,UAAU,YAAY,SAAS,YAAY,MAC1C,QAAQ,eAAe,uBAAuB,QAAQ,eAAe,qBAEtE,OAAO,IAAI,+BAA+B;EACxC,WAAW;EACX,gBAAgB;CAClB,CAAC;CAEH,OAAO;AACT;AAEA,IAAM,sBAAsB,YAAmC;CAC7D,QAAQ,QAAQ,MAAhB;EACE,KAAK,+BACH,OAAO;EACT,KAAK,8BACH,OAAO;EACT,KAAK,0BACH,OAAO;EACT,KAAK,wBACH,OAAO;EACT,KAAK,kCACH,OAAO;EACT,KAAK,uBACH,OAAO;EACT,KAAK,6BACH,OAAO;EACT,KAAK,yBACH,OAAO;EACT,KAAK,sCACH,OAAO;EACT,KAAK,8BACH,OAAO;EACT,KAAK,+BACH,OAAO;CACX;AACF;AAEA,IAAM,gBAAgB,OAAO,GAAG,2CAA2C,CAAC,CAAC,WAC3E,SACA,WACA;CACA,OAAO,OAAO,OAAO,oBAAoB,OAAO,OAAO,YAAY,CAAC,CAAC,CAAC;EACpE,MAAM;EACN;EACA,cAAc,mBAAmB,OAAO;EACxC,SAAS,QAAQ,SAAS,2BAA2B,QAAQ,UAAU;EACvE,aAAa,mBAAmB,OAAO;CACzC,CAAC;AACH,CAAC;AAED,IAAM,yBACJ,oBACA,YACA,WACA,iBAC+B;CAC/B,MAAM,cAAmD,aAAa,iBAAiB,KAAA;CACvF,MAAM,cAAmD,aAAa,sBAAsB,KAAA;CAC5F,OAAO;EACL;EACA;EACA;EACA,eAAe,aAAa,aAAa;EACzC,eAAe,aAAa,eAAe;EAC3C,QAAQ,gBAAgB,KAAA,IACpB,UACA,YAAY,YAAY,OACxB,YACA,YAAY;EAChB,gBAAgB,aAAa,kBAAkB;CACjD;AACF;;AA0BA,IAAa,kCAAkC,OAAO,GACpD,kCACF,CAAC,CAAC,WACA,aACA,UAA0C,mCACqE;CAC/G,MAAM,cAAc,OAAO;CAC3B,MAAM,UAAU,OAAO;CACvB,MAAM,gBAAgB,OAAO,OAAO;CAEpC,MAAM,OAAO,OAAO,GAAG,kCAAkC,CAAC,CAAC,WAAU,OAGwB;EAC3F,MAAM,aAAa,OAAO,YAAY,kBAAkB,IACtD,MAAM,aACN,MAAM,kBACR,CAAC,CAAC,KAAK,OAAO,SAAS,kBAAkB,CAAC;EAC1C,MAAM,SAAS,QAAQ,IAAI,WAAW,UAAU;EAChD,IAAI,OAAO,OAAO,MAAM,GAAG,OAAO,OAAO,IAAI,0BAA0B;EACvE,MAAM,UAAU,OAAO,YAAY,cAAc,WAC/C,MAAM,aACN,MAAM,kBACR,CAAC,CAAC,KAAK,OAAO,SAAS,kBAAkB,CAAC;EAC1C,MAAM,aAAa,OAAO,OAAO,oBAAoB,OAAO,eAAe,4BAA4B,CAAC,CAAC,CACvG,QAAQ,cACV,CAAC,CAAC,KAAK,OAAO,eAAe,IAAI,0BAA0B,CAAC,CAAC;EAC7D,IAAI,CAAC,kCAAkC,WAAW,YAAY,UAAU,GACtE,OAAO,OAAO,IAAI,0BAA0B;EAE9C,MAAM,YAAY,OAAO,OAAO,oBAAoB,eAAe,CAAC,CAAC,OAAO,MAAM,SAAS,CAAC,CAAC,KAC3F,OAAO,eAAe,IAAI,0BAA0B,CAAC,CACvD;EACA,OAAO;GAAE,GAAG;GAAO,YAAY,WAAW;GAAY,QAAQ,OAAO;GAAO;EAAU;CACxF,CAAC;CAED,MAAM,gCAAgC,OAAO,GAC3C,2DACF,CAAC,CAAC,WAAU,OAGT;EACD,MAAM,cAAc,SAAS,WAAW,OAAO,OAAO,WAAW,UAAU,MAAM,iBAAiB,CAAC;EACnG,OAAO,YAAY,cAAc,sBAC/B,MAAM,MAAM,aACZ,MAAM,MAAM,oBACZ,MAAM,MAAM,YACZ,MAAM,MAAM,WACZ,aACA,MAAM,QAAQ,eAChB,CAAC,CAAC,KACA,OAAO,OAAO;GACZ,KAAK;GACL,SAAS;EACX,CAAC,CACH;CACF,CAAC;CAED,MAAM,8BAA8B,OAAO,GACzC,yDACF,CAAC,CAAC,WAAU,OAA6B;EACvC,OAAO,YAAY,cAAc,iBAC/B,MAAM,aACN,MAAM,oBACN,MAAM,WACN,MAAM,OACR,CAAC,CAAC,KAAK,OAAO,eAAe,YAAY,CAAC,CAAC;CAC7C,CAAC;CAED,MAAM,uBAAuB,OAAO,GAClC,kDACF,CAAC,CAAC,WAAU,OAAwB;EAClC,MAAM,UAAU,OAAO,cAAc,aAAa,KAAK,OAAO,eAAe,YAAY,CAAC,CAAC;EAC3F,MAAM,YAAY,SAAS,WAAW,OAAO,OAAO,WAAW,UAAU,MAAM,iBAAiB,CAAC;EACjG,MAAM,YAAY,SAAS,IAAI,WAAW,EAAE,SAAS,uCAAuC,CAAC;EAU7F,IAAI,EAAC,OATkB,YAAY,cAAc,UAC/C,MAAM,aACN,MAAM,oBACN,MAAM,YACN,MAAM,WACN,SACA,WACA,SACF,CAAC,CAAC,KAAK,OAAO,eAAe,YAAY,CAAC,CAAC,IAC7B,OAAO,OAAO,YAAY;EACxC,OAAO;GAAE,GAAG;GAAO;EAAQ;CAC7B,CAAC;CAED,MAAM,WAAW,OAAO,GAAG,sCAAsC,CAAC,CAAC,WAAU,OAAwB;EACnG,MAAM,eAAe,OAAO,YAAY,cAAc,oBACpD,MAAM,aACN,MAAM,oBACN,MAAM,SACR,CAAC,CAAC,KAAK,OAAO,eAAe,YAAY,CAAC,CAAC;EAC3C,OAAO,sBACL,MAAM,oBACN,MAAM,YACN,MAAM,WACN,YACF;CACF,CAAC;CAED,MAAM,YAAY,OAAO,GAAG,mCAAmC,CAAC,CAAC,WAAU,OAGxE;EACD,MAAM,QAAQ,OAAO,KAAK,KAAK;EAC/B,OAAO,OAAO,SAAS,KAAK;CAC9B,CAAC;CAED,MAAM,gBAAgB,OAAO,GAAG,2CAA2C,CAAC,CAAC,WAC3E,OACA,WACA,QACA,QACA;EACA,MAAM,YAAY,OAAO,YAAY,SAAS,OAAO,IAAI,aAAY;GACnE,OAAO,qCAAqC,aAAa,SAAS;GAClE,MAAM,UAAU,OAAO,YAAY,cAAc,WAC/C,MAAM,aACN,MAAM,kBACR;GACA,OAAO,YAAY,cAAc,aAC/B,MAAM,aACN,MAAM,oBACN,QAAQ,UACR,QACA,SAAS,QAAQ,sBAAsB,IAAI,CAC7C;GACA,OAAO,4BAA4B;IACjC,aAAa,MAAM;IACnB,oBAAoB,MAAM;IAC1B,WAAW;IACX,YAAY,OAAO;IACnB,QAAQ;GACV,CAAC,CAAC,CAAC,KACD,OAAO,eAAe,OAAO,QAAQ,aAAa,GAClD,OAAO,eAAe,aAAa,WAAW,CAChD;GACA,OAAO;EACT,CAAC,CAAC,CAAC,CAAC,KACF,OAAO,SAAS,+BAA+B,OAAO,QAAQ,KAAK,CAAC,GACpE,OAAO,eAAe,YAAY,CAAC,CACrC;EACA,IAAI,WAAW,OAAO,QAAQ,OAAO,MAAM,WAAW;EACtD,OAAO;CACT,CAAC;CAED,MAAM,oBAAoB,OAAO,GAAG,+CAA+C,CAAC,CAAC,WACnF,OACA;EACA,MAAM,UAAU,OAAO,OAAO,OAC5B,YAAY,cAAc,UAAU,MAAM,aAAa,MAAM,oBAAoB,MAAM,SAAS,CAClG;EACA,IAAI,OAAO,UAAU,OAAO,GAAG;GAC7B,IAAI,QAAQ,QAAQ,SAAS,uBAAuB,OAAO;GAC3D,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO;EAC3C;EACA,OAAO,QAAQ,QAAQ,mBAAmB,OACtC,OACA,OAAO,OAAO,oBAAoB,OAAO,eAAe,kBAAkB,CAAC,CAAC,CAC5E,QAAQ,QAAQ,cAClB;CACJ,CAAC;CAED,MAAM,MAAM,OAAO,GAAG,iCAAiC,CAAC,CAAC,WACvD,OACA,WACA,YACA,QACA;EACA,MAAM,aAAa,OAAO,kBAAkB,KAAK;EACjD,MAAM,UAAU,OAAO,OAAO,oBAAoB,mBAAmB,CAAC,CAAC;GACrE,WAAW,MAAM;GACjB;EACF,CAAC;EACD,MAAM,gBAAgB,OAAO,OAAO,OAClC,YAAY,cAAc,UAAU,MAAM,aAAa,MAAM,oBAAoB,MAAM,SAAS,CAClG;EACA,MAAM,WAAW,OAAO,UAAU,aAAa,IAAI,cAAc,QAAQ,WAAW;EACpF,OAAO,OAAO,OAAO,cACnB,MAAM,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,KAAK,OAAO,KAAK,4BAA4B,CAAC,UAC9E;GAAE;GAAQ,YAAY;GAAO,WAAW;GAAG,gBAAgB;GAAG;EAAS,KAC7E,OAAO,SACN,OAAO,IAAI,aAAY;GACrB,IAAI,MAAM,YACR,OAAO,OAAO,IAAI,+BAA+B;IAC/C,WAAW;IACX,gBAAgB;GAClB,CAAC;GAEH,MAAM,cAAc,SAAS,WAAW,OAAO,MAAM,iBAAiB;GACtE,MAAM,mBAAmB,mBAAmB,MAAM,QAAQ,WAAW;GACrE,MAAM,UAAU,OAAO,gCAAgC;IACrD,aAAa,MAAM;IACnB,oBAAoB,MAAM;IAC1B,YAAY,MAAM;IAClB,WAAW,MAAM;IACjB,kBAAkB,MAAM;IACxB;IACA;IACA,mBAAmB;GACrB,GAAG,IAAI,CAAC,CAAC,KACP,OAAO,eAAe,OAAO,QAAQ,aAAa,GAClD,OAAO,eAAe,aAAa,WAAW,CAChD;GACA,MAAM,YAAY,MAAM,YAAY;GACpC,OAAO;IACL,QAAQ;IACR,YAAY,CAAC,KAAK;IAClB;IACA,gBAAgB,MAAM,kBAAkB,QAAQ,gBAAgB,IAAI;IACpE,UAAU,MAAM,YAAY,QAAQ,gBAAgB,IAAI;GAC1D;EACF,CAAC,CACL;CACF,CAAC;CAED,MAAM,qBAAqB,OAAO,GAAG,gDAAgD,CAAC,CAAC,WACrF,OAIA,OACA,SACA,WACA;EACA,MAAM,eAAe,OAAO,OAAO,OAAO,OAAO,OAC/C,OAAO,QACL,YAAY,cAAc;GACxB,aAAa,MAAM;GACnB,oBAAoB,MAAM;EAC5B,CAAC,IACA,YACC,OAAO,IAAI,aAAY;GACrB,MAAM,aAAa,QAAQ,IAAI,SAAS,gBAAgB;GACxD,MAAM,SAAS,OAAO,WAAW;GACjC,IAAI,OAAO,SAAS,iBAAiB,OAAO,SAAS,YAAY,OAAO;GACxE,MAAM,YAAY,OAAO,IAAI,OAAO,WAAW,YAAY,MAAM;GACjE,IACE,CAAC,UAAU,eAET,UAAU,YAAY,gCACtB,UAAU,mBAAmB,IAG/B,OAAO,OAAO,IAAI,+BAA+B;IAC/C,WAAW;IACX,gBAAgB;GAClB,CAAC;GAEH,OAAO,UAAU;EACnB,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,CAAC,CACnC,CACF,CAAC;EACD,MAAM,UAAU,OAAO,OAAO,IAAI,aAAY;GAC5C,IAAI,OAAO,UAAU,YAAY,GAAG;IAClC,MAAM,SAAS,aAAa;IAC5B,MAAM,oBAAoB,OAAO,SAAS,iBAAiB,OAAO,SAAS;IAC3E,MAAM,kBAAkB,OAAO,cAAc,OAAO,WAAW,QAAQ,iBAAiB;IACxF,OAAO,qBAAqB,CAAC,kBAAkB,6BAA6B;GAC9E;GACA,OAAO,OAAO,SAAS,wCAAwC,aAAa,OAAO,CAAC,CAAC,KACnF,OAAO,aAAa;IAClB,aAAa,MAAM;IACnB,oBAAoB,MAAM;IAC1B,WAAW,MAAM;GACnB,CAAC,CACH;GACA,MAAM,UAAU,cAAc,aAAa,OAAO;GAClD,IAAI,YAAY,MAAM,OAAO,OAAO,YAAY;GAEhD,MAAM,SAAS,OAAO,cAAc,SADnB,SAAS,WAAW,OAAO,OAAO,WAAW,UAAU,MAAM,iBAAiB,CAClD,CAAQ,CAAC,CAAC,KAAK,OAAO,eAAe,YAAY,CAAC,CAAC;GAChG,OAAO,cAAc,OAAO,WAAW,QAAQ,IAAI;GACnD,OAAO;EACT,CAAC;EACD,MAAM,cAAc,SAAS,WAAW,OAAO,OAAO,WAAW,UAAU,MAAM,iBAAiB,CAAC;EACnG,OAAO,YAAY,cAAc,oBAC/B,MAAM,aACN,MAAM,oBACN,MAAM,WACN,QAAQ,iBACR,SACA,WACF,CAAC,CAAC,KAAK,OAAO,eAAe,YAAY,CAAC,CAAC;EAC3C,OAAO,OAAO,UAAU,KAAK;CAC/B,CAAC;CAED,MAAM,mBAAmB,OAAO,GAAG,8CAA8C,CAAC,CAAC,WACjF,OAIA,OACA;EACA,MAAM,WAAW,OAAO,sCACtB,aACA,MAAM,aACN,MAAM,kBACR,CAAC,CAAC,KAAK,OAAO,SAAS,kBAAkB,CAAC;EAC1C,IAAI,CAAC,SAAS,WAAW,WAAW,OAAO,OAAO,IAAI,0BAA0B;EAChF,OAAO,OAAO,OAAO,kBACnB,OAAO,IAAI,aAAY;GACrB,MAAM,YAAY,SAAS,WAAW,OAAO,OAAO,WAAW,UAAU,MAAM,iBAAiB,CAAC;GACjG,OAAO,OAAO,YAAY,cAAc,iBACtC,MAAM,aACN,MAAM,oBACN,MAAM,YACN,MAAM,WACN,SACF,CAAC,CAAC,KAAK,OAAO,eAAe,YAAY,CAAC,CAAC;EAC7C,CAAC,IACA,YAAY,mBAAmB,OAAO,OAAO,SAAS,SAAS,SAAS,IACxE,YAAY,8BAA8B;GAAE;GAAS;EAAM,CAAC,CAC/D;CACF,CAAC;CAwBD,OAAO;EAAE,OAAO;EAAW,aAtBP,OAAO,GAAG,yCAAyC,CAAC,CAAC,WAAU,OAGhF;GACD,MAAM,QAAQ,OAAO,KAAK,KAAK;GAC/B,OAAO,OAAO,OAAO,kBACnB,qBAAqB,KAAK,IACzB,UAAU,iBAAiB,OAAO,KAAK,GACxC,2BACF,CAAC,CAAC,KACA,OAAO,UAAU,UACf,OAAO,SAAS,sDAAsD,KAAK,CAAC,CAAC,KAC3E,OAAO,aAAa;IAClB,aAAa,MAAM;IACnB,oBAAoB,MAAM;IAC1B,WAAW,MAAM;GACnB,CAAC,CACH,CACF,CACF;EACF,CAE2B;CAAY;AACzC,CAAC"}
|