ryco-cli 0.1.23 → 0.1.25

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 (305) hide show
  1. package/dist/{AcpNativeLogging-COepku4a.cjs → AcpNativeLogging-CA6XYzIS.cjs} +1 -1
  2. package/dist/{AcpNativeLogging-D7e1dn7s.mjs → AcpNativeLogging-D4-VoHrq.mjs} +1 -1
  3. package/dist/{AzureDevOpsSourceControlProvider-BNGEg1R8.mjs → AzureDevOpsSourceControlProvider-B_E0XXfD.mjs} +2 -2
  4. package/dist/{AzureDevOpsSourceControlProvider-CrvgKNf2.cjs → AzureDevOpsSourceControlProvider-COmd21c-.cjs} +2 -2
  5. package/dist/{BitbucketSourceControlProvider-BzhsQwH-.cjs → BitbucketSourceControlProvider-CD8IvXQK.cjs} +2 -2
  6. package/dist/{BitbucketSourceControlProvider-Bt21jw68.mjs → BitbucketSourceControlProvider-pUKsNXcg.mjs} +2 -2
  7. package/dist/{ClaudeDriver-C4yu7Jit.mjs → ClaudeDriver-CGifBixr.mjs} +2 -2
  8. package/dist/{ClaudeDriver-B7mbf51W.cjs → ClaudeDriver-Dry5uJfX.cjs} +2 -2
  9. package/dist/{CodexDriver-CR0S17Lb.cjs → CodexDriver-BzR8gA8w.cjs} +3 -3
  10. package/dist/{CodexDriver-DnnqkGoY.mjs → CodexDriver-V4CL9APE.mjs} +3 -3
  11. package/dist/{CodexTextGeneration-tlfe1S5W.cjs → CodexTextGeneration-DTrSzY-I.cjs} +1 -1
  12. package/dist/{CodexTextGeneration-Cw-FZbSS.mjs → CodexTextGeneration-DoCidwvI.mjs} +1 -1
  13. package/dist/{CopilotDriver-GxKLX5pL.mjs → CopilotDriver-Dt13X60f.mjs} +3 -3
  14. package/dist/{CopilotDriver-IBd27Ji2.cjs → CopilotDriver-rLcA8PSN.cjs} +3 -3
  15. package/dist/{CursorDriver-C4Enoe9N.cjs → CursorDriver-C3s-8s9F.cjs} +3 -3
  16. package/dist/{CursorDriver-CNo9Uzo8.mjs → CursorDriver-HIPUs7cz.mjs} +3 -3
  17. package/dist/{ForgejoSourceControlProvider-BGXysSX6.mjs → ForgejoSourceControlProvider-CmvOAzEG.mjs} +2 -2
  18. package/dist/{ForgejoSourceControlProvider-Dh6DOoc8.cjs → ForgejoSourceControlProvider-JgiyrMqp.cjs} +2 -2
  19. package/dist/{GitHubSourceControlProvider-CPCYV8Xo.mjs → GitHubSourceControlProvider-BYuvbcBf.mjs} +2 -2
  20. package/dist/{GitHubSourceControlProvider-8hsv_kCE.cjs → GitHubSourceControlProvider-CItCpOcC.cjs} +2 -2
  21. package/dist/{GitLabSourceControlProvider-B0ZbF9Zx.cjs → GitLabSourceControlProvider-CMce22nU.cjs} +2 -2
  22. package/dist/{GitLabSourceControlProvider-Bvknpaon.mjs → GitLabSourceControlProvider-DZzEaVSi.mjs} +2 -2
  23. package/dist/{GrokDriver-DSPEmiwq.mjs → GrokDriver-CduUwiOH.mjs} +3 -3
  24. package/dist/{GrokDriver-RyyFeh_q.cjs → GrokDriver-D0jraOC_.cjs} +3 -3
  25. package/dist/{OpenCodeDriver-0q44rSQX.mjs → OpenCodeDriver-Bz_uJdMA.mjs} +2 -2
  26. package/dist/{OpenCodeDriver-CDcvPT9v.cjs → OpenCodeDriver-DxGpgtDS.cjs} +2 -2
  27. package/dist/{SourceControlProviderDiscoveryCatalog-DreaAH1H.cjs → SourceControlProviderDiscoveryCatalog-Dm_lhrhv.cjs} +1 -1
  28. package/dist/{SourceControlProviderDiscoveryCatalog-B37RHe2u.mjs → SourceControlProviderDiscoveryCatalog-ZtwPWoxE.mjs} +1 -1
  29. package/dist/bin.cjs +518 -263
  30. package/dist/bin.mjs +519 -264
  31. package/dist/client/assets/AccountSettings-Bv57-JYy.js +1 -0
  32. package/dist/client/assets/AiFocusSettings-DCPHmJpA.js +1 -0
  33. package/dist/client/assets/{AnimatedHeight-D9bpLPqe.js → AnimatedHeight-DPqb09B0.js} +1 -1
  34. package/dist/client/assets/AppearanceSettings-EmTrtb_U.js +1 -0
  35. package/dist/client/assets/BranchToolbar.logic-CHRK3hDt.js +1 -0
  36. package/dist/client/assets/BrowserPanel-2Xu08il5.js +1 -0
  37. package/dist/client/assets/ChatRightPanel-C1VD6GCV.js +194 -0
  38. package/dist/client/assets/ChatThreadRouteView-CNww3i2J.js +1 -0
  39. package/dist/client/assets/CommandPaletteDialog-B_f3fKp7.js +1 -0
  40. package/dist/client/assets/CompositeRoot-B40iitmH.js +1 -0
  41. package/dist/client/assets/ComputerUseSettings-BJs7jqR0.js +1 -0
  42. package/dist/client/assets/ConnectionsSettings-B9nfvgLG.js +7 -0
  43. package/dist/client/assets/ContextHandoffEndpointLabel-BSQOArMR.js +4 -0
  44. package/dist/client/assets/DiagnosticsSettings-BmrqOKMe.js +2 -0
  45. package/dist/client/assets/DialogHandle-pelzaaiH.js +1 -0
  46. package/dist/client/assets/DialogPopup-BLM0vN4N.js +1 -0
  47. package/dist/client/assets/DialogRoot-CY6ZzEUS.js +1 -0
  48. package/dist/client/assets/DialogTitle-BvIjMtMm.js +1 -0
  49. package/dist/client/assets/DialogTrigger-CIeVAA-a.js +1 -0
  50. package/dist/client/assets/DialogViewport-Cz0OadGI.js +1 -0
  51. package/dist/client/assets/DraftChatThreadRouteView-DMIGMESb.js +1 -0
  52. package/dist/client/assets/{ExternalIdentityWeb.logic-pjD4pCDd.js → ExternalIdentityWeb.logic-3rlDV7lT.js} +1 -1
  53. package/dist/client/assets/GlassSurface-CEVIdyfP.js +1 -0
  54. package/dist/client/assets/HostedConnectionControls-r9cyZPyF.js +1 -0
  55. package/dist/client/assets/HostedHubRoot-BkfafJ5x.js +2 -0
  56. package/dist/client/assets/HostedNativeAuthorizationRoute-CqHuW853.js +2 -0
  57. package/dist/client/assets/HostedNodeRenameDialog-C7m-nvTj.js +1 -0
  58. package/dist/client/assets/HostedRelayTrustNotice-DNZQyAX0.js +1 -0
  59. package/dist/client/assets/IntegrationsSettingsPanel-hul3ysgL.js +2 -0
  60. package/dist/client/assets/KeybindingsSettings-Cme6omBM.js +7 -0
  61. package/dist/client/assets/LazyBrowserPanel-COJFwNK7.js +2 -0
  62. package/dist/client/assets/McpServersSettings-CPeNF8_u.js +6 -0
  63. package/dist/client/assets/MobileSheet-BZo-RAfm.js +1 -0
  64. package/dist/client/assets/NodeSecuritySettings-CwT5nEW9.js +1 -0
  65. package/dist/client/assets/OpinionatedPluginsSettings-D8A1CbMG.js +1 -0
  66. package/dist/client/assets/PhoneGetAppInterstitial-BBnGXVkR.js +1 -0
  67. package/dist/client/assets/PhoneHome-BTKOPVjw.js +1 -0
  68. package/dist/client/assets/PhoneSettingsSurface-DdVCndyt.js +2 -0
  69. package/dist/client/assets/ProviderModelPicker-DoYEUZrn.js +1 -0
  70. package/dist/client/assets/ProvidersSettingsPanel-ldDCPVIY.js +1 -0
  71. package/dist/client/assets/QuitShortcutFeedback-mF7X0WMD.js +1 -0
  72. package/dist/client/assets/RedactedSensitiveText-DovqFcmM.js +1 -0
  73. package/dist/client/assets/RootAppShell-CzmEWO9w.js +7 -0
  74. package/dist/client/assets/Separator-BhAVTIOc.js +1 -0
  75. package/dist/client/assets/SettingsDialog-ByXgBN0U.js +2 -0
  76. package/dist/client/assets/SettingsPanels-Bgf4vkrJ.js +3 -0
  77. package/dist/client/assets/SettingsPanels.editor-d-rVlbeN.js +1 -0
  78. package/dist/client/assets/SourceControlSettings-dKw0FaN1.js +1 -0
  79. package/dist/client/assets/StatisticsPage-C2RuqDIK.js +1 -0
  80. package/dist/client/assets/StatisticsPanel-DqoXnrhQ.js +1 -0
  81. package/dist/client/assets/StatisticsSettingsLink-C_f31sb4.js +1 -0
  82. package/dist/client/assets/{ThreadTerminalDrawer-DcZk76Y9.js → ThreadTerminalDrawer-DaLrSTn9.js} +11 -11
  83. package/dist/client/assets/ThreadWorkspacePanel-BvRZIxZQ.js +2073 -0
  84. package/dist/client/assets/activity-bn_fBQGf.js +1 -0
  85. package/dist/client/assets/alert-BmLJh6DH.js +1 -0
  86. package/dist/client/assets/{appChrome-CiOQzE1d.js → appChrome-Dy57Ve9N.js} +1 -1
  87. package/dist/client/assets/arrow-left-pzj1cbX3.js +1 -0
  88. package/dist/client/assets/arrow-right-BW5jU-vo.js +1 -0
  89. package/dist/client/assets/arrow-up-right-AfC5AaSO.js +1 -0
  90. package/dist/client/assets/authorization-7xVVtCBu.js +1 -0
  91. package/dist/client/assets/badge-DnBuGHGL.js +1 -0
  92. package/dist/client/assets/bot-CsKkSRlb.js +1 -0
  93. package/dist/client/assets/{capabilities-BTd0MRtv.js → capabilities-DskyVNd2.js} +1 -1
  94. package/dist/client/assets/chart-column-DhvWXIiH.js +1 -0
  95. package/dist/client/assets/chevron-right-CITtTwME.js +1 -0
  96. package/dist/client/assets/clipboard-copy-fJnfdl4H.js +1 -0
  97. package/dist/client/assets/data-list-_E-Al1sf.js +1 -0
  98. package/dist/client/assets/desktopWorkspace-DycXKuMm.js +1 -0
  99. package/dist/client/assets/download-CLQzE1di.js +1 -0
  100. package/dist/client/assets/editorPreferences-Bg624RVT.js +1 -0
  101. package/dist/client/assets/empty-YXFtCUDN.js +1 -0
  102. package/dist/client/assets/group-DOCkUmuY.js +1 -0
  103. package/dist/client/assets/hostedConnectionCoordinator-JZ1dLx4v.js +1 -0
  104. package/dist/client/assets/{hostedPairing-PogXRAb7.js → hostedPairing-B_ylEEDa.js} +1 -1
  105. package/dist/client/assets/hubRoutes-C2S5of9_.js +1 -0
  106. package/dist/client/assets/{index-D5j6WG7w.js → index-CvRFRkBK.js} +2 -2
  107. package/dist/client/assets/input-C2xv8mMt.js +1 -0
  108. package/dist/client/assets/kbd-4-4mGdIa.js +1 -0
  109. package/dist/client/assets/key-round-CYcb9lAa.js +1 -0
  110. package/dist/client/assets/layers-CGlOWYxu.js +1 -0
  111. package/dist/client/assets/log-out-CZW2EpNJ.js +1 -0
  112. package/dist/client/assets/{logging-DfaR8ACp.js → logging-BpmZOfmu.js} +1 -1
  113. package/dist/client/assets/main-CC-U8LrA.css +2 -0
  114. package/dist/client/assets/main-CzDOnLFw.js +9 -0
  115. package/dist/client/assets/palette-CQOuNfSO.js +1 -0
  116. package/dist/client/assets/play-CPVy9wwV.js +1 -0
  117. package/dist/client/assets/primary-CjhRI8fe.js +2 -0
  118. package/dist/client/assets/providerDriverMeta-BVHpFupf.js +1 -0
  119. package/dist/client/assets/providerModels-BsybzP4P.js +1 -0
  120. package/dist/client/assets/{qr-code-Bun4dpvz.js → qr-code-BPqDlVMn.js} +1 -1
  121. package/dist/client/assets/qr-code-C6BVTc4V.js +1 -0
  122. package/dist/client/assets/radio-group-C8qudOQH.js +2 -0
  123. package/dist/client/assets/refresh-cw-B5Cz1z3e.js +1 -0
  124. package/dist/client/assets/runtime-Bxg7k81u.js +17 -0
  125. package/dist/client/assets/save-C7zM6ey6.js +1 -0
  126. package/dist/client/assets/scroll-area-5OU_pvTW.js +1 -0
  127. package/dist/client/assets/scrollEdges-qnEXfIOg.js +1 -0
  128. package/dist/client/assets/separator-B5HfRiaO.js +1 -0
  129. package/dist/client/assets/settingsLayout-CfKq88KD.js +1 -0
  130. package/dist/client/assets/sheet-B9gQDy_I.js +1 -0
  131. package/dist/client/assets/shield-alert-7yBlEyOs.js +1 -0
  132. package/dist/client/assets/shield-check-CnKgVJ0F.js +1 -0
  133. package/dist/client/assets/shield-rdjnBE2Q.js +1 -0
  134. package/dist/client/assets/sidebar-BdvL1Pbj.js +1 -0
  135. package/dist/client/assets/sidebarProjectFolders-BH8XBqNe.js +4 -0
  136. package/dist/client/assets/sidebarStatusText-CZKsUFBD.js +1 -0
  137. package/dist/client/assets/skeleton-CoyLqyaB.js +1 -0
  138. package/dist/client/assets/smartphone-CBgpMHXR.js +1 -0
  139. package/dist/client/assets/sparkles-w-UZXQx1.js +1 -0
  140. package/dist/client/assets/src-Bi-5Nw9C.js +14 -0
  141. package/dist/client/assets/star-BZ-RtSFD.js +1 -0
  142. package/dist/client/assets/switch-CEJEmLe7.js +48 -0
  143. package/dist/client/assets/toastHelpers-CSQRKo4F.js +1 -0
  144. package/dist/client/assets/toggle-DVGrNHjq.js +1 -0
  145. package/dist/client/assets/toggle-group-CNDOfNhH.js +1 -0
  146. package/dist/client/assets/tokenModePresentation-CQNdC9CW.js +1 -0
  147. package/dist/client/assets/tooltip-B7Z4qomY.js +1 -0
  148. package/dist/client/assets/unplug-CRUwFNFw.js +1 -0
  149. package/dist/client/assets/useAppSidebarCollapsed-wq6czkNJ.js +1 -0
  150. package/dist/client/assets/useBaseUiId-OYaGjnkh.js +1 -0
  151. package/dist/client/assets/useLabelableId-VMc-yITe.js +1 -0
  152. package/dist/client/assets/useNavigate-DVi0rBlf.js +1 -0
  153. package/dist/client/assets/usePhoneThreadActions-CwwHikjB.js +1 -0
  154. package/dist/client/assets/usePopupViewport-BcSIK_ph.js +1 -0
  155. package/dist/client/assets/useScrollLock-BQf9VYJT.js +1 -0
  156. package/dist/client/assets/{useStatistics-DfLU9_Qu.js → useStatistics-DczKdEfy.js} +15 -15
  157. package/dist/client/assets/useTriggerFocusGuards-DjP-D0_a.js +1 -0
  158. package/dist/client/assets/useValueChanged-CRwCkFdy.js +1 -0
  159. package/dist/client/assets/user-round-DStbWN3z.js +1 -0
  160. package/dist/client/assets/{vscode-icons-Dgo7Sslf.js → vscode-icons-BihBo3tb.js} +1 -1
  161. package/dist/client/assets/{workspaceMetadataProjection-UiprkDbH.js → workspaceMetadataProjection-j3BGlVOB.js} +1 -1
  162. package/dist/client/assets/wrench-BBIgGxy9.js +1 -0
  163. package/dist/client/index.html +1 -1
  164. package/dist/{collectUint8StreamText-C_VNyArd.mjs → collectUint8StreamText-CE1Re5Ij.mjs} +41 -3
  165. package/dist/{collectUint8StreamText-DStwNTTK.cjs → collectUint8StreamText-whblCEfg.cjs} +52 -2
  166. package/dist/{makeManagedServerProvider-GZcpSLrW.mjs → makeManagedServerProvider-CwYhl_P-.mjs} +1 -1
  167. package/dist/{makeManagedServerProvider-VzxWN-04.cjs → makeManagedServerProvider-Dy2Ny9tk.cjs} +1 -1
  168. package/dist/resource-monitor/ryco-resource-monitor +0 -0
  169. package/dist/resource-monitor/ryco-resource-monitor.exe +0 -0
  170. package/dist/resource-monitor/win32-arm64/ryco-resource-monitor.exe +0 -0
  171. package/dist/resource-monitor/win32-x64/ryco-resource-monitor.exe +0 -0
  172. package/package.json +1 -1
  173. package/dist/client/assets/AccountSettings-DGvZzAqN.js +0 -1
  174. package/dist/client/assets/AiFocusSettings-D8wZfNES.js +0 -1
  175. package/dist/client/assets/AppearanceSettings-BFo6g6_s.js +0 -1
  176. package/dist/client/assets/BranchToolbar.logic-CmO2U1U7.js +0 -1
  177. package/dist/client/assets/BrowserPanel-r6is5C3e.js +0 -1
  178. package/dist/client/assets/ChatRightPanel-BewXBRFZ.js +0 -194
  179. package/dist/client/assets/ChatThreadRouteView-CC_6FmHd.js +0 -1
  180. package/dist/client/assets/CommandPaletteDialog-ftA_Xg2G.js +0 -1
  181. package/dist/client/assets/CompositeRoot-arlgwzfX.js +0 -1
  182. package/dist/client/assets/ComputerUseSettings-V-oMtddy.js +0 -1
  183. package/dist/client/assets/ConnectionsSettings-BrFvrRjz.js +0 -7
  184. package/dist/client/assets/ContextHandoffEndpointLabel-CPeU4K5A.js +0 -4
  185. package/dist/client/assets/DiagnosticsSettings-Dk3JaIOU.js +0 -2
  186. package/dist/client/assets/DialogHandle-00ZXxxpz.js +0 -1
  187. package/dist/client/assets/DialogPopup-mazVJKyB.js +0 -1
  188. package/dist/client/assets/DialogRoot-CWlzx19Z.js +0 -1
  189. package/dist/client/assets/DialogTitle-CKaEtTky.js +0 -1
  190. package/dist/client/assets/DialogTrigger-CiElTNmo.js +0 -1
  191. package/dist/client/assets/DialogViewport-a5beR5bY.js +0 -1
  192. package/dist/client/assets/DraftChatThreadRouteView-DMwnSfgh.js +0 -1
  193. package/dist/client/assets/FloatingPortalLite-DWdtHKob.js +0 -1
  194. package/dist/client/assets/GlassSurface-BqfxDYiR.js +0 -1
  195. package/dist/client/assets/HostedConnectionControls-BmJd89CC.js +0 -1
  196. package/dist/client/assets/HostedHubRoot-CRIiJ67A.js +0 -2
  197. package/dist/client/assets/HostedNativeAuthorizationRoute-DcksCt9n.js +0 -2
  198. package/dist/client/assets/HostedRelayTrustNotice-C9pl5h2a.js +0 -1
  199. package/dist/client/assets/IntegrationsSettingsPanel-BnfjyLrM.js +0 -2
  200. package/dist/client/assets/KeybindingsSettings-CkW7lzvz.js +0 -7
  201. package/dist/client/assets/LazyBrowserPanel-C6uMUmoV.js +0 -2
  202. package/dist/client/assets/McpServersSettings-BdXgS-Pm.js +0 -6
  203. package/dist/client/assets/MobileSheet-D19YdeQ9.js +0 -1
  204. package/dist/client/assets/NodeSecuritySettings-BfcBgtEg.js +0 -1
  205. package/dist/client/assets/OpinionatedPluginsSettings-YY54IT7P.js +0 -1
  206. package/dist/client/assets/PhoneGetAppInterstitial-9r6NwJP8.js +0 -1
  207. package/dist/client/assets/PhoneHome-DnEJp0bU.js +0 -1
  208. package/dist/client/assets/PhoneSettingsSurface-NKJrLCxU.js +0 -2
  209. package/dist/client/assets/ProviderModelPicker-CYGv-4fE.js +0 -1
  210. package/dist/client/assets/ProvidersSettingsPanel-DsXHij4h.js +0 -1
  211. package/dist/client/assets/QuitShortcutFeedback-BVyYaNtd.js +0 -1
  212. package/dist/client/assets/RedactedSensitiveText-D8j7kpow.js +0 -1
  213. package/dist/client/assets/RootAppShell-D7c8sbA0.js +0 -7
  214. package/dist/client/assets/Separator-Bn8l1oSK.js +0 -1
  215. package/dist/client/assets/SettingsDialog-BlPX1mT8.js +0 -2
  216. package/dist/client/assets/SettingsPanels-CeuvwIV_.js +0 -3
  217. package/dist/client/assets/SettingsPanels.editor-CLJJeKLI.js +0 -1
  218. package/dist/client/assets/SourceControlSettings-D-GeZ6PW.js +0 -1
  219. package/dist/client/assets/StatisticsPage-poomFDoQ.js +0 -1
  220. package/dist/client/assets/StatisticsPanel-DbGgCCpZ.js +0 -1
  221. package/dist/client/assets/StatisticsSettingsLink-Brc9--O7.js +0 -1
  222. package/dist/client/assets/ThreadWorkspacePanel-Shhau2BD.js +0 -2073
  223. package/dist/client/assets/activity-Dy-wOS-S.js +0 -1
  224. package/dist/client/assets/alert-4WZo8oMe.js +0 -1
  225. package/dist/client/assets/arrow-left-gLRAasih.js +0 -1
  226. package/dist/client/assets/arrow-right-CAK2t4QL.js +0 -1
  227. package/dist/client/assets/arrow-up-right-DP0hmMEB.js +0 -1
  228. package/dist/client/assets/authorization-K_UCP_xh.js +0 -1
  229. package/dist/client/assets/badge-CYDyJZRJ.js +0 -1
  230. package/dist/client/assets/bot-CCrx5oCt.js +0 -1
  231. package/dist/client/assets/button-QrCU0tNP.js +0 -1
  232. package/dist/client/assets/chart-column-BvK6lSzG.js +0 -1
  233. package/dist/client/assets/chevron-down-yka18-iP.js +0 -1
  234. package/dist/client/assets/chevron-right-CHyIXx5W.js +0 -1
  235. package/dist/client/assets/clamp-D0kAXd-u.js +0 -1
  236. package/dist/client/assets/clipboard-copy-DfdkWOiT.js +0 -1
  237. package/dist/client/assets/copy-riIPLkKV.js +0 -1
  238. package/dist/client/assets/data-list-CsiYTho5.js +0 -1
  239. package/dist/client/assets/download-B0lbSdq5.js +0 -1
  240. package/dist/client/assets/editorPreferences-Cf2Smgu1.js +0 -1
  241. package/dist/client/assets/empty-CHk0OiOB.js +0 -1
  242. package/dist/client/assets/group-DfFZdj79.js +0 -1
  243. package/dist/client/assets/hostedConnectionCoordinator-DZh1yVqz.js +0 -1
  244. package/dist/client/assets/input-BAC5Cd3b.js +0 -1
  245. package/dist/client/assets/kbd-CMUW8K7b.js +0 -1
  246. package/dist/client/assets/key-round-Cm6itp2V.js +0 -1
  247. package/dist/client/assets/layers-DoDpJao_.js +0 -1
  248. package/dist/client/assets/loader-circle-D0CNb5GI.js +0 -1
  249. package/dist/client/assets/log-out-BuoOiS45.js +0 -1
  250. package/dist/client/assets/main-CRk9p9SC.css +0 -2
  251. package/dist/client/assets/main-DaXSCt8g.js +0 -9
  252. package/dist/client/assets/monitor-Dyigmrl2.js +0 -1
  253. package/dist/client/assets/palette-kIM_geXk.js +0 -1
  254. package/dist/client/assets/play-Dh8XDMnw.js +0 -1
  255. package/dist/client/assets/primary-DjXNHNGV.js +0 -2
  256. package/dist/client/assets/providerDriverMeta-Cl-ADdmZ.js +0 -1
  257. package/dist/client/assets/providerModels-dpugJUmV.js +0 -1
  258. package/dist/client/assets/qr-code-CkI1p05P.js +0 -1
  259. package/dist/client/assets/radio-group-Hh0oQGyf.js +0 -2
  260. package/dist/client/assets/react-dom-x9LNwWQc.js +0 -1
  261. package/dist/client/assets/refresh-cw-MqmsC7V0.js +0 -1
  262. package/dist/client/assets/runtime-L56puJDA.js +0 -17
  263. package/dist/client/assets/save-BSB81i-r.js +0 -1
  264. package/dist/client/assets/scroll-area-DCGCzd6v.js +0 -1
  265. package/dist/client/assets/scrollEdges-DIzjkUJG.js +0 -1
  266. package/dist/client/assets/separator-YeH3P39x.js +0 -1
  267. package/dist/client/assets/settingsLayout-CmNqO2kB.js +0 -1
  268. package/dist/client/assets/settingsSections.logic-Bg960p_I.js +0 -1
  269. package/dist/client/assets/sheet-CTbjQ5Bv.js +0 -1
  270. package/dist/client/assets/shield-DlqCO-0N.js +0 -1
  271. package/dist/client/assets/shield-alert-BrZ-Rb8N.js +0 -1
  272. package/dist/client/assets/shield-check-DHxdM6te.js +0 -1
  273. package/dist/client/assets/sidebar-4cwEndEB.js +0 -1
  274. package/dist/client/assets/sidebarProjectFolders-C7WDwUYJ.js +0 -4
  275. package/dist/client/assets/sidebarStatusText-Cq_MMykN.js +0 -1
  276. package/dist/client/assets/skeleton-BlostfCS.js +0 -1
  277. package/dist/client/assets/smartphone-OaA-Xj_d.js +0 -1
  278. package/dist/client/assets/sparkles-BXwkPX2M.js +0 -1
  279. package/dist/client/assets/src-gDjuIvMO.js +0 -14
  280. package/dist/client/assets/star-BjaAYD-x.js +0 -1
  281. package/dist/client/assets/switch-COrEGDkz.js +0 -48
  282. package/dist/client/assets/toast-C_F1LeME.js +0 -1
  283. package/dist/client/assets/toggle-BPNEBXg_.js +0 -1
  284. package/dist/client/assets/toggle-group-BC1zJ9xi.js +0 -1
  285. package/dist/client/assets/tokenModePresentation-DUJ8DMTy.js +0 -1
  286. package/dist/client/assets/tooltip-iy3_osu5.js +0 -1
  287. package/dist/client/assets/triangle-alert-YXqtFxD6.js +0 -1
  288. package/dist/client/assets/unplug-e3z4rXgY.js +0 -1
  289. package/dist/client/assets/useAppSidebarCollapsed-mtvJ7qbW.js +0 -1
  290. package/dist/client/assets/useLabelableId-NJQsKdL6.js +0 -1
  291. package/dist/client/assets/useNavigate-2tVq4iZ2.js +0 -1
  292. package/dist/client/assets/usePhoneThreadActions-97AsVVIR.js +0 -1
  293. package/dist/client/assets/usePopupViewport-8OM2irPK.js +0 -1
  294. package/dist/client/assets/usePositioner-0Kb-C4al.js +0 -1
  295. package/dist/client/assets/useRenderElement-D0HVF5g_.js +0 -1
  296. package/dist/client/assets/useRouter-CcIDS3PN.js +0 -1
  297. package/dist/client/assets/useScrollLock-AUqaSAkf.js +0 -1
  298. package/dist/client/assets/useSwipeDismiss-CcW-GPO_.js +0 -1
  299. package/dist/client/assets/useTriggerFocusGuards-ChBvppef.js +0 -1
  300. package/dist/client/assets/useValueChanged-CThCTn4h.js +0 -1
  301. package/dist/client/assets/user-round-evbX_eto.js +0 -1
  302. package/dist/client/assets/utils-5-6TOrS1.js +0 -1
  303. package/dist/client/assets/visuallyHidden-BRaogTVF.js +0 -1
  304. package/dist/client/assets/wrench-mA--bcId.js +0 -1
  305. package/dist/client/assets/x-_SjFRYll.js +0 -1
