@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.
Files changed (220) hide show
  1. package/README.md +18 -8
  2. package/dist/client/.vite/manifest.json +214 -182
  3. package/dist/client/assets/{ActiveWorkPage-Dd1mxPrq.js → ActiveWorkPage-g2-Jyavo.js} +2 -2
  4. package/dist/client/assets/{ActiveWorkPage-Dd1mxPrq.js.map → ActiveWorkPage-g2-Jyavo.js.map} +1 -1
  5. package/dist/client/assets/AgentPage-B6GQdZAs.css +1 -0
  6. package/dist/client/assets/AgentPage-DmVsEe13.js +6 -0
  7. package/dist/client/assets/AgentPage-DmVsEe13.js.map +1 -0
  8. package/dist/client/assets/AtlassianOAuthCallbackPage-C8u9ItMj.js +2 -0
  9. package/dist/client/assets/{AtlassianOAuthCallbackPage-BPoF6oKf.js.map → AtlassianOAuthCallbackPage-C8u9ItMj.js.map} +1 -1
  10. package/dist/client/assets/{AuthorizedSharePage-jjqu6W_f.js → AuthorizedSharePage-CVBJ1NTm.js} +2 -2
  11. package/dist/client/assets/{AuthorizedSharePage-jjqu6W_f.js.map → AuthorizedSharePage-CVBJ1NTm.js.map} +1 -1
  12. package/dist/client/assets/BrowserCrypto-3BoTVFdl.js +2 -0
  13. package/dist/client/assets/{BrowserCrypto-BMbjhcvP.js.map → BrowserCrypto-3BoTVFdl.js.map} +1 -1
  14. package/dist/client/assets/BrowserSessionHydrator-CpZnNm4X.js +2 -0
  15. package/dist/client/assets/{BrowserSessionHydrator-BC1ymLkL.js.map → BrowserSessionHydrator-CpZnNm4X.js.map} +1 -1
  16. package/dist/client/assets/{CommandSearch-WwAVDrD9.js → CommandSearch-DUeRRbV2.js} +2 -2
  17. package/dist/client/assets/{CommandSearch-WwAVDrD9.js.map → CommandSearch-DUeRRbV2.js.map} +1 -1
  18. package/dist/client/assets/{ItemsPage-CKK_KkJ2.js → ItemsPage-BF2ZkSzh.js} +2 -2
  19. package/dist/client/assets/{ItemsPage-CKK_KkJ2.js.map → ItemsPage-BF2ZkSzh.js.map} +1 -1
  20. package/dist/client/assets/{PairPage-DA6cmyqF.js → PairPage-CkaZltHd.js} +2 -2
  21. package/dist/client/assets/{PairPage-DA6cmyqF.js.map → PairPage-CkaZltHd.js.map} +1 -1
  22. package/dist/client/assets/PortfolioOverview-CEUHJmGC.js +2 -0
  23. package/dist/client/assets/{PortfolioOverview-CEI4gpXi.js.map → PortfolioOverview-CEUHJmGC.js.map} +1 -1
  24. package/dist/client/assets/{PullRequestReviewPanel-D7AKnwL-.js → PullRequestReviewPanel-D1IpvHe2.js} +3 -3
  25. package/dist/client/assets/{PullRequestReviewPanel-D7AKnwL-.js.map → PullRequestReviewPanel-D1IpvHe2.js.map} +1 -1
  26. package/dist/client/assets/{ReleaseRoute-CbPW3qUT.js → ReleaseRoute-BuQybrsg.js} +2 -2
  27. package/dist/client/assets/{ReleaseRoute-CbPW3qUT.js.map → ReleaseRoute-BuQybrsg.js.map} +1 -1
  28. package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js +2 -0
  29. package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js.map +1 -0
  30. package/dist/client/assets/ServicesPage-hw5Ee69-.js +2 -0
  31. package/dist/client/assets/{ServicesPage-_B89DAvG.js.map → ServicesPage-hw5Ee69-.js.map} +1 -1
  32. package/dist/client/assets/{TimelinePage-DvpgD8AY.js → TimelinePage-Cj3V98uI.js} +2 -2
  33. package/dist/client/assets/{TimelinePage-DvpgD8AY.js.map → TimelinePage-Cj3V98uI.js.map} +1 -1
  34. package/dist/client/assets/{WorkspaceEntityLink-DPj6MKI2.js → WorkspaceEntityLink-C_rc8lxi.js} +2 -2
  35. package/dist/client/assets/{WorkspaceEntityLink-DPj6MKI2.js.map → WorkspaceEntityLink-C_rc8lxi.js.map} +1 -1
  36. package/dist/client/assets/WorkspaceEntityRoute-DLLT6fY0.css +1 -0
  37. package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js +14 -0
  38. package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js.map +1 -0
  39. package/dist/client/assets/WorkspaceHomeLink-DeYYLEsH.js +2 -0
  40. package/dist/client/assets/{WorkspaceHomeLink-CkJfzO25.js.map → WorkspaceHomeLink-DeYYLEsH.js.map} +1 -1
  41. package/dist/client/assets/WorkspacePullRequestDetails-CizqydjN.js +3 -0
  42. package/dist/client/assets/{WorkspacePullRequestDetails-HwDgp12e.js.map → WorkspacePullRequestDetails-CizqydjN.js.map} +1 -1
  43. package/dist/client/assets/{WorkspaceReleaseLayout-CGHi8eoo.js → WorkspaceReleaseLayout-CXAQUhkh.js} +2 -2
  44. package/dist/client/assets/{WorkspaceReleaseLayout-CGHi8eoo.js.map → WorkspaceReleaseLayout-CXAQUhkh.js.map} +1 -1
  45. package/dist/client/assets/{WorkspaceRichText-D1M637Ff.js → WorkspaceRichText-CCOciILO.js} +2 -2
  46. package/dist/client/assets/WorkspaceRichText-CCOciILO.js.map +1 -0
  47. package/dist/client/assets/WorkspaceSettingsPage-GoBfQzBx.css +1 -0
  48. package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js +2 -0
  49. package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js.map +1 -0
  50. package/dist/client/assets/agent-api-Dl9TuGOJ.js +19 -0
  51. package/dist/client/assets/agent-api-Dl9TuGOJ.js.map +1 -0
  52. package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js +2 -0
  53. package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js.map +1 -0
  54. package/dist/client/assets/authenticatedMutationClient-DdowMjyo.js +2 -0
  55. package/dist/client/assets/{authenticatedMutationClient-DYaieXUe.js.map → authenticatedMutationClient-DdowMjyo.js.map} +1 -1
  56. package/dist/client/assets/{authorizedShareTransport-cxBoQzQ2.js → authorizedShareTransport-CnclcYai.js} +2 -2
  57. package/dist/client/assets/{authorizedShareTransport-cxBoQzQ2.js.map → authorizedShareTransport-CnclcYai.js.map} +1 -1
  58. package/dist/client/assets/client-Dq_XQE_l.js +5 -0
  59. package/dist/client/assets/client-Dq_XQE_l.js.map +1 -0
  60. package/dist/client/assets/confluenceTasks-DtKq8_eU.js +5 -0
  61. package/dist/client/assets/confluenceTasks-DtKq8_eU.js.map +1 -0
  62. package/dist/client/assets/connectionTestTransport-CPK98z7H.js +2 -0
  63. package/dist/client/assets/connectionTestTransport-CPK98z7H.js.map +1 -0
  64. package/dist/client/assets/{index-C7_FDTU7.js → index-zVjlBm9l.js} +3 -3
  65. package/dist/client/assets/{index-C7_FDTU7.js.map → index-zVjlBm9l.js.map} +1 -1
  66. package/dist/client/assets/{patterns-5N-j-AD2-B9qgekXA.js → patterns-5N-j-AD2-DLfaGePK.js} +2 -2
  67. package/dist/client/assets/{patterns-5N-j-AD2-B9qgekXA.js.map → patterns-5N-j-AD2-DLfaGePK.js.map} +1 -1
  68. package/dist/client/assets/{presentPortfolio-C_JsoSWg.js → presentPortfolio-DLEq-vEz.js} +2 -2
  69. package/dist/client/assets/{presentPortfolio-C_JsoSWg.js.map → presentPortfolio-DLEq-vEz.js.map} +1 -1
  70. package/dist/client/assets/{presentWorkspaceItems-DboAfwGc.js → presentWorkspaceItems-BOY3FbhO.js} +2 -2
  71. package/dist/client/assets/{presentWorkspaceItems-DboAfwGc.js.map → presentWorkspaceItems-BOY3FbhO.js.map} +1 -1
  72. package/dist/client/assets/{pullRequestReviewFailures-DHmYwffV.js → pullRequestReviewFailures-CyjTVnSX.js} +2 -2
  73. package/dist/client/assets/{pullRequestReviewFailures-DHmYwffV.js.map → pullRequestReviewFailures-CyjTVnSX.js.map} +1 -1
  74. package/dist/client/assets/{pullRequestReviewThreadReplay-Vy1k53qE.js → pullRequestReviewThreadReplay-CXHspFTr.js} +2 -2
  75. package/dist/client/assets/{pullRequestReviewThreadReplay-Vy1k53qE.js.map → pullRequestReviewThreadReplay-CXHspFTr.js.map} +1 -1
  76. package/dist/client/assets/releaseAgentTransport-DaO4svPu.js +2 -0
  77. package/dist/client/assets/releaseAgentTransport-DaO4svPu.js.map +1 -0
  78. package/dist/client/assets/releaseRoutes-B4ciNOJj.js +2 -0
  79. package/dist/client/assets/{releaseRoutes-t9uCfs5T.js.map → releaseRoutes-B4ciNOJj.js.map} +1 -1
  80. package/dist/client/assets/{serviceOnboarding-DLINCon7.js → serviceOnboarding-D0FmodRi.js} +2 -2
  81. package/dist/client/assets/{serviceOnboarding-DLINCon7.js.map → serviceOnboarding-D0FmodRi.js.map} +1 -1
  82. package/dist/client/assets/{useWorkspaceDefaultLanding-CC5ImHkL.js → useWorkspaceDefaultLanding-BaQdg0sY.js} +3 -3
  83. package/dist/client/assets/{useWorkspaceDefaultLanding-CC5ImHkL.js.map → useWorkspaceDefaultLanding-BaQdg0sY.js.map} +1 -1
  84. package/dist/client/assets/{useWorkspaceItems-B1X-JNwq.js → useWorkspaceItems-B-7JHtm0.js} +2 -2
  85. package/dist/client/assets/{useWorkspaceItems-B1X-JNwq.js.map → useWorkspaceItems-B-7JHtm0.js.map} +1 -1
  86. package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js +2 -0
  87. package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js.map +1 -0
  88. package/dist/client/assets/{workspaceScrollCapture-BsjcWVsk.js → workspaceScrollCapture-BYNfR2wo.js} +2 -2
  89. package/dist/client/assets/{workspaceScrollCapture-BsjcWVsk.js.map → workspaceScrollCapture-BYNfR2wo.js.map} +1 -1
  90. package/dist/client/assets/{workspaceSettingsTransport-Dw2hueXv.js → workspaceSettingsTransport-Br4lBmvS.js} +2 -2
  91. package/dist/client/assets/{workspaceSettingsTransport-Dw2hueXv.js.map → workspaceSettingsTransport-Br4lBmvS.js.map} +1 -1
  92. package/dist/client/build-graph.json +98 -0
  93. package/dist/client/index.html +1 -1
  94. package/dist/server/api/agent.d.ts +12 -0
  95. package/dist/server/api/agent.d.ts.map +1 -1
  96. package/dist/server/api/deliveryGraph.d.ts +20 -0
  97. package/dist/server/api/deliveryGraph.d.ts.map +1 -1
  98. package/dist/server/api/index.d.ts +1 -1
  99. package/dist/server/api/index.d.ts.map +1 -1
  100. package/dist/server/api/index.js +3 -3
  101. package/dist/server/api/session.d.ts +23 -1
  102. package/dist/server/api/session.d.ts.map +1 -1
  103. package/dist/server/api/shares.d.ts +2 -0
  104. package/dist/server/api/shares.d.ts.map +1 -1
  105. package/dist/server/assets/{BindConfig-Bj282xDC.js → BindConfig-DAASchDn.js} +315 -36
  106. package/dist/server/assets/BindConfig-DAASchDn.js.map +1 -0
  107. package/dist/server/assets/{agent-ZvwskOQu.js → agent-xQhAQXly.js} +26 -6
  108. package/dist/server/assets/agent-xQhAQXly.js.map +1 -0
  109. package/dist/server/assets/{controlCenterApi-5j3gOXgE.js → controlCenterApi-DNXK7MT1.js} +4 -3
  110. package/dist/server/assets/controlCenterApi-DNXK7MT1.js.map +1 -0
  111. package/dist/server/assets/{manualPluginSynchronization-CzIhZ_Dw.js → manualPluginSynchronization-DFIeUHP9.js} +4 -3
  112. package/dist/server/assets/manualPluginSynchronization-DFIeUHP9.js.map +1 -0
  113. package/dist/server/assets/{readiness-BtntBhDj.js → readiness-31Mqc-9H.js} +2 -2
  114. package/dist/server/assets/{readiness-BtntBhDj.js.map → readiness-31Mqc-9H.js.map} +1 -1
  115. package/dist/server/assets/{relationshipInferenceMaterialization-CR6xyMNL.js → relationshipInferenceMaterialization-Dyix96px.js} +41 -14
  116. package/dist/server/assets/relationshipInferenceMaterialization-Dyix96px.js.map +1 -0
  117. package/dist/server/assets/{workspaceSettings-C2Zsk6RI.js → workspaceSettings-sv8h_h2P.js} +4 -1
  118. package/dist/server/assets/workspaceSettings-sv8h_h2P.js.map +1 -0
  119. package/dist/server/build-graph.json +28 -1
  120. package/dist/server/domain/confluenceTasks.d.ts +27 -0
  121. package/dist/server/domain/confluenceTasks.d.ts.map +1 -0
  122. package/dist/server/domain/deliveryGraph.d.ts +2 -0
  123. package/dist/server/domain/deliveryGraph.d.ts.map +1 -1
  124. package/dist/server/domain/governedAction/bindings.d.ts +2 -0
  125. package/dist/server/domain/governedAction/bindings.d.ts.map +1 -1
  126. package/dist/server/domain/governedAction/model.d.ts +6 -0
  127. package/dist/server/domain/governedAction/model.d.ts.map +1 -1
  128. package/dist/server/domain/index.js +2 -2
  129. package/dist/server/domain/normalizedPage.d.ts +1 -0
  130. package/dist/server/domain/normalizedPage.d.ts.map +1 -1
  131. package/dist/server/domain/releasePipelineApproval.d.ts +31 -0
  132. package/dist/server/domain/releasePipelineApproval.d.ts.map +1 -0
  133. package/dist/server/index.js +5 -5
  134. package/dist/server/server/api/Handlers.d.ts +1 -1
  135. package/dist/server/server/api/Handlers.d.ts.map +1 -1
  136. package/dist/server/server/application/deliveryGraphInspection.d.ts.map +1 -1
  137. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -1
  138. package/dist/server/server/application/pipelineExecutionProjection.d.ts +1 -0
  139. package/dist/server/server/application/pipelineExecutionProjection.d.ts.map +1 -1
  140. package/dist/server/server/application/portfolioSnapshots.d.ts +4 -0
  141. package/dist/server/server/application/portfolioSnapshots.d.ts.map +1 -1
  142. package/dist/server/server/application/releasePublicationSubmissions.d.ts +32 -1
  143. package/dist/server/server/application/releasePublicationSubmissions.d.ts.map +1 -1
  144. package/dist/server/server/application/releaseRunbookHydration.d.ts +2310 -0
  145. package/dist/server/server/application/releaseRunbookHydration.d.ts.map +1 -0
  146. package/dist/server/server/cli.js +3 -3
  147. package/dist/server/server/governance/governedActionDigests.d.ts +3 -0
  148. package/dist/server/server/governance/governedActionDigests.d.ts.map +1 -1
  149. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts +1 -0
  150. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts.map +1 -1
  151. package/dist/server/server/index.js +2 -2
  152. package/dist/server/server/persistence/Persistence.d.ts +10 -0
  153. package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
  154. package/dist/server/server/persistence/object-store/BlobPublisher.d.ts.map +1 -1
  155. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts +2 -2
  156. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts.map +1 -1
  157. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +10 -0
  158. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -1
  159. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +2 -0
  160. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -1
  161. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +6 -0
  162. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -1
  163. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +1 -0
  164. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -1
  165. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +2 -0
  166. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -1
  167. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +6 -0
  168. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -1
  169. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts +4 -0
  170. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts.map +1 -1
  171. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts +2 -0
  172. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts.map +1 -1
  173. package/dist/server/server/persistence/repositories/governed-action/read.d.ts +4 -0
  174. package/dist/server/server/persistence/repositories/governed-action/read.d.ts.map +1 -1
  175. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts +4 -0
  176. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts.map +1 -1
  177. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts +1 -0
  178. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts.map +1 -1
  179. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts +2 -0
  180. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts.map +1 -1
  181. package/dist/server/server/persistence/repositories/governed-action/write.d.ts +2 -0
  182. package/dist/server/server/persistence/repositories/governed-action/write.d.ts.map +1 -1
  183. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts +4 -0
  184. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts.map +1 -1
  185. package/package.json +3 -3
  186. package/dist/client/assets/AgentPage-C3LThgPZ.js +0 -3
  187. package/dist/client/assets/AgentPage-C3LThgPZ.js.map +0 -1
  188. package/dist/client/assets/AgentPage-DVSgQgJa.css +0 -1
  189. package/dist/client/assets/AtlassianOAuthCallbackPage-BPoF6oKf.js +0 -2
  190. package/dist/client/assets/BrowserCrypto-BMbjhcvP.js +0 -2
  191. package/dist/client/assets/BrowserSessionHydrator-BC1ymLkL.js +0 -2
  192. package/dist/client/assets/PortfolioOverview-CEI4gpXi.js +0 -2
  193. package/dist/client/assets/ReleaseWorkset-BluAe7Sq.js +0 -2
  194. package/dist/client/assets/ReleaseWorkset-BluAe7Sq.js.map +0 -1
  195. package/dist/client/assets/ServicesPage-_B89DAvG.js +0 -2
  196. package/dist/client/assets/WorkspaceEntityRoute-9iMOV64J.css +0 -1
  197. package/dist/client/assets/WorkspaceEntityRoute-B01fxxB3.js +0 -3
  198. package/dist/client/assets/WorkspaceEntityRoute-B01fxxB3.js.map +0 -1
  199. package/dist/client/assets/WorkspaceHomeLink-CkJfzO25.js +0 -2
  200. package/dist/client/assets/WorkspacePullRequestDetails-HwDgp12e.js +0 -3
  201. package/dist/client/assets/WorkspaceRichText-D1M637Ff.js.map +0 -1
  202. package/dist/client/assets/WorkspaceSettingsPage-DyoGiGJG.js +0 -2
  203. package/dist/client/assets/WorkspaceSettingsPage-DyoGiGJG.js.map +0 -1
  204. package/dist/client/assets/WorkspaceSettingsPage-P6yfac0b.css +0 -1
  205. package/dist/client/assets/agent-api-CeONl_8w.js +0 -19
  206. package/dist/client/assets/agent-api-CeONl_8w.js.map +0 -1
  207. package/dist/client/assets/authenticatedMutationClient-DYaieXUe.js +0 -2
  208. package/dist/client/assets/client-DKS82kT_.js +0 -5
  209. package/dist/client/assets/client-DKS82kT_.js.map +0 -1
  210. package/dist/client/assets/connectionTestTransport-I_Ga9UNs.js +0 -2
  211. package/dist/client/assets/connectionTestTransport-I_Ga9UNs.js.map +0 -1
  212. package/dist/client/assets/releaseRoutes-t9uCfs5T.js +0 -2
  213. package/dist/client/assets/workspaceEntityRoutes-2TejMrzb.js +0 -2
  214. package/dist/client/assets/workspaceEntityRoutes-2TejMrzb.js.map +0 -1
  215. package/dist/server/assets/BindConfig-Bj282xDC.js.map +0 -1
  216. package/dist/server/assets/agent-ZvwskOQu.js.map +0 -1
  217. package/dist/server/assets/controlCenterApi-5j3gOXgE.js.map +0 -1
  218. package/dist/server/assets/manualPluginSynchronization-CzIhZ_Dw.js.map +0 -1
  219. package/dist/server/assets/relationshipInferenceMaterialization-CR6xyMNL.js.map +0 -1
  220. package/dist/server/assets/workspaceSettings-C2Zsk6RI.js.map +0 -1
