@knpkv/control-center 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -8
- package/dist/client/.vite/manifest.json +214 -182
- package/dist/client/assets/{ActiveWorkPage-Dd1mxPrq.js → ActiveWorkPage-g2-Jyavo.js} +2 -2
- package/dist/client/assets/{ActiveWorkPage-Dd1mxPrq.js.map → ActiveWorkPage-g2-Jyavo.js.map} +1 -1
- package/dist/client/assets/AgentPage-B6GQdZAs.css +1 -0
- package/dist/client/assets/AgentPage-DmVsEe13.js +6 -0
- package/dist/client/assets/AgentPage-DmVsEe13.js.map +1 -0
- package/dist/client/assets/AtlassianOAuthCallbackPage-C8u9ItMj.js +2 -0
- package/dist/client/assets/{AtlassianOAuthCallbackPage-BPoF6oKf.js.map → AtlassianOAuthCallbackPage-C8u9ItMj.js.map} +1 -1
- package/dist/client/assets/{AuthorizedSharePage-jjqu6W_f.js → AuthorizedSharePage-CVBJ1NTm.js} +2 -2
- package/dist/client/assets/{AuthorizedSharePage-jjqu6W_f.js.map → AuthorizedSharePage-CVBJ1NTm.js.map} +1 -1
- package/dist/client/assets/BrowserCrypto-3BoTVFdl.js +2 -0
- package/dist/client/assets/{BrowserCrypto-BMbjhcvP.js.map → BrowserCrypto-3BoTVFdl.js.map} +1 -1
- package/dist/client/assets/BrowserSessionHydrator-CpZnNm4X.js +2 -0
- package/dist/client/assets/{BrowserSessionHydrator-BC1ymLkL.js.map → BrowserSessionHydrator-CpZnNm4X.js.map} +1 -1
- package/dist/client/assets/{CommandSearch-WwAVDrD9.js → CommandSearch-DUeRRbV2.js} +2 -2
- package/dist/client/assets/{CommandSearch-WwAVDrD9.js.map → CommandSearch-DUeRRbV2.js.map} +1 -1
- package/dist/client/assets/{ItemsPage-CKK_KkJ2.js → ItemsPage-BF2ZkSzh.js} +2 -2
- package/dist/client/assets/{ItemsPage-CKK_KkJ2.js.map → ItemsPage-BF2ZkSzh.js.map} +1 -1
- package/dist/client/assets/{PairPage-DA6cmyqF.js → PairPage-CkaZltHd.js} +2 -2
- package/dist/client/assets/{PairPage-DA6cmyqF.js.map → PairPage-CkaZltHd.js.map} +1 -1
- package/dist/client/assets/PortfolioOverview-CEUHJmGC.js +2 -0
- package/dist/client/assets/{PortfolioOverview-CEI4gpXi.js.map → PortfolioOverview-CEUHJmGC.js.map} +1 -1
- package/dist/client/assets/{PullRequestReviewPanel-D7AKnwL-.js → PullRequestReviewPanel-D1IpvHe2.js} +3 -3
- package/dist/client/assets/{PullRequestReviewPanel-D7AKnwL-.js.map → PullRequestReviewPanel-D1IpvHe2.js.map} +1 -1
- package/dist/client/assets/{ReleaseRoute-CbPW3qUT.js → ReleaseRoute-BuQybrsg.js} +2 -2
- package/dist/client/assets/{ReleaseRoute-CbPW3qUT.js.map → ReleaseRoute-BuQybrsg.js.map} +1 -1
- package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js +2 -0
- package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js.map +1 -0
- package/dist/client/assets/ServicesPage-hw5Ee69-.js +2 -0
- package/dist/client/assets/{ServicesPage-_B89DAvG.js.map → ServicesPage-hw5Ee69-.js.map} +1 -1
- package/dist/client/assets/{TimelinePage-DvpgD8AY.js → TimelinePage-Cj3V98uI.js} +2 -2
- package/dist/client/assets/{TimelinePage-DvpgD8AY.js.map → TimelinePage-Cj3V98uI.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityLink-DPj6MKI2.js → WorkspaceEntityLink-C_rc8lxi.js} +2 -2
- package/dist/client/assets/{WorkspaceEntityLink-DPj6MKI2.js.map → WorkspaceEntityLink-C_rc8lxi.js.map} +1 -1
- package/dist/client/assets/WorkspaceEntityRoute-DLLT6fY0.css +1 -0
- package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js +14 -0
- package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js.map +1 -0
- package/dist/client/assets/WorkspaceHomeLink-DeYYLEsH.js +2 -0
- package/dist/client/assets/{WorkspaceHomeLink-CkJfzO25.js.map → WorkspaceHomeLink-DeYYLEsH.js.map} +1 -1
- package/dist/client/assets/WorkspacePullRequestDetails-CizqydjN.js +3 -0
- package/dist/client/assets/{WorkspacePullRequestDetails-HwDgp12e.js.map → WorkspacePullRequestDetails-CizqydjN.js.map} +1 -1
- package/dist/client/assets/{WorkspaceReleaseLayout-CGHi8eoo.js → WorkspaceReleaseLayout-CXAQUhkh.js} +2 -2
- package/dist/client/assets/{WorkspaceReleaseLayout-CGHi8eoo.js.map → WorkspaceReleaseLayout-CXAQUhkh.js.map} +1 -1
- package/dist/client/assets/{WorkspaceRichText-D1M637Ff.js → WorkspaceRichText-CCOciILO.js} +2 -2
- package/dist/client/assets/WorkspaceRichText-CCOciILO.js.map +1 -0
- package/dist/client/assets/WorkspaceSettingsPage-GoBfQzBx.css +1 -0
- package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js +2 -0
- package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js.map +1 -0
- package/dist/client/assets/agent-api-Dl9TuGOJ.js +19 -0
- package/dist/client/assets/agent-api-Dl9TuGOJ.js.map +1 -0
- package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js +2 -0
- package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js.map +1 -0
- package/dist/client/assets/authenticatedMutationClient-DdowMjyo.js +2 -0
- package/dist/client/assets/{authenticatedMutationClient-DYaieXUe.js.map → authenticatedMutationClient-DdowMjyo.js.map} +1 -1
- package/dist/client/assets/{authorizedShareTransport-cxBoQzQ2.js → authorizedShareTransport-CnclcYai.js} +2 -2
- package/dist/client/assets/{authorizedShareTransport-cxBoQzQ2.js.map → authorizedShareTransport-CnclcYai.js.map} +1 -1
- package/dist/client/assets/client-Dq_XQE_l.js +5 -0
- package/dist/client/assets/client-Dq_XQE_l.js.map +1 -0
- package/dist/client/assets/confluenceTasks-DtKq8_eU.js +5 -0
- package/dist/client/assets/confluenceTasks-DtKq8_eU.js.map +1 -0
- package/dist/client/assets/connectionTestTransport-CPK98z7H.js +2 -0
- package/dist/client/assets/connectionTestTransport-CPK98z7H.js.map +1 -0
- package/dist/client/assets/{index-C7_FDTU7.js → index-zVjlBm9l.js} +3 -3
- package/dist/client/assets/{index-C7_FDTU7.js.map → index-zVjlBm9l.js.map} +1 -1
- package/dist/client/assets/{patterns-5N-j-AD2-B9qgekXA.js → patterns-5N-j-AD2-DLfaGePK.js} +2 -2
- package/dist/client/assets/{patterns-5N-j-AD2-B9qgekXA.js.map → patterns-5N-j-AD2-DLfaGePK.js.map} +1 -1
- package/dist/client/assets/{presentPortfolio-C_JsoSWg.js → presentPortfolio-DLEq-vEz.js} +2 -2
- package/dist/client/assets/{presentPortfolio-C_JsoSWg.js.map → presentPortfolio-DLEq-vEz.js.map} +1 -1
- package/dist/client/assets/{presentWorkspaceItems-DboAfwGc.js → presentWorkspaceItems-BOY3FbhO.js} +2 -2
- package/dist/client/assets/{presentWorkspaceItems-DboAfwGc.js.map → presentWorkspaceItems-BOY3FbhO.js.map} +1 -1
- package/dist/client/assets/{pullRequestReviewFailures-DHmYwffV.js → pullRequestReviewFailures-CyjTVnSX.js} +2 -2
- package/dist/client/assets/{pullRequestReviewFailures-DHmYwffV.js.map → pullRequestReviewFailures-CyjTVnSX.js.map} +1 -1
- package/dist/client/assets/{pullRequestReviewThreadReplay-Vy1k53qE.js → pullRequestReviewThreadReplay-CXHspFTr.js} +2 -2
- package/dist/client/assets/{pullRequestReviewThreadReplay-Vy1k53qE.js.map → pullRequestReviewThreadReplay-CXHspFTr.js.map} +1 -1
- package/dist/client/assets/releaseAgentTransport-DaO4svPu.js +2 -0
- package/dist/client/assets/releaseAgentTransport-DaO4svPu.js.map +1 -0
- package/dist/client/assets/releaseRoutes-B4ciNOJj.js +2 -0
- package/dist/client/assets/{releaseRoutes-t9uCfs5T.js.map → releaseRoutes-B4ciNOJj.js.map} +1 -1
- package/dist/client/assets/{serviceOnboarding-DLINCon7.js → serviceOnboarding-D0FmodRi.js} +2 -2
- package/dist/client/assets/{serviceOnboarding-DLINCon7.js.map → serviceOnboarding-D0FmodRi.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceDefaultLanding-CC5ImHkL.js → useWorkspaceDefaultLanding-BaQdg0sY.js} +3 -3
- package/dist/client/assets/{useWorkspaceDefaultLanding-CC5ImHkL.js.map → useWorkspaceDefaultLanding-BaQdg0sY.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceItems-B1X-JNwq.js → useWorkspaceItems-B-7JHtm0.js} +2 -2
- package/dist/client/assets/{useWorkspaceItems-B1X-JNwq.js.map → useWorkspaceItems-B-7JHtm0.js.map} +1 -1
- package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js +2 -0
- package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js.map +1 -0
- package/dist/client/assets/{workspaceScrollCapture-BsjcWVsk.js → workspaceScrollCapture-BYNfR2wo.js} +2 -2
- package/dist/client/assets/{workspaceScrollCapture-BsjcWVsk.js.map → workspaceScrollCapture-BYNfR2wo.js.map} +1 -1
- package/dist/client/assets/{workspaceSettingsTransport-Dw2hueXv.js → workspaceSettingsTransport-Br4lBmvS.js} +2 -2
- package/dist/client/assets/{workspaceSettingsTransport-Dw2hueXv.js.map → workspaceSettingsTransport-Br4lBmvS.js.map} +1 -1
- package/dist/client/build-graph.json +98 -0
- package/dist/client/index.html +1 -1
- package/dist/server/api/agent.d.ts +12 -0
- package/dist/server/api/agent.d.ts.map +1 -1
- package/dist/server/api/deliveryGraph.d.ts +20 -0
- package/dist/server/api/deliveryGraph.d.ts.map +1 -1
- 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 +3 -3
- package/dist/server/api/session.d.ts +23 -1
- package/dist/server/api/session.d.ts.map +1 -1
- package/dist/server/api/shares.d.ts +2 -0
- package/dist/server/api/shares.d.ts.map +1 -1
- package/dist/server/assets/{BindConfig-Bj282xDC.js → BindConfig-DAASchDn.js} +315 -36
- package/dist/server/assets/BindConfig-DAASchDn.js.map +1 -0
- package/dist/server/assets/{agent-ZvwskOQu.js → agent-xQhAQXly.js} +26 -6
- package/dist/server/assets/agent-xQhAQXly.js.map +1 -0
- package/dist/server/assets/{controlCenterApi-5j3gOXgE.js → controlCenterApi-DNXK7MT1.js} +4 -3
- package/dist/server/assets/controlCenterApi-DNXK7MT1.js.map +1 -0
- package/dist/server/assets/{manualPluginSynchronization-CzIhZ_Dw.js → manualPluginSynchronization-DFIeUHP9.js} +4 -3
- package/dist/server/assets/manualPluginSynchronization-DFIeUHP9.js.map +1 -0
- package/dist/server/assets/{readiness-BtntBhDj.js → readiness-31Mqc-9H.js} +2 -2
- package/dist/server/assets/{readiness-BtntBhDj.js.map → readiness-31Mqc-9H.js.map} +1 -1
- package/dist/server/assets/{relationshipInferenceMaterialization-CR6xyMNL.js → relationshipInferenceMaterialization-Dyix96px.js} +41 -14
- package/dist/server/assets/relationshipInferenceMaterialization-Dyix96px.js.map +1 -0
- package/dist/server/assets/{workspaceSettings-C2Zsk6RI.js → workspaceSettings-sv8h_h2P.js} +4 -1
- package/dist/server/assets/workspaceSettings-sv8h_h2P.js.map +1 -0
- package/dist/server/build-graph.json +28 -1
- package/dist/server/domain/confluenceTasks.d.ts +27 -0
- package/dist/server/domain/confluenceTasks.d.ts.map +1 -0
- package/dist/server/domain/deliveryGraph.d.ts +2 -0
- package/dist/server/domain/deliveryGraph.d.ts.map +1 -1
- package/dist/server/domain/governedAction/bindings.d.ts +2 -0
- package/dist/server/domain/governedAction/bindings.d.ts.map +1 -1
- package/dist/server/domain/governedAction/model.d.ts +6 -0
- package/dist/server/domain/governedAction/model.d.ts.map +1 -1
- package/dist/server/domain/index.js +2 -2
- package/dist/server/domain/normalizedPage.d.ts +1 -0
- package/dist/server/domain/normalizedPage.d.ts.map +1 -1
- package/dist/server/domain/releasePipelineApproval.d.ts +31 -0
- package/dist/server/domain/releasePipelineApproval.d.ts.map +1 -0
- package/dist/server/index.js +5 -5
- package/dist/server/server/api/Handlers.d.ts +1 -1
- package/dist/server/server/api/Handlers.d.ts.map +1 -1
- package/dist/server/server/application/deliveryGraphInspection.d.ts.map +1 -1
- package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -1
- package/dist/server/server/application/pipelineExecutionProjection.d.ts +1 -0
- package/dist/server/server/application/pipelineExecutionProjection.d.ts.map +1 -1
- package/dist/server/server/application/portfolioSnapshots.d.ts +4 -0
- package/dist/server/server/application/portfolioSnapshots.d.ts.map +1 -1
- package/dist/server/server/application/releasePublicationSubmissions.d.ts +32 -1
- package/dist/server/server/application/releasePublicationSubmissions.d.ts.map +1 -1
- package/dist/server/server/application/releaseRunbookHydration.d.ts +2310 -0
- package/dist/server/server/application/releaseRunbookHydration.d.ts.map +1 -0
- package/dist/server/server/cli.js +3 -3
- package/dist/server/server/governance/governedActionDigests.d.ts +3 -0
- package/dist/server/server/governance/governedActionDigests.d.ts.map +1 -1
- package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts +1 -0
- package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts.map +1 -1
- package/dist/server/server/index.js +2 -2
- package/dist/server/server/persistence/Persistence.d.ts +10 -0
- package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
- package/dist/server/server/persistence/object-store/BlobPublisher.d.ts.map +1 -1
- package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts +2 -2
- package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +10 -0
- package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +2 -0
- package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +6 -0
- package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +1 -0
- package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +2 -0
- package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +6 -0
- package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/codec.d.ts +4 -0
- 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 +2 -0
- 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 +4 -0
- 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 +4 -0
- 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 +1 -0
- 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 +2 -0
- 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 +2 -0
- package/dist/server/server/persistence/repositories/governed-action/write.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governedActionRepository.d.ts +4 -0
- package/dist/server/server/persistence/repositories/governedActionRepository.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/client/assets/AgentPage-C3LThgPZ.js +0 -3
- package/dist/client/assets/AgentPage-C3LThgPZ.js.map +0 -1
- package/dist/client/assets/AgentPage-DVSgQgJa.css +0 -1
- package/dist/client/assets/AtlassianOAuthCallbackPage-BPoF6oKf.js +0 -2
- package/dist/client/assets/BrowserCrypto-BMbjhcvP.js +0 -2
- package/dist/client/assets/BrowserSessionHydrator-BC1ymLkL.js +0 -2
- package/dist/client/assets/PortfolioOverview-CEI4gpXi.js +0 -2
- package/dist/client/assets/ReleaseWorkset-BluAe7Sq.js +0 -2
- package/dist/client/assets/ReleaseWorkset-BluAe7Sq.js.map +0 -1
- package/dist/client/assets/ServicesPage-_B89DAvG.js +0 -2
- package/dist/client/assets/WorkspaceEntityRoute-9iMOV64J.css +0 -1
- package/dist/client/assets/WorkspaceEntityRoute-B01fxxB3.js +0 -3
- package/dist/client/assets/WorkspaceEntityRoute-B01fxxB3.js.map +0 -1
- package/dist/client/assets/WorkspaceHomeLink-CkJfzO25.js +0 -2
- package/dist/client/assets/WorkspacePullRequestDetails-HwDgp12e.js +0 -3
- package/dist/client/assets/WorkspaceRichText-D1M637Ff.js.map +0 -1
- package/dist/client/assets/WorkspaceSettingsPage-DyoGiGJG.js +0 -2
- package/dist/client/assets/WorkspaceSettingsPage-DyoGiGJG.js.map +0 -1
- package/dist/client/assets/WorkspaceSettingsPage-P6yfac0b.css +0 -1
- package/dist/client/assets/agent-api-CeONl_8w.js +0 -19
- package/dist/client/assets/agent-api-CeONl_8w.js.map +0 -1
- package/dist/client/assets/authenticatedMutationClient-DYaieXUe.js +0 -2
- package/dist/client/assets/client-DKS82kT_.js +0 -5
- package/dist/client/assets/client-DKS82kT_.js.map +0 -1
- package/dist/client/assets/connectionTestTransport-I_Ga9UNs.js +0 -2
- package/dist/client/assets/connectionTestTransport-I_Ga9UNs.js.map +0 -1
- package/dist/client/assets/releaseRoutes-t9uCfs5T.js +0 -2
- package/dist/client/assets/workspaceEntityRoutes-2TejMrzb.js +0 -2
- package/dist/client/assets/workspaceEntityRoutes-2TejMrzb.js.map +0 -1
- package/dist/server/assets/BindConfig-Bj282xDC.js.map +0 -1
- package/dist/server/assets/agent-ZvwskOQu.js.map +0 -1
- package/dist/server/assets/controlCenterApi-5j3gOXgE.js.map +0 -1
- package/dist/server/assets/manualPluginSynchronization-CzIhZ_Dw.js.map +0 -1
- package/dist/server/assets/relationshipInferenceMaterialization-CR6xyMNL.js.map +0 -1
- package/dist/server/assets/workspaceSettings-C2Zsk6RI.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._panel_lh4p3_1{gap:var(--rly-space-40);padding:var(--rly-space-48);display:grid}._heading_lh4p3_7,._pairing_lh4p3_8,._codeCard_lh4p3_9,._session_lh4p3_10{align-items:center;gap:var(--rly-space-32);justify-content:space-between;display:flex}._heading_lh4p3_7>div,._codeCard_lh4p3_9>div,._session_lh4p3_10>div{gap:var(--rly-space-12);display:grid}._pairing_lh4p3_8{justify-content:flex-start;align-items:end}._permission_lh4p3_29{font-size:var(--rly-type-label-size);gap:var(--rly-space-12);min-inline-size:16rem;display:grid}._permission_lh4p3_29>span{color:var(--rly-color-text-1);font-weight:550}._permission_lh4p3_29>select{background:var(--rly-color-surface-1);border:1px solid var(--rly-color-border-2);border-radius:var(--rly-radius-control);color:var(--rly-color-text-1);font:inherit;min-height:2.5rem;padding:0 var(--rly-space-24)}._codeCard_lh4p3_9{background:var(--rly-color-surface-2);border:1px solid var(--rly-color-border-2);border-radius:var(--rly-radius-group);padding:var(--rly-space-32);flex-wrap:wrap;align-items:stretch}._code_lh4p3_9{font-size:var(--rly-type-meta-size);overflow-wrap:anywhere;align-self:center}._sessions_lh4p3_66{border-top:1px solid var(--rly-color-border-2);display:grid}._session_lh4p3_10{border-bottom:1px solid var(--rly-color-border-2);padding:var(--rly-space-24) 0}@media (width<=52rem){._heading_lh4p3_7,._pairing_lh4p3_8,._codeCard_lh4p3_9,._session_lh4p3_10{flex-direction:column;align-items:stretch}._permission_lh4p3_29{min-inline-size:0}}._page_1cf73_1{gap:var(--rly-space-64);max-width:72rem;padding:var(--rly-space-64) var(--rly-space-48) var(--rly-space-96);margin:0 auto;display:grid}._heading_1cf73_9,._theme_1cf73_10,._save_1cf73_11,._actions_1cf73_12{align-items:center;gap:var(--rly-space-32);justify-content:space-between;display:flex}._heading_1cf73_9>div:first-child,._theme_1cf73_10>div{gap:var(--rly-space-12);display:grid}._save_1cf73_11{flex:none}._save_1cf73_11>span{color:var(--rly-color-text-2);font-size:var(--rly-type-meta-size)}._notice_1cf73_34{border-left:2px solid var(--rly-color-border-2);padding-left:var(--rly-space-32)}._governance_1cf73_39{border-color:var(--rly-color-border-2)}._theme_1cf73_10{padding:var(--rly-space-48)}._sections_1cf73_47{gap:var(--rly-space-48);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}._section_1cf73_47{align-content:start;gap:var(--rly-space-40);padding:var(--rly-space-48);display:grid}._sectionHeading_1cf73_60,._fields_1cf73_61{gap:var(--rly-space-16);min-inline-size:0;display:grid}._fields_1cf73_61{gap:var(--rly-space-32)}._field_1cf73_61{font-size:var(--rly-type-label-size);gap:var(--rly-space-12);min-inline-size:0;display:grid}._field_1cf73_61>span,._checkbox_1cf73_79>span{color:var(--rly-color-text-1);font-weight:550}._checkbox_1cf73_79>span{overflow-wrap:anywhere}._field_1cf73_61>small{color:var(--rly-color-text-2)}._control_1cf73_92{background:var(--rly-color-surface-1);border:1px solid var(--rly-color-border-2);border-radius:var(--rly-radius-control);color:var(--rly-color-text-1);font:inherit;inline-size:100%;min-height:2.5rem;min-inline-size:0;padding:0 var(--rly-space-24)}._control_1cf73_92:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:2px}._control_1cf73_92:disabled{cursor:not-allowed;opacity:.6}._checkbox_1cf73_79{align-items:center;gap:var(--rly-space-20);display:flex}._checkbox_1cf73_79>input{width:1rem;height:1rem}@media (width<=52rem){._page_1cf73_1{padding-inline:var(--rly-space-32)}._heading_1cf73_9,._theme_1cf73_10{flex-direction:column;align-items:stretch}._save_1cf73_11{justify-content:flex-end}._sections_1cf73_47{grid-template-columns:1fr}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{m as n}from"./lib-BzlsKFNV.js";import{t as r}from"./jsx-runtime-By8HlURe.js";import{n as i,t as a}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{a as o,d as s,l as c,u as l}from"./index-zVjlBm9l.js";import{n as u,r as d}from"./primitives-nKxQGSsE-CJNmac__.js";import{Ir as f,Pr as p,Vr as m,_i as h,ai as g,er as _,ja as v,pi as y}from"./agent-api-Dl9TuGOJ.js";import{a as b,i as x,n as S,r as C,t as w}from"./client-Dq_XQE_l.js";import{t as T}from"./authenticatedMutationClient-DdowMjyo.js";import{browserWorkspaceSettingsTransport as E}from"./workspaceSettingsTransport-Br4lBmvS.js";var D=e(t(),1),O={panel:`_panel_lh4p3_1`,heading:`_heading_lh4p3_7`,pairing:`_pairing_lh4p3_8`,codeCard:`_codeCard_lh4p3_9`,session:`_session_lh4p3_10`,permission:`_permission_lh4p3_29`,code:`_code_lh4p3_9`,sessions:`_sessions_lh4p3_66`},k={issuePairingCode:(e,t)=>h(g(function*(){return yield*(yield*T).session.issueBrowserPairingCode({payload:{permission:e}})}).pipe(y(b)),{signal:t}),list:e=>h(g(function*(){return yield*(yield*w()).session.list()}).pipe(y(b)),{signal:e}),revoke:(e,t)=>h(g(function*(){yield*(yield*T).session.revoke({params:{sessionId:e}})}).pipe(y(b)),{signal:t})},A=r(),j=e=>e===`workspace-owner`?`Workspace owner`:e===`workspace-approver`?`Workspace approver`:e,M=(e,t=m())=>p(t,e.idleExpiresAt)>=0||p(t,e.absoluteExpiresAt)>=0,N=(e,t=m())=>e.revokedAt===null?M(e,t)?`Expired · last used ${f(e.lastSeenAt)}`:`Active · last used ${f(e.lastSeenAt)}`:`Revoked ${f(e.revokedAt)}`,P=async e=>{try{return await navigator.clipboard.writeText(e),!0}catch{return!1}},F=({canManage:e,currentSession:t,onSessionExpired:n,sessionKey:r,transport:i=k})=>{let[o,s]=(0,D.useState)({_tag:`loading`}),[c,l]=(0,D.useState)(`workspace-owner`),[p,m]=(0,D.useState)(null),[h,g]=(0,D.useState)(`idle`),[_,y]=(0,D.useState)(!1),[b,x]=(0,D.useState)(null),S=(0,D.useCallback)(e=>{s({_tag:`loading`}),i.list(e).then(e=>s({_tag:`ready`,sessions:e}),t=>{e.aborted||(v(`UnauthorizedApiError`)(t)&&n(r),s({_tag:`failed`}))})},[n,r,i]);(0,D.useEffect)(()=>{let e=new AbortController;return S(e.signal),()=>e.abort()},[S]);let C=()=>{let e=new AbortController;g(`issuing`),m(null),y(!1),i.issuePairingCode(c,e.signal).then(e=>{m(e),g(`idle`)},e=>{v(`UnauthorizedApiError`)(e)&&n(r),g(`failed`)})},w=e=>{let t=new AbortController;x(e),i.revoke(e,t.signal).then(()=>{x(null),m(null),S(new AbortController().signal)},e=>{v(`UnauthorizedApiError`)(e)&&n(r),x(null)})};return(0,A.jsxs)(u,{as:`section`,className:O.panel,padding:`default`,shape:`grouped`,children:[(0,A.jsxs)(`div`,{className:O.heading,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(d,{as:`h2`,variant:`section-title`,children:`Browsers`}),(0,A.jsx)(d,{as:`p`,tone:`secondary`,children:`Pair more browsers with a single-use code. Every browser gets its own session and can be revoked independently.`})]}),o._tag===`failed`?(0,A.jsx)(a,{onClick:()=>S(new AbortController().signal),children:`Retry`}):null]}),e?(0,A.jsxs)(`div`,{className:O.pairing,children:[(0,A.jsxs)(`label`,{className:O.permission,children:[(0,A.jsx)(`span`,{children:`New browser access`}),(0,A.jsxs)(`select`,{disabled:h===`issuing`,onChange:e=>{let t=e.currentTarget.value;(t===`workspace-owner`||t===`workspace-approver`)&&l(t)},value:c,children:[(0,A.jsx)(`option`,{value:`workspace-owner`,children:`Workspace owner`}),(0,A.jsx)(`option`,{value:`workspace-approver`,children:`Workspace approver`})]})]}),(0,A.jsx)(a,{loading:h===`issuing`,onClick:C,variant:`primary`,children:`Add browser`})]}):(0,A.jsx)(d,{as:`p`,tone:`secondary`,children:`A workspace owner can add or revoke browsers.`}),h===`failed`?(0,A.jsx)(d,{as:`p`,role:`alert`,tone:`secondary`,children:`The pairing code could not be created. Try again.`}):null,p===null?null:(0,A.jsxs)(`div`,{className:O.codeCard,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(d,{as:`h3`,variant:`label`,children:`Pairing code`}),(0,A.jsxs)(d,{as:`p`,tone:`secondary`,children:[`In the other browser, open `,(0,A.jsx)(`strong`,{children:`/pair`}),` and paste this code before`,` `,f(p.expiresAt),`.`]})]}),(0,A.jsx)(`code`,{className:O.code,children:p.pairingCode}),(0,A.jsx)(a,{onClick:()=>{P(p.pairingCode).then(y)},children:_?`Copied`:`Copy code`})]}),(0,A.jsx)(`div`,{className:O.sessions,"aria-live":`polite`,children:o._tag===`loading`?(0,A.jsx)(d,{as:`p`,tone:`secondary`,children:`Loading paired browsers…`}):o._tag===`failed`?(0,A.jsx)(d,{as:`p`,tone:`secondary`,children:`Paired browsers could not be loaded.`}):o.sessions.map(n=>{let r=n.sessionId===t.sessionId;return(0,A.jsxs)(`article`,{className:O.session,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(d,{as:`h3`,variant:`label`,children:[j(n.permission),r?` · This browser`:``]}),(0,A.jsx)(d,{as:`p`,tone:`secondary`,children:N(n)})]}),e&&!r&&n.revokedAt===null&&!M(n)?(0,A.jsx)(a,{loading:b===n.sessionId,onClick:()=>w(n.sessionId),children:`Revoke`}):null]},n.sessionId)})})]})},I={page:`_page_1cf73_1`,heading:`_heading_1cf73_9`,theme:`_theme_1cf73_10`,save:`_save_1cf73_11`,actions:`_actions_1cf73_12`,notice:`_notice_1cf73_34`,governance:`_governance_1cf73_39`,sections:`_sections_1cf73_47`,section:`_section_1cf73_47`,sectionHeading:`_sectionHeading_1cf73_60`,fields:`_fields_1cf73_61`,field:`_field_1cf73_61`,checkbox:`_checkbox_1cf73_79`,control:`_control_1cf73_92`},L=v(`ConflictApiError`),R=v(`UnauthorizedApiError`),z=(e,t,n,r=Object.is)=>r(e,t)?n:t,B=(e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n]),V=(e,t,n)=>{let r={schemaVersion:1,agent:{allowedProviders:z(e.agent.allowedProviders,t.agent.allowedProviders,n.agent.allowedProviders,B),defaultModel:z(e.agent.defaultModel,t.agent.defaultModel,n.agent.defaultModel),defaultProvider:z(e.agent.defaultProvider,t.agent.defaultProvider,n.agent.defaultProvider),profilePolicy:z(e.agent.profilePolicy,t.agent.profilePolicy,n.agent.profilePolicy),toolPolicy:z(e.agent.toolPolicy,t.agent.toolPolicy,n.agent.toolPolicy)},inference:{enabled:z(e.inference.enabled,t.inference.enabled,n.inference.enabled),minimumConfidencePercent:z(e.inference.minimumConfidencePercent,t.inference.minimumConfidencePercent,n.inference.minimumConfidencePercent)},investigation:{consecutiveFailureThreshold:z(e.investigation.consecutiveFailureThreshold,t.investigation.consecutiveFailureThreshold,n.investigation.consecutiveFailureThreshold),mode:z(e.investigation.mode,t.investigation.mode,n.investigation.mode)},jira:{commentMode:z(e.jira.commentMode,t.jira.commentMode,n.jira.commentMode),includeControlCenterAttribution:z(e.jira.includeControlCenterAttribution,t.jira.includeControlCenterAttribution,n.jira.includeControlCenterAttribution)},pipeline:{maximumAttempts:z(e.pipeline.maximumAttempts,t.pipeline.maximumAttempts,n.pipeline.maximumAttempts),retryMode:z(e.pipeline.retryMode,t.pipeline.retryMode,n.pipeline.retryMode)},presentation:{defaultLanding:z(e.presentation.defaultLanding,t.presentation.defaultLanding,n.presentation.defaultLanding),density:z(e.presentation.density,t.presentation.density,n.presentation.density)},retention:{agentActivityDays:z(e.retention.agentActivityDays,t.retention.agentActivityDays,n.retention.agentActivityDays),auditDays:z(e.retention.auditDays,t.retention.auditDays,n.retention.auditDays),contentDays:z(e.retention.contentDays,t.retention.contentDays,n.retention.contentDays),evidenceDays:z(e.retention.evidenceDays,t.retention.evidenceDays,n.retention.evidenceDays),sandboxArtifactDays:z(e.retention.sandboxArtifactDays,t.retention.sandboxArtifactDays,n.retention.sandboxArtifactDays)},synchronization:{cadence:z(e.synchronization.cadence,t.synchronization.cadence,n.synchronization.cadence),intervalMinutes:z(e.synchronization.intervalMinutes,t.synchronization.intervalMinutes,n.synchronization.intervalMinutes),staleAfterMinutes:z(e.synchronization.staleAfterMinutes,t.synchronization.staleAfterMinutes,n.synchronization.staleAfterMinutes)}};return _(S)(r)?r:null},H=(e,t,n=E)=>{let[r,i]=(0,D.useState)({_tag:`idle`}),a=(0,D.useRef)(r),[s,c]=(0,D.useState)(0),l=(0,D.useRef)(null),u=(0,D.useCallback)(e=>{a.current=e,i(e)},[]);(0,D.useEffect)(()=>{if(l.current?.abort(),e===null){u({_tag:`idle`});return}let r=new AbortController;return l.current=r,u({_tag:`loading`}),n.load(r.signal).then(e=>{r.signal.aborted||(o(e),u({_tag:`ready`,draft:e.settings,pendingMutationId:null,server:e,status:`saved`}))},n=>{r.signal.aborted||(R(n)&&t(e),u({_tag:`failed`}))}),()=>r.abort()},[t,s,e,u,n]);let d=(0,D.useCallback)(e=>{let t=a.current;t._tag!==`ready`||t.status===`saving`||u({...t,draft:e,pendingMutationId:null,status:C(t.server.settings,e).length===0?`saved`:`dirty`})},[u]),f=(0,D.useCallback)(()=>{if(e===null)return;let r=a.current;if(r._tag!==`ready`||r.status!==`dirty`&&r.status!==`failed`)return;let i=new AbortController;l.current?.abort(),l.current=i;let s=r.server,c=r.draft,d=C(s.settings,c).filter(x);u({...r,status:`saving`}),(r.pendingMutationId===null?n.makeMutationId():Promise.resolve(r.pendingMutationId)).then(r=>{n.update({mutationId:r,expectedRevision:s.revision,settings:c,acknowledgedGovernedSections:d},i.signal).then(e=>{i.signal.aborted||(o(e),u({_tag:`ready`,draft:e.settings,pendingMutationId:null,server:e,status:`saved`}))},a=>{if(!i.signal.aborted){if(R(a)){t(e),u({_tag:`failed`});return}if(!L(a)){u({_tag:`ready`,draft:c,pendingMutationId:r,server:s,status:`failed`});return}n.load(i.signal).then(e=>{i.signal.aborted||(o(e),u({_tag:`conflict`,base:s,candidate:c,latest:e,reapplyFailed:!1}))},n=>{if(!i.signal.aborted){if(R(n)){t(e),u({_tag:`failed`});return}u({_tag:`conflict-recovery-failed`,base:s,candidate:c})}})}})},()=>{i.signal.aborted||u({_tag:`ready`,draft:c,pendingMutationId:null,server:s,status:`failed`})})},[t,e,u,n]);return{discardConflict:(0,D.useCallback)(()=>{let e=a.current;e._tag===`conflict`&&u({_tag:`ready`,draft:e.latest.settings,pendingMutationId:null,server:e.latest,status:`saved`})},[u]),edit:d,reapplyConflict:(0,D.useCallback)(()=>{let e=a.current;if(e._tag!==`conflict`)return;let t=V(e.base.settings,e.candidate,e.latest.settings);if(t===null){u({...e,reapplyFailed:!0});return}u({_tag:`ready`,draft:t,pendingMutationId:null,server:e.latest,status:C(e.latest.settings,t).length===0?`saved`:`dirty`})},[u]),retry:()=>c(e=>e+1),retryConflict:(0,D.useCallback)(()=>{let r=a.current;if(r._tag!==`conflict-recovery-failed`)return;let i=new AbortController;l.current?.abort(),l.current=i;let{base:s,candidate:c}=r;u({_tag:`conflict-recovery-loading`,base:s,candidate:c}),n.load(i.signal).then(e=>{i.signal.aborted||(o(e),u({_tag:`conflict`,base:s,candidate:c,latest:e,reapplyFailed:!1}))},n=>{if(!i.signal.aborted){if(e!==null&&R(n)){t(e),u({_tag:`failed`});return}u({_tag:`conflict-recovery-failed`,base:s,candidate:c})}})},[t,e,u,n]),save:f,state:r}},U=(e,t)=>{let n=Number.parseInt(e.currentTarget.value,10);return Number.isNaN(n)?t:n},W=e=>[...new Set(e.split(`,`).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0))].sort(),G=({children:e,description:t,title:n})=>(0,A.jsxs)(u,{className:I.section,padding:`default`,shape:`grouped`,children:[(0,A.jsxs)(`div`,{className:I.sectionHeading,children:[(0,A.jsx)(d,{as:`h2`,variant:`section-title`,children:n}),(0,A.jsx)(d,{as:`p`,tone:`secondary`,children:t})]}),(0,A.jsx)(`div`,{className:I.fields,children:e})]}),K=({children:e,controlId:t,error:n,hint:r,label:i})=>(0,A.jsxs)(`label`,{className:I.field,htmlFor:t,children:[(0,A.jsx)(`span`,{children:i}),e,r===void 0?null:(0,A.jsx)(`small`,{children:r}),n===void 0?null:(0,A.jsx)(`small`,{id:t===void 0?void 0:`${t}-error`,role:`alert`,children:n})]}),q=({checked:e,disabled:t,label:n,onChange:r})=>(0,A.jsxs)(`label`,{className:I.checkbox,children:[(0,A.jsx)(`input`,{checked:e,disabled:t,onChange:e=>r(e.currentTarget.checked),type:`checkbox`}),(0,A.jsx)(`span`,{children:n})]}),J=({disabled:e,label:t,onChange:n,options:r,value:i})=>(0,A.jsx)(K,{label:t,children:(0,A.jsx)(`select`,{className:I.control,disabled:e,onChange:e=>{let t=r.find(([t])=>t===e.currentTarget.value);t!==void 0&&n(t[0])},value:i,children:r.map(([e,t])=>(0,A.jsx)(`option`,{value:e,children:t},e))})}),Y=[[`evidenceDays`,`Evidence (days)`,3650],[`contentDays`,`Content (days)`,3650],[`auditDays`,`Audit history (days)`,3650],[`agentActivityDays`,`Agent activity (days)`,365],[`sandboxArtifactDays`,`Sandbox artifacts (days)`,30]],X=({disabled:e,error:t,label:n,maximum:r,minimum:i,onChange:a,value:o})=>{let s=(0,D.useId)(),c=t??(!Number.isInteger(o)||o<i||o>r?`${n} must be a whole number from ${String(i)} to ${String(r)}.`:void 0);return(0,A.jsx)(K,{controlId:s,...c===void 0?{}:{error:c},label:n,children:(0,A.jsx)(`input`,{"aria-describedby":c===void 0?void 0:`${s}-error`,"aria-invalid":c!==void 0||void 0,className:I.control,disabled:e,id:s,max:r,min:i,onChange:e=>a(U(e,o)),type:`number`,value:o})})},Z=({canEdit:e,draft:t,onChange:n})=>{let r=!e,i=t.agent.allowedProviders.join(`, `),[a,o]=(0,D.useState)(i),s=(0,D.useRef)(i),c=(0,D.useRef)(!1),l=(e,r)=>n({...t,[e]:r}),u=e=>{let n=W(e);s.current=n.join(`, `),l(`agent`,{...t.agent,allowedProviders:n,defaultProvider:t.agent.defaultProvider!==null&&n.includes(t.agent.defaultProvider)?t.agent.defaultProvider:null,defaultModel:t.agent.defaultProvider!==null&&n.includes(t.agent.defaultProvider)?t.agent.defaultModel:null})};return(0,D.useEffect)(()=>{i!==s.current&&o(i),s.current=i},[i]),(0,A.jsxs)(`div`,{className:I.sections,children:[(0,A.jsxs)(G,{description:`Controls whether inferred delivery relationships are proposed and the confidence floor.`,title:`Inference`,children:[(0,A.jsx)(q,{checked:t.inference.enabled,disabled:r,label:`Enable relationship inference`,onChange:e=>l(`inference`,{...t.inference,enabled:e})}),(0,A.jsx)(X,{disabled:r,label:`Minimum confidence (%)`,maximum:100,minimum:0,onChange:e=>l(`inference`,{...t.inference,minimumConfidencePercent:e}),value:t.inference.minimumConfidencePercent})]}),(0,A.jsxs)(G,{description:`Records the intended synchronization cadence; Sync now remains the active execution path. Also sets the age at which source data is stale.`,title:`Synchronization`,children:[(0,A.jsx)(J,{disabled:r,label:`Cadence`,onChange:e=>l(`synchronization`,{...t.synchronization,cadence:e,intervalMinutes:e===`manual`?null:t.synchronization.intervalMinutes??60}),options:[[`manual`,`Manual`],[`interval`,`Scheduled interval`]],value:t.synchronization.cadence}),t.synchronization.intervalMinutes===null?null:(0,A.jsx)(X,{disabled:r,label:`Interval (minutes)`,maximum:10080,minimum:5,onChange:e=>l(`synchronization`,{...t.synchronization,intervalMinutes:e}),value:t.synchronization.intervalMinutes}),(0,A.jsx)(X,{disabled:r,label:`Stale after (minutes)`,maximum:43200,minimum:5,onChange:e=>l(`synchronization`,{...t.synchronization,staleAfterMinutes:e}),value:t.synchronization.staleAfterMinutes})]}),(0,A.jsx)(G,{description:`Governed lifecycle policy. Evidence expiry applies to new materialization; bounded final-class sweeps run through lifecycle operations.`,title:`Retention`,children:Y.map(([e,n,i])=>(0,D.createElement)(X,{disabled:r,...(()=>{let n=(e===`evidenceDays`||e===`auditDays`)&&t.retention.auditDays<t.retention.evidenceDays?`Audit retention must be at least as long as evidence retention.`:(e===`agentActivityDays`||e===`sandboxArtifactDays`)&&t.retention.agentActivityDays<t.retention.sandboxArtifactDays?`Agent activity retention must be at least as long as sandbox artifact retention.`:void 0;return n===void 0?{}:{error:n}})(),key:e,label:n,maximum:i,minimum:1,onChange:n=>l(`retention`,{...t.retention,[e]:n}),value:t.retention[e]}))}),(0,A.jsxs)(G,{description:`Records the threshold for investigation automation; investigation creation currently remains manual.`,title:`Investigation`,children:[(0,A.jsx)(J,{disabled:r,label:`Mode`,onChange:e=>l(`investigation`,{...t.investigation,mode:e}),options:[[`manual`,`Manual`],[`automatic`,`Automatic`]],value:t.investigation.mode}),(0,A.jsx)(X,{disabled:r,label:`Consecutive failure threshold`,maximum:20,minimum:1,onChange:e=>l(`investigation`,{...t.investigation,consecutiveFailureThreshold:e}),value:t.investigation.consecutiveFailureThreshold})]}),(0,A.jsxs)(G,{description:`Governed publishing defaults. Credentials and tokens never belong in workspace settings.`,title:`Jira`,children:[(0,A.jsx)(J,{disabled:r,label:`Comment publishing`,onChange:e=>l(`jira`,{...t.jira,commentMode:e}),options:[[`manual-only`,`Manual only`],[`confirm-before-publish`,`Confirm before publishing`]],value:t.jira.commentMode}),(0,A.jsx)(q,{checked:t.jira.includeControlCenterAttribution,disabled:r,label:`Include Control Center attribution`,onChange:e=>l(`jira`,{...t.jira,includeControlCenterAttribution:e})})]}),(0,A.jsxs)(G,{description:`Governed retry defaults for pipeline operations.`,title:`Pipeline`,children:[(0,A.jsx)(J,{disabled:r,label:`Retry behavior`,onChange:e=>l(`pipeline`,{...t.pipeline,retryMode:e}),options:[[`manual-only`,`Manual only`],[`confirm-before-retry`,`Confirm before retry`]],value:t.pipeline.retryMode}),(0,A.jsx)(X,{disabled:r,label:`Maximum attempts`,maximum:10,minimum:1,onChange:e=>l(`pipeline`,{...t.pipeline,maximumAttempts:e}),value:t.pipeline.maximumAttempts})]}),(0,A.jsxs)(G,{description:`Governed provider and sandbox policy. Provider identifiers are names only, never secrets.`,title:`Agent`,children:[(0,A.jsx)(K,{hint:`Comma-separated lowercase identifiers; saved in canonical order.`,label:`Allowed providers`,children:(0,A.jsx)(`input`,{className:I.control,disabled:r,onBlur:()=>o(i),onCompositionEnd:e=>{c.current=!1,u(e.currentTarget.value)},onCompositionStart:()=>{c.current=!0},onChange:e=>{let t=e.currentTarget.value;o(t),c.current||u(t)},type:`text`,value:a})}),(0,A.jsx)(K,{label:`Default provider`,children:(0,A.jsx)(`input`,{className:I.control,disabled:r,list:`allowed-agent-providers`,onChange:e=>{let n=e.currentTarget.value.trim().toLowerCase()||null;l(`agent`,{...t.agent,defaultProvider:n,defaultModel:n===null?null:t.agent.defaultModel})},type:`text`,value:t.agent.defaultProvider??``})}),(0,A.jsx)(`datalist`,{id:`allowed-agent-providers`,children:t.agent.allowedProviders.map(e=>(0,A.jsx)(`option`,{value:e},e))}),(0,A.jsx)(K,{label:`Default model`,children:(0,A.jsx)(`input`,{className:I.control,disabled:r||t.agent.defaultProvider===null,onChange:e=>l(`agent`,{...t.agent,defaultModel:e.currentTarget.value.trim()||null}),type:`text`,value:t.agent.defaultModel??``})}),(0,A.jsx)(J,{disabled:r,label:`Tool policy`,onChange:e=>l(`agent`,{...t.agent,toolPolicy:e}),options:[[`read-only`,`Read only`],[`review-sandbox`,`Review sandbox`]],value:t.agent.toolPolicy}),(0,A.jsx)(J,{disabled:r,label:`Profile policy`,onChange:e=>l(`agent`,{...t.agent,profilePolicy:e}),options:[[`isolated`,`Isolated`],[`local-profile`,`Local profile`]],value:t.agent.profilePolicy})]}),(0,A.jsxs)(G,{description:`Workspace presentation defaults shared by collaborators.`,title:`Presentation`,children:[(0,A.jsx)(J,{disabled:r,label:`Density`,onChange:e=>l(`presentation`,{...t.presentation,density:e}),options:[[`comfortable`,`Comfortable`],[`compact`,`Compact`]],value:t.presentation.density}),(0,A.jsx)(J,{disabled:r,label:`Default landing`,onChange:e=>l(`presentation`,{...t.presentation,defaultLanding:e}),options:[[`overview`,`Overview`],[`active-work`,`Active work`]],value:t.presentation.defaultLanding})]})]})},Q=({browserSessionTransport:e,transport:t=E}={})=>{let r=s(),o=n().workspaceId,f=r.state._tag===`authenticated`||r.state._tag===`storage-unavailable`?r.state.session:null,p=f===null||o===f.workspaceId,m=p?l(r.state):null,h=H(m,r.invalidateSession,t),g=c(),[v,y]=(0,D.useState)(null),b=r.state._tag===`authenticated`&&f?.permission===`workspace-owner`;if(!p)return(0,A.jsx)(i,{description:`This route does not match the workspace authorized for the current browser session.`,title:`Workspace not found`,tone:`critical`});if(m===null&&r.state._tag!==`checking`){let e=r.state._tag===`anonymous`;return(0,A.jsx)(i,{description:e?`Sign in to inspect the settings authorized for this workspace.`:`The current browser session cannot read workspace settings.`,title:e?`Authentication required`:`Settings unavailable`,tone:e?`caution`:`critical`})}if(h.state._tag===`idle`||h.state._tag===`loading`)return(0,A.jsx)(i,{title:`Loading workspace settings`});if(h.state._tag===`failed`)return(0,A.jsx)(i,{action:(0,A.jsx)(a,{onClick:h.retry,children:`Retry`}),description:`The current settings document could not be loaded.`,title:`Settings unavailable`,tone:`critical`});if(h.state._tag===`conflict-recovery-failed`)return(0,A.jsx)(i,{action:(0,A.jsx)(a,{onClick:h.retryConflict,children:`Retry latest revision`}),description:`Your unsaved draft is retained, but the latest server revision could not be loaded.`,title:`Conflict recovery interrupted`,tone:`critical`});if(h.state._tag===`conflict-recovery-loading`)return(0,A.jsx)(i,{description:`Your unsaved draft is retained while the latest server revision is loaded.`,title:`Retrying conflict recovery`});if(h.state._tag===`conflict`)return(0,A.jsx)(`div`,{className:I.page,children:(0,A.jsx)(i,{action:(0,A.jsxs)(`div`,{className:I.actions,children:[(0,A.jsx)(a,{onClick:h.discardConflict,children:`Use latest`}),h.state.reapplyFailed?null:(0,A.jsx)(a,{onClick:h.reapplyConflict,variant:`primary`,children:`Reapply my changes`})]}),description:h.state.reapplyFailed?`Your changed fields cannot be combined safely with the latest settings. Use the latest document, then re-enter and review your changes.`:`Another session saved revision ${String(h.state.latest.revision)}. Choose the latest document or reapply only the fields you changed, then review and save.`,title:h.state.reapplyFailed?`Settings conflict needs manual recovery`:`Settings changed in another session`,tone:`caution`})});let{draft:w,server:T,status:O}=h.state,k=C(T.settings,w).filter(x),j=k.length>0,M=j?JSON.stringify([T.revision,...k.map(e=>[e,w[e]])]):null,N=M!==null&&v===M,P=_(S)(w),L=w.agent.profilePolicy===`local-profile`;return(0,A.jsxs)(`div`,{className:I.page,children:[(0,A.jsxs)(`header`,{className:I.heading,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(d,{as:`h1`,variant:`page-title`,children:`Workspace settings`}),(0,A.jsxs)(d,{as:`p`,tone:`secondary`,children:[`Revision `,T.revision,`. Changes are protected against stale writes and attributable to the current session.`]})]}),(0,A.jsxs)(`div`,{className:I.save,children:[(0,A.jsx)(`span`,{"aria-live":`polite`,children:O===`saving`?`Saving…`:O===`failed`?`Save failed — retry when ready`:O===`dirty`?`Unsaved changes`:`Saved`}),(0,A.jsx)(a,{disabled:!b||O!==`dirty`&&O!==`failed`||!P||L||j&&!N,loading:O===`saving`,onClick:h.save,variant:`primary`,children:`Save settings`})]})]}),b?null:(0,A.jsx)(d,{as:`p`,className:I.notice,tone:`secondary`,children:f?.permission===`workspace-approver`?`Approvers can inspect settings. A workspace owner must save changes.`:`A workspace-owner session with mutation storage is required to change settings.`}),b&&!P?(0,A.jsx)(d,{as:`p`,className:I.notice,tone:`secondary`,children:`Correct the highlighted bounds and policy relationships before saving. Audit retention must cover evidence, sandbox artifacts must expire before agent activity, and default agent providers must be allowed.`}):null,b&&L?(0,A.jsx)(d,{as:`p`,className:I.notice,tone:`secondary`,children:`Local profile is unavailable: no installed CLI capability generation proves that hooks, plugins, MCP servers, browser control, and extra writable roots are disabled. Compared with isolated mode, those surfaces would be added and must be verified before this governed policy can be saved.`}):null,b&&j?(0,A.jsx)(u,{className:I.governance,padding:`default`,shape:`grouped`,children:(0,A.jsx)(q,{checked:N,disabled:O===`saving`,label:`I reviewed the governed ${k.join(`, `)} policy change${k.length===1?``:`s`} and authorize this exact revision.`,onChange:e=>y(e?M:null)})}):null,f===null||m===null?null:(0,A.jsx)(F,{canManage:b,currentSession:f,onSessionExpired:r.invalidateSession,sessionKey:m,...e===void 0?{}:{transport:e}}),(0,A.jsxs)(u,{className:I.theme,padding:`default`,shape:`grouped`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(d,{as:`h2`,variant:`section-title`,children:`Theme`}),(0,A.jsx)(d,{as:`p`,tone:`secondary`,children:`This preference is browser-local and is never sent to the server.`})]}),(0,A.jsxs)(`select`,{"aria-label":`Theme`,className:I.control,onChange:e=>{let t=e.currentTarget.value;(t===`dark`||t===`light`||t===`system`)&&g.setTheme(t)},value:g.theme,children:[(0,A.jsx)(`option`,{value:`system`,children:`System`}),(0,A.jsx)(`option`,{value:`light`,children:`Light`}),(0,A.jsx)(`option`,{value:`dark`,children:`Dark`})]})]}),(0,A.jsx)(Z,{canEdit:b&&O!==`saving`,draft:w,onChange:e=>{y(null),h.edit(e)}})]})};export{Z as SettingsForm,Q as WorkspaceSettingsPage};
|
|
2
|
+
//# sourceMappingURL=WorkspaceSettingsPage-JG-pN_CA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceSettingsPage-JG-pN_CA.js","names":[],"sources":["../../../src/client/settings/BrowserSessionsPanel.module.css","../../../src/client/settings/browserSessionTransport.ts","../../../src/client/settings/BrowserSessionsPanel.tsx","../../../src/client/settings/WorkspaceSettingsPage.module.css","../../../src/client/settings/useWorkspaceSettings.ts","../../../src/client/settings/WorkspaceSettingsPage.tsx"],"sourcesContent":[".panel {\n display: grid;\n gap: var(--rly-space-40);\n padding: var(--rly-space-48);\n}\n\n.heading,\n.pairing,\n.codeCard,\n.session {\n align-items: center;\n display: flex;\n gap: var(--rly-space-32);\n justify-content: space-between;\n}\n\n.heading > div,\n.codeCard > div,\n.session > div {\n display: grid;\n gap: var(--rly-space-12);\n}\n\n.pairing {\n align-items: end;\n justify-content: flex-start;\n}\n\n.permission {\n display: grid;\n font-size: var(--rly-type-label-size);\n gap: var(--rly-space-12);\n min-inline-size: 16rem;\n}\n\n.permission > span {\n color: var(--rly-color-text-1);\n font-weight: 550;\n}\n\n.permission > select {\n background: var(--rly-color-surface-1);\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: inherit;\n min-height: 2.5rem;\n padding: 0 var(--rly-space-24);\n}\n\n.codeCard {\n align-items: stretch;\n background: var(--rly-color-surface-2);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-group);\n flex-wrap: wrap;\n padding: var(--rly-space-32);\n}\n\n.code {\n align-self: center;\n font-size: var(--rly-type-meta-size);\n overflow-wrap: anywhere;\n}\n\n.sessions {\n border-top: 1px solid var(--rly-color-border-2);\n display: grid;\n}\n\n.session {\n border-bottom: 1px solid var(--rly-color-border-2);\n padding: var(--rly-space-24) 0;\n}\n\n@media (max-width: 52rem) {\n .heading,\n .pairing,\n .codeCard,\n .session {\n align-items: stretch;\n flex-direction: column;\n }\n\n .permission {\n min-inline-size: 0;\n }\n}\n","import * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type {\n BrowserPairingPermission,\n IssueBrowserPairingCodeResponse,\n SessionListResponse\n} from \"../../api/session.js\"\nimport type { SessionId } from \"../../domain/identifiers.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\n/** Browser boundary for owner-managed browser pairing and targeted session revocation. */\nexport interface BrowserSessionAdministrationTransport {\n readonly issuePairingCode: (\n permission: BrowserPairingPermission,\n signal: AbortSignal\n ) => Promise<IssueBrowserPairingCodeResponse>\n readonly list: (signal: AbortSignal) => Promise<SessionListResponse>\n readonly revoke: (sessionId: SessionId, signal: AbortSignal) => Promise<void>\n}\n\n/** Generated API transport for workspace-scoped browser session administration. */\nexport const browserSessionAdministrationTransport: BrowserSessionAdministrationTransport = {\n issuePairingCode: (permission, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.session.issueBrowserPairingCode({ payload: { permission } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n list: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.session.list()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n revoke: (sessionId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n yield* client.session.revoke({ params: { sessionId } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n","import { Button, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Predicate from \"effect/Predicate\"\nimport { type ReactElement, useCallback, useEffect, useState } from \"react\"\n\nimport type {\n BrowserPairingPermission,\n IssueBrowserPairingCodeResponse,\n SessionListResponse,\n SessionSummary\n} from \"../../api/session.js\"\nimport type { SessionId } from \"../../domain/identifiers.js\"\nimport styles from \"./BrowserSessionsPanel.module.css\"\nimport {\n browserSessionAdministrationTransport,\n type BrowserSessionAdministrationTransport\n} from \"./browserSessionTransport.js\"\n\ntype SessionsState =\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"ready\"; readonly sessions: SessionListResponse }\n\nconst permissionLabel = (permission: SessionSummary[\"permission\"]): string =>\n permission === \"workspace-owner\"\n ? \"Workspace owner\"\n : permission === \"workspace-approver\"\n ? \"Workspace approver\"\n : permission\n\nconst sessionExpired = (session: SessionSummary, now = DateTime.nowUnsafe()): boolean =>\n DateTime.Order(now, session.idleExpiresAt) >= 0 || DateTime.Order(now, session.absoluteExpiresAt) >= 0\n\nexport const sessionStatus = (session: SessionSummary, now = DateTime.nowUnsafe()): string =>\n session.revokedAt !== null\n ? `Revoked ${DateTime.formatIso(session.revokedAt)}`\n : sessionExpired(session, now)\n ? `Expired · last used ${DateTime.formatIso(session.lastSeenAt)}`\n : `Active · last used ${DateTime.formatIso(session.lastSeenAt)}`\n\nconst copyPairingCode = async (pairingCode: string): Promise<boolean> => {\n try {\n await navigator.clipboard.writeText(pairingCode)\n return true\n } catch {\n return false\n }\n}\n\n/** Owner-facing browser pairing and independent session administration. */\nexport const BrowserSessionsPanel = ({\n canManage,\n currentSession,\n onSessionExpired,\n sessionKey,\n transport = browserSessionAdministrationTransport\n}: {\n readonly canManage: boolean\n readonly currentSession: SessionSummary\n readonly onSessionExpired: (sessionKey: string) => void\n readonly sessionKey: string\n /** Injectable browser boundary for component acceptance tests. @internal */\n readonly transport?: BrowserSessionAdministrationTransport\n}): ReactElement => {\n const [state, setState] = useState<SessionsState>({ _tag: \"loading\" })\n const [permission, setPermission] = useState<BrowserPairingPermission>(\"workspace-owner\")\n const [issued, setIssued] = useState<IssueBrowserPairingCodeResponse | null>(null)\n const [issueState, setIssueState] = useState<\"failed\" | \"idle\" | \"issuing\">(\"idle\")\n const [copied, setCopied] = useState(false)\n const [revokingSessionId, setRevokingSessionId] = useState<SessionId | null>(null)\n\n const load = useCallback(\n (signal: AbortSignal): void => {\n setState({ _tag: \"loading\" })\n void transport.list(signal).then(\n (sessions) => setState({ _tag: \"ready\", sessions }),\n (failure) => {\n if (signal.aborted) return\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n }\n )\n },\n [onSessionExpired, sessionKey, transport]\n )\n\n useEffect(() => {\n const controller = new AbortController()\n load(controller.signal)\n return () => controller.abort()\n }, [load])\n\n const issuePairingCode = (): void => {\n const controller = new AbortController()\n setIssueState(\"issuing\")\n setIssued(null)\n setCopied(false)\n void transport.issuePairingCode(permission, controller.signal).then(\n (result) => {\n setIssued(result)\n setIssueState(\"idle\")\n },\n (failure) => {\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) onSessionExpired(sessionKey)\n setIssueState(\"failed\")\n }\n )\n }\n\n const revoke = (sessionId: SessionId): void => {\n const controller = new AbortController()\n setRevokingSessionId(sessionId)\n void transport.revoke(sessionId, controller.signal).then(\n () => {\n setRevokingSessionId(null)\n setIssued(null)\n load(new AbortController().signal)\n },\n (failure) => {\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) onSessionExpired(sessionKey)\n setRevokingSessionId(null)\n }\n )\n }\n\n return (\n <Surface as=\"section\" className={styles.panel} padding=\"default\" shape=\"grouped\">\n <div className={styles.heading}>\n <div>\n <Text as=\"h2\" variant=\"section-title\">\n Browsers\n </Text>\n <Text as=\"p\" tone=\"secondary\">\n Pair more browsers with a single-use code. Every browser gets its own session and can be revoked\n independently.\n </Text>\n </div>\n {state._tag === \"failed\" ? <Button onClick={() => load(new AbortController().signal)}>Retry</Button> : null}\n </div>\n\n {canManage ? (\n <div className={styles.pairing}>\n <label className={styles.permission}>\n <span>New browser access</span>\n <select\n disabled={issueState === \"issuing\"}\n onChange={(event) => {\n const next = event.currentTarget.value\n if (next === \"workspace-owner\" || next === \"workspace-approver\") setPermission(next)\n }}\n value={permission}\n >\n <option value=\"workspace-owner\">Workspace owner</option>\n <option value=\"workspace-approver\">Workspace approver</option>\n </select>\n </label>\n <Button loading={issueState === \"issuing\"} onClick={issuePairingCode} variant=\"primary\">\n Add browser\n </Button>\n </div>\n ) : (\n <Text as=\"p\" tone=\"secondary\">\n A workspace owner can add or revoke browsers.\n </Text>\n )}\n\n {issueState === \"failed\" ? (\n <Text as=\"p\" role=\"alert\" tone=\"secondary\">\n The pairing code could not be created. Try again.\n </Text>\n ) : null}\n {issued === null ? null : (\n <div className={styles.codeCard}>\n <div>\n <Text as=\"h3\" variant=\"label\">\n Pairing code\n </Text>\n <Text as=\"p\" tone=\"secondary\">\n In the other browser, open <strong>/pair</strong> and paste this code before{\" \"}\n {DateTime.formatIso(issued.expiresAt)}.\n </Text>\n </div>\n <code className={styles.code}>{issued.pairingCode}</code>\n <Button\n onClick={() => {\n void copyPairingCode(issued.pairingCode).then(setCopied)\n }}\n >\n {copied ? \"Copied\" : \"Copy code\"}\n </Button>\n </div>\n )}\n\n <div className={styles.sessions} aria-live=\"polite\">\n {state._tag === \"loading\" ? (\n <Text as=\"p\" tone=\"secondary\">\n Loading paired browsers…\n </Text>\n ) : state._tag === \"failed\" ? (\n <Text as=\"p\" tone=\"secondary\">\n Paired browsers could not be loaded.\n </Text>\n ) : (\n state.sessions.map((session) => {\n const isCurrent = session.sessionId === currentSession.sessionId\n return (\n <article className={styles.session} key={session.sessionId}>\n <div>\n <Text as=\"h3\" variant=\"label\">\n {permissionLabel(session.permission)}\n {isCurrent ? \" · This browser\" : \"\"}\n </Text>\n <Text as=\"p\" tone=\"secondary\">\n {sessionStatus(session)}\n </Text>\n </div>\n {canManage && !isCurrent && session.revokedAt === null && !sessionExpired(session) ? (\n <Button loading={revokingSessionId === session.sessionId} onClick={() => revoke(session.sessionId)}>\n Revoke\n </Button>\n ) : null}\n </article>\n )\n })\n )}\n </div>\n </Surface>\n )\n}\n",".page {\n display: grid;\n gap: var(--rly-space-64);\n margin: 0 auto;\n max-width: 72rem;\n padding: var(--rly-space-64) var(--rly-space-48) var(--rly-space-96);\n}\n\n.heading,\n.theme,\n.save,\n.actions {\n align-items: center;\n display: flex;\n gap: var(--rly-space-32);\n justify-content: space-between;\n}\n\n.heading > div:first-child,\n.theme > div {\n display: grid;\n gap: var(--rly-space-12);\n}\n\n.save {\n flex: none;\n}\n\n.save > span {\n color: var(--rly-color-text-2);\n font-size: var(--rly-type-meta-size);\n}\n\n.notice {\n border-left: 2px solid var(--rly-color-border-2);\n padding-left: var(--rly-space-32);\n}\n\n.governance {\n border-color: var(--rly-color-border-2);\n}\n\n.theme {\n padding: var(--rly-space-48);\n}\n\n.sections {\n display: grid;\n gap: var(--rly-space-48);\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.section {\n align-content: start;\n display: grid;\n gap: var(--rly-space-40);\n padding: var(--rly-space-48);\n}\n\n.sectionHeading,\n.fields {\n display: grid;\n gap: var(--rly-space-16);\n min-inline-size: 0;\n}\n\n.fields {\n gap: var(--rly-space-32);\n}\n\n.field {\n display: grid;\n font-size: var(--rly-type-label-size);\n gap: var(--rly-space-12);\n min-inline-size: 0;\n}\n\n.field > span,\n.checkbox > span {\n color: var(--rly-color-text-1);\n font-weight: 550;\n}\n\n.checkbox > span {\n overflow-wrap: anywhere;\n}\n\n.field > small {\n color: var(--rly-color-text-2);\n}\n\n.control {\n background: var(--rly-color-surface-1);\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: inherit;\n inline-size: 100%;\n min-height: 2.5rem;\n min-inline-size: 0;\n padding: 0 var(--rly-space-24);\n}\n\n.control:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: 2px;\n}\n\n.control:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.checkbox {\n align-items: center;\n display: flex;\n gap: var(--rly-space-20);\n}\n\n.checkbox > input {\n height: 1rem;\n width: 1rem;\n}\n\n@media (max-width: 52rem) {\n .page {\n padding-inline: var(--rly-space-32);\n }\n\n .heading,\n .theme {\n align-items: stretch;\n flex-direction: column;\n }\n\n .save {\n justify-content: flex-end;\n }\n\n .sections {\n grid-template-columns: 1fr;\n }\n}\n","import * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport type { WorkspaceSettingsReadModel } from \"../../api/workspaceSettings.js\"\nimport type { WorkspaceSettingsMutationId } from \"../../domain/identifiers.js\"\nimport {\n changedWorkspaceSettingsSections,\n isGovernedWorkspaceSettingsSection,\n WorkspaceSettingsV1\n} from \"../../domain/workspaceSettings.js\"\nimport { publishWorkspaceSettings } from \"./workspaceSettingsSignals.js\"\nimport { browserWorkspaceSettingsTransport, type WorkspaceSettingsTransport } from \"./workspaceSettingsTransport.js\"\n\nexport type WorkspaceSettingsState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | {\n readonly _tag: \"ready\"\n readonly draft: WorkspaceSettingsV1\n readonly pendingMutationId: WorkspaceSettingsMutationId | null\n readonly server: WorkspaceSettingsReadModel\n readonly status: \"dirty\" | \"failed\" | \"saved\" | \"saving\"\n }\n | {\n readonly _tag: \"conflict\"\n readonly base: WorkspaceSettingsReadModel\n readonly candidate: WorkspaceSettingsV1\n readonly latest: WorkspaceSettingsReadModel\n readonly reapplyFailed: boolean\n }\n | {\n readonly _tag: \"conflict-recovery-failed\"\n readonly base: WorkspaceSettingsReadModel\n readonly candidate: WorkspaceSettingsV1\n }\n | {\n readonly _tag: \"conflict-recovery-loading\"\n readonly base: WorkspaceSettingsReadModel\n readonly candidate: WorkspaceSettingsV1\n }\n\nconst isConflict = Predicate.isTagged(\"ConflictApiError\")\nconst isUnauthorized = Predicate.isTagged(\"UnauthorizedApiError\")\n\nconst localChangeOrLatest = <Value>(\n base: Value,\n candidate: Value,\n latest: Value,\n equivalent: (left: Value, right: Value) => boolean = Object.is\n): Value => equivalent(base, candidate) ? latest : candidate\n\nconst stringArraysEqual = (\n left: ReadonlyArray<string>,\n right: ReadonlyArray<string>\n): boolean =>\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n\n/** Reapply locally changed fields over a freshly loaded server document. */\nexport const reapplyWorkspaceSettingsCandidate = (\n base: WorkspaceSettingsV1,\n candidate: WorkspaceSettingsV1,\n latest: WorkspaceSettingsV1\n): WorkspaceSettingsV1 | null => {\n const recovered = {\n schemaVersion: 1,\n agent: {\n allowedProviders: localChangeOrLatest(\n base.agent.allowedProviders,\n candidate.agent.allowedProviders,\n latest.agent.allowedProviders,\n stringArraysEqual\n ),\n defaultModel: localChangeOrLatest(\n base.agent.defaultModel,\n candidate.agent.defaultModel,\n latest.agent.defaultModel\n ),\n defaultProvider: localChangeOrLatest(\n base.agent.defaultProvider,\n candidate.agent.defaultProvider,\n latest.agent.defaultProvider\n ),\n profilePolicy: localChangeOrLatest(\n base.agent.profilePolicy,\n candidate.agent.profilePolicy,\n latest.agent.profilePolicy\n ),\n toolPolicy: localChangeOrLatest(\n base.agent.toolPolicy,\n candidate.agent.toolPolicy,\n latest.agent.toolPolicy\n )\n },\n inference: {\n enabled: localChangeOrLatest(\n base.inference.enabled,\n candidate.inference.enabled,\n latest.inference.enabled\n ),\n minimumConfidencePercent: localChangeOrLatest(\n base.inference.minimumConfidencePercent,\n candidate.inference.minimumConfidencePercent,\n latest.inference.minimumConfidencePercent\n )\n },\n investigation: {\n consecutiveFailureThreshold: localChangeOrLatest(\n base.investigation.consecutiveFailureThreshold,\n candidate.investigation.consecutiveFailureThreshold,\n latest.investigation.consecutiveFailureThreshold\n ),\n mode: localChangeOrLatest(\n base.investigation.mode,\n candidate.investigation.mode,\n latest.investigation.mode\n )\n },\n jira: {\n commentMode: localChangeOrLatest(\n base.jira.commentMode,\n candidate.jira.commentMode,\n latest.jira.commentMode\n ),\n includeControlCenterAttribution: localChangeOrLatest(\n base.jira.includeControlCenterAttribution,\n candidate.jira.includeControlCenterAttribution,\n latest.jira.includeControlCenterAttribution\n )\n },\n pipeline: {\n maximumAttempts: localChangeOrLatest(\n base.pipeline.maximumAttempts,\n candidate.pipeline.maximumAttempts,\n latest.pipeline.maximumAttempts\n ),\n retryMode: localChangeOrLatest(\n base.pipeline.retryMode,\n candidate.pipeline.retryMode,\n latest.pipeline.retryMode\n )\n },\n presentation: {\n defaultLanding: localChangeOrLatest(\n base.presentation.defaultLanding,\n candidate.presentation.defaultLanding,\n latest.presentation.defaultLanding\n ),\n density: localChangeOrLatest(\n base.presentation.density,\n candidate.presentation.density,\n latest.presentation.density\n )\n },\n retention: {\n agentActivityDays: localChangeOrLatest(\n base.retention.agentActivityDays,\n candidate.retention.agentActivityDays,\n latest.retention.agentActivityDays\n ),\n auditDays: localChangeOrLatest(\n base.retention.auditDays,\n candidate.retention.auditDays,\n latest.retention.auditDays\n ),\n contentDays: localChangeOrLatest(\n base.retention.contentDays,\n candidate.retention.contentDays,\n latest.retention.contentDays\n ),\n evidenceDays: localChangeOrLatest(\n base.retention.evidenceDays,\n candidate.retention.evidenceDays,\n latest.retention.evidenceDays\n ),\n sandboxArtifactDays: localChangeOrLatest(\n base.retention.sandboxArtifactDays,\n candidate.retention.sandboxArtifactDays,\n latest.retention.sandboxArtifactDays\n )\n },\n synchronization: {\n cadence: localChangeOrLatest(\n base.synchronization.cadence,\n candidate.synchronization.cadence,\n latest.synchronization.cadence\n ),\n intervalMinutes: localChangeOrLatest(\n base.synchronization.intervalMinutes,\n candidate.synchronization.intervalMinutes,\n latest.synchronization.intervalMinutes\n ),\n staleAfterMinutes: localChangeOrLatest(\n base.synchronization.staleAfterMinutes,\n candidate.synchronization.staleAfterMinutes,\n latest.synchronization.staleAfterMinutes\n )\n }\n }\n return Schema.is(WorkspaceSettingsV1)(recovered) ? recovered : null\n}\n\n/** Own one session-isolated settings document and its explicit stale-write recovery. */\nexport const useWorkspaceSettings = (\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: WorkspaceSettingsTransport = browserWorkspaceSettingsTransport\n): {\n readonly discardConflict: () => void\n readonly edit: (draft: WorkspaceSettingsV1) => void\n readonly reapplyConflict: () => void\n readonly retry: () => void\n readonly retryConflict: () => void\n readonly save: () => void\n readonly state: WorkspaceSettingsState\n} => {\n const [state, setReactState] = useState<WorkspaceSettingsState>({ _tag: \"idle\" })\n const stateRef = useRef<WorkspaceSettingsState>(state)\n const [requestRevision, setRequestRevision] = useState(0)\n const activeRequest = useRef<AbortController | null>(null)\n const setState = useCallback((next: WorkspaceSettingsState): void => {\n stateRef.current = next\n setReactState(next)\n }, [])\n\n useEffect(() => {\n activeRequest.current?.abort()\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n activeRequest.current = request\n setState({ _tag: \"loading\" })\n transport.load(request.signal).then(\n (server) => {\n if (!request.signal.aborted) {\n publishWorkspaceSettings(server)\n setState({\n _tag: \"ready\",\n draft: server.settings,\n pendingMutationId: null,\n server,\n status: \"saved\"\n })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorized(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n }\n )\n return () => request.abort()\n }, [onSessionExpired, requestRevision, sessionKey, setState, transport])\n\n const edit = useCallback((draft: WorkspaceSettingsV1): void => {\n const current = stateRef.current\n if (current._tag !== \"ready\" || current.status === \"saving\") return\n setState({\n ...current,\n draft,\n pendingMutationId: null,\n status: changedWorkspaceSettingsSections(current.server.settings, draft).length === 0\n ? \"saved\"\n : \"dirty\"\n })\n }, [setState])\n\n const save = useCallback((): void => {\n if (sessionKey === null) return\n const current = stateRef.current\n if (\n current._tag !== \"ready\" ||\n (current.status !== \"dirty\" && current.status !== \"failed\")\n ) return\n const request = new AbortController()\n activeRequest.current?.abort()\n activeRequest.current = request\n const base = current.server\n const candidate = current.draft\n const changed = changedWorkspaceSettingsSections(base.settings, candidate)\n const governed = changed.filter(isGovernedWorkspaceSettingsSection)\n setState({ ...current, status: \"saving\" })\n const mutationIdPromise = current.pendingMutationId === null\n ? transport.makeMutationId()\n : Promise.resolve(current.pendingMutationId)\n mutationIdPromise.then(\n (mutationId) => {\n transport.update({\n mutationId,\n expectedRevision: base.revision,\n settings: candidate,\n acknowledgedGovernedSections: governed\n }, request.signal).then(\n (server) => {\n if (request.signal.aborted) return\n publishWorkspaceSettings(server)\n setState({\n _tag: \"ready\",\n draft: server.settings,\n pendingMutationId: null,\n server,\n status: \"saved\"\n })\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorized(failure)) {\n onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n return\n }\n if (!isConflict(failure)) {\n setState({\n _tag: \"ready\",\n draft: candidate,\n pendingMutationId: mutationId,\n server: base,\n status: \"failed\"\n })\n return\n }\n transport.load(request.signal).then(\n (latest) => {\n if (!request.signal.aborted) {\n publishWorkspaceSettings(latest)\n setState({ _tag: \"conflict\", base, candidate, latest, reapplyFailed: false })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorized(failure)) {\n onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n return\n }\n setState({ _tag: \"conflict-recovery-failed\", base, candidate })\n }\n )\n }\n )\n },\n () => {\n if (!request.signal.aborted) {\n setState({\n _tag: \"ready\",\n draft: candidate,\n pendingMutationId: null,\n server: base,\n status: \"failed\"\n })\n }\n }\n )\n }, [onSessionExpired, sessionKey, setState, transport])\n\n const discardConflict = useCallback((): void => {\n const current = stateRef.current\n if (current._tag !== \"conflict\") return\n setState({\n _tag: \"ready\",\n draft: current.latest.settings,\n pendingMutationId: null,\n server: current.latest,\n status: \"saved\"\n })\n }, [setState])\n\n const reapplyConflict = useCallback((): void => {\n const current = stateRef.current\n if (current._tag !== \"conflict\") return\n const draft = reapplyWorkspaceSettingsCandidate(\n current.base.settings,\n current.candidate,\n current.latest.settings\n )\n if (draft === null) {\n setState({ ...current, reapplyFailed: true })\n return\n }\n setState({\n _tag: \"ready\",\n draft,\n pendingMutationId: null,\n server: current.latest,\n status: changedWorkspaceSettingsSections(current.latest.settings, draft).length === 0\n ? \"saved\"\n : \"dirty\"\n })\n }, [setState])\n\n const retryConflict = useCallback((): void => {\n const current = stateRef.current\n if (current._tag !== \"conflict-recovery-failed\") return\n const request = new AbortController()\n activeRequest.current?.abort()\n activeRequest.current = request\n const { base, candidate } = current\n setState({ _tag: \"conflict-recovery-loading\", base, candidate })\n transport.load(request.signal).then(\n (latest) => {\n if (!request.signal.aborted) {\n publishWorkspaceSettings(latest)\n setState({ _tag: \"conflict\", base, candidate, latest, reapplyFailed: false })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (sessionKey !== null && isUnauthorized(failure)) {\n onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n return\n }\n setState({ _tag: \"conflict-recovery-failed\", base, candidate })\n }\n )\n }, [onSessionExpired, sessionKey, setState, transport])\n\n return {\n discardConflict,\n edit,\n reapplyConflict,\n retry: () => setRequestRevision((revision) => revision + 1),\n retryConflict,\n save,\n state\n }\n}\n","import { Button, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Schema from \"effect/Schema\"\nimport { type ChangeEvent, type ReactElement, type ReactNode, useEffect, useId, useRef, useState } from \"react\"\nimport { useParams } from \"react-router\"\n\nimport {\n changedWorkspaceSettingsSections,\n isGovernedWorkspaceSettingsSection,\n WorkspaceSettingsV1\n} from \"../../domain/workspaceSettings.js\"\nimport { useAppTheme } from \"../AppProviders.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { BrowserSessionsPanel } from \"./BrowserSessionsPanel.js\"\nimport type { BrowserSessionAdministrationTransport } from \"./browserSessionTransport.js\"\nimport styles from \"./WorkspaceSettingsPage.module.css\"\nimport { useWorkspaceSettings } from \"./useWorkspaceSettings.js\"\nimport { browserWorkspaceSettingsTransport, type WorkspaceSettingsTransport } from \"./workspaceSettingsTransport.js\"\n\nconst integerValue = (event: ChangeEvent<HTMLInputElement>, fallback: number): number => {\n const parsed = Number.parseInt(event.currentTarget.value, 10)\n return Number.isNaN(parsed) ? fallback : parsed\n}\nconst parseAllowedProviders = (value: string): ReadonlyArray<string> =>\n [\n ...new Set(\n value\n .split(\",\")\n .map((provider) => provider.trim().toLowerCase())\n .filter((provider) => provider.length > 0)\n )\n ].sort()\n\nconst SettingsSection = ({\n children,\n description,\n title\n}: {\n readonly children: ReactNode\n readonly description: string\n readonly title: string\n}): ReactElement => (\n <Surface className={styles.section} padding=\"default\" shape=\"grouped\">\n <div className={styles.sectionHeading}>\n <Text as=\"h2\" variant=\"section-title\">\n {title}\n </Text>\n <Text as=\"p\" tone=\"secondary\">\n {description}\n </Text>\n </div>\n <div className={styles.fields}>{children}</div>\n </Surface>\n)\n\nconst Field = ({\n children,\n controlId,\n error,\n hint,\n label\n}: {\n readonly children: ReactElement\n readonly controlId?: string\n readonly error?: string\n readonly hint?: string\n readonly label: string\n}): ReactElement => (\n <label className={styles.field} htmlFor={controlId}>\n <span>{label}</span>\n {children}\n {hint === undefined ? null : <small>{hint}</small>}\n {error === undefined ? null : (\n <small id={controlId === undefined ? undefined : `${controlId}-error`} role=\"alert\">\n {error}\n </small>\n )}\n </label>\n)\n\nconst Checkbox = ({\n checked,\n disabled,\n label,\n onChange\n}: {\n readonly checked: boolean\n readonly disabled: boolean\n readonly label: string\n readonly onChange: (checked: boolean) => void\n}): ReactElement => (\n <label className={styles.checkbox}>\n <input\n checked={checked}\n disabled={disabled}\n onChange={(event) => onChange(event.currentTarget.checked)}\n type=\"checkbox\"\n />\n <span>{label}</span>\n </label>\n)\n\nconst SelectField = <Value extends string>({\n disabled,\n label,\n onChange,\n options,\n value\n}: {\n readonly disabled: boolean\n readonly label: string\n readonly onChange: (value: Value) => void\n readonly options: ReadonlyArray<readonly [Value, string]>\n readonly value: Value\n}): ReactElement => (\n <Field label={label}>\n <select\n className={styles.control}\n disabled={disabled}\n onChange={(event) => {\n const selected = options.find(([optionValue]) => optionValue === event.currentTarget.value)\n if (selected !== undefined) onChange(selected[0])\n }}\n value={value}\n >\n {options.map(([optionValue, optionLabel]) => (\n <option key={optionValue} value={optionValue}>\n {optionLabel}\n </option>\n ))}\n </select>\n </Field>\n)\n\nconst retentionFields: ReadonlyArray<readonly [keyof WorkspaceSettingsV1[\"retention\"], string, number]> = [\n [\"evidenceDays\", \"Evidence (days)\", 3_650],\n [\"contentDays\", \"Content (days)\", 3_650],\n [\"auditDays\", \"Audit history (days)\", 3_650],\n [\"agentActivityDays\", \"Agent activity (days)\", 365],\n [\"sandboxArtifactDays\", \"Sandbox artifacts (days)\", 30]\n]\n\nconst NumberField = ({\n disabled,\n error,\n label,\n maximum,\n minimum,\n onChange,\n value\n}: {\n readonly disabled: boolean\n readonly error?: string\n readonly label: string\n readonly maximum: number\n readonly minimum: number\n readonly onChange: (value: number) => void\n readonly value: number\n}): ReactElement => {\n const controlId = useId()\n const validationError =\n error ??\n (!Number.isInteger(value) || value < minimum || value > maximum\n ? `${label} must be a whole number from ${String(minimum)} to ${String(maximum)}.`\n : undefined)\n return (\n <Field controlId={controlId} {...(validationError === undefined ? {} : { error: validationError })} label={label}>\n <input\n aria-describedby={validationError === undefined ? undefined : `${controlId}-error`}\n aria-invalid={validationError === undefined ? undefined : true}\n className={styles.control}\n disabled={disabled}\n id={controlId}\n max={maximum}\n min={minimum}\n onChange={(event) => onChange(integerValue(event, value))}\n type=\"number\"\n value={value}\n />\n </Field>\n )\n}\n\n/** Settings fields exported for browser-backed validation acceptance tests. @internal */\nexport const SettingsForm = ({\n canEdit,\n draft,\n onChange\n}: {\n readonly canEdit: boolean\n readonly draft: WorkspaceSettingsV1\n readonly onChange: (draft: WorkspaceSettingsV1) => void\n}): ReactElement => {\n const disabled = !canEdit\n const canonicalAllowedProvidersText = draft.agent.allowedProviders.join(\", \")\n const [allowedProvidersText, setAllowedProvidersText] = useState(canonicalAllowedProvidersText)\n const emittedAllowedProvidersText = useRef(canonicalAllowedProvidersText)\n const composingAllowedProviders = useRef(false)\n const update = <Key extends keyof WorkspaceSettingsV1>(key: Key, value: WorkspaceSettingsV1[Key]): void =>\n onChange({ ...draft, [key]: value })\n const updateAllowedProviders = (value: string): void => {\n const allowedProviders = parseAllowedProviders(value)\n emittedAllowedProvidersText.current = allowedProviders.join(\", \")\n update(\"agent\", {\n ...draft.agent,\n allowedProviders,\n defaultProvider:\n draft.agent.defaultProvider !== null && allowedProviders.includes(draft.agent.defaultProvider)\n ? draft.agent.defaultProvider\n : null,\n defaultModel:\n draft.agent.defaultProvider !== null && allowedProviders.includes(draft.agent.defaultProvider)\n ? draft.agent.defaultModel\n : null\n })\n }\n\n useEffect(() => {\n if (canonicalAllowedProvidersText !== emittedAllowedProvidersText.current) {\n setAllowedProvidersText(canonicalAllowedProvidersText)\n }\n emittedAllowedProvidersText.current = canonicalAllowedProvidersText\n }, [canonicalAllowedProvidersText])\n\n return (\n <div className={styles.sections}>\n <SettingsSection\n description=\"Controls whether inferred delivery relationships are proposed and the confidence floor.\"\n title=\"Inference\"\n >\n <Checkbox\n checked={draft.inference.enabled}\n disabled={disabled}\n label=\"Enable relationship inference\"\n onChange={(enabled) => update(\"inference\", { ...draft.inference, enabled })}\n />\n <NumberField\n disabled={disabled}\n label=\"Minimum confidence (%)\"\n maximum={100}\n minimum={0}\n onChange={(minimumConfidencePercent) => update(\"inference\", { ...draft.inference, minimumConfidencePercent })}\n value={draft.inference.minimumConfidencePercent}\n />\n </SettingsSection>\n\n <SettingsSection\n description=\"Records the intended synchronization cadence; Sync now remains the active execution path. Also sets the age at which source data is stale.\"\n title=\"Synchronization\"\n >\n <SelectField\n disabled={disabled}\n label=\"Cadence\"\n onChange={(cadence) =>\n update(\"synchronization\", {\n ...draft.synchronization,\n cadence,\n intervalMinutes: cadence === \"manual\" ? null : (draft.synchronization.intervalMinutes ?? 60)\n })\n }\n options={[\n [\"manual\", \"Manual\"],\n [\"interval\", \"Scheduled interval\"]\n ]}\n value={draft.synchronization.cadence}\n />\n {draft.synchronization.intervalMinutes === null ? null : (\n <NumberField\n disabled={disabled}\n label=\"Interval (minutes)\"\n maximum={10_080}\n minimum={5}\n onChange={(intervalMinutes) => update(\"synchronization\", { ...draft.synchronization, intervalMinutes })}\n value={draft.synchronization.intervalMinutes}\n />\n )}\n <NumberField\n disabled={disabled}\n label=\"Stale after (minutes)\"\n maximum={43_200}\n minimum={5}\n onChange={(staleAfterMinutes) => update(\"synchronization\", { ...draft.synchronization, staleAfterMinutes })}\n value={draft.synchronization.staleAfterMinutes}\n />\n </SettingsSection>\n\n <SettingsSection\n description=\"Governed lifecycle policy. Evidence expiry applies to new materialization; bounded final-class sweeps run through lifecycle operations.\"\n title=\"Retention\"\n >\n {retentionFields.map(([key, label, maximum]) => (\n <NumberField\n disabled={disabled}\n {...(() => {\n const error =\n (key === \"evidenceDays\" || key === \"auditDays\") &&\n draft.retention.auditDays < draft.retention.evidenceDays\n ? \"Audit retention must be at least as long as evidence retention.\"\n : (key === \"agentActivityDays\" || key === \"sandboxArtifactDays\") &&\n draft.retention.agentActivityDays < draft.retention.sandboxArtifactDays\n ? \"Agent activity retention must be at least as long as sandbox artifact retention.\"\n : undefined\n return error === undefined ? {} : { error }\n })()}\n key={key}\n label={label}\n maximum={maximum}\n minimum={1}\n onChange={(value) => update(\"retention\", { ...draft.retention, [key]: value })}\n value={draft.retention[key]}\n />\n ))}\n </SettingsSection>\n\n <SettingsSection\n description=\"Records the threshold for investigation automation; investigation creation currently remains manual.\"\n title=\"Investigation\"\n >\n <SelectField\n disabled={disabled}\n label=\"Mode\"\n onChange={(mode) =>\n update(\"investigation\", {\n ...draft.investigation,\n mode\n })\n }\n options={[\n [\"manual\", \"Manual\"],\n [\"automatic\", \"Automatic\"]\n ]}\n value={draft.investigation.mode}\n />\n <NumberField\n disabled={disabled}\n label=\"Consecutive failure threshold\"\n maximum={20}\n minimum={1}\n onChange={(consecutiveFailureThreshold) =>\n update(\"investigation\", {\n ...draft.investigation,\n consecutiveFailureThreshold\n })\n }\n value={draft.investigation.consecutiveFailureThreshold}\n />\n </SettingsSection>\n\n <SettingsSection\n description=\"Governed publishing defaults. Credentials and tokens never belong in workspace settings.\"\n title=\"Jira\"\n >\n <SelectField\n disabled={disabled}\n label=\"Comment publishing\"\n onChange={(commentMode) =>\n update(\"jira\", {\n ...draft.jira,\n commentMode\n })\n }\n options={[\n [\"manual-only\", \"Manual only\"],\n [\"confirm-before-publish\", \"Confirm before publishing\"]\n ]}\n value={draft.jira.commentMode}\n />\n <Checkbox\n checked={draft.jira.includeControlCenterAttribution}\n disabled={disabled}\n label=\"Include Control Center attribution\"\n onChange={(includeControlCenterAttribution) =>\n update(\"jira\", { ...draft.jira, includeControlCenterAttribution })\n }\n />\n </SettingsSection>\n\n <SettingsSection description=\"Governed retry defaults for pipeline operations.\" title=\"Pipeline\">\n <SelectField\n disabled={disabled}\n label=\"Retry behavior\"\n onChange={(retryMode) =>\n update(\"pipeline\", {\n ...draft.pipeline,\n retryMode\n })\n }\n options={[\n [\"manual-only\", \"Manual only\"],\n [\"confirm-before-retry\", \"Confirm before retry\"]\n ]}\n value={draft.pipeline.retryMode}\n />\n <NumberField\n disabled={disabled}\n label=\"Maximum attempts\"\n maximum={10}\n minimum={1}\n onChange={(maximumAttempts) => update(\"pipeline\", { ...draft.pipeline, maximumAttempts })}\n value={draft.pipeline.maximumAttempts}\n />\n </SettingsSection>\n\n <SettingsSection\n description=\"Governed provider and sandbox policy. Provider identifiers are names only, never secrets.\"\n title=\"Agent\"\n >\n <Field hint=\"Comma-separated lowercase identifiers; saved in canonical order.\" label=\"Allowed providers\">\n <input\n className={styles.control}\n disabled={disabled}\n onBlur={() => setAllowedProvidersText(canonicalAllowedProvidersText)}\n onCompositionEnd={(event) => {\n composingAllowedProviders.current = false\n updateAllowedProviders(event.currentTarget.value)\n }}\n onCompositionStart={() => {\n composingAllowedProviders.current = true\n }}\n onChange={(event) => {\n const value = event.currentTarget.value\n setAllowedProvidersText(value)\n if (!composingAllowedProviders.current) updateAllowedProviders(value)\n }}\n type=\"text\"\n value={allowedProvidersText}\n />\n </Field>\n <Field label=\"Default provider\">\n <input\n className={styles.control}\n disabled={disabled}\n list=\"allowed-agent-providers\"\n onChange={(event) => {\n const defaultProvider = event.currentTarget.value.trim().toLowerCase() || null\n update(\"agent\", {\n ...draft.agent,\n defaultProvider,\n defaultModel: defaultProvider === null ? null : draft.agent.defaultModel\n })\n }}\n type=\"text\"\n value={draft.agent.defaultProvider ?? \"\"}\n />\n </Field>\n <datalist id=\"allowed-agent-providers\">\n {draft.agent.allowedProviders.map((provider) => (\n <option key={provider} value={provider} />\n ))}\n </datalist>\n <Field label=\"Default model\">\n <input\n className={styles.control}\n disabled={disabled || draft.agent.defaultProvider === null}\n onChange={(event) =>\n update(\"agent\", {\n ...draft.agent,\n defaultModel: event.currentTarget.value.trim() || null\n })\n }\n type=\"text\"\n value={draft.agent.defaultModel ?? \"\"}\n />\n </Field>\n <SelectField\n disabled={disabled}\n label=\"Tool policy\"\n onChange={(toolPolicy) =>\n update(\"agent\", {\n ...draft.agent,\n toolPolicy\n })\n }\n options={[\n [\"read-only\", \"Read only\"],\n [\"review-sandbox\", \"Review sandbox\"]\n ]}\n value={draft.agent.toolPolicy}\n />\n <SelectField\n disabled={disabled}\n label=\"Profile policy\"\n onChange={(profilePolicy) =>\n update(\"agent\", {\n ...draft.agent,\n profilePolicy\n })\n }\n options={[\n [\"isolated\", \"Isolated\"],\n [\"local-profile\", \"Local profile\"]\n ]}\n value={draft.agent.profilePolicy}\n />\n </SettingsSection>\n\n <SettingsSection description=\"Workspace presentation defaults shared by collaborators.\" title=\"Presentation\">\n <SelectField\n disabled={disabled}\n label=\"Density\"\n onChange={(density) =>\n update(\"presentation\", {\n ...draft.presentation,\n density\n })\n }\n options={[\n [\"comfortable\", \"Comfortable\"],\n [\"compact\", \"Compact\"]\n ]}\n value={draft.presentation.density}\n />\n <SelectField\n disabled={disabled}\n label=\"Default landing\"\n onChange={(defaultLanding) =>\n update(\"presentation\", {\n ...draft.presentation,\n defaultLanding\n })\n }\n options={[\n [\"overview\", \"Overview\"],\n [\"active-work\", \"Active work\"]\n ]}\n value={draft.presentation.defaultLanding}\n />\n </SettingsSection>\n </div>\n )\n}\n\n/** Concurrency-safe workspace settings with explicit stale-write recovery. */\nexport const WorkspaceSettingsPage = ({\n browserSessionTransport,\n transport = browserWorkspaceSettingsTransport\n}: {\n /** Injectable browser boundary for component acceptance tests. @internal */\n readonly browserSessionTransport?: BrowserSessionAdministrationTransport\n /** Injectable browser boundary for component acceptance tests. @internal */\n readonly transport?: WorkspaceSettingsTransport\n} = {}): ReactElement => {\n const browserSession = useBrowserSession()\n const routeWorkspaceId = useParams().workspaceId\n const session =\n browserSession.state._tag === \"authenticated\" || browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const routeMatchesSession = session === null || routeWorkspaceId === session.workspaceId\n const sessionKey = routeMatchesSession ? browserReadableSessionKey(browserSession.state) : null\n const controller = useWorkspaceSettings(sessionKey, browserSession.invalidateSession, transport)\n const theme = useAppTheme()\n const [confirmedGovernedChangeFingerprint, setConfirmedGovernedChangeFingerprint] = useState<string | null>(null)\n const canEdit = browserSession.state._tag === \"authenticated\" && session?.permission === \"workspace-owner\"\n\n if (!routeMatchesSession) {\n return (\n <StatePanel\n description=\"This route does not match the workspace authorized for the current browser session.\"\n title=\"Workspace not found\"\n tone=\"critical\"\n />\n )\n }\n if (sessionKey === null && browserSession.state._tag !== \"checking\") {\n const authenticationRequired = browserSession.state._tag === \"anonymous\"\n return (\n <StatePanel\n description={\n authenticationRequired\n ? \"Sign in to inspect the settings authorized for this workspace.\"\n : \"The current browser session cannot read workspace settings.\"\n }\n title={authenticationRequired ? \"Authentication required\" : \"Settings unavailable\"}\n tone={authenticationRequired ? \"caution\" : \"critical\"}\n />\n )\n }\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return <StatePanel title=\"Loading workspace settings\" />\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Retry</Button>}\n description=\"The current settings document could not be loaded.\"\n title=\"Settings unavailable\"\n tone=\"critical\"\n />\n )\n }\n if (controller.state._tag === \"conflict-recovery-failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retryConflict}>Retry latest revision</Button>}\n description=\"Your unsaved draft is retained, but the latest server revision could not be loaded.\"\n title=\"Conflict recovery interrupted\"\n tone=\"critical\"\n />\n )\n }\n if (controller.state._tag === \"conflict-recovery-loading\") {\n return (\n <StatePanel\n description=\"Your unsaved draft is retained while the latest server revision is loaded.\"\n title=\"Retrying conflict recovery\"\n />\n )\n }\n if (controller.state._tag === \"conflict\") {\n return (\n <div className={styles.page}>\n <StatePanel\n action={\n <div className={styles.actions}>\n <Button onClick={controller.discardConflict}>Use latest</Button>\n {controller.state.reapplyFailed ? null : (\n <Button onClick={controller.reapplyConflict} variant=\"primary\">\n Reapply my changes\n </Button>\n )}\n </div>\n }\n description={\n controller.state.reapplyFailed\n ? \"Your changed fields cannot be combined safely with the latest settings. Use the latest document, then re-enter and review your changes.\"\n : `Another session saved revision ${String(\n controller.state.latest.revision\n )}. Choose the latest document or reapply only the fields you changed, then review and save.`\n }\n title={\n controller.state.reapplyFailed\n ? \"Settings conflict needs manual recovery\"\n : \"Settings changed in another session\"\n }\n tone=\"caution\"\n />\n </div>\n )\n }\n\n const { draft, server, status } = controller.state\n const governedChanges = changedWorkspaceSettingsSections(server.settings, draft).filter(\n isGovernedWorkspaceSettingsSection\n )\n const requiresGovernedConfirmation = governedChanges.length > 0\n const governedChangeFingerprint = requiresGovernedConfirmation\n ? JSON.stringify([server.revision, ...governedChanges.map((section) => [section, draft[section]])])\n : null\n const governedChangeConfirmed =\n governedChangeFingerprint !== null && confirmedGovernedChangeFingerprint === governedChangeFingerprint\n const draftIsValid = Schema.is(WorkspaceSettingsV1)(draft)\n const localProfileUnavailable = draft.agent.profilePolicy === \"local-profile\"\n return (\n <div className={styles.page}>\n <header className={styles.heading}>\n <div>\n <Text as=\"h1\" variant=\"page-title\">\n Workspace settings\n </Text>\n <Text as=\"p\" tone=\"secondary\">\n Revision {server.revision}. Changes are protected against stale writes and attributable to the current\n session.\n </Text>\n </div>\n <div className={styles.save}>\n <span aria-live=\"polite\">\n {status === \"saving\"\n ? \"Saving…\"\n : status === \"failed\"\n ? \"Save failed — retry when ready\"\n : status === \"dirty\"\n ? \"Unsaved changes\"\n : \"Saved\"}\n </span>\n <Button\n disabled={\n !canEdit ||\n (status !== \"dirty\" && status !== \"failed\") ||\n !draftIsValid ||\n localProfileUnavailable ||\n (requiresGovernedConfirmation && !governedChangeConfirmed)\n }\n loading={status === \"saving\"}\n onClick={controller.save}\n variant=\"primary\"\n >\n Save settings\n </Button>\n </div>\n </header>\n {!canEdit ? (\n <Text as=\"p\" className={styles.notice} tone=\"secondary\">\n {session?.permission === \"workspace-approver\"\n ? \"Approvers can inspect settings. A workspace owner must save changes.\"\n : \"A workspace-owner session with mutation storage is required to change settings.\"}\n </Text>\n ) : null}\n {canEdit && !draftIsValid ? (\n <Text as=\"p\" className={styles.notice} tone=\"secondary\">\n Correct the highlighted bounds and policy relationships before saving. Audit retention must cover evidence,\n sandbox artifacts must expire before agent activity, and default agent providers must be allowed.\n </Text>\n ) : null}\n {canEdit && localProfileUnavailable ? (\n <Text as=\"p\" className={styles.notice} tone=\"secondary\">\n Local profile is unavailable: no installed CLI capability generation proves that hooks, plugins, MCP servers,\n browser control, and extra writable roots are disabled. Compared with isolated mode, those surfaces would be\n added and must be verified before this governed policy can be saved.\n </Text>\n ) : null}\n {canEdit && requiresGovernedConfirmation ? (\n <Surface className={styles.governance} padding=\"default\" shape=\"grouped\">\n <Checkbox\n checked={governedChangeConfirmed}\n disabled={status === \"saving\"}\n label={`I reviewed the governed ${governedChanges.join(\n \", \"\n )} policy change${governedChanges.length === 1 ? \"\" : \"s\"} and authorize this exact revision.`}\n onChange={(confirmed) =>\n setConfirmedGovernedChangeFingerprint(confirmed ? governedChangeFingerprint : null)\n }\n />\n </Surface>\n ) : null}\n {session === null || sessionKey === null ? null : (\n <BrowserSessionsPanel\n canManage={canEdit}\n currentSession={session}\n onSessionExpired={browserSession.invalidateSession}\n sessionKey={sessionKey}\n {...(browserSessionTransport === undefined ? {} : { transport: browserSessionTransport })}\n />\n )}\n <Surface className={styles.theme} padding=\"default\" shape=\"grouped\">\n <div>\n <Text as=\"h2\" variant=\"section-title\">\n Theme\n </Text>\n <Text as=\"p\" tone=\"secondary\">\n This preference is browser-local and is never sent to the server.\n </Text>\n </div>\n <select\n aria-label=\"Theme\"\n className={styles.control}\n onChange={(event) => {\n const value = event.currentTarget.value\n if (value === \"dark\" || value === \"light\" || value === \"system\") {\n theme.setTheme(value)\n }\n }}\n value={theme.theme}\n >\n <option value=\"system\">System</option>\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n </Surface>\n <SettingsForm\n canEdit={canEdit && status !== \"saving\"}\n draft={draft}\n onChange={(nextDraft) => {\n setConfirmedGovernedChangeFingerprint(null)\n controller.edit(nextDraft)\n }}\n />\n </div>\n )\n}\n"],"mappings":"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"}
|