@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":"BrowserCrypto-DVWR7DFd.js","names":["Effect.map","Effect.sync","Effect.clockWith","Effect.succeed","Effect.fail","PlatformError.badArgument","EffectCrypto.Crypto","Effect.die","Effect.fail","PlatformError.systemError","Effect.map","Effect.tryPromise","EffectCrypto.make"],"sources":["../../../../../node_modules/.pnpm/effect@4.0.0-beta.98/node_modules/effect/dist/Crypto.js","../../../../../node_modules/.pnpm/@effect+platform-browser@4.0.0-beta.98_effect@4.0.0-beta.98/node_modules/@effect/platform-browser/dist/BrowserCrypto.js"],"sourcesContent":["/**\n * Defines a platform-independent service for cryptographic operations.\n *\n * Runtime packages provide concrete implementations backed by the host\n * platform's cryptography APIs. This module defines the service interface and a\n * constructor from random-byte and digest primitives. The service provides\n * secure random bytes and numbers, UUIDv4 and UUIDv7 generation, shuffling, and\n * SHA message digests.\n *\n * @since 4.0.0\n */\nimport * as Context from \"./Context.js\";\nimport * as Effect from \"./Effect.js\";\nimport * as PlatformError from \"./PlatformError.js\";\nconst TypeId = \"~effect/platform/Crypto\";\n/**\n * Service tag for platform cryptography.\n *\n * **When to use**\n *\n * Use when you need to provide or retrieve the full platform cryptography\n * service from an effect's context.\n *\n * **Details**\n *\n * Providing this service supplies platform-agnostic cryptographic operations\n * such as hashing, UUID generation, and secure random values.\n *\n * @see {@link make} for constructing a Crypto service from primitive operations\n *\n * @category services\n * @since 4.0.0\n */\nexport const Crypto = /*#__PURE__*/Context.Service(\"effect/Crypto\");\n/**\n * Creates a `Crypto` service from the primitive implementation, deriving the\n * random generator helpers and UUID generation from those primitives.\n *\n * **When to use**\n *\n * Use to build a Crypto service for a platform integration, test layer, or\n * custom runtime from primitive random-byte and digest operations.\n *\n * **Details**\n *\n * The constructor derives random numbers, booleans, integer ranges, shuffling,\n * and UUID generation from `impl.randomBytes`. Digest operations delegate to\n * `impl.digest`.\n *\n * **Gotchas**\n *\n * `impl.randomBytes` must return cryptographically secure bytes of the\n * requested length. UUID formatting mutates the byte array returned for UUID\n * generation, so the implementation should return a fresh array for each call.\n *\n * **Example** (Creating a Crypto service)\n *\n * ```ts\n * import { Crypto, Effect, Layer } from \"effect\"\n *\n * const TestCrypto = Layer.succeed(\n * Crypto.Crypto,\n * Crypto.make({\n * randomBytes: (size) => new Uint8Array(size),\n * digest: (_algorithm, data) => Effect.succeed(data)\n * })\n * )\n * ```\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = impl => {\n const randomBytesUnsafe = impl.randomBytes;\n const randomBytes = size => Effect.map(validateSize(\"randomBytes\", size), randomBytesUnsafe);\n const nextDoubleUnsafe = () => {\n const bytes = randomBytesUnsafe(7);\n const value = (bytes[0] & 0x1f) * 2 ** 48 + bytes[1] * 2 ** 40 + bytes[2] * 2 ** 32 + bytes[3] * 2 ** 24 + bytes[4] * 2 ** 16 + bytes[5] * 2 ** 8 + bytes[6];\n return value / 2 ** 53;\n };\n const nextIntUnsafe = () => Math.floor(nextDoubleUnsafe() * (Number.MAX_SAFE_INTEGER - Number.MIN_SAFE_INTEGER + 1)) + Number.MIN_SAFE_INTEGER;\n return Crypto.of({\n [TypeId]: TypeId,\n randomBytes,\n nextDoubleUnsafe,\n nextIntUnsafe,\n digest: impl.digest,\n random: Effect.sync(() => nextDoubleUnsafe()),\n randomBoolean: Effect.sync(() => nextDoubleUnsafe() > 0.5),\n randomInt: Effect.sync(() => nextIntUnsafe()),\n randomBetween: (min, max) => Effect.sync(() => nextDoubleUnsafe() * (max - min) + min),\n randomIntBetween(min, max, options) {\n const extra = options?.halfOpen === true ? 0 : 1;\n return Effect.sync(() => {\n const minInt = Math.ceil(min);\n const maxInt = Math.floor(max);\n return Math.floor(nextDoubleUnsafe() * (maxInt - minInt + extra)) + minInt;\n });\n },\n randomShuffle: elements => Effect.sync(() => {\n const buffer = Array.from(elements);\n for (let i = buffer.length - 1; i >= 1; i = i - 1) {\n const index = Math.min(i, Math.floor(nextDoubleUnsafe() * (i + 1)));\n const value = buffer[i];\n buffer[i] = buffer[index];\n buffer[index] = value;\n }\n return buffer;\n }),\n randomUUIDv4: Effect.sync(() => formatUUIDv4(randomBytesUnsafe(16))),\n randomUUIDv7: Effect.clockWith(clock => Effect.succeed(formatUUIDv7(clock.currentTimeMillisUnsafe(), randomBytesUnsafe(16))))\n });\n};\nconst validateSize = (method, size) => Number.isSafeInteger(size) && size >= 0 ? Effect.succeed(size) : Effect.fail(PlatformError.badArgument({\n module: \"Crypto\",\n method,\n description: \"size must be a non-negative safe integer\"\n}));\nconst hex = byte => byte.toString(16).padStart(2, \"0\");\nconst formatUUID = bytes => {\n const segments = [bytes.subarray(0, 4), bytes.subarray(4, 6), bytes.subarray(6, 8), bytes.subarray(8, 10), bytes.subarray(10, 16)];\n return segments.map(segment => Array.from(segment, hex).join(\"\")).join(\"-\");\n};\nconst formatUUIDv4 = bytes => {\n bytes[6] = bytes[6] & 0x0f | 0x40;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\nconst maxUUIDv7Timestamp = 2 ** 48 - 1;\nconst formatUUIDv7 = (timestampMillis, bytes) => {\n const timestamp = Math.min(Math.max(0, Math.trunc(timestampMillis)), maxUUIDv7Timestamp);\n bytes[0] = Math.floor(timestamp / 2 ** 40);\n bytes[1] = Math.floor(timestamp / 2 ** 32) & 0xff;\n bytes[2] = Math.floor(timestamp / 2 ** 24) & 0xff;\n bytes[3] = Math.floor(timestamp / 2 ** 16) & 0xff;\n bytes[4] = Math.floor(timestamp / 2 ** 8) & 0xff;\n bytes[5] = timestamp & 0xff;\n bytes[6] = bytes[6] & 0x0f | 0x70;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\n//# sourceMappingURL=Crypto.js.map","/**\n * Browser-backed implementation of Effect's Crypto service.\n *\n * This module provides a `Crypto.Crypto` layer backed by the Web Crypto API.\n * The {@link WebCrypto} context reference defaults to `globalThis.crypto`, so\n * browser programs can use the standard implementation while tests or embedded\n * runtimes can provide their own `Crypto` object.\n *\n * @since 1.0.0\n */\nimport * as Context from \"effect/Context\";\nimport * as EffectCrypto from \"effect/Crypto\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PlatformError from \"effect/PlatformError\";\n/**\n * Provides Browser Web Crypto APIs used by the Crypto service implementation.\n *\n * **When to use**\n *\n * Use to override the browser `Crypto` object used by the platform crypto\n * layer.\n *\n * @category references\n * @since 1.0.0\n */\nexport const WebCrypto = /*#__PURE__*/Context.Reference(\"@effect/platform-browser/Crypto/WebCrypto\", {\n defaultValue: () => globalThis.crypto\n});\n/**\n * Layer that directly interfaces with the Web Crypto API.\n *\n * **When to use**\n *\n * Use to provide cryptographic randomness, UUID generation, and digest\n * operations in browser runtimes backed by `globalThis.crypto`.\n *\n * **Details**\n *\n * Random bytes are produced with `crypto.getRandomValues`. Digests are computed\n * with `crypto.subtle.digest` and returned as `Uint8Array` values.\n *\n * **Gotchas**\n *\n * The layer dies if the Web Crypto object is unavailable. Digest operations\n * fail with `PlatformError` when `crypto.subtle.digest` is unavailable or the\n * browser rejects the digest request.\n *\n * @category layers\n * @since 1.0.0\n */\nexport const layer = /*#__PURE__*/Layer.effect(EffectCrypto.Crypto, /*#__PURE__*/Effect.gen(function* () {\n const crypto = yield* WebCrypto;\n if (!crypto) {\n return yield* Effect.die(new Error(\"Web Crypto API is not available\"));\n }\n const randomBytes = size => {\n const bytes = new Uint8Array(size);\n crypto.getRandomValues(bytes);\n return bytes;\n };\n const digest = (algorithm, data) => {\n if (typeof crypto.subtle.digest !== \"function\") {\n return Effect.fail(PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"crypto.subtle.digest is not available\"\n }));\n }\n return Effect.map(Effect.tryPromise({\n try: () => crypto.subtle.digest(algorithm, new Uint8Array(data)),\n catch: cause => PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"Could not compute digest\",\n cause\n })\n }), buffer => new Uint8Array(buffer));\n };\n return EffectCrypto.make({\n randomBytes,\n digest\n });\n}));\n//# sourceMappingURL=BrowserCrypto.js.map"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BrowserCrypto-BMbjhcvP.js","names":["Effect.map","Effect.sync","Effect.clockWith","Effect.succeed","Effect.fail","PlatformError.badArgument","EffectCrypto.Crypto","Effect.die","Effect.fail","PlatformError.systemError","Effect.map","Effect.tryPromise","EffectCrypto.make"],"sources":["../../../../../node_modules/.pnpm/effect@4.0.0-beta.98/node_modules/effect/dist/Crypto.js","../../../../../node_modules/.pnpm/@effect+platform-browser@4.0.0-beta.98_effect@4.0.0-beta.98/node_modules/@effect/platform-browser/dist/BrowserCrypto.js"],"sourcesContent":["/**\n * Defines a platform-independent service for cryptographic operations.\n *\n * Runtime packages provide concrete implementations backed by the host\n * platform's cryptography APIs. This module defines the service interface and a\n * constructor from random-byte and digest primitives. The service provides\n * secure random bytes and numbers, UUIDv4 and UUIDv7 generation, shuffling, and\n * SHA message digests.\n *\n * @since 4.0.0\n */\nimport * as Context from \"./Context.js\";\nimport * as Effect from \"./Effect.js\";\nimport * as PlatformError from \"./PlatformError.js\";\nconst TypeId = \"~effect/platform/Crypto\";\n/**\n * Service tag for platform cryptography.\n *\n * **When to use**\n *\n * Use when you need to provide or retrieve the full platform cryptography\n * service from an effect's context.\n *\n * **Details**\n *\n * Providing this service supplies platform-agnostic cryptographic operations\n * such as hashing, UUID generation, and secure random values.\n *\n * @see {@link make} for constructing a Crypto service from primitive operations\n *\n * @category services\n * @since 4.0.0\n */\nexport const Crypto = /*#__PURE__*/Context.Service(\"effect/Crypto\");\n/**\n * Creates a `Crypto` service from the primitive implementation, deriving the\n * random generator helpers and UUID generation from those primitives.\n *\n * **When to use**\n *\n * Use to build a Crypto service for a platform integration, test layer, or\n * custom runtime from primitive random-byte and digest operations.\n *\n * **Details**\n *\n * The constructor derives random numbers, booleans, integer ranges, shuffling,\n * and UUID generation from `impl.randomBytes`. Digest operations delegate to\n * `impl.digest`.\n *\n * **Gotchas**\n *\n * `impl.randomBytes` must return cryptographically secure bytes of the\n * requested length. UUID formatting mutates the byte array returned for UUID\n * generation, so the implementation should return a fresh array for each call.\n *\n * **Example** (Creating a Crypto service)\n *\n * ```ts\n * import { Crypto, Effect, Layer } from \"effect\"\n *\n * const TestCrypto = Layer.succeed(\n * Crypto.Crypto,\n * Crypto.make({\n * randomBytes: (size) => new Uint8Array(size),\n * digest: (_algorithm, data) => Effect.succeed(data)\n * })\n * )\n * ```\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = impl => {\n const randomBytesUnsafe = impl.randomBytes;\n const randomBytes = size => Effect.map(validateSize(\"randomBytes\", size), randomBytesUnsafe);\n const nextDoubleUnsafe = () => {\n const bytes = randomBytesUnsafe(7);\n const value = (bytes[0] & 0x1f) * 2 ** 48 + bytes[1] * 2 ** 40 + bytes[2] * 2 ** 32 + bytes[3] * 2 ** 24 + bytes[4] * 2 ** 16 + bytes[5] * 2 ** 8 + bytes[6];\n return value / 2 ** 53;\n };\n const nextIntUnsafe = () => Math.floor(nextDoubleUnsafe() * (Number.MAX_SAFE_INTEGER - Number.MIN_SAFE_INTEGER + 1)) + Number.MIN_SAFE_INTEGER;\n return Crypto.of({\n [TypeId]: TypeId,\n randomBytes,\n nextDoubleUnsafe,\n nextIntUnsafe,\n digest: impl.digest,\n random: Effect.sync(() => nextDoubleUnsafe()),\n randomBoolean: Effect.sync(() => nextDoubleUnsafe() > 0.5),\n randomInt: Effect.sync(() => nextIntUnsafe()),\n randomBetween: (min, max) => Effect.sync(() => nextDoubleUnsafe() * (max - min) + min),\n randomIntBetween(min, max, options) {\n const extra = options?.halfOpen === true ? 0 : 1;\n return Effect.sync(() => {\n const minInt = Math.ceil(min);\n const maxInt = Math.floor(max);\n return Math.floor(nextDoubleUnsafe() * (maxInt - minInt + extra)) + minInt;\n });\n },\n randomShuffle: elements => Effect.sync(() => {\n const buffer = Array.from(elements);\n for (let i = buffer.length - 1; i >= 1; i = i - 1) {\n const index = Math.min(i, Math.floor(nextDoubleUnsafe() * (i + 1)));\n const value = buffer[i];\n buffer[i] = buffer[index];\n buffer[index] = value;\n }\n return buffer;\n }),\n randomUUIDv4: Effect.sync(() => formatUUIDv4(randomBytesUnsafe(16))),\n randomUUIDv7: Effect.clockWith(clock => Effect.succeed(formatUUIDv7(clock.currentTimeMillisUnsafe(), randomBytesUnsafe(16))))\n });\n};\nconst validateSize = (method, size) => Number.isSafeInteger(size) && size >= 0 ? Effect.succeed(size) : Effect.fail(PlatformError.badArgument({\n module: \"Crypto\",\n method,\n description: \"size must be a non-negative safe integer\"\n}));\nconst hex = byte => byte.toString(16).padStart(2, \"0\");\nconst formatUUID = bytes => {\n const segments = [bytes.subarray(0, 4), bytes.subarray(4, 6), bytes.subarray(6, 8), bytes.subarray(8, 10), bytes.subarray(10, 16)];\n return segments.map(segment => Array.from(segment, hex).join(\"\")).join(\"-\");\n};\nconst formatUUIDv4 = bytes => {\n bytes[6] = bytes[6] & 0x0f | 0x40;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\nconst maxUUIDv7Timestamp = 2 ** 48 - 1;\nconst formatUUIDv7 = (timestampMillis, bytes) => {\n const timestamp = Math.min(Math.max(0, Math.trunc(timestampMillis)), maxUUIDv7Timestamp);\n bytes[0] = Math.floor(timestamp / 2 ** 40);\n bytes[1] = Math.floor(timestamp / 2 ** 32) & 0xff;\n bytes[2] = Math.floor(timestamp / 2 ** 24) & 0xff;\n bytes[3] = Math.floor(timestamp / 2 ** 16) & 0xff;\n bytes[4] = Math.floor(timestamp / 2 ** 8) & 0xff;\n bytes[5] = timestamp & 0xff;\n bytes[6] = bytes[6] & 0x0f | 0x70;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\n//# sourceMappingURL=Crypto.js.map","/**\n * Browser-backed implementation of Effect's Crypto service.\n *\n * This module provides a `Crypto.Crypto` layer backed by the Web Crypto API.\n * The {@link WebCrypto} context reference defaults to `globalThis.crypto`, so\n * browser programs can use the standard implementation while tests or embedded\n * runtimes can provide their own `Crypto` object.\n *\n * @since 1.0.0\n */\nimport * as Context from \"effect/Context\";\nimport * as EffectCrypto from \"effect/Crypto\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PlatformError from \"effect/PlatformError\";\n/**\n * Provides Browser Web Crypto APIs used by the Crypto service implementation.\n *\n * **When to use**\n *\n * Use to override the browser `Crypto` object used by the platform crypto\n * layer.\n *\n * @category references\n * @since 1.0.0\n */\nexport const WebCrypto = /*#__PURE__*/Context.Reference(\"@effect/platform-browser/Crypto/WebCrypto\", {\n defaultValue: () => globalThis.crypto\n});\n/**\n * Layer that directly interfaces with the Web Crypto API.\n *\n * **When to use**\n *\n * Use to provide cryptographic randomness, UUID generation, and digest\n * operations in browser runtimes backed by `globalThis.crypto`.\n *\n * **Details**\n *\n * Random bytes are produced with `crypto.getRandomValues`. Digests are computed\n * with `crypto.subtle.digest` and returned as `Uint8Array` values.\n *\n * **Gotchas**\n *\n * The layer dies if the Web Crypto object is unavailable. Digest operations\n * fail with `PlatformError` when `crypto.subtle.digest` is unavailable or the\n * browser rejects the digest request.\n *\n * @category layers\n * @since 1.0.0\n */\nexport const layer = /*#__PURE__*/Layer.effect(EffectCrypto.Crypto, /*#__PURE__*/Effect.gen(function* () {\n const crypto = yield* WebCrypto;\n if (!crypto) {\n return yield* Effect.die(new Error(\"Web Crypto API is not available\"));\n }\n const randomBytes = size => {\n const bytes = new Uint8Array(size);\n crypto.getRandomValues(bytes);\n return bytes;\n };\n const digest = (algorithm, data) => {\n if (typeof crypto.subtle.digest !== \"function\") {\n return Effect.fail(PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"crypto.subtle.digest is not available\"\n }));\n }\n return Effect.map(Effect.tryPromise({\n try: () => crypto.subtle.digest(algorithm, new Uint8Array(data)),\n catch: cause => PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"Could not compute digest\",\n cause\n })\n }), buffer => new Uint8Array(buffer));\n };\n return EffectCrypto.make({\n randomBytes,\n digest\n });\n}));\n//# sourceMappingURL=BrowserCrypto.js.map"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{d as n}from"./index-C7_FDTU7.js";import{Ea as r,_i as i,ai as a,pi as o}from"./agent-api-CeONl_8w.js";import{a as s,t as c}from"./client-DKS82kT_.js";var l=e(t(),1),u=a(function*(){return yield*(yield*c()).session.current()}).pipe(o(s)),d=e=>!r(e,`_tag`)||typeof e._tag!=`string`?{_tag:`unavailable`}:e._tag===`UnauthorizedApiError`?{_tag:`anonymous`}:e._tag===`ForbiddenApiError`?{_tag:`blocked`}:{_tag:`unavailable`},f=({loadSession:e=u}={})=>{let{beginHydration:t,completeHydration:r}=n();return(0,l.useEffect)(()=>{let n=t(),a=new AbortController,o=!0;return i(e,{signal:a.signal}).then(e=>{o&&r(n,{_tag:`authenticated`,csrfToken:e.csrfToken,session:e.session})},e=>{o&&r(n,d(e))}),()=>{o=!1,a.abort()}},[t,r,e]),null};export{f as BrowserSessionHydrator};
|
|
2
|
+
//# sourceMappingURL=BrowserSessionHydrator-BC1ymLkL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrowserSessionHydrator-BC1ymLkL.js","names":[],"sources":["../../../src/client/BrowserSessionHydrator.tsx"],"sourcesContent":["import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { type ReactElement, useEffect } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../api/client.js\"\nimport { useBrowserSession, type BrowserSessionState } from \"./BrowserSession.js\"\n\nconst loadBrowserSession = Effect.gen(function* () {\n const client = yield* makeControlCenterApiClient()\n return yield* client.session.current()\n}).pipe(Effect.provide(FetchHttpClient.layer))\n\nconst failedSessionState = (\n failure: unknown\n): Exclude<BrowserSessionState, { readonly _tag: \"authenticated\" | \"checking\" }> => {\n if (!Predicate.hasProperty(failure, \"_tag\") || typeof failure._tag !== \"string\") {\n return { _tag: \"unavailable\" }\n }\n if (failure._tag === \"UnauthorizedApiError\") return { _tag: \"anonymous\" }\n if (failure._tag === \"ForbiddenApiError\") return { _tag: \"blocked\" }\n return { _tag: \"unavailable\" }\n}\n\ninterface BrowserSessionHydratorProps {\n readonly loadSession?: typeof loadBrowserSession\n}\n\n/** Recover this tab's mutation proof once, regardless of its initial route. */\nexport const BrowserSessionHydrator = ({\n loadSession = loadBrowserSession\n}: BrowserSessionHydratorProps = {}): ReactElement | null => {\n const { beginHydration, completeHydration } = useBrowserSession()\n\n useEffect(() => {\n const attempt = beginHydration()\n const request = new AbortController()\n let isCurrent = true\n Effect.runPromise(loadSession, { signal: request.signal }).then(\n (result) => {\n if (!isCurrent) return\n completeHydration(attempt, {\n _tag: \"authenticated\",\n csrfToken: result.csrfToken,\n session: result.session\n })\n },\n (failure: unknown) => {\n if (isCurrent) completeHydration(attempt, failedSessionState(failure))\n }\n )\n return () => {\n isCurrent = false\n request.abort()\n }\n }, [beginHydration, completeHydration, loadSession])\n\n return null\n}\n"],"mappings":"kQAQM,EAAqB,EAAW,WAAa,CAEjD,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,QAAQ,QAAQ,CACvC,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAEvC,EACJ,GAEI,CAAC,EAAsB,EAAS,MAAM,GAAK,OAAO,EAAQ,MAAS,SAC9D,CAAE,KAAM,aAAc,EAE3B,EAAQ,OAAS,uBAA+B,CAAE,KAAM,WAAY,EACpE,EAAQ,OAAS,oBAA4B,CAAE,KAAM,SAAU,EAC5D,CAAE,KAAM,aAAc,EAQlB,GAA0B,CACrC,cAAc,GACiB,CAAC,IAA2B,CAC3D,GAAM,CAAE,iBAAgB,qBAAsB,EAAkB,EAyBhE,OAvBA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAU,EAAe,EACzB,EAAU,IAAI,gBAChB,EAAY,GAchB,OAbA,EAAkB,EAAa,CAAE,OAAQ,EAAQ,MAAO,CAAC,CAAC,CAAC,KACxD,GAAW,CACL,GACL,EAAkB,EAAS,CACzB,KAAM,gBACN,UAAW,EAAO,UAClB,QAAS,EAAO,OAClB,CAAC,CACH,EACC,GAAqB,CAChB,GAAW,EAAkB,EAAS,EAAmB,CAAO,CAAC,CACvE,CACF,MACa,CACX,EAAY,GACZ,EAAQ,MAAM,CAChB,CACF,EAAG,CAAC,EAAgB,EAAmB,CAAW,CAAC,EAE5C,IACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{f as n,t as r,u as i}from"./lib-BzlsKFNV.js";import{t as a}from"./jsx-runtime-By8HlURe.js";import{r as o,s}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{r as c,s as l}from"./releasePaths-XoI2BHX3.js";import{d as u,s as d,u as f}from"./index-C7_FDTU7.js";import{v as p}from"./patterns-5N-j-AD2-B9qgekXA.js";import{Oa as m,_i as h,ai as g,pi as _}from"./agent-api-CeONl_8w.js";import{a as v,t as y}from"./client-DKS82kT_.js";import{i as b,o as x}from"./releaseRoutes-t9uCfs5T.js";import{t as S}from"./presentPortfolio-C_JsoSWg.js";import{n as C,r as w}from"./workspaceEntityRoutes-2TejMrzb.js";import{n as T,t as E}from"./useWorkspaceItems-B1X-JNwq.js";import{t as D}from"./workspaceScrollCapture-BsjcWVsk.js";var O=e(t(),1),k=e=>{let t=new URLSearchParams,n=e.trim();return n.length>0&&t.set(`q`,n),t},A=(e,t)=>{let n=k(t),r=n.size===0?``:`?${n.toString()}`;return`${l(e)}${r}#results`},j=m(`UnauthorizedApiError`),M={load:e=>h(g(function*(){return yield*(yield*y()).portfolio.snapshot()}).pipe(_(v)),{signal:e})},N=e=>S(e).releases.map(t=>({codename:t.relay.codename,href:c(e.workspaceId,t.id),id:t.id,serviceName:t.serviceName,status:t.lifecycleLabel,tone:t.lifecycleTone,version:t.version})),P=(e,t,n=M)=>{let[r,i]=(0,O.useState)(0),[a,o]=(0,O.useState)({_tag:`idle`});(0,O.useEffect)(()=>{if(e===null){o({_tag:`idle`});return}let r=new AbortController;return o({_tag:`loading`,sessionKey:e}),n.load(r.signal).then(t=>{r.signal.aborted||o({_tag:`ready`,releases:N(t),sessionKey:e,workspaceId:t.workspaceId})},n=>{r.signal.aborted||(j(n)&&t(e),o({_tag:`failed`,sessionKey:e}))}),()=>r.abort()},[t,r,e,n]);let s=e===null?{_tag:`idle`}:a._tag===`idle`||a.sessionKey!==e?{_tag:`loading`,sessionKey:e}:a;return{retry:(0,O.useCallback)(()=>i(e=>e+1),[]),state:s}},F={trigger:`_trigger_dhy9p_1`,pairTrigger:`_pairTrigger_dhy9p_2`,dialog:`_dialog_dhy9p_13`,searchField:`_searchField_dhy9p_17`,results:`_results_dhy9p_43`,result:`_result_dhy9p_43`,resultCopy:`_resultCopy_dhy9p_69`,releaseMark:`_releaseMark_dhy9p_75`,resultKey:`_resultKey_dhy9p_96`,message:`_message_dhy9p_102`,loading:`_loading_dhy9p_103`,footer:`_footer_dhy9p_120`,visuallyHidden:`_visuallyHidden_dhy9p_149`},I=a(),L=2,R=6,z=new Set,B=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),V=e=>e===null?!1:`isContentEditable`in e&&e.isContentEditable===!0?!0:!(`nodeName`in e)||typeof e.nodeName!=`string`?!1:e.nodeName===`INPUT`||e.nodeName===`SELECT`||e.nodeName===`TEXTAREA`,H=(e,t)=>{let n=t.map(e=>e.toLocaleLowerCase(`en-US`));return n.some(t=>t===e)?0:n.some(t=>t.startsWith(e))?1:n.some(t=>t.includes(e))?2:3},U=(e,t,n)=>{let r=n.trim().toLocaleLowerCase(`en-US`);if(r.length===0)return[];let i=e.flatMap(e=>{let t=H(r,[e.codename,e.version,e.serviceName,e.status]);return t===3?[]:[{_tag:`release`,rank:t,release:e}]}),a=t.flatMap(e=>{let t=H(r,[e.key,e.title,e.status]);return t===3?[]:[{_tag:`item`,item:e,rank:t}]});return[...i,...a].sort((e,t)=>{if(e.rank!==t.rank)return e.rank-t.rank;if(e._tag!==t._tag)return e._tag===`release`?-1:1;let n=e._tag===`release`?e.release.codename:e.item.key,r=t._tag===`release`?t.release.codename:t.item.key;return n.localeCompare(r)}).slice(0,R)},W=({releaseTransport:e=M,sessionKey:t,transport:a=E,workspaceId:c})=>{let l=u(),f=i(),m=n(),h=(0,O.useRef)(null),[g,_]=(0,O.useState)(!1),[v,y]=(0,O.useState)(``),[S,k]=(0,O.useState)(0),j=v.trim(),N=(0,O.useDeferredValue)(j),R=N.length>=L,H=P(g?t:null,l.invalidateSession,e),W=H.state,G=(0,O.useMemo)(()=>W._tag===`ready`&&W.workspaceId===c?new Set(W.releases.map(({id:e})=>e)):z,[W,c]),K=W._tag===`ready`&&W.workspaceId===c,q=T(c,G,(0,O.useMemo)(()=>({owner:`all`,query:R?N:``,service:`all`,status:`all`,type:`all`}),[N,R]),W._tag===`ready`?W.releases.map(({id:e})=>e).join(`:`):`command-search`,g&&R&&K?t:null,l.invalidateSession,a),J=q.state._tag===`ready`&&!q.state.refreshing,Y=K&&J?U(W.releases,q.state.items,N):[],X=Y.length>0,Z=e=>{_(e),e||(y(``),k(0))};(0,O.useEffect)(()=>{let e=e=>{e.defaultPrevented||V(e.target)||e.key.toLocaleLowerCase(`en-US`)!==`k`||!e.metaKey&&!e.ctrlKey||(e.preventDefault(),_(!0))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[]),(0,O.useEffect)(()=>k(0),[N]);let Q=e=>{if(Z(!1),e._tag===`release`){m(e.release.href,{state:b(c,e.release.id,x(f))});return}let t=e.item;D(f,t.href),m(t.href,{state:w(f.state,c,t.entityId,C(f))})};return(0,I.jsxs)(s.Root,{onOpenChange:Z,open:g,children:[(0,I.jsx)(s.Trigger,{className:F.trigger,size:`compact`,variant:`quiet`,children:`Search ⌘K`}),(0,I.jsxs)(s.Content,{className:F.dialog,description:`Find releases and current work, or continue with Relay.`,initialFocusRef:h,size:`wide`,title:`Go anywhere.`,children:[(0,I.jsxs)(`label`,{className:F.searchField,children:[(0,I.jsx)(`span`,{className:F.visuallyHidden,children:`Search workspace`}),(0,I.jsx)(`input`,{"aria-activedescendant":X?`command-search-option-${S}`:void 0,"aria-autocomplete":`list`,"aria-busy":N!==j||W._tag===`loading`||q.state._tag===`loading`,"aria-controls":X?`command-search-results`:void 0,"aria-expanded":X,"aria-label":`Search workspace`,autoComplete:`off`,maxLength:200,onChange:e=>y(e.currentTarget.value),onKeyDown:e=>{if(Y.length!==0){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;k(e=>(e+t+Y.length)%Y.length);return}if(e.key===`Enter`){e.preventDefault();let t=Y[S];t!==void 0&&Q(t)}}},placeholder:`Release, ticket, PR, page, pipeline…`,ref:h,role:`combobox`,type:`search`,value:v})]}),j.length<L?(0,I.jsxs)(`div`,{className:F.message,children:[(0,I.jsx)(`strong`,{children:`Type two characters.`}),(0,I.jsx)(`span`,{children:`Search releases, tickets, pull requests, docs, pipelines, deployments, and time.`})]}):N!==j||W._tag===`idle`||W._tag===`loading`||q.state._tag===`idle`||q.state._tag===`loading`?(0,I.jsx)(`div`,{className:F.loading,children:`Searching the current workspace…`}):!K||q.state._tag===`failed`?(0,I.jsxs)(`div`,{className:F.message,children:[(0,I.jsx)(`strong`,{children:`Search is unavailable.`}),(0,I.jsx)(`span`,{children:`The release and item indexes were not changed.`}),(0,I.jsx)(`button`,{onClick:()=>{H.retry(),q.retry()},type:`button`,children:`Try again`})]}):Y.length===0?(0,I.jsxs)(`div`,{className:F.message,children:[(0,I.jsxs)(`strong`,{children:[`No release or current item matches “`,N,`”.`]}),(0,I.jsx)(`span`,{children:`Try a release name, version, key, title, or current status.`})]}):(0,I.jsx)(`div`,{"aria-label":`Workspace search results`,className:F.results,id:`command-search-results`,role:`listbox`,children:Y.map((e,t)=>{let n=e._tag===`release`,r=n?e.release.id:e.item.entityId;return(0,I.jsxs)(`button`,{"aria-selected":t===S,className:F.result,id:`command-search-option-${t}`,onClick:()=>Q(e),onMouseEnter:()=>k(t),role:`option`,type:`button`,children:[n?(0,I.jsx)(`span`,{className:F.releaseMark,children:`R`}):(0,I.jsx)(p,{service:e.item.service,size:`compact`}),(0,I.jsxs)(`span`,{className:F.resultCopy,children:[(0,I.jsx)(`span`,{className:F.resultKey,children:n?`${e.release.version} · Release`:e.item.key}),(0,I.jsx)(`strong`,{children:n?e.release.codename:e.item.title}),(0,I.jsx)(`span`,{children:n?e.release.serviceName:B(e.item.kind)})]}),(0,I.jsx)(o,{label:n?e.release.status:e.item.status,size:`compact`,tone:n?e.release.tone:e.item.tone})]},r)})}),(0,I.jsxs)(`footer`,{className:F.footer,children:[(0,I.jsx)(r,{onClick:()=>Z(!1),to:A(c,j),children:`Open item results`}),(0,I.jsx)(r,{onClick:()=>Z(!1),to:d(f.pathname,f.search,f.hash),children:`Ask Relay from here`}),(0,I.jsx)(`span`,{children:`↑↓ choose · Enter open · Esc close`})]})]})]})},G=e=>{let t=u(),n=t.state._tag===`authenticated`||t.state._tag===`storage-unavailable`?t.state.session:null,i=f(t.state);return n!==null&&n.workspaceId!==e.workspaceId?null:i===null?(0,I.jsx)(r,{className:F.pairTrigger,to:`/pair`,children:`Pair to search`}):(0,I.jsx)(W,{...e,sessionKey:i})};export{G as CommandSearch,U as commandSearchResults};
|
|
2
|
+
//# sourceMappingURL=CommandSearch-WwAVDrD9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandSearch-CP_QCbkm.js","names":[],"sources":["../../../src/client/command/commandSearchRoutes.ts","../../../src/client/command/useCommandReleases.ts","../../../src/client/command/CommandSearch.module.css","../../../src/client/command/CommandSearch.tsx"],"sourcesContent":["import type { EntityId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { workspaceItemsPath } from \"../releases/releasePaths.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\nconst searchParameters = (query: string): URLSearchParams => {\n const parameters = new URLSearchParams()\n const normalized = query.trim()\n if (normalized.length > 0) parameters.set(\"q\", normalized)\n return parameters\n}\n\n/** Open the workspace Items route with the exact command-search text. */\nexport const commandSearchItemsHref = (workspaceId: WorkspaceId, query: string): string => {\n const parameters = searchParameters(query)\n const search = parameters.size === 0 ? \"\" : `?${parameters.toString()}`\n return `${workspaceItemsPath(workspaceId)}${search}#results`\n}\n\n/** Open one command-search result without inventing a release membership. */\nexport const commandSearchItemHref = (\n workspaceId: WorkspaceId,\n entityId: EntityId\n): string => workspaceEntityPath(workspaceId, entityId)\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { PortfolioSnapshot } from \"../../api/portfolio.js\"\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { presentPortfolio } from \"../portfolio/presentPortfolio.js\"\nimport { releaseFullPath } from \"../releases/releasePaths.js\"\n\nexport type CommandReleasePresentation = {\n readonly codename: string\n readonly href: string\n readonly id: ReleaseId\n readonly serviceName: string\n readonly status: string\n readonly tone: \"caution\" | \"critical\" | \"neutral\" | \"positive\" | \"progress\"\n readonly version: string\n}\n\nexport type CommandReleasesState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\"; readonly sessionKey: string }\n | { readonly _tag: \"failed\"; readonly sessionKey: string }\n | {\n readonly _tag: \"ready\"\n readonly releases: ReadonlyArray<CommandReleasePresentation>\n readonly sessionKey: string\n readonly workspaceId: WorkspaceId\n }\n\nexport type CommandReleasesTransport = {\n readonly load: (signal: AbortSignal) => Promise<PortfolioSnapshot>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for one authenticated, bounded portfolio snapshot. */\nexport const browserCommandReleasesTransport: CommandReleasesTransport = {\n load: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.portfolio.snapshot()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst presentCommandReleases = (snapshot: PortfolioSnapshot): ReadonlyArray<CommandReleasePresentation> =>\n presentPortfolio(snapshot).releases.map((release) => ({\n codename: release.relay.codename,\n href: releaseFullPath(snapshot.workspaceId, release.id),\n id: release.id,\n serviceName: release.serviceName,\n status: release.lifecycleLabel,\n tone: release.lifecycleTone,\n version: release.version\n }))\n\n/** Load one session-isolated release index while the command surface is open. */\nexport const useCommandReleases = (\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: CommandReleasesTransport = browserCommandReleasesTransport\n): { readonly retry: () => void; readonly state: CommandReleasesState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<CommandReleasesState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", sessionKey })\n transport.load(abort.signal).then(\n (snapshot) => {\n if (abort.signal.aborted) return\n setState({\n _tag: \"ready\",\n releases: presentCommandReleases(snapshot),\n sessionKey,\n workspaceId: snapshot.workspaceId\n })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", sessionKey })\n }\n )\n return () => abort.abort()\n }, [onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: CommandReleasesState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n",".trigger,\n.pairTrigger {\n white-space: nowrap;\n}\n\n.pairTrigger {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.dialog {\n gap: var(--rly-space-16);\n}\n\n.searchField {\n display: block;\n}\n\n.searchField input {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: 4.5rem;\n border: 0;\n border-block-end: 1px solid var(--rly-color-border-2);\n outline: 0;\n background: transparent;\n color: var(--rly-color-text-1);\n font: var(--rly-type-section-title-weight) var(--rly-type-section-title-size) /\n var(--rly-type-section-title-line-height) var(--rly-type-section-title-font);\n letter-spacing: var(--rly-type-section-title-tracking);\n}\n\n.searchField input::placeholder {\n color: var(--rly-color-text-3);\n}\n\n.searchField input:focus-visible {\n border-block-end-color: var(--rly-color-focus);\n}\n\n.results {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.result {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--rly-space-12);\n inline-size: 100%;\n min-block-size: 4.5rem;\n padding: var(--rly-space-12);\n border: 1px solid transparent;\n border-radius: var(--rly-radius-control);\n background: transparent;\n color: var(--rly-color-text-1);\n cursor: pointer;\n text-align: start;\n}\n\n.result[aria-selected=\"true\"] {\n border-color: var(--rly-color-border-2);\n background: var(--rly-color-surface-2);\n}\n\n.resultCopy {\n display: grid;\n min-inline-size: 0;\n gap: var(--rly-space-2);\n}\n\n.releaseMark {\n display: grid;\n inline-size: var(--rly-space-32);\n block-size: var(--rly-space-32);\n place-items: center;\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.resultCopy strong {\n overflow: hidden;\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.resultCopy > span:last-child,\n.resultKey {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.message,\n.loading {\n display: grid;\n min-block-size: 10rem;\n place-content: center;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n text-align: center;\n}\n\n.message strong {\n color: var(--rly-color-text-1);\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n}\n\n.message a,\n.message button,\n.footer a {\n color: var(--rly-color-text-1);\n font: inherit;\n text-underline-offset: 0.2em;\n}\n\n.message button {\n border: 0;\n background: transparent;\n cursor: pointer;\n text-decoration: underline;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-16);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n color: var(--rly-color-text-3);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.footer span {\n margin-inline-start: auto;\n}\n\n.visuallyHidden {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n@media (max-width: 40rem) {\n .footer span {\n display: none;\n }\n\n .result {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .result > :last-child {\n grid-column: 2;\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Dialog, StateLabel } from \"@knpkv/rly/primitives\"\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n useDeferredValue,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport type { WorkspaceItemPresentation } from \"../items/presentWorkspaceItems.js\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"../items/workspaceEntityRoutes.js\"\nimport {\n browserWorkspaceItemsTransport,\n useWorkspaceItems,\n type WorkspaceItemsQuery,\n type WorkspaceItemsTransport\n} from \"../items/useWorkspaceItems.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { rememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport { commandSearchItemsHref } from \"./commandSearchRoutes.js\"\nimport {\n browserCommandReleasesTransport,\n type CommandReleasePresentation,\n type CommandReleasesTransport,\n useCommandReleases\n} from \"./useCommandReleases.js\"\nimport styles from \"./CommandSearch.module.css\"\n\nconst MINIMUM_QUERY_LENGTH = 2\nconst RESULT_LIMIT = 6\nconst EMPTY_RELEASE_SCOPE: ReadonlySet<ReleaseId> = new Set()\n\ntype CommandSearchResult =\n | { readonly _tag: \"item\"; readonly item: WorkspaceItemPresentation; readonly rank: number }\n | { readonly _tag: \"release\"; readonly rank: number; readonly release: CommandReleasePresentation }\n\nconst kindLabel = (kind: WorkspaceItemPresentation[\"kind\"]): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nconst isEditingTarget = (target: EventTarget | null): boolean => {\n if (target === null) return false\n if (\"isContentEditable\" in target && target.isContentEditable === true) return true\n if (!(\"nodeName\" in target) || typeof target.nodeName !== \"string\") return false\n return target.nodeName === \"INPUT\" || target.nodeName === \"SELECT\" || target.nodeName === \"TEXTAREA\"\n}\n\nconst matchRank = (query: string, values: ReadonlyArray<string>): number => {\n const normalizedValues = values.map((value) => value.toLocaleLowerCase(\"en-US\"))\n if (normalizedValues.some((value) => value === query)) return 0\n if (normalizedValues.some((value) => value.startsWith(query))) return 1\n return normalizedValues.some((value) => value.includes(query)) ? 2 : 3\n}\n\n/** Combine bounded release and service-entity results with deterministic exact/prefix/contains ranking. */\nexport const commandSearchResults = (\n releases: ReadonlyArray<CommandReleasePresentation>,\n items: ReadonlyArray<WorkspaceItemPresentation>,\n query: string\n): ReadonlyArray<CommandSearchResult> => {\n const normalizedQuery = query.trim().toLocaleLowerCase(\"en-US\")\n if (normalizedQuery.length === 0) return []\n const releaseResults: ReadonlyArray<CommandSearchResult> = releases.flatMap((release) => {\n const rank = matchRank(normalizedQuery, [release.codename, release.version, release.serviceName, release.status])\n return rank === 3 ? [] : [{ _tag: \"release\", rank, release }]\n })\n const itemResults: ReadonlyArray<CommandSearchResult> = items.flatMap((item) => {\n const rank = matchRank(normalizedQuery, [item.key, item.title, item.status])\n return rank === 3 ? [] : [{ _tag: \"item\", item, rank }]\n })\n return [...releaseResults, ...itemResults]\n .sort((left, right) => {\n if (left.rank !== right.rank) return left.rank - right.rank\n if (left._tag !== right._tag) return left._tag === \"release\" ? -1 : 1\n const leftLabel = left._tag === \"release\" ? left.release.codename : left.item.key\n const rightLabel = right._tag === \"release\" ? right.release.codename : right.item.key\n return leftLabel.localeCompare(rightLabel)\n })\n .slice(0, RESULT_LIMIT)\n}\n\nexport type CommandSearchProps = {\n readonly releaseTransport?: CommandReleasesTransport\n readonly transport?: WorkspaceItemsTransport\n readonly workspaceId: WorkspaceId\n}\n\ntype CommandSearchSurfaceProps = CommandSearchProps & { readonly sessionKey: string }\n\nconst CommandSearchSurface = ({\n releaseTransport = browserCommandReleasesTransport,\n sessionKey,\n transport = browserWorkspaceItemsTransport,\n workspaceId\n}: CommandSearchSurfaceProps): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const inputRef = useRef<HTMLInputElement>(null)\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const normalizedQuery = query.trim()\n const deferredQuery = useDeferredValue(normalizedQuery)\n const queryReady = deferredQuery.length >= MINIMUM_QUERY_LENGTH\n const releases = useCommandReleases(open ? sessionKey : null, browserSession.invalidateSession, releaseTransport)\n const releaseState = releases.state\n const releaseScope = useMemo(\n () =>\n releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n ? new Set(releaseState.releases.map(({ id }) => id))\n : EMPTY_RELEASE_SCOPE,\n [releaseState, workspaceId]\n )\n const releasesReady = releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n const filters = useMemo<WorkspaceItemsQuery>(\n () => ({ owner: \"all\", query: queryReady ? deferredQuery : \"\", service: \"all\", status: \"all\", type: \"all\" }),\n [deferredQuery, queryReady]\n )\n const items = useWorkspaceItems(\n workspaceId,\n releaseScope,\n filters,\n releaseState._tag === \"ready\" ? releaseState.releases.map(({ id }) => id).join(\":\") : \"command-search\",\n open && queryReady && releasesReady ? sessionKey : null,\n browserSession.invalidateSession,\n transport\n )\n const itemsReady = items.state._tag === \"ready\" && !items.state.refreshing\n const results =\n releasesReady && itemsReady ? commandSearchResults(releaseState.releases, items.state.items, deferredQuery) : []\n const showListbox = results.length > 0\n\n const changeOpen = (nextOpen: boolean): void => {\n setOpen(nextOpen)\n if (!nextOpen) {\n setQuery(\"\")\n setHighlightedIndex(0)\n }\n }\n\n useEffect(() => {\n const openFromKeyboard = (event: KeyboardEvent): void => {\n if (\n event.defaultPrevented ||\n isEditingTarget(event.target) ||\n event.key.toLocaleLowerCase(\"en-US\") !== \"k\" ||\n (!event.metaKey && !event.ctrlKey)\n )\n return\n event.preventDefault()\n setOpen(true)\n }\n document.addEventListener(\"keydown\", openFromKeyboard)\n return () => document.removeEventListener(\"keydown\", openFromKeyboard)\n }, [])\n\n useEffect(() => setHighlightedIndex(0), [deferredQuery])\n\n const openResult = (result: CommandSearchResult): void => {\n changeOpen(false)\n if (result._tag === \"release\") {\n navigate(result.release.href, {\n state: makeReleaseRouteState(workspaceId, result.release.id, releaseOriginFromLocation(location))\n })\n return\n }\n const item = result.item\n rememberWorkspaceScrollPosition(location, item.href)\n navigate(item.href, {\n state: makeWorkspaceEntityRouteState(\n location.state,\n workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )\n })\n }\n\n const onInputKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>): void => {\n if (results.length === 0) return\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault()\n const delta = event.key === \"ArrowDown\" ? 1 : -1\n setHighlightedIndex((current) => (current + delta + results.length) % results.length)\n return\n }\n if (event.key === \"Enter\") {\n event.preventDefault()\n const selected = results[highlightedIndex]\n if (selected !== undefined) openResult(selected)\n }\n }\n\n const content = (): ReactElement => {\n if (normalizedQuery.length < MINIMUM_QUERY_LENGTH) {\n return (\n <div className={styles.message}>\n <strong>Type two characters.</strong>\n <span>Search releases, tickets, pull requests, docs, pipelines, deployments, and time.</span>\n </div>\n )\n }\n const loading =\n deferredQuery !== normalizedQuery ||\n releaseState._tag === \"idle\" ||\n releaseState._tag === \"loading\" ||\n items.state._tag === \"idle\" ||\n items.state._tag === \"loading\"\n if (loading) return <div className={styles.loading}>Searching the current workspace…</div>\n if (!releasesReady || items.state._tag === \"failed\") {\n return (\n <div className={styles.message}>\n <strong>Search is unavailable.</strong>\n <span>The release and item indexes were not changed.</span>\n <button\n onClick={() => {\n releases.retry()\n items.retry()\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n )\n }\n if (results.length === 0) {\n return (\n <div className={styles.message}>\n <strong>No release or current item matches “{deferredQuery}”.</strong>\n <span>Try a release name, version, key, title, or current status.</span>\n </div>\n )\n }\n return (\n <div aria-label=\"Workspace search results\" className={styles.results} id=\"command-search-results\" role=\"listbox\">\n {results.map((result, index) => {\n const isRelease = result._tag === \"release\"\n const key = isRelease ? result.release.id : result.item.entityId\n return (\n <button\n aria-selected={index === highlightedIndex}\n className={styles.result}\n id={`command-search-option-${index}`}\n key={key}\n onClick={() => openResult(result)}\n onMouseEnter={() => setHighlightedIndex(index)}\n role=\"option\"\n type=\"button\"\n >\n {isRelease ? (\n <span className={styles.releaseMark}>R</span>\n ) : (\n <ServiceMark service={result.item.service} size=\"compact\" />\n )}\n <span className={styles.resultCopy}>\n <span className={styles.resultKey}>\n {isRelease ? `${result.release.version} · Release` : result.item.key}\n </span>\n <strong>{isRelease ? result.release.codename : result.item.title}</strong>\n <span>{isRelease ? result.release.serviceName : kindLabel(result.item.kind)}</span>\n </span>\n <StateLabel\n label={isRelease ? result.release.status : result.item.status}\n size=\"compact\"\n tone={isRelease ? result.release.tone : result.item.tone}\n />\n </button>\n )\n })}\n </div>\n )\n }\n\n return (\n <Dialog.Root onOpenChange={changeOpen} open={open}>\n <Dialog.Trigger className={styles.trigger} size=\"compact\" variant=\"quiet\">\n Search ⌘K\n </Dialog.Trigger>\n <Dialog.Content\n className={styles.dialog}\n description=\"Find releases and current work, or continue with Relay.\"\n initialFocusRef={inputRef}\n size=\"wide\"\n title=\"Go anywhere.\"\n >\n <label className={styles.searchField}>\n <span className={styles.visuallyHidden}>Search workspace</span>\n <input\n aria-activedescendant={showListbox ? `command-search-option-${highlightedIndex}` : undefined}\n aria-autocomplete=\"list\"\n aria-busy={\n deferredQuery !== normalizedQuery || releaseState._tag === \"loading\" || items.state._tag === \"loading\"\n }\n aria-controls={showListbox ? \"command-search-results\" : undefined}\n aria-expanded={showListbox}\n aria-label=\"Search workspace\"\n autoComplete=\"off\"\n maxLength={200}\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={onInputKeyDown}\n placeholder=\"Release, ticket, PR, page, pipeline…\"\n ref={inputRef}\n role=\"combobox\"\n type=\"search\"\n value={query}\n />\n </label>\n {content()}\n <footer className={styles.footer}>\n <Link onClick={() => changeOpen(false)} to={commandSearchItemsHref(workspaceId, normalizedQuery)}>\n Open item results\n </Link>\n <Link\n onClick={() => changeOpen(false)}\n to={contextualAgentPath(location.pathname, location.search, location.hash)}\n >\n Ask Relay from here\n </Link>\n <span>↑↓ choose · Enter open · Esc close</span>\n </footer>\n </Dialog.Content>\n </Dialog.Root>\n )\n}\n\n/** Suppress search when a syntactically valid route does not belong to the readable browser session. */\nexport const CommandSearch = (props: CommandSearchProps): ReactElement | null => {\n const browserSession = useBrowserSession()\n const readableSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const sessionKey = browserReadableSessionKey(browserSession.state)\n if (readableSession !== null && readableSession.workspaceId !== props.workspaceId) return null\n if (sessionKey === null) {\n return (\n <Link className={styles.pairTrigger} to=\"/pair\">\n Pair to search\n </Link>\n )\n }\n return <CommandSearchSurface {...props} sessionKey={sessionKey} />\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CommandSearch-WwAVDrD9.js","names":[],"sources":["../../../src/client/command/commandSearchRoutes.ts","../../../src/client/command/useCommandReleases.ts","../../../src/client/command/CommandSearch.module.css","../../../src/client/command/CommandSearch.tsx"],"sourcesContent":["import type { EntityId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { workspaceItemsPath } from \"../releases/releasePaths.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\nconst searchParameters = (query: string): URLSearchParams => {\n const parameters = new URLSearchParams()\n const normalized = query.trim()\n if (normalized.length > 0) parameters.set(\"q\", normalized)\n return parameters\n}\n\n/** Open the workspace Items route with the exact command-search text. */\nexport const commandSearchItemsHref = (workspaceId: WorkspaceId, query: string): string => {\n const parameters = searchParameters(query)\n const search = parameters.size === 0 ? \"\" : `?${parameters.toString()}`\n return `${workspaceItemsPath(workspaceId)}${search}#results`\n}\n\n/** Open one command-search result without inventing a release membership. */\nexport const commandSearchItemHref = (\n workspaceId: WorkspaceId,\n entityId: EntityId\n): string => workspaceEntityPath(workspaceId, entityId)\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { PortfolioSnapshot } from \"../../api/portfolio.js\"\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { presentPortfolio } from \"../portfolio/presentPortfolio.js\"\nimport { releaseFullPath } from \"../releases/releasePaths.js\"\n\nexport type CommandReleasePresentation = {\n readonly codename: string\n readonly href: string\n readonly id: ReleaseId\n readonly serviceName: string\n readonly status: string\n readonly tone: \"caution\" | \"critical\" | \"neutral\" | \"positive\" | \"progress\"\n readonly version: string\n}\n\nexport type CommandReleasesState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\"; readonly sessionKey: string }\n | { readonly _tag: \"failed\"; readonly sessionKey: string }\n | {\n readonly _tag: \"ready\"\n readonly releases: ReadonlyArray<CommandReleasePresentation>\n readonly sessionKey: string\n readonly workspaceId: WorkspaceId\n }\n\nexport type CommandReleasesTransport = {\n readonly load: (signal: AbortSignal) => Promise<PortfolioSnapshot>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for one authenticated, bounded portfolio snapshot. */\nexport const browserCommandReleasesTransport: CommandReleasesTransport = {\n load: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.portfolio.snapshot()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst presentCommandReleases = (snapshot: PortfolioSnapshot): ReadonlyArray<CommandReleasePresentation> =>\n presentPortfolio(snapshot).releases.map((release) => ({\n codename: release.relay.codename,\n href: releaseFullPath(snapshot.workspaceId, release.id),\n id: release.id,\n serviceName: release.serviceName,\n status: release.lifecycleLabel,\n tone: release.lifecycleTone,\n version: release.version\n }))\n\n/** Load one session-isolated release index while the command surface is open. */\nexport const useCommandReleases = (\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: CommandReleasesTransport = browserCommandReleasesTransport\n): { readonly retry: () => void; readonly state: CommandReleasesState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<CommandReleasesState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", sessionKey })\n transport.load(abort.signal).then(\n (snapshot) => {\n if (abort.signal.aborted) return\n setState({\n _tag: \"ready\",\n releases: presentCommandReleases(snapshot),\n sessionKey,\n workspaceId: snapshot.workspaceId\n })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", sessionKey })\n }\n )\n return () => abort.abort()\n }, [onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: CommandReleasesState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n",".trigger,\n.pairTrigger {\n white-space: nowrap;\n}\n\n.pairTrigger {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.dialog {\n gap: var(--rly-space-16);\n}\n\n.searchField {\n display: block;\n}\n\n.searchField input {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: 4.5rem;\n border: 0;\n border-block-end: 1px solid var(--rly-color-border-2);\n outline: 0;\n background: transparent;\n color: var(--rly-color-text-1);\n font: var(--rly-type-section-title-weight) var(--rly-type-section-title-size) /\n var(--rly-type-section-title-line-height) var(--rly-type-section-title-font);\n letter-spacing: var(--rly-type-section-title-tracking);\n}\n\n.searchField input::placeholder {\n color: var(--rly-color-text-3);\n}\n\n.searchField input:focus-visible {\n border-block-end-color: var(--rly-color-focus);\n}\n\n.results {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.result {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--rly-space-12);\n inline-size: 100%;\n min-block-size: 4.5rem;\n padding: var(--rly-space-12);\n border: 1px solid transparent;\n border-radius: var(--rly-radius-control);\n background: transparent;\n color: var(--rly-color-text-1);\n cursor: pointer;\n text-align: start;\n}\n\n.result[aria-selected=\"true\"] {\n border-color: var(--rly-color-border-2);\n background: var(--rly-color-surface-2);\n}\n\n.resultCopy {\n display: grid;\n min-inline-size: 0;\n gap: var(--rly-space-2);\n}\n\n.releaseMark {\n display: grid;\n inline-size: var(--rly-space-32);\n block-size: var(--rly-space-32);\n place-items: center;\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.resultCopy strong {\n overflow: hidden;\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.resultCopy > span:last-child,\n.resultKey {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.message,\n.loading {\n display: grid;\n min-block-size: 10rem;\n place-content: center;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n text-align: center;\n}\n\n.message strong {\n color: var(--rly-color-text-1);\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n}\n\n.message a,\n.message button,\n.footer a {\n color: var(--rly-color-text-1);\n font: inherit;\n text-underline-offset: 0.2em;\n}\n\n.message button {\n border: 0;\n background: transparent;\n cursor: pointer;\n text-decoration: underline;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-16);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n color: var(--rly-color-text-3);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.footer span {\n margin-inline-start: auto;\n}\n\n.visuallyHidden {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n@media (max-width: 40rem) {\n .footer span {\n display: none;\n }\n\n .result {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .result > :last-child {\n grid-column: 2;\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Dialog, StateLabel } from \"@knpkv/rly/primitives\"\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n useDeferredValue,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport type { WorkspaceItemPresentation } from \"../items/presentWorkspaceItems.js\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"../items/workspaceEntityRoutes.js\"\nimport {\n browserWorkspaceItemsTransport,\n useWorkspaceItems,\n type WorkspaceItemsQuery,\n type WorkspaceItemsTransport\n} from \"../items/useWorkspaceItems.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { rememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport { commandSearchItemsHref } from \"./commandSearchRoutes.js\"\nimport {\n browserCommandReleasesTransport,\n type CommandReleasePresentation,\n type CommandReleasesTransport,\n useCommandReleases\n} from \"./useCommandReleases.js\"\nimport styles from \"./CommandSearch.module.css\"\n\nconst MINIMUM_QUERY_LENGTH = 2\nconst RESULT_LIMIT = 6\nconst EMPTY_RELEASE_SCOPE: ReadonlySet<ReleaseId> = new Set()\n\ntype CommandSearchResult =\n | { readonly _tag: \"item\"; readonly item: WorkspaceItemPresentation; readonly rank: number }\n | { readonly _tag: \"release\"; readonly rank: number; readonly release: CommandReleasePresentation }\n\nconst kindLabel = (kind: WorkspaceItemPresentation[\"kind\"]): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nconst isEditingTarget = (target: EventTarget | null): boolean => {\n if (target === null) return false\n if (\"isContentEditable\" in target && target.isContentEditable === true) return true\n if (!(\"nodeName\" in target) || typeof target.nodeName !== \"string\") return false\n return target.nodeName === \"INPUT\" || target.nodeName === \"SELECT\" || target.nodeName === \"TEXTAREA\"\n}\n\nconst matchRank = (query: string, values: ReadonlyArray<string>): number => {\n const normalizedValues = values.map((value) => value.toLocaleLowerCase(\"en-US\"))\n if (normalizedValues.some((value) => value === query)) return 0\n if (normalizedValues.some((value) => value.startsWith(query))) return 1\n return normalizedValues.some((value) => value.includes(query)) ? 2 : 3\n}\n\n/** Combine bounded release and service-entity results with deterministic exact/prefix/contains ranking. */\nexport const commandSearchResults = (\n releases: ReadonlyArray<CommandReleasePresentation>,\n items: ReadonlyArray<WorkspaceItemPresentation>,\n query: string\n): ReadonlyArray<CommandSearchResult> => {\n const normalizedQuery = query.trim().toLocaleLowerCase(\"en-US\")\n if (normalizedQuery.length === 0) return []\n const releaseResults: ReadonlyArray<CommandSearchResult> = releases.flatMap((release) => {\n const rank = matchRank(normalizedQuery, [release.codename, release.version, release.serviceName, release.status])\n return rank === 3 ? [] : [{ _tag: \"release\", rank, release }]\n })\n const itemResults: ReadonlyArray<CommandSearchResult> = items.flatMap((item) => {\n const rank = matchRank(normalizedQuery, [item.key, item.title, item.status])\n return rank === 3 ? [] : [{ _tag: \"item\", item, rank }]\n })\n return [...releaseResults, ...itemResults]\n .sort((left, right) => {\n if (left.rank !== right.rank) return left.rank - right.rank\n if (left._tag !== right._tag) return left._tag === \"release\" ? -1 : 1\n const leftLabel = left._tag === \"release\" ? left.release.codename : left.item.key\n const rightLabel = right._tag === \"release\" ? right.release.codename : right.item.key\n return leftLabel.localeCompare(rightLabel)\n })\n .slice(0, RESULT_LIMIT)\n}\n\nexport type CommandSearchProps = {\n readonly releaseTransport?: CommandReleasesTransport\n readonly transport?: WorkspaceItemsTransport\n readonly workspaceId: WorkspaceId\n}\n\ntype CommandSearchSurfaceProps = CommandSearchProps & { readonly sessionKey: string }\n\nconst CommandSearchSurface = ({\n releaseTransport = browserCommandReleasesTransport,\n sessionKey,\n transport = browserWorkspaceItemsTransport,\n workspaceId\n}: CommandSearchSurfaceProps): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const inputRef = useRef<HTMLInputElement>(null)\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const normalizedQuery = query.trim()\n const deferredQuery = useDeferredValue(normalizedQuery)\n const queryReady = deferredQuery.length >= MINIMUM_QUERY_LENGTH\n const releases = useCommandReleases(open ? sessionKey : null, browserSession.invalidateSession, releaseTransport)\n const releaseState = releases.state\n const releaseScope = useMemo(\n () =>\n releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n ? new Set(releaseState.releases.map(({ id }) => id))\n : EMPTY_RELEASE_SCOPE,\n [releaseState, workspaceId]\n )\n const releasesReady = releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n const filters = useMemo<WorkspaceItemsQuery>(\n () => ({ owner: \"all\", query: queryReady ? deferredQuery : \"\", service: \"all\", status: \"all\", type: \"all\" }),\n [deferredQuery, queryReady]\n )\n const items = useWorkspaceItems(\n workspaceId,\n releaseScope,\n filters,\n releaseState._tag === \"ready\" ? releaseState.releases.map(({ id }) => id).join(\":\") : \"command-search\",\n open && queryReady && releasesReady ? sessionKey : null,\n browserSession.invalidateSession,\n transport\n )\n const itemsReady = items.state._tag === \"ready\" && !items.state.refreshing\n const results =\n releasesReady && itemsReady ? commandSearchResults(releaseState.releases, items.state.items, deferredQuery) : []\n const showListbox = results.length > 0\n\n const changeOpen = (nextOpen: boolean): void => {\n setOpen(nextOpen)\n if (!nextOpen) {\n setQuery(\"\")\n setHighlightedIndex(0)\n }\n }\n\n useEffect(() => {\n const openFromKeyboard = (event: KeyboardEvent): void => {\n if (\n event.defaultPrevented ||\n isEditingTarget(event.target) ||\n event.key.toLocaleLowerCase(\"en-US\") !== \"k\" ||\n (!event.metaKey && !event.ctrlKey)\n )\n return\n event.preventDefault()\n setOpen(true)\n }\n document.addEventListener(\"keydown\", openFromKeyboard)\n return () => document.removeEventListener(\"keydown\", openFromKeyboard)\n }, [])\n\n useEffect(() => setHighlightedIndex(0), [deferredQuery])\n\n const openResult = (result: CommandSearchResult): void => {\n changeOpen(false)\n if (result._tag === \"release\") {\n navigate(result.release.href, {\n state: makeReleaseRouteState(workspaceId, result.release.id, releaseOriginFromLocation(location))\n })\n return\n }\n const item = result.item\n rememberWorkspaceScrollPosition(location, item.href)\n navigate(item.href, {\n state: makeWorkspaceEntityRouteState(\n location.state,\n workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )\n })\n }\n\n const onInputKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>): void => {\n if (results.length === 0) return\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault()\n const delta = event.key === \"ArrowDown\" ? 1 : -1\n setHighlightedIndex((current) => (current + delta + results.length) % results.length)\n return\n }\n if (event.key === \"Enter\") {\n event.preventDefault()\n const selected = results[highlightedIndex]\n if (selected !== undefined) openResult(selected)\n }\n }\n\n const content = (): ReactElement => {\n if (normalizedQuery.length < MINIMUM_QUERY_LENGTH) {\n return (\n <div className={styles.message}>\n <strong>Type two characters.</strong>\n <span>Search releases, tickets, pull requests, docs, pipelines, deployments, and time.</span>\n </div>\n )\n }\n const loading =\n deferredQuery !== normalizedQuery ||\n releaseState._tag === \"idle\" ||\n releaseState._tag === \"loading\" ||\n items.state._tag === \"idle\" ||\n items.state._tag === \"loading\"\n if (loading) return <div className={styles.loading}>Searching the current workspace…</div>\n if (!releasesReady || items.state._tag === \"failed\") {\n return (\n <div className={styles.message}>\n <strong>Search is unavailable.</strong>\n <span>The release and item indexes were not changed.</span>\n <button\n onClick={() => {\n releases.retry()\n items.retry()\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n )\n }\n if (results.length === 0) {\n return (\n <div className={styles.message}>\n <strong>No release or current item matches “{deferredQuery}”.</strong>\n <span>Try a release name, version, key, title, or current status.</span>\n </div>\n )\n }\n return (\n <div aria-label=\"Workspace search results\" className={styles.results} id=\"command-search-results\" role=\"listbox\">\n {results.map((result, index) => {\n const isRelease = result._tag === \"release\"\n const key = isRelease ? result.release.id : result.item.entityId\n return (\n <button\n aria-selected={index === highlightedIndex}\n className={styles.result}\n id={`command-search-option-${index}`}\n key={key}\n onClick={() => openResult(result)}\n onMouseEnter={() => setHighlightedIndex(index)}\n role=\"option\"\n type=\"button\"\n >\n {isRelease ? (\n <span className={styles.releaseMark}>R</span>\n ) : (\n <ServiceMark service={result.item.service} size=\"compact\" />\n )}\n <span className={styles.resultCopy}>\n <span className={styles.resultKey}>\n {isRelease ? `${result.release.version} · Release` : result.item.key}\n </span>\n <strong>{isRelease ? result.release.codename : result.item.title}</strong>\n <span>{isRelease ? result.release.serviceName : kindLabel(result.item.kind)}</span>\n </span>\n <StateLabel\n label={isRelease ? result.release.status : result.item.status}\n size=\"compact\"\n tone={isRelease ? result.release.tone : result.item.tone}\n />\n </button>\n )\n })}\n </div>\n )\n }\n\n return (\n <Dialog.Root onOpenChange={changeOpen} open={open}>\n <Dialog.Trigger className={styles.trigger} size=\"compact\" variant=\"quiet\">\n Search ⌘K\n </Dialog.Trigger>\n <Dialog.Content\n className={styles.dialog}\n description=\"Find releases and current work, or continue with Relay.\"\n initialFocusRef={inputRef}\n size=\"wide\"\n title=\"Go anywhere.\"\n >\n <label className={styles.searchField}>\n <span className={styles.visuallyHidden}>Search workspace</span>\n <input\n aria-activedescendant={showListbox ? `command-search-option-${highlightedIndex}` : undefined}\n aria-autocomplete=\"list\"\n aria-busy={\n deferredQuery !== normalizedQuery || releaseState._tag === \"loading\" || items.state._tag === \"loading\"\n }\n aria-controls={showListbox ? \"command-search-results\" : undefined}\n aria-expanded={showListbox}\n aria-label=\"Search workspace\"\n autoComplete=\"off\"\n maxLength={200}\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={onInputKeyDown}\n placeholder=\"Release, ticket, PR, page, pipeline…\"\n ref={inputRef}\n role=\"combobox\"\n type=\"search\"\n value={query}\n />\n </label>\n {content()}\n <footer className={styles.footer}>\n <Link onClick={() => changeOpen(false)} to={commandSearchItemsHref(workspaceId, normalizedQuery)}>\n Open item results\n </Link>\n <Link\n onClick={() => changeOpen(false)}\n to={contextualAgentPath(location.pathname, location.search, location.hash)}\n >\n Ask Relay from here\n </Link>\n <span>↑↓ choose · Enter open · Esc close</span>\n </footer>\n </Dialog.Content>\n </Dialog.Root>\n )\n}\n\n/** Suppress search when a syntactically valid route does not belong to the readable browser session. */\nexport const CommandSearch = (props: CommandSearchProps): ReactElement | null => {\n const browserSession = useBrowserSession()\n const readableSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const sessionKey = browserReadableSessionKey(browserSession.state)\n if (readableSession !== null && readableSession.workspaceId !== props.workspaceId) return null\n if (sessionKey === null) {\n return (\n <Link className={styles.pairTrigger} to=\"/pair\">\n Pair to search\n </Link>\n )\n }\n return <CommandSearchSurface {...props} sessionKey={sessionKey} />\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{a as n,f as r,p as i,t as a,u as o}from"./lib-BzlsKFNV.js";import{t as s}from"./jsx-runtime-By8HlURe.js";import{a as c,n as l,r as u,t as d}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{d as f}from"./index-C7_FDTU7.js";import{g as p,v as m}from"./patterns-5N-j-AD2-B9qgekXA.js";import{n as h,r as g}from"./primitives-nKxQGSsE-CJNmac__.js";import{Ir as _,Yn as v,pa as y,tn as b}from"./agent-api-CeONl_8w.js";import{i as x,o as S}from"./releaseRoutes-t9uCfs5T.js";import{PortfolioOverviewView as C}from"./PortfolioOverview-CEI4gpXi.js";import{n as w,r as T}from"./workspaceEntityRoutes-2TejMrzb.js";import{a as E}from"./presentWorkspaceItems-DboAfwGc.js";import{n as ee,t as te}from"./useWorkspaceItems-B1X-JNwq.js";import{n as ne,t as re}from"./workspaceScrollCapture-BsjcWVsk.js";import{t as D}from"./authorizedShareTransport-cxBoQzQ2.js";import{n as ie}from"./ReleaseWorkset-BluAe7Sq.js";var O=e(t(),1),k={page:`_page_wg828_1`,hero:`_hero_wg828_2`,filters:`_filters_wg828_3`,items:`_items_wg828_4`,item:`_item_wg828_4`,itemLink:`_itemLink_wg828_6`,meta:`_meta_wg828_7`,selection:`_selection_wg828_8`,membershipChoices:`_membershipChoices_wg828_54`,shareLink:`_shareLink_wg828_55`,resultHeading:`_resultHeading_wg828_60`,selectionHeader:`_selectionHeader_wg828_80`,selectionActions:`_selectionActions_wg828_81`,owners:`_owners_wg828_153`,ownerGroup:`_ownerGroup_wg828_157`,ownerLimit:`_ownerLimit_wg828_163`,shareForm:`_shareForm_wg828_181`,shareResult:`_shareResult_wg828_182`,search:`_search_wg828_242`},A=s(),j=e=>e===`hour`||e===`week`?e:`day`,M=(e,t)=>{let n=new Map;n.set(e,{displayName:`You`,personId:e});for(let e of t)n.set(e.personId,{displayName:e.displayName,personId:e.personId});return[...n.values()]},N=({currentPersonId:e,entityId:t,grantees:n,transport:r=D,workspaceId:i})=>{let o=(0,O.useMemo)(()=>M(e,n),[e,n]),[s,c]=(0,O.useState)(o[0]?.personId??e),[l,f]=(0,O.useState)(`day`),[p,m]=(0,O.useState)({_tag:`idle`}),h=(0,O.useRef)(null),v=(0,O.useRef)(null),y=(0,O.useRef)(null);(0,O.useEffect)(()=>()=>v.current?.abort(),[]),(0,O.useEffect)(()=>{(p._tag===`ready`||p._tag===`revoked`)&&y.current?.focus()},[p._tag]);let x=e=>{e.preventDefault(),v.current?.abort();let n=new AbortController;v.current=n,m({_tag:`creating`});let i=h.current;(i!==null&&i.entityId===t&&i.granteePersonId===s&&i.lifetime===l?Promise.resolve(i):r.prepareCreate({entityId:t,granteePersonId:s,lifetime:l}).then(e=>(h.current=e,e))).then(e=>r.create(e,n.signal)).then(e=>{if(n.signal.aborted)return;let t=h.current;if(t===null||e.shareId!==t.shareId||e.entityId!==t.entityId||e.granteePersonId!==t.granteePersonId){m({_tag:`failed`});return}if(e.revokedAt!==null){m({_tag:`revoked`});return}m({_tag:`ready`,shareId:e.shareId,expiresAt:_(e.expiresAt)})},()=>{n.signal.aborted||m({_tag:`failed`})})},S=(e,t)=>{v.current?.abort();let n=new AbortController;v.current=n,m({_tag:`revoking`,shareId:e,expiresAt:t}),r.revoke(i,e,n.signal).then(()=>{n.signal.aborted||m({_tag:`revoked`})},()=>{n.signal.aborted||m({_tag:`ready`,shareId:e,expiresAt:t})})},C=e=>{h.current=null,c(b.make(e))},w=e=>{h.current=null,f(j(e))},T=()=>{h.current=null,m({_tag:`idle`})};if(p._tag===`ready`||p._tag===`revoking`){let e=`/shares/${i}/${p.shareId}`;return(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:y,role:`status`,tabIndex:-1,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(g,{as:`h3`,variant:`body-large`,children:`Authorized link ready`}),(0,A.jsxs)(g,{tone:`secondary`,children:[`Only the selected person can open this exact item. Expires `,p.expiresAt,`.`]})]}),(0,A.jsx)(a,{to:e,children:e}),(0,A.jsx)(d,{disabled:p._tag===`revoking`,onClick:()=>S(p.shareId,p.expiresAt),children:p._tag===`revoking`?`Revoking…`:`Revoke link`})]})}return p._tag===`revoked`?(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:y,role:`status`,tabIndex:-1,children:[(0,A.jsx)(u,{label:`Revoked`,size:`compact`,tone:`neutral`}),(0,A.jsx)(g,{tone:`secondary`,children:`This link no longer resolves.`}),(0,A.jsx)(d,{onClick:T,children:`Create another`})]}):(0,A.jsxs)(`form`,{className:k.shareForm,onSubmit:x,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(g,{as:`h3`,variant:`body-large`,children:`Share this exact item`}),(0,A.jsx)(g,{tone:`secondary`,children:`Authenticated access only. Related releases and relationships stay private.`})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Person`}),(0,A.jsx)(`select`,{disabled:p._tag===`creating`,onChange:e=>C(e.currentTarget.value),value:s,children:o.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId))})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Expires`}),(0,A.jsxs)(`select`,{disabled:p._tag===`creating`,onChange:e=>w(e.currentTarget.value),value:l,children:[(0,A.jsx)(`option`,{value:`hour`,children:`In 1 hour`}),(0,A.jsx)(`option`,{value:`day`,children:`In 1 day`}),(0,A.jsx)(`option`,{value:`week`,children:`In 7 days`})]})]}),(0,A.jsx)(d,{disabled:p._tag===`creating`,type:`submit`,children:p._tag===`creating`?`Creating…`:`Create authorized link`}),p._tag===`failed`?(0,A.jsx)(g,{role:`alert`,tone:`secondary`,children:`Could not create the link. Check the person and try again.`}):null]})},P=[`issue`,`pull-request`,`page`,`pipeline-execution`,`deployment`,`time-entry`],F=[`jira`,`codecommit`,`confluence`,`codepipeline`,`clockify`],I=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),L=e=>I.format(Date.parse(e)),R=(e,t)=>({hash:e.hash,pathname:e.pathname,search:t.size===0?``:`?${t.toString()}`}),z=(e,t,n)=>{let r=new URLSearchParams(t);return r.set(`object`,n),{hash:`#item-details`,pathname:e,search:`?${r.toString()}`}},B=e=>P.find(t=>t===e)??`all`,V=e=>e===`active`||e===`done`||e===`failed`?e:`all`,H=e=>{let t=v(b)(e);return y(t)?t.value:`all`},ae=e=>({owner:H(e.get(`owner`)),query:e.get(`q`)?.trim()??``,service:F.find(t=>t===e.get(`service`))??`all`,status:V(e.get(`status`)),type:B(e.get(`type`))}),U=(e,t)=>{let n=t.query.toLocaleLowerCase(`en-US`);return e.filter(e=>(n.length===0||`${e.key} ${e.title} ${e.status}`.toLocaleLowerCase(`en-US`).includes(n))&&(t.service===`all`||e.service===t.service)&&(t.owner===`all`||e.owners.some(({id:e})=>e===t.owner))&&(t.status===`all`||e.statusGroup===t.status)&&(t.type===`all`||e.kind===t.type))},W=({item:e})=>{let[t,n]=(0,O.useState)(!1);return e.owners.length===0?(0,A.jsx)(`span`,{children:`Unassigned`}):(0,A.jsxs)(`span`,{className:k.ownerGroup,children:[(0,A.jsx)(p,{"aria-label":`${e.key} collaborators${e.ownersTruncated?`, more collaborators not shown`:``}`,className:k.owners,expanded:t,limit:2,onExpandedChange:n,people:e.owners,size:`compact`}),e.ownersTruncated?(0,A.jsx)(`span`,{className:k.ownerLimit,children:`20+ people · More not shown`}):null]})},G=(e,t)=>t===null?null:e.find(e=>e.entityId===t)??null,K=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),q=e=>e.releaseIds.length===0?`This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.`:e.routableReleaseIds.length===0?`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`:e.releaseIds.length===1?`This object is linked to one release and can be opened in its complete delivery context.`:`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} releases. Choose the exact release context to avoid silently substituting another delivery trace.`,J=({shareTransport:e,transport:t=te}={})=>{let s=i(),p=f(),_=o(),v=r(),[y]=n(),b=s.controller.state._tag===`ready`?s.controller.state.portfolio:null,D=(0,O.useMemo)(()=>new Map(b?.releases.map(e=>[e.id,e])??[]),[b]),j=(0,O.useMemo)(()=>new Set(b?.releases.map(({id:e})=>e)??[]),[b]),M=s.controller.state._tag===`ready`?s.controller.state.portfolio.generatedAt:`pending`,I=ie(p.state),B=ae(y),V=ee(s.workspaceId,j,B,M,I,p.invalidateSession,t),H=e=>{v(R(_,e),{replace:!0})},U=(e,t)=>{let n=new URLSearchParams(y);t.length===0||t===`all`?n.delete(e===`query`?`q`:e):n.set(e===`query`?`q`:e,t),H(n)},J=s.controller.state._tag===`ready`?I===null?{_tag:`session`,reason:p.state._tag===`authenticated`?`checking`:p.state._tag}:null:s.controller.state;if(J?._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(c,{height:`8rem`,variant:`block`}),(0,A.jsx)(c,{height:`20rem`,variant:`block`})]});if(J!==null)return(0,A.jsx)(C,{onPreviewRelease:()=>void 0,onRetry:s.controller.onRetry,state:J});if(V.state._tag===`idle`||V.state._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(c,{height:`8rem`,variant:`block`}),(0,A.jsx)(c,{height:`20rem`,variant:`block`})]});if(V.state._tag===`failed`)return(0,A.jsx)(l,{action:(0,A.jsx)(d,{onClick:V.retry,children:`Try again`}),description:`Control Center could not read the normalized delivery index. Saved source facts remain unchanged.`,title:`Items unavailable`,tone:`caution`});let Y=V.state.items,oe=B.owner===`all`||V.state.ownerOptions.some(({personId:e})=>e===B.owner),se=B.owner===`all`?void 0:V.state.items.flatMap(({owners:e})=>e).find(({id:e})=>e===B.owner),X=y.get(`object`),Z=G(V.state.items,X),Q=p.state._tag===`authenticated`&&p.state.session.permission===`workspace-owner`&&p.state.session.actor._tag===`human`?p.state.session.actor.personId:null,$=()=>{let e=new URLSearchParams(y);e.delete(`object`),v({hash:`#results`,pathname:_.pathname,search:e.size===0?``:`?${e.toString()}`},{replace:!0})};return(0,A.jsxs)(`article`,{className:k.page,children:[(0,A.jsxs)(`header`,{className:k.hero,children:[(0,A.jsx)(g,{as:`p`,tone:`secondary`,variant:`label`,children:`Workspace items`}),(0,A.jsx)(g,{as:`h1`,variant:`verdict`,children:`Find release work.`}),(0,A.jsx)(g,{tone:`secondary`,variant:`body-large`,children:`One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.`})]}),(0,A.jsxs)(`section`,{"aria-label":`Item filters`,className:k.filters,children:[(0,A.jsxs)(`label`,{className:k.search,children:[(0,A.jsx)(`span`,{children:`Search`}),(0,A.jsx)(`input`,{maxLength:200,onChange:e=>U(`query`,e.currentTarget.value),placeholder:`Key, title, or status`,type:`search`,value:B.query})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Service`}),(0,A.jsxs)(`select`,{onChange:e=>U(`service`,e.currentTarget.value),value:B.service,children:[(0,A.jsx)(`option`,{value:`all`,children:`All services`}),F.map(e=>(0,A.jsx)(`option`,{value:e,children:e},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Owner`}),(0,A.jsxs)(`select`,{onChange:e=>U(`owner`,e.currentTarget.value),value:B.owner,children:[(0,A.jsx)(`option`,{value:`all`,children:`Anyone`}),B.owner!==`all`&&!oe?(0,A.jsx)(`option`,{value:B.owner,children:se?.name??`Owner …${B.owner.slice(-6)}`}):null,V.state.ownerOptions.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId)),V.state.ownerOptionsTruncated?(0,A.jsx)(`option`,{disabled:!0,children:`More owners not shown`}):null]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Type`}),(0,A.jsxs)(`select`,{onChange:e=>U(`type`,e.currentTarget.value),value:B.type,children:[(0,A.jsx)(`option`,{value:`all`,children:`All types`}),P.map(e=>(0,A.jsx)(`option`,{value:e,children:K(e)},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Status`}),(0,A.jsxs)(`select`,{onChange:e=>U(`status`,e.currentTarget.value),value:B.status,children:[(0,A.jsx)(`option`,{value:`all`,children:`Any status`}),(0,A.jsx)(`option`,{value:`active`,children:`Active`}),(0,A.jsx)(`option`,{value:`done`,children:`Done`}),(0,A.jsx)(`option`,{value:`failed`,children:`Needs attention`})]})]})]}),X===null?null:Z===null?(0,A.jsx)(`div`,{id:`item-details`,children:(0,A.jsx)(l,{action:(0,A.jsx)(d,{onClick:$,children:`Back to items`}),description:`This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.`,title:`Item unavailable`,tone:`caution`})}):(0,A.jsxs)(h,{as:`section`,className:k.selection,id:`item-details`,padding:`spacious`,tone:`secondary`,children:[(0,A.jsxs)(`div`,{className:k.selectionHeader,children:[(0,A.jsx)(m,{service:Z.service,size:`compact`}),(0,A.jsx)(u,{label:Z.status,size:`compact`,tone:Z.tone})]}),(0,A.jsxs)(g,{as:`p`,tone:`secondary`,variant:`label`,children:[Z.key,` · `,K(Z.kind)]}),(0,A.jsx)(g,{as:`h2`,variant:`section-title`,children:Z.title}),(0,A.jsx)(g,{tone:`secondary`,variant:`body-large`,children:q(Z)}),(0,A.jsx)(W,{item:Z}),Q===null?null:(0,A.jsx)(N,{currentPersonId:Q,entityId:Z.entityId,grantees:V.state.ownerOptions,workspaceId:s.workspaceId,...e===void 0?{}:{transport:e}},Z.entityId),(0,A.jsxs)(`div`,{className:k.selectionActions,children:[(0,A.jsx)(`div`,{className:k.membershipChoices,children:Z.routableReleaseIds.map(e=>{let t=D.get(e);return(0,A.jsxs)(a,{state:x(s.workspaceId,e,S(_)),to:E(s.workspaceId,e,Z.entityId),children:[`Open `,t===void 0?`release ${e.slice(-6)}`:t.relay.codename,t===void 0?null:(0,A.jsx)(`span`,{children:t.version})]},e)})}),(0,A.jsx)(d,{onClick:$,children:`Back to items`})]})]}),(0,A.jsxs)(`div`,{className:k.resultHeading,id:`results`,children:[(0,A.jsxs)(g,{as:`h2`,variant:`section-title`,children:[V.state.matchedCount,` of `,V.state.totalCount,` workspace items`]}),(0,A.jsx)(u,{label:V.state.refreshing?`Updating results`:V.state.truncated?`Bounded workspace result`:`Workspace scope`,size:`compact`,tone:V.state.truncated&&!V.state.refreshing?`caution`:`neutral`})]}),Y.length===0?(0,A.jsx)(l,{action:(0,A.jsx)(d,{onClick:()=>H(new URLSearchParams),children:`Clear filters`}),description:`Try a broader word, owner, service, type, or status. No demo object is substituted.`,title:`No matching items`}):(0,A.jsx)(`div`,{className:k.items,children:Y.map(e=>(0,A.jsxs)(h,{as:`article`,className:k.item,padding:`none`,tone:`secondary`,children:[(0,A.jsx)(m,{service:e.service,size:`compact`}),(0,A.jsxs)(a,{className:k.itemLink,onClick:t=>{ne(t,t.currentTarget.target)&&re(_,e.href)},state:T(_.state,s.workspaceId,e.entityId,w(_)),to:e.href,children:[(0,A.jsx)(`span`,{children:e.key}),(0,A.jsx)(`strong`,{children:e.title})]}),(0,A.jsxs)(`div`,{className:k.meta,children:[(0,A.jsx)(u,{label:e.status,size:`compact`,tone:e.tone}),(0,A.jsx)(`span`,{children:K(e.kind)}),(0,A.jsx)(`span`,{children:e.releaseIds.length===0?`Unlinked`:`${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`}`}),(0,A.jsx)(W,{item:e}),(0,A.jsx)(`time`,{dateTime:e.freshness,title:`Synchronized ${e.freshness}`,children:L(e.freshness)})]}),Q===null?null:(0,A.jsx)(a,{className:k.shareLink,to:z(_.pathname,y,e.entityId),children:`Share`})]},e.entityId))})]})};export{J as ItemsPage,U as filterWorkspaceItems,L as formatItemFreshness,R as itemsLocationWithSearch,G as selectWorkspaceItem,z as unlinkedItemLocation,q as workspaceItemMembershipDescription};
|
|
2
|
+
//# sourceMappingURL=ItemsPage-CKK_KkJ2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemsPage-BGFUkRL2.js","names":[],"sources":["../../../src/client/items/ItemsPage.module.css","../../../src/client/items/AuthorizedSharePanel.tsx","../../../src/client/items/ItemsPage.tsx"],"sourcesContent":[".page,\n.hero,\n.filters,\n.items,\n.item,\n.itemLink,\n.meta,\n.selection {\n display: grid;\n}\n\n.page {\n gap: var(--rly-space-32);\n}\n\n.hero {\n gap: var(--rly-space-8);\n max-inline-size: 52rem;\n}\n\n.hero > * {\n margin: 0;\n}\n\n.filters {\n grid-template-columns: minmax(16rem, 2fr) repeat(4, minmax(9rem, 1fr));\n gap: var(--rly-space-12);\n align-items: end;\n}\n\n.filters label {\n display: grid;\n gap: var(--rly-space-6);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.filters input,\n.filters select {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.filters input:focus-visible,\n.filters select:focus-visible,\n.itemLink:focus-visible,\n.membershipChoices a:focus-visible,\n.shareLink:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.resultHeading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-12);\n}\n\n.resultHeading h2 {\n margin: 0;\n}\n\n.selection {\n gap: var(--rly-space-12);\n scroll-margin-block-start: var(--rly-space-24);\n}\n\n.selection > * {\n margin: 0;\n}\n\n.selectionHeader,\n.selectionActions,\n.membershipChoices {\n display: flex;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.selectionActions {\n justify-content: space-between;\n}\n\n.membershipChoices {\n flex-wrap: wrap;\n}\n\n.membershipChoices a {\n display: grid;\n gap: var(--rly-space-2);\n min-block-size: 3rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.membershipChoices a span {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.items {\n gap: var(--rly-space-8);\n}\n\n.item {\n grid-template-columns: auto minmax(0, 1fr) auto auto;\n align-items: center;\n gap: var(--rly-space-16);\n min-block-size: 5.5rem;\n padding: var(--rly-space-16) var(--rly-space-20);\n}\n\n.itemLink {\n gap: var(--rly-space-2);\n min-inline-size: 0;\n color: inherit;\n text-decoration: none;\n}\n\n.shareLink {\n min-block-size: 2.5rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.itemLink span,\n.meta {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.owners {\n min-inline-size: max-content;\n}\n\n.ownerGroup {\n display: grid;\n gap: var(--rly-space-4);\n min-inline-size: 0;\n}\n\n.ownerLimit {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.itemLink strong {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.meta {\n grid-auto-flow: column;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.shareForm,\n.shareResult {\n display: grid;\n grid-template-columns: minmax(12rem, 1fr) minmax(8rem, auto) minmax(8rem, auto) auto;\n gap: var(--rly-space-12);\n align-items: end;\n padding-block: var(--rly-space-12);\n border-block: 1px solid var(--rly-color-border-2);\n}\n\n.shareForm > div,\n.shareResult > div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.shareForm h3,\n.shareForm p,\n.shareResult h3,\n.shareResult p {\n margin: 0;\n}\n\n.shareForm label {\n display: grid;\n gap: var(--rly-space-6);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.shareForm select {\n min-block-size: 3rem;\n padding-inline: var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.shareForm select:focus-visible,\n.shareResult a:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.shareResult {\n grid-template-columns: minmax(0, 1fr) auto auto;\n}\n\n.shareResult a {\n overflow-wrap: anywhere;\n color: var(--rly-color-text-1);\n}\n\n@media (max-width: 64rem) {\n .filters {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n\n .search {\n grid-column: 1 / -1;\n }\n\n .item {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .meta {\n grid-column: 2;\n grid-auto-flow: row;\n grid-template-columns: repeat(2, minmax(0, max-content));\n }\n\n .shareLink {\n grid-column: 2;\n justify-self: start;\n }\n\n .shareForm,\n .shareResult {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-items: end;\n }\n\n .shareForm > div,\n .shareResult > div {\n grid-column: 1 / -1;\n }\n}\n\n@media (max-width: 40rem) {\n .filters {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .search {\n grid-column: auto;\n }\n\n .meta,\n .shareForm,\n .shareResult {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .shareForm > div,\n .shareResult > div {\n grid-column: auto;\n }\n}\n","import { Button, StateLabel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type FormEvent, type ReactElement, useEffect, useMemo, useRef, useState } from \"react\"\nimport { Link } from \"react-router\"\n\nimport type { WorkspaceEntityOwner } from \"../../api/deliveryGraph.js\"\nimport type { EntityId, ShareId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { PersonId } from \"../../domain/identifiers.js\"\nimport {\n browserAuthorizedShareTransport,\n type AuthorizedShareLifetime,\n type AuthorizedShareTransport,\n type CreateAuthorizedShareTransportInput\n} from \"./authorizedShareTransport.js\"\nimport styles from \"./ItemsPage.module.css\"\n\ninterface ShareGrantee {\n readonly displayName: string\n readonly personId: PersonId\n}\n\ntype AuthorizedSharePanelState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"creating\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"ready\"; readonly shareId: ShareId; readonly expiresAt: string }\n | { readonly _tag: \"revoking\"; readonly shareId: ShareId; readonly expiresAt: string }\n | { readonly _tag: \"revoked\" }\n\nexport interface AuthorizedSharePanelProps {\n readonly currentPersonId: PersonId\n readonly entityId: EntityId\n readonly grantees: ReadonlyArray<WorkspaceEntityOwner>\n readonly transport?: AuthorizedShareTransport\n readonly workspaceId: WorkspaceId\n}\n\nconst shareLifetime = (value: string): AuthorizedShareLifetime => (value === \"hour\" || value === \"week\" ? value : \"day\")\n\nconst shareGrantees = (\n currentPersonId: PersonId,\n grantees: ReadonlyArray<WorkspaceEntityOwner>\n): ReadonlyArray<ShareGrantee> => {\n const byId = new Map<PersonId, ShareGrantee>()\n byId.set(currentPersonId, { displayName: \"You\", personId: currentPersonId })\n for (const grantee of grantees) {\n byId.set(grantee.personId, { displayName: grantee.displayName, personId: grantee.personId })\n }\n return [...byId.values()]\n}\n\n/** Owner-only creation and revocation controls for one exact item share. */\nexport const AuthorizedSharePanel = ({\n currentPersonId,\n entityId,\n grantees,\n transport = browserAuthorizedShareTransport,\n workspaceId\n}: AuthorizedSharePanelProps): ReactElement => {\n const options = useMemo(() => shareGrantees(currentPersonId, grantees), [currentPersonId, grantees])\n const [granteePersonId, setGranteePersonId] = useState<PersonId>(options[0]?.personId ?? currentPersonId)\n const [lifetime, setLifetime] = useState<AuthorizedShareLifetime>(\"day\")\n const [state, setState] = useState<AuthorizedSharePanelState>({ _tag: \"idle\" })\n const createIntent = useRef<CreateAuthorizedShareTransportInput | null>(null)\n const currentRequest = useRef<AbortController | null>(null)\n const statusRegion = useRef<HTMLElement | null>(null)\n\n useEffect(() => () => currentRequest.current?.abort(), [])\n useEffect(() => {\n if (state._tag === \"ready\" || state._tag === \"revoked\") statusRegion.current?.focus()\n }, [state._tag])\n\n const create = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n currentRequest.current?.abort()\n const request = new AbortController()\n currentRequest.current = request\n setState({ _tag: \"creating\" })\n const existingIntent = createIntent.current\n const intent =\n existingIntent !== null &&\n existingIntent.entityId === entityId &&\n existingIntent.granteePersonId === granteePersonId &&\n existingIntent.lifetime === lifetime\n ? Promise.resolve(existingIntent)\n : transport.prepareCreate({ entityId, granteePersonId, lifetime }).then((nextIntent) => {\n createIntent.current = nextIntent\n return nextIntent\n })\n intent\n .then((currentIntent) => transport.create(currentIntent, request.signal))\n .then(\n (share) => {\n if (request.signal.aborted) return\n const currentIntent = createIntent.current\n if (\n currentIntent === null ||\n share.shareId !== currentIntent.shareId ||\n share.entityId !== currentIntent.entityId ||\n share.granteePersonId !== currentIntent.granteePersonId\n ) {\n setState({ _tag: \"failed\" })\n return\n }\n if (share.revokedAt !== null) {\n setState({ _tag: \"revoked\" })\n return\n }\n setState({\n _tag: \"ready\",\n shareId: share.shareId,\n expiresAt: DateTime.formatIso(share.expiresAt)\n })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n }\n )\n }\n\n const revoke = (shareId: ShareId, expiresAt: string): void => {\n currentRequest.current?.abort()\n const request = new AbortController()\n currentRequest.current = request\n setState({ _tag: \"revoking\", shareId, expiresAt })\n transport.revoke(workspaceId, shareId, request.signal).then(\n () => {\n if (!request.signal.aborted) setState({ _tag: \"revoked\" })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"ready\", shareId, expiresAt })\n }\n )\n }\n\n const selectGrantee = (value: string): void => {\n createIntent.current = null\n setGranteePersonId(PersonId.make(value))\n }\n const selectLifetime = (value: string): void => {\n createIntent.current = null\n setLifetime(shareLifetime(value))\n }\n const createAnother = (): void => {\n createIntent.current = null\n setState({ _tag: \"idle\" })\n }\n\n if (state._tag === \"ready\" || state._tag === \"revoking\") {\n const sharePath = `/shares/${workspaceId}/${state.shareId}`\n return (\n <section\n aria-label=\"Authorized share\"\n aria-live=\"polite\"\n className={styles.shareResult}\n ref={statusRegion}\n role=\"status\"\n tabIndex={-1}\n >\n <div>\n <Text as=\"h3\" variant=\"body-large\">\n Authorized link ready\n </Text>\n <Text tone=\"secondary\">Only the selected person can open this exact item. Expires {state.expiresAt}.</Text>\n </div>\n <Link to={sharePath}>{sharePath}</Link>\n <Button disabled={state._tag === \"revoking\"} onClick={() => revoke(state.shareId, state.expiresAt)}>\n {state._tag === \"revoking\" ? \"Revoking…\" : \"Revoke link\"}\n </Button>\n </section>\n )\n }\n\n if (state._tag === \"revoked\") {\n return (\n <section\n aria-label=\"Authorized share\"\n aria-live=\"polite\"\n className={styles.shareResult}\n ref={statusRegion}\n role=\"status\"\n tabIndex={-1}\n >\n <StateLabel label=\"Revoked\" size=\"compact\" tone=\"neutral\" />\n <Text tone=\"secondary\">This link no longer resolves.</Text>\n <Button onClick={createAnother}>Create another</Button>\n </section>\n )\n }\n\n return (\n <form className={styles.shareForm} onSubmit={create}>\n <div>\n <Text as=\"h3\" variant=\"body-large\">\n Share this exact item\n </Text>\n <Text tone=\"secondary\">Authenticated access only. Related releases and relationships stay private.</Text>\n </div>\n <label>\n <span>Person</span>\n <select\n disabled={state._tag === \"creating\"}\n onChange={(event) => selectGrantee(event.currentTarget.value)}\n value={granteePersonId}\n >\n {options.map((option) => (\n <option key={option.personId} value={option.personId}>\n {option.displayName}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Expires</span>\n <select\n disabled={state._tag === \"creating\"}\n onChange={(event) => selectLifetime(event.currentTarget.value)}\n value={lifetime}\n >\n <option value=\"hour\">In 1 hour</option>\n <option value=\"day\">In 1 day</option>\n <option value=\"week\">In 7 days</option>\n </select>\n </label>\n <Button disabled={state._tag === \"creating\"} type=\"submit\">\n {state._tag === \"creating\" ? \"Creating…\" : \"Create authorized link\"}\n </Button>\n {state._tag === \"failed\" ? (\n <Text role=\"alert\" tone=\"secondary\">\n Could not create the link. Check the person and try again.\n </Text>\n ) : null}\n </form>\n )\n}\n","import { PeopleStrip, ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Option from \"effect/Option\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useMemo, useState } from \"react\"\nimport { Link, useLocation, useNavigate, useOutletContext, useSearchParams } from \"react-router\"\n\nimport type { DeliveryEntityKind, DeliveryEntityService } from \"../../domain/deliveryGraph.js\"\nimport { PersonId } from \"../../domain/identifiers.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { PortfolioOverviewView, type PortfolioOverviewState } from \"../portfolio/PortfolioOverview.js\"\nimport type { WorkspaceReleaseOutletContext } from \"../releases/WorkspaceReleaseLayout.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { releaseWorksetSessionKey } from \"../releases/ReleaseWorkset.js\"\nimport { rememberWorkspaceScrollPosition, shouldRememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport {\n type WorkspaceItemPresentation,\n type WorkspaceItemStatus,\n workspaceItemReleaseHref\n} from \"./presentWorkspaceItems.js\"\nimport { browserWorkspaceItemsTransport, useWorkspaceItems, type WorkspaceItemsTransport } from \"./useWorkspaceItems.js\"\nimport { AuthorizedSharePanel } from \"./AuthorizedSharePanel.js\"\nimport type { AuthorizedShareTransport } from \"./authorizedShareTransport.js\"\nimport styles from \"./ItemsPage.module.css\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"./workspaceEntityRoutes.js\"\n\ninterface ItemFilters {\n readonly query: string\n readonly owner: PersonId | \"all\"\n readonly service: DeliveryEntityService | \"all\"\n readonly status: WorkspaceItemStatus | \"all\"\n readonly type: DeliveryEntityKind | \"all\"\n}\n\nexport interface ItemsPageProps {\n readonly shareTransport?: AuthorizedShareTransport\n readonly transport?: WorkspaceItemsTransport\n}\n\nconst entityKinds: ReadonlyArray<DeliveryEntityKind> = [\n \"issue\",\n \"pull-request\",\n \"page\",\n \"pipeline-execution\",\n \"deployment\",\n \"time-entry\"\n]\nconst services: ReadonlyArray<DeliveryEntityService> = [\"jira\", \"codecommit\", \"confluence\", \"codepipeline\", \"clockify\"]\nconst freshnessFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\"\n})\n\nexport const formatItemFreshness = (freshness: string): string => freshnessFormatter.format(Date.parse(freshness))\n\nexport const itemsLocationWithSearch = (\n location: Pick<Location, \"hash\" | \"pathname\">,\n params: URLSearchParams\n): { readonly hash: string; readonly pathname: string; readonly search: string } => ({\n hash: location.hash,\n pathname: location.pathname,\n search: params.size === 0 ? \"\" : `?${params.toString()}`\n})\n\nexport const unlinkedItemLocation = (\n pathname: string,\n params: URLSearchParams,\n entityId: string\n): { readonly hash: string; readonly pathname: string; readonly search: string } => {\n const next = new URLSearchParams(params)\n next.set(\"object\", entityId)\n return {\n hash: \"#item-details\",\n pathname,\n search: `?${next.toString()}`\n }\n}\n\nconst entityKind = (value: string | null): DeliveryEntityKind | \"all\" =>\n entityKinds.find((candidate) => candidate === value) ?? \"all\"\n\nconst itemStatus = (value: string | null): WorkspaceItemStatus | \"all\" =>\n value === \"active\" || value === \"done\" || value === \"failed\" ? value : \"all\"\n\nconst itemOwner = (value: string | null): PersonId | \"all\" => {\n const decoded = Schema.decodeUnknownOption(PersonId)(value)\n return Option.isSome(decoded) ? decoded.value : \"all\"\n}\n\nconst filtersFrom = (params: URLSearchParams): ItemFilters => ({\n owner: itemOwner(params.get(\"owner\")),\n query: params.get(\"q\")?.trim() ?? \"\",\n service: services.find((candidate) => candidate === params.get(\"service\")) ?? \"all\",\n status: itemStatus(params.get(\"status\")),\n type: entityKind(params.get(\"type\"))\n})\n\nexport const filterWorkspaceItems = (\n items: ReadonlyArray<WorkspaceItemPresentation>,\n filters: ItemFilters\n): ReadonlyArray<WorkspaceItemPresentation> => {\n const query = filters.query.toLocaleLowerCase(\"en-US\")\n return items.filter(\n (item) =>\n (query.length === 0 || `${item.key} ${item.title} ${item.status}`.toLocaleLowerCase(\"en-US\").includes(query)) &&\n (filters.service === \"all\" || item.service === filters.service) &&\n (filters.owner === \"all\" || item.owners.some(({ id }) => id === filters.owner)) &&\n (filters.status === \"all\" || item.statusGroup === filters.status) &&\n (filters.type === \"all\" || item.kind === filters.type)\n )\n}\n\nconst ItemOwners = ({ item }: { readonly item: WorkspaceItemPresentation }): ReactElement => {\n const [expanded, setExpanded] = useState(false)\n if (item.owners.length === 0) return <span>Unassigned</span>\n return (\n <span className={styles.ownerGroup}>\n <PeopleStrip\n aria-label={`${item.key} collaborators${item.ownersTruncated ? \", more collaborators not shown\" : \"\"}`}\n className={styles.owners}\n expanded={expanded}\n limit={2}\n onExpandedChange={setExpanded}\n people={item.owners}\n size=\"compact\"\n />\n {item.ownersTruncated ? <span className={styles.ownerLimit}>20+ people · More not shown</span> : null}\n </span>\n )\n}\n\nexport const selectWorkspaceItem = (\n items: ReadonlyArray<WorkspaceItemPresentation>,\n entityId: string | null\n): WorkspaceItemPresentation | null =>\n entityId === null ? null : (items.find((item) => item.entityId === entityId) ?? null)\n\nconst labelForKind = (kind: DeliveryEntityKind): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nexport const workspaceItemMembershipDescription = (item: WorkspaceItemPresentation): string => {\n if (item.releaseIds.length === 0) {\n return \"This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.\"\n }\n if (item.routableReleaseIds.length === 0) {\n return `This object is linked to ${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} release${item.releaseIds.length === 1 ? \"\" : \"s\"} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`\n }\n if (item.releaseIds.length === 1) {\n return \"This object is linked to one release and can be opened in its complete delivery context.\"\n }\n return `This object is linked to ${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} releases. Choose the exact release context to avoid silently substituting another delivery trace.`\n}\n\n/** Compact workspace-wide index of normalized delivery objects. */\nexport const ItemsPage = ({\n shareTransport,\n transport = browserWorkspaceItemsTransport\n}: ItemsPageProps = {}): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const [searchParams] = useSearchParams()\n const portfolio = context.controller.state._tag === \"ready\" ? context.controller.state.portfolio : null\n const releaseById = useMemo(\n () => new Map(portfolio?.releases.map((release) => [release.id, release]) ?? []),\n [portfolio]\n )\n const routableReleaseIds = useMemo(() => new Set(portfolio?.releases.map(({ id }) => id) ?? []), [portfolio])\n const refreshKey =\n context.controller.state._tag === \"ready\" ? context.controller.state.portfolio.generatedAt : \"pending\"\n const sessionKey = releaseWorksetSessionKey(browserSession.state)\n const filters = filtersFrom(searchParams)\n const controller = useWorkspaceItems(\n context.workspaceId,\n routableReleaseIds,\n filters,\n refreshKey,\n sessionKey,\n browserSession.invalidateSession,\n transport\n )\n const replaceSearch = (next: URLSearchParams): void => {\n navigate(itemsLocationWithSearch(location, next), { replace: true })\n }\n const update = (key: keyof ItemFilters, value: string): void => {\n const next = new URLSearchParams(searchParams)\n if (value.length === 0 || value === \"all\") next.delete(key === \"query\" ? \"q\" : key)\n else next.set(key === \"query\" ? \"q\" : key, value)\n replaceSearch(next)\n }\n\n const portfolioBoundary: PortfolioOverviewState | null =\n context.controller.state._tag !== \"ready\"\n ? context.controller.state\n : sessionKey === null\n ? {\n _tag: \"session\",\n reason: browserSession.state._tag === \"authenticated\" ? \"checking\" : browserSession.state._tag\n }\n : null\n if (portfolioBoundary?._tag === \"loading\") {\n return (\n <section aria-label=\"Loading delivery items\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"20rem\" variant=\"block\" />\n </section>\n )\n }\n if (portfolioBoundary !== null) {\n return (\n <PortfolioOverviewView\n onPreviewRelease={() => undefined}\n onRetry={context.controller.onRetry}\n state={portfolioBoundary}\n />\n )\n }\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return (\n <section aria-label=\"Loading delivery items\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"20rem\" variant=\"block\" />\n </section>\n )\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"Control Center could not read the normalized delivery index. Saved source facts remain unchanged.\"\n title=\"Items unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const visibleItems = controller.state.items\n const hasSelectedOwnerOption =\n filters.owner === \"all\" || controller.state.ownerOptions.some(({ personId }) => personId === filters.owner)\n const selectedOwner =\n filters.owner === \"all\"\n ? undefined\n : controller.state.items.flatMap(({ owners }) => owners).find(({ id }) => id === filters.owner)\n const selectedEntityId = searchParams.get(\"object\")\n const selectedItem = selectWorkspaceItem(controller.state.items, selectedEntityId)\n const shareOwnerPersonId =\n browserSession.state._tag === \"authenticated\" &&\n browserSession.state.session.permission === \"workspace-owner\" &&\n browserSession.state.session.actor._tag === \"human\"\n ? browserSession.state.session.actor.personId\n : null\n const clearSelection = (): void => {\n const next = new URLSearchParams(searchParams)\n next.delete(\"object\")\n navigate(\n {\n hash: \"#results\",\n pathname: location.pathname,\n search: next.size === 0 ? \"\" : `?${next.toString()}`\n },\n { replace: true }\n )\n }\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Workspace items\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Find release work.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.\n </Text>\n </header>\n\n <section aria-label=\"Item filters\" className={styles.filters}>\n <label className={styles.search}>\n <span>Search</span>\n <input\n maxLength={200}\n onChange={(event) => update(\"query\", event.currentTarget.value)}\n placeholder=\"Key, title, or status\"\n type=\"search\"\n value={filters.query}\n />\n </label>\n <label>\n <span>Service</span>\n <select onChange={(event) => update(\"service\", event.currentTarget.value)} value={filters.service}>\n <option value=\"all\">All services</option>\n {services.map((service) => (\n <option key={service} value={service}>\n {service}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Owner</span>\n <select onChange={(event) => update(\"owner\", event.currentTarget.value)} value={filters.owner}>\n <option value=\"all\">Anyone</option>\n {filters.owner !== \"all\" && !hasSelectedOwnerOption ? (\n <option value={filters.owner}>{selectedOwner?.name ?? `Owner …${filters.owner.slice(-6)}`}</option>\n ) : null}\n {controller.state.ownerOptions.map((owner) => (\n <option key={owner.personId} value={owner.personId}>\n {owner.displayName}\n </option>\n ))}\n {controller.state.ownerOptionsTruncated ? <option disabled>More owners not shown</option> : null}\n </select>\n </label>\n <label>\n <span>Type</span>\n <select onChange={(event) => update(\"type\", event.currentTarget.value)} value={filters.type}>\n <option value=\"all\">All types</option>\n {entityKinds.map((kind) => (\n <option key={kind} value={kind}>\n {labelForKind(kind)}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Status</span>\n <select onChange={(event) => update(\"status\", event.currentTarget.value)} value={filters.status}>\n <option value=\"all\">Any status</option>\n <option value=\"active\">Active</option>\n <option value=\"done\">Done</option>\n <option value=\"failed\">Needs attention</option>\n </select>\n </label>\n </section>\n\n {selectedEntityId === null ? null : selectedItem === null ? (\n <div id=\"item-details\">\n <StatePanel\n action={<Button onClick={clearSelection}>Back to items</Button>}\n description=\"This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.\"\n title=\"Item unavailable\"\n tone=\"caution\"\n />\n </div>\n ) : (\n <Surface as=\"section\" className={styles.selection} id=\"item-details\" padding=\"spacious\" tone=\"secondary\">\n <div className={styles.selectionHeader}>\n <ServiceMark service={selectedItem.service} size=\"compact\" />\n <StateLabel label={selectedItem.status} size=\"compact\" tone={selectedItem.tone} />\n </div>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n {selectedItem.key} · {labelForKind(selectedItem.kind)}\n </Text>\n <Text as=\"h2\" variant=\"section-title\">\n {selectedItem.title}\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n {workspaceItemMembershipDescription(selectedItem)}\n </Text>\n <ItemOwners item={selectedItem} />\n {shareOwnerPersonId === null ? null : (\n <AuthorizedSharePanel\n key={selectedItem.entityId}\n currentPersonId={shareOwnerPersonId}\n entityId={selectedItem.entityId}\n grantees={controller.state.ownerOptions}\n workspaceId={context.workspaceId}\n {...(shareTransport === undefined ? {} : { transport: shareTransport })}\n />\n )}\n <div className={styles.selectionActions}>\n <div className={styles.membershipChoices}>\n {selectedItem.routableReleaseIds.map((releaseId) => {\n const release = releaseById.get(releaseId)\n return (\n <Link\n key={releaseId}\n state={makeReleaseRouteState(context.workspaceId, releaseId, releaseOriginFromLocation(location))}\n to={workspaceItemReleaseHref(context.workspaceId, releaseId, selectedItem.entityId)}\n >\n Open {release === undefined ? `release ${releaseId.slice(-6)}` : release.relay.codename}\n {release === undefined ? null : <span>{release.version}</span>}\n </Link>\n )\n })}\n </div>\n <Button onClick={clearSelection}>Back to items</Button>\n </div>\n </Surface>\n )}\n\n <div className={styles.resultHeading} id=\"results\">\n <Text as=\"h2\" variant=\"section-title\">\n {controller.state.matchedCount} of {controller.state.totalCount} workspace items\n </Text>\n <StateLabel\n label={\n controller.state.refreshing\n ? \"Updating results\"\n : controller.state.truncated\n ? \"Bounded workspace result\"\n : \"Workspace scope\"\n }\n size=\"compact\"\n tone={controller.state.truncated && !controller.state.refreshing ? \"caution\" : \"neutral\"}\n />\n </div>\n\n {visibleItems.length === 0 ? (\n <StatePanel\n action={<Button onClick={() => replaceSearch(new URLSearchParams())}>Clear filters</Button>}\n description=\"Try a broader word, owner, service, type, or status. No demo object is substituted.\"\n title=\"No matching items\"\n />\n ) : (\n <div className={styles.items}>\n {visibleItems.map((item) => (\n <Surface as=\"article\" className={styles.item} key={item.entityId} padding=\"none\" tone=\"secondary\">\n <ServiceMark service={item.service} size=\"compact\" />\n <Link\n className={styles.itemLink}\n onClick={(event) => {\n if (shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)) {\n rememberWorkspaceScrollPosition(location, item.href)\n }\n }}\n state={makeWorkspaceEntityRouteState(\n location.state,\n context.workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )}\n to={item.href}\n >\n <span>{item.key}</span>\n <strong>{item.title}</strong>\n </Link>\n <div className={styles.meta}>\n <StateLabel label={item.status} size=\"compact\" tone={item.tone} />\n <span>{labelForKind(item.kind)}</span>\n <span>\n {item.releaseIds.length === 0\n ? \"Unlinked\"\n : `${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} release${item.releaseIds.length === 1 ? \"\" : \"s\"}`}\n </span>\n <ItemOwners item={item} />\n <time dateTime={item.freshness} title={`Synchronized ${item.freshness}`}>\n {formatItemFreshness(item.freshness)}\n </time>\n </div>\n {shareOwnerPersonId === null ? null : (\n <Link\n className={styles.shareLink}\n to={unlinkedItemLocation(location.pathname, searchParams, item.entityId)}\n >\n Share\n </Link>\n )}\n </Surface>\n ))}\n </div>\n )}\n </article>\n )\n}\n"],"mappings":"khDCqCM,EAAiB,GAA4C,IAAU,QAAU,IAAU,OAAS,EAAQ,MAE5G,GACJ,EACA,IACgC,CAChC,IAAM,EAAO,IAAI,IACjB,EAAK,IAAI,EAAiB,CAAE,YAAa,MAAO,SAAU,CAAgB,CAAC,EAC3E,IAAK,IAAM,KAAW,EACpB,EAAK,IAAI,EAAQ,SAAU,CAAE,YAAa,EAAQ,YAAa,SAAU,EAAQ,QAAS,CAAC,EAE7F,MAAO,CAAC,GAAG,EAAK,OAAO,CAAC,CAC1B,EAGa,GAAwB,CACnC,kBACA,WACA,WACA,YAAY,EACZ,iBAC6C,CAC7C,IAAM,GAAA,EAAA,EAAA,QAAA,KAAwB,EAAc,EAAiB,CAAQ,EAAG,CAAC,EAAiB,CAAQ,CAAC,EAC7F,CAAC,EAAiB,IAAA,EAAA,EAAA,SAAA,CAAyC,EAAQ,EAAE,EAAE,UAAY,CAAe,EAClG,CAAC,EAAU,IAAA,EAAA,EAAA,SAAA,CAAiD,KAAK,EACjE,CAAC,EAAO,IAAA,EAAA,EAAA,SAAA,CAAgD,CAAE,KAAM,MAAO,CAAC,EACxE,GAAA,EAAA,EAAA,OAAA,CAAkE,IAAI,EACtE,GAAA,EAAA,EAAA,OAAA,CAAgD,IAAI,EACpD,GAAA,EAAA,EAAA,OAAA,CAA0C,IAAI,GAEpD,EAAA,EAAA,UAAA,SAAsB,EAAe,SAAS,MAAM,EAAG,CAAC,CAAC,GACzD,EAAA,EAAA,UAAA,KAAgB,EACV,EAAM,OAAS,SAAW,EAAM,OAAS,YAAW,EAAa,SAAS,MAAM,CACtF,EAAG,CAAC,EAAM,IAAI,CAAC,EAEf,IAAM,EAAU,GAA4C,CAC1D,EAAM,eAAe,EACrB,EAAe,SAAS,MAAM,EAC9B,IAAM,EAAU,IAAI,gBACpB,EAAe,QAAU,EACzB,EAAS,CAAE,KAAM,UAAW,CAAC,EAC7B,IAAM,EAAiB,EAAa,SAElC,IAAmB,MACnB,EAAe,WAAa,GAC5B,EAAe,kBAAoB,GACnC,EAAe,WAAa,EACxB,QAAQ,QAAQ,CAAc,EAC9B,EAAU,cAAc,CAAE,WAAU,kBAAiB,UAAS,CAAC,CAAC,CAAC,KAAM,IACrE,EAAa,QAAU,EAChB,EACR,EAAA,CAEJ,KAAM,GAAkB,EAAU,OAAO,EAAe,EAAQ,MAAM,CAAC,CAAC,CACxE,KACE,GAAU,CACT,GAAI,EAAQ,OAAO,QAAS,OAC5B,IAAM,EAAgB,EAAa,QACnC,GACE,IAAkB,MAClB,EAAM,UAAY,EAAc,SAChC,EAAM,WAAa,EAAc,UACjC,EAAM,kBAAoB,EAAc,gBACxC,CACA,EAAS,CAAE,KAAM,QAAS,CAAC,EAC3B,MACF,CACA,GAAI,EAAM,YAAc,KAAM,CAC5B,EAAS,CAAE,KAAM,SAAU,CAAC,EAC5B,MACF,CACA,EAAS,CACP,KAAM,QACN,QAAS,EAAM,QACf,UAAW,EAAmB,EAAM,SAAS,CAC/C,CAAC,CACH,MACM,CACC,EAAQ,OAAO,SAAS,EAAS,CAAE,KAAM,QAAS,CAAC,CAC1D,CACF,CACJ,EAEM,GAAU,EAAkB,IAA4B,CAC5D,EAAe,SAAS,MAAM,EAC9B,IAAM,EAAU,IAAI,gBACpB,EAAe,QAAU,EACzB,EAAS,CAAE,KAAM,WAAY,UAAS,WAAU,CAAC,EACjD,EAAU,OAAO,EAAa,EAAS,EAAQ,MAAM,CAAC,CAAC,SAC/C,CACC,EAAQ,OAAO,SAAS,EAAS,CAAE,KAAM,SAAU,CAAC,CAC3D,MACM,CACC,EAAQ,OAAO,SAAS,EAAS,CAAE,KAAM,QAAS,UAAS,WAAU,CAAC,CAC7E,CACF,CACF,EAEM,EAAiB,GAAwB,CAC7C,EAAa,QAAU,KACvB,EAAmB,EAAS,KAAK,CAAK,CAAC,CACzC,EACM,EAAkB,GAAwB,CAC9C,EAAa,QAAU,KACvB,EAAY,EAAc,CAAK,CAAC,CAClC,EACM,MAA4B,CAChC,EAAa,QAAU,KACvB,EAAS,CAAE,KAAM,MAAO,CAAC,CAC3B,EAEA,GAAI,EAAM,OAAS,SAAW,EAAM,OAAS,WAAY,CACvD,IAAM,EAAY,WAAW,EAAY,GAAG,EAAM,UAClD,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CACE,aAAW,mBACX,YAAU,SACV,UAAW,EAAO,YAClB,IAAK,EACL,KAAK,SACL,SAAU,YANZ,EAQE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,KAAK,QAAQ,sBAAa,uBAE7B,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,KAAK,qBAAX,CAAuB,8DAA4D,EAAM,UAAU,GAAO,GACvG,CAAA,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,WAAY,CAAgB,CAAA,GACtC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,SAAU,EAAM,OAAS,WAAY,YAAe,EAAO,EAAM,QAAS,EAAM,SAAS,WAC9F,EAAM,OAAS,WAAa,YAAc,aACrC,CAAA,CACD,GAEb,CAmBA,OAjBI,EAAM,OAAS,WAEf,EAAA,EAAA,KAAA,CAAC,UAAD,CACE,aAAW,mBACX,YAAU,SACV,UAAW,EAAO,YAClB,IAAK,EACL,KAAK,SACL,SAAU,YANZ,EAQE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,UAAU,KAAK,UAAU,KAAK,SAAW,CAAA,GAC3D,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,qBAAY,+BAAmC,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,WAAe,gBAAsB,CAAA,CAC/C,KAKX,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAW,SAAU,WAA7C,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,KAAK,QAAQ,sBAAa,uBAE7B,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,qBAAY,6EAAiF,CAAA,CACrG,CAAA,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,QAAY,CAAA,GAClB,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,SAAU,EAAM,OAAS,WACzB,SAAW,GAAU,EAAc,EAAM,cAAc,KAAK,EAC5D,MAAO,WAEN,EAAQ,IAAK,IACZ,EAAA,EAAA,IAAA,CAAC,SAAD,CAA8B,MAAO,EAAO,kBACzC,EAAO,WACF,EAFK,EAAO,QAEZ,CACT,CACK,CAAA,CACH,CAAA,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,SAAa,CAAA,GACnB,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,SAAU,EAAM,OAAS,WACzB,SAAW,GAAU,EAAe,EAAM,cAAc,KAAK,EAC7D,MAAO,WAHT,EAKE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,gBAAO,WAAiB,CAAA,GACtC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,eAAM,UAAgB,CAAA,GACpC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,gBAAO,WAAiB,CAAA,CAChC,GACH,CAAA,CAAA,GACP,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,SAAU,EAAM,OAAS,WAAY,KAAK,kBAC/C,EAAM,OAAS,WAAa,YAAc,wBACrC,CAAA,EACP,EAAM,OAAS,UACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,QAAQ,KAAK,qBAAY,4DAE9B,CAAA,EACJ,IACA,GAEV,ECnMM,EAAiD,CACrD,QACA,eACA,OACA,qBACA,aACA,YACF,EACM,EAAiD,CAAC,OAAQ,aAAc,aAAc,eAAgB,UAAU,EAChH,EAAqB,IAAI,KAAK,eAAe,QAAS,CAC1D,UAAW,SACX,UAAW,QACX,SAAU,KACZ,CAAC,EAEY,EAAuB,GAA8B,EAAmB,OAAO,KAAK,MAAM,CAAS,CAAC,EAEpG,GACX,EACA,KACmF,CACnF,KAAM,EAAS,KACf,SAAU,EAAS,SACnB,OAAQ,EAAO,OAAS,EAAI,GAAK,IAAI,EAAO,SAAS,GACvD,GAEa,GACX,EACA,EACA,IACkF,CAClF,IAAM,EAAO,IAAI,gBAAgB,CAAM,EAEvC,OADA,EAAK,IAAI,SAAU,CAAQ,EACpB,CACL,KAAM,gBACN,WACA,OAAQ,IAAI,EAAK,SAAS,GAC5B,CACF,EAEM,EAAc,GAClB,EAAY,KAAM,GAAc,IAAc,CAAK,GAAK,MAEpD,EAAc,GAClB,IAAU,UAAY,IAAU,QAAU,IAAU,SAAW,EAAQ,MAEnE,EAAa,GAA2C,CAC5D,IAAM,EAAU,EAA2B,CAAQ,CAAC,CAAC,CAAK,EAC1D,OAAO,EAAc,CAAO,EAAI,EAAQ,MAAQ,KAClD,EAEM,GAAe,IAA0C,CAC7D,MAAO,EAAU,EAAO,IAAI,OAAO,CAAC,EACpC,MAAO,EAAO,IAAI,GAAG,CAAC,EAAE,KAAK,GAAK,GAClC,QAAS,EAAS,KAAM,GAAc,IAAc,EAAO,IAAI,SAAS,CAAC,GAAK,MAC9E,OAAQ,EAAW,EAAO,IAAI,QAAQ,CAAC,EACvC,KAAM,EAAW,EAAO,IAAI,MAAM,CAAC,CACrC,GAEa,GACX,EACA,IAC6C,CAC7C,IAAM,EAAQ,EAAQ,MAAM,kBAAkB,OAAO,EACrD,OAAO,EAAM,OACV,IACE,EAAM,SAAW,GAAK,GAAG,EAAK,IAAI,GAAG,EAAK,MAAM,GAAG,EAAK,SAAS,kBAAkB,OAAO,CAAC,CAAC,SAAS,CAAK,KAC1G,EAAQ,UAAY,OAAS,EAAK,UAAY,EAAQ,WACtD,EAAQ,QAAU,OAAS,EAAK,OAAO,MAAM,CAAE,QAAS,IAAO,EAAQ,KAAK,KAC5E,EAAQ,SAAW,OAAS,EAAK,cAAgB,EAAQ,UACzD,EAAQ,OAAS,OAAS,EAAK,OAAS,EAAQ,KACrD,CACF,EAEM,GAAc,CAAE,UAAuE,CAC3F,GAAM,CAAC,EAAU,IAAA,EAAA,EAAA,SAAA,CAAwB,EAAK,EAE9C,OADI,EAAK,OAAO,SAAW,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,YAAgB,CAAA,GAEzD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,oBAAxB,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAY,GAAG,EAAK,IAAI,gBAAgB,EAAK,gBAAkB,iCAAmC,KAClG,UAAW,EAAO,OACR,WACV,MAAO,EACP,iBAAkB,EAClB,OAAQ,EAAK,OACb,KAAK,SACN,CAAA,EACA,EAAK,iBAAkB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,oBAAY,6BAAiC,CAAA,EAAI,IAC7F,GAEV,EAEa,GACX,EACA,IAEA,IAAa,KAAO,KAAQ,EAAM,KAAM,GAAS,EAAK,WAAa,CAAQ,GAAK,KAE5E,EAAgB,GACpB,EACG,MAAM,GAAG,CAAC,CACV,IAAK,GAAS,GAAG,EAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,OAAO,IAAI,EAAK,MAAM,CAAC,GAAG,CAAC,CAC7E,KAAK,GAAG,EAEA,EAAsC,GAC7C,EAAK,WAAW,SAAW,EACtB,qJAEL,EAAK,mBAAmB,SAAW,EAC9B,4BAA4B,EAAK,WAAW,SAAS,EAAK,4BAA8B,IAAM,GAAG,UAAU,EAAK,WAAW,SAAW,EAAI,GAAK,IAAI,gHAExJ,EAAK,WAAW,SAAW,EACtB,2FAEF,4BAA4B,EAAK,WAAW,SAAS,EAAK,4BAA8B,IAAM,GAAG,oGAI7F,GAAa,CACxB,iBACA,YAAY,IACM,CAAC,IAAoB,CACvC,IAAM,EAAU,EAAgD,EAC1D,EAAiB,EAAkB,EACnC,EAAW,EAAY,EACvB,EAAW,EAAY,EACvB,CAAC,GAAgB,EAAgB,EACjC,EAAY,EAAQ,WAAW,MAAM,OAAS,QAAU,EAAQ,WAAW,MAAM,UAAY,KAC7F,GAAA,EAAA,EAAA,QAAA,KACE,IAAI,IAAI,GAAW,SAAS,IAAK,GAAY,CAAC,EAAQ,GAAI,CAAO,CAAC,GAAK,CAAC,CAAC,EAC/E,CAAC,CAAS,CACZ,EACM,GAAA,EAAA,EAAA,QAAA,KAAmC,IAAI,IAAI,GAAW,SAAS,KAAK,CAAE,QAAS,CAAE,GAAK,CAAC,CAAC,EAAG,CAAC,CAAS,CAAC,EACtG,EACJ,EAAQ,WAAW,MAAM,OAAS,QAAU,EAAQ,WAAW,MAAM,UAAU,YAAc,UACzF,EAAa,GAAyB,EAAe,KAAK,EAC1D,EAAU,GAAY,CAAY,EAClC,EAAa,GACjB,EAAQ,YACR,EACA,EACA,EACA,EACA,EAAe,kBACf,CACF,EACM,EAAiB,GAAgC,CACrD,EAAS,EAAwB,EAAU,CAAI,EAAG,CAAE,QAAS,EAAK,CAAC,CACrE,EACM,GAAU,EAAwB,IAAwB,CAC9D,IAAM,EAAO,IAAI,gBAAgB,CAAY,EACzC,EAAM,SAAW,GAAK,IAAU,MAAO,EAAK,OAAO,IAAQ,QAAU,IAAM,CAAG,EAC7E,EAAK,IAAI,IAAQ,QAAU,IAAM,EAAK,CAAK,EAChD,EAAc,CAAI,CACpB,EAEM,EACJ,EAAQ,WAAW,MAAM,OAAS,QAE9B,IAAe,KACb,CACE,KAAM,UACN,OAAQ,EAAe,MAAM,OAAS,gBAAkB,WAAa,EAAe,MAAM,IAC5F,EACA,KANF,EAAQ,WAAW,MAOzB,GAAI,GAAmB,OAAS,UAC9B,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,aAAW,yBAAyB,UAAW,EAAO,cAA/D,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,OAAO,OAAO,QAAQ,OAAS,CAAA,GACzC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,OAAO,QAAQ,QAAQ,OAAS,CAAA,CACnC,IAGb,GAAI,IAAsB,KACxB,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,qBAAwB,IAAA,GACxB,QAAS,EAAQ,WAAW,QAC5B,MAAO,CACR,CAAA,EAGL,GAAI,EAAW,MAAM,OAAS,QAAU,EAAW,MAAM,OAAS,UAChE,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,aAAW,yBAAyB,UAAW,EAAO,cAA/D,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,OAAO,OAAO,QAAQ,OAAS,CAAA,GACzC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,OAAO,QAAQ,QAAQ,OAAS,CAAA,CACnC,IAGb,GAAI,EAAW,MAAM,OAAS,SAC5B,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,EAAW,eAAO,WAAiB,CAAA,EAC5D,YAAY,oGACZ,MAAM,oBACN,KAAK,SACN,CAAA,EAIL,IAAM,EAAe,EAAW,MAAM,MAChC,GACJ,EAAQ,QAAU,OAAS,EAAW,MAAM,aAAa,MAAM,CAAE,cAAe,IAAa,EAAQ,KAAK,EACtG,GACJ,EAAQ,QAAU,MACd,IAAA,GACA,EAAW,MAAM,MAAM,SAAS,CAAE,YAAa,CAAM,CAAC,CAAC,MAAM,CAAE,QAAS,IAAO,EAAQ,KAAK,EAC5F,EAAmB,EAAa,IAAI,QAAQ,EAC5C,EAAe,EAAoB,EAAW,MAAM,MAAO,CAAgB,EAC3E,EACJ,EAAe,MAAM,OAAS,iBAC9B,EAAe,MAAM,QAAQ,aAAe,mBAC5C,EAAe,MAAM,QAAQ,MAAM,OAAS,QACxC,EAAe,MAAM,QAAQ,MAAM,SACnC,KACA,MAA6B,CACjC,IAAM,EAAO,IAAI,gBAAgB,CAAY,EAC7C,EAAK,OAAO,QAAQ,EACpB,EACE,CACE,KAAM,WACN,SAAU,EAAS,SACnB,OAAQ,EAAK,OAAS,EAAI,GAAK,IAAI,EAAK,SAAS,GACnD,EACA,CAAE,QAAS,EAAK,CAClB,CACF,EACA,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,cAA3B,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,cAA1B,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,IAAI,KAAK,YAAY,QAAQ,iBAAQ,iBAExC,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,KAAK,QAAQ,mBAAU,oBAE1B,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,YAAY,QAAQ,sBAAa,wFAEtC,CAAA,CACA,KAER,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,aAAW,eAAe,UAAW,EAAO,iBAArD,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,gBAAzB,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,QAAY,CAAA,GAClB,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,UAAW,IACX,SAAW,GAAU,EAAO,QAAS,EAAM,cAAc,KAAK,EAC9D,YAAY,wBACZ,KAAK,SACL,MAAO,EAAQ,KAChB,CAAA,CACI,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,SAAa,CAAA,GACnB,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,SAAW,GAAU,EAAO,UAAW,EAAM,cAAc,KAAK,EAAG,MAAO,EAAQ,iBAA1F,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,eAAM,cAAoB,CAAA,EACvC,EAAS,IAAK,IACb,EAAA,EAAA,IAAA,CAAC,SAAD,CAAsB,MAAO,WAC1B,CACK,EAFK,CAEL,CACT,CACK,GACH,CAAA,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,OAAW,CAAA,GACjB,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,SAAW,GAAU,EAAO,QAAS,EAAM,cAAc,KAAK,EAAG,MAAO,EAAQ,eAAxF,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,eAAM,QAAc,CAAA,EACjC,EAAQ,QAAU,OAAS,CAAC,IAC3B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAO,EAAQ,eAAQ,IAAe,MAAQ,UAAU,EAAQ,MAAM,MAAM,EAAE,GAAY,CAAA,EAChG,KACH,EAAW,MAAM,aAAa,IAAK,IAClC,EAAA,EAAA,IAAA,CAAC,SAAD,CAA6B,MAAO,EAAM,kBACvC,EAAM,WACD,EAFK,EAAM,QAEX,CACT,EACA,EAAW,MAAM,uBAAwB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,SAAA,YAAS,uBAA6B,CAAA,EAAI,IACtF,GACH,CAAA,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,MAAU,CAAA,GAChB,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,SAAW,GAAU,EAAO,OAAQ,EAAM,cAAc,KAAK,EAAG,MAAO,EAAQ,cAAvF,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,eAAM,WAAiB,CAAA,EACpC,EAAY,IAAK,IAChB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAmB,MAAO,WACvB,EAAa,CAAI,CACZ,EAFK,CAEL,CACT,CACK,GACH,CAAA,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,QAAY,CAAA,GAClB,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,SAAW,GAAU,EAAO,SAAU,EAAM,cAAc,KAAK,EAAG,MAAO,EAAQ,gBAAzF,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,eAAM,YAAkB,CAAA,GACtC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,kBAAS,QAAc,CAAA,GACrC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,gBAAO,MAAY,CAAA,GACjC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,kBAAS,iBAAuB,CAAA,CACxC,GACH,CAAA,CAAA,CACA,IAER,IAAqB,KAAO,KAAO,IAAiB,MACnD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,GAAG,yBACN,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,WAAgB,eAAqB,CAAA,EAC9D,YAAY,gIACZ,MAAM,mBACN,KAAK,SACN,CAAA,CACE,CAAA,GAEL,EAAA,EAAA,KAAA,CAAC,EAAD,CAAS,GAAG,UAAU,UAAW,EAAO,UAAW,GAAG,eAAe,QAAQ,WAAW,KAAK,qBAA7F,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,yBAAvB,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,QAAS,EAAa,QAAS,KAAK,SAAW,CAAA,GAC5D,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAO,EAAa,OAAQ,KAAK,UAAU,KAAM,EAAa,IAAO,CAAA,CAC9E,KACL,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAG,IAAI,KAAK,YAAY,QAAQ,iBAAtC,CACG,EAAa,IAAI,MAAI,EAAa,EAAa,IAAI,CAChD,KACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,KAAK,QAAQ,yBACnB,EAAa,KACV,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,YAAY,QAAQ,sBAC5B,EAAmC,CAAY,CAC5C,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,KAAM,CAAe,CAAA,EAChC,IAAuB,KAAO,MAC7B,EAAA,EAAA,IAAA,CAAC,EAAD,CAEE,gBAAiB,EACjB,SAAU,EAAa,SACvB,SAAU,EAAW,MAAM,aAC3B,YAAa,EAAQ,YACrB,GAAK,IAAmB,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,CAAe,CACtE,EANM,EAAa,QAMnB,GAEH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,0BAAvB,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,2BACpB,EAAa,mBAAmB,IAAK,GAAc,CAClD,IAAM,EAAU,EAAY,IAAI,CAAS,EACzC,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAEE,MAAO,EAAsB,EAAQ,YAAa,EAAW,EAA0B,CAAQ,CAAC,EAChG,GAAI,GAAyB,EAAQ,YAAa,EAAW,EAAa,QAAQ,WAHpF,CAIC,QACO,IAAY,IAAA,GAAY,WAAW,EAAU,MAAM,EAAE,IAAM,EAAQ,MAAM,SAC9E,IAAY,IAAA,GAAY,MAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAQ,OAAc,CAAA,CACzD,GANC,CAMD,CAEV,CAAC,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,WAAgB,eAAqB,CAAA,CACnD,GACE,KAGX,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAe,GAAG,mBAAzC,EACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAG,KAAK,QAAQ,yBAAtB,CACG,EAAW,MAAM,aAAa,OAAK,EAAW,MAAM,WAAW,kBAC5D,KACN,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MACE,EAAW,MAAM,WACb,mBACA,EAAW,MAAM,UACf,2BACA,kBAER,KAAK,UACL,KAAM,EAAW,MAAM,WAAa,CAAC,EAAW,MAAM,WAAa,UAAY,SAChF,CAAA,CACE,IAEJ,EAAa,SAAW,GACvB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,YAAe,EAAc,IAAI,eAAiB,WAAG,eAAqB,CAAA,EAC1F,YAAY,sFACZ,MAAM,mBACP,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,eACpB,EAAa,IAAK,IACjB,EAAA,EAAA,KAAA,CAAC,EAAD,CAAS,GAAG,UAAU,UAAW,EAAO,KAA0B,QAAQ,OAAO,KAAK,qBAAtF,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,QAAS,EAAK,QAAS,KAAK,SAAW,CAAA,GACpD,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,UAAW,EAAO,SAClB,QAAU,GAAU,CACd,EAAsC,EAAO,EAAM,cAAc,MAAM,GACzE,EAAgC,EAAU,EAAK,IAAI,CAEvD,EACA,MAAO,EACL,EAAS,MACT,EAAQ,YACR,EAAK,SACL,EAAyB,CAAQ,CACnC,EACA,GAAI,EAAK,cAbX,EAeE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,GAAU,CAAA,GACtB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAK,KAAc,CAAA,CACxB,KACN,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAO,EAAK,OAAQ,KAAK,UAAU,KAAM,EAAK,IAAO,CAAA,GACjE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAa,EAAK,IAAI,CAAQ,CAAA,GACrC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SACG,EAAK,WAAW,SAAW,EACxB,WACA,GAAG,EAAK,WAAW,SAAS,EAAK,4BAA8B,IAAM,GAAG,UAAU,EAAK,WAAW,SAAW,EAAI,GAAK,KACtH,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAkB,MAAO,CAAA,GACzB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,SAAU,EAAK,UAAW,MAAO,gBAAgB,EAAK,qBACzD,EAAoB,EAAK,SAAS,CAC/B,CAAA,CACH,IACJ,IAAuB,KAAO,MAC7B,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAW,EAAO,UAClB,GAAI,EAAqB,EAAS,SAAU,EAAc,EAAK,QAAQ,WACxE,OAEK,CAAA,CAED,GAzC0C,EAAK,QAyC/C,CACV,CACE,CAAA,CAEA,GAEb"}
|
|
1
|
+
{"version":3,"file":"ItemsPage-CKK_KkJ2.js","names":[],"sources":["../../../src/client/items/ItemsPage.module.css","../../../src/client/items/AuthorizedSharePanel.tsx","../../../src/client/items/ItemsPage.tsx"],"sourcesContent":[".page,\n.hero,\n.filters,\n.items,\n.item,\n.itemLink,\n.meta,\n.selection {\n display: grid;\n}\n\n.page {\n gap: var(--rly-space-32);\n}\n\n.hero {\n gap: var(--rly-space-8);\n max-inline-size: 52rem;\n}\n\n.hero > * {\n margin: 0;\n}\n\n.filters {\n grid-template-columns: minmax(16rem, 2fr) repeat(4, minmax(9rem, 1fr));\n gap: var(--rly-space-12);\n align-items: end;\n}\n\n.filters label {\n display: grid;\n gap: var(--rly-space-6);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.filters input,\n.filters select {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.filters input:focus-visible,\n.filters select:focus-visible,\n.itemLink:focus-visible,\n.membershipChoices a:focus-visible,\n.shareLink:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.resultHeading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-12);\n}\n\n.resultHeading h2 {\n margin: 0;\n}\n\n.selection {\n gap: var(--rly-space-12);\n scroll-margin-block-start: var(--rly-space-24);\n}\n\n.selection > * {\n margin: 0;\n}\n\n.selectionHeader,\n.selectionActions,\n.membershipChoices {\n display: flex;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.selectionActions {\n justify-content: space-between;\n}\n\n.membershipChoices {\n flex-wrap: wrap;\n}\n\n.membershipChoices a {\n display: grid;\n gap: var(--rly-space-2);\n min-block-size: 3rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.membershipChoices a span {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.items {\n gap: var(--rly-space-8);\n}\n\n.item {\n grid-template-columns: auto minmax(0, 1fr) auto auto;\n align-items: center;\n gap: var(--rly-space-16);\n min-block-size: 5.5rem;\n padding: var(--rly-space-16) var(--rly-space-20);\n}\n\n.itemLink {\n gap: var(--rly-space-2);\n min-inline-size: 0;\n color: inherit;\n text-decoration: none;\n}\n\n.shareLink {\n min-block-size: 2.5rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.itemLink span,\n.meta {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.owners {\n min-inline-size: max-content;\n}\n\n.ownerGroup {\n display: grid;\n gap: var(--rly-space-4);\n min-inline-size: 0;\n}\n\n.ownerLimit {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.itemLink strong {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.meta {\n grid-auto-flow: column;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.shareForm,\n.shareResult {\n display: grid;\n grid-template-columns: minmax(12rem, 1fr) minmax(8rem, auto) minmax(8rem, auto) auto;\n gap: var(--rly-space-12);\n align-items: end;\n padding-block: var(--rly-space-12);\n border-block: 1px solid var(--rly-color-border-2);\n}\n\n.shareForm > div,\n.shareResult > div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.shareForm h3,\n.shareForm p,\n.shareResult h3,\n.shareResult p {\n margin: 0;\n}\n\n.shareForm label {\n display: grid;\n gap: var(--rly-space-6);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.shareForm select {\n min-block-size: 3rem;\n padding-inline: var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.shareForm select:focus-visible,\n.shareResult a:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.shareResult {\n grid-template-columns: minmax(0, 1fr) auto auto;\n}\n\n.shareResult a {\n overflow-wrap: anywhere;\n color: var(--rly-color-text-1);\n}\n\n@media (max-width: 64rem) {\n .filters {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n\n .search {\n grid-column: 1 / -1;\n }\n\n .item {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .meta {\n grid-column: 2;\n grid-auto-flow: row;\n grid-template-columns: repeat(2, minmax(0, max-content));\n }\n\n .shareLink {\n grid-column: 2;\n justify-self: start;\n }\n\n .shareForm,\n .shareResult {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-items: end;\n }\n\n .shareForm > div,\n .shareResult > div {\n grid-column: 1 / -1;\n }\n}\n\n@media (max-width: 40rem) {\n .filters {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .search {\n grid-column: auto;\n }\n\n .meta,\n .shareForm,\n .shareResult {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .shareForm > div,\n .shareResult > div {\n grid-column: auto;\n }\n}\n","import { Button, StateLabel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type FormEvent, type ReactElement, useEffect, useMemo, useRef, useState } from \"react\"\nimport { Link } from \"react-router\"\n\nimport type { WorkspaceEntityOwner } from \"../../api/deliveryGraph.js\"\nimport type { EntityId, ShareId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { PersonId } from \"../../domain/identifiers.js\"\nimport {\n browserAuthorizedShareTransport,\n type AuthorizedShareLifetime,\n type AuthorizedShareTransport,\n type CreateAuthorizedShareTransportInput\n} from \"./authorizedShareTransport.js\"\nimport styles from \"./ItemsPage.module.css\"\n\ninterface ShareGrantee {\n readonly displayName: string\n readonly personId: PersonId\n}\n\ntype AuthorizedSharePanelState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"creating\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"ready\"; readonly shareId: ShareId; readonly expiresAt: string }\n | { readonly _tag: \"revoking\"; readonly shareId: ShareId; readonly expiresAt: string }\n | { readonly _tag: \"revoked\" }\n\nexport interface AuthorizedSharePanelProps {\n readonly currentPersonId: PersonId\n readonly entityId: EntityId\n readonly grantees: ReadonlyArray<WorkspaceEntityOwner>\n readonly transport?: AuthorizedShareTransport\n readonly workspaceId: WorkspaceId\n}\n\nconst shareLifetime = (value: string): AuthorizedShareLifetime => (value === \"hour\" || value === \"week\" ? value : \"day\")\n\nconst shareGrantees = (\n currentPersonId: PersonId,\n grantees: ReadonlyArray<WorkspaceEntityOwner>\n): ReadonlyArray<ShareGrantee> => {\n const byId = new Map<PersonId, ShareGrantee>()\n byId.set(currentPersonId, { displayName: \"You\", personId: currentPersonId })\n for (const grantee of grantees) {\n byId.set(grantee.personId, { displayName: grantee.displayName, personId: grantee.personId })\n }\n return [...byId.values()]\n}\n\n/** Owner-only creation and revocation controls for one exact item share. */\nexport const AuthorizedSharePanel = ({\n currentPersonId,\n entityId,\n grantees,\n transport = browserAuthorizedShareTransport,\n workspaceId\n}: AuthorizedSharePanelProps): ReactElement => {\n const options = useMemo(() => shareGrantees(currentPersonId, grantees), [currentPersonId, grantees])\n const [granteePersonId, setGranteePersonId] = useState<PersonId>(options[0]?.personId ?? currentPersonId)\n const [lifetime, setLifetime] = useState<AuthorizedShareLifetime>(\"day\")\n const [state, setState] = useState<AuthorizedSharePanelState>({ _tag: \"idle\" })\n const createIntent = useRef<CreateAuthorizedShareTransportInput | null>(null)\n const currentRequest = useRef<AbortController | null>(null)\n const statusRegion = useRef<HTMLElement | null>(null)\n\n useEffect(() => () => currentRequest.current?.abort(), [])\n useEffect(() => {\n if (state._tag === \"ready\" || state._tag === \"revoked\") statusRegion.current?.focus()\n }, [state._tag])\n\n const create = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n currentRequest.current?.abort()\n const request = new AbortController()\n currentRequest.current = request\n setState({ _tag: \"creating\" })\n const existingIntent = createIntent.current\n const intent =\n existingIntent !== null &&\n existingIntent.entityId === entityId &&\n existingIntent.granteePersonId === granteePersonId &&\n existingIntent.lifetime === lifetime\n ? Promise.resolve(existingIntent)\n : transport.prepareCreate({ entityId, granteePersonId, lifetime }).then((nextIntent) => {\n createIntent.current = nextIntent\n return nextIntent\n })\n intent\n .then((currentIntent) => transport.create(currentIntent, request.signal))\n .then(\n (share) => {\n if (request.signal.aborted) return\n const currentIntent = createIntent.current\n if (\n currentIntent === null ||\n share.shareId !== currentIntent.shareId ||\n share.entityId !== currentIntent.entityId ||\n share.granteePersonId !== currentIntent.granteePersonId\n ) {\n setState({ _tag: \"failed\" })\n return\n }\n if (share.revokedAt !== null) {\n setState({ _tag: \"revoked\" })\n return\n }\n setState({\n _tag: \"ready\",\n shareId: share.shareId,\n expiresAt: DateTime.formatIso(share.expiresAt)\n })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n }\n )\n }\n\n const revoke = (shareId: ShareId, expiresAt: string): void => {\n currentRequest.current?.abort()\n const request = new AbortController()\n currentRequest.current = request\n setState({ _tag: \"revoking\", shareId, expiresAt })\n transport.revoke(workspaceId, shareId, request.signal).then(\n () => {\n if (!request.signal.aborted) setState({ _tag: \"revoked\" })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"ready\", shareId, expiresAt })\n }\n )\n }\n\n const selectGrantee = (value: string): void => {\n createIntent.current = null\n setGranteePersonId(PersonId.make(value))\n }\n const selectLifetime = (value: string): void => {\n createIntent.current = null\n setLifetime(shareLifetime(value))\n }\n const createAnother = (): void => {\n createIntent.current = null\n setState({ _tag: \"idle\" })\n }\n\n if (state._tag === \"ready\" || state._tag === \"revoking\") {\n const sharePath = `/shares/${workspaceId}/${state.shareId}`\n return (\n <section\n aria-label=\"Authorized share\"\n aria-live=\"polite\"\n className={styles.shareResult}\n ref={statusRegion}\n role=\"status\"\n tabIndex={-1}\n >\n <div>\n <Text as=\"h3\" variant=\"body-large\">\n Authorized link ready\n </Text>\n <Text tone=\"secondary\">Only the selected person can open this exact item. Expires {state.expiresAt}.</Text>\n </div>\n <Link to={sharePath}>{sharePath}</Link>\n <Button disabled={state._tag === \"revoking\"} onClick={() => revoke(state.shareId, state.expiresAt)}>\n {state._tag === \"revoking\" ? \"Revoking…\" : \"Revoke link\"}\n </Button>\n </section>\n )\n }\n\n if (state._tag === \"revoked\") {\n return (\n <section\n aria-label=\"Authorized share\"\n aria-live=\"polite\"\n className={styles.shareResult}\n ref={statusRegion}\n role=\"status\"\n tabIndex={-1}\n >\n <StateLabel label=\"Revoked\" size=\"compact\" tone=\"neutral\" />\n <Text tone=\"secondary\">This link no longer resolves.</Text>\n <Button onClick={createAnother}>Create another</Button>\n </section>\n )\n }\n\n return (\n <form className={styles.shareForm} onSubmit={create}>\n <div>\n <Text as=\"h3\" variant=\"body-large\">\n Share this exact item\n </Text>\n <Text tone=\"secondary\">Authenticated access only. Related releases and relationships stay private.</Text>\n </div>\n <label>\n <span>Person</span>\n <select\n disabled={state._tag === \"creating\"}\n onChange={(event) => selectGrantee(event.currentTarget.value)}\n value={granteePersonId}\n >\n {options.map((option) => (\n <option key={option.personId} value={option.personId}>\n {option.displayName}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Expires</span>\n <select\n disabled={state._tag === \"creating\"}\n onChange={(event) => selectLifetime(event.currentTarget.value)}\n value={lifetime}\n >\n <option value=\"hour\">In 1 hour</option>\n <option value=\"day\">In 1 day</option>\n <option value=\"week\">In 7 days</option>\n </select>\n </label>\n <Button disabled={state._tag === \"creating\"} type=\"submit\">\n {state._tag === \"creating\" ? \"Creating…\" : \"Create authorized link\"}\n </Button>\n {state._tag === \"failed\" ? (\n <Text role=\"alert\" tone=\"secondary\">\n Could not create the link. Check the person and try again.\n </Text>\n ) : null}\n </form>\n )\n}\n","import { PeopleStrip, ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Option from \"effect/Option\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useMemo, useState } from \"react\"\nimport { Link, useLocation, useNavigate, useOutletContext, useSearchParams } from \"react-router\"\n\nimport type { DeliveryEntityKind, DeliveryEntityService } from \"../../domain/deliveryGraph.js\"\nimport { PersonId } from \"../../domain/identifiers.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { PortfolioOverviewView, type PortfolioOverviewState } from \"../portfolio/PortfolioOverview.js\"\nimport type { WorkspaceReleaseOutletContext } from \"../releases/WorkspaceReleaseLayout.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { releaseWorksetSessionKey } from \"../releases/ReleaseWorkset.js\"\nimport { rememberWorkspaceScrollPosition, shouldRememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport {\n type WorkspaceItemPresentation,\n type WorkspaceItemStatus,\n workspaceItemReleaseHref\n} from \"./presentWorkspaceItems.js\"\nimport { browserWorkspaceItemsTransport, useWorkspaceItems, type WorkspaceItemsTransport } from \"./useWorkspaceItems.js\"\nimport { AuthorizedSharePanel } from \"./AuthorizedSharePanel.js\"\nimport type { AuthorizedShareTransport } from \"./authorizedShareTransport.js\"\nimport styles from \"./ItemsPage.module.css\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"./workspaceEntityRoutes.js\"\n\ninterface ItemFilters {\n readonly query: string\n readonly owner: PersonId | \"all\"\n readonly service: DeliveryEntityService | \"all\"\n readonly status: WorkspaceItemStatus | \"all\"\n readonly type: DeliveryEntityKind | \"all\"\n}\n\nexport interface ItemsPageProps {\n readonly shareTransport?: AuthorizedShareTransport\n readonly transport?: WorkspaceItemsTransport\n}\n\nconst entityKinds: ReadonlyArray<DeliveryEntityKind> = [\n \"issue\",\n \"pull-request\",\n \"page\",\n \"pipeline-execution\",\n \"deployment\",\n \"time-entry\"\n]\nconst services: ReadonlyArray<DeliveryEntityService> = [\"jira\", \"codecommit\", \"confluence\", \"codepipeline\", \"clockify\"]\nconst freshnessFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\"\n})\n\nexport const formatItemFreshness = (freshness: string): string => freshnessFormatter.format(Date.parse(freshness))\n\nexport const itemsLocationWithSearch = (\n location: Pick<Location, \"hash\" | \"pathname\">,\n params: URLSearchParams\n): { readonly hash: string; readonly pathname: string; readonly search: string } => ({\n hash: location.hash,\n pathname: location.pathname,\n search: params.size === 0 ? \"\" : `?${params.toString()}`\n})\n\nexport const unlinkedItemLocation = (\n pathname: string,\n params: URLSearchParams,\n entityId: string\n): { readonly hash: string; readonly pathname: string; readonly search: string } => {\n const next = new URLSearchParams(params)\n next.set(\"object\", entityId)\n return {\n hash: \"#item-details\",\n pathname,\n search: `?${next.toString()}`\n }\n}\n\nconst entityKind = (value: string | null): DeliveryEntityKind | \"all\" =>\n entityKinds.find((candidate) => candidate === value) ?? \"all\"\n\nconst itemStatus = (value: string | null): WorkspaceItemStatus | \"all\" =>\n value === \"active\" || value === \"done\" || value === \"failed\" ? value : \"all\"\n\nconst itemOwner = (value: string | null): PersonId | \"all\" => {\n const decoded = Schema.decodeUnknownOption(PersonId)(value)\n return Option.isSome(decoded) ? decoded.value : \"all\"\n}\n\nconst filtersFrom = (params: URLSearchParams): ItemFilters => ({\n owner: itemOwner(params.get(\"owner\")),\n query: params.get(\"q\")?.trim() ?? \"\",\n service: services.find((candidate) => candidate === params.get(\"service\")) ?? \"all\",\n status: itemStatus(params.get(\"status\")),\n type: entityKind(params.get(\"type\"))\n})\n\nexport const filterWorkspaceItems = (\n items: ReadonlyArray<WorkspaceItemPresentation>,\n filters: ItemFilters\n): ReadonlyArray<WorkspaceItemPresentation> => {\n const query = filters.query.toLocaleLowerCase(\"en-US\")\n return items.filter(\n (item) =>\n (query.length === 0 || `${item.key} ${item.title} ${item.status}`.toLocaleLowerCase(\"en-US\").includes(query)) &&\n (filters.service === \"all\" || item.service === filters.service) &&\n (filters.owner === \"all\" || item.owners.some(({ id }) => id === filters.owner)) &&\n (filters.status === \"all\" || item.statusGroup === filters.status) &&\n (filters.type === \"all\" || item.kind === filters.type)\n )\n}\n\nconst ItemOwners = ({ item }: { readonly item: WorkspaceItemPresentation }): ReactElement => {\n const [expanded, setExpanded] = useState(false)\n if (item.owners.length === 0) return <span>Unassigned</span>\n return (\n <span className={styles.ownerGroup}>\n <PeopleStrip\n aria-label={`${item.key} collaborators${item.ownersTruncated ? \", more collaborators not shown\" : \"\"}`}\n className={styles.owners}\n expanded={expanded}\n limit={2}\n onExpandedChange={setExpanded}\n people={item.owners}\n size=\"compact\"\n />\n {item.ownersTruncated ? <span className={styles.ownerLimit}>20+ people · More not shown</span> : null}\n </span>\n )\n}\n\nexport const selectWorkspaceItem = (\n items: ReadonlyArray<WorkspaceItemPresentation>,\n entityId: string | null\n): WorkspaceItemPresentation | null =>\n entityId === null ? null : (items.find((item) => item.entityId === entityId) ?? null)\n\nconst labelForKind = (kind: DeliveryEntityKind): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nexport const workspaceItemMembershipDescription = (item: WorkspaceItemPresentation): string => {\n if (item.releaseIds.length === 0) {\n return \"This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.\"\n }\n if (item.routableReleaseIds.length === 0) {\n return `This object is linked to ${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} release${item.releaseIds.length === 1 ? \"\" : \"s\"} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`\n }\n if (item.releaseIds.length === 1) {\n return \"This object is linked to one release and can be opened in its complete delivery context.\"\n }\n return `This object is linked to ${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} releases. Choose the exact release context to avoid silently substituting another delivery trace.`\n}\n\n/** Compact workspace-wide index of normalized delivery objects. */\nexport const ItemsPage = ({\n shareTransport,\n transport = browserWorkspaceItemsTransport\n}: ItemsPageProps = {}): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const [searchParams] = useSearchParams()\n const portfolio = context.controller.state._tag === \"ready\" ? context.controller.state.portfolio : null\n const releaseById = useMemo(\n () => new Map(portfolio?.releases.map((release) => [release.id, release]) ?? []),\n [portfolio]\n )\n const routableReleaseIds = useMemo(() => new Set(portfolio?.releases.map(({ id }) => id) ?? []), [portfolio])\n const refreshKey =\n context.controller.state._tag === \"ready\" ? context.controller.state.portfolio.generatedAt : \"pending\"\n const sessionKey = releaseWorksetSessionKey(browserSession.state)\n const filters = filtersFrom(searchParams)\n const controller = useWorkspaceItems(\n context.workspaceId,\n routableReleaseIds,\n filters,\n refreshKey,\n sessionKey,\n browserSession.invalidateSession,\n transport\n )\n const replaceSearch = (next: URLSearchParams): void => {\n navigate(itemsLocationWithSearch(location, next), { replace: true })\n }\n const update = (key: keyof ItemFilters, value: string): void => {\n const next = new URLSearchParams(searchParams)\n if (value.length === 0 || value === \"all\") next.delete(key === \"query\" ? \"q\" : key)\n else next.set(key === \"query\" ? \"q\" : key, value)\n replaceSearch(next)\n }\n\n const portfolioBoundary: PortfolioOverviewState | null =\n context.controller.state._tag !== \"ready\"\n ? context.controller.state\n : sessionKey === null\n ? {\n _tag: \"session\",\n reason: browserSession.state._tag === \"authenticated\" ? \"checking\" : browserSession.state._tag\n }\n : null\n if (portfolioBoundary?._tag === \"loading\") {\n return (\n <section aria-label=\"Loading delivery items\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"20rem\" variant=\"block\" />\n </section>\n )\n }\n if (portfolioBoundary !== null) {\n return (\n <PortfolioOverviewView\n onPreviewRelease={() => undefined}\n onRetry={context.controller.onRetry}\n state={portfolioBoundary}\n />\n )\n }\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return (\n <section aria-label=\"Loading delivery items\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"20rem\" variant=\"block\" />\n </section>\n )\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"Control Center could not read the normalized delivery index. Saved source facts remain unchanged.\"\n title=\"Items unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const visibleItems = controller.state.items\n const hasSelectedOwnerOption =\n filters.owner === \"all\" || controller.state.ownerOptions.some(({ personId }) => personId === filters.owner)\n const selectedOwner =\n filters.owner === \"all\"\n ? undefined\n : controller.state.items.flatMap(({ owners }) => owners).find(({ id }) => id === filters.owner)\n const selectedEntityId = searchParams.get(\"object\")\n const selectedItem = selectWorkspaceItem(controller.state.items, selectedEntityId)\n const shareOwnerPersonId =\n browserSession.state._tag === \"authenticated\" &&\n browserSession.state.session.permission === \"workspace-owner\" &&\n browserSession.state.session.actor._tag === \"human\"\n ? browserSession.state.session.actor.personId\n : null\n const clearSelection = (): void => {\n const next = new URLSearchParams(searchParams)\n next.delete(\"object\")\n navigate(\n {\n hash: \"#results\",\n pathname: location.pathname,\n search: next.size === 0 ? \"\" : `?${next.toString()}`\n },\n { replace: true }\n )\n }\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Workspace items\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Find release work.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.\n </Text>\n </header>\n\n <section aria-label=\"Item filters\" className={styles.filters}>\n <label className={styles.search}>\n <span>Search</span>\n <input\n maxLength={200}\n onChange={(event) => update(\"query\", event.currentTarget.value)}\n placeholder=\"Key, title, or status\"\n type=\"search\"\n value={filters.query}\n />\n </label>\n <label>\n <span>Service</span>\n <select onChange={(event) => update(\"service\", event.currentTarget.value)} value={filters.service}>\n <option value=\"all\">All services</option>\n {services.map((service) => (\n <option key={service} value={service}>\n {service}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Owner</span>\n <select onChange={(event) => update(\"owner\", event.currentTarget.value)} value={filters.owner}>\n <option value=\"all\">Anyone</option>\n {filters.owner !== \"all\" && !hasSelectedOwnerOption ? (\n <option value={filters.owner}>{selectedOwner?.name ?? `Owner …${filters.owner.slice(-6)}`}</option>\n ) : null}\n {controller.state.ownerOptions.map((owner) => (\n <option key={owner.personId} value={owner.personId}>\n {owner.displayName}\n </option>\n ))}\n {controller.state.ownerOptionsTruncated ? <option disabled>More owners not shown</option> : null}\n </select>\n </label>\n <label>\n <span>Type</span>\n <select onChange={(event) => update(\"type\", event.currentTarget.value)} value={filters.type}>\n <option value=\"all\">All types</option>\n {entityKinds.map((kind) => (\n <option key={kind} value={kind}>\n {labelForKind(kind)}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Status</span>\n <select onChange={(event) => update(\"status\", event.currentTarget.value)} value={filters.status}>\n <option value=\"all\">Any status</option>\n <option value=\"active\">Active</option>\n <option value=\"done\">Done</option>\n <option value=\"failed\">Needs attention</option>\n </select>\n </label>\n </section>\n\n {selectedEntityId === null ? null : selectedItem === null ? (\n <div id=\"item-details\">\n <StatePanel\n action={<Button onClick={clearSelection}>Back to items</Button>}\n description=\"This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.\"\n title=\"Item unavailable\"\n tone=\"caution\"\n />\n </div>\n ) : (\n <Surface as=\"section\" className={styles.selection} id=\"item-details\" padding=\"spacious\" tone=\"secondary\">\n <div className={styles.selectionHeader}>\n <ServiceMark service={selectedItem.service} size=\"compact\" />\n <StateLabel label={selectedItem.status} size=\"compact\" tone={selectedItem.tone} />\n </div>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n {selectedItem.key} · {labelForKind(selectedItem.kind)}\n </Text>\n <Text as=\"h2\" variant=\"section-title\">\n {selectedItem.title}\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n {workspaceItemMembershipDescription(selectedItem)}\n </Text>\n <ItemOwners item={selectedItem} />\n {shareOwnerPersonId === null ? null : (\n <AuthorizedSharePanel\n key={selectedItem.entityId}\n currentPersonId={shareOwnerPersonId}\n entityId={selectedItem.entityId}\n grantees={controller.state.ownerOptions}\n workspaceId={context.workspaceId}\n {...(shareTransport === undefined ? {} : { transport: shareTransport })}\n />\n )}\n <div className={styles.selectionActions}>\n <div className={styles.membershipChoices}>\n {selectedItem.routableReleaseIds.map((releaseId) => {\n const release = releaseById.get(releaseId)\n return (\n <Link\n key={releaseId}\n state={makeReleaseRouteState(context.workspaceId, releaseId, releaseOriginFromLocation(location))}\n to={workspaceItemReleaseHref(context.workspaceId, releaseId, selectedItem.entityId)}\n >\n Open {release === undefined ? `release ${releaseId.slice(-6)}` : release.relay.codename}\n {release === undefined ? null : <span>{release.version}</span>}\n </Link>\n )\n })}\n </div>\n <Button onClick={clearSelection}>Back to items</Button>\n </div>\n </Surface>\n )}\n\n <div className={styles.resultHeading} id=\"results\">\n <Text as=\"h2\" variant=\"section-title\">\n {controller.state.matchedCount} of {controller.state.totalCount} workspace items\n </Text>\n <StateLabel\n label={\n controller.state.refreshing\n ? \"Updating results\"\n : controller.state.truncated\n ? \"Bounded workspace result\"\n : \"Workspace scope\"\n }\n size=\"compact\"\n tone={controller.state.truncated && !controller.state.refreshing ? \"caution\" : \"neutral\"}\n />\n </div>\n\n {visibleItems.length === 0 ? (\n <StatePanel\n action={<Button onClick={() => replaceSearch(new URLSearchParams())}>Clear filters</Button>}\n description=\"Try a broader word, owner, service, type, or status. No demo object is substituted.\"\n title=\"No matching items\"\n />\n ) : (\n <div className={styles.items}>\n {visibleItems.map((item) => (\n <Surface as=\"article\" className={styles.item} key={item.entityId} padding=\"none\" tone=\"secondary\">\n <ServiceMark service={item.service} size=\"compact\" />\n <Link\n className={styles.itemLink}\n onClick={(event) => {\n if (shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)) {\n rememberWorkspaceScrollPosition(location, item.href)\n }\n }}\n state={makeWorkspaceEntityRouteState(\n location.state,\n context.workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )}\n to={item.href}\n >\n <span>{item.key}</span>\n <strong>{item.title}</strong>\n </Link>\n <div className={styles.meta}>\n <StateLabel label={item.status} size=\"compact\" tone={item.tone} />\n <span>{labelForKind(item.kind)}</span>\n <span>\n {item.releaseIds.length === 0\n ? \"Unlinked\"\n : `${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} release${item.releaseIds.length === 1 ? \"\" : \"s\"}`}\n </span>\n <ItemOwners item={item} />\n <time dateTime={item.freshness} title={`Synchronized ${item.freshness}`}>\n {formatItemFreshness(item.freshness)}\n </time>\n </div>\n {shareOwnerPersonId === null ? null : (\n <Link\n className={styles.shareLink}\n to={unlinkedItemLocation(location.pathname, searchParams, item.entityId)}\n >\n Share\n </Link>\n )}\n </Surface>\n ))}\n </div>\n )}\n </article>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{a as n,f as r}from"./lib-BzlsKFNV.js";import{t as i}from"./jsx-runtime-By8HlURe.js";import{t as a}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{
|
|
2
|
-
//# sourceMappingURL=PairPage-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{a as n,f as r}from"./lib-BzlsKFNV.js";import{t as i}from"./jsx-runtime-By8HlURe.js";import{t as a}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{d as o}from"./index-C7_FDTU7.js";import{n as s,r as c,t as l}from"./primitives-nKxQGSsE-CJNmac__.js";import{Ea as u,Jn as d,_i as f,ai as p,d as m,ni as h,pi as g}from"./agent-api-CeONl_8w.js";import{a as _,t as v}from"./client-DKS82kT_.js";import{c as y,u as b}from"./serviceOnboarding-DLINCon7.js";import{t as x}from"./pages.module-CpW6k_pw.js";var S=e(t(),1),C=new Set([`ConflictApiError`,`InvalidRequestApiError`,`ParseError`,`UnauthorizedApiError`]),w=e=>{if(u(e,`_tag`))return typeof e._tag==`string`?e._tag:void 0},T=e=>{let t=w(e);return t!==void 0&&C.has(t)?`That code is invalid, expired, or already used.`:t===`ForbiddenApiError`?`Pairing is blocked on this connection. Open Control Center through trusted HTTPS and try again.`:`Control Center is unavailable right now. Check that the server is running, then try again.`},E=i(),D=h(`PairPage.pairBrowser`)(e=>p(function*(){let t=yield*d(m)(e.trim());return yield*(yield*v()).session.pair({payload:{pairingCode:t}})}).pipe(g(_))),O=e=>e===null?`/`:b(e),k=()=>{let e=r(),[t]=n(),{establishSession:i}=o(),[u,d]=(0,S.useState)(``),[p,m]=(0,S.useState)(),[h,g]=(0,S.useState)(!1);return(0,E.jsxs)(`section`,{"aria-labelledby":`pair-title`,className:x.page,children:[(0,E.jsxs)(`header`,{className:x.sectionHeading,children:[(0,E.jsx)(c,{as:`h1`,id:`pair-title`,variant:`page-title`,children:`Pair this browser`}),(0,E.jsx)(c,{tone:`secondary`,variant:`body-large`,children:`Use the one-time code printed by the local Control Center server. It expires after ten minutes.`})]}),(0,E.jsx)(s,{as:`section`,className:x.pairCard,padding:`spacious`,shape:`grouped`,tone:`secondary`,children:(0,E.jsxs)(`form`,{className:x.pairForm,onSubmit:n=>{n.preventDefault(),m(void 0),g(!0),f(D(u)).then(n=>{i(n.csrfToken,n.session);let r=y(t,`service`);e(O(r),{replace:!0})},e=>{m(T(e)),g(!1)})},children:[(0,E.jsx)(l,{description:`The code stays in this request and is never placed in a URL.`,label:`Pairing code`,required:!0,...p===void 0?{}:{error:p},children:e=>(0,E.jsx)(`input`,{...e,autoComplete:`one-time-code`,inputMode:`text`,maxLength:64,onChange:e=>d(e.currentTarget.value),spellCheck:!1,value:u})}),(0,E.jsx)(a,{disabled:u.trim().length!==64,loading:h,size:`principal`,type:`submit`,variant:`primary`,children:`Pair browser`})]})})]})};export{k as PairPage,O as pairedBrowserDestination};
|
|
2
|
+
//# sourceMappingURL=PairPage-DA6cmyqF.js.map
|