@@ -1,2 +0,0 @@
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-C7_FDTU7.js";import{n as u,r as d}from"./primitives-nKxQGSsE-CJNmac__.js";import{Oa as f,nr as p}from"./agent-api-CeONl_8w.js";import{i as m,n as h,r as g}from"./client-DKS82kT_.js";import{browserWorkspaceSettingsTransport as _}from"./workspaceSettingsTransport-Dw2hueXv.js";var v=e(t(),1),y={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`},b=f(`ConflictApiError`),x=f(`UnauthorizedApiError`),S=(e,t,n,r=Object.is)=>r(e,t)?n:t,C=(e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n]),w=(e,t,n)=>{let r={schemaVersion:1,agent:{allowedProviders:S(e.agent.allowedProviders,t.agent.allowedProviders,n.agent.allowedProviders,C),defaultModel:S(e.agent.defaultModel,t.agent.defaultModel,n.agent.defaultModel),defaultProvider:S(e.agent.defaultProvider,t.agent.defaultProvider,n.agent.defaultProvider),profilePolicy:S(e.agent.profilePolicy,t.agent.profilePolicy,n.agent.profilePolicy),toolPolicy:S(e.agent.toolPolicy,t.agent.toolPolicy,n.agent.toolPolicy)},inference:{enabled:S(e.inference.enabled,t.inference.enabled,n.inference.enabled),minimumConfidencePercent:S(e.inference.minimumConfidencePercent,t.inference.minimumConfidencePercent,n.inference.minimumConfidencePercent)},investigation:{consecutiveFailureThreshold:S(e.investigation.consecutiveFailureThreshold,t.investigation.consecutiveFailureThreshold,n.investigation.consecutiveFailureThreshold),mode:S(e.investigation.mode,t.investigation.mode,n.investigation.mode)},jira:{commentMode:S(e.jira.commentMode,t.jira.commentMode,n.jira.commentMode),includeControlCenterAttribution:S(e.jira.includeControlCenterAttribution,t.jira.includeControlCenterAttribution,n.jira.includeControlCenterAttribution)},pipeline:{maximumAttempts:S(e.pipeline.maximumAttempts,t.pipeline.maximumAttempts,n.pipeline.maximumAttempts),retryMode:S(e.pipeline.retryMode,t.pipeline.retryMode,n.pipeline.retryMode)},presentation:{defaultLanding:S(e.presentation.defaultLanding,t.presentation.defaultLanding,n.presentation.defaultLanding),density:S(e.presentation.density,t.presentation.density,n.presentation.density)},retention:{agentActivityDays:S(e.retention.agentActivityDays,t.retention.agentActivityDays,n.retention.agentActivityDays),auditDays:S(e.retention.auditDays,t.retention.auditDays,n.retention.auditDays),contentDays:S(e.retention.contentDays,t.retention.contentDays,n.retention.contentDays),evidenceDays:S(e.retention.evidenceDays,t.retention.evidenceDays,n.retention.evidenceDays),sandboxArtifactDays:S(e.retention.sandboxArtifactDays,t.retention.sandboxArtifactDays,n.retention.sandboxArtifactDays)},synchronization:{cadence:S(e.synchronization.cadence,t.synchronization.cadence,n.synchronization.cadence),intervalMinutes:S(e.synchronization.intervalMinutes,t.synchronization.intervalMinutes,n.synchronization.intervalMinutes),staleAfterMinutes:S(e.synchronization.staleAfterMinutes,t.synchronization.staleAfterMinutes,n.synchronization.staleAfterMinutes)}};return p(h)(r)?r:null},T=(e,t,n=_)=>{let[r,i]=(0,v.useState)({_tag:`idle`}),a=(0,v.useRef)(r),[s,c]=(0,v.useState)(0),l=(0,v.useRef)(null),u=(0,v.useCallback)(e=>{a.current=e,i(e)},[]);(0,v.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||(x(n)&&t(e),u({_tag:`failed`}))}),()=>r.abort()},[t,s,e,u,n]);let d=(0,v.useCallback)(e=>{let t=a.current;t._tag!==`ready`||t.status===`saving`||u({...t,draft:e,pendingMutationId:null,status:g(t.server.settings,e).length===0?`saved`:`dirty`})},[u]),f=(0,v.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=g(s.settings,c).filter(m);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(x(a)){t(e),u({_tag:`failed`});return}if(!b(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(x(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,v.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,v.useCallback)(()=>{let e=a.current;if(e._tag!==`conflict`)return;let t=w(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:g(e.latest.settings,t).length===0?`saved`:`dirty`})},[u]),retry:()=>c(e=>e+1),retryConflict:(0,v.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&&x(n)){t(e),u({_tag:`failed`});return}u({_tag:`conflict-recovery-failed`,base:s,candidate:c})}})},[t,e,u,n]),save:f,state:r}},E=r(),D=(e,t)=>{let n=Number.parseInt(e.currentTarget.value,10);return Number.isNaN(n)?t:n},O=e=>[...new Set(e.split(`,`).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0))].sort(),k=({children:e,description:t,title:n})=>(0,E.jsxs)(u,{className:y.section,padding:`default`,shape:`grouped`,children:[(0,E.jsxs)(`div`,{className:y.sectionHeading,children:[(0,E.jsx)(d,{as:`h2`,variant:`section-title`,children:n}),(0,E.jsx)(d,{as:`p`,tone:`secondary`,children:t})]}),(0,E.jsx)(`div`,{className:y.fields,children:e})]}),A=({children:e,controlId:t,error:n,hint:r,label:i})=>(0,E.jsxs)(`label`,{className:y.field,htmlFor:t,children:[(0,E.jsx)(`span`,{children:i}),e,r===void 0?null:(0,E.jsx)(`small`,{children:r}),n===void 0?null:(0,E.jsx)(`small`,{id:t===void 0?void 0:`${t}-error`,role:`alert`,children:n})]}),j=({checked:e,disabled:t,label:n,onChange:r})=>(0,E.jsxs)(`label`,{className:y.checkbox,children:[(0,E.jsx)(`input`,{checked:e,disabled:t,onChange:e=>r(e.currentTarget.checked),type:`checkbox`}),(0,E.jsx)(`span`,{children:n})]}),M=({disabled:e,label:t,onChange:n,options:r,value:i})=>(0,E.jsx)(A,{label:t,children:(0,E.jsx)(`select`,{className:y.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,E.jsx)(`option`,{value:e,children:t},e))})}),N=[[`evidenceDays`,`Evidence (days)`,3650],[`contentDays`,`Content (days)`,3650],[`auditDays`,`Audit history (days)`,3650],[`agentActivityDays`,`Agent activity (days)`,365],[`sandboxArtifactDays`,`Sandbox artifacts (days)`,30]],P=({disabled:e,error:t,label:n,maximum:r,minimum:i,onChange:a,value:o})=>{let s=(0,v.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,E.jsx)(A,{controlId:s,...c===void 0?{}:{error:c},label:n,children:(0,E.jsx)(`input`,{"aria-describedby":c===void 0?void 0:`${s}-error`,"aria-invalid":c!==void 0||void 0,className:y.control,disabled:e,id:s,max:r,min:i,onChange:e=>a(D(e,o)),type:`number`,value:o})})},F=({canEdit:e,draft:t,onChange:n})=>{let r=!e,i=t.agent.allowedProviders.join(`, `),[a,o]=(0,v.useState)(i),s=(0,v.useRef)(i),c=(0,v.useRef)(!1),l=(e,r)=>n({...t,[e]:r}),u=e=>{let n=O(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,v.useEffect)(()=>{i!==s.current&&o(i),s.current=i},[i]),(0,E.jsxs)(`div`,{className:y.sections,children:[(0,E.jsxs)(k,{description:`Controls whether inferred delivery relationships are proposed and the confidence floor.`,title:`Inference`,children:[(0,E.jsx)(j,{checked:t.inference.enabled,disabled:r,label:`Enable relationship inference`,onChange:e=>l(`inference`,{...t.inference,enabled:e})}),(0,E.jsx)(P,{disabled:r,label:`Minimum confidence (%)`,maximum:100,minimum:0,onChange:e=>l(`inference`,{...t.inference,minimumConfidencePercent:e}),value:t.inference.minimumConfidencePercent})]}),(0,E.jsxs)(k,{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,E.jsx)(M,{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,E.jsx)(P,{disabled:r,label:`Interval (minutes)`,maximum:10080,minimum:5,onChange:e=>l(`synchronization`,{...t.synchronization,intervalMinutes:e}),value:t.synchronization.intervalMinutes}),(0,E.jsx)(P,{disabled:r,label:`Stale after (minutes)`,maximum:43200,minimum:5,onChange:e=>l(`synchronization`,{...t.synchronization,staleAfterMinutes:e}),value:t.synchronization.staleAfterMinutes})]}),(0,E.jsx)(k,{description:`Governed lifecycle policy. Evidence expiry applies to new materialization; bounded final-class sweeps run through lifecycle operations.`,title:`Retention`,children:N.map(([e,n,i])=>(0,v.createElement)(P,{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,E.jsxs)(k,{description:`Records the threshold for investigation automation; investigation creation currently remains manual.`,title:`Investigation`,children:[(0,E.jsx)(M,{disabled:r,label:`Mode`,onChange:e=>l(`investigation`,{...t.investigation,mode:e}),options:[[`manual`,`Manual`],[`automatic`,`Automatic`]],value:t.investigation.mode}),(0,E.jsx)(P,{disabled:r,label:`Consecutive failure threshold`,maximum:20,minimum:1,onChange:e=>l(`investigation`,{...t.investigation,consecutiveFailureThreshold:e}),value:t.investigation.consecutiveFailureThreshold})]}),(0,E.jsxs)(k,{description:`Governed publishing defaults. Credentials and tokens never belong in workspace settings.`,title:`Jira`,children:[(0,E.jsx)(M,{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,E.jsx)(j,{checked:t.jira.includeControlCenterAttribution,disabled:r,label:`Include Control Center attribution`,onChange:e=>l(`jira`,{...t.jira,includeControlCenterAttribution:e})})]}),(0,E.jsxs)(k,{description:`Governed retry defaults for pipeline operations.`,title:`Pipeline`,children:[(0,E.jsx)(M,{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,E.jsx)(P,{disabled:r,label:`Maximum attempts`,maximum:10,minimum:1,onChange:e=>l(`pipeline`,{...t.pipeline,maximumAttempts:e}),value:t.pipeline.maximumAttempts})]}),(0,E.jsxs)(k,{description:`Governed provider and sandbox policy. Provider identifiers are names only, never secrets.`,title:`Agent`,children:[(0,E.jsx)(A,{hint:`Comma-separated lowercase identifiers; saved in canonical order.`,label:`Allowed providers`,children:(0,E.jsx)(`input`,{className:y.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,E.jsx)(A,{label:`Default provider`,children:(0,E.jsx)(`input`,{className:y.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,E.jsx)(`datalist`,{id:`allowed-agent-providers`,children:t.agent.allowedProviders.map(e=>(0,E.jsx)(`option`,{value:e},e))}),(0,E.jsx)(A,{label:`Default model`,children:(0,E.jsx)(`input`,{className:y.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,E.jsx)(M,{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,E.jsx)(M,{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,E.jsxs)(k,{description:`Workspace presentation defaults shared by collaborators.`,title:`Presentation`,children:[(0,E.jsx)(M,{disabled:r,label:`Density`,onChange:e=>l(`presentation`,{...t.presentation,density:e}),options:[[`comfortable`,`Comfortable`],[`compact`,`Compact`]],value:t.presentation.density}),(0,E.jsx)(M,{disabled:r,label:`Default landing`,onChange:e=>l(`presentation`,{...t.presentation,defaultLanding:e}),options:[[`overview`,`Overview`],[`active-work`,`Active work`]],value:t.presentation.defaultLanding})]})]})},I=({transport:e=_}={})=>{let t=s(),r=n().workspaceId,o=t.state._tag===`authenticated`||t.state._tag===`storage-unavailable`?t.state.session:null,f=o===null||r===o.workspaceId,b=f?l(t.state):null,x=T(b,t.invalidateSession,e),S=c(),[C,w]=(0,v.useState)(null),D=t.state._tag===`authenticated`&&o?.permission===`workspace-owner`;if(!f)return(0,E.jsx)(i,{description:`This route does not match the workspace authorized for the current browser session.`,title:`Workspace not found`,tone:`critical`});if(b===null&&t.state._tag!==`checking`){let e=t.state._tag===`anonymous`;return(0,E.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(x.state._tag===`idle`||x.state._tag===`loading`)return(0,E.jsx)(i,{title:`Loading workspace settings`});if(x.state._tag===`failed`)return(0,E.jsx)(i,{action:(0,E.jsx)(a,{onClick:x.retry,children:`Retry`}),description:`The current settings document could not be loaded.`,title:`Settings unavailable`,tone:`critical`});if(x.state._tag===`conflict-recovery-failed`)return(0,E.jsx)(i,{action:(0,E.jsx)(a,{onClick:x.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(x.state._tag===`conflict-recovery-loading`)return(0,E.jsx)(i,{description:`Your unsaved draft is retained while the latest server revision is loaded.`,title:`Retrying conflict recovery`});if(x.state._tag===`conflict`)return(0,E.jsx)(`div`,{className:y.page,children:(0,E.jsx)(i,{action:(0,E.jsxs)(`div`,{className:y.actions,children:[(0,E.jsx)(a,{onClick:x.discardConflict,children:`Use latest`}),x.state.reapplyFailed?null:(0,E.jsx)(a,{onClick:x.reapplyConflict,variant:`primary`,children:`Reapply my changes`})]}),description:x.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(x.state.latest.revision)}. Choose the latest document or reapply only the fields you changed, then review and save.`,title:x.state.reapplyFailed?`Settings conflict needs manual recovery`:`Settings changed in another session`,tone:`caution`})});let{draft:O,server:k,status:A}=x.state,M=g(k.settings,O).filter(m),N=M.length>0,P=N?JSON.stringify([k.revision,...M.map(e=>[e,O[e]])]):null,I=P!==null&&C===P,L=p(h)(O),R=O.agent.profilePolicy===`local-profile`;return(0,E.jsxs)(`div`,{className:y.page,children:[(0,E.jsxs)(`header`,{className:y.heading,children:[(0,E.jsxs)(`div`,{children:[(0,E.jsx)(d,{as:`h1`,variant:`page-title`,children:`Workspace settings`}),(0,E.jsxs)(d,{as:`p`,tone:`secondary`,children:[`Revision `,k.revision,`. Changes are protected against stale writes and attributable to the current session.`]})]}),(0,E.jsxs)(`div`,{className:y.save,children:[(0,E.jsx)(`span`,{"aria-live":`polite`,children:A===`saving`?`Saving…`:A===`failed`?`Save failed — retry when ready`:A===`dirty`?`Unsaved changes`:`Saved`}),(0,E.jsx)(a,{disabled:!D||A!==`dirty`&&A!==`failed`||!L||R||N&&!I,loading:A===`saving`,onClick:x.save,variant:`primary`,children:`Save settings`})]})]}),D?null:(0,E.jsx)(d,{as:`p`,className:y.notice,tone:`secondary`,children:o?.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.`}),D&&!L?(0,E.jsx)(d,{as:`p`,className:y.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,D&&R?(0,E.jsx)(d,{as:`p`,className:y.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,D&&N?(0,E.jsx)(u,{className:y.governance,padding:`default`,shape:`grouped`,children:(0,E.jsx)(j,{checked:I,disabled:A===`saving`,label:`I reviewed the governed ${M.join(`, `)} policy change${M.length===1?``:`s`} and authorize this exact revision.`,onChange:e=>w(e?P:null)})}):null,(0,E.jsxs)(u,{className:y.theme,padding:`default`,shape:`grouped`,children:[(0,E.jsxs)(`div`,{children:[(0,E.jsx)(d,{as:`h2`,variant:`section-title`,children:`Theme`}),(0,E.jsx)(d,{as:`p`,tone:`secondary`,children:`This preference is browser-local and is never sent to the server.`})]}),(0,E.jsxs)(`select`,{"aria-label":`Theme`,className:y.control,onChange:e=>{let t=e.currentTarget.value;(t===`dark`||t===`light`||t===`system`)&&S.setTheme(t)},value:S.theme,children:[(0,E.jsx)(`option`,{value:`system`,children:`System`}),(0,E.jsx)(`option`,{value:`light`,children:`Light`}),(0,E.jsx)(`option`,{value:`dark`,children:`Dark`})]})]}),(0,E.jsx)(F,{canEdit:D&&A!==`saving`,draft:O,onChange:e=>{w(null),x.edit(e)}})]})};export{F as SettingsForm,I as WorkspaceSettingsPage};
2
- //# sourceMappingURL=WorkspaceSettingsPage-DyoGiGJG.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkspaceSettingsPage-DyoGiGJG.js","names":[],"sources":["../../../src/client/settings/WorkspaceSettingsPage.module.css","../../../src/client/settings/useWorkspaceSettings.ts","../../../src/client/settings/WorkspaceSettingsPage.tsx"],"sourcesContent":[".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 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 transport = browserWorkspaceSettingsTransport\n}: {\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 <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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"}
@@ -1 +0,0 @@
1
- ._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}}