package/dist/bin.cjs CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  const require_rolldown_runtime = require("./rolldown-runtime-LGfotAqq.cjs");
5
- const require_collectUint8StreamText = require("./collectUint8StreamText-DStwNTTK.cjs");
5
+ const require_collectUint8StreamText = require("./collectUint8StreamText-whblCEfg.cjs");
6
6
  const require_Metrics = require("./Metrics-Bcb9vCAe.cjs");
7
- const require_SourceControlProviderDiscoveryCatalog = require("./SourceControlProviderDiscoveryCatalog-DreaAH1H.cjs");
7
+ const require_SourceControlProviderDiscoveryCatalog = require("./SourceControlProviderDiscoveryCatalog-Dm_lhrhv.cjs");
8
8
  const require_sourceControl = require("./sourceControl-B0D1Op29.cjs");
9
9
  let _effect_platform_node_NodeRuntime = require("@effect/platform-node/NodeRuntime");
10
10
  _effect_platform_node_NodeRuntime = require_rolldown_runtime.__toESM(_effect_platform_node_NodeRuntime, 1);
@@ -1408,6 +1408,7 @@ function logPathHydrationWarning(message, error) {
1408
1408
  console.warn(`[server] ${message}`, error instanceof Error ? error.message : error ?? "");
1409
1409
  }
