@knpkv/control-center 0.1.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 (664) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +309 -0
  3. package/dist/client/.vite/manifest.json +452 -0
  4. package/dist/client/assets/ActiveWorkPage-Bvji6Tys.js +2 -0
  5. package/dist/client/assets/ActiveWorkPage-Bvji6Tys.js.map +1 -0
  6. package/dist/client/assets/ActiveWorkPage-CxNa23uW.css +1 -0
  7. package/dist/client/assets/AgentPage-Bom41la2.js +3 -0
  8. package/dist/client/assets/AgentPage-Bom41la2.js.map +1 -0
  9. package/dist/client/assets/AgentPage-f6WXQA21.css +1 -0
  10. package/dist/client/assets/AtlassianOAuthCallbackPage-Cqqgj2o3.css +1 -0
  11. package/dist/client/assets/AtlassianOAuthCallbackPage-dr-B9-DD.js +2 -0
  12. package/dist/client/assets/AtlassianOAuthCallbackPage-dr-B9-DD.js.map +1 -0
  13. package/dist/client/assets/AuthorizedSharePage-C-P-PNfm.js +2 -0
  14. package/dist/client/assets/AuthorizedSharePage-C-P-PNfm.js.map +1 -0
  15. package/dist/client/assets/AuthorizedSharePage-DzE_yvHI.css +1 -0
  16. package/dist/client/assets/BrowserCrypto-BPiuCuW-.js +2 -0
  17. package/dist/client/assets/BrowserCrypto-BPiuCuW-.js.map +1 -0
  18. package/dist/client/assets/BrowserSessionHydrator-C8F_LGhg.js +2 -0
  19. package/dist/client/assets/BrowserSessionHydrator-C8F_LGhg.js.map +1 -0
  20. package/dist/client/assets/CommandSearch-D6iFcdvj.js +2 -0
  21. package/dist/client/assets/CommandSearch-D6iFcdvj.js.map +1 -0
  22. package/dist/client/assets/CommandSearch-Df36xGJc.css +1 -0
  23. package/dist/client/assets/Dialog-DwSIPb-B-DVn37afM.js +42 -0
  24. package/dist/client/assets/Dialog-DwSIPb-B-DVn37afM.js.map +1 -0
  25. package/dist/client/assets/ItemsPage-DsQCbQ11.css +1 -0
  26. package/dist/client/assets/ItemsPage-x39U11an.js +2 -0
  27. package/dist/client/assets/ItemsPage-x39U11an.js.map +1 -0
  28. package/dist/client/assets/PairPage-D5vlz4OG.js +2 -0
  29. package/dist/client/assets/PairPage-D5vlz4OG.js.map +1 -0
  30. package/dist/client/assets/PortfolioOverview-DSUabOmm.js +2 -0
  31. package/dist/client/assets/PortfolioOverview-DSUabOmm.js.map +1 -0
  32. package/dist/client/assets/PortfolioOverview-nrb6Ebbh.css +1 -0
  33. package/dist/client/assets/ReleaseRoute-DyDm5s85.js +2 -0
  34. package/dist/client/assets/ReleaseRoute-DyDm5s85.js.map +1 -0
  35. package/dist/client/assets/ReleaseRoute-R3GdFaGc.css +1 -0
  36. package/dist/client/assets/ReleaseWorkset-6gGnZPS8.css +1 -0
  37. package/dist/client/assets/ReleaseWorkset-BhGacsgb.js +2 -0
  38. package/dist/client/assets/ReleaseWorkset-BhGacsgb.js.map +1 -0
  39. package/dist/client/assets/ServicesPage-CoMVH2Si.js +2 -0
  40. package/dist/client/assets/ServicesPage-CoMVH2Si.js.map +1 -0
  41. package/dist/client/assets/ServicesPage-D76DN13E.css +1 -0
  42. package/dist/client/assets/TimelinePage-38jhMz_L.css +1 -0
  43. package/dist/client/assets/TimelinePage-D8Fj_351.js +2 -0
  44. package/dist/client/assets/TimelinePage-D8Fj_351.js.map +1 -0
  45. package/dist/client/assets/WorkspaceEntityLink-BRifdJHn.js +2 -0
  46. package/dist/client/assets/WorkspaceEntityLink-BRifdJHn.js.map +1 -0
  47. package/dist/client/assets/WorkspaceEntityRoute-BwpujSqk.css +1 -0
  48. package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js +30 -0
  49. package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js.map +1 -0
  50. package/dist/client/assets/WorkspaceReleaseLayout-CMg2-6IQ.css +1 -0
  51. package/dist/client/assets/WorkspaceReleaseLayout-DDLdY0rU.js +2 -0
  52. package/dist/client/assets/WorkspaceReleaseLayout-DDLdY0rU.js.map +1 -0
  53. package/dist/client/assets/authenticatedMutationClient-D5yD0rch.js +2 -0
  54. package/dist/client/assets/authenticatedMutationClient-D5yD0rch.js.map +1 -0
  55. package/dist/client/assets/authorizedShareTransport-Dyj53kJf.js +2 -0
  56. package/dist/client/assets/authorizedShareTransport-Dyj53kJf.js.map +1 -0
  57. package/dist/client/assets/client-OmvShYdC.js +12 -0
  58. package/dist/client/assets/client-OmvShYdC.js.map +1 -0
  59. package/dist/client/assets/connectionTestTransport-c25QXx7A.js +2 -0
  60. package/dist/client/assets/connectionTestTransport-c25QXx7A.js.map +1 -0
  61. package/dist/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  62. package/dist/client/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
  63. package/dist/client/assets/index-CkslINEH.css +1 -0
  64. package/dist/client/assets/index-DLoOV6Hp.js +11 -0
  65. package/dist/client/assets/index-DLoOV6Hp.js.map +1 -0
  66. package/dist/client/assets/jsx-runtime-n5LQ9ujS.js +2 -0
  67. package/dist/client/assets/jsx-runtime-n5LQ9ujS.js.map +1 -0
  68. package/dist/client/assets/patterns-DEbg7R-A-Cw0A2uKS.js +2 -0
  69. package/dist/client/assets/patterns-DEbg7R-A-Cw0A2uKS.js.map +1 -0
  70. package/dist/client/assets/presentPortfolio-CkRqd_zz.js +2 -0
  71. package/dist/client/assets/presentPortfolio-CkRqd_zz.js.map +1 -0
  72. package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js +2 -0
  73. package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js.map +1 -0
  74. package/dist/client/assets/releasePaths-s-fSbIM-.js +2 -0
  75. package/dist/client/assets/releasePaths-s-fSbIM-.js.map +1 -0
  76. package/dist/client/assets/releaseRoutes-DSWkTh-E.js +2 -0
  77. package/dist/client/assets/releaseRoutes-DSWkTh-E.js.map +1 -0
  78. package/dist/client/assets/serviceOnboarding-B9pvdyWf.js +2 -0
  79. package/dist/client/assets/serviceOnboarding-B9pvdyWf.js.map +1 -0
  80. package/dist/client/assets/useCompactReleasePreview-Ch3XxgJU.js +2 -0
  81. package/dist/client/assets/useCompactReleasePreview-Ch3XxgJU.js.map +1 -0
  82. package/dist/client/assets/useWorkspaceItems-D0FuHGto.js +2 -0
  83. package/dist/client/assets/useWorkspaceItems-D0FuHGto.js.map +1 -0
  84. package/dist/client/assets/workspaceEntityPaths-xAl2jRFm.js +2 -0
  85. package/dist/client/assets/workspaceEntityPaths-xAl2jRFm.js.map +1 -0
  86. package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js +2 -0
  87. package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js.map +1 -0
  88. package/dist/client/build-graph.json +1465 -0
  89. package/dist/client/index.html +17 -0
  90. package/dist/server/api/agent.d.ts +652 -0
  91. package/dist/server/api/agent.d.ts.map +1 -0
  92. package/dist/server/api/client.d.ts +17 -0
  93. package/dist/server/api/client.d.ts.map +1 -0
  94. package/dist/server/api/controlCenterApi.d.ts +16 -0
  95. package/dist/server/api/controlCenterApi.d.ts.map +1 -0
  96. package/dist/server/api/deliveryGraph.d.ts +8714 -0
  97. package/dist/server/api/deliveryGraph.d.ts.map +1 -0
  98. package/dist/server/api/errors.d.ts +87 -0
  99. package/dist/server/api/errors.d.ts.map +1 -0
  100. package/dist/server/api/index.d.ts +14 -0
  101. package/dist/server/api/index.d.ts.map +1 -0
  102. package/dist/server/api/index.js +12 -0
  103. package/dist/server/api/index.js.map +1 -0
  104. package/dist/server/api/liveEvents.d.ts +1120 -0
  105. package/dist/server/api/liveEvents.d.ts.map +1 -0
  106. package/dist/server/api/media.d.ts +30 -0
  107. package/dist/server/api/media.d.ts.map +1 -0
  108. package/dist/server/api/plugins.d.ts +1853 -0
  109. package/dist/server/api/plugins.d.ts.map +1 -0
  110. package/dist/server/api/portfolio.d.ts +742 -0
  111. package/dist/server/api/portfolio.d.ts.map +1 -0
  112. package/dist/server/api/session.d.ts +204 -0
  113. package/dist/server/api/session.d.ts.map +1 -0
  114. package/dist/server/api/shares.d.ts +422 -0
  115. package/dist/server/api/shares.d.ts.map +1 -0
  116. package/dist/server/api/timeline.d.ts +86 -0
  117. package/dist/server/api/timeline.d.ts.map +1 -0
  118. package/dist/server/api/wire.d.ts +4 -0
  119. package/dist/server/api/wire.d.ts.map +1 -0
  120. package/dist/server/assets/BindConfig-BjK10BEb.js +15440 -0
  121. package/dist/server/assets/BindConfig-BjK10BEb.js.map +1 -0
  122. package/dist/server/assets/controlCenterApi-tZPvRPRH.js +1430 -0
  123. package/dist/server/assets/controlCenterApi-tZPvRPRH.js.map +1 -0
  124. package/dist/server/assets/domainEvent-x7yeq-gU.js +2130 -0
  125. package/dist/server/assets/domainEvent-x7yeq-gU.js.map +1 -0
  126. package/dist/server/assets/firstPartyServices-Y41P8uke.js +49 -0
  127. package/dist/server/assets/firstPartyServices-Y41P8uke.js.map +1 -0
  128. package/dist/server/assets/manualPluginSynchronization-C0aHB4UM.js +1805 -0
  129. package/dist/server/assets/manualPluginSynchronization-C0aHB4UM.js.map +1 -0
  130. package/dist/server/assets/portfolioInvalidation-Ds9Xm4_P.js +15463 -0
  131. package/dist/server/assets/portfolioInvalidation-Ds9Xm4_P.js.map +1 -0
  132. package/dist/server/assets/readiness-CzU3vjYQ.js +1012 -0
  133. package/dist/server/assets/readiness-CzU3vjYQ.js.map +1 -0
  134. package/dist/server/build-graph.json +3948 -0
  135. package/dist/server/domain/actors.d.ts +147 -0
  136. package/dist/server/domain/actors.d.ts.map +1 -0
  137. package/dist/server/domain/authorizedShare.d.ts +24 -0
  138. package/dist/server/domain/authorizedShare.d.ts.map +1 -0
  139. package/dist/server/domain/deliveryGraph.d.ts +848 -0
  140. package/dist/server/domain/deliveryGraph.d.ts.map +1 -0
  141. package/dist/server/domain/domainEvent.d.ts +50 -0
  142. package/dist/server/domain/domainEvent.d.ts.map +1 -0
  143. package/dist/server/domain/firstPartyServices.d.ts +60 -0
  144. package/dist/server/domain/firstPartyServices.d.ts.map +1 -0
  145. package/dist/server/domain/freshness.d.ts +367 -0
  146. package/dist/server/domain/freshness.d.ts.map +1 -0
  147. package/dist/server/domain/governedAction/bindings.d.ts +264 -0
  148. package/dist/server/domain/governedAction/bindings.d.ts.map +1 -0
  149. package/dist/server/domain/governedAction/index.d.ts +6 -0
  150. package/dist/server/domain/governedAction/index.d.ts.map +1 -0
  151. package/dist/server/domain/governedAction/lifecycle.d.ts +71 -0
  152. package/dist/server/domain/governedAction/lifecycle.d.ts.map +1 -0
  153. package/dist/server/domain/governedAction/model.d.ts +357 -0
  154. package/dist/server/domain/governedAction/model.d.ts.map +1 -0
  155. package/dist/server/domain/governedAction/stateMachine.d.ts +450 -0
  156. package/dist/server/domain/governedAction/stateMachine.d.ts.map +1 -0
  157. package/dist/server/domain/identifiers.d.ts +110 -0
  158. package/dist/server/domain/identifiers.d.ts.map +1 -0
  159. package/dist/server/domain/index.d.ts +26 -0
  160. package/dist/server/domain/index.d.ts.map +1 -0
  161. package/dist/server/domain/index.js +52 -0
  162. package/dist/server/domain/index.js.map +1 -0
  163. package/dist/server/domain/normalizedIssue.d.ts +223 -0
  164. package/dist/server/domain/normalizedIssue.d.ts.map +1 -0
  165. package/dist/server/domain/plugins/actions.d.ts +246 -0
  166. package/dist/server/domain/plugins/actions.d.ts.map +1 -0
  167. package/dist/server/domain/plugins/bounds.d.ts +12 -0
  168. package/dist/server/domain/plugins/bounds.d.ts.map +1 -0
  169. package/dist/server/domain/plugins/descriptor.d.ts +205 -0
  170. package/dist/server/domain/plugins/descriptor.d.ts.map +1 -0
  171. package/dist/server/domain/plugins/discovery.d.ts +39 -0
  172. package/dist/server/domain/plugins/discovery.d.ts.map +1 -0
  173. package/dist/server/domain/plugins/events.d.ts +232 -0
  174. package/dist/server/domain/plugins/events.d.ts.map +1 -0
  175. package/dist/server/domain/plugins/index.d.ts +11 -0
  176. package/dist/server/domain/plugins/index.d.ts.map +1 -0
  177. package/dist/server/domain/readiness/evaluate.d.ts +4 -0
  178. package/dist/server/domain/readiness/evaluate.d.ts.map +1 -0
  179. package/dist/server/domain/readiness/index.d.ts +7 -0
  180. package/dist/server/domain/readiness/index.d.ts.map +1 -0
  181. package/dist/server/domain/readiness/material.d.ts +114 -0
  182. package/dist/server/domain/readiness/material.d.ts.map +1 -0
  183. package/dist/server/domain/readiness/model.d.ts +1736 -0
  184. package/dist/server/domain/readiness/model.d.ts.map +1 -0
  185. package/dist/server/domain/readiness/policy.d.ts +73 -0
  186. package/dist/server/domain/readiness/policy.d.ts.map +1 -0
  187. package/dist/server/domain/readiness/rollup.d.ts +6 -0
  188. package/dist/server/domain/readiness/rollup.d.ts.map +1 -0
  189. package/dist/server/domain/relationshipRepair.d.ts +97 -0
  190. package/dist/server/domain/relationshipRepair.d.ts.map +1 -0
  191. package/dist/server/domain/release.d.ts +191 -0
  192. package/dist/server/domain/release.d.ts.map +1 -0
  193. package/dist/server/domain/releaseRelay.d.ts +44 -0
  194. package/dist/server/domain/releaseRelay.d.ts.map +1 -0
  195. package/dist/server/domain/sourceRevision.d.ts +39 -0
  196. package/dist/server/domain/sourceRevision.d.ts.map +1 -0
  197. package/dist/server/domain/timeline.d.ts +105 -0
  198. package/dist/server/domain/timeline.d.ts.map +1 -0
  199. package/dist/server/domain/utcTimestamp.d.ts +9 -0
  200. package/dist/server/domain/utcTimestamp.d.ts.map +1 -0
  201. package/dist/server/index.d.ts +8 -0
  202. package/dist/server/index.d.ts.map +1 -0
  203. package/dist/server/index.js +7 -0
  204. package/dist/server/server/DataRootProtocol.d.ts +80 -0
  205. package/dist/server/server/DataRootProtocol.d.ts.map +1 -0
  206. package/dist/server/server/agent/AgentJobWorker.d.ts +48 -0
  207. package/dist/server/server/agent/AgentJobWorker.d.ts.map +1 -0
  208. package/dist/server/server/agent/AgentRuntimeRegistry.d.ts +17 -0
  209. package/dist/server/server/agent/AgentRuntimeRegistry.d.ts.map +1 -0
  210. package/dist/server/server/agent/index.d.ts +4 -0
  211. package/dist/server/server/agent/index.d.ts.map +1 -0
  212. package/dist/server/server/api/ApiConfiguration.d.ts +24 -0
  213. package/dist/server/server/api/ApiConfiguration.d.ts.map +1 -0
  214. package/dist/server/server/api/ApiMiddleware.d.ts +14 -0
  215. package/dist/server/server/api/ApiMiddleware.d.ts.map +1 -0
  216. package/dist/server/server/api/ApplicationServices.d.ts +320 -0
  217. package/dist/server/server/api/ApplicationServices.d.ts.map +1 -0
  218. package/dist/server/server/api/ControlCenterApiServer.d.ts +11 -0
  219. package/dist/server/server/api/ControlCenterApiServer.d.ts.map +1 -0
  220. package/dist/server/server/api/ErrorMapping.d.ts +29 -0
  221. package/dist/server/server/api/ErrorMapping.d.ts.map +1 -0
  222. package/dist/server/server/api/Handlers.d.ts +24 -0
  223. package/dist/server/server/api/Handlers.d.ts.map +1 -0
  224. package/dist/server/server/api/LiveStreamAdmission.d.ts +34 -0
  225. package/dist/server/server/api/LiveStreamAdmission.d.ts.map +1 -0
  226. package/dist/server/server/api/RequestBoundary.d.ts +17 -0
  227. package/dist/server/server/api/RequestBoundary.d.ts.map +1 -0
  228. package/dist/server/server/api/RequestContext.d.ts +38 -0
  229. package/dist/server/server/api/RequestContext.d.ts.map +1 -0
  230. package/dist/server/server/api/RequestLimits.d.ts +79 -0
  231. package/dist/server/server/api/RequestLimits.d.ts.map +1 -0
  232. package/dist/server/server/api/index.d.ts +9 -0
  233. package/dist/server/server/api/index.d.ts.map +1 -0
  234. package/dist/server/server/application/authorizedShares.d.ts +29 -0
  235. package/dist/server/server/application/authorizedShares.d.ts.map +1 -0
  236. package/dist/server/server/application/awsResourceDiscovery.d.ts +18 -0
  237. package/dist/server/server/application/awsResourceDiscovery.d.ts.map +1 -0
  238. package/dist/server/server/application/connectionOwnership.d.ts +50 -0
  239. package/dist/server/server/application/connectionOwnership.d.ts.map +1 -0
  240. package/dist/server/server/application/deliveryGraphInspection.d.ts +59 -0
  241. package/dist/server/server/application/deliveryGraphInspection.d.ts.map +1 -0
  242. package/dist/server/server/application/errors.d.ts +10 -0
  243. package/dist/server/server/application/errors.d.ts.map +1 -0
  244. package/dist/server/server/application/fakeReleaseNormalization.d.ts +152 -0
  245. package/dist/server/server/application/fakeReleaseNormalization.d.ts.map +1 -0
  246. package/dist/server/server/application/index.d.ts +17 -0
  247. package/dist/server/server/application/index.d.ts.map +1 -0
  248. package/dist/server/server/application/liveEvents.d.ts +22 -0
  249. package/dist/server/server/application/liveEvents.d.ts.map +1 -0
  250. package/dist/server/server/application/manualPluginSynchronization.d.ts +41 -0
  251. package/dist/server/server/application/manualPluginSynchronization.d.ts.map +1 -0
  252. package/dist/server/server/application/mediaReads.d.ts +14 -0
  253. package/dist/server/server/application/mediaReads.d.ts.map +1 -0
  254. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts +109 -0
  255. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -0
  256. package/dist/server/server/application/pluginAdministration.d.ts +1318 -0
  257. package/dist/server/server/application/pluginAdministration.d.ts.map +1 -0
  258. package/dist/server/server/application/pluginSynchronizationAuthority.d.ts +22 -0
  259. package/dist/server/server/application/pluginSynchronizationAuthority.d.ts.map +1 -0
  260. package/dist/server/server/application/portfolioInvalidation.d.ts +35 -0
  261. package/dist/server/server/application/portfolioInvalidation.d.ts.map +1 -0
  262. package/dist/server/server/application/portfolioSnapshots.d.ts +12 -0
  263. package/dist/server/server/application/portfolioSnapshots.d.ts.map +1 -0
  264. package/dist/server/server/application/readinessDigests.d.ts +3 -0
  265. package/dist/server/server/application/readinessDigests.d.ts.map +1 -0
  266. package/dist/server/server/application/relationshipInference.d.ts +57 -0
  267. package/dist/server/server/application/relationshipInference.d.ts.map +1 -0
  268. package/dist/server/server/application/relationshipInferenceMaterialization.d.ts +26 -0
  269. package/dist/server/server/application/relationshipInferenceMaterialization.d.ts.map +1 -0
  270. package/dist/server/server/application/relationshipRepairProposals.d.ts +41 -0
  271. package/dist/server/server/application/relationshipRepairProposals.d.ts.map +1 -0
  272. package/dist/server/server/application/releaseAgent.d.ts +30 -0
  273. package/dist/server/server/application/releaseAgent.d.ts.map +1 -0
  274. package/dist/server/server/application/releaseAgentJobs.d.ts +26 -0
  275. package/dist/server/server/application/releaseAgentJobs.d.ts.map +1 -0
  276. package/dist/server/server/application/releaseSynchronization.d.ts +55 -0
  277. package/dist/server/server/application/releaseSynchronization.d.ts.map +1 -0
  278. package/dist/server/server/application/timelineExportAudits.d.ts +22 -0
  279. package/dist/server/server/application/timelineExportAudits.d.ts.map +1 -0
  280. package/dist/server/server/application/timelineExports.d.ts +46 -0
  281. package/dist/server/server/application/timelineExports.d.ts.map +1 -0
  282. package/dist/server/server/application/timelineReads.d.ts +29 -0
  283. package/dist/server/server/application/timelineReads.d.ts.map +1 -0
  284. package/dist/server/server/auth/Auth.d.ts +169 -0
  285. package/dist/server/server/auth/Auth.d.ts.map +1 -0
  286. package/dist/server/server/auth/AuthRepository.d.ts +160 -0
  287. package/dist/server/server/auth/AuthRepository.d.ts.map +1 -0
  288. package/dist/server/server/auth/TerminalRecovery.d.ts +35 -0
  289. package/dist/server/server/auth/TerminalRecovery.d.ts.map +1 -0
  290. package/dist/server/server/auth/errors.d.ts +31 -0
  291. package/dist/server/server/auth/errors.d.ts.map +1 -0
  292. package/dist/server/server/auth/index.d.ts +5 -0
  293. package/dist/server/server/auth/index.d.ts.map +1 -0
  294. package/dist/server/server/auth/models.d.ts +63 -0
  295. package/dist/server/server/auth/models.d.ts.map +1 -0
  296. package/dist/server/server/cli.d.ts +3 -0
  297. package/dist/server/server/cli.d.ts.map +1 -0
  298. package/dist/server/server/cli.js +669 -0
  299. package/dist/server/server/cli.js.map +1 -0
  300. package/dist/server/server/cliArguments.d.ts +21 -0
  301. package/dist/server/server/cliArguments.d.ts.map +1 -0
  302. package/dist/server/server/cliConfiguration.d.ts +20 -0
  303. package/dist/server/server/cliConfiguration.d.ts.map +1 -0
  304. package/dist/server/server/governance/governedActionAuthority.d.ts +54 -0
  305. package/dist/server/server/governance/governedActionAuthority.d.ts.map +1 -0
  306. package/dist/server/server/governance/governedActionDigests.d.ts +1348 -0
  307. package/dist/server/server/governance/governedActionDigests.d.ts.map +1 -0
  308. package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts +55 -0
  309. package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts.map +1 -0
  310. package/dist/server/server/governance/internal/GovernedActionExecutionStore.d.ts +116 -0
  311. package/dist/server/server/governance/internal/GovernedActionExecutionStore.d.ts.map +1 -0
  312. package/dist/server/server/governance/internal/GovernedActionPolicyEvaluator.d.ts +120 -0
  313. package/dist/server/server/governance/internal/GovernedActionPolicyEvaluator.d.ts.map +1 -0
  314. package/dist/server/server/governance/internal/execution-store/begin.d.ts +17 -0
  315. package/dist/server/server/governance/internal/execution-store/begin.d.ts.map +1 -0
  316. package/dist/server/server/governance/internal/execution-store/current-evidence.d.ts +33 -0
  317. package/dist/server/server/governance/internal/execution-store/current-evidence.d.ts.map +1 -0
  318. package/dist/server/server/governance/internal/execution-store/current-session.d.ts +29 -0
  319. package/dist/server/server/governance/internal/execution-store/current-session.d.ts.map +1 -0
  320. package/dist/server/server/governance/internal/execution-store/current-target.d.ts +28 -0
  321. package/dist/server/server/governance/internal/execution-store/current-target.d.ts.map +1 -0
  322. package/dist/server/server/governance/internal/execution-store/dispatch-inbox.d.ts +20 -0
  323. package/dist/server/server/governance/internal/execution-store/dispatch-inbox.d.ts.map +1 -0
  324. package/dist/server/server/governance/internal/execution-store/dispatch-outcome.d.ts +78 -0
  325. package/dist/server/server/governance/internal/execution-store/dispatch-outcome.d.ts.map +1 -0
  326. package/dist/server/server/governance/internal/execution-store/inspect.d.ts +17 -0
  327. package/dist/server/server/governance/internal/execution-store/inspect.d.ts.map +1 -0
  328. package/dist/server/server/governance/internal/execution-store/live.d.ts +6 -0
  329. package/dist/server/server/governance/internal/execution-store/live.d.ts.map +1 -0
  330. package/dist/server/server/governance/internal/execution-store/preparation.d.ts +42 -0
  331. package/dist/server/server/governance/internal/execution-store/preparation.d.ts.map +1 -0
  332. package/dist/server/server/governance/internal/execution-store/provider-outcome-fold.d.ts +33 -0
  333. package/dist/server/server/governance/internal/execution-store/provider-outcome-fold.d.ts.map +1 -0
  334. package/dist/server/server/governance/internal/execution-store/reconciliation-inbox.d.ts +20 -0
  335. package/dist/server/server/governance/internal/execution-store/reconciliation-inbox.d.ts.map +1 -0
  336. package/dist/server/server/governance/internal/execution-store/reconciliation-locator.d.ts +5 -0
  337. package/dist/server/server/governance/internal/execution-store/reconciliation-locator.d.ts.map +1 -0
  338. package/dist/server/server/governance/internal/execution-store/reconciliation-outcome.d.ts +123 -0
  339. package/dist/server/server/governance/internal/execution-store/reconciliation-outcome.d.ts.map +1 -0
  340. package/dist/server/server/governance/internal/execution-store/record-blocked.d.ts +13 -0
  341. package/dist/server/server/governance/internal/execution-store/record-blocked.d.ts.map +1 -0
  342. package/dist/server/server/governance/internal/execution-store/record-dispatch.d.ts +12 -0
  343. package/dist/server/server/governance/internal/execution-store/record-dispatch.d.ts.map +1 -0
  344. package/dist/server/server/governance/internal/execution-store/record-reconciliation.d.ts +12 -0
  345. package/dist/server/server/governance/internal/execution-store/record-reconciliation.d.ts.map +1 -0
  346. package/dist/server/server/governance/internal/execution-store/record-recovery-unavailable.d.ts +11 -0
  347. package/dist/server/server/governance/internal/execution-store/record-recovery-unavailable.d.ts.map +1 -0
  348. package/dist/server/server/governance/internal/execution-store/record-unknown.d.ts +11 -0
  349. package/dist/server/server/governance/internal/execution-store/record-unknown.d.ts.map +1 -0
  350. package/dist/server/server/governance/internal/execution-store/recovery-candidates.d.ts +12 -0
  351. package/dist/server/server/governance/internal/execution-store/recovery-candidates.d.ts.map +1 -0
  352. package/dist/server/server/governance/internal/execution-store/recovery-claim-expiry.d.ts +9 -0
  353. package/dist/server/server/governance/internal/execution-store/recovery-claim-expiry.d.ts.map +1 -0
  354. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts +465 -0
  355. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts.map +1 -0
  356. package/dist/server/server/governance/internal/execution-store/tokens.d.ts +52 -0
  357. package/dist/server/server/governance/internal/execution-store/tokens.d.ts.map +1 -0
  358. package/dist/server/server/http/StaticApplication.d.ts +8 -0
  359. package/dist/server/server/http/StaticApplication.d.ts.map +1 -0
  360. package/dist/server/server/http/index.d.ts +4 -0
  361. package/dist/server/server/http/index.d.ts.map +1 -0
  362. package/dist/server/server/http/security/HttpLimits.d.ts +22 -0
  363. package/dist/server/server/http/security/HttpLimits.d.ts.map +1 -0
  364. package/dist/server/server/http/security/RequestPolicy.d.ts +26 -0
  365. package/dist/server/server/http/security/RequestPolicy.d.ts.map +1 -0
  366. package/dist/server/server/http/security/RichDocument.d.ts +154 -0
  367. package/dist/server/server/http/security/RichDocument.d.ts.map +1 -0
  368. package/dist/server/server/http/security/SecurityHeaders.d.ts +7 -0
  369. package/dist/server/server/http/security/SecurityHeaders.d.ts.map +1 -0
  370. package/dist/server/server/http/security/StaticAssetStore.d.ts +43 -0
  371. package/dist/server/server/http/security/StaticAssetStore.d.ts.map +1 -0
  372. package/dist/server/server/http/security/UrlPolicy.d.ts +30 -0
  373. package/dist/server/server/http/security/UrlPolicy.d.ts.map +1 -0
  374. package/dist/server/server/http/security/index.d.ts +8 -0
  375. package/dist/server/server/http/security/index.d.ts.map +1 -0
  376. package/dist/server/server/index.d.ts +18 -0
  377. package/dist/server/server/index.d.ts.map +1 -0
  378. package/dist/server/server/index.js +583 -0
  379. package/dist/server/server/index.js.map +1 -0
  380. package/dist/server/server/observability.d.ts +13 -0
  381. package/dist/server/server/observability.d.ts.map +1 -0
  382. package/dist/server/server/persistence/ContentStore.d.ts +86 -0
  383. package/dist/server/server/persistence/ContentStore.d.ts.map +1 -0
  384. package/dist/server/server/persistence/Database.d.ts +26 -0
  385. package/dist/server/server/persistence/Database.d.ts.map +1 -0
  386. package/dist/server/server/persistence/Persistence.d.ts +7042 -0
  387. package/dist/server/server/persistence/Persistence.d.ts.map +1 -0
  388. package/dist/server/server/persistence/PersistenceConfig.d.ts +27 -0
  389. package/dist/server/server/persistence/PersistenceConfig.d.ts.map +1 -0
  390. package/dist/server/server/persistence/backup/BackupArchive.d.ts +32 -0
  391. package/dist/server/server/persistence/backup/BackupArchive.d.ts.map +1 -0
  392. package/dist/server/server/persistence/backup/BackupArchiveCore.d.ts +23 -0
  393. package/dist/server/server/persistence/backup/BackupArchiveCore.d.ts.map +1 -0
  394. package/dist/server/server/persistence/backup/BackupManifest.d.ts +136 -0
  395. package/dist/server/server/persistence/backup/BackupManifest.d.ts.map +1 -0
  396. package/dist/server/server/persistence/backup/DatabaseSnapshot.d.ts +53 -0
  397. package/dist/server/server/persistence/backup/DatabaseSnapshot.d.ts.map +1 -0
  398. package/dist/server/server/persistence/backup/errors.d.ts +53 -0
  399. package/dist/server/server/persistence/backup/errors.d.ts.map +1 -0
  400. package/dist/server/server/persistence/backup/index.d.ts +4 -0
  401. package/dist/server/server/persistence/backup/index.d.ts.map +1 -0
  402. package/dist/server/server/persistence/errors.d.ts +99 -0
  403. package/dist/server/server/persistence/errors.d.ts.map +1 -0
  404. package/dist/server/server/persistence/governedActionReconciliationLocator.d.ts +14 -0
  405. package/dist/server/server/persistence/governedActionReconciliationLocator.d.ts.map +1 -0
  406. package/dist/server/server/persistence/index.d.ts +11 -0
  407. package/dist/server/server/persistence/index.d.ts.map +1 -0
  408. package/dist/server/server/persistence/object-store/BlobDigest.d.ts +6 -0
  409. package/dist/server/server/persistence/object-store/BlobDigest.d.ts.map +1 -0
  410. package/dist/server/server/persistence/object-store/BlobPath.d.ts +12 -0
  411. package/dist/server/server/persistence/object-store/BlobPath.d.ts.map +1 -0
  412. package/dist/server/server/persistence/object-store/BlobPublisher.d.ts +8 -0
  413. package/dist/server/server/persistence/object-store/BlobPublisher.d.ts.map +1 -0
  414. package/dist/server/server/persistence/object-store/BlobRef.d.ts +16 -0
  415. package/dist/server/server/persistence/object-store/BlobRef.d.ts.map +1 -0
  416. package/dist/server/server/persistence/object-store/BlobStore.d.ts +37 -0
  417. package/dist/server/server/persistence/object-store/BlobStore.d.ts.map +1 -0
  418. package/dist/server/server/persistence/object-store/BlobStoreError.d.ts +57 -0
  419. package/dist/server/server/persistence/object-store/BlobStoreError.d.ts.map +1 -0
  420. package/dist/server/server/persistence/object-store/BlobStoreTypes.d.ts +28 -0
  421. package/dist/server/server/persistence/object-store/BlobStoreTypes.d.ts.map +1 -0
  422. package/dist/server/server/persistence/object-store/OpenedBlob.d.ts +21 -0
  423. package/dist/server/server/persistence/object-store/OpenedBlob.d.ts.map +1 -0
  424. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts +21 -0
  425. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts.map +1 -0
  426. package/dist/server/server/persistence/repositories/agentJobModels.d.ts +142 -0
  427. package/dist/server/server/persistence/repositories/agentJobModels.d.ts.map +1 -0
  428. package/dist/server/server/persistence/repositories/agentJobRepository.d.ts +134 -0
  429. package/dist/server/server/persistence/repositories/agentJobRepository.d.ts.map +1 -0
  430. package/dist/server/server/persistence/repositories/authorizedShareRepository.d.ts +92 -0
  431. package/dist/server/server/persistence/repositories/authorizedShareRepository.d.ts.map +1 -0
  432. package/dist/server/server/persistence/repositories/contentBlobMetadataRepository.d.ts +67 -0
  433. package/dist/server/server/persistence/repositories/contentBlobMetadataRepository.d.ts.map +1 -0
  434. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +2989 -0
  435. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -0
  436. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +566 -0
  437. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -0
  438. package/dist/server/server/persistence/repositories/delivery-graph/integrity.d.ts +16 -0
  439. package/dist/server/server/persistence/repositories/delivery-graph/integrity.d.ts.map +1 -0
  440. package/dist/server/server/persistence/repositories/delivery-graph/quarantine.d.ts +22 -0
  441. package/dist/server/server/persistence/repositories/delivery-graph/quarantine.d.ts.map +1 -0
  442. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +2147 -0
  443. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -0
  444. package/dist/server/server/persistence/repositories/delivery-graph/release-slice.d.ts +16 -0
  445. package/dist/server/server/persistence/repositories/delivery-graph/release-slice.d.ts.map +1 -0
  446. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +683 -0
  447. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -0
  448. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +946 -0
  449. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -0
  450. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +2121 -0
  451. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -0
  452. package/dist/server/server/persistence/repositories/domainEventModels.d.ts +89 -0
  453. package/dist/server/server/persistence/repositories/domainEventModels.d.ts.map +1 -0
  454. package/dist/server/server/persistence/repositories/domainEventRepository.d.ts +85 -0
  455. package/dist/server/server/persistence/repositories/domainEventRepository.d.ts.map +1 -0
  456. package/dist/server/server/persistence/repositories/entityRepository.d.ts +134 -0
  457. package/dist/server/server/persistence/repositories/entityRepository.d.ts.map +1 -0
  458. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts +1478 -0
  459. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts.map +1 -0
  460. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts +858 -0
  461. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts.map +1 -0
  462. package/dist/server/server/persistence/repositories/governed-action/quarantine.d.ts +22 -0
  463. package/dist/server/server/persistence/repositories/governed-action/quarantine.d.ts.map +1 -0
  464. package/dist/server/server/persistence/repositories/governed-action/read.d.ts +452 -0
  465. package/dist/server/server/persistence/repositories/governed-action/read.d.ts.map +1 -0
  466. package/dist/server/server/persistence/repositories/governed-action/rows.d.ts +115 -0
  467. package/dist/server/server/persistence/repositories/governed-action/rows.d.ts.map +1 -0
  468. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts +457 -0
  469. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts.map +1 -0
  470. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts +518 -0
  471. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts.map +1 -0
  472. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts +702 -0
  473. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts.map +1 -0
  474. package/dist/server/server/persistence/repositories/governed-action/write.d.ts +618 -0
  475. package/dist/server/server/persistence/repositories/governed-action/write.d.ts.map +1 -0
  476. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts +467 -0
  477. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts.map +1 -0
  478. package/dist/server/server/persistence/repositories/index.d.ts +26 -0
  479. package/dist/server/server/persistence/repositories/index.d.ts.map +1 -0
  480. package/dist/server/server/persistence/repositories/internal.d.ts +38 -0
  481. package/dist/server/server/persistence/repositories/internal.d.ts.map +1 -0
  482. package/dist/server/server/persistence/repositories/models.d.ts +420 -0
  483. package/dist/server/server/persistence/repositories/models.d.ts.map +1 -0
  484. package/dist/server/server/persistence/repositories/peopleRepository.d.ts +407 -0
  485. package/dist/server/server/persistence/repositories/peopleRepository.d.ts.map +1 -0
  486. package/dist/server/server/persistence/repositories/persistedRowQuarantine.d.ts +20 -0
  487. package/dist/server/server/persistence/repositories/persistedRowQuarantine.d.ts.map +1 -0
  488. package/dist/server/server/persistence/repositories/pluginConfigurationModels.d.ts +76 -0
  489. package/dist/server/server/persistence/repositories/pluginConfigurationModels.d.ts.map +1 -0
  490. package/dist/server/server/persistence/repositories/pluginConfigurationRepository.d.ts +179 -0
  491. package/dist/server/server/persistence/repositories/pluginConfigurationRepository.d.ts.map +1 -0
  492. package/dist/server/server/persistence/repositories/pluginConnectionRepository.d.ts +123 -0
  493. package/dist/server/server/persistence/repositories/pluginConnectionRepository.d.ts.map +1 -0
  494. package/dist/server/server/persistence/repositories/pluginRuntimeModels.d.ts +195 -0
  495. package/dist/server/server/persistence/repositories/pluginRuntimeModels.d.ts.map +1 -0
  496. package/dist/server/server/persistence/repositories/pluginRuntimeRepository.d.ts +431 -0
  497. package/dist/server/server/persistence/repositories/pluginRuntimeRepository.d.ts.map +1 -0
  498. package/dist/server/server/persistence/repositories/providerAccountRepository.d.ts +150 -0
  499. package/dist/server/server/persistence/repositories/providerAccountRepository.d.ts.map +1 -0
  500. package/dist/server/server/persistence/repositories/quarantineRepository.d.ts +42 -0
  501. package/dist/server/server/persistence/repositories/quarantineRepository.d.ts.map +1 -0
  502. package/dist/server/server/persistence/repositories/readiness/assessments.d.ts +2679 -0
  503. package/dist/server/server/persistence/repositories/readiness/assessments.d.ts.map +1 -0
  504. package/dist/server/server/persistence/repositories/readiness/codec.d.ts +1368 -0
  505. package/dist/server/server/persistence/repositories/readiness/codec.d.ts.map +1 -0
  506. package/dist/server/server/persistence/repositories/readiness/contract.d.ts +3315 -0
  507. package/dist/server/server/persistence/repositories/readiness/contract.d.ts.map +1 -0
  508. package/dist/server/server/persistence/repositories/readiness/materialization.d.ts +459 -0
  509. package/dist/server/server/persistence/repositories/readiness/materialization.d.ts.map +1 -0
  510. package/dist/server/server/persistence/repositories/readiness/quarantine.d.ts +22 -0
  511. package/dist/server/server/persistence/repositories/readiness/quarantine.d.ts.map +1 -0
  512. package/dist/server/server/persistence/repositories/readiness/queue.d.ts +112 -0
  513. package/dist/server/server/persistence/repositories/readiness/queue.d.ts.map +1 -0
  514. package/dist/server/server/persistence/repositories/readiness/rows.d.ts +169 -0
  515. package/dist/server/server/persistence/repositories/readiness/rows.d.ts.map +1 -0
  516. package/dist/server/server/persistence/repositories/readiness/rules.d.ts +85 -0
  517. package/dist/server/server/persistence/repositories/readiness/rules.d.ts.map +1 -0
  518. package/dist/server/server/persistence/repositories/readinessRepository.d.ts +1722 -0
  519. package/dist/server/server/persistence/repositories/readinessRepository.d.ts.map +1 -0
  520. package/dist/server/server/persistence/repositories/relationshipRepairProposalRepository.d.ts +294 -0
  521. package/dist/server/server/persistence/repositories/relationshipRepairProposalRepository.d.ts.map +1 -0
  522. package/dist/server/server/persistence/repositories/releaseRepository.d.ts +1062 -0
  523. package/dist/server/server/persistence/repositories/releaseRepository.d.ts.map +1 -0
  524. package/dist/server/server/persistence/repositories/timelineExportAuditRepository.d.ts +39 -0
  525. package/dist/server/server/persistence/repositories/timelineExportAuditRepository.d.ts.map +1 -0
  526. package/dist/server/server/persistence/repositories/timelineRepository.d.ts +84 -0
  527. package/dist/server/server/persistence/repositories/timelineRepository.d.ts.map +1 -0
  528. package/dist/server/server/persistence/repositories/workspaceRepository.d.ts +52 -0
  529. package/dist/server/server/persistence/repositories/workspaceRepository.d.ts.map +1 -0
  530. package/dist/server/server/persistence/schema.d.ts +17 -0
  531. package/dist/server/server/persistence/schema.d.ts.map +1 -0
  532. package/dist/server/server/persistence/schemas.d.ts +14 -0
  533. package/dist/server/server/persistence/schemas.d.ts.map +1 -0
  534. package/dist/server/server/plugins/AtlassianBasicAuth.d.ts +2 -0
  535. package/dist/server/server/plugins/AtlassianBasicAuth.d.ts.map +1 -0
  536. package/dist/server/server/plugins/PluginCapabilityCodecs.d.ts +357 -0
  537. package/dist/server/server/plugins/PluginCapabilityCodecs.d.ts.map +1 -0
  538. package/dist/server/server/plugins/PluginConnection.d.ts +28 -0
  539. package/dist/server/server/plugins/PluginConnection.d.ts.map +1 -0
  540. package/dist/server/server/plugins/PluginConnectionMap.d.ts +22 -0
  541. package/dist/server/server/plugins/PluginConnectionMap.d.ts.map +1 -0
  542. package/dist/server/server/plugins/PluginDefinition.d.ts +9 -0
  543. package/dist/server/server/plugins/PluginDefinition.d.ts.map +1 -0
  544. package/dist/server/server/plugins/PluginDefinitionV1.d.ts +11 -0
  545. package/dist/server/server/plugins/PluginDefinitionV1.d.ts.map +1 -0
  546. package/dist/server/server/plugins/PluginExecutor.d.ts +14 -0
  547. package/dist/server/server/plugins/PluginExecutor.d.ts.map +1 -0
  548. package/dist/server/server/plugins/atlassian/AtlassianOAuthGrants.d.ts +35 -0
  549. package/dist/server/server/plugins/atlassian/AtlassianOAuthGrants.d.ts.map +1 -0
  550. package/dist/server/server/plugins/atlassian/AtlassianProfiles.d.ts +39 -0
  551. package/dist/server/server/plugins/atlassian/AtlassianProfiles.d.ts.map +1 -0
  552. package/dist/server/server/plugins/catalog/firstPartyServiceCatalog.d.ts +13 -0
  553. package/dist/server/server/plugins/catalog/firstPartyServiceCatalog.d.ts.map +1 -0
  554. package/dist/server/server/plugins/clockify/ClockifyReadPlugin.d.ts +78 -0
  555. package/dist/server/server/plugins/clockify/ClockifyReadPlugin.d.ts.map +1 -0
  556. package/dist/server/server/plugins/clockify/ClockifyReadProvider.d.ts +2 -0
  557. package/dist/server/server/plugins/clockify/ClockifyReadProvider.d.ts.map +1 -0
  558. package/dist/server/server/plugins/clockify/ClockifyTimeEntryNormalization.d.ts +2 -0
  559. package/dist/server/server/plugins/clockify/ClockifyTimeEntryNormalization.d.ts.map +1 -0
  560. package/dist/server/server/plugins/clockify/index.d.ts +3 -0
  561. package/dist/server/server/plugins/clockify/index.d.ts.map +1 -0
  562. package/dist/server/server/plugins/codecommit/CodeCommitPluginDefinition.d.ts +4 -0
  563. package/dist/server/server/plugins/codecommit/CodeCommitPluginDefinition.d.ts.map +1 -0
  564. package/dist/server/server/plugins/codecommit/index.d.ts +3 -0
  565. package/dist/server/server/plugins/codecommit/index.d.ts.map +1 -0
  566. package/dist/server/server/plugins/codepipeline/CodePipelinePluginDefinition.d.ts +4 -0
  567. package/dist/server/server/plugins/codepipeline/CodePipelinePluginDefinition.d.ts.map +1 -0
  568. package/dist/server/server/plugins/codepipeline/CodePipelineReadClient.d.ts +2 -0
  569. package/dist/server/server/plugins/codepipeline/CodePipelineReadClient.d.ts.map +1 -0
  570. package/dist/server/server/plugins/codepipeline/CodePipelineReadProvider.d.ts +2 -0
  571. package/dist/server/server/plugins/codepipeline/CodePipelineReadProvider.d.ts.map +1 -0
  572. package/dist/server/server/plugins/codepipeline/index.d.ts +3 -0
  573. package/dist/server/server/plugins/codepipeline/index.d.ts.map +1 -0
  574. package/dist/server/server/plugins/confluence/ConfluencePageAdapter.d.ts +2 -0
  575. package/dist/server/server/plugins/confluence/ConfluencePageAdapter.d.ts.map +1 -0
  576. package/dist/server/server/plugins/confluence/ConfluencePageClient.d.ts +2 -0
  577. package/dist/server/server/plugins/confluence/ConfluencePageClient.d.ts.map +1 -0
  578. package/dist/server/server/plugins/confluence/ConfluencePagePluginDefinition.d.ts +44 -0
  579. package/dist/server/server/plugins/confluence/ConfluencePagePluginDefinition.d.ts.map +1 -0
  580. package/dist/server/server/plugins/confluence/ConfluencePageSchemas.d.ts +2 -0
  581. package/dist/server/server/plugins/confluence/ConfluencePageSchemas.d.ts.map +1 -0
  582. package/dist/server/server/plugins/confluence/SafeConfluenceMarkdown.d.ts +2 -0
  583. package/dist/server/server/plugins/confluence/SafeConfluenceMarkdown.d.ts.map +1 -0
  584. package/dist/server/server/plugins/failures.d.ts +79 -0
  585. package/dist/server/server/plugins/failures.d.ts.map +1 -0
  586. package/dist/server/server/plugins/fake/FakePluginDefinition.d.ts +17 -0
  587. package/dist/server/server/plugins/fake/FakePluginDefinition.d.ts.map +1 -0
  588. package/dist/server/server/plugins/fake/FakePluginProbe.d.ts +40 -0
  589. package/dist/server/server/plugins/fake/FakePluginProbe.d.ts.map +1 -0
  590. package/dist/server/server/plugins/fake/FakePluginScenario.d.ts +46 -0
  591. package/dist/server/server/plugins/fake/FakePluginScenario.d.ts.map +1 -0
  592. package/dist/server/server/plugins/firstPartySynchronization.d.ts +7 -0
  593. package/dist/server/server/plugins/firstPartySynchronization.d.ts.map +1 -0
  594. package/dist/server/server/plugins/index.d.ts +21 -0
  595. package/dist/server/server/plugins/index.d.ts.map +1 -0
  596. package/dist/server/server/plugins/internal/AuthorizedPluginExecutor.d.ts +8 -0
  597. package/dist/server/server/plugins/internal/AuthorizedPluginExecutor.d.ts.map +1 -0
  598. package/dist/server/server/plugins/internal/AuthorizedPluginExecutorMap.d.ts +27 -0
  599. package/dist/server/server/plugins/internal/AuthorizedPluginExecutorMap.d.ts.map +1 -0
  600. package/dist/server/server/plugins/internal/FirstPartyPluginRuntimeRegistry.d.ts +2 -0
  601. package/dist/server/server/plugins/internal/FirstPartyPluginRuntimeRegistry.d.ts.map +1 -0
  602. package/dist/server/server/plugins/internal/PluginRuntime.d.ts +13 -0
  603. package/dist/server/server/plugins/internal/PluginRuntime.d.ts.map +1 -0
  604. package/dist/server/server/plugins/internal/PluginRuntimeAuthority.d.ts +154 -0
  605. package/dist/server/server/plugins/internal/PluginRuntimeAuthority.d.ts.map +1 -0
  606. package/dist/server/server/plugins/internal/PluginRuntimeAuthorityRepository.d.ts +131 -0
  607. package/dist/server/server/plugins/internal/PluginRuntimeAuthorityRepository.d.ts.map +1 -0
  608. package/dist/server/server/plugins/internal/PluginRuntimeAuthoritySource.d.ts +23 -0
  609. package/dist/server/server/plugins/internal/PluginRuntimeAuthoritySource.d.ts.map +1 -0
  610. package/dist/server/server/plugins/internal/PluginRuntimeMap.d.ts +23 -0
  611. package/dist/server/server/plugins/internal/PluginRuntimeMap.d.ts.map +1 -0
  612. package/dist/server/server/plugins/internal/PluginRuntimeRegistry.d.ts +21 -0
  613. package/dist/server/server/plugins/internal/PluginRuntimeRegistry.d.ts.map +1 -0
  614. package/dist/server/server/plugins/jira/JiraIssueNormalization.d.ts +2 -0
  615. package/dist/server/server/plugins/jira/JiraIssueNormalization.d.ts.map +1 -0
  616. package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts +74 -0
  617. package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts.map +1 -0
  618. package/dist/server/server/plugins/jira/JiraReadProvider.d.ts +7 -0
  619. package/dist/server/server/plugins/jira/JiraReadProvider.d.ts.map +1 -0
  620. package/dist/server/server/plugins/jira/index.d.ts +3 -0
  621. package/dist/server/server/plugins/jira/index.d.ts.map +1 -0
  622. package/dist/server/server/plugins/negotiation.d.ts +75 -0
  623. package/dist/server/server/plugins/negotiation.d.ts.map +1 -0
  624. package/dist/server/server/plugins/retryPolicy.d.ts +28 -0
  625. package/dist/server/server/plugins/retryPolicy.d.ts.map +1 -0
  626. package/dist/server/server/readinessDigests.d.ts +103 -0
  627. package/dist/server/server/readinessDigests.d.ts.map +1 -0
  628. package/dist/server/server/runtime/Bootstrap.d.ts +39 -0
  629. package/dist/server/server/runtime/Bootstrap.d.ts.map +1 -0
  630. package/dist/server/server/runtime/ControlCenterServer.d.ts +57 -0
  631. package/dist/server/server/runtime/ControlCenterServer.d.ts.map +1 -0
  632. package/dist/server/server/runtime/DatabaseDrain.d.ts +6 -0
  633. package/dist/server/server/runtime/DatabaseDrain.d.ts.map +1 -0
  634. package/dist/server/server/runtime/DomainEventWakeups.d.ts +22 -0
  635. package/dist/server/server/runtime/DomainEventWakeups.d.ts.map +1 -0
  636. package/dist/server/server/runtime/FirstPartyPluginRuntime.d.ts +2 -0
  637. package/dist/server/server/runtime/FirstPartyPluginRuntime.d.ts.map +1 -0
  638. package/dist/server/server/runtime/GovernedActionExecutionStartup.d.ts +35 -0
  639. package/dist/server/server/runtime/GovernedActionExecutionStartup.d.ts.map +1 -0
  640. package/dist/server/server/runtime/NodeTransport.d.ts +57 -0
  641. package/dist/server/server/runtime/NodeTransport.d.ts.map +1 -0
  642. package/dist/server/server/runtime/ReleaseSynchronizationStartup.d.ts +44 -0
  643. package/dist/server/server/runtime/ReleaseSynchronizationStartup.d.ts.map +1 -0
  644. package/dist/server/server/runtime/RequestUrlBoundary.d.ts +4 -0
  645. package/dist/server/server/runtime/RequestUrlBoundary.d.ts.map +1 -0
  646. package/dist/server/server/runtime/ServerLifecycle.d.ts +74 -0
  647. package/dist/server/server/runtime/ServerLifecycle.d.ts.map +1 -0
  648. package/dist/server/server/runtime/index.d.ts +9 -0
  649. package/dist/server/server/runtime/index.d.ts.map +1 -0
  650. package/dist/server/server/secrets/SecretRef.d.ts +6 -0
  651. package/dist/server/server/secrets/SecretRef.d.ts.map +1 -0
  652. package/dist/server/server/secrets/SecretStore.d.ts +39 -0
  653. package/dist/server/server/secrets/SecretStore.d.ts.map +1 -0
  654. package/dist/server/server/secrets/SecretStoreError.d.ts +41 -0
  655. package/dist/server/server/secrets/SecretStoreError.d.ts.map +1 -0
  656. package/dist/server/server/secrets/index.d.ts +5 -0
  657. package/dist/server/server/secrets/index.d.ts.map +1 -0
  658. package/dist/server/server/security/BindConfig.d.ts +51 -0
  659. package/dist/server/server/security/BindConfig.d.ts.map +1 -0
  660. package/dist/server/server/security/RequestSecurity.d.ts +84 -0
  661. package/dist/server/server/security/RequestSecurity.d.ts.map +1 -0
  662. package/dist/server/server/security/index.d.ts +3 -0
  663. package/dist/server/server/security/index.d.ts.map +1 -0
  664. package/package.json +101 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentPage-Bom41la2.js","names":[],"sources":["../../../src/client/releases/releaseAgentThreadStorage.ts","../../../src/client/releases/releaseAgentTransport.ts","../../../src/client/AgentPage.module.css","../../../src/client/AgentPage.tsx"],"sourcesContent":["import * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\n\nimport { SessionId } from \"../../api/session.js\"\nimport { EventCursor, type ReleaseId } from \"../../domain/identifiers.js\"\nimport { ReleaseServiceName, ReleaseVersion } from \"../../domain/release.js\"\nimport { ReleaseRelayCodename } from \"../../domain/releaseRelay.js\"\nimport { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\n\nconst MAXIMUM_STORED_MESSAGES = 24\nconst MAXIMUM_STORED_CONTENT = 256_000\n\nconst StoredReleaseAgentTurnContext = Schema.Struct({\n eventCursor: EventCursor,\n relayCodename: ReleaseRelayCodename,\n serviceName: ReleaseServiceName,\n updatedAt: UtcTimestamp,\n version: ReleaseVersion\n})\n\nconst StoredReleaseAgentThreadMessage = Schema.Struct({\n content: Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(32_000)),\n context: Schema.optionalKey(StoredReleaseAgentTurnContext),\n dateTime: Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(64)),\n id: Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(100)),\n provider: Schema.optionalKey(Schema.Literals([\"codex\", \"claude\"])),\n role: Schema.Literals([\"user\", \"assistant\"]),\n time: Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(32))\n})\n\nconst hasUniqueMessageIds = (messages: ReadonlyArray<{ readonly id: string }>): boolean => {\n const ids = new Set<string>()\n for (const message of messages) {\n if (ids.has(message.id)) return false\n ids.add(message.id)\n }\n return true\n}\n\nconst StoredReleaseAgentThread = Schema.Array(StoredReleaseAgentThreadMessage).check(\n Schema.makeFilter((messages) => messages.length <= MAXIMUM_STORED_MESSAGES, {\n expected: `at most ${MAXIMUM_STORED_MESSAGES} stored release-agent messages`\n }),\n Schema.makeFilter(\n (messages) => messages.reduce((length, message) => length + message.content.length, 0) <= MAXIMUM_STORED_CONTENT,\n { expected: `at most ${MAXIMUM_STORED_CONTENT} stored release-agent characters` }\n ),\n Schema.makeFilter(hasUniqueMessageIds, {\n expected: \"unique stored release-agent message ids\"\n })\n)\n\nconst StoredReleaseAgentThreadJson = Schema.fromJsonString(StoredReleaseAgentThread)\n\nexport type StoredReleaseAgentThreadMessage = typeof StoredReleaseAgentThreadMessage.Type\n\nconst storageKey = (releaseId: ReleaseId): string | null => {\n const sessionId = sessionStorage.getItem(\"cc_session_id\")\n if (sessionId === null || !Schema.is(SessionId)(sessionId)) return null\n return `cc_release_agent_thread:${sessionId}:${releaseId}`\n}\n\nconst boundedStoredMessages = (\n messages: ReadonlyArray<StoredReleaseAgentThreadMessage>\n): ReadonlyArray<StoredReleaseAgentThreadMessage> => {\n const bounded: Array<StoredReleaseAgentThreadMessage> = []\n let contentLength = 0\n for (const message of messages.slice(-MAXIMUM_STORED_MESSAGES).reverse()) {\n if (contentLength + message.content.length > MAXIMUM_STORED_CONTENT) break\n bounded.unshift(message)\n contentLength += message.content.length\n }\n return bounded\n}\n\n/** Recover only Schema-valid tab-local thread state for the exact release. */\nexport const readReleaseAgentThread = (\n releaseId: ReleaseId\n): ReadonlyArray<StoredReleaseAgentThreadMessage> => {\n try {\n const key = storageKey(releaseId)\n if (key === null) return []\n const source = sessionStorage.getItem(key)\n if (source === null) return []\n const decoded = Schema.decodeUnknownResult(StoredReleaseAgentThreadJson)(source)\n return Result.isSuccess(decoded) ? decoded.success : []\n } catch {\n return []\n }\n}\n\n/** Persist a bounded release thread for the lifetime of the current browser tab. */\nexport const writeReleaseAgentThread = (\n releaseId: ReleaseId,\n messages: ReadonlyArray<StoredReleaseAgentThreadMessage>\n): void => {\n const encoded = Schema.encodeUnknownResult(StoredReleaseAgentThreadJson)(boundedStoredMessages(messages))\n if (Result.isFailure(encoded)) return\n try {\n const key = storageKey(releaseId)\n if (key === null) return\n sessionStorage.setItem(key, encoded.success)\n } catch {\n // Storage can be unavailable in hardened browser contexts; the in-memory thread still works.\n }\n}\n","import * as Data from \"effect/Data\"\nimport * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\n\nimport type { ReleaseAgentTurn } from \"../AgentPage.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\nclass ReleaseAgentProtocolError extends Data.TaggedError(\"ReleaseAgentProtocolError\") {}\n\nconst runTurnEffect = Effect.fn(\"ReleaseAgentTransport.runTurn\")(function*(\n input: Parameters<ReleaseAgentTurn>[0]\n) {\n const client = yield* makeAuthenticatedMutationClient\n const response = yield* client.agent.turn({\n params: { releaseId: input.releaseId },\n payload: {\n history: input.history,\n prompt: input.prompt,\n provider: \"codex\"\n }\n })\n if (response.releaseId !== input.releaseId || response.release.releaseId !== input.releaseId) {\n return yield* Effect.fail(new ReleaseAgentProtocolError())\n }\n return {\n eventCursor: response.eventCursor,\n provider: response.provider,\n release: response.release,\n reply: response.reply\n }\n})\n\n/** Browser transport for the default read-only Codex release agent. */\nexport const runBrowserReleaseAgentTurn: ReleaseAgentTurn = (input, { signal }) =>\n Effect.runPromise(runTurnEffect(input).pipe(Effect.provide(FetchHttpClient.layer)), { signal })\n",".room,\n.hero,\n.heroCopy,\n.people,\n.starters,\n.composer,\n.legacy,\n.legacyHeader,\n.legacyContext {\n display: grid;\n}\n\n.room,\n.legacy {\n gap: clamp(4rem, 9vw, 8rem);\n}\n\n.back {\n inline-size: fit-content;\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.back:hover,\n.back:focus-visible {\n color: var(--rly-color-text-1);\n text-decoration: underline;\n text-underline-offset: var(--rly-space-4);\n}\n\n.hero,\n.legacyHeader {\n gap: var(--rly-space-32);\n}\n\n.heroCopy,\n.legacyHeader {\n max-inline-size: 58rem;\n}\n\n.heroCopy {\n gap: var(--rly-space-16);\n}\n\n.heroCopy h1,\n.legacyHeader h1 {\n max-inline-size: 11ch;\n letter-spacing: -0.065em;\n text-wrap: balance;\n}\n\n.heroCopy p,\n.legacyHeader p {\n max-inline-size: 46rem;\n}\n\n.eyebrow {\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.people,\n.starters {\n gap: var(--rly-space-24);\n}\n\n.suggestionList {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--rly-space-12);\n}\n\n.suggestion {\n min-block-size: 7rem;\n padding: var(--rly-space-20);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n cursor: pointer;\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n text-align: start;\n transition:\n border-color var(--rly-motion-fast-duration) var(--rly-motion-fast-easing),\n background-color var(--rly-motion-fast-duration) var(--rly-motion-fast-easing);\n}\n\n.suggestion:hover,\n.suggestion:focus-visible {\n border-color: var(--rly-color-agent);\n background: var(--rly-color-surface-2);\n outline: none;\n}\n\n.suggestion:disabled {\n cursor: not-allowed;\n opacity: 0.45;\n}\n\n.thread {\n border-color: var(--rly-color-border-2);\n}\n\n.threadContext {\n display: flex;\n flex-wrap: wrap;\n gap: var(--rly-space-8) var(--rly-space-16);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.threadContext strong {\n color: var(--rly-color-text-1);\n}\n\n.threadContext span + span::before {\n margin-inline-end: var(--rly-space-16);\n color: var(--rly-color-border-2);\n content: \"·\";\n}\n\n.composer {\n gap: var(--rly-space-16);\n}\n\n.composer textarea {\n min-block-size: 10rem;\n resize: vertical;\n font: var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height)\n var(--rly-type-body-large-font);\n}\n\n.failure {\n scroll-margin-block-start: 6rem;\n}\n\n.state {\n display: grid;\n min-block-size: 60dvh;\n place-items: center;\n}\n\n.legacyHeader,\n.legacyContext {\n gap: var(--rly-space-16);\n}\n\n.legacyContext {\n max-inline-size: 52rem;\n}\n\n@media (max-width: 48rem) {\n .suggestionList {\n grid-template-columns: 1fr;\n }\n\n .suggestion {\n min-block-size: 5rem;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .suggestion {\n transition: none;\n }\n}\n","import { AgentThread, PeopleStrip, ReleaseRelay, type RlyAgentThreadMessage } from \"@knpkv/rly/patterns\"\nimport { Button, Field, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Predicate from \"effect/Predicate\"\nimport { type FormEvent, type ReactElement, useEffect, useMemo, useRef, useState } from \"react\"\nimport { Link, useLocation, useOutletContext, useParams, useSearchParams } from \"react-router\"\n\nimport type { PortfolioReleaseSummary } from \"../api/portfolio.js\"\nimport type { EventCursor, ReleaseId, WorkspaceId } from \"../domain/identifiers.js\"\nimport type { PortfolioReleasePresentation } from \"./portfolio/presentPortfolio.js\"\nimport {\n decodeReleaseRouteId,\n decodeWorkspaceRouteId,\n releaseFullPath,\n releaseTransitionNames\n} from \"./releases/releaseRoutes.js\"\nimport {\n readReleaseAgentThread,\n type StoredReleaseAgentThreadMessage,\n writeReleaseAgentThread\n} from \"./releases/releaseAgentThreadStorage.js\"\nimport type { WorkspaceReleaseOutletContext } from \"./releases/WorkspaceReleaseLayout.js\"\nimport { runBrowserReleaseAgentTurn } from \"./releases/releaseAgentTransport.js\"\nimport styles from \"./AgentPage.module.css\"\n\nexport interface ReleaseAgentHistoryMessage {\n readonly content: string\n readonly role: \"assistant\" | \"user\"\n}\n\nexport interface ReleaseAgentTurnInput {\n readonly history: ReadonlyArray<ReleaseAgentHistoryMessage>\n readonly prompt: string\n readonly releaseId: ReleaseId\n readonly workspaceId: WorkspaceId\n}\n\nexport interface ReleaseAgentTurnResult {\n readonly eventCursor: EventCursor\n readonly provider: \"claude\" | \"codex\"\n readonly release: PortfolioReleaseSummary\n readonly reply: string\n}\n\nexport type ReleaseAgentTurn = (\n input: ReleaseAgentTurnInput,\n options: { readonly signal: AbortSignal }\n) => Promise<ReleaseAgentTurnResult>\n\nexport interface AgentPageProps {\n /** Application-owned local runtime boundary. Omit it to render an honest unavailable state. */\n readonly runTurn?: ReleaseAgentTurn\n}\n\ninterface AgentPageContext {\n readonly description: string\n readonly label: string\n readonly path: string | null\n}\n\ntype LocalThreadMessage = StoredReleaseAgentThreadMessage\n\ntype TurnFailure = \"blocked\" | \"failed\" | \"not-found\" | \"rate-limited\" | \"session-expired\" | \"timed-out\" | \"unavailable\"\n\nconst DEFAULT_CONTEXT: AgentPageContext = {\n description: \"The workspace-wide view of release readiness, people, source health, and agent work.\",\n label: \"Overview\",\n path: \"/\"\n}\n\nconst contexts: Readonly<Record<string, AgentPageContext>> = {\n \"/\": DEFAULT_CONTEXT,\n \"/pair\": {\n description: \"The private browser-pairing flow. Credentials never become part of the agent context.\",\n label: \"Browser pairing\",\n path: \"/pair\"\n },\n \"/releases\": {\n description: \"Release relationships, blockers, collaborators, pull requests, and deployment evidence.\",\n label: \"Releases\",\n path: \"/releases\"\n },\n \"/services\": {\n description: \"Negotiated plugin health and the connections that provide delivery evidence.\",\n label: \"Services\",\n path: \"/services\"\n }\n}\n\nconst AGENT_CONTEXT_BASE = \"https://control-center.invalid\"\n\nconst contextFor = (path: string | null): AgentPageContext => {\n if (path === null) return DEFAULT_CONTEXT\n const contextUrl = URL.parse(path, AGENT_CONTEXT_BASE)\n if (contextUrl === null || contextUrl.origin !== AGENT_CONTEXT_BASE) {\n return {\n description:\n \"The calling page is not a recognized Control Center context. No fallback workspace or entity is substituted.\",\n label: \"Context unavailable\",\n path: null\n }\n }\n const safePath = `${contextUrl.pathname}${contextUrl.search}${contextUrl.hash}`\n const knownContext = contexts[contextUrl.pathname]\n if (knownContext !== undefined) return { ...knownContext, path: safePath }\n const routeSegments = contextUrl.pathname.split(\"/\")\n const workspaceId = decodeWorkspaceRouteId(routeSegments[2])\n const routeKind = routeSegments[3]\n const releaseId = decodeReleaseRouteId(routeSegments[4])\n const releaseSuffix = routeSegments[5]\n const isWorkspaceCollectionRoute = routeSegments[1] === \"w\" && routeSegments[4] === undefined\n const isReleaseRoute =\n routeSegments[1] === \"w\" &&\n workspaceId !== null &&\n routeKind === \"releases\" &&\n releaseId !== null &&\n (releaseSuffix === undefined || releaseSuffix === \"preview\" || releaseSuffix === \"agent\")\n if (isWorkspaceCollectionRoute && workspaceId !== null && routeKind === \"overview\" && releaseId === null) {\n return {\n description: `Workspace ${workspaceId} release readiness, people, source health, and agent work.`,\n label: \"Workspace overview\",\n path: safePath\n }\n }\n if (isWorkspaceCollectionRoute && workspaceId !== null && routeKind === \"items\" && releaseId === null) {\n return {\n description: `Current normalized delivery items in workspace ${workspaceId}, including the exact active filters and selection.`,\n label: \"Workspace items\",\n path: safePath\n }\n }\n if (isWorkspaceCollectionRoute && workspaceId !== null && routeKind === \"timeline\" && releaseId === null) {\n const selectedEvent = contextUrl.searchParams.get(\"event\")\n return {\n description:\n selectedEvent === null\n ? `Attributable delivery activity in workspace ${workspaceId}, including the exact actor and date filters.`\n : `Timeline event ${selectedEvent} in workspace ${workspaceId}, including the exact actor and date filters.`,\n label: \"Workspace timeline\",\n path: safePath\n }\n }\n const activeWorkRelease = contextUrl.searchParams.get(\"release\")\n const hasValidActiveWorkRelease = activeWorkRelease === null || decodeReleaseRouteId(activeWorkRelease) !== null\n if (\n isWorkspaceCollectionRoute &&\n workspaceId !== null &&\n routeKind === \"work\" &&\n releaseId === null &&\n hasValidActiveWorkRelease\n ) {\n return {\n description: `Active release decisions in workspace ${workspaceId}, including the exact selected release and filters.`,\n label: \"Active work\",\n path: safePath\n }\n }\n if (isReleaseRoute) {\n return {\n description: `Release ${releaseId} in workspace ${workspaceId}. Relay will resolve current release facts on the server before answering.`,\n label: `Release ${releaseId.slice(-6)}`,\n path: safePath\n }\n }\n return {\n description:\n \"The calling page is not a recognized Control Center context. No fallback workspace or entity is substituted.\",\n label: \"Context unavailable\",\n path: null\n }\n}\n\nconst timestamp = (): Pick<LocalThreadMessage, \"dateTime\" | \"time\"> => {\n const now = DateTime.nowUnsafe()\n return {\n dateTime: DateTime.formatIso(now),\n time: DateTime.formatLocal(now, { hour: \"2-digit\", minute: \"2-digit\" })\n }\n}\n\nconst failureTag = (failure: unknown): string | null => {\n if (!Predicate.hasProperty(failure, \"_tag\") || typeof failure._tag !== \"string\") return null\n return failure._tag\n}\n\nconst classifyTurnFailure = (failure: unknown): TurnFailure => {\n switch (failureTag(failure)) {\n case \"UnauthorizedApiError\":\n return \"session-expired\"\n case \"ForbiddenApiError\":\n return \"blocked\"\n case \"NotFoundApiError\":\n case \"ApplicationResourceNotFound\":\n return \"not-found\"\n case \"ServiceUnavailableApiError\":\n case \"ApplicationServiceUnavailable\":\n return \"unavailable\"\n case \"RateLimitedApiError\":\n return \"rate-limited\"\n case \"RequestTimedOutApiError\":\n return \"timed-out\"\n default:\n return \"failed\"\n }\n}\n\nconst failurePanel = (failure: TurnFailure): ReactElement => {\n switch (failure) {\n case \"session-expired\":\n return (\n <StatePanel\n action={<Link to=\"/pair\">Pair this browser</Link>}\n announce=\"assertive\"\n description=\"Pair this browser again, then return to the release thread. Your local messages remain in this tab.\"\n title=\"Session expired\"\n tone=\"caution\"\n />\n )\n case \"blocked\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"This connection cannot run a release agent. Use an allowed Control Center address.\"\n title=\"Agent access blocked\"\n tone=\"critical\"\n />\n )\n case \"not-found\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"This release is no longer in the current workspace snapshot. Return to the release before asking again.\"\n title=\"Release not found\"\n tone=\"caution\"\n />\n )\n case \"unavailable\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"Start the configured local Codex or Claude runner, then ask again.\"\n title=\"Relay is unavailable\"\n tone=\"caution\"\n />\n )\n case \"rate-limited\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"Relay has reached its local turn budget. Wait a moment, then submit the message again.\"\n title=\"Too many agent turns\"\n tone=\"caution\"\n />\n )\n case \"timed-out\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"The local model exceeded this turn's deadline. Narrow the question, then submit it again.\"\n title=\"Relay took too long\"\n tone=\"caution\"\n />\n )\n case \"failed\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"The agent did not complete this turn. Your message is still here; ask again when the runtime is ready.\"\n title=\"Relay could not answer\"\n tone=\"critical\"\n />\n )\n }\n}\n\nconst SUGGESTIONS: ReadonlyArray<string> = [\n \"What blocks this release?\",\n \"Write a concise release summary.\",\n \"Which evidence is still missing?\"\n]\n\nconst MAXIMUM_HISTORY_MESSAGES = 12\nconst MAXIMUM_HISTORY_MESSAGE_LENGTH = 12_000\nconst MAXIMUM_HISTORY_CONTENT_LENGTH = 64_000\nconst HISTORY_TRUNCATION_MARKER = \"\\n[earlier content truncated]\"\n\n/** Keep browser-owned thread history inside the public agent-turn payload contract. */\nexport const boundedReleaseAgentHistory = (\n messages: ReadonlyArray<ReleaseAgentHistoryMessage>\n): ReadonlyArray<ReleaseAgentHistoryMessage> => {\n const history: Array<ReleaseAgentHistoryMessage> = []\n let contentLength = 0\n for (const message of messages.slice(-MAXIMUM_HISTORY_MESSAGES).reverse()) {\n const content =\n message.content.length <= MAXIMUM_HISTORY_MESSAGE_LENGTH\n ? message.content\n : `${message.content.slice(0, MAXIMUM_HISTORY_MESSAGE_LENGTH - HISTORY_TRUNCATION_MARKER.length)}${HISTORY_TRUNCATION_MARKER}`\n if (contentLength + content.length > MAXIMUM_HISTORY_CONTENT_LENGTH) break\n history.unshift({ content, role: message.role })\n contentLength += content.length\n }\n return history\n}\n\nconst humanActor = {\n kind: \"human\",\n person: { avatarFallback: \"YO\", id: \"current-operator\", name: \"You\", role: \"Release operator\" }\n} satisfies RlyAgentThreadMessage[\"actor\"]\n\nconst agentActor = {\n avatarFallback: \"AI\",\n id: \"relay\",\n kind: \"agent\",\n name: \"Relay\",\n role: \"Release agent\"\n} satisfies RlyAgentThreadMessage[\"actor\"]\n\nconst presentMessages = (messages: ReadonlyArray<LocalThreadMessage>): ReadonlyArray<RlyAgentThreadMessage> =>\n messages.map((message) => ({\n actor: message.role === \"user\" ? humanActor : agentActor,\n content: message.content,\n dateTime: message.dateTime,\n id: message.id,\n time: message.time,\n ...(message.context === undefined\n ? {}\n : {\n evidence: (\n <span>\n Answered from {message.context.serviceName} {message.context.version} · {message.context.relayCodename} ·\n snapshot {message.context.eventCursor}\n </span>\n )\n })\n }))\n\nconst nextThreadSequence = (messages: ReadonlyArray<LocalThreadMessage>): number =>\n messages.reduce((next, { id }) => {\n const sequence = Number(id.split(\"-\")[1])\n return Number.isSafeInteger(sequence) && sequence >= next ? sequence + 1 : next\n }, 0)\n\nconst ReleaseAgentComposer = ({\n disabled,\n isRunning,\n onPromptChange,\n onSubmit,\n prompt\n}: {\n readonly disabled: boolean\n readonly isRunning: boolean\n readonly onPromptChange: (prompt: string) => void\n readonly onSubmit: (event: FormEvent<HTMLFormElement>) => void\n readonly prompt: string\n}): ReactElement => (\n <form className={styles.composer} onSubmit={onSubmit}>\n <Field label=\"What do you need?\">\n {(controlProps) => (\n <textarea\n {...controlProps}\n autoFocus\n disabled={disabled}\n maxLength={8_000}\n onChange={(event) => onPromptChange(event.currentTarget.value)}\n placeholder=\"Ask about blockers, people, checks, or release notes…\"\n rows={4}\n value={prompt}\n />\n )}\n </Field>\n <Button\n disabled={disabled || prompt.trim().length === 0}\n loading={isRunning}\n size=\"principal\"\n stretch\n type=\"submit\"\n variant=\"primary\"\n >\n Ask Relay\n </Button>\n </form>\n)\n\nconst ReleaseAgentRoom = ({\n release,\n runTurn,\n workspaceId\n}: {\n readonly release: PortfolioReleasePresentation\n readonly runTurn: ReleaseAgentTurn | undefined\n readonly workspaceId: WorkspaceId\n}): ReactElement => {\n const location = useLocation()\n const [prompt, setPrompt] = useState(\"\")\n const [messages, setMessages] = useState<ReadonlyArray<LocalThreadMessage>>(() => readReleaseAgentThread(release.id))\n const [failure, setFailure] = useState<TurnFailure | null>(null)\n const [isRunning, setIsRunning] = useState(false)\n const [announcement, setAnnouncement] = useState(\"\")\n const nextMessage = useRef(nextThreadSequence(messages))\n const activeTurn = useRef<AbortController | null>(null)\n const transitionNames = releaseTransitionNames(release.id)\n\n useEffect(\n () => () => {\n const currentTurn = activeTurn.current\n activeTurn.current = null\n currentTurn?.abort()\n },\n []\n )\n\n useEffect(() => {\n writeReleaseAgentThread(release.id, messages)\n }, [messages, release.id])\n\n const threadMessages = useMemo(() => presentMessages(messages), [messages])\n const lastProvider = [...messages].reverse().find((message) => message.provider !== undefined)?.provider\n const runtimeUnavailable = runTurn === undefined\n\n const onSubmit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n const submittedPrompt = prompt.trim()\n if (submittedPrompt.length === 0 || runTurn === undefined || isRunning) return\n const history = boundedReleaseAgentHistory(messages)\n const humanMessage = {\n ...timestamp(),\n content: submittedPrompt,\n id: `turn-${nextMessage.current++}-human`,\n role: \"user\"\n } satisfies LocalThreadMessage\n const abortController = new AbortController()\n activeTurn.current?.abort()\n activeTurn.current = abortController\n setMessages((current) => [...current, humanMessage])\n setPrompt(\"\")\n setFailure(null)\n setIsRunning(true)\n setAnnouncement(\"Relay is reading the release context.\")\n\n runTurn(\n { history, prompt: submittedPrompt, releaseId: release.id, workspaceId },\n { signal: abortController.signal }\n )\n .then(\n (result) => {\n if (abortController.signal.aborted) return\n const reply = result.reply.trim()\n if (reply.length === 0) {\n setFailure(\"failed\")\n setAnnouncement(\"Relay returned an empty answer.\")\n return\n }\n setMessages((current) => [\n ...current,\n {\n ...timestamp(),\n content: reply,\n context: {\n eventCursor: result.eventCursor,\n relayCodename: result.release.relay.codename,\n serviceName: result.release.serviceName,\n updatedAt: result.release.updatedAt,\n version: result.release.version\n },\n id: `turn-${nextMessage.current++}-agent`,\n provider: result.provider,\n role: \"assistant\"\n }\n ])\n setAnnouncement(\"Relay answered in this release thread.\")\n },\n (cause: unknown) => {\n if (abortController.signal.aborted) return\n setFailure(classifyTurnFailure(cause))\n setAnnouncement(\"Relay could not complete this turn.\")\n }\n )\n .finally(() => {\n if (activeTurn.current !== abortController) return\n activeTurn.current = null\n setIsRunning(false)\n })\n }\n\n return (\n <article className={styles.room} data-release-agent-id={release.id}>\n <Link className={styles.back} state={location.state} to={releaseFullPath(workspaceId, release.id)}>\n Back to release\n </Link>\n <header className={styles.hero}>\n <ReleaseRelay\n algorithm={release.relay.algorithm}\n codename={release.relay.codename}\n data-rly-release-transition-name={transitionNames.relay}\n data-rly-release-transition-part=\"relay\"\n size=\"hero\"\n style={{ viewTransitionName: transitionNames.relay }}\n symbolIndices={release.relay.symbolIndices}\n />\n <div className={styles.heroCopy}>\n <Text className={styles.eyebrow} tone=\"secondary\" variant=\"label\">\n {release.lifecycleLabel} · {release.version}\n </Text>\n <Text as=\"h1\" id=\"agent-title\" variant=\"verdict\">\n Ask {release.relay.codename}.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n Relay resolves the current release before every answer. This thread stays in this tab.\n </Text>\n </div>\n </header>\n\n <section aria-labelledby=\"agent-collaborators\" className={styles.people}>\n <Text as=\"h2\" id=\"agent-collaborators\" variant=\"section-title\">\n In this release\n </Text>\n {release.collaborators.length === 0 ? (\n <Text tone=\"secondary\">No owner or approver is assigned yet.</Text>\n ) : (\n <PeopleStrip\n aria-label={`${release.serviceName} release collaborators`}\n expanded\n limit={release.collaborators.length}\n onExpandedChange={() => undefined}\n people={release.collaborators}\n />\n )}\n </section>\n\n <section aria-labelledby=\"agent-starters\" className={styles.starters}>\n <Text as=\"h2\" id=\"agent-starters\" tone=\"secondary\" variant=\"label\">\n Start with one question\n </Text>\n <div className={styles.suggestionList}>\n {SUGGESTIONS.map((suggestion) => (\n <button\n className={styles.suggestion}\n disabled={runtimeUnavailable || isRunning}\n key={suggestion}\n onClick={() => setPrompt(suggestion)}\n type=\"button\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </section>\n\n {runtimeUnavailable ? (\n <StatePanel\n description=\"Connect the server to a local Codex or Claude runner. Provider credentials and repository access stay server-side; this tab stores its bounded thread locally.\"\n title=\"Local agent not connected\"\n />\n ) : null}\n {failure === null ? null : <div className={styles.failure}>{failurePanel(failure)}</div>}\n\n <AgentThread\n {...(announcement.length === 0 ? {} : { announcement })}\n className={styles.thread}\n composer={\n <ReleaseAgentComposer\n disabled={runtimeUnavailable}\n isRunning={isRunning}\n onPromptChange={setPrompt}\n onSubmit={onSubmit}\n prompt={prompt}\n />\n }\n context={\n <div className={styles.threadContext}>\n <strong>{release.serviceName}</strong>\n <span>{release.version}</span>\n <span>{release.relay.codename}</span>\n {lastProvider === undefined ? null : <span>Local {lastProvider}</span>}\n </div>\n }\n emptyLabel=\"Ask one useful question. Relay will answer only for this release.\"\n heading=\"Release thread\"\n messages={threadMessages}\n />\n </article>\n )\n}\n\nconst CanonicalAgentState = ({ context }: { readonly context: WorkspaceReleaseOutletContext }): ReactElement => {\n switch (context.controller.state._tag) {\n case \"loading\":\n return (\n <StatePanel\n description=\"Control Center is loading the exact release and its collaborators.\"\n title=\"Loading release context\"\n />\n )\n case \"session\":\n return (\n <StatePanel\n action={\n context.controller.state.reason === \"anonymous\" ? <Link to=\"/pair\">Pair this browser</Link> : undefined\n }\n description=\"Release context must be available before Relay can answer.\"\n title={\n context.controller.state.reason === \"blocked\" ? \"Release access blocked\" : \"Release context unavailable\"\n }\n tone={context.controller.state.reason === \"blocked\" ? \"critical\" : \"caution\"}\n />\n )\n case \"failed\":\n return (\n <StatePanel\n action={<Button onClick={context.controller.onRetry}>Try again</Button>}\n description=\"Control Center could not load the release. Check the server, then try again.\"\n title=\"Release context unavailable\"\n tone=\"critical\"\n />\n )\n case \"ready\":\n return <></>\n }\n}\n\nconst LegacyAgentPage = (): ReactElement => {\n const [searchParams] = useSearchParams()\n const context = contextFor(searchParams.get(\"from\"))\n return (\n <section aria-labelledby=\"agent-title\" className={styles.legacy}>\n <header className={styles.legacyHeader}>\n <Text className={styles.eyebrow} tone=\"secondary\" variant=\"label\">\n Relay\n </Text>\n <Text as=\"h1\" id=\"agent-title\" variant=\"verdict\">\n Ask in context.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n Open Relay from a release to start an exact, release-owned thread.\n </Text>\n </header>\n <Surface as=\"section\" className={styles.legacyContext} padding=\"spacious\" shape=\"grouped\" tone=\"secondary\">\n <Text tone=\"secondary\" variant=\"label\">\n Current context\n </Text>\n <Text as=\"h2\" variant=\"section-title\">\n {context.label}\n </Text>\n <Text tone=\"secondary\">{context.description}</Text>\n {context.path === null ? null : (\n <Link className={styles.back} to={context.path}>\n Return to {context.label}\n </Link>\n )}\n </Surface>\n </section>\n )\n}\n\n/** Render an exact release-owned local agent thread, with a safe legacy context preview. */\nexport const AgentPage = ({ runTurn }: AgentPageProps): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext | null>()\n const params = useParams()\n const workspaceId = decodeWorkspaceRouteId(params.workspaceId)\n const releaseId = decodeReleaseRouteId(params.releaseId)\n const isCanonicalRoute = params.workspaceId !== undefined || params.releaseId !== undefined\n\n if (!isCanonicalRoute) return <LegacyAgentPage />\n if (workspaceId === null || releaseId === null || context === null || context.workspaceId !== workspaceId) {\n return (\n <section className={styles.state}>\n <StatePanel\n action={workspaceId === null ? <Link to=\"/\">Return to Control Center</Link> : undefined}\n description=\"This address does not identify a release in the current workspace.\"\n title=\"Release not found\"\n />\n </section>\n )\n }\n if (context.controller.state._tag !== \"ready\") return <CanonicalAgentState context={context} />\n const release = context.controller.state.portfolio.releases.find((candidate) => candidate.id === releaseId)\n if (release === undefined) {\n return (\n <section className={styles.state}>\n <StatePanel\n action={\n <Link\n to={context.controller.state.portfolio.workspaceId === workspaceId ? `/w/${workspaceId}/overview` : \"/\"}\n >\n Return to workspace\n </Link>\n }\n description=\"This release does not exist in the current workspace snapshot.\"\n title=\"Release not found\"\n />\n </section>\n )\n }\n return <ReleaseAgentRoom key={release.id} release={release} runTurn={runTurn} workspaceId={workspaceId} />\n}\n\n/** Route entry wired to the authenticated Control Center release-agent API. */\nexport const ConnectedAgentPage = (): ReactElement => <AgentPage runTurn={runBrowserReleaseAgentTurn} />\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ._room_196hr_1,._hero_196hr_2,._heroCopy_196hr_3,._people_196hr_4,._starters_196hr_5,._composer_196hr_6,._legacy_196hr_7,._legacyHeader_196hr_8,._legacyContext_196hr_9{display:grid}._room_196hr_1,._legacy_196hr_7{gap:clamp(4rem,9vw,8rem)}._back_196hr_18{inline-size:fit-content;color:var(--rly-color-text-2);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);text-decoration:none}._back_196hr_18:hover,._back_196hr_18:focus-visible{color:var(--rly-color-text-1);text-underline-offset:var(--rly-space-4);text-decoration:underline}._hero_196hr_2,._legacyHeader_196hr_8{gap:var(--rly-space-32)}._heroCopy_196hr_3,._legacyHeader_196hr_8{max-inline-size:58rem}._heroCopy_196hr_3{gap:var(--rly-space-16)}._heroCopy_196hr_3 h1,._legacyHeader_196hr_8 h1{letter-spacing:-.065em;text-wrap:balance;max-inline-size:11ch}._heroCopy_196hr_3 p,._legacyHeader_196hr_8 p{max-inline-size:46rem}._eyebrow_196hr_59{letter-spacing:.08em;text-transform:uppercase}._people_196hr_4,._starters_196hr_5{gap:var(--rly-space-24)}._suggestionList_196hr_69{gap:var(--rly-space-12);grid-template-columns:repeat(3,minmax(0,1fr));display:grid}._suggestion_196hr_69{min-block-size:7rem;padding:var(--rly-space-20);border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-group);background:var(--rly-color-surface-1);color:var(--rly-color-text-1);cursor:pointer;font:var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height) var(--rly-type-card-title-font);text-align:start;transition:border-color var(--rly-motion-fast-duration) var(--rly-motion-fast-easing), background-color var(--rly-motion-fast-duration) var(--rly-motion-fast-easing)}._suggestion_196hr_69:hover,._suggestion_196hr_69:focus-visible{border-color:var(--rly-color-agent);background:var(--rly-color-surface-2);outline:none}._suggestion_196hr_69:disabled{cursor:not-allowed;opacity:.45}._thread_196hr_103{border-color:var(--rly-color-border-2)}._threadContext_196hr_107{gap:var(--rly-space-8) var(--rly-space-16);color:var(--rly-color-text-2);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);flex-wrap:wrap;display:flex}._threadContext_196hr_107 strong{color:var(--rly-color-text-1)}._threadContext_196hr_107 span+span:before{color:var(--rly-color-border-2);content:"·";margin-inline-end:var(--rly-space-16)}._composer_196hr_6{gap:var(--rly-space-16)}._composer_196hr_6 textarea{resize:vertical;min-block-size:10rem;font:var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height) var(--rly-type-body-large-font)}._failure_196hr_137{scroll-margin-block-start:6rem}._state_196hr_141{place-items:center;min-block-size:60dvh;display:grid}._legacyHeader_196hr_8,._legacyContext_196hr_9{gap:var(--rly-space-16)}._legacyContext_196hr_9{max-inline-size:52rem}@media (width<=48rem){._suggestionList_196hr_69{grid-template-columns:1fr}._suggestion_196hr_69{min-block-size:5rem}}@media (prefers-reduced-motion:reduce){._suggestion_196hr_69{transition:none}}