1410
1410
  function fixPath(options = {}) {
1411
+ if (options.inheritedFromDesktop) return;
1411
1412
  const platform = options.platform ?? process.platform;
1412
1413
  const env = options.env ?? process.env;
1413
1414
  const logWarning = options.logWarning ?? logPathHydrationWarning;
@@ -2494,9 +2495,14 @@ const INLINE_ATTACHMENT_EXTENSIONS = /* @__PURE__ */ new Set([
2494
2495
  ".webp"
2495
2496
  ]);
2496
2497
  const STATIC_CONTENT_TYPES = {
2498
+ ".avif": "image/avif",
2499
+ ".bmp": "image/bmp",
2497
2500
  ".css": "text/css; charset=utf-8",
2498
2501
  ".html": "text/html; charset=utf-8",
2502
+ ".gif": "image/gif",
2499
2503
  ".ico": "image/x-icon",
2504
+ ".jpeg": "image/jpeg",
2505
+ ".jpg": "image/jpeg",
2500
2506
  ".js": "text/javascript; charset=utf-8",
2501
2507
  ".json": "application/json; charset=utf-8",
2502
2508
  ".map": "application/json; charset=utf-8",
@@ -2504,7 +2510,8 @@ const STATIC_CONTENT_TYPES = {
2504
2510
  ".svg": "image/svg+xml; charset=utf-8",
2505
2511
  ".txt": "text/plain; charset=utf-8",
2506
2512
  ".wasm": "application/wasm",
2507
- ".webmanifest": "application/manifest+json; charset=utf-8"
2513
+ ".webmanifest": "application/manifest+json; charset=utf-8",
2514
+ ".webp": "image/webp"
2508
2515
  };
2509
2516
  const browserApiCorsLayer = effect_unstable_http.HttpRouter.cors({
2510
2517
  allowedMethods: [
@@ -2823,16 +2830,17 @@ const projectFaviconRouteLayer = effect_unstable_http.HttpRouter.add("GET", "/ap
2823
2830
  if (effect.Option.isNone(url)) return effect_unstable_http.HttpServerResponse.text("Bad Request", { status: 400 });
2824
2831
  const projectCwd = url.value.searchParams.get("cwd");
2825
2832
  if (!projectCwd) return effect_unstable_http.HttpServerResponse.text("Missing cwd parameter", { status: 400 });
2826
- const faviconFilePath = yield* (yield* ProjectFaviconResolver).resolvePath(projectCwd);
2827
- if (!faviconFilePath) return effect_unstable_http.HttpServerResponse.text(FALLBACK_PROJECT_FAVICON_SVG, {
2833
+ const favicon = yield* (yield* ProjectFaviconResolver).readIcon(projectCwd);
2834
+ if (!favicon) return effect_unstable_http.HttpServerResponse.text(FALLBACK_PROJECT_FAVICON_SVG, {
2828
2835
  status: 200,
2829
2836
  contentType: "image/svg+xml",
2830
2837
  headers: inlineImageResponseHeaders("fallback.svg")
2831
2838
  });
2832
- return yield* effect_unstable_http.HttpServerResponse.file(faviconFilePath, {
2839
+ return effect_unstable_http.HttpServerResponse.uint8Array(favicon.bytes, {
2833
2840
  status: 200,
2834
- headers: inlineImageResponseHeaders(faviconFilePath)
2835
- }).pipe(effect.Effect.catch(() => effect.Effect.succeed(effect_unstable_http.HttpServerResponse.text("Internal Server Error", { status: 500 }))));
2841
+ contentType: resolveStaticContentType(favicon.path, yield* effect.Path.Path),
2842
+ headers: inlineImageResponseHeaders(favicon.path)
2843
+ });
2836
2844
  }).pipe(effect.Effect.catchTag("AuthError", respondToAuthError)));
2837
2845
  const AvatarFormSchema = effect_Schema.Struct({ avatar: effect_unstable_http.Multipart.SingleFileSchema });
2838
2846
  const PROJECT_ID_PATTERN = /^[A-Za-z0-9_-]+$/;
@@ -6569,8 +6577,35 @@ const repairProjectionThreadSubagentNestingColumns = effect_Effect.fn("repairPro
6569
6577
  const repairContextHandoffRuntimeSessions = effect_Effect.fn("repairContextHandoffRuntimeSessions")(function* () {
6570
6578
  yield* _042_ContextHandoffRuntimeSessions_default;
6571
6579
  });
6580
+ const repairProjectionThreadSummaryState = effect_Effect.gen(function* () {
6581
+ const sql = yield* effect_unstable_sql_SqlClient.SqlClient;
6582
+ yield* sql`
6583
+ CREATE TABLE IF NOT EXISTS ryco_compatibility_repairs (
6584
+ repair_key TEXT PRIMARY KEY
6585
+ )
6586
+ `;
6587
+ yield* sql.withTransaction(effect_Effect.gen(function* () {
6588
+ const completed = yield* sql`
6589
+ SELECT repair_key FROM ryco_compatibility_repairs
6590
+ WHERE repair_key = 'projection-thread-summary-v1'
6591
+ `;
6592
+ const objects = yield* sql`
6593
+ SELECT name FROM sqlite_master WHERE name IN (
6594
+ 'projection_thread_user_input_requests',
6595
+ 'idx_projection_thread_user_input_requests_thread_pending',
6596
+ 'idx_projection_thread_proposed_plans_thread_turn_updated'
6597
+ )
6598
+ `;
6599
+ if (completed.length > 0 && objects.length === 3) return;
6600
+ yield* _044_ProjectionThreadSummaryState_default;
6601
+ yield* sql`
6602
+ INSERT OR IGNORE INTO ryco_compatibility_repairs (repair_key)
6603
+ VALUES ('projection-thread-summary-v1')
6604
+ `;
6605
+ }));
6606
+ });
6572
6607
  const repairProjectionThreadReadModelMigrations = effect_Effect.fn("repairProjectionThreadReadModelMigrations")(function* (toMigrationInclusive) {
6573
- if (toMigrationInclusive >= 44) yield* _044_ProjectionThreadSummaryState_default;
6608
+ if (toMigrationInclusive >= 44) yield* repairProjectionThreadSummaryState;
6574
6609
  if (toMigrationInclusive >= 45) yield* _045_ProjectionThreadHistoryPaginationIndexes_default;
6575
6610
  if (toMigrationInclusive >= 46) yield* _046_ProjectionThreadMessageDispatchMode_default;
6576
6611
  if (toMigrationInclusive >= 47) yield* _047_ProjectionThreadsGoal_default;
@@ -13500,26 +13535,26 @@ const make$13 = effect.Effect.fn("makeSourceControlProviderRegistry")(function*
13500
13535
  const azureDevOpsCli = yield* AzureDevOpsCli;
13501
13536
  const fileSystem = yield* effect.FileSystem.FileSystem;
13502
13537
  const github = yield* makeLazyProvider("github", effect.Effect.tryPromise({
13503
- try: () => Promise.resolve().then(() => require("./GitHubSourceControlProvider-8hsv_kCE.cjs")),
13538
+ try: () => Promise.resolve().then(() => require("./GitHubSourceControlProvider-CItCpOcC.cjs")),
13504
13539
  catch: (cause) => providerLoadError("github", cause)
13505
13540
  }).pipe(effect.Effect.flatMap((module) => module.make()), effect.Effect.provideService(GitHubCli, githubCli), effect.Effect.provideService(effect.FileSystem.FileSystem, fileSystem)));
13506
13541
  const gitlab = yield* makeLazyProvider("gitlab", effect.Effect.tryPromise({
13507
- try: () => Promise.resolve().then(() => require("./GitLabSourceControlProvider-B0ZbF9Zx.cjs")),
13542
+ try: () => Promise.resolve().then(() => require("./GitLabSourceControlProvider-CMce22nU.cjs")),
13508
13543
  catch: (cause) => providerLoadError("gitlab", cause)
13509
13544
  }).pipe(effect.Effect.flatMap((module) => module.make()), effect.Effect.provideService(GitLabCli, gitlabCli)));
13510
13545
  const bitbucket = yield* makeLazyProvider("bitbucket", effect.Effect.tryPromise({
13511
- try: () => Promise.resolve().then(() => require("./BitbucketSourceControlProvider-BzhsQwH-.cjs")),
13546
+ try: () => Promise.resolve().then(() => require("./BitbucketSourceControlProvider-CD8IvXQK.cjs")),
13512
13547
  catch: (cause) => providerLoadError("bitbucket", cause)
13513
13548
  }).pipe(effect.Effect.flatMap((module) => module.make()), effect.Effect.provideService(BitbucketApi, bitbucketApi)), {
13514
13549
  searchRepositories: true,
13515
13550
  cloneAuthentication: true
13516
13551
  });
13517
13552
  const forgejo = yield* makeLazyProvider("forgejo", effect.Effect.tryPromise({
13518
- try: () => Promise.resolve().then(() => require("./ForgejoSourceControlProvider-Dh6DOoc8.cjs")),
13553
+ try: () => Promise.resolve().then(() => require("./ForgejoSourceControlProvider-JgiyrMqp.cjs")),
13519
13554
  catch: (cause) => providerLoadError("forgejo", cause)
13520
13555
  }).pipe(effect.Effect.flatMap((module) => module.make()), effect.Effect.provideService(ForgejoApi, forgejoApi)));
13521
13556
  const azureDevOps = yield* makeLazyProvider("azure-devops", effect.Effect.tryPromise({
13522
- try: () => Promise.resolve().then(() => require("./AzureDevOpsSourceControlProvider-CrvgKNf2.cjs")),
13557
+ try: () => Promise.resolve().then(() => require("./AzureDevOpsSourceControlProvider-COmd21c-.cjs")),
13523
13558
  catch: (cause) => providerLoadError("azure-devops", cause)
13524
13559
  }).pipe(effect.Effect.flatMap((module) => module.make()), effect.Effect.provideService(AzureDevOpsCli, azureDevOpsCli)));
13525
13560
  const bitbucketDiscovery = require_SourceControlProviderDiscoveryCatalog.makeBitbucketDiscovery(bitbucketApi);
@@ -34008,7 +34043,7 @@ const BUILT_IN_DRIVERS = [
34008
34043
  configSchema: require_collectUint8StreamText.CodexSettings,
34009
34044
  defaultConfig: () => effect.Schema.decodeSync(require_collectUint8StreamText.CodexSettings)({}),
34010
34045
  create: (input) => effect.Effect.tryPromise({
34011
- try: () => Promise.resolve().then(() => require("./CodexDriver-CR0S17Lb.cjs")),
34046
+ try: () => Promise.resolve().then(() => require("./CodexDriver-BzR8gA8w.cjs")),
34012
34047
  catch: (cause) => driverImportError(codexDriverKind, input, cause)
34013
34048
  }).pipe(effect.Effect.flatMap(({ CodexDriver }) => CodexDriver.create(input)))
34014
34049
  },
@@ -34022,7 +34057,7 @@ const BUILT_IN_DRIVERS = [
34022
34057
  configSchema: require_collectUint8StreamText.ClaudeSettings,
34023
34058
  defaultConfig: () => effect.Schema.decodeSync(require_collectUint8StreamText.ClaudeSettings)({}),
34024
34059
  create: (input) => effect.Effect.tryPromise({
34025
- try: () => Promise.resolve().then(() => require("./ClaudeDriver-B7mbf51W.cjs")),
34060
+ try: () => Promise.resolve().then(() => require("./ClaudeDriver-Dry5uJfX.cjs")),
34026
34061
  catch: (cause) => driverImportError(claudeDriverKind, input, cause)
34027
34062
  }).pipe(effect.Effect.flatMap(({ ClaudeDriver }) => ClaudeDriver.create(input)))
34028
34063
  },
@@ -34036,7 +34071,7 @@ const BUILT_IN_DRIVERS = [
34036
34071
  configSchema: require_collectUint8StreamText.CopilotSettings,
34037
34072
  defaultConfig: () => effect.Schema.decodeSync(require_collectUint8StreamText.CopilotSettings)({}),
34038
34073
  create: (input) => effect.Effect.tryPromise({
34039
- try: () => Promise.resolve().then(() => require("./CopilotDriver-IBd27Ji2.cjs")),
34074
+ try: () => Promise.resolve().then(() => require("./CopilotDriver-rLcA8PSN.cjs")),
34040
34075
  catch: (cause) => driverImportError(copilotDriverKind, input, cause)
34041
34076
  }).pipe(effect.Effect.flatMap(({ CopilotDriver }) => CopilotDriver.create(input)))
34042
34077
  },
@@ -34050,7 +34085,7 @@ const BUILT_IN_DRIVERS = [
34050
34085
  configSchema: require_collectUint8StreamText.CursorSettings,
34051
34086
  defaultConfig: () => effect.Schema.decodeSync(require_collectUint8StreamText.CursorSettings)({}),
34052
34087
  create: (input) => effect.Effect.tryPromise({
34053
- try: () => Promise.resolve().then(() => require("./CursorDriver-C4Enoe9N.cjs")),
34088
+ try: () => Promise.resolve().then(() => require("./CursorDriver-C3s-8s9F.cjs")),
34054
34089
  catch: (cause) => driverImportError(cursorDriverKind, input, cause)
34055
34090
  }).pipe(effect.Effect.flatMap(({ CursorDriver }) => CursorDriver.create(input)))
34056
34091
  },
@@ -34064,7 +34099,7 @@ const BUILT_IN_DRIVERS = [
34064
34099
  configSchema: require_collectUint8StreamText.GrokSettings,
34065
34100
  defaultConfig: () => effect.Schema.decodeSync(require_collectUint8StreamText.GrokSettings)({}),
34066
34101
  create: (input) => effect.Effect.tryPromise({
34067
- try: () => Promise.resolve().then(() => require("./GrokDriver-RyyFeh_q.cjs")),
34102
+ try: () => Promise.resolve().then(() => require("./GrokDriver-D0jraOC_.cjs")),
34068
34103
  catch: (cause) => driverImportError(grokDriverKind, input, cause)
34069
34104
  }).pipe(effect.Effect.flatMap(({ GrokDriver }) => GrokDriver.create(input)))
34070
34105
  },
@@ -34078,7 +34113,7 @@ const BUILT_IN_DRIVERS = [
34078
34113
  configSchema: require_collectUint8StreamText.OpenCodeSettings,
34079
34114
  defaultConfig: () => effect.Schema.decodeSync(require_collectUint8StreamText.OpenCodeSettings)({}),
34080
34115
  create: (input) => effect.Effect.tryPromise({
34081
- try: () => Promise.resolve().then(() => require("./OpenCodeDriver-CDcvPT9v.cjs")),
34116
+ try: () => Promise.resolve().then(() => require("./OpenCodeDriver-DxGpgtDS.cjs")),
34082
34117
  catch: (cause) => driverImportError(openCodeDriverKind, input, cause)
34083
34118
  }).pipe(effect.Effect.flatMap(({ OpenCodeDriver }) => OpenCodeDriver.create(input)))
34084
34119
  }
@@ -34793,7 +34828,7 @@ const scopedSafeTeardown = (label) => (effect$28) => effect.Effect.gen(function*
34793
34828
  });
34794
34829
  //#endregion
34795
34830
  //#region package.json
34796
- var version$1 = "0.1.23";
34831
+ var version$1 = "0.1.25";
34797
34832
  //#endregion
34798
34833
  //#region src/provider/Layers/CodexProvider.ts
34799
34834
  const PROVIDER_PROBE_TIMEOUT_MS = 8e3;
@@ -43378,6 +43413,36 @@ function resolveWorktreeCheckoutPath(input) {
43378
43413
  return resolveAppManagedWorktreeCheckoutPath(input.appWorktreesRoot, input.projectId, input.branchName);
43379
43414
  }
43380
43415
  //#endregion
43416
+ //#region src/persistence/Services/ProjectionProjects.ts
43417
+ /**
43418
+ * ProjectionProjectRepository - Projection repository interface for projects.
43419
+ *
43420
+ * Owns persistence operations for project rows in the orchestration projection
43421
+ * read model.
43422
+ *
43423
+ * @module ProjectionProjectRepository
43424
+ */
43425
+ const ProjectionProject = effect.Schema.Struct({
43426
+ projectId: require_collectUint8StreamText.ProjectId,
43427
+ title: effect.Schema.String,
43428
+ workspaceRoot: effect.Schema.String,
43429
+ projectMetadataDir: require_collectUint8StreamText.ProjectMetadataDir,
43430
+ defaultModelSelection: effect.Schema.NullOr(require_collectUint8StreamText.ModelSelection),
43431
+ customSystemPrompt: effect.Schema.optional(effect.Schema.NullOr(effect.Schema.String)),
43432
+ customAvatarContentHash: effect.Schema.NullOr(effect.Schema.String),
43433
+ preferredRemoteName: effect.Schema.NullOr(effect.Schema.String),
43434
+ scripts: effect.Schema.Array(require_collectUint8StreamText.ProjectScript),
43435
+ createdAt: require_collectUint8StreamText.IsoDateTime,
43436
+ updatedAt: require_collectUint8StreamText.IsoDateTime,
43437
+ deletedAt: effect.Schema.NullOr(require_collectUint8StreamText.IsoDateTime)
43438
+ });
43439
+ const GetProjectionProjectInput = effect.Schema.Struct({ projectId: require_collectUint8StreamText.ProjectId });
43440
+ const DeleteProjectionProjectInput = effect.Schema.Struct({ projectId: require_collectUint8StreamText.ProjectId });
43441
+ /**
43442
+ * ProjectionProjectRepository - Service tag for project projection persistence.
43443
+ */
43444
+ var ProjectionProjectRepository = class extends effect.Context.Service()("ryco/persistence/Services/ProjectionProjects/ProjectionProjectRepository") {};
43445
+ //#endregion
43381
43446
  //#region src/persistence/Services/ProjectionWorktrees.ts
43382
43447
  /**
43383
43448
  * ProjectionWorktreeRepository - Projection repository interface for worktrees.
@@ -44674,6 +44739,7 @@ const RPC_ACCESS_POLICY = {
44674
44739
  [require_collectUint8StreamText.WS_METHODS.projectsList]: "viewer",
44675
44740
  [require_collectUint8StreamText.WS_METHODS.projectsListEntries]: "operator",
44676
44741
  [require_collectUint8StreamText.WS_METHODS.projectsReadFile]: "operator",
44742
+ [require_collectUint8StreamText.WS_METHODS.projectsReadIcon]: "viewer",
44677
44743
  [require_collectUint8StreamText.WS_METHODS.projectsReadFileBinary]: "operator",
44678
44744
  [require_collectUint8StreamText.WS_METHODS.projectsRemove]: "operator",
44679
44745
  [require_collectUint8StreamText.WS_METHODS.projectsSearchEntries]: "operator",
@@ -46589,6 +46655,9 @@ const makeWsRpcContext = (principal) => effect.Effect.gen(function* () {
46589
46655
  openCodeMcp
46590
46656
  ]);
46591
46657
  const startup = yield* ServerRuntimeStartup;
46658
+ const projectionProjects = yield* effect.Effect.serviceOption(ProjectionProjectRepository);
46659
+ const projectFaviconResolver = yield* effect.Effect.serviceOption(ProjectFaviconResolver);
46660
+ const projectAvatarStore = yield* effect.Effect.serviceOption(ProjectAvatarStore);
46592
46661
  const workspaceEntries = yield* WorkspaceEntries;
46593
46662
  const workspaceFileSystem = yield* WorkspaceFileSystem;
46594
46663
  const workspaceAccessPolicy = yield* WorkspaceAccessPolicy;
@@ -46964,6 +47033,9 @@ const makeWsRpcContext = (principal) => effect.Effect.gen(function* () {
46964
47033
  lifecycleEvents,
46965
47034
  serverSettings,
46966
47035
  mcpRegistry,
47036
+ projectionProjects,
47037
+ projectFaviconResolver,
47038
+ projectAvatarStore,
46967
47039
  workspaceEntries,
46968
47040
  workspaceFileSystem,
46969
47041
  sourceControlDiscovery,
@@ -48111,10 +48183,51 @@ const makeTerminalHandlers = (ctx) => {
48111
48183
  });
48112
48184
  };
48113
48185
  //#endregion
48186
+ //#region src/project/readProjectIcon.ts
48187
+ const iconTypes = {
48188
+ ".png": "image/png",
48189
+ ".jpg": "image/jpeg",
48190
+ ".jpeg": "image/jpeg",
48191
+ ".webp": "image/webp",
48192
+ ".svg": "image/svg+xml",
48193
+ ".ico": "image/x-icon"
48194
+ };
48195
+ /** Resolve only the registered project's artwork; callers cannot supply filesystem paths. */
48196
+ function readProjectIcon(project, services) {
48197
+ return effect.Effect.gen(function* () {
48198
+ if (project.customAvatarContentHash && services.avatar) {
48199
+ const avatar = yield* services.avatar.read(project.id);
48200
+ if (avatar && avatar.bytes.length <= 524288) return {
48201
+ mimeType: "image/png",
48202
+ dataBase64: avatar.bytes.toString("base64")
48203
+ };
48204
+ }
48205
+ const icon = services.favicon ? yield* services.favicon.readIcon(project.workspaceRoot) : null;
48206
+ if (!icon || icon.bytes.length > 524288) return null;
48207
+ const mimeType = iconTypes[(0, node_path.extname)(icon.path).toLowerCase()];
48208
+ return mimeType ? {
48209
+ mimeType,
48210
+ dataBase64: Buffer.from(icon.bytes).toString("base64")
48211
+ } : null;
48212
+ });
48213
+ }
48214
+ //#endregion
48114
48215
  //#region src/ws/projectRpc.ts
48115
48216
  const makeProjectHandlers = (ctx) => {
48116
48217
  const { ownerEffect, workspaceEntries, workspaceFileSystem, open } = ctx;
48117
48218
  return defineWsHandlers({
48219
+ [require_collectUint8StreamText.WS_METHODS.projectsReadIcon]: (input) => ctx.withAccess("viewer", require_collectUint8StreamText.WS_METHODS.projectsReadIcon, effect.Effect.gen(function* () {
48220
+ if (effect.Option.isNone(ctx.projectionProjects)) return null;
48221
+ const project = yield* ctx.projectionProjects.value.getById(input).pipe(effect.Effect.mapError(() => new require_collectUint8StreamText.ProjectReadIconError({ message: "Could not load project artwork." })));
48222
+ if (effect.Option.isNone(project) || project.value.deletedAt !== null) return null;
48223
+ return yield* readProjectIcon({
48224
+ ...project.value,
48225
+ id: project.value.projectId
48226
+ }, {
48227
+ favicon: effect.Option.getOrNull(ctx.projectFaviconResolver),
48228
+ avatar: effect.Option.getOrNull(ctx.projectAvatarStore)
48229
+ });
48230
+ })),
48118
48231
  [require_collectUint8StreamText.WS_METHODS.projectsSearchEntries]: (input) => observeRpcEffect(require_collectUint8StreamText.WS_METHODS.projectsSearchEntries, ownerEffect(require_collectUint8StreamText.WS_METHODS.projectsSearchEntries, workspaceEntries.search(input).pipe(effect.Effect.mapError((cause) => new require_collectUint8StreamText.ProjectSearchEntriesError({
48119
48232
  message: `Failed to search workspace entries: ${cause.detail}`,
48120
48233
  cause
@@ -49264,7 +49377,7 @@ async function readResourceTelemetryHistory(input) {
49264
49377
  //#endregion
49265
49378
  //#region src/diagnostics/ProcessDiagnostics.ts
49266
49379
  const QUERY_TIMEOUT_MS = 3e3;
49267
- const MAX_OUTPUT_BYTES = 4194304;
49380
+ const MAX_OUTPUT_BYTES$1 = 4194304;
49268
49381
  const MAX_PROCESSES = 2e4;
49269
49382
  /** Parse fixed numeric columns; never capture command-line arguments. */
49270
49383
  function parseProcessTable(output) {
@@ -49345,7 +49458,7 @@ async function queryProcessTable(fresh = false) {
49345
49458
  (0, node_child_process.execFile)("/bin/ps", ["-axo", "pid=,ppid=,lstart=,pcpu=,rss=,stat=,etime=,comm="], {
49346
49459
  encoding: "utf8",
49347
49460
  timeout: QUERY_TIMEOUT_MS,
49348
- maxBuffer: MAX_OUTPUT_BYTES,
49461
+ maxBuffer: MAX_OUTPUT_BYTES$1,
49349
49462
  env: {
49350
49463
  ...process.env,
49351
49464
  LC_ALL: "C"
@@ -69823,7 +69936,7 @@ function makeNodeNativeClaimService(options) {
69823
69936
  claim: input.claim,
69824
69937
  requireCurrent: true
69825
69938
  });
69826
- if (input.result.status !== "claimed" || input.result.node.environmentId !== input.claim.environmentId || input.result.node.fingerprint !== input.claim.nodeFingerprint || input.result.node.label !== expectedLabel || input.result.node.effectiveRole !== "owner") return claimError("native_node_claim_conflict");
69939
+ if (input.result.status !== "claimed" || input.result.node.environmentId !== input.claim.environmentId || input.result.node.fingerprint !== input.claim.nodeFingerprint || input.result.node.label !== expectedLabel && !(validated.descriptor.state === "active" && input.result.disposition === "reconnected") || input.result.node.effectiveRole !== "owner") return claimError("native_node_claim_conflict");
69827
69940
  const active = {
69828
69941
  hubOrigin: validated.descriptor.hubOrigin,
69829
69942
  nodeId: input.result.node.id,
@@ -73603,6 +73716,8 @@ var RelayConnectionSession = class {
73603
73716
  #frameDeliveryActive = false;
73604
73717
  #settled = false;
73605
73718
  #closed = false;
73719
+ #authenticationStarted = false;
73720
+ #rejectAuthentication;
73606
73721
  #listeners;
73607
73722
  constructor(options) {
73608
73723
  this.#identity = options.identity;
@@ -73618,8 +73733,21 @@ var RelayConnectionSession = class {
73618
73733
  get ready() {
73619
73734
  return this.#ready;
73620
73735
  }
73621
- async authenticate() {
73622
- if (this.#socket !== void 0) throw new RelayConnectionError("internal_error");
73736
+ authenticate() {
73737
+ if (this.#authenticationStarted || this.#closed) return Promise.reject(new RelayConnectionError("internal_error"));
73738
+ this.#authenticationStarted = true;
73739
+ return new Promise((resolve, reject) => {
73740
+ this.#rejectAuthentication = reject;
73741
+ this.#authenticate().then((ready) => {
73742
+ this.#rejectAuthentication = void 0;
73743
+ resolve(ready);
73744
+ }, (error) => {
73745
+ this.#rejectAuthentication = void 0;
73746
+ reject(error);
73747
+ });
73748
+ });
73749
+ }
73750
+ async #authenticate() {
73623
73751
  let auth;
73624
73752
  try {
73625
73753
  auth = await this.#identity.createRelayAuthenticationFrame(this.#hubOrigin, {
@@ -73668,6 +73796,7 @@ var RelayConnectionSession = class {
73668
73796
  };
73669
73797
  const onOpen = () => {
73670
73798
  if (this.#closed) return;
73799
+ if (this.#timer !== void 0) this.#scheduler.clearTimeout(this.#timer);
73671
73800
  try {
73672
73801
  socket.send(authBytes);
73673
73802
  } catch {
@@ -73741,6 +73870,7 @@ var RelayConnectionSession = class {
73741
73870
  socket.addEventListener("message", onMessage);
73742
73871
  socket.addEventListener("error", onError);
73743
73872
  socket.addEventListener("close", onClose);
73873
+ this.#timer = this.#scheduler.setTimeout(() => fail(new RelayConnectionError("network")), require_collectUint8StreamText.RELAY_AUTHENTICATION_DEADLINE_MS);
73744
73874
  });
73745
73875
  }
73746
73876
  /**
@@ -73772,6 +73902,11 @@ var RelayConnectionSession = class {
73772
73902
  close() {
73773
73903
  if (this.#closed) return;
73774
73904
  this.#closed = true;
73905
+ if (!this.#settled) {
73906
+ this.#settled = true;
73907
+ this.#rejectAuthentication?.(new RelayConnectionError("network"));
73908
+ }
73909
+ this.#rejectAuthentication = void 0;
73775
73910
  for (const frame of this.#pendingPostReadyFrames) clearRelayFrameBytes(frame);
73776
73911
  this.#pendingPostReadyFrames = [];
73777
73912
  this.#clearPendingAuthentication();
@@ -89730,83 +89865,173 @@ const ProviderRegistryLive = effect.Layer.effect(ProviderRegistry, effect.Effect
89730
89865
  };
89731
89866
  }));
89732
89867
  //#endregion
89733
- //#region src/project/Layers/ProjectFaviconResolver.ts
89734
- const FAVICON_CANDIDATES = [
89735
- "favicon.svg",
89736
- "favicon.ico",
89737
- "favicon.png",
89738
- "public/favicon.svg",
89739
- "public/favicon.ico",
89740
- "public/favicon.png",
89741
- "app/favicon.ico",
89742
- "app/favicon.png",
89743
- "app/icon.svg",
89744
- "app/icon.png",
89745
- "app/icon.ico",
89746
- "src/favicon.ico",
89747
- "src/favicon.svg",
89748
- "src/app/favicon.ico",
89749
- "src/app/icon.svg",
89750
- "src/app/icon.png",
89751
- "assets/icon.svg",
89752
- "assets/icon.png",
89753
- "assets/logo.svg",
89754
- "assets/logo.png",
89755
- ".idea/icon.svg"
89756
- ];
89757
- const ICON_SOURCE_FILES = [
89758
- "index.html",
89759
- "public/index.html",
89760
- "app/routes/__root.tsx",
89761
- "src/routes/__root.tsx",
89762
- "app/root.tsx",
89763
- "src/root.tsx",
89764
- "src/index.html"
89765
- ];
89766
- const LINK_ICON_HTML_RE = /<link\b(?=[^>]*\brel=["'](?:icon|shortcut icon)["'])(?=[^>]*\bhref=["']([^"'?]+))[^>]*>/i;
89767
- const LINK_ICON_OBJ_RE = /(?=[^}]*\brel\s*:\s*["'](?:icon|shortcut icon)["'])(?=[^}]*\bhref\s*:\s*["']([^"'?]+))[^}]*/i;
89768
- function extractIconHref(source) {
89769
- const htmlMatch = source.match(LINK_ICON_HTML_RE);
89770
- if (htmlMatch?.[1]) return htmlMatch[1];
89771
- const objMatch = source.match(LINK_ICON_OBJ_RE);
89772
- if (objMatch?.[1]) return objMatch[1];
89773
- return null;
89774
- }
89775
- const makeProjectFaviconResolver = effect.Effect.gen(function* () {
89776
- const fileSystem = yield* effect.FileSystem.FileSystem;
89777
- const path = yield* effect.Path.Path;
89778
- const resolveIconHref = (projectCwd, href) => {
89779
- const clean = href.replace(/^\//, "");
89780
- return [path.join(projectCwd, "public", clean), path.join(projectCwd, clean)];
89781
- };
89782
- const isPathWithinProject = (projectCwd, candidatePath) => {
89783
- const relative = path.relative(path.resolve(projectCwd), path.resolve(candidatePath));
89784
- return relative === "" || !relative.startsWith("..") && !path.isAbsolute(relative);
89785
- };
89786
- const findExistingFile = effect.Effect.fn("ProjectFaviconResolver.findExistingFile")(function* (projectCwd, candidates) {
89868
+ //#region src/project/projectFaviconWorker.ts
89869
+ /**
89870
+ * Serialized into a short-lived Node/Bun child. Keep this function self-contained:
89871
+ * opening a cloud-backed file can block in the kernel even after an async read
89872
+ * is cancelled. A separate process keeps optional icons out of the node's shared
89873
+ * filesystem/DNS worker pool, and lets the parent terminate a stalled read.
89874
+ */
89875
+ function projectFaviconWorkerMain() {
89876
+ const fs = process.getBuiltinModule("node:fs");
89877
+ const path = process.getBuiltinModule("node:path");
89878
+ const iconLimit = 524288;
89879
+ const sourceLimit = 262144;
89880
+ const candidates = [
89881
+ "favicon.svg",
89882
+ "favicon.ico",
89883
+ "favicon.png",
89884
+ "public/favicon.svg",
89885
+ "public/favicon.ico",
89886
+ "public/favicon.png",
89887
+ "app/favicon.ico",
89888
+ "app/favicon.png",
89889
+ "app/icon.svg",
89890
+ "app/icon.png",
89891
+ "app/icon.ico",
89892
+ "src/favicon.ico",
89893
+ "src/favicon.svg",
89894
+ "src/app/favicon.ico",
89895
+ "src/app/icon.svg",
89896
+ "src/app/icon.png",
89897
+ "assets/icon.svg",
89898
+ "assets/icon.png",
89899
+ "assets/logo.svg",
89900
+ "assets/logo.png",
89901
+ ".idea/icon.svg"
89902
+ ];
89903
+ const sources = [
89904
+ "index.html",
89905
+ "public/index.html",
89906
+ "app/routes/__root.tsx",
89907
+ "src/routes/__root.tsx",
89908
+ "app/root.tsx",
89909
+ "src/root.tsx",
89910
+ "src/index.html"
89911
+ ];
89912
+ try {
89913
+ const root = fs.realpathSync(process.argv[1]);
89914
+ const read = (relative, limit) => {
89915
+ let fd;
89916
+ try {
89917
+ const filename = fs.realpathSync(path.resolve(root, relative));
89918
+ const within = path.relative(root, filename);
89919
+ if (within === ".." || within.startsWith(`..${path.sep}`) || path.isAbsolute(within)) return null;
89920
+ fd = fs.openSync(filename, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);
89921
+ const stats = fs.fstatSync(fd);
89922
+ if (!stats.isFile() || stats.size > limit) return null;
89923
+ const bytes = Buffer.alloc(limit + 1);
89924
+ let length = 0;
89925
+ while (length < bytes.length) {
89926
+ const count = fs.readSync(fd, bytes, length, bytes.length - length, null);
89927
+ if (count === 0) break;
89928
+ length += count;
89929
+ }
89930
+ return length > limit ? null : {
89931
+ path: filename,
89932
+ bytes: bytes.subarray(0, length)
89933
+ };
89934
+ } catch {
89935
+ return null;
89936
+ } finally {
89937
+ if (fd !== void 0) fs.closeSync(fd);
89938
+ }
89939
+ };
89940
+ const send = (icon) => {
89941
+ process.stdout.write(JSON.stringify({
89942
+ path: icon.path,
89943
+ base64: icon.bytes.toString("base64")
89944
+ }));
89945
+ };
89787
89946
  for (const candidate of candidates) {
89788
- if (!isPathWithinProject(projectCwd, candidate)) continue;
89789
- if ((yield* fileSystem.stat(candidate).pipe(effect.Effect.catch(() => effect.Effect.succeed(null))))?.type === "File") return candidate;
89947
+ const icon = read(candidate, iconLimit);
89948
+ if (icon) {
89949
+ send(icon);
89950
+ return;
89951
+ }
89790
89952
  }
89791
- return null;
89792
- });
89793
- return { resolvePath: effect.Effect.fn("ProjectFaviconResolver.resolvePath")(function* (cwd) {
89794
- for (const candidate of FAVICON_CANDIDATES) {
89795
- const resolved = path.join(cwd, candidate);
89796
- const existing = yield* findExistingFile(cwd, [resolved]);
89797
- if (existing) return existing;
89798
- }
89799
- for (const sourceFile of ICON_SOURCE_FILES) {
89800
- const sourcePath = path.join(cwd, sourceFile);
89801
- const source = yield* fileSystem.readFileString(sourcePath).pipe(effect.Effect.catch(() => effect.Effect.succeed(null)));
89802
- if (!source) continue;
89803
- const href = extractIconHref(source);
89953
+ for (const source of sources) {
89954
+ const text = read(source, sourceLimit)?.bytes.toString("utf8");
89955
+ if (!text) continue;
89956
+ const href = text.match(/<link\b(?=[^>]*\brel=["'](?:icon|shortcut icon)["'])(?=[^>]*\bhref=["']([^"'?]+))[^>]*>/i)?.[1] ?? text.match(/(?=[^}]*\brel\s*:\s*["'](?:icon|shortcut icon)["'])(?=[^}]*\bhref\s*:\s*["']([^"'?]+))[^}]*/i)?.[1];
89804
89957
  if (!href) continue;
89805
- const existing = yield* findExistingFile(cwd, resolveIconHref(cwd, href));
89806
- if (existing) return existing;
89958
+ const clean = href.replace(/^\//, "");
89959
+ for (const candidate of [path.join("public", clean), clean]) {
89960
+ const icon = read(candidate, iconLimit);
89961
+ if (icon) {
89962
+ send(icon);
89963
+ return;
89964
+ }
89965
+ }
89807
89966
  }
89808
- return null;
89809
- }) };
89967
+ } catch {}
89968
+ process.stdout.write("null");
89969
+ }
89970
+ const MAX_OUTPUT_BYTES = 786432;
89971
+ const WORKER_SCRIPT = `(${projectFaviconWorkerMain.toString()})()`;
89972
+ function readProjectFavicon(cwd, options = {}) {
89973
+ return new Promise((resolve) => {
89974
+ if (options.signal?.aborted) {
89975
+ resolve(null);
89976
+ return;
89977
+ }
89978
+ let child;
89979
+ const abort = () => {
89980
+ child?.kill("SIGKILL");
89981
+ };
89982
+ const cleanup = () => options.signal?.removeEventListener("abort", abort);
89983
+ options.signal?.addEventListener("abort", abort, { once: true });
89984
+ try {
89985
+ child = (options.execFile ?? node_child_process.execFile)(process.execPath, [
89986
+ "--eval",
89987
+ WORKER_SCRIPT,
89988
+ "--",
89989
+ cwd
89990
+ ], {
89991
+ env: {
89992
+ ...process.env,
89993
+ ELECTRON_RUN_AS_NODE: "1",
89994
+ NODE_OPTIONS: void 0,
89995
+ NODE_PATH: void 0
89996
+ },
89997
+ encoding: "utf8",
89998
+ timeout: options.timeoutMs ?? 1500,
89999
+ killSignal: "SIGKILL",
90000
+ maxBuffer: MAX_OUTPUT_BYTES,
90001
+ windowsHide: true
90002
+ }, (error, stdout) => {
90003
+ cleanup();
90004
+ if (error) {
90005
+ resolve(null);
90006
+ return;
90007
+ }
90008
+ try {
90009
+ const result = JSON.parse(stdout);
90010
+ if (typeof result !== "object" || result === null || !("path" in result) || !("base64" in result) || typeof result.path !== "string" || typeof result.base64 !== "string") {
90011
+ resolve(null);
90012
+ return;
90013
+ }
90014
+ const bytes = Buffer.from(result.base64, "base64");
90015
+ resolve(bytes.length <= 524288 ? {
90016
+ path: result.path,
90017
+ bytes
90018
+ } : null);
90019
+ } catch {
90020
+ resolve(null);
90021
+ }
90022
+ });
90023
+ if (options.signal?.aborted) abort();
90024
+ } catch {
90025
+ cleanup();
90026
+ resolve(null);
90027
+ }
90028
+ });
90029
+ }
90030
+ //#endregion
90031
+ //#region src/project/Layers/ProjectFaviconResolver.ts
90032
+ const makeProjectFaviconResolver = effect.Effect.gen(function* () {
90033
+ const workers = yield* effect_Semaphore.make(2);
90034
+ return { readIcon: (cwd) => workers.withPermit(effect.Effect.promise((signal) => readProjectFavicon(cwd, { signal }))).pipe(effect.Effect.timeout("5 seconds"), effect.Effect.catch(() => effect.Effect.succeed(null))) };
89810
90035
  });
89811
90036
  const ProjectFaviconResolverLive = effect.Layer.effect(ProjectFaviconResolver, makeProjectFaviconResolver);
89812
90037
  //#endregion
@@ -89874,22 +90099,25 @@ function buildRepositoryIdentity(input) {
89874
90099
  const DEFAULT_REPOSITORY_IDENTITY_CACHE_CAPACITY = 512;
89875
90100
  const DEFAULT_POSITIVE_CACHE_TTL = effect.Duration.minutes(1);
89876
90101
  const DEFAULT_NEGATIVE_CACHE_TTL = effect.Duration.minutes(1);
90102
+ const GIT_IDENTITY_PROBE_TIMEOUT_MS = 1e3;
89877
90103
  async function resolveRepositoryIdentityCacheKey(cwd) {
89878
- let cacheKey = cwd;
89879
90104
  try {
89880
90105
  const topLevelResult = await runProcess("git", [
89881
90106
  "-C",
89882
90107
  cwd,
89883
90108
  "rev-parse",
89884
90109
  "--show-toplevel"
89885
- ], { allowNonZeroExit: true });
89886
- if (topLevelResult.code !== 0) return cacheKey;
90110
+ ], {
90111
+ allowNonZeroExit: true,
90112
+ timeoutMs: GIT_IDENTITY_PROBE_TIMEOUT_MS
90113
+ });
90114
+ if (topLevelResult.timedOut || topLevelResult.code !== 0) return null;
89887
90115
  const candidate = topLevelResult.stdout.trim();
89888
- if (candidate.length > 0) cacheKey = candidate;
90116
+ if (candidate.length > 0) return candidate;
89889
90117
  } catch {
89890
- return cacheKey;
90118
+ return null;
89891
90119
  }
89892
- return cacheKey;
90120
+ return null;
89893
90121
  }
89894
90122
  async function resolveRepositoryIdentityFromCacheKey(cacheKey) {
89895
90123
  try {
@@ -89898,8 +90126,11 @@ async function resolveRepositoryIdentityFromCacheKey(cacheKey) {
89898
90126
  cacheKey,
89899
90127
  "remote",
89900
90128
  "-v"
89901
- ], { allowNonZeroExit: true });
89902
- if (remoteResult.code !== 0) return null;
90129
+ ], {
90130
+ allowNonZeroExit: true,
90131
+ timeoutMs: GIT_IDENTITY_PROBE_TIMEOUT_MS
90132
+ });
90133
+ if (remoteResult.timedOut || remoteResult.code !== 0) return null;
89903
90134
  const allRemotes = parseRemoteFetchUrls(remoteResult.stdout);
89904
90135
  const remote = pickPrimaryRemote(allRemotes);
89905
90136
  return remote ? buildRepositoryIdentity({
@@ -89912,6 +90143,13 @@ async function resolveRepositoryIdentityFromCacheKey(cacheKey) {
89912
90143
  }
89913
90144
  }
89914
90145
  const makeRepositoryIdentityResolver = effect.Effect.fn("makeRepositoryIdentityResolver")(function* (options = {}) {
90146
+ const workspaceRootCache = yield* effect.Cache.makeWith((cwd) => effect.Effect.promise(() => resolveRepositoryIdentityCacheKey(cwd)), {
90147
+ capacity: options.cacheCapacity ?? DEFAULT_REPOSITORY_IDENTITY_CACHE_CAPACITY,
90148
+ timeToLive: effect.Exit.match({
90149
+ onSuccess: (value) => value === null ? options.negativeCacheTtl ?? DEFAULT_NEGATIVE_CACHE_TTL : options.positiveCacheTtl ?? DEFAULT_POSITIVE_CACHE_TTL,
90150
+ onFailure: () => effect.Duration.zero
90151
+ })
90152
+ });
89915
90153
  const repositoryIdentityCache = yield* effect.Cache.makeWith((cacheKey) => effect.Effect.promise(() => resolveRepositoryIdentityFromCacheKey(cacheKey)), {
89916
90154
  capacity: options.cacheCapacity ?? DEFAULT_REPOSITORY_IDENTITY_CACHE_CAPACITY,
89917
90155
  timeToLive: effect.Exit.match({
@@ -89920,7 +90158,8 @@ const makeRepositoryIdentityResolver = effect.Effect.fn("makeRepositoryIdentityR
89920
90158
  })
89921
90159
  });
89922
90160
  return { resolve: effect.Effect.fn("RepositoryIdentityResolver.resolve")(function* (cwd) {
89923
- const cacheKey = yield* effect.Effect.promise(() => resolveRepositoryIdentityCacheKey(cwd));
90161
+ const cacheKey = yield* effect.Cache.get(workspaceRootCache, cwd);
90162
+ if (cacheKey === null) return null;
89924
90163
  return yield* effect.Cache.get(repositoryIdentityCache, cacheKey);
89925
90164
  }) };
89926
90165
  });
@@ -92052,6 +92291,23 @@ const makeTraceSink = effect.Effect.fn("makeTraceSink")(function* (options) {
92052
92291
  };
92053
92292
  });
92054
92293
  //#endregion
92294
+ //#region src/observability/HttpHeaderRedaction.ts
92295
+ /** Capture policy before HTTP tracing defers span completion outside its request context. */
92296
+ function makeHttpHeaderRedactor(names) {
92297
+ const redactedNames = [
92298
+ ...names,
92299
+ require_collectUint8StreamText.LOCAL_INTRODUCTION_CONTROL_HEADER,
92300
+ "dpop",
92301
+ "dpop-nonce"
92302
+ ];
92303
+ return (key, value) => {
92304
+ const match = /^http\.(?:request|response)\.header\.(.+)$/iu.exec(key);
92305
+ if (!match) return value;
92306
+ const name = match[1].toLowerCase();
92307
+ return String(effect_unstable_http.Headers.redact(effect_unstable_http.Headers.fromInput({ [name]: String(value) }), redactedNames)[name]);
92308
+ };
92309
+ }
92310
+ //#endregion
92055
92311
  //#region src/observability/LocalFileTracer.ts
92056
92312
  var LocalFileSpan = class {
92057
92313
  _tag = "Span";
@@ -92068,9 +92324,11 @@ var LocalFileSpan = class {
92068
92324
  events;
92069
92325
  delegate;
92070
92326
  push;
92071
- constructor(options, delegate, push) {
92327
+ redactAttribute;
92328
+ constructor(options, delegate, push, redactAttribute) {
92072
92329
  this.delegate = delegate;
92073
92330
  this.push = push;
92331
+ this.redactAttribute = redactAttribute;
92074
92332
  this.name = delegate.name;
92075
92333
  this.spanId = delegate.spanId;
92076
92334
  this.traceId = delegate.traceId;
@@ -92097,8 +92355,9 @@ var LocalFileSpan = class {
92097
92355
  if (this.sampled) this.push(spanToTraceRecord(this));
92098
92356
  }
92099
92357
  attribute(key, value) {
92100
- this.attributes.set(key, value);
92101
- this.delegate.attribute(key, value);
92358
+ const redacted = this.redactAttribute(key, value);
92359
+ this.attributes.set(key, redacted);
92360
+ this.delegate.attribute(key, redacted);
92102
92361
  }
92103
92362
  event(name, startTime, attributes) {
92104
92363
  const nextAttributes = attributes ?? {};
@@ -92115,6 +92374,7 @@ var LocalFileSpan = class {
92115
92374
  }
92116
92375
  };
92117
92376
  const makeLocalFileTracer = effect.Effect.fn("makeLocalFileTracer")(function* (options) {
92377
+ const redactAttribute = makeHttpHeaderRedactor(yield* effect.Effect.service(effect_unstable_http.Headers.CurrentRedactedNames));
92118
92378
  const sink = options.sink ?? (yield* makeTraceSink({
92119
92379
  filePath: options.filePath,
92120
92380
  maxBytes: options.maxBytes,
@@ -92124,7 +92384,7 @@ const makeLocalFileTracer = effect.Effect.fn("makeLocalFileTracer")(function* (o
92124
92384
  const delegate = options.delegate ?? effect.Tracer.make({ span: (spanOptions) => new effect.Tracer.NativeSpan(spanOptions) });
92125
92385
  return effect.Tracer.make({
92126
92386
  span(spanOptions) {
92127
- return new LocalFileSpan(spanOptions, delegate.span(spanOptions), sink.push);
92387
+ return new LocalFileSpan(spanOptions, delegate.span(spanOptions), sink.push, redactAttribute);
92128
92388
  },
92129
92389
  ...delegate.context ? { context: delegate.context } : {}
92130
92390
  });
@@ -92240,6 +92500,20 @@ const resolveServerEnvironmentLabel = effect.Effect.fn("resolveServerEnvironment
92240
92500
  return normalizeLabel(input.cwdBaseName) ?? "Ryco environment";
92241
92501
  });
92242
92502
  //#endregion
92503
+ //#region ../../packages/shared/src/environmentIcon.ts
92504
+ /** Reuse existing platform/name metadata; icon selection must never probe permissions or delay startup. */
92505
+ function inferEnvironmentMachineKind(platform, label = "") {
92506
+ const name = label.toLowerCase().replaceAll(/[\s_-]+/g, "");
92507
+ if (/macmini|minipc/.test(name)) return "mini-pc";
92508
+ if (/macstudio|workstation/.test(name)) return "workstation";
92509
+ if (/macbook|notebook|laptop/.test(name)) return "laptop";
92510
+ if (/imac|macpro|desktop/.test(name)) return "desktop";
92511
+ if (platform === "windows" || platform === "win32") return "windows";
92512
+ if (platform === "linux") return "linux";
92513
+ if (platform === "darwin") return "desktop";
92514
+ return "server";
92515
+ }
92516
+ //#endregion
92243
92517
  //#region src/environment/Layers/ServerEnvironment.ts
92244
92518
  function platformOs() {
92245
92519
  switch (process.platform) {
@@ -92275,18 +92549,22 @@ const makeServerEnvironment = effect.Effect.fn("makeServerEnvironment")(function
92275
92549
  });
92276
92550
  const environmentId = require_collectUint8StreamText.EnvironmentId.make(environmentIdRaw);
92277
92551
  const cwdBaseName = path.basename(serverConfig.cwd).trim();
92552
+ const label = yield* resolveServerEnvironmentLabel({ cwdBaseName });
92278
92553
  const descriptor = {
92279
92554
  environmentId,
92280
- label: yield* resolveServerEnvironmentLabel({ cwdBaseName }),
92555
+ label,
92281
92556
  platform: {
92282
92557
  os: platformOs(),
92283
- arch: platformArch()
92558
+ arch: platformArch(),
92559
+ machine: inferEnvironmentMachineKind(platformOs(), label)
92284
92560
  },
92285
92561
  serverVersion: version$1,
92286
92562
  capabilities: {
92287
92563
  repositoryIdentity: true,
92288
92564
  threadSettlement: true,
92289
92565
  threadSnooze: true,
92566
+ projectIcons: true,
92567
+ environmentIcon: true,
92290
92568
  threadPriorityRanking: true,
92291
92569
  fileAttachments: { maxUploadBytes: require_collectUint8StreamText.PROVIDER_SEND_TURN_MAX_FILE_BYTES }
92292
92570
  }
@@ -94028,6 +94306,121 @@ const makeProjectAtlassianLinkRepository = effect.Effect.gen(function* () {
94028
94306
  });
94029
94307
  const ProjectAtlassianLinkRepositoryLive = effect.Layer.effect(ProjectAtlassianLinkRepository, makeProjectAtlassianLinkRepository);
94030
94308
  //#endregion
94309
+ //#region src/persistence/Layers/ProjectionProjects.ts
94310
+ const ProjectionProjectDbRow = ProjectionProject.mapFields(effect.Struct.assign({
94311
+ defaultModelSelection: effect.Schema.NullOr(effect.Schema.fromJsonString(require_collectUint8StreamText.ModelSelection)),
94312
+ scripts: effect.Schema.fromJsonString(effect.Schema.Array(require_collectUint8StreamText.ProjectScript))
94313
+ }));
94314
+ const makeProjectionProjectRepository = effect.Effect.gen(function* () {
94315
+ const sql = yield* effect_unstable_sql_SqlClient.SqlClient;
94316
+ const upsertProjectionProjectRow = effect_unstable_sql_SqlSchema.void({
94317
+ Request: ProjectionProject,
94318
+ execute: (row) => sql`
94319
+ INSERT INTO projection_projects (
94320
+ project_id,
94321
+ title,
94322
+ workspace_root,
94323
+ project_metadata_dir,
94324
+ default_model_selection_json,
94325
+ custom_system_prompt,
94326
+ custom_avatar_content_hash,
94327
+ preferred_remote_name,
94328
+ scripts_json,
94329
+ created_at,
94330
+ updated_at,
94331
+ deleted_at
94332
+ )
94333
+ VALUES (
94334
+ ${row.projectId},
94335
+ ${row.title},
94336
+ ${row.workspaceRoot},
94337
+ ${row.projectMetadataDir},
94338
+ ${row.defaultModelSelection !== null ? JSON.stringify(row.defaultModelSelection) : null},
94339
+ ${row.customSystemPrompt ?? null},
94340
+ ${row.customAvatarContentHash ?? null},
94341
+ ${row.preferredRemoteName ?? null},
94342
+ ${JSON.stringify(row.scripts)},
94343
+ ${row.createdAt},
94344
+ ${row.updatedAt},
94345
+ ${row.deletedAt}
94346
+ )
94347
+ ON CONFLICT (project_id)
94348
+ DO UPDATE SET
94349
+ title = excluded.title,
94350
+ workspace_root = excluded.workspace_root,
94351
+ project_metadata_dir = excluded.project_metadata_dir,
94352
+ default_model_selection_json = excluded.default_model_selection_json,
94353
+ custom_system_prompt = excluded.custom_system_prompt,
94354
+ custom_avatar_content_hash = excluded.custom_avatar_content_hash,
94355
+ preferred_remote_name = excluded.preferred_remote_name,
94356
+ scripts_json = excluded.scripts_json,
94357
+ created_at = excluded.created_at,
94358
+ updated_at = excluded.updated_at,
94359
+ deleted_at = excluded.deleted_at
94360
+ `
94361
+ });
94362
+ const getProjectionProjectRow = effect_unstable_sql_SqlSchema.findOneOption({
94363
+ Request: GetProjectionProjectInput,
94364
+ Result: ProjectionProjectDbRow,
94365
+ execute: ({ projectId }) => sql`
94366
+ SELECT
94367
+ project_id AS "projectId",
94368
+ title,
94369
+ workspace_root AS "workspaceRoot",
94370
+ project_metadata_dir AS "projectMetadataDir",
94371
+ default_model_selection_json AS "defaultModelSelection",
94372
+ custom_system_prompt AS "customSystemPrompt",
94373
+ custom_avatar_content_hash AS "customAvatarContentHash",
94374
+ preferred_remote_name AS "preferredRemoteName",
94375
+ scripts_json AS "scripts",
94376
+ created_at AS "createdAt",
94377
+ updated_at AS "updatedAt",
94378
+ deleted_at AS "deletedAt"
94379
+ FROM projection_projects
94380
+ WHERE project_id = ${projectId}
94381
+ `
94382
+ });
94383
+ const listProjectionProjectRows = effect_unstable_sql_SqlSchema.findAll({
94384
+ Request: effect.Schema.Void,
94385
+ Result: ProjectionProjectDbRow,
94386
+ execute: () => sql`
94387
+ SELECT
94388
+ project_id AS "projectId",
94389
+ title,
94390
+ workspace_root AS "workspaceRoot",
94391
+ project_metadata_dir AS "projectMetadataDir",
94392
+ default_model_selection_json AS "defaultModelSelection",
94393
+ custom_system_prompt AS "customSystemPrompt",
94394
+ custom_avatar_content_hash AS "customAvatarContentHash",
94395
+ preferred_remote_name AS "preferredRemoteName",
94396
+ scripts_json AS "scripts",
94397
+ created_at AS "createdAt",
94398
+ updated_at AS "updatedAt",
94399
+ deleted_at AS "deletedAt"
94400
+ FROM projection_projects
94401
+ ORDER BY created_at ASC, project_id ASC
94402
+ `
94403
+ });
94404
+ const deleteProjectionProjectRow = effect_unstable_sql_SqlSchema.void({
94405
+ Request: DeleteProjectionProjectInput,
94406
+ execute: ({ projectId }) => sql`
94407
+ DELETE FROM projection_projects
94408
+ WHERE project_id = ${projectId}
94409
+ `
94410
+ });
94411
+ const upsert = (row) => upsertProjectionProjectRow(row).pipe(effect.Effect.mapError(toPersistenceSqlError("ProjectionProjectRepository.upsert:query")));
94412
+ const getById = (input) => getProjectionProjectRow(input).pipe(effect.Effect.mapError(toPersistenceSqlError("ProjectionProjectRepository.getById:query")));
94413
+ const listAll = () => listProjectionProjectRows().pipe(effect.Effect.mapError(toPersistenceSqlError("ProjectionProjectRepository.listAll:query")));
94414
+ const deleteById = (input) => deleteProjectionProjectRow(input).pipe(effect.Effect.mapError(toPersistenceSqlError("ProjectionProjectRepository.deleteById:query")));
94415
+ return {
94416
+ upsert,
94417
+ getById,
94418
+ listAll,
94419
+ deleteById
94420
+ };
94421
+ });
94422
+ const ProjectionProjectRepositoryLive = effect.Layer.effect(ProjectionProjectRepository, makeProjectionProjectRepository);
94423
+ //#endregion
94031
94424
  //#region src/persistence/Layers/ProjectionWorktrees.ts
94032
94425
  const ProjectionWorktreeDbRowSchema$1 = ProjectionWorktree.mapFields(effect.Struct.assign({ prIsDraft: effect.Schema.NullOr(effect.Schema.Number) }));
94033
94426
  function toProjectionWorktree(row) {
@@ -106951,36 +107344,6 @@ const DeleteProjectionPendingApprovalInput = effect.Schema.Struct({ requestId: r
106951
107344
  */
106952
107345
  var ProjectionPendingApprovalRepository = class extends effect.Context.Service()("ryco/persistence/Services/ProjectionPendingApprovals/ProjectionPendingApprovalRepository") {};
106953
107346
  //#endregion
106954
- //#region src/persistence/Services/ProjectionProjects.ts
106955
- /**
106956
- * ProjectionProjectRepository - Projection repository interface for projects.
106957
- *
106958
- * Owns persistence operations for project rows in the orchestration projection
106959
- * read model.
106960
- *
106961
- * @module ProjectionProjectRepository
106962
- */
106963
- const ProjectionProject = effect.Schema.Struct({
106964
- projectId: require_collectUint8StreamText.ProjectId,
106965
- title: effect.Schema.String,
106966
- workspaceRoot: effect.Schema.String,
106967
- projectMetadataDir: require_collectUint8StreamText.ProjectMetadataDir,
106968
- defaultModelSelection: effect.Schema.NullOr(require_collectUint8StreamText.ModelSelection),
106969
- customSystemPrompt: effect.Schema.optional(effect.Schema.NullOr(effect.Schema.String)),
106970
- customAvatarContentHash: effect.Schema.NullOr(effect.Schema.String),
106971
- preferredRemoteName: effect.Schema.NullOr(effect.Schema.String),
106972
- scripts: effect.Schema.Array(require_collectUint8StreamText.ProjectScript),
106973
- createdAt: require_collectUint8StreamText.IsoDateTime,
106974
- updatedAt: require_collectUint8StreamText.IsoDateTime,
106975
- deletedAt: effect.Schema.NullOr(require_collectUint8StreamText.IsoDateTime)
106976
- });
106977
- const GetProjectionProjectInput = effect.Schema.Struct({ projectId: require_collectUint8StreamText.ProjectId });
106978
- const DeleteProjectionProjectInput = effect.Schema.Struct({ projectId: require_collectUint8StreamText.ProjectId });
106979
- /**
106980
- * ProjectionProjectRepository - Service tag for project projection persistence.
106981
- */
106982
- var ProjectionProjectRepository = class extends effect.Context.Service()("ryco/persistence/Services/ProjectionProjects/ProjectionProjectRepository") {};
106983
- //#endregion
106984
107347
  //#region src/persistence/Services/ProjectionState.ts
106985
107348
  /**
106986
107349
  * ProjectionStateRepository - Projection repository interface for projector cursors.
@@ -107267,121 +107630,6 @@ const makeProjectionPendingApprovalRepository = effect.Effect.gen(function* () {
107267
107630
  });
107268
107631
  const ProjectionPendingApprovalRepositoryLive = effect.Layer.effect(ProjectionPendingApprovalRepository, makeProjectionPendingApprovalRepository);
107269
107632
  //#endregion
107270
- //#region src/persistence/Layers/ProjectionProjects.ts
107271
- const ProjectionProjectDbRow = ProjectionProject.mapFields(effect.Struct.assign({
107272
- defaultModelSelection: effect.Schema.NullOr(effect.Schema.fromJsonString(require_collectUint8StreamText.ModelSelection)),
107273
- scripts: effect.Schema.fromJsonString(effect.Schema.Array(require_collectUint8StreamText.ProjectScript))
107274
- }));
107275
- const makeProjectionProjectRepository = effect.Effect.gen(function* () {
107276
- const sql = yield* effect_unstable_sql_SqlClient.SqlClient;
107277
- const upsertProjectionProjectRow = effect_unstable_sql_SqlSchema.void({
107278
- Request: ProjectionProject,
107279
- execute: (row) => sql`
107280
- INSERT INTO projection_projects (
107281
- project_id,
107282
- title,
107283
- workspace_root,
107284
- project_metadata_dir,
107285
- default_model_selection_json,
107286
- custom_system_prompt,
107287
- custom_avatar_content_hash,
107288
- preferred_remote_name,
107289
- scripts_json,
107290
- created_at,
107291
- updated_at,
107292
- deleted_at
107293
- )
107294
- VALUES (
107295
- ${row.projectId},
107296
- ${row.title},
107297
- ${row.workspaceRoot},
107298
- ${row.projectMetadataDir},
107299
- ${row.defaultModelSelection !== null ? JSON.stringify(row.defaultModelSelection) : null},
107300
- ${row.customSystemPrompt ?? null},
107301
- ${row.customAvatarContentHash ?? null},
107302
- ${row.preferredRemoteName ?? null},
107303
- ${JSON.stringify(row.scripts)},
107304
- ${row.createdAt},
107305
- ${row.updatedAt},
107306
- ${row.deletedAt}
107307
- )
107308
- ON CONFLICT (project_id)
107309
- DO UPDATE SET
107310
- title = excluded.title,
107311
- workspace_root = excluded.workspace_root,
107312
- project_metadata_dir = excluded.project_metadata_dir,
107313
- default_model_selection_json = excluded.default_model_selection_json,
107314
- custom_system_prompt = excluded.custom_system_prompt,
107315
- custom_avatar_content_hash = excluded.custom_avatar_content_hash,
107316
- preferred_remote_name = excluded.preferred_remote_name,
107317
- scripts_json = excluded.scripts_json,
107318
- created_at = excluded.created_at,
107319
- updated_at = excluded.updated_at,
107320
- deleted_at = excluded.deleted_at
107321
- `
107322
- });
107323
- const getProjectionProjectRow = effect_unstable_sql_SqlSchema.findOneOption({
107324
- Request: GetProjectionProjectInput,
107325
- Result: ProjectionProjectDbRow,
107326
- execute: ({ projectId }) => sql`
107327
- SELECT
107328
- project_id AS "projectId",
107329
- title,
107330
- workspace_root AS "workspaceRoot",
107331
- project_metadata_dir AS "projectMetadataDir",
107332
- default_model_selection_json AS "defaultModelSelection",
107333
- custom_system_prompt AS "customSystemPrompt",
107334
- custom_avatar_content_hash AS "customAvatarContentHash",
107335
- preferred_remote_name AS "preferredRemoteName",
107336
- scripts_json AS "scripts",
107337
- created_at AS "createdAt",
107338
- updated_at AS "updatedAt",
107339
- deleted_at AS "deletedAt"
107340
- FROM projection_projects
107341
- WHERE project_id = ${projectId}
107342
- `
107343
- });
107344
- const listProjectionProjectRows = effect_unstable_sql_SqlSchema.findAll({
107345
- Request: effect.Schema.Void,
107346
- Result: ProjectionProjectDbRow,
107347
- execute: () => sql`
107348
- SELECT
107349
- project_id AS "projectId",
107350
- title,
107351
- workspace_root AS "workspaceRoot",
107352
- project_metadata_dir AS "projectMetadataDir",
107353
- default_model_selection_json AS "defaultModelSelection",
107354
- custom_system_prompt AS "customSystemPrompt",
107355
- custom_avatar_content_hash AS "customAvatarContentHash",
107356
- preferred_remote_name AS "preferredRemoteName",
107357
- scripts_json AS "scripts",
107358
- created_at AS "createdAt",
107359
- updated_at AS "updatedAt",
107360
- deleted_at AS "deletedAt"
107361
- FROM projection_projects
107362
- ORDER BY created_at ASC, project_id ASC
107363
- `
107364
- });
107365
- const deleteProjectionProjectRow = effect_unstable_sql_SqlSchema.void({
107366
- Request: DeleteProjectionProjectInput,
107367
- execute: ({ projectId }) => sql`
107368
- DELETE FROM projection_projects
107369
- WHERE project_id = ${projectId}
107370
- `
107371
- });
107372
- const upsert = (row) => upsertProjectionProjectRow(row).pipe(effect.Effect.mapError(toPersistenceSqlError("ProjectionProjectRepository.upsert:query")));
107373
- const getById = (input) => getProjectionProjectRow(input).pipe(effect.Effect.mapError(toPersistenceSqlError("ProjectionProjectRepository.getById:query")));
107374
- const listAll = () => listProjectionProjectRows().pipe(effect.Effect.mapError(toPersistenceSqlError("ProjectionProjectRepository.listAll:query")));
107375
- const deleteById = (input) => deleteProjectionProjectRow(input).pipe(effect.Effect.mapError(toPersistenceSqlError("ProjectionProjectRepository.deleteById:query")));
107376
- return {
107377
- upsert,
107378
- getById,
107379
- listAll,
107380
- deleteById
107381
- };
107382
- });
107383
- const ProjectionProjectRepositoryLive = effect.Layer.effect(ProjectionProjectRepository, makeProjectionProjectRepository);
107384
- //#endregion
107385
107633
  //#region src/persistence/Layers/ProjectionState.ts
107386
107634
  const MinLastAppliedSequenceRowSchema = effect.Schema.Struct({ minLastAppliedSequence: effect.Schema.NullOr(require_collectUint8StreamText.NonNegativeInt) });
107387
107635
  const makeProjectionStateRepository = effect.Effect.gen(function* () {
@@ -109854,7 +110102,14 @@ const makeProjectionSnapshotQuery = effect.Effect.gen(function* () {
109854
110102
  const resolveRepositoryIdentitiesForProjects = effect.Effect.fn("ProjectionSnapshotQuery.resolveRepositoryIdentitiesForProjects")(function* (projectRows, options) {
109855
110103
  const filteredProjectRows = options?.includeDeleted === true ? projectRows : projectRows.filter((row) => row.deletedAt === null);
109856
110104
  const uniqueWorkspaceRoots = [...new Set(filteredProjectRows.map((row) => row.workspaceRoot))];
109857
- const repositoryIdentityByWorkspaceRoot = new Map(yield* effect.Effect.forEach(uniqueWorkspaceRoots, (workspaceRoot) => repositoryIdentityResolver.resolve(workspaceRoot).pipe(effect.Effect.map((identity) => [workspaceRoot, identity])), { concurrency: repositoryIdentityResolutionConcurrency }));
110105
+ const repositoryIdentityByWorkspaceRoot = /* @__PURE__ */ new Map();
110106
+ const resolveIdentities = effect.Effect.forEach(uniqueWorkspaceRoots, (workspaceRoot) => repositoryIdentityResolver.resolve(workspaceRoot).pipe(effect.Effect.tap((identity) => effect.Effect.sync(() => {
110107
+ repositoryIdentityByWorkspaceRoot.set(workspaceRoot, identity);
110108
+ }))), {
110109
+ concurrency: repositoryIdentityResolutionConcurrency,
110110
+ discard: true
110111
+ });
110112
+ yield* options?.timeoutMs === void 0 ? resolveIdentities : resolveIdentities.pipe(effect.Effect.timeoutOption(options.timeoutMs));
109858
110113
  return new Map(filteredProjectRows.map((row) => [row.projectId, repositoryIdentityByWorkspaceRoot.get(row.workspaceRoot) ?? null]));
109859
110114
  });
109860
110115
  const listProjectRows = effect_unstable_sql_SqlSchema.findAll({
@@ -111244,7 +111499,7 @@ const makeProjectionSnapshotQuery = effect.Effect.gen(function* () {
111244
111499
  if (row.completedAt !== null) updatedAt = maxIso(updatedAt, row.completedAt);
111245
111500
  }
111246
111501
  for (const row of stateRows) updatedAt = maxIso(updatedAt, row.updatedAt);
111247
- const repositoryIdentities = yield* resolveRepositoryIdentitiesForProjects(projectRows);
111502
+ const repositoryIdentities = yield* resolveRepositoryIdentitiesForProjects(projectRows, { timeoutMs: 1e3 });
111248
111503
  const latestTurnByThread = new Map(latestTurnRows.map((row) => [row.threadId, mapLatestTurn(row)]));
111249
111504
  const sessionByThread = new Map(sessionRows.map((row) => [row.threadId, mapSessionRow(row)]));
111250
111505
  const activeProjectIds = new Set(projectRows.filter((row) => row.deletedAt === null).map((row) => row.projectId));
@@ -111932,7 +112187,7 @@ const WorkspaceLayerLive = effect.Layer.mergeAll(WorkspaceAccessPolicyLive, Work
111932
112187
  const AuthLayerLive = ServerAuthLive.pipe(effect.Layer.provideMerge(PersistenceLayerLive), effect.Layer.provide(ServerSecretStoreLive));
111933
112188
  const AtlassianLayerLive = effect.Layer.mergeAll(layer$18, layer$2).pipe(effect.Layer.provideMerge(AtlassianConnectionRepositoryLive), effect.Layer.provideMerge(AtlassianResourceRepositoryLive), effect.Layer.provideMerge(ProjectAtlassianLinkRepositoryLive), effect.Layer.provideMerge(PersistenceLayerLive), effect.Layer.provide(ServerSecretStoreLive));
111934
112189
  const ProviderRuntimeLayerLive = ProviderSessionReaperLive.pipe(effect.Layer.provideMerge(ProviderLayerLive), effect.Layer.provideMerge(OrchestrationLayerLive));
111935
- const RuntimeCoreBaseDependenciesLive = RuntimeFeatureLayerLive.pipe(effect.Layer.provideMerge(CheckpointingLayerLive), effect.Layer.provideMerge(SourceControlProviderRegistryLayerLive), effect.Layer.provideMerge(GitLayerLive), effect.Layer.provideMerge(VcsLayerLive), effect.Layer.provideMerge(ProviderRuntimeLayerLive), effect.Layer.provideMerge(TerminalLayerLive), effect.Layer.provideMerge(AgentControlLayerLive), effect.Layer.provideMerge(PersistenceLayerLive), effect.Layer.provideMerge(ProjectionWorktreeRepositoryLive), effect.Layer.provideMerge(KeybindingsLive), effect.Layer.provideMerge(ProviderRegistryLive), effect.Layer.provideMerge(ProviderInstanceRegistryHydrationLive), effect.Layer.provideMerge(AgentControlSessionRegistryLayerLive), effect.Layer.provideMerge(ProviderEventLoggersLive), effect.Layer.provideMerge(layer$1), effect.Layer.provideMerge(OpenCodeRuntimeLive), effect.Layer.provideMerge(WorkspaceLayerLive), effect.Layer.provideMerge(ProjectFaviconResolverLive), effect.Layer.provideMerge(ProjectAvatarStoreLayerLive));
112190
+ const RuntimeCoreBaseDependenciesLive = RuntimeFeatureLayerLive.pipe(effect.Layer.provideMerge(CheckpointingLayerLive), effect.Layer.provideMerge(SourceControlProviderRegistryLayerLive), effect.Layer.provideMerge(GitLayerLive), effect.Layer.provideMerge(VcsLayerLive), effect.Layer.provideMerge(ProviderRuntimeLayerLive), effect.Layer.provideMerge(TerminalLayerLive), effect.Layer.provideMerge(AgentControlLayerLive), effect.Layer.provideMerge(PersistenceLayerLive), effect.Layer.provideMerge(ProjectionWorktreeRepositoryLive), effect.Layer.provideMerge(ProjectionProjectRepositoryLive), effect.Layer.provideMerge(KeybindingsLive), effect.Layer.provideMerge(ProviderRegistryLive), effect.Layer.provideMerge(ProviderInstanceRegistryHydrationLive), effect.Layer.provideMerge(AgentControlSessionRegistryLayerLive), effect.Layer.provideMerge(ProviderEventLoggersLive), effect.Layer.provideMerge(layer$1), effect.Layer.provideMerge(OpenCodeRuntimeLive), effect.Layer.provideMerge(WorkspaceLayerLive), effect.Layer.provideMerge(ProjectFaviconResolverLive), effect.Layer.provideMerge(ProjectAvatarStoreLayerLive));
111936
112191
  const RuntimeDependenciesLive = effect.Layer.mergeAll(RuntimeCoreBaseDependenciesLive, UsageServiceLive).pipe(effect.Layer.provideMerge(ServerSettingsLive)).pipe(effect.Layer.provideMerge(RepositoryIdentityResolverLive), effect.Layer.provideMerge(ServerEnvironmentLive), effect.Layer.provideMerge(AdvertisedEndpointRegistryLive), effect.Layer.provideMerge(AuthLayerLive), effect.Layer.provideMerge(AtlassianLayerLive)).pipe(effect.Layer.provideMerge(AnalyticsServiceLayerLive), effect.Layer.provideMerge(OpenLive), effect.Layer.provideMerge(ServerLifecycleEventsLive), effect.Layer.provideMerge(ChatAttachmentUploadsLive), effect.Layer.provide(NetService.layer));
111937
112192
  const RuntimeServicesLive = effect.Layer.mergeAll(ServerRuntimeStartupLive, AgentControlMcpServerLive.pipe(effect.Layer.provideMerge(AgentControlDiagnosticsServiceLive), effect.Layer.provideMerge(AgentControlActionValidatorLive), effect.Layer.provideMerge(AgentControlProjectPlansLive)), AgentControlExternalMcpServerLive.pipe(effect.Layer.provideMerge(AgentControlDiagnosticsServiceLive), effect.Layer.provideMerge(AgentControlActionValidatorLive), effect.Layer.provideMerge(AgentControlProjectPlansLive), effect.Layer.provideMerge(AgentControlExternalTaskServiceLive.pipe(effect.Layer.provideMerge(AgentControlActionValidatorLive), effect.Layer.provideMerge(AgentControlProjectPlansLive)))), AgentControlExecutionLive.pipe(effect.Layer.provideMerge(ServerRuntimeStartupLive), effect.Layer.provideMerge(AgentControlActionValidatorLive), effect.Layer.provideMerge(AgentControlProjectPlansLive), effect.Layer.provideMerge(OrchestrationCommandApplicationLive))).pipe(effect.Layer.provideMerge(RuntimeDependenciesLive), effect.Layer.provideMerge(DeviceServiceLive));
111938
112193
  const authRoutesLayer = effect.Layer.mergeAll(authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authClientsRevokeOthersRouteLayer, authClientsRevokeRouteLayer, authClientsRouteLayer, authPairingLinksRevokeRouteLayer, authPairingLinksRouteLayer, authPairingCredentialRouteLayer, authSessionRouteLayer, authWebSocketTokenRouteLayer);
@@ -111940,7 +112195,7 @@ const projectAssetRoutesLayer = effect.Layer.mergeAll(projectFaviconRouteLayer,
111940
112195
  const makeRoutesLayer = effect.Layer.mergeAll(authRoutesLayer, attachmentsRouteLayer, attachmentUploadRouteLayer, orchestrationDispatchRouteLayer, orchestrationSnapshotRouteLayer, otlpTracesProxyRouteLayer, projectAssetRoutesLayer, serverEnvironmentRouteLayer, legacyServerEnvironmentRouteLayer, staticAndDevRouteLayer, websocketRpcRouteLayer, deviceWebsocketRpcRouteLayer, deviceFrameRouteLayer, hubConnectorRoutesLayer, desktopLocalIntroductionRoutesLayer, desktopNativeNodeClaimRoutesLayer).pipe(effect.Layer.provide(browserApiCorsLayer));
111941
112196
  const makeServerLayer = effect.Layer.unwrap(effect.Effect.gen(function* () {
111942
112197
  const config = yield* require_Metrics.ServerConfig;
111943
- fixPath();
112198
+ fixPath({ inheritedFromDesktop: config.mode === "desktop" });
111944
112199
  const httpListeningLayer = effect.Layer.effectDiscard(effect.Effect.gen(function* () {
111945
112200
  yield* effect_unstable_http.HttpServer.HttpServer;
111946
112201
  yield* (yield* ServerRuntimeStartup).markHttpListening;