@@ -0,0 +1 @@
1
+ ._page_qe0fs_1{gap:var(--rly-space-6);max-width:44rem;padding:var(--rly-space-8) var(--rly-space-4);margin:0 auto;display:grid}._heading_qe0fs_9,._sites_qe0fs_10{gap:var(--rly-space-4);display:grid}._site_qe0fs_10{align-items:center;gap:var(--rly-space-4);justify-content:space-between;display:flex}._identity_qe0fs_22{gap:var(--rly-space-2);display:grid}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{E as r,n as i,t as a,v as o}from"./Dialog-DwSIPb-B-DVn37afM.js";import{i as s,r as c,s as l}from"./index-DLoOV6Hp.js";import{A as u,B as d,F as f,V as p,kt as m,n as h,z as g}from"./client-OmvShYdC.js";import{t as _}from"./serviceOnboarding-B9pvdyWf.js";import{n as v,r as y,t as b}from"./connectionTestTransport-c25QXx7A.js";var x=e(t(),1),S={page:`_page_qe0fs_1`,heading:`_heading_qe0fs_9`,sites:`_sites_qe0fs_10`,site:`_site_qe0fs_10`,identity:`_identity_qe0fs_22`},C=n(),w=u.check(p(),d(),g(4096)),T=({transport:e=b}={})=>{let t=r(),[n,u]=o(),d=(0,x.useRef)(n.get(`state`)).current,[p]=(0,x.useState)(()=>y(d)),{state:g}=l(),[T,E]=(0,x.useState)({_tag:`waiting`}),D=(0,x.useRef)(!1),O=(0,x.useRef)(null),k=(0,x.useRef)(null),A=(0,x.useRef)(0);(0,x.useEffect)(()=>{let t=++A.current,r=()=>{k.current?.abort(),Promise.resolve().then(()=>{A.current===t&&O.current?.abort()})};if(g._tag!==`authenticated`||D.current)return r;if(D.current=!0,n.has(`error`))return E({_tag:`failed`}),r;let i=f(h)(n.get(`state`)),a=f(w)(n.get(`code`)),o=e.exchangeAtlassianOAuthGrant;if(m(i)||m(a)||o===void 0)return E({_tag:`failed`}),r;u({},{replace:!0});let s=new AbortController;return O.current=s,E({_tag:`exchanging`}),o(i.success,a.success,s.signal).then(e=>{s.signal.aborted||E({_tag:`selecting`,grant:e,saveFailed:!1})},()=>{s.signal.aborted||E({_tag:`failed`})}),r},[n,g,u,e]);let j=(n,r)=>{if(p!==null&&p.preferredSiteId!==null&&p.preferredSiteId!==r)return;let i=e.completeAtlassianOAuthGrant;if(i===void 0){E({_tag:`failed`});return}let a=new AbortController;k.current?.abort(),k.current=a,E({_tag:`saving`,grant:n,cloudId:r}),i(n.grantId,r,a.signal).then(e=>{a.signal.aborted||(v(d),t(p===null?`/services`:_(p.providers,e.profileId,p.preferredSiteId),{replace:!0}))},()=>{a.signal.aborted||E({_tag:`selecting`,grant:n,saveFailed:!0})})},M=()=>{v(d),t(p===null?`/services`:_(p.providers,null,p.preferredSiteId))};return g._tag===`checking`?(0,C.jsx)(`section`,{className:S.page,children:(0,C.jsx)(i,{description:`Restoring the browser session that started this sign-in.`,title:`Finishing sign-in`})}):g._tag===`authenticated`?T._tag===`failed`?(0,C.jsx)(`section`,{className:S.page,children:(0,C.jsx)(i,{action:(0,C.jsx)(a,{onClick:M,children:`Try again`}),description:`The grant may have expired, been denied, or already been used. No provider token was saved.`,title:`Atlassian sign-in did not finish`})}):T._tag!==`selecting`&&T._tag!==`saving`?(0,C.jsx)(`section`,{className:S.page,children:(0,C.jsx)(i,{description:`Verifying the single-use grant with Atlassian.`,title:`Finishing sign-in`})}):p!==null&&p.preferredSiteId!==null&&!T.grant.sites.some(({cloudId:e})=>e===p.preferredSiteId)?(0,C.jsx)(`section`,{className:S.page,children:(0,C.jsx)(i,{action:(0,C.jsx)(a,{onClick:M,children:`Return to Services`}),description:`Sign in with an Atlassian account that can access the site selected from the account card.`,title:`Selected Atlassian site unavailable`})}):(0,C.jsxs)(`section`,{"aria-labelledby":`atlassian-site-title`,className:S.page,children:[(0,C.jsxs)(`header`,{className:S.heading,children:[(0,C.jsx)(s,{as:`h1`,id:`atlassian-site-title`,variant:`page-title`,children:`Choose your Atlassian site`}),(0,C.jsxs)(s,{tone:`secondary`,variant:`body-large`,children:[`Signed in as `,T.grant.accountName,T.grant.accountEmail===null?``:` · ${T.grant.accountEmail}`,`. Jira and Confluence will share this machine-local profile.`]})]}),(0,C.jsxs)(`div`,{className:S.sites,children:[T._tag===`selecting`&&T.saveFailed?(0,C.jsx)(s,{as:`p`,tone:`secondary`,variant:`body`,children:`The shared profile could not be saved to both tools. Fix the local profile store and retry this site.`}):null,T.grant.sites.map(e=>(0,C.jsxs)(c,{as:`article`,className:S.site,padding:`default`,shape:`grouped`,children:[(0,C.jsxs)(`div`,{className:S.identity,children:[(0,C.jsx)(s,{as:`h2`,variant:`card-title`,children:e.name}),(0,C.jsx)(s,{tone:`secondary`,variant:`body`,children:e.siteUrl})]}),(0,C.jsx)(a,{disabled:T._tag===`saving`||p!==null&&p.preferredSiteId!==null&&p.preferredSiteId!==e.cloudId,loading:T._tag===`saving`&&T.cloudId===e.cloudId,onClick:()=>j(T.grant,e.cloudId),variant:`primary`,children:`Use this site`})]},e.cloudId))]})]}):(0,C.jsx)(`section`,{className:S.page,children:(0,C.jsx)(i,{action:(0,C.jsx)(a,{onClick:M,children:`Return to Services`}),description:`Return to the paired browser session that started this sign-in.`,title:`Paired session required`})})};export{T as AtlassianOAuthCallbackPage};
2
+ //# sourceMappingURL=AtlassianOAuthCallbackPage-dr-B9-DD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AtlassianOAuthCallbackPage-dr-B9-DD.js","names":[],"sources":["../../../src/client/services/AtlassianOAuthCallbackPage.module.css","../../../src/client/services/AtlassianOAuthCallbackPage.tsx"],"sourcesContent":[".page {\n display: grid;\n gap: var(--rly-space-6);\n margin: 0 auto;\n max-width: 44rem;\n padding: var(--rly-space-8) var(--rly-space-4);\n}\n\n.heading,\n.sites {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.site {\n align-items: center;\n display: flex;\n gap: var(--rly-space-4);\n justify-content: space-between;\n}\n\n.identity {\n display: grid;\n gap: var(--rly-space-2);\n}\n","import { Button, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useEffect, useRef, useState } from \"react\"\nimport { useNavigate, useSearchParams } from \"react-router\"\n\nimport { AtlassianOAuthGrantId, type AtlassianOAuthGrantExchangeResponse } from \"../../api/plugins.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { forgetAtlassianOAuthSetupIntent, readAtlassianOAuthSetupIntent } from \"./atlassianOAuthSetupIntentStorage.js\"\nimport { browserConnectionTestTransport, type ConnectionTestTransport } from \"./connectionTestTransport.js\"\nimport { atlassianOAuthSetupPath } from \"./serviceOnboarding.js\"\nimport styles from \"./AtlassianOAuthCallbackPage.module.css\"\n\nconst AuthorizationCode = Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(4_096))\n\ntype CallbackState =\n | { readonly _tag: \"waiting\" }\n | { readonly _tag: \"exchanging\" }\n | { readonly _tag: \"selecting\"; readonly grant: AtlassianOAuthGrantExchangeResponse; readonly saveFailed: boolean }\n | { readonly _tag: \"saving\"; readonly grant: AtlassianOAuthGrantExchangeResponse; readonly cloudId: string }\n | { readonly _tag: \"failed\" }\n\ntype CallbackTransport = Pick<ConnectionTestTransport, \"completeAtlassianOAuthGrant\" | \"exchangeAtlassianOAuthGrant\">\n\n/** Complete a browser OAuth redirect without exposing provider tokens to the browser. */\nexport const AtlassianOAuthCallbackPage = ({\n transport = browserConnectionTestTransport\n}: {\n readonly transport?: CallbackTransport | undefined\n} = {}): ReactElement => {\n const navigate = useNavigate()\n const [searchParams, setSearchParams] = useSearchParams()\n const callbackGrantState = useRef(searchParams.get(\"state\")).current\n const [setupIntent] = useState(() => readAtlassianOAuthSetupIntent(callbackGrantState))\n const { state: sessionState } = useBrowserSession()\n const [state, setState] = useState<CallbackState>({ _tag: \"waiting\" })\n const exchangeStarted = useRef(false)\n const exchangeRequest = useRef<AbortController | null>(null)\n const saveRequest = useRef<AbortController | null>(null)\n const effectGeneration = useRef(0)\n\n useEffect(() => {\n const generation = ++effectGeneration.current\n const cleanup = (): void => {\n saveRequest.current?.abort()\n void Promise.resolve().then(() => {\n if (effectGeneration.current !== generation) return\n exchangeRequest.current?.abort()\n })\n }\n if (sessionState._tag !== \"authenticated\" || exchangeStarted.current) return cleanup\n exchangeStarted.current = true\n if (searchParams.has(\"error\")) {\n setState({ _tag: \"failed\" })\n return cleanup\n }\n const grantId = Schema.decodeUnknownResult(AtlassianOAuthGrantId)(searchParams.get(\"state\"))\n const code = Schema.decodeUnknownResult(AuthorizationCode)(searchParams.get(\"code\"))\n const exchange = transport.exchangeAtlassianOAuthGrant\n if (Result.isFailure(grantId) || Result.isFailure(code) || exchange === undefined) {\n setState({ _tag: \"failed\" })\n return cleanup\n }\n setSearchParams({}, { replace: true })\n const request = new AbortController()\n exchangeRequest.current = request\n setState({ _tag: \"exchanging\" })\n exchange(grantId.success, code.success, request.signal).then(\n (grant) => {\n if (!request.signal.aborted) setState({ _tag: \"selecting\", grant, saveFailed: false })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n }\n )\n return cleanup\n }, [searchParams, sessionState, setSearchParams, transport])\n\n const complete = (grant: AtlassianOAuthGrantExchangeResponse, cloudId: string): void => {\n if (setupIntent !== null && setupIntent.preferredSiteId !== null && setupIntent.preferredSiteId !== cloudId) return\n const save = transport.completeAtlassianOAuthGrant\n if (save === undefined) {\n setState({ _tag: \"failed\" })\n return\n }\n const request = new AbortController()\n saveRequest.current?.abort()\n saveRequest.current = request\n setState({ _tag: \"saving\", grant, cloudId })\n void save(grant.grantId, cloudId, request.signal).then(\n (profile) => {\n if (request.signal.aborted) return\n forgetAtlassianOAuthSetupIntent(callbackGrantState)\n navigate(\n setupIntent === null\n ? \"/services\"\n : atlassianOAuthSetupPath(setupIntent.providers, profile.profileId, setupIntent.preferredSiteId),\n { replace: true }\n )\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"selecting\", grant, saveFailed: true })\n }\n )\n }\n\n const leaveCallback = (): void => {\n forgetAtlassianOAuthSetupIntent(callbackGrantState)\n navigate(\n setupIntent === null\n ? \"/services\"\n : atlassianOAuthSetupPath(setupIntent.providers, null, setupIntent.preferredSiteId)\n )\n }\n\n if (sessionState._tag === \"checking\") {\n return (\n <section className={styles.page}>\n <StatePanel description=\"Restoring the browser session that started this sign-in.\" title=\"Finishing sign-in\" />\n </section>\n )\n }\n\n if (sessionState._tag !== \"authenticated\") {\n return (\n <section className={styles.page}>\n <StatePanel\n action={<Button onClick={leaveCallback}>Return to Services</Button>}\n description=\"Return to the paired browser session that started this sign-in.\"\n title=\"Paired session required\"\n />\n </section>\n )\n }\n\n if (state._tag === \"failed\") {\n return (\n <section className={styles.page}>\n <StatePanel\n action={<Button onClick={leaveCallback}>Try again</Button>}\n description=\"The grant may have expired, been denied, or already been used. No provider token was saved.\"\n title=\"Atlassian sign-in did not finish\"\n />\n </section>\n )\n }\n\n if (state._tag !== \"selecting\" && state._tag !== \"saving\") {\n return (\n <section className={styles.page}>\n <StatePanel description=\"Verifying the single-use grant with Atlassian.\" title=\"Finishing sign-in\" />\n </section>\n )\n }\n\n if (\n setupIntent !== null &&\n setupIntent.preferredSiteId !== null &&\n !state.grant.sites.some(({ cloudId }) => cloudId === setupIntent.preferredSiteId)\n ) {\n return (\n <section className={styles.page}>\n <StatePanel\n action={<Button onClick={leaveCallback}>Return to Services</Button>}\n description=\"Sign in with an Atlassian account that can access the site selected from the account card.\"\n title=\"Selected Atlassian site unavailable\"\n />\n </section>\n )\n }\n\n return (\n <section aria-labelledby=\"atlassian-site-title\" className={styles.page}>\n <header className={styles.heading}>\n <Text as=\"h1\" id=\"atlassian-site-title\" variant=\"page-title\">\n Choose your Atlassian site\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n Signed in as {state.grant.accountName}\n {state.grant.accountEmail === null ? \"\" : ` · ${state.grant.accountEmail}`}. Jira and Confluence will share\n this machine-local profile.\n </Text>\n </header>\n <div className={styles.sites}>\n {state._tag === \"selecting\" && state.saveFailed ? (\n <Text as=\"p\" tone=\"secondary\" variant=\"body\">\n The shared profile could not be saved to both tools. Fix the local profile store and retry this site.\n </Text>\n ) : null}\n {state.grant.sites.map((site) => (\n <Surface as=\"article\" className={styles.site} key={site.cloudId} padding=\"default\" shape=\"grouped\">\n <div className={styles.identity}>\n <Text as=\"h2\" variant=\"card-title\">\n {site.name}\n </Text>\n <Text tone=\"secondary\" variant=\"body\">\n {site.siteUrl}\n </Text>\n </div>\n <Button\n disabled={\n state._tag === \"saving\" ||\n (setupIntent !== null &&\n setupIntent.preferredSiteId !== null &&\n setupIntent.preferredSiteId !== site.cloudId)\n }\n loading={state._tag === \"saving\" && state.cloudId === site.cloudId}\n onClick={() => complete(state.grant, site.cloudId)}\n variant=\"primary\"\n >\n Use this site\n </Button>\n </Surface>\n ))}\n </div>\n </section>\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{O as r,a as i,h as a,n as o,r as s,t as c}from"./Dialog-DwSIPb-B-DVn37afM.js";import{i as l,r as u,s as d}from"./index-DLoOV6Hp.js";import{v as f}from"./patterns-DEbg7R-A-Cw0A2uKS.js";import{C as p,Ft as m,K as h,Lt as g,P as _,bt as v,ft as y,ht as b,jt as x,pt as S,st as C,w}from"./client-OmvShYdC.js";import{i as T,n as E,r as D}from"./presentWorkspaceItems-BU__8LcC.js";import{t as O}from"./authorizedShareTransport-Dyj53kJf.js";var k=e(t(),1),A={page:`_page_m9pfd_1`,hero:`_hero_m9pfd_2`,item:`_item_m9pfd_3`,facts:`_facts_m9pfd_4`,itemHeader:`_itemHeader_m9pfd_24`},j=n(),M=3e4,N=e=>t=>g(t,`_tag`)&&t._tag===e,P=N(`NotFoundApiError`),F=N(`UnauthorizedApiError`),I=({transport:e=O}={})=>{let t=r(),n=d(),g=_(p)(t.shareId),N=_(w)(t.workspaceId),I=m(g)?g.value:null,L=m(N)?N.value:null,R=n.state._tag===`authenticated`||n.state._tag===`storage-unavailable`?n.state.session:null,z=R!==null&&R.workspaceId===L?R:null,[B,V]=(0,k.useState)(0),[H,U]=(0,k.useState)({_tag:`idle`});if((0,k.useEffect)(()=>{if(I===null||L===null||z===null){U({_tag:`idle`});return}let t=new AbortController;return U({_tag:`loading`}),S(C(function*(){for(;!t.signal.aborted;){let r=yield*v({try:()=>e.resolve(L,I,t.signal),catch:e=>e}).pipe(y);if(t.signal.aborted)return;if(r._tag===`Failure`){F(r.failure)&&n.invalidateSession(z.sessionId),U(P(r.failure)?{_tag:`not-found`}:{_tag:`failed`});return}U({_tag:`ready`,resolution:r.success}),yield*b(x(M))}}),{signal:t.signal}).catch(()=>{t.signal.aborted||U({_tag:`failed`})}),()=>t.abort()},[n,B,z,I,e,L]),I===null||L===null)return(0,j.jsx)(o,{action:(0,j.jsx)(a,{to:`/`,children:`Return to Control Center`}),description:`This authorized link is malformed. No item was substituted.`,title:`Share unavailable`,tone:`caution`});if(n.state._tag===`checking`||H._tag===`loading`)return(0,j.jsxs)(`section`,{"aria-label":`Loading authorized share`,className:A.page,children:[(0,j.jsx)(i,{height:`8rem`,variant:`block`}),(0,j.jsx)(i,{height:`18rem`,variant:`block`})]});if(R===null)return(0,j.jsx)(o,{action:(0,j.jsx)(a,{to:`/pair`,children:`Pair this browser`}),description:`This link grants no bearer access. Pair as the selected person, then reopen it.`,title:`Authentication required`,tone:`caution`});if(R.workspaceId!==L)return(0,j.jsx)(o,{description:`This link is scoped to another workspace. No item was substituted.`,title:`Share unavailable`,tone:`caution`});if(H._tag===`not-found`)return(0,j.jsx)(o,{description:`The link may target another person, be expired or revoked, or point to a deleted item.`,title:`Share unavailable`,tone:`caution`});if(H._tag===`failed`||H._tag===`idle`)return(0,j.jsx)(o,{action:(0,j.jsx)(c,{onClick:()=>V(e=>e+1),children:`Try again`}),description:`Control Center could not resolve this authorized link.`,title:`Share unavailable`,tone:`caution`});let W=H.resolution.item.projection,G=D(W.details),K=T(W.entityType,G);return(0,j.jsxs)(`article`,{className:A.page,children:[(0,j.jsxs)(`header`,{className:A.hero,children:[(0,j.jsx)(l,{as:`p`,tone:`secondary`,variant:`label`,children:`Authorized item`}),(0,j.jsx)(l,{as:`h1`,variant:`verdict`,children:`Exact scope. Nothing adjacent.`}),(0,j.jsx)(l,{tone:`secondary`,variant:`body-large`,children:`This view contains only the granted current item projection. Releases, relationships, and evidence remain private.`})]}),(0,j.jsxs)(u,{as:`section`,className:A.item,padding:`spacious`,tone:`secondary`,children:[(0,j.jsxs)(`div`,{className:A.itemHeader,children:[(0,j.jsx)(f,{service:E(W.entityType),size:`compact`}),(0,j.jsx)(s,{label:G,size:`compact`,tone:K.tone})]}),(0,j.jsx)(l,{as:`p`,tone:`secondary`,variant:`label`,children:W.displayKey}),(0,j.jsx)(l,{as:`h2`,variant:`section-title`,children:W.title}),(0,j.jsxs)(`dl`,{className:A.facts,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`Type`}),(0,j.jsx)(`dd`,{children:W.entityType})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`Observed`}),(0,j.jsx)(`dd`,{children:h(H.resolution.item.recordedAt)})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`Expires`}),(0,j.jsx)(`dd`,{children:h(H.resolution.share.expiresAt)})]})]})]})]})};export{I as AuthorizedSharePage};
2
+ //# sourceMappingURL=AuthorizedSharePage-C-P-PNfm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthorizedSharePage-C-P-PNfm.js","names":[],"sources":["../../../src/client/items/AuthorizedSharePage.module.css","../../../src/client/items/AuthorizedSharePage.tsx"],"sourcesContent":[".page,\n.hero,\n.item,\n.facts {\n display: grid;\n}\n\n.page {\n gap: var(--rly-space-32);\n max-inline-size: 58rem;\n margin-inline: auto;\n}\n\n.hero,\n.item {\n gap: var(--rly-space-12);\n}\n\n.hero > *,\n.item > * {\n margin: 0;\n}\n\n.itemHeader {\n display: flex;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.facts {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--rly-space-12);\n margin-block: var(--rly-space-8);\n}\n\n.facts div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.facts dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.facts dd {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n.item a {\n justify-self: start;\n min-block-size: 3rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.item a:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 40rem) {\n .facts {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Duration from \"effect/Duration\"\nimport * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useEffect, useState } from \"react\"\nimport { Link, useParams } from \"react-router\"\n\nimport type { AuthorizedShareResolution } from \"../../api/shares.js\"\nimport { ShareId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { browserAuthorizedShareTransport, type AuthorizedShareTransport } from \"./authorizedShareTransport.js\"\nimport { serviceFor, statusFor, statusPresentation } from \"./presentWorkspaceItems.js\"\nimport styles from \"./AuthorizedSharePage.module.css\"\n\ntype AuthorizedSharePageState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"not-found\" }\n | { readonly _tag: \"ready\"; readonly resolution: AuthorizedShareResolution }\n\nconst SHARE_REVALIDATION_MILLISECONDS = 30_000\n\nconst isTaggedFailure =\n (tag: string) =>\n (failure: unknown): boolean =>\n Predicate.hasProperty(failure, \"_tag\") && failure._tag === tag\n\nconst isNotFound = isTaggedFailure(\"NotFoundApiError\")\nconst isUnauthorized = isTaggedFailure(\"UnauthorizedApiError\")\n\nexport interface AuthorizedSharePageProps {\n readonly transport?: AuthorizedShareTransport\n}\n\n/** Direct-load authenticated page for one exact shared normalized item. */\nexport const AuthorizedSharePage = ({\n transport = browserAuthorizedShareTransport\n}: AuthorizedSharePageProps = {}): ReactElement => {\n const params = useParams()\n const browserSession = useBrowserSession()\n const decodedShareId = Schema.decodeUnknownOption(ShareId)(params.shareId)\n const decodedWorkspaceId = Schema.decodeUnknownOption(WorkspaceId)(params.workspaceId)\n const shareId = Option.isSome(decodedShareId) ? decodedShareId.value : null\n const workspaceId = Option.isSome(decodedWorkspaceId) ? decodedWorkspaceId.value : null\n const authenticatedSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const session =\n authenticatedSession !== null && authenticatedSession.workspaceId === workspaceId ? authenticatedSession : null\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<AuthorizedSharePageState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (shareId === null || workspaceId === null || session === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n setState({ _tag: \"loading\" })\n const program = Effect.gen(function* () {\n while (!request.signal.aborted) {\n const result = yield* Effect.tryPromise({\n try: () => transport.resolve(workspaceId, shareId, request.signal),\n catch: (cause) => cause\n }).pipe(Effect.result)\n if (request.signal.aborted) return\n if (result._tag === \"Failure\") {\n if (isUnauthorized(result.failure)) browserSession.invalidateSession(session.sessionId)\n setState(isNotFound(result.failure) ? { _tag: \"not-found\" } : { _tag: \"failed\" })\n return\n }\n setState({ _tag: \"ready\", resolution: result.success })\n yield* Effect.sleep(Duration.millis(SHARE_REVALIDATION_MILLISECONDS))\n }\n })\n Effect.runPromise(program, { signal: request.signal }).catch(() => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n })\n return () => request.abort()\n }, [browserSession, requestRevision, session, shareId, transport, workspaceId])\n\n if (shareId === null || workspaceId === null) {\n return (\n <StatePanel\n action={<Link to=\"/\">Return to Control Center</Link>}\n description=\"This authorized link is malformed. No item was substituted.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n if (browserSession.state._tag === \"checking\" || state._tag === \"loading\") {\n return (\n <section aria-label=\"Loading authorized share\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"18rem\" variant=\"block\" />\n </section>\n )\n }\n\n if (authenticatedSession === null) {\n return (\n <StatePanel\n action={<Link to=\"/pair\">Pair this browser</Link>}\n description=\"This link grants no bearer access. Pair as the selected person, then reopen it.\"\n title=\"Authentication required\"\n tone=\"caution\"\n />\n )\n }\n\n if (authenticatedSession.workspaceId !== workspaceId) {\n return (\n <StatePanel\n description=\"This link is scoped to another workspace. No item was substituted.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n if (state._tag === \"not-found\") {\n return (\n <StatePanel\n description=\"The link may target another person, be expired or revoked, or point to a deleted item.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n if (state._tag === \"failed\" || state._tag === \"idle\") {\n return (\n <StatePanel\n action={<Button onClick={() => setRequestRevision((revision) => revision + 1)}>Try again</Button>}\n description=\"Control Center could not resolve this authorized link.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const projection = state.resolution.item.projection\n const status = statusFor(projection.details)\n const presentation = statusPresentation(projection.entityType, status)\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Authorized item\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Exact scope. Nothing adjacent.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n This view contains only the granted current item projection. Releases, relationships, and evidence remain\n private.\n </Text>\n </header>\n <Surface as=\"section\" className={styles.item} padding=\"spacious\" tone=\"secondary\">\n <div className={styles.itemHeader}>\n <ServiceMark service={serviceFor(projection.entityType)} size=\"compact\" />\n <StateLabel label={status} size=\"compact\" tone={presentation.tone} />\n </div>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n {projection.displayKey}\n </Text>\n <Text as=\"h2\" variant=\"section-title\">\n {projection.title}\n </Text>\n <dl className={styles.facts}>\n <div>\n <dt>Type</dt>\n <dd>{projection.entityType}</dd>\n </div>\n <div>\n <dt>Observed</dt>\n <dd>{DateTime.formatIso(state.resolution.item.recordedAt)}</dd>\n </div>\n <div>\n <dt>Expires</dt>\n <dd>{DateTime.formatIso(state.resolution.share.expiresAt)}</dd>\n </div>\n </dl>\n </Surface>\n </article>\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ._page_m9pfd_1,._hero_m9pfd_2,._item_m9pfd_3,._facts_m9pfd_4{display:grid}._page_m9pfd_1{gap:var(--rly-space-32);max-inline-size:58rem;margin-inline:auto}._hero_m9pfd_2,._item_m9pfd_3{gap:var(--rly-space-12)}._hero_m9pfd_2>*,._item_m9pfd_3>*{margin:0}._itemHeader_m9pfd_24{align-items:center;gap:var(--rly-space-12);display:flex}._facts_m9pfd_4{gap:var(--rly-space-12);margin-block:var(--rly-space-8);grid-template-columns:repeat(3,minmax(0,1fr))}._facts_m9pfd_4 div{gap:var(--rly-space-4);display:grid}._facts_m9pfd_4 dt{color:var(--rly-color-text-2);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font)}._facts_m9pfd_4 dd{overflow-wrap:anywhere;margin:0}._item_m9pfd_3 a{min-block-size:3rem;padding:var(--rly-space-8) var(--rly-space-12);border:1px solid var(--rly-color-border-2);border-radius:var(--rly-radius-control);background:var(--rly-color-surface-1);color:var(--rly-color-text-1);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);justify-self:start;text-decoration:none}._item_m9pfd_3 a:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:var(--rly-space-2)}@media (width<=40rem){._facts_m9pfd_4{grid-template-columns:minmax(0,1fr)}}
@@ -0,0 +1,2 @@
1
+ import{Dt as e,Mt as t,Nt as n,Tt as r,bt as i,ct as a,gt as o,nt as s,rt as c,st as l,tt as u,vt as d,wt as f}from"./client-OmvShYdC.js";var p=`~effect/platform/PlatformError`,m=class extends r(`BadArgument`){get message(){return`${this.module}.${this.method}${this.description?`: ${this.description}`:``}`}},h=class extends f{get message(){return`${this._tag}: ${this.module}.${this.method}${this.pathOrDescriptor===void 0?``:` (${this.pathOrDescriptor})`}${this.description?`: ${this.description}`:``}`}},g=class extends r(`PlatformError`){constructor(e){`cause`in e?super({reason:e,cause:e.cause}):super({reason:e})}[p]=p;get message(){return this.reason.message}},_=e=>new g(new h(e)),v=e=>new g(new m(e)),y=`~effect/platform/Crypto`,b=n(`effect/Crypto`),x=e=>{let t=e.randomBytes,n=e=>a(S(`randomBytes`,e),t),r=()=>{let e=t(7);return((e[0]&31)*2**48+e[1]*2**40+e[2]*2**32+e[3]*2**24+e[4]*2**16+e[5]*2**8+e[6])/2**53},i=()=>Math.floor(r()*(2**53-1- -(2**53-1)+1))+-(2**53-1);return b.of({[y]:y,randomBytes:n,nextDoubleUnsafe:r,nextIntUnsafe:i,digest:e.digest,random:d(()=>r()),randomBoolean:d(()=>r()>.5),randomInt:d(()=>i()),randomBetween:(e,t)=>d(()=>r()*(t-e)+e),randomIntBetween(e,t,n){let i=n?.halfOpen===!0?0:1;return d(()=>{let n=Math.ceil(e),a=Math.floor(t);return Math.floor(r()*(a-n+i))+n})},randomShuffle:e=>d(()=>{let t=Array.from(e);for(let e=t.length-1;e>=1;--e){let n=Math.min(e,Math.floor(r()*(e+1))),i=t[e];t[e]=t[n],t[n]=i}return t}),randomUUIDv4:d(()=>T(t(16))),randomUUIDv7:u(e=>o(D(e.currentTimeMillisUnsafe(),t(16))))})},S=(e,t)=>Number.isSafeInteger(t)&&t>=0?o(t):c(v({module:`Crypto`,method:e,description:`size must be a non-negative safe integer`})),C=e=>e.toString(16).padStart(2,`0`),w=e=>[e.subarray(0,4),e.subarray(4,6),e.subarray(6,8),e.subarray(8,10),e.subarray(10,16)].map(e=>Array.from(e,C).join(``)).join(`-`),T=e=>(e[6]=e[6]&15|64,e[8]=e[8]&63|128,w(e)),E=2**48-1,D=(e,t)=>{let n=Math.min(Math.max(0,Math.trunc(e)),E);return t[0]=Math.floor(n/2**40),t[1]=Math.floor(n/2**32)&255,t[2]=Math.floor(n/2**24)&255,t[3]=Math.floor(n/2**16)&255,t[4]=Math.floor(n/2**8)&255,t[5]=n&255,t[6]=t[6]&15|112,t[8]=t[8]&63|128,w(t)},O=t(`@effect/platform-browser/Crypto/WebCrypto`,{defaultValue:()=>globalThis.crypto}),k=e(b,l(function*(){let e=yield*O;return e?x({randomBytes:t=>{let n=new Uint8Array(t);return e.getRandomValues(n),n},digest:(t,n)=>typeof e.subtle.digest==`function`?a(i({try:()=>e.subtle.digest(t,new Uint8Array(n)),catch:e=>_({module:`Crypto`,method:`digest`,_tag:`Unknown`,description:`Could not compute digest`,cause:e})}),e=>new Uint8Array(e)):c(_({module:`Crypto`,method:`digest`,_tag:`Unknown`,description:`crypto.subtle.digest is not available`}))}):yield*s(Error(`Web Crypto API is not available`))}));export{b as n,k as t};
2
+ //# sourceMappingURL=BrowserCrypto-BPiuCuW-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserCrypto-BPiuCuW-.js","names":["TypeId","Data.TaggedError","Data.Error","Effect.map","Effect.sync","Effect.clockWith","Effect.succeed","Effect.fail","PlatformError.badArgument","EffectCrypto.Crypto","Effect.die","Effect.fail","PlatformError.systemError","Effect.map","Effect.tryPromise","EffectCrypto.make"],"sources":["../../../../../node_modules/.pnpm/effect@4.0.0-beta.98/node_modules/effect/dist/PlatformError.js","../../../../../node_modules/.pnpm/effect@4.0.0-beta.98/node_modules/effect/dist/Crypto.js","../../../../../node_modules/.pnpm/@effect+platform-browser@4.0.0-beta.98_effect@4.0.0-beta.98/node_modules/@effect/platform-browser/dist/BrowserCrypto.js"],"sourcesContent":["/**\n * Normalized errors for platform APIs.\n *\n * Platform services such as file systems, terminals, and sockets use\n * `PlatformError` to report host-level failures in a consistent shape. The\n * wrapper records whether the problem came from an invalid argument or from the\n * operating system, while preserving useful details such as the module, method,\n * path, descriptor, description, and original cause when available.\n *\n * @since 4.0.0\n */\nimport * as Data from \"./Data.js\";\nconst TypeId = \"~effect/platform/PlatformError\";\n/**\n * Error data for an invalid argument passed to a platform API.\n *\n * **When to use**\n *\n * Use when you need to model caller input rejected before a platform operation\n * runs, including invalid-argument reason data.\n *\n * **Details**\n *\n * The error records the module and method that rejected the argument, with an\n * optional description and cause. It is usually wrapped in `PlatformError`.\n *\n * @see {@link badArgument} for creating a wrapped `PlatformError` whose reason is `BadArgument`\n * @see {@link SystemError} for failures reported by the host platform or operating system\n * @see {@link PlatformError} for the wrapper used by most platform APIs\n *\n * @category models\n * @since 4.0.0\n */\nexport class BadArgument extends /*#__PURE__*/Data.TaggedError(\"BadArgument\") {\n /**\n * Formats the module, method, and optional description that rejected the argument.\n *\n * **When to use**\n *\n * Use to read the formatted error message for a rejected platform argument.\n *\n * @since 4.0.0\n */\n get message() {\n return `${this.module}.${this.method}${this.description ? `: ${this.description}` : \"\"}`;\n }\n}\n/**\n * Error data for a platform or system operation failure.\n *\n * **When to use**\n *\n * Use when you need normalized reason data for a platform or system operation\n * failure, including the operation details.\n *\n * **Details**\n *\n * The error records a normalized `_tag`, the module and method that failed,\n * and optional details such as the syscall, path or descriptor, description,\n * and original cause. It is usually wrapped in `PlatformError`.\n *\n * @see {@link systemError} for creating the usual `PlatformError` wrapper from this reason data\n * @see {@link BadArgument} for platform API failures caused by rejected caller input before an operation runs\n * @see {@link SystemErrorTag} for the normalized tag values stored in `_tag`\n *\n * @category models\n * @since 4.0.0\n */\nexport class SystemError extends Data.Error {\n /**\n * Formats the normalized system error tag with operation and path details.\n *\n * **When to use**\n *\n * Use to read the formatted error message for a normalized system failure.\n *\n * @since 4.0.0\n */\n get message() {\n return `${this._tag}: ${this.module}.${this.method}${this.pathOrDescriptor !== undefined ? ` (${this.pathOrDescriptor})` : \"\"}${this.description ? `: ${this.description}` : \"\"}`;\n }\n}\n/**\n * Tagged error used by platform APIs to report either invalid arguments or\n * system-level failures.\n *\n * **When to use**\n *\n * Use as the shared error type for platform APIs that expose invalid arguments\n * and host or operating-system failures through a single `Effect` error\n * channel.\n *\n * **Details**\n *\n * The `reason` field contains the underlying `BadArgument` or `SystemError`.\n * When that reason has a cause, the cause is preserved on the wrapper.\n *\n * @see {@link BadArgument} for invalid inputs rejected before an operation runs\n * @see {@link SystemError} for failures reported by the host platform or operating system\n * @see {@link badArgument} for creating this wrapper from rejected caller input\n * @see {@link systemError} for creating this wrapper from a host or operating-system failure\n *\n * @category models\n * @since 4.0.0\n */\nexport class PlatformError extends /*#__PURE__*/Data.TaggedError(\"PlatformError\") {\n constructor(reason) {\n if (\"cause\" in reason) {\n super({\n reason,\n cause: reason.cause\n });\n } else {\n super({\n reason\n });\n }\n }\n /**\n * Marks this value as a platform error wrapper for runtime guards.\n *\n * **When to use**\n *\n * Use to identify `PlatformError` values through their runtime type marker.\n *\n * @since 4.0.0\n */\n [TypeId] = TypeId;\n get message() {\n return this.reason.message;\n }\n}\n/**\n * Creates a `PlatformError` whose reason is a `SystemError`.\n *\n * **When to use**\n *\n * Use to adapt an operating-system or platform failure into the normalized\n * platform error model.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const systemError = options => new PlatformError(new SystemError(options));\n/**\n * Creates a `PlatformError` whose reason is a `BadArgument`.\n *\n * **When to use**\n *\n * Use to report a platform API rejecting caller input before performing the\n * underlying operation.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const badArgument = options => new PlatformError(new BadArgument(options));\n//# sourceMappingURL=PlatformError.js.map","/**\n * Defines a platform-independent service for cryptographic operations.\n *\n * Runtime packages provide concrete implementations backed by the host\n * platform's cryptography APIs. This module defines the service interface and a\n * constructor from random-byte and digest primitives. The service provides\n * secure random bytes and numbers, UUIDv4 and UUIDv7 generation, shuffling, and\n * SHA message digests.\n *\n * @since 4.0.0\n */\nimport * as Context from \"./Context.js\";\nimport * as Effect from \"./Effect.js\";\nimport * as PlatformError from \"./PlatformError.js\";\nconst TypeId = \"~effect/platform/Crypto\";\n/**\n * Service tag for platform cryptography.\n *\n * **When to use**\n *\n * Use when you need to provide or retrieve the full platform cryptography\n * service from an effect's context.\n *\n * **Details**\n *\n * Providing this service supplies platform-agnostic cryptographic operations\n * such as hashing, UUID generation, and secure random values.\n *\n * @see {@link make} for constructing a Crypto service from primitive operations\n *\n * @category services\n * @since 4.0.0\n */\nexport const Crypto = /*#__PURE__*/Context.Service(\"effect/Crypto\");\n/**\n * Creates a `Crypto` service from the primitive implementation, deriving the\n * random generator helpers and UUID generation from those primitives.\n *\n * **When to use**\n *\n * Use to build a Crypto service for a platform integration, test layer, or\n * custom runtime from primitive random-byte and digest operations.\n *\n * **Details**\n *\n * The constructor derives random numbers, booleans, integer ranges, shuffling,\n * and UUID generation from `impl.randomBytes`. Digest operations delegate to\n * `impl.digest`.\n *\n * **Gotchas**\n *\n * `impl.randomBytes` must return cryptographically secure bytes of the\n * requested length. UUID formatting mutates the byte array returned for UUID\n * generation, so the implementation should return a fresh array for each call.\n *\n * **Example** (Creating a Crypto service)\n *\n * ```ts\n * import { Crypto, Effect, Layer } from \"effect\"\n *\n * const TestCrypto = Layer.succeed(\n * Crypto.Crypto,\n * Crypto.make({\n * randomBytes: (size) => new Uint8Array(size),\n * digest: (_algorithm, data) => Effect.succeed(data)\n * })\n * )\n * ```\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = impl => {\n const randomBytesUnsafe = impl.randomBytes;\n const randomBytes = size => Effect.map(validateSize(\"randomBytes\", size), randomBytesUnsafe);\n const nextDoubleUnsafe = () => {\n const bytes = randomBytesUnsafe(7);\n const value = (bytes[0] & 0x1f) * 2 ** 48 + bytes[1] * 2 ** 40 + bytes[2] * 2 ** 32 + bytes[3] * 2 ** 24 + bytes[4] * 2 ** 16 + bytes[5] * 2 ** 8 + bytes[6];\n return value / 2 ** 53;\n };\n const nextIntUnsafe = () => Math.floor(nextDoubleUnsafe() * (Number.MAX_SAFE_INTEGER - Number.MIN_SAFE_INTEGER + 1)) + Number.MIN_SAFE_INTEGER;\n return Crypto.of({\n [TypeId]: TypeId,\n randomBytes,\n nextDoubleUnsafe,\n nextIntUnsafe,\n digest: impl.digest,\n random: Effect.sync(() => nextDoubleUnsafe()),\n randomBoolean: Effect.sync(() => nextDoubleUnsafe() > 0.5),\n randomInt: Effect.sync(() => nextIntUnsafe()),\n randomBetween: (min, max) => Effect.sync(() => nextDoubleUnsafe() * (max - min) + min),\n randomIntBetween(min, max, options) {\n const extra = options?.halfOpen === true ? 0 : 1;\n return Effect.sync(() => {\n const minInt = Math.ceil(min);\n const maxInt = Math.floor(max);\n return Math.floor(nextDoubleUnsafe() * (maxInt - minInt + extra)) + minInt;\n });\n },\n randomShuffle: elements => Effect.sync(() => {\n const buffer = Array.from(elements);\n for (let i = buffer.length - 1; i >= 1; i = i - 1) {\n const index = Math.min(i, Math.floor(nextDoubleUnsafe() * (i + 1)));\n const value = buffer[i];\n buffer[i] = buffer[index];\n buffer[index] = value;\n }\n return buffer;\n }),\n randomUUIDv4: Effect.sync(() => formatUUIDv4(randomBytesUnsafe(16))),\n randomUUIDv7: Effect.clockWith(clock => Effect.succeed(formatUUIDv7(clock.currentTimeMillisUnsafe(), randomBytesUnsafe(16))))\n });\n};\nconst validateSize = (method, size) => Number.isSafeInteger(size) && size >= 0 ? Effect.succeed(size) : Effect.fail(PlatformError.badArgument({\n module: \"Crypto\",\n method,\n description: \"size must be a non-negative safe integer\"\n}));\nconst hex = byte => byte.toString(16).padStart(2, \"0\");\nconst formatUUID = bytes => {\n const segments = [bytes.subarray(0, 4), bytes.subarray(4, 6), bytes.subarray(6, 8), bytes.subarray(8, 10), bytes.subarray(10, 16)];\n return segments.map(segment => Array.from(segment, hex).join(\"\")).join(\"-\");\n};\nconst formatUUIDv4 = bytes => {\n bytes[6] = bytes[6] & 0x0f | 0x40;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\nconst maxUUIDv7Timestamp = 2 ** 48 - 1;\nconst formatUUIDv7 = (timestampMillis, bytes) => {\n const timestamp = Math.min(Math.max(0, Math.trunc(timestampMillis)), maxUUIDv7Timestamp);\n bytes[0] = Math.floor(timestamp / 2 ** 40);\n bytes[1] = Math.floor(timestamp / 2 ** 32) & 0xff;\n bytes[2] = Math.floor(timestamp / 2 ** 24) & 0xff;\n bytes[3] = Math.floor(timestamp / 2 ** 16) & 0xff;\n bytes[4] = Math.floor(timestamp / 2 ** 8) & 0xff;\n bytes[5] = timestamp & 0xff;\n bytes[6] = bytes[6] & 0x0f | 0x70;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\n//# sourceMappingURL=Crypto.js.map","/**\n * Browser-backed implementation of Effect's Crypto service.\n *\n * This module provides a `Crypto.Crypto` layer backed by the Web Crypto API.\n * The {@link WebCrypto} context reference defaults to `globalThis.crypto`, so\n * browser programs can use the standard implementation while tests or embedded\n * runtimes can provide their own `Crypto` object.\n *\n * @since 1.0.0\n */\nimport * as Context from \"effect/Context\";\nimport * as EffectCrypto from \"effect/Crypto\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PlatformError from \"effect/PlatformError\";\n/**\n * Provides Browser Web Crypto APIs used by the Crypto service implementation.\n *\n * **When to use**\n *\n * Use to override the browser `Crypto` object used by the platform crypto\n * layer.\n *\n * @category references\n * @since 1.0.0\n */\nexport const WebCrypto = /*#__PURE__*/Context.Reference(\"@effect/platform-browser/Crypto/WebCrypto\", {\n defaultValue: () => globalThis.crypto\n});\n/**\n * Layer that directly interfaces with the Web Crypto API.\n *\n * **When to use**\n *\n * Use to provide cryptographic randomness, UUID generation, and digest\n * operations in browser runtimes backed by `globalThis.crypto`.\n *\n * **Details**\n *\n * Random bytes are produced with `crypto.getRandomValues`. Digests are computed\n * with `crypto.subtle.digest` and returned as `Uint8Array` values.\n *\n * **Gotchas**\n *\n * The layer dies if the Web Crypto object is unavailable. Digest operations\n * fail with `PlatformError` when `crypto.subtle.digest` is unavailable or the\n * browser rejects the digest request.\n *\n * @category layers\n * @since 1.0.0\n */\nexport const layer = /*#__PURE__*/Layer.effect(EffectCrypto.Crypto, /*#__PURE__*/Effect.gen(function* () {\n const crypto = yield* WebCrypto;\n if (!crypto) {\n return yield* Effect.die(new Error(\"Web Crypto API is not available\"));\n }\n const randomBytes = size => {\n const bytes = new Uint8Array(size);\n crypto.getRandomValues(bytes);\n return bytes;\n };\n const digest = (algorithm, data) => {\n if (typeof crypto.subtle.digest !== \"function\") {\n return Effect.fail(PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"crypto.subtle.digest is not available\"\n }));\n }\n return Effect.map(Effect.tryPromise({\n try: () => crypto.subtle.digest(algorithm, new Uint8Array(data)),\n catch: cause => PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"Could not compute digest\",\n cause\n })\n }), buffer => new Uint8Array(buffer));\n };\n return EffectCrypto.make({\n randomBytes,\n digest\n });\n}));\n//# sourceMappingURL=BrowserCrypto.js.map"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t}from"./jsx-runtime-n5LQ9ujS.js";import{s as n}from"./index-DLoOV6Hp.js";import{Lt as r,dt as i,i as a,pt as o,st as s,t as c}from"./client-OmvShYdC.js";var l=e(t(),1),u=s(function*(){return yield*(yield*c()).session.current()}).pipe(i(a)),d=e=>!r(e,`_tag`)||typeof e._tag!=`string`?{_tag:`unavailable`}:e._tag===`UnauthorizedApiError`?{_tag:`anonymous`}:e._tag===`ForbiddenApiError`?{_tag:`blocked`}:{_tag:`unavailable`},f=()=>{let{beginHydration:e,completeHydration:t}=n();return(0,l.useEffect)(()=>{let n=e(),r=!0;return o(u).then(e=>{r&&t(n,{_tag:`authenticated`,csrfToken:e.csrfToken,session:e.session})},e=>{r&&t(n,d(e))}),()=>{r=!1}},[e,t]),null};export{f as BrowserSessionHydrator};
2
+ //# sourceMappingURL=BrowserSessionHydrator-C8F_LGhg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserSessionHydrator-C8F_LGhg.js","names":[],"sources":["../../../src/client/BrowserSessionHydrator.tsx"],"sourcesContent":["import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { type ReactElement, useEffect } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../api/client.js\"\nimport { useBrowserSession, type BrowserSessionState } from \"./BrowserSession.js\"\n\nconst loadBrowserSession = Effect.gen(function* () {\n const client = yield* makeControlCenterApiClient()\n return yield* client.session.current()\n}).pipe(Effect.provide(FetchHttpClient.layer))\n\nconst failedSessionState = (\n failure: unknown\n): Exclude<BrowserSessionState, { readonly _tag: \"authenticated\" | \"checking\" }> => {\n if (!Predicate.hasProperty(failure, \"_tag\") || typeof failure._tag !== \"string\") {\n return { _tag: \"unavailable\" }\n }\n if (failure._tag === \"UnauthorizedApiError\") return { _tag: \"anonymous\" }\n if (failure._tag === \"ForbiddenApiError\") return { _tag: \"blocked\" }\n return { _tag: \"unavailable\" }\n}\n\n/** Recover this tab's mutation proof once, regardless of its initial route. */\nexport const BrowserSessionHydrator = (): ReactElement | null => {\n const { beginHydration, completeHydration } = useBrowserSession()\n\n useEffect(() => {\n const attempt = beginHydration()\n let isCurrent = true\n Effect.runPromise(loadBrowserSession).then(\n (result) => {\n if (!isCurrent) return\n completeHydration(attempt, {\n _tag: \"authenticated\",\n csrfToken: result.csrfToken,\n session: result.session\n })\n },\n (failure: unknown) => {\n if (isCurrent) completeHydration(attempt, failedSessionState(failure))\n }\n )\n return () => {\n isCurrent = false\n }\n }, [beginHydration, completeHydration])\n\n return null\n}\n"],"mappings":"4LAQM,EAAqB,EAAW,WAAa,CAEjD,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,QAAQ,QAAQ,CACvC,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAEvC,EACJ,GAEI,CAAC,EAAsB,EAAS,MAAM,GAAK,OAAO,EAAQ,MAAS,SAC9D,CAAE,KAAM,aAAc,EAE3B,EAAQ,OAAS,uBAA+B,CAAE,KAAM,WAAY,EACpE,EAAQ,OAAS,oBAA4B,CAAE,KAAM,SAAU,EAC5D,CAAE,KAAM,aAAc,EAIlB,MAAoD,CAC/D,GAAM,CAAE,iBAAgB,qBAAsB,EAAkB,EAuBhE,OArBA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAU,EAAe,EAC3B,EAAY,GAchB,OAbA,EAAkB,CAAkB,CAAC,CAAC,KACnC,GAAW,CACL,GACL,EAAkB,EAAS,CACzB,KAAM,gBACN,UAAW,EAAO,UAClB,QAAS,EAAO,OAClB,CAAC,CACH,EACC,GAAqB,CAChB,GAAW,EAAkB,EAAS,EAAmB,CAAO,CAAC,CACvE,CACF,MACa,CACX,EAAY,EACd,CACF,EAAG,CAAC,EAAgB,CAAiB,CAAC,EAE/B,IACT"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{E as r,h as i,r as a,s as o,w as s}from"./Dialog-DwSIPb-B-DVn37afM.js";import{o as c,r as l}from"./releasePaths-s-fSbIM-.js";import{a as u,o as d,s as f}from"./index-DLoOV6Hp.js";import{v as p}from"./patterns-DEbg7R-A-Cw0A2uKS.js";import{dt as m,i as h,pt as g,st as _,t as v,zt as y}from"./client-OmvShYdC.js";import{i as b,o as x}from"./releaseRoutes-DSWkTh-E.js";import{n as S,r as C}from"./workspaceEntityRoutes-CRcfSq7c.js";import{n as w,t as T}from"./useWorkspaceItems-D0FuHGto.js";import{t as E}from"./presentPortfolio-CkRqd_zz.js";var D=e(t(),1),O=e=>{let t=new URLSearchParams,n=e.trim();return n.length>0&&t.set(`q`,n),t},k=(e,t)=>{let n=O(t),r=n.size===0?``:`?${n.toString()}`;return`${c(e)}${r}#results`},A=y(`UnauthorizedApiError`),j={load:e=>g(_(function*(){return yield*(yield*v()).portfolio.snapshot()}).pipe(m(h)),{signal:e})},M=e=>E(e).releases.map(t=>({codename:t.relay.codename,href:l(e.workspaceId,t.id),id:t.id,serviceName:t.serviceName,status:t.lifecycleLabel,tone:t.lifecycleTone,version:t.version})),N=(e,t,n=j)=>{let[r,i]=(0,D.useState)(0),[a,o]=(0,D.useState)({_tag:`idle`});(0,D.useEffect)(()=>{if(e===null){o({_tag:`idle`});return}let r=new AbortController;return o({_tag:`loading`,sessionKey:e}),n.load(r.signal).then(t=>{r.signal.aborted||o({_tag:`ready`,releases:M(t),sessionKey:e,workspaceId:t.workspaceId})},n=>{r.signal.aborted||(A(n)&&t(e),o({_tag:`failed`,sessionKey:e}))}),()=>r.abort()},[t,r,e,n]);let s=e===null?{_tag:`idle`}:a._tag===`idle`||a.sessionKey!==e?{_tag:`loading`,sessionKey:e}:a;return{retry:(0,D.useCallback)(()=>i(e=>e+1),[]),state:s}},P={trigger:`_trigger_dhy9p_1`,pairTrigger:`_pairTrigger_dhy9p_2`,dialog:`_dialog_dhy9p_13`,searchField:`_searchField_dhy9p_17`,results:`_results_dhy9p_43`,result:`_result_dhy9p_43`,resultCopy:`_resultCopy_dhy9p_69`,releaseMark:`_releaseMark_dhy9p_75`,resultKey:`_resultKey_dhy9p_96`,message:`_message_dhy9p_102`,loading:`_loading_dhy9p_103`,footer:`_footer_dhy9p_120`,visuallyHidden:`_visuallyHidden_dhy9p_149`},F=n(),I=2,L=6,R=new Set,z=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),B=e=>e===null?!1:`isContentEditable`in e&&e.isContentEditable===!0?!0:!(`nodeName`in e)||typeof e.nodeName!=`string`?!1:e.nodeName===`INPUT`||e.nodeName===`SELECT`||e.nodeName===`TEXTAREA`,V=(e,t)=>{let n=t.map(e=>e.toLocaleLowerCase(`en-US`));return n.some(t=>t===e)?0:n.some(t=>t.startsWith(e))?1:n.some(t=>t.includes(e))?2:3},H=(e,t,n)=>{let r=n.trim().toLocaleLowerCase(`en-US`);if(r.length===0)return[];let i=e.flatMap(e=>{let t=V(r,[e.codename,e.version,e.serviceName,e.status]);return t===3?[]:[{_tag:`release`,rank:t,release:e}]}),a=t.flatMap(e=>{let t=V(r,[e.key,e.title,e.status]);return t===3?[]:[{_tag:`item`,item:e,rank:t}]});return[...i,...a].sort((e,t)=>{if(e.rank!==t.rank)return e.rank-t.rank;if(e._tag!==t._tag)return e._tag===`release`?-1:1;let n=e._tag===`release`?e.release.codename:e.item.key,r=t._tag===`release`?t.release.codename:t.item.key;return n.localeCompare(r)}).slice(0,L)},U=({releaseTransport:e=j,sessionKey:t,transport:n=T,workspaceId:c})=>{let l=f(),d=s(),m=r(),h=(0,D.useRef)(null),[g,_]=(0,D.useState)(!1),[v,y]=(0,D.useState)(``),[E,O]=(0,D.useState)(0),A=v.trim(),M=(0,D.useDeferredValue)(A),L=M.length>=I,V=N(g?t:null,l.invalidateSession,e),U=V.state,W=(0,D.useMemo)(()=>U._tag===`ready`&&U.workspaceId===c?new Set(U.releases.map(({id:e})=>e)):R,[U,c]),G=U._tag===`ready`&&U.workspaceId===c,K=w(c,W,(0,D.useMemo)(()=>({owner:`all`,query:L?M:``,service:`all`,status:`all`,type:`all`}),[M,L]),U._tag===`ready`?U.releases.map(({id:e})=>e).join(`:`):`command-search`,g&&L&&G?t:null,l.invalidateSession,n),q=K.state._tag===`ready`&&!K.state.refreshing,J=G&&q?H(U.releases,K.state.items,M):[],Y=J.length>0,X=e=>{_(e),e||(y(``),O(0))};(0,D.useEffect)(()=>{let e=e=>{e.defaultPrevented||B(e.target)||e.key.toLocaleLowerCase(`en-US`)!==`k`||!e.metaKey&&!e.ctrlKey||(e.preventDefault(),_(!0))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[]),(0,D.useEffect)(()=>O(0),[M]);let Z=e=>{if(X(!1),e._tag===`release`){m(e.release.href,{state:b(c,e.release.id,x(d))});return}let t=e.item;m(t.href,{state:C(d.state,c,t.entityId,S(d))})};return(0,F.jsxs)(o.Root,{onOpenChange:X,open:g,children:[(0,F.jsx)(o.Trigger,{className:P.trigger,size:`compact`,variant:`quiet`,children:`Search ⌘K`}),(0,F.jsxs)(o.Content,{className:P.dialog,description:`Find releases and current work, or continue with Relay.`,initialFocusRef:h,size:`wide`,title:`Go anywhere.`,children:[(0,F.jsxs)(`label`,{className:P.searchField,children:[(0,F.jsx)(`span`,{className:P.visuallyHidden,children:`Search workspace`}),(0,F.jsx)(`input`,{"aria-activedescendant":Y?`command-search-option-${E}`:void 0,"aria-autocomplete":`list`,"aria-busy":M!==A||U._tag===`loading`||K.state._tag===`loading`,"aria-controls":Y?`command-search-results`:void 0,"aria-expanded":Y,"aria-label":`Search workspace`,autoComplete:`off`,maxLength:200,onChange:e=>y(e.currentTarget.value),onKeyDown:e=>{if(J.length!==0){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;O(e=>(e+t+J.length)%J.length);return}if(e.key===`Enter`){e.preventDefault();let t=J[E];t!==void 0&&Z(t)}}},placeholder:`Release, ticket, PR, page, pipeline…`,ref:h,role:`combobox`,type:`search`,value:v})]}),A.length<I?(0,F.jsxs)(`div`,{className:P.message,children:[(0,F.jsx)(`strong`,{children:`Type two characters.`}),(0,F.jsx)(`span`,{children:`Search releases, tickets, pull requests, docs, pipelines, deployments, and time.`})]}):M!==A||U._tag===`idle`||U._tag===`loading`||K.state._tag===`idle`||K.state._tag===`loading`?(0,F.jsx)(`div`,{className:P.loading,children:`Searching the current workspace…`}):!G||K.state._tag===`failed`?(0,F.jsxs)(`div`,{className:P.message,children:[(0,F.jsx)(`strong`,{children:`Search is unavailable.`}),(0,F.jsx)(`span`,{children:`The release and item indexes were not changed.`}),(0,F.jsx)(`button`,{onClick:()=>{V.retry(),K.retry()},type:`button`,children:`Try again`})]}):J.length===0?(0,F.jsxs)(`div`,{className:P.message,children:[(0,F.jsxs)(`strong`,{children:[`No release or current item matches “`,M,`”.`]}),(0,F.jsx)(`span`,{children:`Try a release name, version, key, title, or current status.`})]}):(0,F.jsx)(`div`,{"aria-label":`Workspace search results`,className:P.results,id:`command-search-results`,role:`listbox`,children:J.map((e,t)=>{let n=e._tag===`release`,r=n?e.release.id:e.item.entityId;return(0,F.jsxs)(`button`,{"aria-selected":t===E,className:P.result,id:`command-search-option-${t}`,onClick:()=>Z(e),onMouseEnter:()=>O(t),role:`option`,type:`button`,children:[n?(0,F.jsx)(`span`,{className:P.releaseMark,children:`R`}):(0,F.jsx)(p,{service:e.item.service,size:`compact`}),(0,F.jsxs)(`span`,{className:P.resultCopy,children:[(0,F.jsx)(`span`,{className:P.resultKey,children:n?`${e.release.version} · Release`:e.item.key}),(0,F.jsx)(`strong`,{children:n?e.release.codename:e.item.title}),(0,F.jsx)(`span`,{children:n?e.release.serviceName:z(e.item.kind)})]}),(0,F.jsx)(a,{label:n?e.release.status:e.item.status,size:`compact`,tone:n?e.release.tone:e.item.tone})]},r)})}),(0,F.jsxs)(`footer`,{className:P.footer,children:[(0,F.jsx)(i,{onClick:()=>X(!1),to:k(c,A),children:`Open item results`}),(0,F.jsx)(i,{onClick:()=>X(!1),to:u(d.pathname,d.search,d.hash),children:`Ask Relay from here`}),(0,F.jsx)(`span`,{children:`↑↓ choose · Enter open · Esc close`})]})]})]})},W=e=>{let t=f(),n=t.state._tag===`authenticated`||t.state._tag===`storage-unavailable`?t.state.session:null,r=d(t.state);return n!==null&&n.workspaceId!==e.workspaceId?null:r===null?(0,F.jsx)(i,{className:P.pairTrigger,to:`/pair`,children:`Pair to search`}):(0,F.jsx)(U,{...e,sessionKey:r})};export{W as CommandSearch,H as commandSearchResults};
2
+ //# sourceMappingURL=CommandSearch-D6iFcdvj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandSearch-D6iFcdvj.js","names":[],"sources":["../../../src/client/command/commandSearchRoutes.ts","../../../src/client/command/useCommandReleases.ts","../../../src/client/command/CommandSearch.module.css","../../../src/client/command/CommandSearch.tsx"],"sourcesContent":["import type { EntityId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { workspaceItemsPath } from \"../releases/releasePaths.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\nconst searchParameters = (query: string): URLSearchParams => {\n const parameters = new URLSearchParams()\n const normalized = query.trim()\n if (normalized.length > 0) parameters.set(\"q\", normalized)\n return parameters\n}\n\n/** Open the workspace Items route with the exact command-search text. */\nexport const commandSearchItemsHref = (workspaceId: WorkspaceId, query: string): string => {\n const parameters = searchParameters(query)\n const search = parameters.size === 0 ? \"\" : `?${parameters.toString()}`\n return `${workspaceItemsPath(workspaceId)}${search}#results`\n}\n\n/** Open one command-search result without inventing a release membership. */\nexport const commandSearchItemHref = (\n workspaceId: WorkspaceId,\n entityId: EntityId\n): string => workspaceEntityPath(workspaceId, entityId)\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { PortfolioSnapshot } from \"../../api/portfolio.js\"\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { presentPortfolio } from \"../portfolio/presentPortfolio.js\"\nimport { releaseFullPath } from \"../releases/releasePaths.js\"\n\nexport type CommandReleasePresentation = {\n readonly codename: string\n readonly href: string\n readonly id: ReleaseId\n readonly serviceName: string\n readonly status: string\n readonly tone: \"caution\" | \"critical\" | \"neutral\" | \"positive\" | \"progress\"\n readonly version: string\n}\n\nexport type CommandReleasesState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\"; readonly sessionKey: string }\n | { readonly _tag: \"failed\"; readonly sessionKey: string }\n | {\n readonly _tag: \"ready\"\n readonly releases: ReadonlyArray<CommandReleasePresentation>\n readonly sessionKey: string\n readonly workspaceId: WorkspaceId\n }\n\nexport type CommandReleasesTransport = {\n readonly load: (signal: AbortSignal) => Promise<PortfolioSnapshot>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for one authenticated, bounded portfolio snapshot. */\nexport const browserCommandReleasesTransport: CommandReleasesTransport = {\n load: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.portfolio.snapshot()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst presentCommandReleases = (snapshot: PortfolioSnapshot): ReadonlyArray<CommandReleasePresentation> =>\n presentPortfolio(snapshot).releases.map((release) => ({\n codename: release.relay.codename,\n href: releaseFullPath(snapshot.workspaceId, release.id),\n id: release.id,\n serviceName: release.serviceName,\n status: release.lifecycleLabel,\n tone: release.lifecycleTone,\n version: release.version\n }))\n\n/** Load one session-isolated release index while the command surface is open. */\nexport const useCommandReleases = (\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: CommandReleasesTransport = browserCommandReleasesTransport\n): { readonly retry: () => void; readonly state: CommandReleasesState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<CommandReleasesState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", sessionKey })\n transport.load(abort.signal).then(\n (snapshot) => {\n if (abort.signal.aborted) return\n setState({\n _tag: \"ready\",\n releases: presentCommandReleases(snapshot),\n sessionKey,\n workspaceId: snapshot.workspaceId\n })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", sessionKey })\n }\n )\n return () => abort.abort()\n }, [onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: CommandReleasesState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n",".trigger,\n.pairTrigger {\n white-space: nowrap;\n}\n\n.pairTrigger {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.dialog {\n gap: var(--rly-space-16);\n}\n\n.searchField {\n display: block;\n}\n\n.searchField input {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: 4.5rem;\n border: 0;\n border-block-end: 1px solid var(--rly-color-border-2);\n outline: 0;\n background: transparent;\n color: var(--rly-color-text-1);\n font: var(--rly-type-section-title-weight) var(--rly-type-section-title-size) /\n var(--rly-type-section-title-line-height) var(--rly-type-section-title-font);\n letter-spacing: var(--rly-type-section-title-tracking);\n}\n\n.searchField input::placeholder {\n color: var(--rly-color-text-3);\n}\n\n.searchField input:focus-visible {\n border-block-end-color: var(--rly-color-focus);\n}\n\n.results {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.result {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--rly-space-12);\n inline-size: 100%;\n min-block-size: 4.5rem;\n padding: var(--rly-space-12);\n border: 1px solid transparent;\n border-radius: var(--rly-radius-control);\n background: transparent;\n color: var(--rly-color-text-1);\n cursor: pointer;\n text-align: start;\n}\n\n.result[aria-selected=\"true\"] {\n border-color: var(--rly-color-border-2);\n background: var(--rly-color-surface-2);\n}\n\n.resultCopy {\n display: grid;\n min-inline-size: 0;\n gap: var(--rly-space-2);\n}\n\n.releaseMark {\n display: grid;\n inline-size: var(--rly-space-32);\n block-size: var(--rly-space-32);\n place-items: center;\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.resultCopy strong {\n overflow: hidden;\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.resultCopy > span:last-child,\n.resultKey {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.message,\n.loading {\n display: grid;\n min-block-size: 10rem;\n place-content: center;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n text-align: center;\n}\n\n.message strong {\n color: var(--rly-color-text-1);\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n}\n\n.message a,\n.message button,\n.footer a {\n color: var(--rly-color-text-1);\n font: inherit;\n text-underline-offset: 0.2em;\n}\n\n.message button {\n border: 0;\n background: transparent;\n cursor: pointer;\n text-decoration: underline;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-16);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n color: var(--rly-color-text-3);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.footer span {\n margin-inline-start: auto;\n}\n\n.visuallyHidden {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n@media (max-width: 40rem) {\n .footer span {\n display: none;\n }\n\n .result {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .result > :last-child {\n grid-column: 2;\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Dialog, StateLabel } from \"@knpkv/rly/primitives\"\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n useDeferredValue,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport type { WorkspaceItemPresentation } from \"../items/presentWorkspaceItems.js\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"../items/workspaceEntityRoutes.js\"\nimport {\n browserWorkspaceItemsTransport,\n useWorkspaceItems,\n type WorkspaceItemsQuery,\n type WorkspaceItemsTransport\n} from \"../items/useWorkspaceItems.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { commandSearchItemsHref } from \"./commandSearchRoutes.js\"\nimport {\n browserCommandReleasesTransport,\n type CommandReleasePresentation,\n type CommandReleasesTransport,\n useCommandReleases\n} from \"./useCommandReleases.js\"\nimport styles from \"./CommandSearch.module.css\"\n\nconst MINIMUM_QUERY_LENGTH = 2\nconst RESULT_LIMIT = 6\nconst EMPTY_RELEASE_SCOPE: ReadonlySet<ReleaseId> = new Set()\n\ntype CommandSearchResult =\n | { readonly _tag: \"item\"; readonly item: WorkspaceItemPresentation; readonly rank: number }\n | { readonly _tag: \"release\"; readonly rank: number; readonly release: CommandReleasePresentation }\n\nconst kindLabel = (kind: WorkspaceItemPresentation[\"kind\"]): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nconst isEditingTarget = (target: EventTarget | null): boolean => {\n if (target === null) return false\n if (\"isContentEditable\" in target && target.isContentEditable === true) return true\n if (!(\"nodeName\" in target) || typeof target.nodeName !== \"string\") return false\n return target.nodeName === \"INPUT\" || target.nodeName === \"SELECT\" || target.nodeName === \"TEXTAREA\"\n}\n\nconst matchRank = (query: string, values: ReadonlyArray<string>): number => {\n const normalizedValues = values.map((value) => value.toLocaleLowerCase(\"en-US\"))\n if (normalizedValues.some((value) => value === query)) return 0\n if (normalizedValues.some((value) => value.startsWith(query))) return 1\n return normalizedValues.some((value) => value.includes(query)) ? 2 : 3\n}\n\n/** Combine bounded release and service-entity results with deterministic exact/prefix/contains ranking. */\nexport const commandSearchResults = (\n releases: ReadonlyArray<CommandReleasePresentation>,\n items: ReadonlyArray<WorkspaceItemPresentation>,\n query: string\n): ReadonlyArray<CommandSearchResult> => {\n const normalizedQuery = query.trim().toLocaleLowerCase(\"en-US\")\n if (normalizedQuery.length === 0) return []\n const releaseResults: ReadonlyArray<CommandSearchResult> = releases.flatMap((release) => {\n const rank = matchRank(normalizedQuery, [release.codename, release.version, release.serviceName, release.status])\n return rank === 3 ? [] : [{ _tag: \"release\", rank, release }]\n })\n const itemResults: ReadonlyArray<CommandSearchResult> = items.flatMap((item) => {\n const rank = matchRank(normalizedQuery, [item.key, item.title, item.status])\n return rank === 3 ? [] : [{ _tag: \"item\", item, rank }]\n })\n return [...releaseResults, ...itemResults]\n .sort((left, right) => {\n if (left.rank !== right.rank) return left.rank - right.rank\n if (left._tag !== right._tag) return left._tag === \"release\" ? -1 : 1\n const leftLabel = left._tag === \"release\" ? left.release.codename : left.item.key\n const rightLabel = right._tag === \"release\" ? right.release.codename : right.item.key\n return leftLabel.localeCompare(rightLabel)\n })\n .slice(0, RESULT_LIMIT)\n}\n\nexport type CommandSearchProps = {\n readonly releaseTransport?: CommandReleasesTransport\n readonly transport?: WorkspaceItemsTransport\n readonly workspaceId: WorkspaceId\n}\n\ntype CommandSearchSurfaceProps = CommandSearchProps & { readonly sessionKey: string }\n\nconst CommandSearchSurface = ({\n releaseTransport = browserCommandReleasesTransport,\n sessionKey,\n transport = browserWorkspaceItemsTransport,\n workspaceId\n}: CommandSearchSurfaceProps): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const inputRef = useRef<HTMLInputElement>(null)\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const normalizedQuery = query.trim()\n const deferredQuery = useDeferredValue(normalizedQuery)\n const queryReady = deferredQuery.length >= MINIMUM_QUERY_LENGTH\n const releases = useCommandReleases(open ? sessionKey : null, browserSession.invalidateSession, releaseTransport)\n const releaseState = releases.state\n const releaseScope = useMemo(\n () =>\n releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n ? new Set(releaseState.releases.map(({ id }) => id))\n : EMPTY_RELEASE_SCOPE,\n [releaseState, workspaceId]\n )\n const releasesReady = releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n const filters = useMemo<WorkspaceItemsQuery>(\n () => ({ owner: \"all\", query: queryReady ? deferredQuery : \"\", service: \"all\", status: \"all\", type: \"all\" }),\n [deferredQuery, queryReady]\n )\n const items = useWorkspaceItems(\n workspaceId,\n releaseScope,\n filters,\n releaseState._tag === \"ready\" ? releaseState.releases.map(({ id }) => id).join(\":\") : \"command-search\",\n open && queryReady && releasesReady ? sessionKey : null,\n browserSession.invalidateSession,\n transport\n )\n const itemsReady = items.state._tag === \"ready\" && !items.state.refreshing\n const results =\n releasesReady && itemsReady ? commandSearchResults(releaseState.releases, items.state.items, deferredQuery) : []\n const showListbox = results.length > 0\n\n const changeOpen = (nextOpen: boolean): void => {\n setOpen(nextOpen)\n if (!nextOpen) {\n setQuery(\"\")\n setHighlightedIndex(0)\n }\n }\n\n useEffect(() => {\n const openFromKeyboard = (event: KeyboardEvent): void => {\n if (\n event.defaultPrevented ||\n isEditingTarget(event.target) ||\n event.key.toLocaleLowerCase(\"en-US\") !== \"k\" ||\n (!event.metaKey && !event.ctrlKey)\n )\n return\n event.preventDefault()\n setOpen(true)\n }\n document.addEventListener(\"keydown\", openFromKeyboard)\n return () => document.removeEventListener(\"keydown\", openFromKeyboard)\n }, [])\n\n useEffect(() => setHighlightedIndex(0), [deferredQuery])\n\n const openResult = (result: CommandSearchResult): void => {\n changeOpen(false)\n if (result._tag === \"release\") {\n navigate(result.release.href, {\n state: makeReleaseRouteState(workspaceId, result.release.id, releaseOriginFromLocation(location))\n })\n return\n }\n const item = result.item\n navigate(item.href, {\n state: makeWorkspaceEntityRouteState(\n location.state,\n workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )\n })\n }\n\n const onInputKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>): void => {\n if (results.length === 0) return\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault()\n const delta = event.key === \"ArrowDown\" ? 1 : -1\n setHighlightedIndex((current) => (current + delta + results.length) % results.length)\n return\n }\n if (event.key === \"Enter\") {\n event.preventDefault()\n const selected = results[highlightedIndex]\n if (selected !== undefined) openResult(selected)\n }\n }\n\n const content = (): ReactElement => {\n if (normalizedQuery.length < MINIMUM_QUERY_LENGTH) {\n return (\n <div className={styles.message}>\n <strong>Type two characters.</strong>\n <span>Search releases, tickets, pull requests, docs, pipelines, deployments, and time.</span>\n </div>\n )\n }\n const loading =\n deferredQuery !== normalizedQuery ||\n releaseState._tag === \"idle\" ||\n releaseState._tag === \"loading\" ||\n items.state._tag === \"idle\" ||\n items.state._tag === \"loading\"\n if (loading) return <div className={styles.loading}>Searching the current workspace…</div>\n if (!releasesReady || items.state._tag === \"failed\") {\n return (\n <div className={styles.message}>\n <strong>Search is unavailable.</strong>\n <span>The release and item indexes were not changed.</span>\n <button\n onClick={() => {\n releases.retry()\n items.retry()\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n )\n }\n if (results.length === 0) {\n return (\n <div className={styles.message}>\n <strong>No release or current item matches “{deferredQuery}”.</strong>\n <span>Try a release name, version, key, title, or current status.</span>\n </div>\n )\n }\n return (\n <div aria-label=\"Workspace search results\" className={styles.results} id=\"command-search-results\" role=\"listbox\">\n {results.map((result, index) => {\n const isRelease = result._tag === \"release\"\n const key = isRelease ? result.release.id : result.item.entityId\n return (\n <button\n aria-selected={index === highlightedIndex}\n className={styles.result}\n id={`command-search-option-${index}`}\n key={key}\n onClick={() => openResult(result)}\n onMouseEnter={() => setHighlightedIndex(index)}\n role=\"option\"\n type=\"button\"\n >\n {isRelease ? (\n <span className={styles.releaseMark}>R</span>\n ) : (\n <ServiceMark service={result.item.service} size=\"compact\" />\n )}\n <span className={styles.resultCopy}>\n <span className={styles.resultKey}>\n {isRelease ? `${result.release.version} · Release` : result.item.key}\n </span>\n <strong>{isRelease ? result.release.codename : result.item.title}</strong>\n <span>{isRelease ? result.release.serviceName : kindLabel(result.item.kind)}</span>\n </span>\n <StateLabel\n label={isRelease ? result.release.status : result.item.status}\n size=\"compact\"\n tone={isRelease ? result.release.tone : result.item.tone}\n />\n </button>\n )\n })}\n </div>\n )\n }\n\n return (\n <Dialog.Root onOpenChange={changeOpen} open={open}>\n <Dialog.Trigger className={styles.trigger} size=\"compact\" variant=\"quiet\">\n Search ⌘K\n </Dialog.Trigger>\n <Dialog.Content\n className={styles.dialog}\n description=\"Find releases and current work, or continue with Relay.\"\n initialFocusRef={inputRef}\n size=\"wide\"\n title=\"Go anywhere.\"\n >\n <label className={styles.searchField}>\n <span className={styles.visuallyHidden}>Search workspace</span>\n <input\n aria-activedescendant={showListbox ? `command-search-option-${highlightedIndex}` : undefined}\n aria-autocomplete=\"list\"\n aria-busy={\n deferredQuery !== normalizedQuery || releaseState._tag === \"loading\" || items.state._tag === \"loading\"\n }\n aria-controls={showListbox ? \"command-search-results\" : undefined}\n aria-expanded={showListbox}\n aria-label=\"Search workspace\"\n autoComplete=\"off\"\n maxLength={200}\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={onInputKeyDown}\n placeholder=\"Release, ticket, PR, page, pipeline…\"\n ref={inputRef}\n role=\"combobox\"\n type=\"search\"\n value={query}\n />\n </label>\n {content()}\n <footer className={styles.footer}>\n <Link onClick={() => changeOpen(false)} to={commandSearchItemsHref(workspaceId, normalizedQuery)}>\n Open item results\n </Link>\n <Link\n onClick={() => changeOpen(false)}\n to={contextualAgentPath(location.pathname, location.search, location.hash)}\n >\n Ask Relay from here\n </Link>\n <span>↑↓ choose · Enter open · Esc close</span>\n </footer>\n </Dialog.Content>\n </Dialog.Root>\n )\n}\n\n/** Suppress search when a syntactically valid route does not belong to the readable browser session. */\nexport const CommandSearch = (props: CommandSearchProps): ReactElement | null => {\n const browserSession = useBrowserSession()\n const readableSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const sessionKey = browserReadableSessionKey(browserSession.state)\n if (readableSession !== null && readableSession.workspaceId !== props.workspaceId) return null\n if (sessionKey === null) {\n return (\n <Link className={styles.pairTrigger} to=\"/pair\">\n Pair to search\n </Link>\n )\n }\n return <CommandSearchSurface {...props} sessionKey={sessionKey} />\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ._trigger_dhy9p_1,._pairTrigger_dhy9p_2{white-space:nowrap}._pairTrigger_dhy9p_2{color:var(--rly-color-text-2);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);text-decoration:none}._dialog_dhy9p_13{gap:var(--rly-space-16)}._searchField_dhy9p_17{display:block}._searchField_dhy9p_17 input{box-sizing:border-box;border:0;border-block-end:1px solid var(--rly-color-border-2);min-block-size:4.5rem;inline-size:100%;color:var(--rly-color-text-1);font:var(--rly-type-section-title-weight) var(--rly-type-section-title-size) / var(--rly-type-section-title-line-height) var(--rly-type-section-title-font);letter-spacing:var(--rly-type-section-title-tracking);background:0 0;outline:0}._searchField_dhy9p_17 input::placeholder{color:var(--rly-color-text-3)}._searchField_dhy9p_17 input:focus-visible{border-block-end-color:var(--rly-color-focus)}._results_dhy9p_43{gap:var(--rly-space-4);display:grid}._result_dhy9p_43{align-items:center;gap:var(--rly-space-12);min-block-size:4.5rem;inline-size:100%;padding:var(--rly-space-12);border-radius:var(--rly-radius-control);color:var(--rly-color-text-1);cursor:pointer;text-align:start;background:0 0;border:1px solid #0000;grid-template-columns:auto minmax(0,1fr) auto;display:grid}._result_dhy9p_43[aria-selected=true]{border-color:var(--rly-color-border-2);background:var(--rly-color-surface-2)}._resultCopy_dhy9p_69{gap:var(--rly-space-2);min-inline-size:0;display:grid}._releaseMark_dhy9p_75{inline-size:var(--rly-space-32);block-size:var(--rly-space-32);border-radius:var(--rly-radius-control);background:var(--rly-color-action-background);color:var(--rly-color-action-foreground);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);place-items:center;display:grid}._resultCopy_dhy9p_69 strong{font:var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height) var(--rly-type-card-title-font);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._resultCopy_dhy9p_69>span:last-child,._resultKey_dhy9p_96{color:var(--rly-color-text-2);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font)}._message_dhy9p_102,._loading_dhy9p_103{place-content:center;gap:var(--rly-space-8);min-block-size:10rem;color:var(--rly-color-text-2);text-align:center;display:grid}._message_dhy9p_102 strong{color:var(--rly-color-text-1);font:var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height) var(--rly-type-card-title-font)}._message_dhy9p_102 a,._message_dhy9p_102 button,._footer_dhy9p_120 a{color:var(--rly-color-text-1);font:inherit;text-underline-offset:.2em}._message_dhy9p_102 button{cursor:pointer;background:0 0;border:0;text-decoration:underline}._footer_dhy9p_120{align-items:center;gap:var(--rly-space-16);border-block-start:1px solid var(--rly-color-border-1);color:var(--rly-color-text-3);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);flex-wrap:wrap;padding-block-start:var(--rly-space-12);display:flex}._footer_dhy9p_120 span{margin-inline-start:auto}._visuallyHidden_dhy9p_149{clip-path:inset(50%);white-space:nowrap;block-size:1px;inline-size:1px;position:absolute;overflow:hidden}@media (width<=40rem){._footer_dhy9p_120 span{display:none}._result_dhy9p_43{grid-template-columns:auto minmax(0,1fr)}._result_dhy9p_43>:last-child{grid-column:2}}