@opengeni/react 6.7.0 → 6.7.1-canary.41759707569001

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 (758) hide show
  1. package/dist/app/app-state.js +9 -9
  2. package/dist/app/components/Composer.js +19 -19
  3. package/dist/app/components/agent/agent-capability-picker.js +6 -6
  4. package/dist/app/components/artifacts/artifact-browse-controls.js +2 -2
  5. package/dist/app/components/artifacts/artifact-library.js +13 -13
  6. package/dist/app/components/artifacts/artifact-viewer.js +21 -21
  7. package/dist/app/components/artifacts/chat-interactive-block.js +14 -14
  8. package/dist/app/components/artifacts/copy-artifact-link.js +2 -2
  9. package/dist/app/components/artifacts/file-reach-dialog.js +7 -7
  10. package/dist/app/components/artifacts/inline-chat-image.js +22 -22
  11. package/dist/app/components/artifacts/retained-file-preview.js +23 -23
  12. package/dist/app/components/artifacts/retained-text-preview.js +3 -3
  13. package/dist/app/components/artifacts/site-actions.d.ts +43 -0
  14. package/dist/app/components/artifacts/site-actions.js +38 -0
  15. package/dist/app/components/artifacts/site-audience.js +5 -5
  16. package/dist/app/components/artifacts/site-conversations.js +13 -13
  17. package/dist/app/components/artifacts/site-data.js +14 -14
  18. package/dist/app/components/artifacts/site-publishing-page.js +31 -31
  19. package/dist/app/components/artifacts/site-publishing.js +25 -25
  20. package/dist/app/components/artifacts/site-settings.js +30 -30
  21. package/dist/app/components/artifacts/site-version-menu.js +3 -3
  22. package/dist/app/components/billing-class-mark.js +3 -3
  23. package/dist/app/components/bots/bot-launch-strip.js +23 -23
  24. package/dist/app/components/bots/bot-template-dialog.js +30 -30
  25. package/dist/app/components/bots/bot-template-shortcuts.js +23 -23
  26. package/dist/app/components/bots/bot-templates-page.js +37 -37
  27. package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
  28. package/dist/app/components/capabilities/capability-logo-source.js +15 -16
  29. package/dist/app/components/capabilities/connection-ownership-selector.js +4 -4
  30. package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
  31. package/dist/app/components/capabilities/detail-dialog.js +3 -3
  32. package/dist/app/components/capabilities/native-connect-setup.js +17 -18
  33. package/dist/app/components/capabilities/native-connect-setup.js.map +1 -1
  34. package/dist/app/components/capabilities/own-logins-shared-heads-up.js +3 -3
  35. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -18
  36. package/dist/app/components/capabilities/session-capability-card.js +55 -56
  37. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  38. package/dist/app/components/capabilities/session-chrome-card.js +24 -25
  39. package/dist/app/components/capabilities/session-custom-mcp-card.js +18 -19
  40. package/dist/app/components/capabilities/session-github-card.js +18 -19
  41. package/dist/app/components/capabilities/session-machine-card.js +23 -24
  42. package/dist/app/components/capabilities/session-personal-github-card.js +16 -17
  43. package/dist/app/components/capabilities/session-plugin-card.js +9 -10
  44. package/dist/app/components/capabilities/use-connection-accounts.js +2 -2
  45. package/dist/app/components/command-menu/chat-status.js +19 -19
  46. package/dist/app/components/command-menu/chat-switcher.js +35 -35
  47. package/dist/app/components/command-menu/command-menu.js +42 -42
  48. package/dist/app/components/command-menu/shortcut-sheet.js +11 -11
  49. package/dist/app/components/composer-capabilities-menu-body.js +4 -4
  50. package/dist/app/components/composer-mobile-plus-panel.js +10 -10
  51. package/dist/app/components/composer-mobile-plus.js +3 -3
  52. package/dist/app/components/credit-required-gate.js +1 -1
  53. package/dist/app/components/credit-required-prompt.js +4 -4
  54. package/dist/app/components/credits/checkout-credits-celebration.js +3 -3
  55. package/dist/app/components/credits/checkout-return.js +3 -3
  56. package/dist/app/components/credits/credit-refusal-notice.js +2 -2
  57. package/dist/app/components/desktop/app-shots.js +6 -6
  58. package/dist/app/components/desktop/computer-use.js +2 -2
  59. package/dist/app/components/desktop/this-computer.js +5 -5
  60. package/dist/app/components/feedback.js +5 -5
  61. package/dist/app/components/github-app-connect-launcher.js +1 -1
  62. package/dist/app/components/machines/connect-machine-dialog.js +14 -14
  63. package/dist/app/components/markdown.js +7 -7
  64. package/dist/app/components/models/models-ui.js +6 -6
  65. package/dist/app/components/my-things.js +6 -6
  66. package/dist/app/components/own-where-it-works.js +5 -5
  67. package/dist/app/components/personal-resource-attachment-surface.js +4 -4
  68. package/dist/app/components/pickers.js +5 -5
  69. package/dist/app/components/rail/channel-create-dialog.js +5 -5
  70. package/dist/app/components/rail/project-glyph.js +23 -23
  71. package/dist/app/components/rail/project-profile.js +32 -32
  72. package/dist/app/components/rail/rail-context.js +1 -1
  73. package/dist/app/components/rail/rail-sections.js +69 -60
  74. package/dist/app/components/rail/session-header.js +54 -53
  75. package/dist/app/components/rail/session-list.js +67 -58
  76. package/dist/app/components/rail/session-row-content.js +4 -4
  77. package/dist/app/components/rail/session-row-hover-details.js +18 -18
  78. package/dist/app/components/rail/session-shell.js +86 -77
  79. package/dist/app/components/rail/site-session-group-heading.js +29 -12
  80. package/dist/app/components/session/agent-configuration-panel.js +14 -14
  81. package/dist/app/components/session/artifact-session-page.js +5 -5
  82. package/dist/app/components/session/banners.js +9 -9
  83. package/dist/app/components/session/console-new-conversation.js +42 -43
  84. package/dist/app/components/session/descendant-requests.js +38 -39
  85. package/dist/app/components/session/descendant-requests.js.map +1 -1
  86. package/dist/app/components/session/editable-artifacts-workspace.js +27 -27
  87. package/dist/app/components/session/failed-session-banner.js +9 -9
  88. package/dist/app/components/session/failure-recovery-boundary.js +3 -3
  89. package/dist/app/components/session/human-input-delegation-record.js +2 -2
  90. package/dist/app/components/session/human-input.js +36 -37
  91. package/dist/app/components/session/inspector.js +45 -46
  92. package/dist/app/components/session/inspector.js.map +1 -1
  93. package/dist/app/components/session/message-actions.js +5 -5
  94. package/dist/app/components/session/message-resource-attachments.js +13 -13
  95. package/dist/app/components/session/model-recovery-notice.js +3 -3
  96. package/dist/app/components/session/new-session-settings-menu.js +6 -6
  97. package/dist/app/components/session/new-session-setup-strip.js +24 -24
  98. package/dist/app/components/session/sandbox-recovery-actions.js +5 -5
  99. package/dist/app/components/session/sandbox-switcher.js +8 -8
  100. package/dist/app/components/session/sandbox-workspace.js +52 -53
  101. package/dist/app/components/session/search-markdown-highlight.js +8 -8
  102. package/dist/app/components/session/search-results-view.js +9 -9
  103. package/dist/app/components/session/session-admin-access.js +5 -5
  104. package/dist/app/components/session/session-admission-notice.js +4 -4
  105. package/dist/app/components/session/session-avatar-picker.js +24 -24
  106. package/dist/app/components/session/session-avatar.js +22 -22
  107. package/dist/app/components/session/session-machine-access-notice.js +4 -4
  108. package/dist/app/components/session/session-profile-dialog.js +29 -29
  109. package/dist/app/components/session/session-profile-editor.js +30 -30
  110. package/dist/app/components/session/session-retention.js +3 -3
  111. package/dist/app/components/session/session-search-dialog.js +11 -11
  112. package/dist/app/components/session/session-tenancy-control.js +4 -4
  113. package/dist/app/components/session/session-usage-limit-section.js +4 -4
  114. package/dist/app/components/session/share-chat-dialog.js +7 -7
  115. package/dist/app/components/session/subagents.js +12 -12
  116. package/dist/app/components/session/subscription-account-indicator.js +6 -6
  117. package/dist/app/components/settings/row-select.js +4 -4
  118. package/dist/app/components/transcription-settings.js +6 -6
  119. package/dist/app/components/ui/destructive-confirm.js +7 -7
  120. package/dist/app/components/usage/usage-entry.js +3 -3
  121. package/dist/app/components/window-bar.d.ts +3 -1
  122. package/dist/app/components/window-bar.js +13 -11
  123. package/dist/app/components/workspace-composer-plus.js +20 -21
  124. package/dist/app/components/workspace-reach.js +4 -4
  125. package/dist/app/embed/session-app.js +168 -162
  126. package/dist/app/lib/actions/actions-provider.js +9 -9
  127. package/dist/app/lib/agent-capabilities.js +3 -3
  128. package/dist/app/lib/codex-usage-query.js +2 -2
  129. package/dist/app/lib/composer-connectors.js +16 -17
  130. package/dist/app/lib/composer-send-blocking.d.ts +135 -1
  131. package/dist/app/lib/composer-send-blocking.js +30 -3
  132. package/dist/app/lib/console-site.js +2 -2
  133. package/dist/app/lib/console-text.js +2 -2
  134. package/dist/app/lib/copy-link.d.ts +2 -0
  135. package/dist/app/lib/events.js +15 -15
  136. package/dist/app/lib/failed-session-copy.js +4 -4
  137. package/dist/app/lib/model-access-onboarding.js +3 -3
  138. package/dist/app/lib/model-access.js +2 -2
  139. package/dist/app/lib/move-chat-to-machine.js +3 -3
  140. package/dist/app/lib/session-branch-cache.js +12 -12
  141. package/dist/app/lib/session-composer-readiness.d.ts +2 -2
  142. package/dist/app/lib/session-create.js +4 -4
  143. package/dist/app/lib/session-group-pagination.js +12 -12
  144. package/dist/app/lib/session-hover-facts.js +17 -17
  145. package/dist/app/lib/session-model.js +2 -2
  146. package/dist/app/lib/session-rail.js +9 -9
  147. package/dist/app/lib/session-rename.js +3 -3
  148. package/dist/app/lib/sessions-group.js +11 -11
  149. package/dist/app/lib/site-sidebar-bridge.d.ts +24 -0
  150. package/dist/app/lib/site-tool-consent-dialog.js +10 -11
  151. package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
  152. package/dist/app/lib/site-tool-consent.js +1 -1
  153. package/dist/app/lib/turn-failure-analytics.js +5 -5
  154. package/dist/app/lib/use-follow-up-repositories.js +5 -5
  155. package/dist/app/lib/use-workspace-machines.js +5 -5
  156. package/dist/app/lib/use-workspace-model-catalog.js +3 -3
  157. package/dist/app/lib/use-workspace-rigs.js +2 -2
  158. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  159. package/dist/app/lib/workspace-scope-context.js +3 -3
  160. package/dist/app/routes/artifacts.js +70 -70
  161. package/dist/app/routes/retained-artifact.js +50 -50
  162. package/dist/app/routes/session.js +98 -99
  163. package/dist/app/routes/sessions-index-hydration.js +5 -5
  164. package/dist/app/routes/sessions-index.js +85 -85
  165. package/dist/app/routes/site-view.js +174 -82
  166. package/dist/app/routes/site-view.js.map +1 -1
  167. package/dist/artifacts-document.js +4 -4
  168. package/dist/artifacts-presentation.js +4 -4
  169. package/dist/artifacts-spreadsheet.js +4 -4
  170. package/dist/artifacts.js +13 -13
  171. package/dist/automations.js +12 -12
  172. package/dist/{browser-viewer-TC27OCIP.js → browser-viewer-ZHQDVHZ2.js} +5 -5
  173. package/dist/{chat-interactive-block-RWPQBHVS.js → chat-interactive-block-VSDD6X3M.js} +5 -5
  174. package/dist/{chunk-5MOJZORA.js → chunk-2EA4IRIP.js} +34 -3
  175. package/dist/chunk-2EA4IRIP.js.map +1 -0
  176. package/dist/{chunk-C43KRXGA.js → chunk-2GCHGWNE.js} +3 -3
  177. package/dist/{chunk-XLH7QY2R.js → chunk-2J77TWGH.js} +3 -3
  178. package/dist/{chunk-Q3DPEYX4.js → chunk-2LMJXRXK.js} +7 -7
  179. package/dist/{chunk-77WAKEAH.js → chunk-2OXSB2OL.js} +2 -2
  180. package/dist/{chunk-H3T7IWNA.js → chunk-2VJOSU4H.js} +2 -2
  181. package/dist/{chunk-IMDQUHBJ.js → chunk-2ZAQA5GE.js} +6 -6
  182. package/dist/{chunk-L7YTNTIK.js → chunk-3CDJSKDW.js} +3 -3
  183. package/dist/{chunk-EWSOC6WF.js → chunk-3DRLCX5V.js} +2 -2
  184. package/dist/{chunk-JEUPAVYY.js → chunk-3L465FBR.js} +6 -6
  185. package/dist/{chunk-4SAWSRAA.js → chunk-3LTSLMVL.js} +5 -5
  186. package/dist/{chunk-5NWEKLDZ.js → chunk-3NNAC43A.js} +2 -2
  187. package/dist/{chunk-EDI6SJ2N.js → chunk-3OK7Y6ES.js} +2 -2
  188. package/dist/{chunk-AWKES45Y.js → chunk-3PM3M2Q6.js} +2 -2
  189. package/dist/{chunk-I7XIZRFD.js → chunk-3PZ3LRPV.js} +3 -3
  190. package/dist/{chunk-6BCXNDEI.js → chunk-3RGLQG6S.js} +69 -55
  191. package/dist/chunk-3RGLQG6S.js.map +1 -0
  192. package/dist/{chunk-2M3J7ZWQ.js → chunk-467WDSOK.js} +2 -2
  193. package/dist/{chunk-UTIAXH52.js → chunk-477DTTMH.js} +3 -3
  194. package/dist/{chunk-J5F5HPPW.js → chunk-4BWMAGJJ.js} +3 -3
  195. package/dist/{chunk-YSJEAAOL.js → chunk-4F3AEJI6.js} +4 -4
  196. package/dist/{chunk-LHPNABDH.js → chunk-4JXPLTWV.js} +2 -2
  197. package/dist/{chunk-NUNZS36W.js → chunk-4O2XWOLZ.js} +3 -3
  198. package/dist/{chunk-BHNSJVBC.js → chunk-4OTNYMJH.js} +5 -5
  199. package/dist/{chunk-2Z3NQNTM.js → chunk-4POXUODO.js} +15 -15
  200. package/dist/{chunk-QB2KMIDP.js → chunk-4SJAEPM2.js} +2 -2
  201. package/dist/{chunk-TAT5USZN.js → chunk-4T3NE262.js} +3 -3
  202. package/dist/{chunk-6JHU2UBS.js → chunk-4Z5X7PLC.js} +3 -3
  203. package/dist/{chunk-2STUPWEL.js → chunk-54U6ZBEX.js} +3 -3
  204. package/dist/{chunk-XXSOHN35.js → chunk-5FLYHX5R.js} +2 -2
  205. package/dist/{chunk-MIYFS2XN.js → chunk-5MHMCE2G.js} +3 -3
  206. package/dist/{chunk-YWVI6ZMK.js → chunk-5MIBQ4P5.js} +2 -2
  207. package/dist/{chunk-HAX4LCR5.js → chunk-5TKTWXAU.js} +3 -3
  208. package/dist/chunk-6B73WNLR.js +173 -0
  209. package/dist/chunk-6B73WNLR.js.map +1 -0
  210. package/dist/{chunk-F2OPHAUN.js → chunk-6HRYJERP.js} +5 -5
  211. package/dist/{chunk-5O2FCCHZ.js → chunk-6JGB4XGH.js} +3 -3
  212. package/dist/{chunk-RPVREAU7.js → chunk-736RUNIA.js} +4 -4
  213. package/dist/{chunk-2KALVELR.js → chunk-74CBR5YE.js} +3 -3
  214. package/dist/{chunk-5IE76VCY.js → chunk-752WXSDN.js} +2 -2
  215. package/dist/{chunk-SEO7TICN.js → chunk-76MC7KOE.js} +1 -1
  216. package/dist/{chunk-OPJJSKUK.js → chunk-77B6UCNK.js} +6 -6
  217. package/dist/{chunk-ZUA3JMI6.js → chunk-77SYIH6O.js} +2 -2
  218. package/dist/{chunk-ILDXWY37.js → chunk-7AI4E7PV.js} +2 -2
  219. package/dist/{chunk-7X6SDK2C.js → chunk-7HESG3ET.js} +3 -3
  220. package/dist/{chunk-2RG7NIAS.js → chunk-7MY3XB6I.js} +7 -7
  221. package/dist/{chunk-C372BFOV.js → chunk-7NLF35YL.js} +4 -4
  222. package/dist/{chunk-IFB3WJ36.js → chunk-7YTR3UFO.js} +4 -4
  223. package/dist/{chunk-BMICEQZQ.js → chunk-7Z76QP64.js} +3 -3
  224. package/dist/{chunk-YWIFM7D7.js → chunk-AAS7OWV6.js} +3 -3
  225. package/dist/{chunk-5QAY6K77.js → chunk-AB5IW227.js} +3 -3
  226. package/dist/{chunk-ZBIXBQNI.js → chunk-ABJZDRW2.js} +2 -2
  227. package/dist/{chunk-4DVJ6ONS.js → chunk-AH3DGOTK.js} +2 -2
  228. package/dist/{chunk-HGKTHF2U.js → chunk-AJBDAVX3.js} +8 -8
  229. package/dist/{chunk-HD5X76TP.js → chunk-AQQT2FIC.js} +5 -5
  230. package/dist/chunk-AQQT2FIC.js.map +1 -0
  231. package/dist/{chunk-SC6RRD2D.js → chunk-ARTEEI2E.js} +11 -2
  232. package/dist/{chunk-SC6RRD2D.js.map → chunk-ARTEEI2E.js.map} +1 -1
  233. package/dist/{chunk-IXPTECSC.js → chunk-AVXDIRRW.js} +2 -2
  234. package/dist/{chunk-QK5EFEUT.js → chunk-BASI553K.js} +4 -4
  235. package/dist/{chunk-AW2MQB37.js → chunk-BD5FMBO4.js} +2 -2
  236. package/dist/{chunk-CRU35QQH.js → chunk-BFFNINCC.js} +108 -66
  237. package/dist/chunk-BFFNINCC.js.map +1 -0
  238. package/dist/{chunk-OVKYVZMW.js → chunk-BIHGCQXA.js} +2 -2
  239. package/dist/{chunk-Z4FMAFNH.js → chunk-BQYRZIZ7.js} +2 -2
  240. package/dist/{chunk-DZWARC4M.js → chunk-BWMIWRUK.js} +3 -3
  241. package/dist/{chunk-Y4OBB2VN.js → chunk-CV4VVLPZ.js} +2 -2
  242. package/dist/{chunk-JQL7ZH6C.js → chunk-CXAN2FHF.js} +7 -7
  243. package/dist/{chunk-3PZ7JZI2.js → chunk-D3PTVN2I.js} +2 -2
  244. package/dist/{chunk-FPXASDG5.js → chunk-D5TIVCXG.js} +2 -2
  245. package/dist/{chunk-7W37NS3I.js → chunk-D74Z2N4K.js} +2 -2
  246. package/dist/{chunk-MNZG4OHU.js → chunk-DCEQCGVN.js} +2 -2
  247. package/dist/{chunk-ND2BXV3P.js → chunk-DEHLWZSI.js} +4 -4
  248. package/dist/{chunk-ZTPXACWB.js → chunk-DHIGEK6P.js} +6 -6
  249. package/dist/{chunk-2YUOVM3G.js → chunk-DIP7YALH.js} +2 -2
  250. package/dist/{chunk-6PZ7OBYU.js → chunk-DLVIRJGK.js} +4 -4
  251. package/dist/{chunk-KLEUWIMZ.js → chunk-DQPIEQGP.js} +2 -2
  252. package/dist/{chunk-T2QX3FDP.js → chunk-DWJ6J3YW.js} +4 -4
  253. package/dist/{chunk-3CPWWGNK.js → chunk-E5KOWRDU.js} +2 -2
  254. package/dist/{chunk-6WGRDRMA.js → chunk-EBIVTDEG.js} +2 -2
  255. package/dist/{chunk-5CPEEAFD.js → chunk-EDDKPIIV.js} +2 -2
  256. package/dist/{chunk-TX3VECZU.js → chunk-EGKARC53.js} +2 -2
  257. package/dist/{chunk-JEA3QDX7.js → chunk-EKJHOWTZ.js} +4 -4
  258. package/dist/{chunk-UVN5TMHU.js → chunk-ESXAECZ3.js} +2 -2
  259. package/dist/{chunk-3SOIESJM.js → chunk-EWZ2RLNG.js} +2 -2
  260. package/dist/{chunk-ORJPS5VN.js → chunk-F4GCGN7J.js} +91 -31
  261. package/dist/chunk-F4GCGN7J.js.map +1 -0
  262. package/dist/{chunk-NW53H5RW.js → chunk-F7GARVTE.js} +160 -59
  263. package/dist/chunk-F7GARVTE.js.map +1 -0
  264. package/dist/{chunk-CMKGILJK.js → chunk-FBA2NXYH.js} +4 -4
  265. package/dist/{chunk-O6N4ABCA.js → chunk-FER6EVIY.js} +2 -2
  266. package/dist/{chunk-DF5EAHDN.js → chunk-FLWQJDJ5.js} +5 -5
  267. package/dist/{chunk-PTAG4PDC.js → chunk-FNXCFIPW.js} +2 -2
  268. package/dist/chunk-FPSS23S4.js +36 -0
  269. package/dist/chunk-FPSS23S4.js.map +1 -0
  270. package/dist/{chunk-BJEJFISW.js → chunk-FSDQQQIA.js} +3 -3
  271. package/dist/{chunk-FVXBNBHO.js → chunk-FTIC5VXR.js} +6 -6
  272. package/dist/{chunk-PTF5B7TJ.js → chunk-G5UQBTXY.js} +2 -2
  273. package/dist/{chunk-4E3ZJRTZ.js → chunk-G6ICCGJ3.js} +2 -2
  274. package/dist/{chunk-5YKW2K6I.js → chunk-GB5SOTIB.js} +12 -12
  275. package/dist/{chunk-NRTE7DNV.js → chunk-GIWFLWXG.js} +4 -4
  276. package/dist/{chunk-MM4FNWI4.js → chunk-GMHIOYB7.js} +4 -4
  277. package/dist/{chunk-6DK6Z4UN.js → chunk-GOCODNQS.js} +3 -3
  278. package/dist/{chunk-TPQTRNER.js → chunk-GSCGKJNK.js} +2 -2
  279. package/dist/{chunk-7VMZGLYI.js → chunk-GTHCHCWW.js} +3 -3
  280. package/dist/{chunk-SQJIKMN3.js → chunk-GTRAH4FG.js} +2 -2
  281. package/dist/{chunk-ZYAZUPPV.js → chunk-GU7T2S5N.js} +3 -3
  282. package/dist/{chunk-JKHKLL5W.js → chunk-H6BX6WOW.js} +3 -3
  283. package/dist/{chunk-IMZCQBOT.js → chunk-H6MJFMHZ.js} +3 -3
  284. package/dist/{chunk-HSOXMJOT.js → chunk-HEGV4QMS.js} +2 -2
  285. package/dist/{chunk-JDTGRRNU.js → chunk-HGS5KMZS.js} +45 -27
  286. package/dist/chunk-HGS5KMZS.js.map +1 -0
  287. package/dist/chunk-HROITVQJ.js +85 -0
  288. package/dist/chunk-HROITVQJ.js.map +1 -0
  289. package/dist/{chunk-OF4TIKYC.js → chunk-HTMQGS63.js} +17 -9
  290. package/dist/chunk-HTMQGS63.js.map +1 -0
  291. package/dist/{chunk-NC7PVOEK.js → chunk-HWVPLFIW.js} +2 -2
  292. package/dist/{chunk-ECJBYNLJ.js → chunk-ICAMYP5M.js} +2 -2
  293. package/dist/{chunk-DJAXC5OK.js → chunk-IFSXVU2S.js} +2 -2
  294. package/dist/{chunk-N6AACDUW.js → chunk-IHLRYWA7.js} +4 -4
  295. package/dist/{chunk-I4MRDSUF.js → chunk-IJR6VOLU.js} +3 -3
  296. package/dist/{chunk-YCVD6CI3.js → chunk-IN3VQFKS.js} +2 -2
  297. package/dist/{chunk-TXLIEOJX.js → chunk-IWKHF2FN.js} +106 -75
  298. package/dist/chunk-IWKHF2FN.js.map +1 -0
  299. package/dist/{chunk-MFROMEKA.js → chunk-J2BTILRR.js} +3 -3
  300. package/dist/{chunk-NCYMNCJO.js → chunk-J2WY42FA.js} +2 -2
  301. package/dist/{chunk-DGMR6JEJ.js → chunk-J4XSTXZP.js} +2 -2
  302. package/dist/{chunk-P77WNZDY.js → chunk-JMHEFZOB.js} +2 -2
  303. package/dist/{chunk-GVN5SZLX.js → chunk-JMI53ZMU.js} +3 -3
  304. package/dist/{chunk-IDANQPRH.js → chunk-JV3UI7BH.js} +3 -3
  305. package/dist/{chunk-XEQMZB3C.js → chunk-K4DQS2ML.js} +24 -6
  306. package/dist/chunk-K4DQS2ML.js.map +1 -0
  307. package/dist/{chunk-GKVJIDHF.js → chunk-KFNZZ2N6.js} +2 -2
  308. package/dist/{chunk-I4QEJ62Y.js → chunk-KI46GKMD.js} +7 -7
  309. package/dist/{chunk-SIRLACNZ.js → chunk-KO3OHHY2.js} +3 -3
  310. package/dist/{chunk-NULUNM7H.js → chunk-KUE5BOQE.js} +5 -5
  311. package/dist/{chunk-O3LKCBP5.js → chunk-LIJNVIT3.js} +3 -3
  312. package/dist/{chunk-JWB44UGJ.js → chunk-LIJPDVYP.js} +2 -2
  313. package/dist/{chunk-BJFH6JI5.js → chunk-LN4DJOMX.js} +13 -13
  314. package/dist/{chunk-KYS77RPN.js → chunk-LPKJ77EK.js} +2 -2
  315. package/dist/{chunk-RMFKVOM7.js → chunk-LQKVNREV.js} +4 -4
  316. package/dist/{chunk-E7XERZWC.js → chunk-LTJFV2JI.js} +2 -2
  317. package/dist/{chunk-INXGSG3J.js → chunk-LVDNY5RC.js} +2 -2
  318. package/dist/{chunk-2INLDVK3.js → chunk-LVELUUK6.js} +2 -2
  319. package/dist/{chunk-5EWSRZ2Y.js → chunk-M3HGBO2Y.js} +1 -1
  320. package/dist/{chunk-J3DY5HWQ.js → chunk-M5IQVMLR.js} +4 -4
  321. package/dist/{chunk-53AGXXZM.js → chunk-MKDFYE2E.js} +2 -2
  322. package/dist/{chunk-2I7HDP53.js → chunk-MT2R57SF.js} +2 -2
  323. package/dist/{chunk-Z7Y523PS.js → chunk-MV2CLIO6.js} +6 -6
  324. package/dist/{chunk-JZ4NLCAP.js → chunk-MZY3VKKM.js} +2 -2
  325. package/dist/{chunk-YENLNISG.js → chunk-N3FM4BNA.js} +2 -2
  326. package/dist/{chunk-RQKLF42C.js → chunk-NPGLNXYI.js} +4 -4
  327. package/dist/{chunk-I5QZJODL.js → chunk-NQ2CPQJF.js} +3 -3
  328. package/dist/{chunk-6DVCC7QS.js → chunk-OBGOLHCP.js} +164 -43
  329. package/dist/chunk-OBGOLHCP.js.map +1 -0
  330. package/dist/{chunk-CUIWCGMA.js → chunk-OCXEY7HE.js} +2 -2
  331. package/dist/{chunk-KRDR5RJD.js → chunk-OGU73VUN.js} +2 -2
  332. package/dist/{chunk-YIRVLKAX.js → chunk-OI6VI6SU.js} +9 -9
  333. package/dist/{chunk-X6KAJI3V.js → chunk-OK7BQMCI.js} +9 -9
  334. package/dist/chunk-OP2GD6QW.js +166 -0
  335. package/dist/chunk-OP2GD6QW.js.map +1 -0
  336. package/dist/{chunk-TUIN4MB7.js → chunk-ORV7EFSL.js} +4 -4
  337. package/dist/{chunk-3IK6UYO6.js → chunk-OTW25A6I.js} +3 -3
  338. package/dist/{chunk-NPGISCU6.js → chunk-OWET7EY2.js} +16 -16
  339. package/dist/{chunk-3ED2U6XE.js → chunk-OYCK4JRS.js} +2 -2
  340. package/dist/{chunk-YQXTDZSU.js → chunk-OYOFPNLC.js} +4 -4
  341. package/dist/{chunk-4NQHXYMW.js → chunk-PD7NWM7V.js} +2 -2
  342. package/dist/{chunk-4YCA2Y73.js → chunk-PF2WU2IL.js} +3 -3
  343. package/dist/{chunk-Z654FWNU.js → chunk-PLYVGZIN.js} +2 -2
  344. package/dist/{chunk-MVW6HNPI.js → chunk-PRT4J2DL.js} +2 -2
  345. package/dist/{chunk-OPWCMA4D.js → chunk-PUUEI4W3.js} +6 -6
  346. package/dist/{chunk-RLBKLAEY.js → chunk-PVB4YVDP.js} +2 -2
  347. package/dist/{chunk-NXCMHIKI.js → chunk-PWUSSSSL.js} +2 -2
  348. package/dist/{chunk-MJUCFQMS.js → chunk-PYB4BFEC.js} +3 -3
  349. package/dist/{chunk-2FSBSCZJ.js → chunk-PZKHST7A.js} +2 -2
  350. package/dist/{chunk-QZAAUQRN.js → chunk-Q5EZNBPI.js} +3 -3
  351. package/dist/{chunk-ZHDFQITM.js → chunk-Q5K2J5GG.js} +2 -2
  352. package/dist/{chunk-DZXEDSQI.js → chunk-QKBFIJE7.js} +5 -5
  353. package/dist/{chunk-FZC5N55X.js → chunk-QL5NQ3JX.js} +8 -8
  354. package/dist/{chunk-7T2ZE3VT.js → chunk-QPQ7R77C.js} +8 -1
  355. package/dist/chunk-QPQ7R77C.js.map +1 -0
  356. package/dist/{chunk-OV6QJRT4.js → chunk-QRECBCJM.js} +2 -2
  357. package/dist/{chunk-3GZA4BUW.js → chunk-QURYQFDN.js} +2 -2
  358. package/dist/{chunk-I5B5L6Q4.js → chunk-QVZVUROX.js} +1 -1
  359. package/dist/{chunk-VS7AHPCZ.js → chunk-R33SBMB7.js} +3 -3
  360. package/dist/{chunk-KCBMFSMS.js → chunk-R4JA5JFI.js} +3 -3
  361. package/dist/{chunk-HC4JFZVU.js → chunk-R5QAL43H.js} +2 -2
  362. package/dist/{chunk-QPSGCC5D.js → chunk-RGR57NYY.js} +2 -2
  363. package/dist/{chunk-XWFAMUZQ.js → chunk-RHXYO4H2.js} +2 -2
  364. package/dist/{chunk-Y4BB2KS2.js → chunk-RISUROBM.js} +7 -7
  365. package/dist/{chunk-U3DN4HEY.js → chunk-RMCLFSMX.js} +2 -2
  366. package/dist/{chunk-YK7756IF.js → chunk-RTZANSSC.js} +3 -3
  367. package/dist/{chunk-ZEG4VPBL.js → chunk-S27VZ5DO.js} +6 -6
  368. package/dist/{chunk-54YW6SZZ.js → chunk-SBXSKRFA.js} +3 -3
  369. package/dist/{chunk-QIOQ2NPQ.js → chunk-SGH7I7OY.js} +2 -2
  370. package/dist/{chunk-K2A5PXQ5.js → chunk-SJYTQLN3.js} +3 -3
  371. package/dist/{chunk-X3MWB2QU.js → chunk-SN2WENRP.js} +3 -3
  372. package/dist/{chunk-OSY5K7L7.js → chunk-SP44O3OU.js} +2 -2
  373. package/dist/{chunk-OZCBM3UC.js → chunk-SSR4ZX52.js} +2 -2
  374. package/dist/{chunk-QCSJ4CWE.js → chunk-SXGJL7UT.js} +14 -14
  375. package/dist/{chunk-NC55IFN3.js → chunk-T67LTMSW.js} +10 -10
  376. package/dist/{chunk-AXHZYXUV.js → chunk-TDTD66BK.js} +2 -2
  377. package/dist/{chunk-NGJJJPZZ.js → chunk-TK5FWVZR.js} +3 -3
  378. package/dist/{chunk-YPWU5KPE.js → chunk-TKQL7EDB.js} +56 -19
  379. package/dist/chunk-TKQL7EDB.js.map +1 -0
  380. package/dist/{chunk-2OP6WLGV.js → chunk-TNSJFZ6Q.js} +4 -4
  381. package/dist/{chunk-O732GAFC.js → chunk-U4LTPFD2.js} +2 -2
  382. package/dist/{chunk-4DVNUCRR.js → chunk-U5UGM5XD.js} +6 -6
  383. package/dist/{chunk-UJK53QFL.js → chunk-UBRQ3PQD.js} +2 -2
  384. package/dist/{chunk-SODC7T6L.js → chunk-UMX6DZME.js} +2 -2
  385. package/dist/{chunk-YLS6QE5G.js → chunk-UO35OEOX.js} +4 -4
  386. package/dist/{chunk-VTTAJOQ7.js → chunk-UO3X52YM.js} +2 -2
  387. package/dist/{chunk-SHHJCL7X.js → chunk-UTRNLNCW.js} +3 -3
  388. package/dist/{chunk-HEFPPMBQ.js → chunk-UU5FBVRX.js} +2 -2
  389. package/dist/{chunk-GQXZPKK7.js → chunk-V6UOVHW3.js} +2 -2
  390. package/dist/{chunk-7TIX2UAR.js → chunk-VCJQQYRE.js} +4 -4
  391. package/dist/{chunk-6WD2INST.js → chunk-WDASYY4S.js} +7 -7
  392. package/dist/{chunk-DXBYWSL5.js → chunk-WIFDNUKD.js} +3 -3
  393. package/dist/{chunk-RT7CJMER.js → chunk-WIXHUBQN.js} +2 -2
  394. package/dist/{chunk-57AZS3IE.js → chunk-WRMUXZ7C.js} +3 -3
  395. package/dist/{chunk-CRAOSVHC.js → chunk-WSDBQSPP.js} +2 -2
  396. package/dist/{chunk-2CLNIEK4.js → chunk-WTSQUCHB.js} +3 -3
  397. package/dist/{chunk-MIHN76LX.js → chunk-WYGTAQMX.js} +3 -3
  398. package/dist/{chunk-GAVYGBFI.js → chunk-X2R73NGG.js} +2 -2
  399. package/dist/{chunk-T7OXJZCX.js → chunk-XOIDUM2H.js} +1 -1
  400. package/dist/{chunk-XHIQ5I6N.js → chunk-XVLEBB4Y.js} +2 -2
  401. package/dist/{chunk-T3OWFVMS.js → chunk-Y3XZEKDQ.js} +2 -2
  402. package/dist/{chunk-ROKQU7WG.js → chunk-YMI27QPF.js} +2 -2
  403. package/dist/{chunk-U7XM7CB4.js → chunk-YNTLWCF4.js} +4 -4
  404. package/dist/{chunk-ZQCND77P.js → chunk-YRYF76OE.js} +2 -2
  405. package/dist/{chunk-2BDT3UZQ.js → chunk-ZAX4XQLN.js} +3 -3
  406. package/dist/{chunk-DXR5PDFP.js → chunk-ZBHGNE2J.js} +3 -3
  407. package/dist/{chunk-KODELWYT.js → chunk-ZF6ZS77B.js} +3 -3
  408. package/dist/{chunk-KUDGXAF7.js → chunk-ZM5YP5NJ.js} +10 -10
  409. package/dist/{chunk-I7ITSXSJ.js → chunk-ZR5EKJT6.js} +2 -2
  410. package/dist/{chunk-IZXHMZQ6.js → chunk-ZW5YTIH3.js} +4 -4
  411. package/dist/components/artifacts/artifact-sandbox.d.ts +6 -1
  412. package/dist/components/artifacts/site-view.d.ts +4 -2
  413. package/dist/components/timeline-anchor.d.ts +8 -3
  414. package/dist/components/timeline-reading-progress.d.ts +1 -1
  415. package/dist/components/timeline-settlement.d.ts +1 -1
  416. package/dist/composer-messages.js +2 -2
  417. package/dist/composer.js +9 -9
  418. package/dist/{computer-viewer-TDDO25AV.js → computer-viewer-5LKRCEVQ.js} +5 -5
  419. package/dist/connect.js +14 -15
  420. package/dist/desktop-dictation.js +7 -7
  421. package/dist/desktop.js +2 -2
  422. package/dist/editor.js +2 -2
  423. package/dist/{embedded-new-voice-2G3VLPVQ.js → embedded-new-voice-GHJRY3YL.js} +5 -5
  424. package/dist/{embedded-voice-T5IWOWGD.js → embedded-voice-ASQXBSTX.js} +5 -5
  425. package/dist/{fleet-decision-row-WM64KXP3.js → fleet-decision-row-U7LDVBEM.js} +2 -2
  426. package/dist/in-chat-connect-model.js +6 -6
  427. package/dist/index.js +53 -54
  428. package/dist/interaction.js +6 -6
  429. package/dist/{latest-question-OX56OVQ5.js → latest-question-RNVF262Q.js} +5 -5
  430. package/dist/lib/format.d.ts +10 -0
  431. package/dist/machines.js +4 -4
  432. package/dist/meetings-recorder.js +1 -1
  433. package/dist/meetings.js +24 -24
  434. package/dist/messages/en.d.ts +7 -0
  435. package/dist/messages.js +1 -1
  436. package/dist/{model-policy-picker-menu-SMC6J6QN.js → model-policy-picker-menu-E6XKMFTA.js} +4 -4
  437. package/dist/{payment-page-card-G4U63KUV.js → payment-page-card-DJDKV2LW.js} +6 -5
  438. package/dist/{payment-page-card-G4U63KUV.js.map → payment-page-card-DJDKV2LW.js.map} +1 -1
  439. package/dist/{platform-activity-row-BUZGZAKZ.js → platform-activity-row-MSDCSMET.js} +17 -7
  440. package/dist/platform-activity-row-MSDCSMET.js.map +1 -0
  441. package/dist/{queue-surface-implementation-4KUZ4PJV.js → queue-surface-implementation-GUAIG6TK.js} +5 -5
  442. package/dist/realtime.js +4 -4
  443. package/dist/{recorder-host-WF2RRR56.js → recorder-host-2MYDJPQW.js} +4 -4
  444. package/dist/recordings.js +3 -3
  445. package/dist/{sandbox-files-ESDMOFSD.js → sandbox-files-W5W2LW4K.js} +6 -6
  446. package/dist/session-app.js +168 -162
  447. package/dist/{session-connect-cards-Q53KMMYY.js → session-connect-cards-TUY62MVP.js} +10 -11
  448. package/dist/session-list-model.js +2 -2
  449. package/dist/{session-realtime-CF3I35WJ.js → session-realtime-SDTKFFIR.js} +3 -3
  450. package/dist/session-realtime-SDTKFFIR.js.map +1 -0
  451. package/dist/session-realtime.js +2 -2
  452. package/dist/session-ui.js +36 -37
  453. package/dist/session.js +9 -9
  454. package/dist/sites.js +2 -2
  455. package/dist/terminal.js +2 -2
  456. package/dist/this-computer.js +3 -3
  457. package/dist/timeline/shared.d.ts +2 -0
  458. package/dist/{timeline-annotation-markers-CJK4RYZ4.js → timeline-annotation-markers-FNILLWNU.js} +2 -2
  459. package/dist/{timeline-annotation-selection-67GF5H26.js → timeline-annotation-selection-MBCIDO2Q.js} +2 -2
  460. package/dist/{timeline-annotations-dialog-ONJPQDJQ.js → timeline-annotations-dialog-JPNKLOTE.js} +3 -3
  461. package/dist/timeline-model.js +6 -6
  462. package/dist/ui/access-list.js +6 -6
  463. package/dist/ui/cadence-picker.js +4 -4
  464. package/dist/ui/choice-cards.js +3 -3
  465. package/dist/ui/confirm-dialog.js +4 -4
  466. package/dist/ui/copy-field.js +3 -3
  467. package/dist/ui/detail-page.js +5 -5
  468. package/dist/ui/detail-sheet.js +4 -4
  469. package/dist/ui/dialog.js +2 -2
  470. package/dist/ui/disclosure.js +5 -5
  471. package/dist/ui/email-chips-input.js +3 -3
  472. package/dist/ui/field.js +2 -2
  473. package/dist/ui/flush-form-page.js +4 -4
  474. package/dist/ui/form-dialog.js +3 -3
  475. package/dist/ui/list-row.js +3 -3
  476. package/dist/ui/page-header.js +2 -2
  477. package/dist/ui/relative-time.js +2 -2
  478. package/dist/ui/revision-history.js +4 -4
  479. package/dist/ui/role-select.js +6 -6
  480. package/dist/ui/select-menu.js +3 -3
  481. package/dist/ui/sheet.js +2 -2
  482. package/dist/ui/usage-meter.js +3 -3
  483. package/dist/ui/window-bar-title.d.ts +7 -3
  484. package/dist/ui/window-bar-title.js +1 -1
  485. package/dist/usage.js +2 -2
  486. package/dist/workbench.js +4 -4
  487. package/package.json +6 -5
  488. package/src/app/components/artifacts/site-actions.tsx +105 -0
  489. package/src/app/components/rail/session-header-copy.test.tsx +172 -0
  490. package/src/app/components/rail/session-header.tsx +68 -12
  491. package/src/app/components/rail/session-list.tsx +20 -0
  492. package/src/app/components/rail/site-session-group-heading.test.tsx +210 -0
  493. package/src/app/components/rail/site-session-group-heading.tsx +119 -60
  494. package/src/app/components/session/failed-session-actions.test.tsx +4 -0
  495. package/src/app/components/window-bar.tsx +63 -15
  496. package/src/app/lib/composer-send-blocking.tsx +312 -1
  497. package/src/app/lib/copy-link.ts +10 -0
  498. package/src/app/lib/session-composer-readiness.ts +4 -3
  499. package/src/app/lib/site-sidebar-bridge.test.tsx +67 -0
  500. package/src/app/lib/site-sidebar-bridge.ts +57 -0
  501. package/src/app/routes/session.tsx +45 -12
  502. package/src/app/routes/sessions-index.tsx +164 -105
  503. package/src/app/routes/site-view.test.tsx +74 -6
  504. package/src/app/routes/site-view.tsx +135 -14
  505. package/src/components/approval-surface.tsx +78 -3
  506. package/src/components/artifacts/artifact-sandbox.tsx +27 -2
  507. package/src/components/artifacts/site-view.tsx +13 -1
  508. package/src/components/message-timeline.tsx +25 -52
  509. package/src/components/session-capability-frame.tsx +2 -30
  510. package/src/components/timeline-anchor.tsx +19 -14
  511. package/src/components/timeline-reading-progress.ts +1 -2
  512. package/src/components/timeline-settlement.ts +3 -3
  513. package/src/lib/format.ts +46 -1
  514. package/src/messages/en.ts +11 -0
  515. package/src/timeline/platform-activity-row.tsx +20 -8
  516. package/src/timeline/shared.tsx +203 -32
  517. package/src/ui/window-bar-title.test.tsx +37 -0
  518. package/src/ui/window-bar-title.tsx +13 -6
  519. package/styles/compiled.css +5 -0
  520. package/dist/chunk-5MOJZORA.js.map +0 -1
  521. package/dist/chunk-6BCXNDEI.js.map +0 -1
  522. package/dist/chunk-6DVCC7QS.js.map +0 -1
  523. package/dist/chunk-7T2ZE3VT.js.map +0 -1
  524. package/dist/chunk-AFRGP2VP.js +0 -17
  525. package/dist/chunk-AFRGP2VP.js.map +0 -1
  526. package/dist/chunk-CRU35QQH.js.map +0 -1
  527. package/dist/chunk-FO4LYKJL.js +0 -197
  528. package/dist/chunk-FO4LYKJL.js.map +0 -1
  529. package/dist/chunk-HD5X76TP.js.map +0 -1
  530. package/dist/chunk-JDTGRRNU.js.map +0 -1
  531. package/dist/chunk-NW53H5RW.js.map +0 -1
  532. package/dist/chunk-OF4TIKYC.js.map +0 -1
  533. package/dist/chunk-ORJPS5VN.js.map +0 -1
  534. package/dist/chunk-TXLIEOJX.js.map +0 -1
  535. package/dist/chunk-VBUVBHFJ.js +0 -16
  536. package/dist/chunk-VBUVBHFJ.js.map +0 -1
  537. package/dist/chunk-XEQMZB3C.js.map +0 -1
  538. package/dist/chunk-YPWU5KPE.js.map +0 -1
  539. package/dist/components/timeline-answer-follow.d.ts +0 -8
  540. package/dist/platform-activity-row-BUZGZAKZ.js.map +0 -1
  541. package/src/components/timeline-answer-follow.ts +0 -15
  542. /package/dist/{browser-viewer-TC27OCIP.js.map → app/components/artifacts/site-actions.js.map} +0 -0
  543. /package/dist/{chat-interactive-block-RWPQBHVS.js.map → browser-viewer-ZHQDVHZ2.js.map} +0 -0
  544. /package/dist/{computer-viewer-TDDO25AV.js.map → chat-interactive-block-VSDD6X3M.js.map} +0 -0
  545. /package/dist/{chunk-C43KRXGA.js.map → chunk-2GCHGWNE.js.map} +0 -0
  546. /package/dist/{chunk-XLH7QY2R.js.map → chunk-2J77TWGH.js.map} +0 -0
  547. /package/dist/{chunk-Q3DPEYX4.js.map → chunk-2LMJXRXK.js.map} +0 -0
  548. /package/dist/{chunk-77WAKEAH.js.map → chunk-2OXSB2OL.js.map} +0 -0
  549. /package/dist/{chunk-H3T7IWNA.js.map → chunk-2VJOSU4H.js.map} +0 -0
  550. /package/dist/{chunk-IMDQUHBJ.js.map → chunk-2ZAQA5GE.js.map} +0 -0
  551. /package/dist/{chunk-L7YTNTIK.js.map → chunk-3CDJSKDW.js.map} +0 -0
  552. /package/dist/{chunk-EWSOC6WF.js.map → chunk-3DRLCX5V.js.map} +0 -0
  553. /package/dist/{chunk-JEUPAVYY.js.map → chunk-3L465FBR.js.map} +0 -0
  554. /package/dist/{chunk-4SAWSRAA.js.map → chunk-3LTSLMVL.js.map} +0 -0
  555. /package/dist/{chunk-5NWEKLDZ.js.map → chunk-3NNAC43A.js.map} +0 -0
  556. /package/dist/{chunk-EDI6SJ2N.js.map → chunk-3OK7Y6ES.js.map} +0 -0
  557. /package/dist/{chunk-AWKES45Y.js.map → chunk-3PM3M2Q6.js.map} +0 -0
  558. /package/dist/{chunk-I7XIZRFD.js.map → chunk-3PZ3LRPV.js.map} +0 -0
  559. /package/dist/{chunk-2M3J7ZWQ.js.map → chunk-467WDSOK.js.map} +0 -0
  560. /package/dist/{chunk-UTIAXH52.js.map → chunk-477DTTMH.js.map} +0 -0
  561. /package/dist/{chunk-J5F5HPPW.js.map → chunk-4BWMAGJJ.js.map} +0 -0
  562. /package/dist/{chunk-YSJEAAOL.js.map → chunk-4F3AEJI6.js.map} +0 -0
  563. /package/dist/{chunk-LHPNABDH.js.map → chunk-4JXPLTWV.js.map} +0 -0
  564. /package/dist/{chunk-NUNZS36W.js.map → chunk-4O2XWOLZ.js.map} +0 -0
  565. /package/dist/{chunk-BHNSJVBC.js.map → chunk-4OTNYMJH.js.map} +0 -0
  566. /package/dist/{chunk-2Z3NQNTM.js.map → chunk-4POXUODO.js.map} +0 -0
  567. /package/dist/{chunk-QB2KMIDP.js.map → chunk-4SJAEPM2.js.map} +0 -0
  568. /package/dist/{chunk-TAT5USZN.js.map → chunk-4T3NE262.js.map} +0 -0
  569. /package/dist/{chunk-6JHU2UBS.js.map → chunk-4Z5X7PLC.js.map} +0 -0
  570. /package/dist/{chunk-2STUPWEL.js.map → chunk-54U6ZBEX.js.map} +0 -0
  571. /package/dist/{chunk-XXSOHN35.js.map → chunk-5FLYHX5R.js.map} +0 -0
  572. /package/dist/{chunk-MIYFS2XN.js.map → chunk-5MHMCE2G.js.map} +0 -0
  573. /package/dist/{chunk-YWVI6ZMK.js.map → chunk-5MIBQ4P5.js.map} +0 -0
  574. /package/dist/{chunk-HAX4LCR5.js.map → chunk-5TKTWXAU.js.map} +0 -0
  575. /package/dist/{chunk-F2OPHAUN.js.map → chunk-6HRYJERP.js.map} +0 -0
  576. /package/dist/{chunk-5O2FCCHZ.js.map → chunk-6JGB4XGH.js.map} +0 -0
  577. /package/dist/{chunk-RPVREAU7.js.map → chunk-736RUNIA.js.map} +0 -0
  578. /package/dist/{chunk-2KALVELR.js.map → chunk-74CBR5YE.js.map} +0 -0
  579. /package/dist/{chunk-5IE76VCY.js.map → chunk-752WXSDN.js.map} +0 -0
  580. /package/dist/{chunk-SEO7TICN.js.map → chunk-76MC7KOE.js.map} +0 -0
  581. /package/dist/{chunk-OPJJSKUK.js.map → chunk-77B6UCNK.js.map} +0 -0
  582. /package/dist/{chunk-ZUA3JMI6.js.map → chunk-77SYIH6O.js.map} +0 -0
  583. /package/dist/{chunk-ILDXWY37.js.map → chunk-7AI4E7PV.js.map} +0 -0
  584. /package/dist/{chunk-7X6SDK2C.js.map → chunk-7HESG3ET.js.map} +0 -0
  585. /package/dist/{chunk-2RG7NIAS.js.map → chunk-7MY3XB6I.js.map} +0 -0
  586. /package/dist/{chunk-C372BFOV.js.map → chunk-7NLF35YL.js.map} +0 -0
  587. /package/dist/{chunk-IFB3WJ36.js.map → chunk-7YTR3UFO.js.map} +0 -0
  588. /package/dist/{chunk-BMICEQZQ.js.map → chunk-7Z76QP64.js.map} +0 -0
  589. /package/dist/{chunk-YWIFM7D7.js.map → chunk-AAS7OWV6.js.map} +0 -0
  590. /package/dist/{chunk-5QAY6K77.js.map → chunk-AB5IW227.js.map} +0 -0
  591. /package/dist/{chunk-ZBIXBQNI.js.map → chunk-ABJZDRW2.js.map} +0 -0
  592. /package/dist/{chunk-4DVJ6ONS.js.map → chunk-AH3DGOTK.js.map} +0 -0
  593. /package/dist/{chunk-HGKTHF2U.js.map → chunk-AJBDAVX3.js.map} +0 -0
  594. /package/dist/{chunk-IXPTECSC.js.map → chunk-AVXDIRRW.js.map} +0 -0
  595. /package/dist/{chunk-QK5EFEUT.js.map → chunk-BASI553K.js.map} +0 -0
  596. /package/dist/{chunk-AW2MQB37.js.map → chunk-BD5FMBO4.js.map} +0 -0
  597. /package/dist/{chunk-OVKYVZMW.js.map → chunk-BIHGCQXA.js.map} +0 -0
  598. /package/dist/{chunk-Z4FMAFNH.js.map → chunk-BQYRZIZ7.js.map} +0 -0
  599. /package/dist/{chunk-DZWARC4M.js.map → chunk-BWMIWRUK.js.map} +0 -0
  600. /package/dist/{chunk-Y4OBB2VN.js.map → chunk-CV4VVLPZ.js.map} +0 -0
  601. /package/dist/{chunk-JQL7ZH6C.js.map → chunk-CXAN2FHF.js.map} +0 -0
  602. /package/dist/{chunk-3PZ7JZI2.js.map → chunk-D3PTVN2I.js.map} +0 -0
  603. /package/dist/{chunk-FPXASDG5.js.map → chunk-D5TIVCXG.js.map} +0 -0
  604. /package/dist/{chunk-7W37NS3I.js.map → chunk-D74Z2N4K.js.map} +0 -0
  605. /package/dist/{chunk-MNZG4OHU.js.map → chunk-DCEQCGVN.js.map} +0 -0
  606. /package/dist/{chunk-ND2BXV3P.js.map → chunk-DEHLWZSI.js.map} +0 -0
  607. /package/dist/{chunk-ZTPXACWB.js.map → chunk-DHIGEK6P.js.map} +0 -0
  608. /package/dist/{chunk-2YUOVM3G.js.map → chunk-DIP7YALH.js.map} +0 -0
  609. /package/dist/{chunk-6PZ7OBYU.js.map → chunk-DLVIRJGK.js.map} +0 -0
  610. /package/dist/{chunk-KLEUWIMZ.js.map → chunk-DQPIEQGP.js.map} +0 -0
  611. /package/dist/{chunk-T2QX3FDP.js.map → chunk-DWJ6J3YW.js.map} +0 -0
  612. /package/dist/{chunk-3CPWWGNK.js.map → chunk-E5KOWRDU.js.map} +0 -0
  613. /package/dist/{chunk-6WGRDRMA.js.map → chunk-EBIVTDEG.js.map} +0 -0
  614. /package/dist/{chunk-5CPEEAFD.js.map → chunk-EDDKPIIV.js.map} +0 -0
  615. /package/dist/{chunk-TX3VECZU.js.map → chunk-EGKARC53.js.map} +0 -0
  616. /package/dist/{chunk-JEA3QDX7.js.map → chunk-EKJHOWTZ.js.map} +0 -0
  617. /package/dist/{chunk-UVN5TMHU.js.map → chunk-ESXAECZ3.js.map} +0 -0
  618. /package/dist/{chunk-3SOIESJM.js.map → chunk-EWZ2RLNG.js.map} +0 -0
  619. /package/dist/{chunk-CMKGILJK.js.map → chunk-FBA2NXYH.js.map} +0 -0
  620. /package/dist/{chunk-O6N4ABCA.js.map → chunk-FER6EVIY.js.map} +0 -0
  621. /package/dist/{chunk-DF5EAHDN.js.map → chunk-FLWQJDJ5.js.map} +0 -0
  622. /package/dist/{chunk-PTAG4PDC.js.map → chunk-FNXCFIPW.js.map} +0 -0
  623. /package/dist/{chunk-BJEJFISW.js.map → chunk-FSDQQQIA.js.map} +0 -0
  624. /package/dist/{chunk-FVXBNBHO.js.map → chunk-FTIC5VXR.js.map} +0 -0
  625. /package/dist/{chunk-PTF5B7TJ.js.map → chunk-G5UQBTXY.js.map} +0 -0
  626. /package/dist/{chunk-4E3ZJRTZ.js.map → chunk-G6ICCGJ3.js.map} +0 -0
  627. /package/dist/{chunk-5YKW2K6I.js.map → chunk-GB5SOTIB.js.map} +0 -0
  628. /package/dist/{chunk-NRTE7DNV.js.map → chunk-GIWFLWXG.js.map} +0 -0
  629. /package/dist/{chunk-MM4FNWI4.js.map → chunk-GMHIOYB7.js.map} +0 -0
  630. /package/dist/{chunk-6DK6Z4UN.js.map → chunk-GOCODNQS.js.map} +0 -0
  631. /package/dist/{chunk-TPQTRNER.js.map → chunk-GSCGKJNK.js.map} +0 -0
  632. /package/dist/{chunk-7VMZGLYI.js.map → chunk-GTHCHCWW.js.map} +0 -0
  633. /package/dist/{chunk-SQJIKMN3.js.map → chunk-GTRAH4FG.js.map} +0 -0
  634. /package/dist/{chunk-ZYAZUPPV.js.map → chunk-GU7T2S5N.js.map} +0 -0
  635. /package/dist/{chunk-JKHKLL5W.js.map → chunk-H6BX6WOW.js.map} +0 -0
  636. /package/dist/{chunk-IMZCQBOT.js.map → chunk-H6MJFMHZ.js.map} +0 -0
  637. /package/dist/{chunk-HSOXMJOT.js.map → chunk-HEGV4QMS.js.map} +0 -0
  638. /package/dist/{chunk-NC7PVOEK.js.map → chunk-HWVPLFIW.js.map} +0 -0
  639. /package/dist/{chunk-ECJBYNLJ.js.map → chunk-ICAMYP5M.js.map} +0 -0
  640. /package/dist/{chunk-DJAXC5OK.js.map → chunk-IFSXVU2S.js.map} +0 -0
  641. /package/dist/{chunk-N6AACDUW.js.map → chunk-IHLRYWA7.js.map} +0 -0
  642. /package/dist/{chunk-I4MRDSUF.js.map → chunk-IJR6VOLU.js.map} +0 -0
  643. /package/dist/{chunk-YCVD6CI3.js.map → chunk-IN3VQFKS.js.map} +0 -0
  644. /package/dist/{chunk-MFROMEKA.js.map → chunk-J2BTILRR.js.map} +0 -0
  645. /package/dist/{chunk-NCYMNCJO.js.map → chunk-J2WY42FA.js.map} +0 -0
  646. /package/dist/{chunk-DGMR6JEJ.js.map → chunk-J4XSTXZP.js.map} +0 -0
  647. /package/dist/{chunk-P77WNZDY.js.map → chunk-JMHEFZOB.js.map} +0 -0
  648. /package/dist/{chunk-GVN5SZLX.js.map → chunk-JMI53ZMU.js.map} +0 -0
  649. /package/dist/{chunk-IDANQPRH.js.map → chunk-JV3UI7BH.js.map} +0 -0
  650. /package/dist/{chunk-GKVJIDHF.js.map → chunk-KFNZZ2N6.js.map} +0 -0
  651. /package/dist/{chunk-I4QEJ62Y.js.map → chunk-KI46GKMD.js.map} +0 -0
  652. /package/dist/{chunk-SIRLACNZ.js.map → chunk-KO3OHHY2.js.map} +0 -0
  653. /package/dist/{chunk-NULUNM7H.js.map → chunk-KUE5BOQE.js.map} +0 -0
  654. /package/dist/{chunk-O3LKCBP5.js.map → chunk-LIJNVIT3.js.map} +0 -0
  655. /package/dist/{chunk-JWB44UGJ.js.map → chunk-LIJPDVYP.js.map} +0 -0
  656. /package/dist/{chunk-BJFH6JI5.js.map → chunk-LN4DJOMX.js.map} +0 -0
  657. /package/dist/{chunk-KYS77RPN.js.map → chunk-LPKJ77EK.js.map} +0 -0
  658. /package/dist/{chunk-RMFKVOM7.js.map → chunk-LQKVNREV.js.map} +0 -0
  659. /package/dist/{chunk-E7XERZWC.js.map → chunk-LTJFV2JI.js.map} +0 -0
  660. /package/dist/{chunk-INXGSG3J.js.map → chunk-LVDNY5RC.js.map} +0 -0
  661. /package/dist/{chunk-2INLDVK3.js.map → chunk-LVELUUK6.js.map} +0 -0
  662. /package/dist/{chunk-5EWSRZ2Y.js.map → chunk-M3HGBO2Y.js.map} +0 -0
  663. /package/dist/{chunk-J3DY5HWQ.js.map → chunk-M5IQVMLR.js.map} +0 -0
  664. /package/dist/{chunk-53AGXXZM.js.map → chunk-MKDFYE2E.js.map} +0 -0
  665. /package/dist/{chunk-2I7HDP53.js.map → chunk-MT2R57SF.js.map} +0 -0
  666. /package/dist/{chunk-Z7Y523PS.js.map → chunk-MV2CLIO6.js.map} +0 -0
  667. /package/dist/{chunk-JZ4NLCAP.js.map → chunk-MZY3VKKM.js.map} +0 -0
  668. /package/dist/{chunk-YENLNISG.js.map → chunk-N3FM4BNA.js.map} +0 -0
  669. /package/dist/{chunk-RQKLF42C.js.map → chunk-NPGLNXYI.js.map} +0 -0
  670. /package/dist/{chunk-I5QZJODL.js.map → chunk-NQ2CPQJF.js.map} +0 -0
  671. /package/dist/{chunk-CUIWCGMA.js.map → chunk-OCXEY7HE.js.map} +0 -0
  672. /package/dist/{chunk-KRDR5RJD.js.map → chunk-OGU73VUN.js.map} +0 -0
  673. /package/dist/{chunk-YIRVLKAX.js.map → chunk-OI6VI6SU.js.map} +0 -0
  674. /package/dist/{chunk-X6KAJI3V.js.map → chunk-OK7BQMCI.js.map} +0 -0
  675. /package/dist/{chunk-TUIN4MB7.js.map → chunk-ORV7EFSL.js.map} +0 -0
  676. /package/dist/{chunk-3IK6UYO6.js.map → chunk-OTW25A6I.js.map} +0 -0
  677. /package/dist/{chunk-NPGISCU6.js.map → chunk-OWET7EY2.js.map} +0 -0
  678. /package/dist/{chunk-3ED2U6XE.js.map → chunk-OYCK4JRS.js.map} +0 -0
  679. /package/dist/{chunk-YQXTDZSU.js.map → chunk-OYOFPNLC.js.map} +0 -0
  680. /package/dist/{chunk-4NQHXYMW.js.map → chunk-PD7NWM7V.js.map} +0 -0
  681. /package/dist/{chunk-4YCA2Y73.js.map → chunk-PF2WU2IL.js.map} +0 -0
  682. /package/dist/{chunk-Z654FWNU.js.map → chunk-PLYVGZIN.js.map} +0 -0
  683. /package/dist/{chunk-MVW6HNPI.js.map → chunk-PRT4J2DL.js.map} +0 -0
  684. /package/dist/{chunk-OPWCMA4D.js.map → chunk-PUUEI4W3.js.map} +0 -0
  685. /package/dist/{chunk-RLBKLAEY.js.map → chunk-PVB4YVDP.js.map} +0 -0
  686. /package/dist/{chunk-NXCMHIKI.js.map → chunk-PWUSSSSL.js.map} +0 -0
  687. /package/dist/{chunk-MJUCFQMS.js.map → chunk-PYB4BFEC.js.map} +0 -0
  688. /package/dist/{chunk-2FSBSCZJ.js.map → chunk-PZKHST7A.js.map} +0 -0
  689. /package/dist/{chunk-QZAAUQRN.js.map → chunk-Q5EZNBPI.js.map} +0 -0
  690. /package/dist/{chunk-ZHDFQITM.js.map → chunk-Q5K2J5GG.js.map} +0 -0
  691. /package/dist/{chunk-DZXEDSQI.js.map → chunk-QKBFIJE7.js.map} +0 -0
  692. /package/dist/{chunk-FZC5N55X.js.map → chunk-QL5NQ3JX.js.map} +0 -0
  693. /package/dist/{chunk-OV6QJRT4.js.map → chunk-QRECBCJM.js.map} +0 -0
  694. /package/dist/{chunk-3GZA4BUW.js.map → chunk-QURYQFDN.js.map} +0 -0
  695. /package/dist/{chunk-I5B5L6Q4.js.map → chunk-QVZVUROX.js.map} +0 -0
  696. /package/dist/{chunk-VS7AHPCZ.js.map → chunk-R33SBMB7.js.map} +0 -0
  697. /package/dist/{chunk-KCBMFSMS.js.map → chunk-R4JA5JFI.js.map} +0 -0
  698. /package/dist/{chunk-HC4JFZVU.js.map → chunk-R5QAL43H.js.map} +0 -0
  699. /package/dist/{chunk-QPSGCC5D.js.map → chunk-RGR57NYY.js.map} +0 -0
  700. /package/dist/{chunk-XWFAMUZQ.js.map → chunk-RHXYO4H2.js.map} +0 -0
  701. /package/dist/{chunk-Y4BB2KS2.js.map → chunk-RISUROBM.js.map} +0 -0
  702. /package/dist/{chunk-U3DN4HEY.js.map → chunk-RMCLFSMX.js.map} +0 -0
  703. /package/dist/{chunk-YK7756IF.js.map → chunk-RTZANSSC.js.map} +0 -0
  704. /package/dist/{chunk-ZEG4VPBL.js.map → chunk-S27VZ5DO.js.map} +0 -0
  705. /package/dist/{chunk-54YW6SZZ.js.map → chunk-SBXSKRFA.js.map} +0 -0
  706. /package/dist/{chunk-QIOQ2NPQ.js.map → chunk-SGH7I7OY.js.map} +0 -0
  707. /package/dist/{chunk-K2A5PXQ5.js.map → chunk-SJYTQLN3.js.map} +0 -0
  708. /package/dist/{chunk-X3MWB2QU.js.map → chunk-SN2WENRP.js.map} +0 -0
  709. /package/dist/{chunk-OSY5K7L7.js.map → chunk-SP44O3OU.js.map} +0 -0
  710. /package/dist/{chunk-OZCBM3UC.js.map → chunk-SSR4ZX52.js.map} +0 -0
  711. /package/dist/{chunk-QCSJ4CWE.js.map → chunk-SXGJL7UT.js.map} +0 -0
  712. /package/dist/{chunk-NC55IFN3.js.map → chunk-T67LTMSW.js.map} +0 -0
  713. /package/dist/{chunk-AXHZYXUV.js.map → chunk-TDTD66BK.js.map} +0 -0
  714. /package/dist/{chunk-NGJJJPZZ.js.map → chunk-TK5FWVZR.js.map} +0 -0
  715. /package/dist/{chunk-2OP6WLGV.js.map → chunk-TNSJFZ6Q.js.map} +0 -0
  716. /package/dist/{chunk-O732GAFC.js.map → chunk-U4LTPFD2.js.map} +0 -0
  717. /package/dist/{chunk-4DVNUCRR.js.map → chunk-U5UGM5XD.js.map} +0 -0
  718. /package/dist/{chunk-UJK53QFL.js.map → chunk-UBRQ3PQD.js.map} +0 -0
  719. /package/dist/{chunk-SODC7T6L.js.map → chunk-UMX6DZME.js.map} +0 -0
  720. /package/dist/{chunk-YLS6QE5G.js.map → chunk-UO35OEOX.js.map} +0 -0
  721. /package/dist/{chunk-VTTAJOQ7.js.map → chunk-UO3X52YM.js.map} +0 -0
  722. /package/dist/{chunk-SHHJCL7X.js.map → chunk-UTRNLNCW.js.map} +0 -0
  723. /package/dist/{chunk-HEFPPMBQ.js.map → chunk-UU5FBVRX.js.map} +0 -0
  724. /package/dist/{chunk-GQXZPKK7.js.map → chunk-V6UOVHW3.js.map} +0 -0
  725. /package/dist/{chunk-7TIX2UAR.js.map → chunk-VCJQQYRE.js.map} +0 -0
  726. /package/dist/{chunk-6WD2INST.js.map → chunk-WDASYY4S.js.map} +0 -0
  727. /package/dist/{chunk-DXBYWSL5.js.map → chunk-WIFDNUKD.js.map} +0 -0
  728. /package/dist/{chunk-RT7CJMER.js.map → chunk-WIXHUBQN.js.map} +0 -0
  729. /package/dist/{chunk-57AZS3IE.js.map → chunk-WRMUXZ7C.js.map} +0 -0
  730. /package/dist/{chunk-CRAOSVHC.js.map → chunk-WSDBQSPP.js.map} +0 -0
  731. /package/dist/{chunk-2CLNIEK4.js.map → chunk-WTSQUCHB.js.map} +0 -0
  732. /package/dist/{chunk-MIHN76LX.js.map → chunk-WYGTAQMX.js.map} +0 -0
  733. /package/dist/{chunk-GAVYGBFI.js.map → chunk-X2R73NGG.js.map} +0 -0
  734. /package/dist/{chunk-T7OXJZCX.js.map → chunk-XOIDUM2H.js.map} +0 -0
  735. /package/dist/{chunk-XHIQ5I6N.js.map → chunk-XVLEBB4Y.js.map} +0 -0
  736. /package/dist/{chunk-T3OWFVMS.js.map → chunk-Y3XZEKDQ.js.map} +0 -0
  737. /package/dist/{chunk-ROKQU7WG.js.map → chunk-YMI27QPF.js.map} +0 -0
  738. /package/dist/{chunk-U7XM7CB4.js.map → chunk-YNTLWCF4.js.map} +0 -0
  739. /package/dist/{chunk-ZQCND77P.js.map → chunk-YRYF76OE.js.map} +0 -0
  740. /package/dist/{chunk-2BDT3UZQ.js.map → chunk-ZAX4XQLN.js.map} +0 -0
  741. /package/dist/{chunk-DXR5PDFP.js.map → chunk-ZBHGNE2J.js.map} +0 -0
  742. /package/dist/{chunk-KODELWYT.js.map → chunk-ZF6ZS77B.js.map} +0 -0
  743. /package/dist/{chunk-KUDGXAF7.js.map → chunk-ZM5YP5NJ.js.map} +0 -0
  744. /package/dist/{chunk-I7ITSXSJ.js.map → chunk-ZR5EKJT6.js.map} +0 -0
  745. /package/dist/{chunk-IZXHMZQ6.js.map → chunk-ZW5YTIH3.js.map} +0 -0
  746. /package/dist/{embedded-new-voice-2G3VLPVQ.js.map → computer-viewer-5LKRCEVQ.js.map} +0 -0
  747. /package/dist/{embedded-voice-T5IWOWGD.js.map → embedded-new-voice-GHJRY3YL.js.map} +0 -0
  748. /package/dist/{model-policy-picker-menu-SMC6J6QN.js.map → embedded-voice-ASQXBSTX.js.map} +0 -0
  749. /package/dist/{fleet-decision-row-WM64KXP3.js.map → fleet-decision-row-U7LDVBEM.js.map} +0 -0
  750. /package/dist/{latest-question-OX56OVQ5.js.map → latest-question-RNVF262Q.js.map} +0 -0
  751. /package/dist/{sandbox-files-ESDMOFSD.js.map → model-policy-picker-menu-E6XKMFTA.js.map} +0 -0
  752. /package/dist/{queue-surface-implementation-4KUZ4PJV.js.map → queue-surface-implementation-GUAIG6TK.js.map} +0 -0
  753. /package/dist/{recorder-host-WF2RRR56.js.map → recorder-host-2MYDJPQW.js.map} +0 -0
  754. /package/dist/{session-connect-cards-Q53KMMYY.js.map → sandbox-files-W5W2LW4K.js.map} +0 -0
  755. /package/dist/{session-realtime-CF3I35WJ.js.map → session-connect-cards-TUY62MVP.js.map} +0 -0
  756. /package/dist/{timeline-annotation-markers-CJK4RYZ4.js.map → timeline-annotation-markers-FNILLWNU.js.map} +0 -0
  757. /package/dist/{timeline-annotation-selection-67GF5H26.js.map → timeline-annotation-selection-MBCIDO2Q.js.map} +0 -0
  758. /package/dist/{timeline-annotations-dialog-ONJPQDJQ.js.map → timeline-annotations-dialog-JPNKLOTE.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/components/rail/session-list.tsx","../src/app/lib/actions/held-modifier.ts"],"sourcesContent":["import { archiveActionLabel, requestSessionArchive } from \"../../lib/archive-session\";\n// The session list — the rail's home. Uses workspace discovery for search and\n// independently paged project folders for browsing, with pins above the tree.\n// Supports ArrowUp/Down + Enter keyboard navigation. Each row is a status\n// dot + single-line truncated title + relative time (visible at rest). The\n// active session (from the URL) is highlighted with an accent bar.\nimport { t } from \"../../lib/console-text\";\nimport { useSessionListHintRefresh } from \"../../lib/use-session-list-hint-refresh\";\nimport { useSiteOpenedListener } from \"../../lib/site-opened\";\nimport { publishSiteSidebarBridge } from \"../../lib/site-sidebar-bridge\";\nimport { useOpenGeni } from \"../../../session-context\";\nimport { useChannels } from \"../../../hooks/use-channels\";\nimport { useSessionLineage } from \"../../../hooks/use-session-lineage\";\nimport { useWorkspaceSessions } from \"../../../hooks/use-workspace-sessions\";\nimport {\n emptySessionListDirtyScopes,\n invalidateSessionListScopes,\n sessionListGroupRevision,\n} from \"../../lib/session-list-dirty-scopes\";\nimport { SiteOriginLink } from \"../session/site-origin-link\";\nimport { sessionSiteOrigin, type SessionSiteOrigin } from \"../../lib/session-site-origin\";\nimport {\n readSiteRowDragPayload,\n SITE_DRAG_TYPE,\n SiteRowActionsContext,\n SiteSessionGroupHeading,\n type SiteRowActions,\n} from \"./site-session-group-heading\";\nimport {\n RAIL_ROW_OVERFLOW_TRIGGER_CLASS,\n RAIL_ROW_QUICK_ACTIONS_CLASS,\n RailRowQuickAction,\n} from \"./rail-row-quick-actions\";\nimport { SessionBrowseOrderControls } from \"./session-browse-order-controls\";\nimport {\n OpenGeniApiError,\n OpenGeniSessionListCursorError,\n type SessionListEntryResponse as SessionListResponse,\n} from \"@opengeni/sdk\";\nimport { Link, useNavigate, useRouterState } from \"../../lib/navigation\";\nimport {\n ArchiveIcon,\n ChevronRightIcon,\n EllipsisIcon,\n FolderIcon,\n FolderPlusIcon,\n ListFilterIcon,\n LockIcon,\n MailIcon,\n MailOpenIcon,\n MessagesSquareIcon,\n PencilIcon,\n UserRoundPenIcon,\n PinIcon,\n PlusIcon,\n SearchIcon,\n Trash2Icon,\n UsersIcon,\n LinkIcon,\n} from \"lucide-react\";\nimport { SessionAvatar } from \"../session/session-avatar\";\nimport { ProjectGlyph } from \"./project-glyph\";\nimport { ProjectProfileDialog } from \"./project-profile\";\nimport {\n SessionProfileEditorDialog,\n useCanEditSessionProfile,\n} from \"../session/session-profile-editor\";\nimport { toast } from \"../../lib/toast\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ComponentPropsWithoutRef,\n type MouseEvent,\n type DragEvent,\n type ReactNode,\n} from \"react\";\n\nimport { useRail } from \"./rail-context\";\nimport {\n ActiveWorkMark,\n RailTrailingMetadata,\n SessionRowContent,\n sessionRowAccessibleName,\n} from \"./session-row-content\";\nimport { SessionRowHoverDetails } from \"./session-row-hover-details\";\nexport { RailTrailingMetadata } from \"./session-row-content\";\nimport { isPersonalWorkspace } from \"../../lib/managed-self-context\";\nimport { sessionHoverDescription, sessionHoverFacts } from \"../../lib/session-hover-facts\";\nimport { Button } from \"../../../ui/button\";\nimport { ConfirmDialog } from \"../../../ui/confirm-dialog\";\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuTrigger,\n} from \"../../../ui/context-menu\";\nimport {\n DropdownMenu,\n DropdownMenuCheck,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from \"../../../ui/dropdown-menu\";\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from \"../../../ui/hover-card\";\nimport { ChannelCreateDialog, type ProjectAudience } from \"./channel-create-dialog\";\nimport { useCanLimitToMe } from \"../../lib/use-can-limit-to-me\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../../../ui/tooltip\";\nimport { useAppContext } from \"../../app-context\";\nimport {\n activeSessionContinuation,\n advanceSessionPageIdentity,\n applySessionArchiveProjection,\n compareSessionArchiveOrder,\n authoritativeSessionContinuationChannels,\n emptySessionContinuation,\n mergeSessionContinuation,\n projectSessionArchiveMembership,\n rebaseSessionContinuation,\n reconcileRetainedSessionContinuationChannel,\n sessionPageKey,\n} from \"../../lib/session-pagination\";\nimport {\n sessionMatchesPaginationGroup,\n sessionPaginationGroupQuery,\n sessionPaginationProjectGroup,\n type SessionPaginationBrowseFilter,\n type SessionPaginationGroup,\n} from \"../../lib/session-group-pagination\";\nimport {\n SESSION_GROUP_VISIBLE_STEP,\n planSessionGroupFill,\n sameSessionGroupFill,\n sessionGroupDisclosurePlan,\n sessionGroupWindowNodes,\n type SessionGroupFillCandidate,\n} from \"../../lib/session-group-window\";\nimport {\n readSessionGroupWindows,\n sessionGroupWindowMemoryId,\n writeSessionGroupWindows,\n} from \"../../lib/session-group-window-memory\";\nimport { pinLiveAnnouncement } from \"../../lib/pin-live-announcement\";\nimport { analyticsAction } from \"../../../ui/analytics-actions\";\nimport { countNeedsYou, filterNeedsYou } from \"../../lib/needs-you\";\nimport {\n SESSION_TITLE_MAX_LENGTH,\n sessionDisplayTitle,\n useInlineRename,\n} from \"../../lib/session-rename\";\nimport {\n applySessionChannelMove,\n beginSessionChannelMove,\n commitSessionChannelMove,\n discardRejectedSessionChannelMove,\n readSessionChannelMovePoint,\n reconcileSessionChannelMovePointRead,\n reconcileSessionChannelMoves,\n rollbackSessionChannelMove,\n type SessionChannelMoveOverrides,\n} from \"../../lib/session-channel-move\";\nimport {\n MAX_VISUAL_TREE_DEPTH,\n defaultExpandedAncestors,\n sessionAncestorPath,\n sessionStateLabel,\n sessionInputWait,\n visualTreeDepth,\n} from \"../../lib/session-rail\";\nimport { sessionAutomationWaitWords } from \"../../../components/automations/automation-model\";\nimport {\n cancelSessionRowRevealIntent,\n consumeSessionRowRevealIntent,\n requestSessionComposerFocus,\n sessionFocusAttribute,\n shouldRecordSessionRowFocusIntent,\n shouldMoveSessionRowFocus,\n shouldRestoreSessionFocus,\n createSessionFocusCompletion,\n type SessionFocusTarget,\n} from \"../../lib/session-focus\";\nimport {\n applySessionChannelProjection,\n applySessionPinProjection,\n applySessionRailProjection,\n subscribeToSessionPinChanges,\n} from \"../../lib/session-pins\";\nimport {\n applySessionAttentionProjections,\n localSessionDeliveryAttentionCounts,\n latestSessionAttentionProjection,\n notifySessionAttentionChanged,\n subscribeToLocalSessionDeliveryAttention,\n subscribeToSessionAttentionChanges,\n type SessionAttentionProjection,\n} from \"../../lib/session-attention\";\nimport {\n buildPinnedRailSections,\n channelRailSections,\n groupSessionForestForBrowse,\n sortSessionForest,\n compareSessionBrowse,\n projectRailSessions,\n groupSessionsForRail,\n mergeSessionForRail,\n parseSiteRowKey,\n relativeTimeLabel,\n siteRowKey,\n sessionBrowseResultCount,\n selectedDescendantNode,\n siteRowConversationCount,\n sessionCreatorLabelMap,\n visibleForestRows,\n visibleTreeRows,\n summarizeRailNodes,\n summarizeRailRow,\n summarizeRailStatusCounts,\n sessionProjectTotals,\n type RailStatusCounts,\n SESSION_GROUP_LABELS,\n SESSION_GROUP_ORDER,\n type RailAggregateStatus,\n type SessionTreeNode,\n type SessionForest,\n type SessionRecencyGroup,\n} from \"../../lib/sessions-group\";\nimport { railRouteSelection } from \"../../lib/routes\";\nimport {\n readSessionBrowsePreferences,\n DEFAULT_SESSION_BROWSE_PREFERENCES,\n sessionBrowsePreferencesCustomized,\n type SessionBrowsePreferences,\n sessionBrowsePreferenceStorageId,\n useCollapsedSessionSections,\n writeSessionBrowsePreferences,\n} from \"../../lib/session-browse-preferences\";\nimport { railRowCreator } from \"../../lib/creator-initials\";\nimport { formatWaitingSince } from \"../../lib/format\";\nimport {\n sessionDescendantCountAria,\n sessionDescendantCountText,\n} from \"../../lib/session-tree-count\";\nimport { requestCreateComposerFocus } from \"../../lib/create-composer-focus\";\nimport {\n notifySessionListChanged,\n subscribeToWorkspaceSessionListChanges,\n} from \"../../lib/session-list-invalidation\";\nimport {\n authoritativeSessionBranchChannels,\n beginSessionBranchRequest,\n commitSessionBranchPage,\n readLoadedSessionBranchWindow,\n failSessionBranchRequest,\n sessionBranchNeedsHydration,\n sessionBranchSummaryKey,\n sessionBranchSummaryDecision,\n upsertSessionBranchChild,\n type SessionBranchPage,\n} from \"../../lib/session-branch-cache\";\nimport { cn } from \"../../lib/utils\";\nimport type { Channel, Session as SessionDetails } from \"../../types\";\nimport type { UpdateChannelRequest } from \"@opengeni/sdk\";\nimport type { RailSession as Session } from \"../../lib/session-list-entry\";\nimport { useUiEventTarget } from \"../../lib/ui-events\";\nimport { useActionShortcut } from \"../../lib/actions/actions-provider\";\nimport { chordLabel, currentPlatform } from \"../../lib/actions/chords\";\nimport { useHeldModifier } from \"../../lib/actions/held-modifier\";\nimport { requestCommandMenu } from \"../../lib/actions/events\";\nimport {\n readChatDirectory,\n rememberChats,\n setSidebarOrder,\n} from \"../../lib/actions/chat-directory\";\nimport { rememberSidebarSites } from \"../../lib/actions/site-directory\";\nimport { useChatOperations } from \"../../lib/actions/chat-operations\";\nimport { TooltipWithKeys } from \"../command-menu/keycaps\";\nimport { userErrorText } from \"../../../ui/api-error\";\n\n/** True when the browser should own navigation (new tab / window / modified click). */\nfunction isModifiedNavigationClick(\n event: Pick<MouseEvent, \"metaKey\" | \"ctrlKey\" | \"shiftKey\" | \"altKey\" | \"button\">,\n): boolean {\n return event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0;\n}\n\n/**\n * Composer / sessions-index entry — real link so Cmd/Ctrl-click opens a new tab.\n * It takes anchor props and a ref, so a tooltip trigger or `Button asChild` can\n * wrap it.\n */\nexport const NewSessionLink = /* @__PURE__ */ forwardRef<\n HTMLAnchorElement,\n Omit<ComponentPropsWithoutRef<\"a\">, \"href\" | \"children\"> & {\n channelId?: string | null | undefined;\n children: ReactNode;\n }\n>(function NewSessionLink({ channelId, children, onClick, ...anchor }, ref) {\n const windowEvents = useUiEventTarget(\"window\");\n const newChatShortcut = useActionShortcut(\"chat.new\");\n const rail = useRail();\n const context = useAppContext();\n return (\n <Link\n {...anchor}\n ref={ref}\n to=\"/workspaces/$workspaceId/sessions\"\n params={{ workspaceId: rail.workspaceId }}\n search={channelId === undefined ? {} : { channelId: channelId ?? \"default\" }}\n aria-keyshortcuts={newChatShortcut?.ariaKeys}\n {...analyticsAction(\"new_session\")}\n onClick={(event) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n if (isModifiedNavigationClick(event)) return;\n context.resetSessionView();\n rail.setDrawerOpen(false);\n // Same-route Link may not remount the index or rerun search-keyed effects.\n queueMicrotask(() => requestCreateComposerFocus(windowEvents, channelId));\n }}\n >\n {children}\n </Link>\n );\n});\n\ntype RenameFn = (\n workspaceId: string,\n sessionId: string,\n title: string,\n) => Promise<SessionDetails | null>;\ntype PinFn = (\n session: Session,\n pinned: boolean,\n restoreFocusTo?: SessionFocusTarget,\n) => Promise<Session | null>;\ntype MoveToChannelFn = (\n session: Session,\n channelId: string | null,\n restoreFocusTo?: SessionFocusTarget,\n) => Promise<void>;\nconst SESSION_DRAG_TYPE = \"application/x-opengeni-session\";\nconst PROJECT_DRAG_TYPE = \"application/x-opengeni-project\";\ntype UpdateAttentionFn = (\n session: Session,\n update: { unread?: boolean; activelyWorking?: boolean },\n) => Promise<void>;\ntype ArchiveFn = (\n session: Session,\n archived: boolean,\n restoreFocusTo?: SessionFocusTarget,\n) => Promise<void>;\ntype RequestDeleteFn = (session: Session) => void;\ntype PinOverride = { session: Session; operation: number };\ntype PendingSessionFocus = {\n sessionId: string;\n operation: number;\n target: SessionFocusTarget;\n action?: \"archive\" | undefined;\n settled: boolean;\n};\ntype ChildPageState = SessionBranchPage<Session>;\n\nconst EMPTY_SESSION_IDS: ReadonlySet<string> = new Set();\nconst ARCHIVED_SESSION_GROUP: SessionPaginationGroup = {\n key: \"archived\",\n label: \"Archived\",\n kind: \"archived\",\n};\n\nfunction findSessionTreeNode(\n nodes: readonly SessionTreeNode[],\n sessionId: string | null,\n): SessionTreeNode | null {\n if (!sessionId) return null;\n for (const node of nodes) {\n if (node.session.id === sessionId) return node;\n const child = findSessionTreeNode(node.children, sessionId);\n if (child) return child;\n }\n return null;\n}\n\nexport function SessionList() {\n const windowEvents = useUiEventTarget(\"window\");\n const rail = useRail();\n const context = useAppContext();\n const { workspaceSessionListEvent, workspaceControlEvent } = useOpenGeni();\n const listHintsAvailable =\n workspaceSessionListEvent?.workspaceId === rail.workspaceId &&\n workspaceSessionListEvent.available;\n const [dirtyScopes, setDirtyScopes] = useState(emptySessionListDirtyScopes);\n const knownListSessions = useRef<ReadonlyMap<string, Session>>(new Map());\n useEffect(() => setDirtyScopes(emptySessionListDirtyScopes()), [rail.workspaceId]);\n const sessionClient = context.client;\n const setContextSession = context.setSession;\n const navigate = useNavigate();\n const activeSessionId = useRouterState({\n select: (state): string | null => railRouteSelection(state.location).sessionId,\n });\n // The Site view marks its Site row, or the conversation open beside it.\n const activeSiteId = useRouterState({\n select: (state): string | null => railRouteSelection(state.location).siteId,\n });\n const [documentForeground, setDocumentForeground] = useState(() =>\n Boolean(document.visibilityState === \"visible\" && document.hasFocus()),\n );\n useEffect(() => {\n const reconcileDocumentForeground = () => {\n setDocumentForeground(document.visibilityState === \"visible\" && document.hasFocus());\n };\n window.addEventListener(\"focus\", reconcileDocumentForeground);\n window.addEventListener(\"blur\", reconcileDocumentForeground);\n document.addEventListener(\"visibilitychange\", reconcileDocumentForeground);\n return () => {\n window.removeEventListener(\"focus\", reconcileDocumentForeground);\n window.removeEventListener(\"blur\", reconcileDocumentForeground);\n document.removeEventListener(\"visibilitychange\", reconcileDocumentForeground);\n };\n }, []);\n // Poll so running sessions surface and move to the top without a manual\n // refresh; the previous index relied on a one-shot load.\n const [searchDraft, setSearchDraft] = useState(\"\");\n const openSearchDialog = useCallback(() => requestCommandMenu(windowEvents), [windowEvents]);\n const searchShortcut = useActionShortcut(\"commandMenu.open\");\n const [search, setSearch] = useState(\"\");\n const browsePreferenceStorageId = useMemo(\n () => sessionBrowsePreferenceStorageId(context.accessContext.subjectId, rail.workspaceId),\n [context.accessContext.subjectId, rail.workspaceId],\n );\n const previousBrowsePreferenceStorageId = useRef(browsePreferenceStorageId);\n const [browsePreferences, setBrowsePreferences] = useState(() =>\n readSessionBrowsePreferences(browsePreferenceStorageId),\n );\n const {\n groupBy: browseGroupBy,\n sortBy: browseSortBy,\n status: browseStatusPreference,\n mineOnly,\n showEmptyGroups,\n } = browsePreferences;\n // Attention filtering belongs before pagination, including project windows.\n const needsYouOnly = browseStatusPreference === \"needs-you\";\n const browseStatus: \"active\" | \"archived\" | \"all\" = needsYouOnly\n ? \"active\"\n : browseStatusPreference;\n useEffect(() => {\n if (previousBrowsePreferenceStorageId.current === browsePreferenceStorageId) return;\n previousBrowsePreferenceStorageId.current = browsePreferenceStorageId;\n setBrowsePreferences(readSessionBrowsePreferences(browsePreferenceStorageId));\n }, [browsePreferenceStorageId]);\n const updateBrowsePreferences = useCallback(\n (patch: Partial<SessionBrowsePreferences>) => {\n setBrowsePreferences((current) => {\n const next = { ...current, ...patch };\n writeSessionBrowsePreferences(browsePreferenceStorageId, next);\n return next;\n });\n },\n [browsePreferenceStorageId],\n );\n useEffect(() => {\n const timer = window.setTimeout(() => setSearch(searchDraft.trim()), 200);\n return () => window.clearTimeout(timer);\n }, [searchDraft]);\n // Search is the one intentionally flat projection: it can surface a match\n // from anywhere in a workstream. Sorting and filtering still operate on\n // root workstreams and preserve their expandable descendant hierarchy.\n const hierarchyMode = search.length === 0;\n const channelMode = browseGroupBy === \"project\";\n const clearBrowseControls = useCallback(() => {\n updateBrowsePreferences(DEFAULT_SESSION_BROWSE_PREFERENCES);\n }, [updateBrowsePreferences]);\n const updateSearchDraft = useCallback((value: string) => {\n setSearchDraft(value);\n }, []);\n\n const rootPage = useWorkspaceSessions({\n projection: \"summary\",\n // Project windows are fetched independently. Keep discovery to one display\n // step instead of hydrating hidden workstreams a second time.\n limit:\n channelMode && hierarchyMode && browseStatus !== \"archived\" ? SESSION_GROUP_VISIBLE_STEP : 50,\n // Filtered root pins carry exact attention membership beyond treeStats' cap.\n // The separate global pin read still owns the complete shortcut section.\n includePinned: needsYouOnly || !hierarchyMode,\n includeTotals: hierarchyMode && browseStatus !== \"archived\",\n needsYouOnly,\n mineOnly,\n search,\n ...(hierarchyMode ? { parentSessionId: null } : {}),\n // Sites are rows of their own: their conversations nest under them and\n // arrive as complete Site rows. Search and Archived list them as rows.\n siteConversations: hierarchyMode && browseStatus !== \"archived\" ? \"group\" : \"include\",\n archiveStatus: browseStatus,\n ...(browseStatus === \"archived\" ? {} : { sortBy: browseSortBy }),\n pollIntervalMs: listHintsAvailable ? undefined : 15_000,\n beginRead: context.sessionChannelProjectionAuthority.beginRead,\n });\n // Pins are shortcuts and may point anywhere in a workstream. Fetch their\n // complete global section separately from the root-only hierarchy page; a\n // pinned child must never make either it or its descendants disappear from\n // the actual tree.\n const globalPinPage = useWorkspaceSessions({\n projection: \"summary\",\n limit: 1,\n pinsOnly: true,\n siteConversations: \"include\",\n includeTotals: !hierarchyMode || browseStatus === \"archived\",\n pollIntervalMs: listHintsAvailable ? undefined : 15_000,\n beginRead: context.sessionChannelProjectionAuthority.beginRead,\n });\n // Channel edits send a full reconciliation hint. Older servers retain the\n // existing gentle fallback poll.\n const channelsQuery = useChannels({ pollIntervalMs: listHintsAvailable ? undefined : 60_000 });\n const refreshChannels = channelsQuery.refresh;\n const channels = channelsQuery.channels;\n const {\n create: requestCreateChannel,\n update: updateProject,\n remove: removeProject,\n reorder: reorderProjects,\n } = channelsQuery;\n const [channelDialogOpen, setChannelDialogOpen] = useState(false);\n const [channelNameDraft, setChannelNameDraft] = useState(\"\");\n const [channelAudienceDraft, setChannelAudienceDraft] = useState<ProjectAudience>(\"workspace\");\n // Only me projects are offered only where this person may make Only me work:\n // never in a Personal workspace, where everything is theirs anyway.\n const personalRailWorkspace = isPersonalWorkspace(\n context.workspaces?.find((workspace) => workspace.id === rail.workspaceId) ?? null,\n null,\n );\n const canMakeOnlyMeProject = useCanLimitToMe(\n context.client,\n rail.workspaceId,\n channelDialogOpen && !personalRailWorkspace,\n );\n const [projectPendingEdit, setProjectPendingEdit] = useState<Channel | null>(null);\n const [projectPendingDelete, setProjectPendingDelete] = useState<Channel | null>(null);\n const [projectPendingShare, setProjectPendingShare] = useState<Channel | null>(null);\n const [sessionPendingDelete, setSessionPendingDelete] = useState<Session | null>(null);\n const [draggedProjectId, setDraggedProjectId] = useState<string | null>(null);\n const [dragOverProjectId, setDragOverProjectId] = useState<string | null>(null);\n const {\n sessions,\n nextCursor,\n loading,\n error,\n readRevision: rootReadRevision,\n readGeneration: rootReadGeneration,\n refresh,\n } = rootPage;\n const {\n pinned: globalPinned,\n loading: globalPinsLoading,\n error: globalPinsError,\n pinnedTruncated: globalPinsTruncated,\n readGeneration: globalPinsReadGeneration,\n refresh: refreshGlobalPins,\n } = globalPinPage;\n const pinned = hierarchyMode ? globalPinned : rootPage.pinned;\n const pinnedTruncated = hierarchyMode ? globalPinsTruncated : rootPage.pinnedTruncated;\n // The hierarchy and its global pinned shortcuts come from separate queries.\n // Every invalidation must refresh both or a pin changed in another tab/device\n // can disappear from the shortcut section until the next polling interval.\n const refreshSessionPages = useCallback(\n async (sessionIds: string[] | null = null) => {\n // Cross-document invalidations must not restart suspended list polling.\n // Visibility/focus reconciliation below re-reads durable state on return.\n if (document.visibilityState === \"hidden\") return;\n setDirtyScopes((current) =>\n invalidateSessionListScopes(current, sessionIds, knownListSessions.current),\n );\n await Promise.all([\n refresh(),\n refreshGlobalPins(),\n ...(sessionIds === null ? [refreshChannels()] : []),\n ]);\n },\n [refresh, refreshGlobalPins, refreshChannels],\n );\n // Opening a Site moves its row: only the grouped root page carries Site rows.\n const refreshSiteRows = useCallback(\n (siteId: string) => {\n // Opening a Site brings it back to the sidebar after an archive.\n setArchivedSiteIds((current) => {\n if (!current.has(siteId)) return current;\n const next = new Set(current);\n next.delete(siteId);\n return next;\n });\n void refresh();\n },\n [refresh],\n );\n useSiteOpenedListener(\n rail.workspaceId,\n refreshSiteRows,\n hierarchyMode && browseStatus !== \"archived\",\n );\n useEffect(() => {\n if (workspaceSessionListEvent?.workspaceId !== rail.workspaceId) return;\n if (!workspaceSessionListEvent.available) return;\n const { sessionIds, siteSessionIds = [] } = workspaceSessionListEvent;\n // A Site conversation the rail has not loaded sits in a collapsed Site\n // row, whose summary arrives with the root page this always re-reads.\n // Only loaded ones dirty their own branch; none forces a full reload.\n void refreshSessionPages(\n sessionIds === null\n ? null\n : [...sessionIds, ...siteSessionIds.filter((id) => knownListSessions.current.has(id))],\n );\n }, [workspaceSessionListEvent, rail.workspaceId, refreshSessionPages]);\n useEffect(() => {\n if (workspaceControlEvent) void refreshSessionPages();\n }, [workspaceControlEvent, refreshSessionPages]);\n // Ordinary rows page independently of the complete pinned section. The\n // polled hook owns the shared discovery page. Projects share a workspace\n // continuation; filtered browsing and Archived retain their own cursors.\n const paginationDate = new Date();\n const paginationKey = sessionPageKey(\n rail.workspaceId,\n [\n search,\n hierarchyMode ? \"tree\" : \"search\",\n browseGroupBy,\n browseSortBy,\n browseStatusPreference,\n [paginationDate.getFullYear(), paginationDate.getMonth() + 1, paginationDate.getDate()].join(\n \"-\",\n ),\n ].join(\"\\n\"),\n );\n const paginationIdentity = useRef({ key: paginationKey, generation: 0 });\n paginationIdentity.current = advanceSessionPageIdentity(\n paginationIdentity.current,\n paginationKey,\n );\n const pageGeneration = paginationIdentity.current.generation;\n // Manual Show more windows survive leaving the rail (for example Settings)\n // in this tab. Each person/workspace remembers the current view only.\n const groupWindowMemoryId = sessionGroupWindowMemoryId(\n context.accessContext.subjectId,\n rail.workspaceId,\n );\n const restoredGroupWindows = useMemo(\n () => readSessionGroupWindows(groupWindowMemoryId, paginationKey),\n [groupWindowMemoryId, paginationKey],\n );\n const [groupWindows, setGroupWindows] = useState<{\n generation: number;\n memoryId: string;\n counts: ReadonlyMap<string, number>;\n }>(() => ({ generation: -1, memoryId: \"\", counts: new Map() }));\n const activeGroupWindows =\n groupWindows.generation === pageGeneration && groupWindows.memoryId === groupWindowMemoryId\n ? groupWindows.counts\n : restoredGroupWindows;\n useEffect(() => {\n if (groupWindows.generation !== pageGeneration) return;\n if (groupWindows.memoryId !== groupWindowMemoryId) return;\n writeSessionGroupWindows(groupWindowMemoryId, paginationKey, groupWindows.counts);\n }, [groupWindowMemoryId, groupWindows, pageGeneration, paginationKey]);\n // Extra rows that use spare rail height, planned from measured layout.\n // Manual disclosure (groupWindows) stacks on top of this fill.\n const [groupFill, setGroupFill] = useState<{\n generation: number;\n counts: ReadonlyMap<string, number>;\n }>(() => ({ generation: pageGeneration, counts: new Map() }));\n const fillCountForGroup = useCallback(\n (key: string) =>\n (groupFill.generation === pageGeneration ? groupFill.counts.get(key) : undefined) ?? 0,\n [groupFill, pageGeneration],\n );\n const [archiveWindowReductions, setArchiveWindowReductions] = useState<{\n generation: number;\n counts: ReadonlyMap<string, number>;\n }>({ generation: -1, counts: new Map() });\n const archiveFillFreeze = useRef<{ generation: number; height: number } | null>(null);\n const archiveReduction = useCallback(\n (key: string) =>\n archiveWindowReductions.generation === pageGeneration\n ? (archiveWindowReductions.counts.get(key) ?? 0)\n : 0,\n [archiveWindowReductions, pageGeneration],\n );\n const baseCountForGroup = useCallback(\n (key: string) => activeGroupWindows.get(key) ?? SESSION_GROUP_VISIBLE_STEP,\n [activeGroupWindows],\n );\n const visibleCountForGroup = useCallback(\n (key: string) =>\n Math.max(0, baseCountForGroup(key) + fillCountForGroup(key) - archiveReduction(key)),\n [baseCountForGroup, fillCountForGroup, archiveReduction],\n );\n const visibleNodesForGroup = useCallback(\n (key: string, nodes: SessionTreeNode[]) =>\n search\n ? nodes\n : sessionGroupWindowNodes(\n nodes,\n visibleCountForGroup(key),\n activeSessionId,\n archiveReduction(key) > 0 ? 0 : SESSION_GROUP_VISIBLE_STEP,\n ),\n [activeSessionId, search, visibleCountForGroup, archiveReduction],\n );\n const [archiveFolder, setArchiveFolder] = useState({\n generation: pageGeneration,\n expanded: browseStatus === \"archived\",\n });\n const archiveExpanded =\n archiveFolder.generation === pageGeneration\n ? archiveFolder.expanded\n : browseStatus === \"archived\";\n const [groupContinuations, setGroupContinuations] = useState<\n ReadonlyMap<string, ReturnType<typeof emptySessionContinuation>>\n >(() => new Map());\n const groupContinuationsRef = useRef(groupContinuations);\n groupContinuationsRef.current = groupContinuations;\n const activeGroupContinuations = useMemo(\n () =>\n [...groupContinuations].map(\n ([key, state]) => [key, activeSessionContinuation(state, pageGeneration)] as const,\n ),\n [groupContinuations, pageGeneration],\n );\n const [archiveOverrides, setArchiveOverrides] = useState<\n ReadonlyMap<string, { session: Session; completedGeneration: number }>\n >(() => new Map());\n const archiveMembershipEvidence = useMemo(() => {\n const evidence = new Map([...archiveOverrides].map(([id, receipt]) => [id, receipt.session]));\n // A retained first page can overlap a newer continuation. Preserve its\n // versioned archive decision separately from whole-row merge priority;\n // channel membership still follows its independent read authority below.\n const continuationSessions = activeGroupContinuations.flatMap(\n ([, continuation]) => continuation.sessions,\n );\n for (const session of [...sessions, ...continuationSessions]) {\n const previous = evidence.get(session.id);\n if (!previous || (session.archiveVersion ?? 0) > (previous.archiveVersion ?? 0)) {\n evidence.set(session.id, session);\n }\n }\n return evidence;\n }, [activeGroupContinuations, archiveOverrides, sessions]);\n const archiveReadEvidence = useMemo(() => {\n const rowReadGenerations = new Map<string, number>();\n for (const [, continuation] of activeGroupContinuations) {\n for (const [id, generation] of continuation.channelGenerations) {\n rowReadGenerations.set(id, Math.max(rowReadGenerations.get(id) ?? 0, generation));\n }\n }\n for (const session of sessions) {\n // The shared first page can predate an accepted overlapping continuation.\n // Preserve the newest membership proof for each row, not source priority.\n rowReadGenerations.set(\n session.id,\n Math.max(rowReadGenerations.get(session.id) ?? 0, rootReadGeneration),\n );\n }\n return {\n rowReadGenerations,\n completedGenerations: new Map(\n [...archiveOverrides].map(([id, receipt]) => [id, receipt.completedGeneration]),\n ),\n };\n }, [activeGroupContinuations, archiveOverrides, rootReadGeneration, sessions]);\n useEffect(() => {\n setArchiveOverrides(new Map());\n }, [rail.workspaceId]);\n const extraSessions = useMemo(() => {\n const rows = new Map<string, Session>();\n for (const [, continuation] of activeGroupContinuations) {\n for (const session of continuation.sessions) rows.set(session.id, session);\n }\n return [...rows.values()];\n }, [activeGroupContinuations]);\n const authoritativeExtraSessionEvidence = useMemo(\n () =>\n activeGroupContinuations.flatMap(([, continuation]) =>\n authoritativeSessionContinuationChannels(\n continuation,\n pageGeneration,\n rootReadRevision,\n rootReadGeneration,\n ),\n ),\n [activeGroupContinuations, pageGeneration, rootReadGeneration, rootReadRevision],\n );\n const deletedRootIds = useRef(new Set<string>());\n useEffect(() => {\n deletedRootIds.current.clear();\n }, [rail.workspaceId]);\n const groupLoadAttempts = useRef(new Map<string, number>());\n const groupLoadingRef = useRef(new Map<string, number>());\n const groupRefreshing = useRef(new Set<string>());\n const [groupLoadingGenerations, setGroupLoadingGenerations] = useState<\n ReadonlyMap<string, number>\n >(() => new Map());\n const [announcement, setAnnouncement] = useState(\"\");\n const pinAnnouncementSequence = useRef(0);\n const announcePinResult = useCallback((message: string) => {\n pinAnnouncementSequence.current += 1;\n setAnnouncement(pinLiveAnnouncement(message, pinAnnouncementSequence.current));\n }, []);\n const [childPages, setChildPages] = useState<ReadonlyMap<string, ChildPageState>>(\n () => new Map(),\n );\n const childPagesRef = useRef(childPages);\n childPagesRef.current = childPages;\n const childLoadEpoch = useRef(0);\n const childRequestSequence = useRef(0);\n const branchSummaryKeys = useRef(new Map<string, string>());\n const activeBranchHydration = useRef<string | null>(null);\n useEffect(() => {\n childLoadEpoch.current += 1;\n branchSummaryKeys.current.clear();\n activeBranchHydration.current = null;\n setChildPages(new Map());\n // Site rows list root conversations, so the root filters scope them too.\n }, [rail.workspaceId, hierarchyMode, browseSortBy, browseStatus, needsYouOnly, mineOnly]);\n // Short-lived optimistic projections only. The page returned by the server\n // remains canonical; after each mutation we replace the projection with that\n // returned row and refresh once to reconcile tabs/devices/offline recovery.\n // Site rows: this person's pins in flight, and Sites archived from this rail\n // (kept until restored or opened, so a loaded conversation never rebuilds\n // the hidden row).\n const [sitePinOverrides, setSitePinOverrides] = useState<\n ReadonlyMap<string, { pinned: boolean; pinnedAt: string | null; operation: number }>\n >(() => new Map());\n const [archivedSiteIds, setArchivedSiteIds] = useState<ReadonlySet<string>>(() => new Set());\n // Site rows moved to another project, keyed by Site and source project,\n // shown at once while the move is in flight; the next read confirms it.\n const [siteMoveOverrides, setSiteMoveOverrides] = useState<\n ReadonlyMap<string, { channelId: string | null; operation: number }>\n >(() => new Map());\n const siteArchivesInFlight = useRef(new Map<string, number>());\n // A Site the server lists again was restored (here or elsewhere): stop\n // hiding it, unless this rail is still archiving it.\n useEffect(() => {\n const listed = rootPage.siteGroups;\n if (!listed) return;\n const listedIds = new Set(listed.map((group) => group.siteId));\n setArchivedSiteIds((current) => {\n let next: Set<string> | null = null;\n for (const siteId of current) {\n if (!listedIds.has(siteId) || siteArchivesInFlight.current.has(siteId)) continue;\n next ??= new Set(current);\n next.delete(siteId);\n }\n return next ?? current;\n });\n }, [rootPage.siteGroups]);\n const [pinOverrides, setPinOverrides] = useState<ReadonlyMap<string, PinOverride>>(\n () => new Map(),\n );\n const [channelMoveOverrides, setChannelMoveOverrides] = useState<SessionChannelMoveOverrides>(\n () => new Map(),\n );\n const acceptedChannelReadRevision = useSyncExternalStore(\n context.sessionChannelProjectionAuthority.subscribe,\n context.sessionChannelProjectionAuthority.getRevision,\n context.sessionChannelProjectionAuthority.getRevision,\n );\n useEffect(\n () =>\n context.sessionChannelProjectionAuthority.subscribe((accepted) => {\n if (!accepted) return;\n if (accepted.workspaceId !== rail.workspaceId) return;\n setChannelMoveOverrides((current) => {\n const override = current.get(accepted.id);\n return override?.committed\n ? reconcileSessionChannelMovePointRead(\n current,\n accepted.id,\n override.operation,\n accepted,\n )\n : current;\n });\n // The route records an exact read before merging its full detail\n // projection. Apply the accepted channel immediately so that merge\n // cannot preserve an older committed move owner in the same batch.\n setContextSession((current) => applySessionChannelProjection(current, accepted));\n }),\n [context.sessionChannelProjectionAuthority, rail.workspaceId, setContextSession],\n );\n const [archiveTransitions, setArchiveTransitions] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n const [attentionOverrides, setAttentionOverrides] = useState<\n ReadonlyMap<string, SessionAttentionProjection>\n >(() => new Map());\n const [localDeliveryAttention, setLocalDeliveryAttention] = useState<ReadonlyMap<string, number>>(\n () => localSessionDeliveryAttentionCounts(rail.workspaceId),\n );\n useEffect(() => {\n const refreshLocalDeliveryAttention = () => {\n setLocalDeliveryAttention(localSessionDeliveryAttentionCounts(rail.workspaceId));\n };\n refreshLocalDeliveryAttention();\n return subscribeToLocalSessionDeliveryAttention(refreshLocalDeliveryAttention);\n }, [rail.workspaceId]);\n const archivedWindowRows = useRef(new Map<string, string[]>());\n useEffect(() => {\n archivedWindowRows.current.clear();\n }, [pageGeneration]);\n const preserveArchiveWindow = useCallback(\n (sessionId: string, archived: boolean, capturedKeys?: string[]) => {\n if (archived && archivedWindowRows.current.has(sessionId)) return;\n const keys = archived\n ? (capturedKeys ??\n fillTargetsRef.current\n .filter((target) => target.visibleSessionIds.includes(sessionId))\n .map((target) => target.key))\n : (archivedWindowRows.current.get(sessionId) ?? []);\n if (archived) archivedWindowRows.current.set(sessionId, keys);\n else archivedWindowRows.current.delete(sessionId);\n if (keys.length === 0) return;\n const height = listRef.current?.closest<HTMLElement>(\n \"[data-rail-scroll-viewport]\",\n )?.clientHeight;\n if (height !== undefined) archiveFillFreeze.current = { generation: pageGeneration, height };\n setArchiveWindowReductions((current) => {\n const counts = new Map(current.generation === pageGeneration ? current.counts : []);\n for (const key of keys)\n counts.set(key, Math.max(0, (counts.get(key) ?? 0) + (archived ? 1 : -1)));\n return { generation: pageGeneration, counts };\n });\n },\n [pageGeneration],\n );\n const archiving = useRef(new Set<string>());\n useEffect(\n () =>\n subscribeToWorkspaceSessionListChanges(rail.workspaceId, (invalidation) => {\n // The archive callback below already awaits this refresh while holding\n // its optimistic transition. Other mounted producers, including For\n // You Dismiss/Stop, need the same prompt re-read immediately.\n if (archiving.current.has(invalidation.sessionId)) return;\n if (invalidation.archived !== undefined)\n preserveArchiveWindow(invalidation.sessionId, invalidation.archived);\n void refreshSessionPages();\n }),\n [rail.workspaceId, refreshSessionPages, preserveArchiveWindow],\n );\n const moveRequestOwner = useRef({});\n const pinOperation = useRef(0);\n const focusRestoreOperation = useRef(0);\n const pinning = useRef(new Set<string>());\n const listRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const viewport = listRef.current?.closest(\"[data-rail-scroll-viewport]\");\n if (!viewport) return;\n const cancelReveal = () => cancelSessionRowRevealIntent(rowRevealIntent);\n viewport.addEventListener(\"wheel\", cancelReveal, { passive: true });\n viewport.addEventListener(\"touchstart\", cancelReveal, { passive: true });\n viewport.addEventListener(\"pointerdown\", cancelReveal);\n return () => {\n viewport.removeEventListener(\"wheel\", cancelReveal);\n viewport.removeEventListener(\"touchstart\", cancelReveal);\n viewport.removeEventListener(\"pointerdown\", cancelReveal);\n };\n }, []);\n const pendingSessionFocus = useRef<PendingSessionFocus | null>(null);\n const [focusRestoreRevision, setFocusRestoreRevision] = useState(0);\n const channelMoveProbes = useRef(\n new Map<string, { operation: number; promise: Promise<void> }>(),\n );\n const rootChannelProjectionOwner = useRef({});\n const continuationChannelProjectionOwner = useRef({});\n const branchChannelProjectionOwner = useRef({});\n const pinsChannelProjectionOwner = useRef({});\n const lineageChannelProjectionOwner = useRef({});\n const moveChannelProjectionOwner = useRef({});\n const activeLineage = useSessionLineage(context.session?.id ?? null, {\n pollIntervalMs: listHintsAvailable ? undefined : 30_000,\n beginRead: context.sessionChannelProjectionAuthority.beginRead,\n });\n const lineageDirtyRevision = Math.max(\n dirtyScopes.all,\n dirtyScopes.branches.get(context.session?.rootSessionId ?? context.session?.id ?? \"\") ?? 0,\n );\n const refreshLineage = activeLineage.refresh;\n useEffect(() => {\n if (listHintsAvailable && lineageDirtyRevision > 0) void refreshLineage();\n }, [listHintsAvailable, lineageDirtyRevision, refreshLineage]);\n const lineageChannelAuthoritySessions = useMemo(\n () => activeLineage.lineage?.ancestors ?? [],\n [activeLineage.lineage?.ancestors],\n );\n const loadedChildren = useMemo(\n () => [...childPages.values()].flatMap((page) => page.sessions),\n [childPages],\n );\n const loadedChildChannelEvidence = useMemo(\n () => [...childPages.values()].flatMap(authoritativeSessionBranchChannels),\n [childPages],\n );\n const pinnedChannelReadGeneration = hierarchyMode ? globalPinsReadGeneration : rootReadGeneration;\n const currentListChannelEvidence = useMemo(() => {\n void acceptedChannelReadRevision;\n const evidence = new Map<string, readonly [session: Session, readGeneration: number]>();\n const add = (candidates: readonly Session[], readGeneration: number) => {\n for (const session of candidates) {\n const current = evidence.get(session.id);\n if (!current || readGeneration >= current[1]) {\n evidence.set(session.id, [session, readGeneration]);\n }\n }\n };\n for (const [session, readGeneration] of authoritativeExtraSessionEvidence) {\n add([session], readGeneration);\n }\n add(sessions, rootReadGeneration);\n add(pinned, pinnedChannelReadGeneration);\n for (const [session, readGeneration] of loadedChildChannelEvidence) {\n add([session], readGeneration);\n }\n return evidence;\n }, [\n acceptedChannelReadRevision,\n authoritativeExtraSessionEvidence,\n loadedChildChannelEvidence,\n pinned,\n pinnedChannelReadGeneration,\n rootReadGeneration,\n sessions,\n ]);\n const listedSessions = useMemo(() => {\n const source = new Map<string, Session>();\n for (const session of [...extraSessions, ...sessions, ...loadedChildren, ...pinned]) {\n const current = source.get(session.id);\n source.set(session.id, current ? mergeSessionForRail(current, session) : session);\n }\n return [...source.values()].map((session) => {\n const evidence = currentListChannelEvidence.get(session.id);\n const projected =\n evidence && (session.channelId ?? null) !== (evidence[0].channelId ?? null)\n ? { ...session, channelId: evidence[0].channelId ?? null }\n : session;\n return context.sessionChannelProjectionAuthority.project(projected, evidence?.[1] ?? 0);\n });\n }, [\n context.sessionChannelProjectionAuthority,\n currentListChannelEvidence,\n extraSessions,\n loadedChildren,\n pinned,\n sessions,\n ]);\n const rootChannelAuthoritySessions = useMemo(() => sessions, [sessions]);\n const channelAuthoritySessions = useMemo(() => {\n return [...currentListChannelEvidence.values()].map(([session, readGeneration]) =>\n context.sessionChannelProjectionAuthority.project(session, readGeneration),\n );\n }, [context.sessionChannelProjectionAuthority, currentListChannelEvidence]);\n const channelAuthorityById = useMemo(\n () => new Map(channelAuthoritySessions.map((session) => [session.id, session])),\n [channelAuthoritySessions],\n );\n useEffect(() => {\n setGroupContinuations((current) => {\n let changed = false;\n const next = new Map(current);\n for (const [key, continuation] of current) {\n const reconciled = reconcileRetainedSessionContinuationChannel(\n continuation,\n pageGeneration,\n rootReadRevision,\n context.session,\n rootReadGeneration,\n );\n if (reconciled !== continuation) {\n next.set(key, reconciled);\n changed = true;\n }\n }\n return changed ? next : current;\n });\n }, [context.session, pageGeneration, rootReadGeneration, rootReadRevision]);\n useLayoutEffect(() => {\n const owner = rootChannelProjectionOwner.current;\n context.sessionChannelProjectionAuthority.replace(\n owner,\n rootChannelAuthoritySessions,\n 0,\n rootReadGeneration,\n );\n return () => context.sessionChannelProjectionAuthority.clear(owner);\n }, [context.sessionChannelProjectionAuthority, rootChannelAuthoritySessions, rootReadGeneration]);\n useLayoutEffect(() => {\n const owner = continuationChannelProjectionOwner.current;\n context.sessionChannelProjectionAuthority.replaceOwner(\n owner,\n authoritativeExtraSessionEvidence,\n );\n return () => context.sessionChannelProjectionAuthority.clear(owner);\n }, [authoritativeExtraSessionEvidence, context.sessionChannelProjectionAuthority]);\n useLayoutEffect(() => {\n const owner = branchChannelProjectionOwner.current;\n context.sessionChannelProjectionAuthority.replaceOwner(owner, loadedChildChannelEvidence);\n return () => context.sessionChannelProjectionAuthority.clear(owner);\n }, [context.sessionChannelProjectionAuthority, loadedChildChannelEvidence]);\n useLayoutEffect(() => {\n const owner = pinsChannelProjectionOwner.current;\n context.sessionChannelProjectionAuthority.replace(\n owner,\n hierarchyMode ? globalPinned : [],\n 0,\n globalPinsReadGeneration,\n );\n return () => context.sessionChannelProjectionAuthority.clear(owner);\n }, [\n context.sessionChannelProjectionAuthority,\n globalPinned,\n globalPinsReadGeneration,\n hierarchyMode,\n ]);\n useLayoutEffect(() => {\n const owner = lineageChannelProjectionOwner.current;\n context.sessionChannelProjectionAuthority.replace(\n owner,\n hierarchyMode ? lineageChannelAuthoritySessions : [],\n 0,\n activeLineage.readGeneration,\n );\n return () => context.sessionChannelProjectionAuthority.clear(owner);\n }, [\n activeLineage.readGeneration,\n context.sessionChannelProjectionAuthority,\n hierarchyMode,\n lineageChannelAuthoritySessions,\n ]);\n useLayoutEffect(() => {\n const owner = moveChannelProjectionOwner.current;\n context.sessionChannelProjectionAuthority.replace(\n owner,\n [...channelMoveOverrides].map(([id, override]) => ({\n id,\n workspaceId: rail.workspaceId,\n channelId: override.channelId,\n })),\n 1,\n );\n return () => context.sessionChannelProjectionAuthority.clear(owner);\n }, [channelMoveOverrides, context.sessionChannelProjectionAuthority, rail.workspaceId]);\n const serverSessions = useMemo(() => {\n const source = new Map(listedSessions.map((session) => [session.id, session]));\n // Search is intentionally flat. Normal navigation starts with real roots,\n // then adds only explicitly loaded child pages and the active session's\n // lineage. A child can therefore never become a fake root merely because\n // its parent fell outside a global recency page.\n // List/page projections own personal pin revisions and server treeStats.\n // Insert those first, with the current pinned section last so an older\n // ordinary continuation cannot overwrite a newer pin projection.\n // Route/lineage projections own lifecycle and content. Project their\n // channel through persistent authority first, then merge list-owned fields\n // rather than replacing either domain wholesale; in particular, a stale\n // route object must not resurrect a cross-device pin or project move.\n const lineageSessions = hierarchyMode\n ? [...(activeLineage.lineage?.ancestors ?? []), ...(context.session ? [context.session] : [])]\n : [];\n for (const session of lineageSessions) {\n const lineageProjected = context.sessionChannelProjectionAuthority.project(\n session,\n activeLineage.readGeneration,\n );\n const projected = source.get(session.id);\n const authoritative = channelAuthorityById.get(session.id);\n const channelOwned =\n authoritative !== undefined &&\n context.sessionChannelProjectionAuthority.owns(authoritative) &&\n (authoritative.channelId ?? null) === (projected?.channelId ?? null);\n source.set(\n session.id,\n projected\n ? applySessionRailProjection(lineageProjected, projected, { channelOwned })\n : lineageProjected,\n );\n }\n return [...source.values()];\n }, [\n activeLineage.lineage?.ancestors,\n activeLineage.readGeneration,\n channelAuthorityById,\n context.sessionChannelProjectionAuthority,\n context.session,\n hierarchyMode,\n listedSessions,\n ]);\n const allSessions = useMemo(() => {\n const source = new Map(serverSessions.map((session) => [session.id, session]));\n for (const [id, override] of pinOverrides) {\n const current = source.get(id);\n source.set(\n id,\n current\n ? (applySessionPinProjection(current, override.session) ?? current)\n : override.session,\n );\n }\n for (const [id, override] of channelMoveOverrides) {\n const current = source.get(id);\n if (current) source.set(id, applySessionChannelMove(current, override));\n }\n const archiveProjected = projectSessionArchiveMembership(\n [...source.values()],\n archiveMembershipEvidence,\n browseStatus === \"all\" ? \"all\" : browseStatus === \"archived\",\n rail.workspaceId,\n { flat: !hierarchyMode, ...archiveReadEvidence },\n );\n const projectedAttention = new Map(attentionOverrides);\n const active = activeSessionId\n ? archiveProjected.find((session) => session.id === activeSessionId)\n : null;\n if (documentForeground && active?.unread && active.workspaceId === rail.workspaceId) {\n const foregroundProjection: SessionAttentionProjection = {\n id: active.id,\n workspaceId: active.workspaceId,\n unread: false,\n ...(active.attentionVersion !== undefined\n ? { attentionVersion: active.attentionVersion }\n : {}),\n lastSequence: active.lastSequence,\n };\n projectedAttention.set(\n active.id,\n latestSessionAttentionProjection(projectedAttention.get(active.id), foregroundProjection),\n );\n }\n return applySessionAttentionProjections(archiveProjected, projectedAttention);\n }, [\n activeSessionId,\n archiveMembershipEvidence,\n archiveReadEvidence,\n attentionOverrides,\n hierarchyMode,\n channelMoveOverrides,\n documentForeground,\n pinOverrides,\n rail.workspaceId,\n serverSessions,\n browseStatus,\n ]);\n // A spawned row archives its workstream, so its row reads the root's state.\n const workstreamRoots = useMemo(\n () =>\n new Map(\n allSessions\n .filter((session) => session.parentSessionId === null)\n .map((session) => [session.id, session]),\n ),\n [allSessions],\n );\n const workstreamRootsRef = useRef(workstreamRoots);\n workstreamRootsRef.current = workstreamRoots;\n\n const verifySessionChannelMove = useCallback(\n (sessionId: string, operation: number): Promise<void> => {\n const existing = channelMoveProbes.current.get(sessionId);\n if (existing?.operation === operation) return existing.promise;\n\n let readGeneration = 0;\n const detailReadOwner = {};\n const promise = readSessionChannelMovePoint(\n sessionClient,\n rail.workspaceId,\n sessionId,\n () => {\n readGeneration = context.sessionChannelProjectionAuthority.beginDetailRead(\n detailReadOwner,\n { id: sessionId, workspaceId: rail.workspaceId },\n );\n },\n )\n .then((authoritative) => {\n const currentProbe = channelMoveProbes.current.get(sessionId);\n if (currentProbe?.operation !== operation) return;\n const accepted = context.sessionChannelProjectionAuthority.recordRead(\n authoritative,\n readGeneration,\n );\n if (accepted) {\n setChannelMoveOverrides((current) =>\n reconcileSessionChannelMovePointRead(current, sessionId, operation, authoritative),\n );\n setContextSession((current) => applySessionChannelProjection(current, authoritative));\n return;\n }\n\n // A still-newer accepted detail/point read won while this request was\n // in flight. Retire only this operation's overlay, then expose that\n // persistent winner instead of the rejected response.\n setChannelMoveOverrides((current) =>\n discardRejectedSessionChannelMove(current, sessionId, operation),\n );\n const winner = context.sessionChannelProjectionAuthority.project(\n authoritative,\n readGeneration,\n );\n if (context.sessionChannelProjectionAuthority.owns(winner)) {\n setContextSession((current) => applySessionChannelProjection(current, winner));\n }\n })\n .catch((requestError: unknown) => {\n const currentProbe = channelMoveProbes.current.get(sessionId);\n if (\n currentProbe?.operation !== operation ||\n !(requestError instanceof OpenGeniApiError) ||\n requestError.status !== 404\n ) {\n return;\n }\n // Whether this absence is accepted or loses to a still-newer read,\n // exact post-settlement evidence makes the temporary move overlay\n // redundant. Persistent authority retains any newer present winner.\n context.sessionChannelProjectionAuthority.recordMissing(\n { id: sessionId, workspaceId: rail.workspaceId },\n readGeneration,\n );\n setChannelMoveOverrides((current) =>\n reconcileSessionChannelMovePointRead(current, sessionId, operation, null),\n );\n });\n const probe = { operation, promise };\n channelMoveProbes.current.set(sessionId, probe);\n void promise.finally(() => {\n context.sessionChannelProjectionAuthority.finishDetailReads(detailReadOwner);\n if (channelMoveProbes.current.get(sessionId) === probe) {\n channelMoveProbes.current.delete(sessionId);\n }\n });\n return promise;\n },\n [context.sessionChannelProjectionAuthority, rail.workspaceId, sessionClient, setContextSession],\n );\n\n // Matching causally authoritative list/page evidence confirms the optimistic\n // destination. Display-only retained rows cannot confirm or disagree: their\n // channel may have been patched from context after their list authority\n // expired. Resolve absent or different authority with an exact point read\n // started after the write. That point read can preserve the optimistic move,\n // supersede it with a newer cross-client move, or retire it after deletion\n // without requiring a database schema revision.\n useEffect(() => {\n setChannelMoveOverrides((current) =>\n reconcileSessionChannelMoves(current, channelAuthoritySessions),\n );\n const authoritativeById = new Map(\n channelAuthoritySessions.map((session) => [session.id, session]),\n );\n for (const [sessionId, override] of channelMoveOverrides) {\n if (!override.committed) continue;\n const authoritativeEvidence = authoritativeById.get(sessionId);\n if (\n authoritativeEvidence &&\n (authoritativeEvidence.channelId ?? null) === override.channelId\n ) {\n continue;\n }\n void verifySessionChannelMove(sessionId, override.operation);\n }\n }, [channelMoveOverrides, channelAuthoritySessions, verifySessionChannelMove]);\n\n useEffect(() => {\n channelMoveProbes.current.clear();\n pendingSessionFocus.current = null;\n setChannelMoveOverrides(new Map());\n }, [rail.workspaceId]);\n const branchParentsById = useRef<ReadonlyMap<string, Session>>(new Map());\n branchParentsById.current = new Map(allSessions.map((session) => [session.id, session]));\n knownListSessions.current = branchParentsById.current;\n\n useEffect(() => {\n setAttentionOverrides(new Map());\n return subscribeToSessionAttentionChanges((projection) => {\n setAttentionOverrides((current) => {\n const latest = latestSessionAttentionProjection(current.get(projection.id), projection);\n if (latest !== projection) return current;\n const next = new Map(current);\n next.set(projection.id, latest);\n if (next.size > 64) next.delete(next.keys().next().value!);\n return next;\n });\n });\n }, [rail.workspaceId]);\n const creatorSessions = useMemo(() => {\n if (!hierarchyMode) return allSessions;\n const loadedIds = new Set(allSessions.map((session) => session.id));\n return allSessions.filter(\n (session) => !session.parentSessionId || !loadedIds.has(session.parentSessionId),\n );\n }, [allSessions, hierarchyMode]);\n const creatorLabels = useMemo(() => sessionCreatorLabelMap(creatorSessions), [creatorSessions]);\n const paginationBrowseFilter = useMemo<SessionPaginationBrowseFilter>(\n () => ({\n creator: null,\n dateField: \"activity\",\n dateRange: \"any\",\n }),\n [],\n );\n const browseControlsActive = sessionBrowsePreferencesCustomized(browsePreferences);\n const needsYouCount =\n (hierarchyMode && browseStatus !== \"archived\" ? rootPage.totals : globalPinPage.totals)\n ?.needsYouCount ?? countNeedsYou(allSessions);\n const projectTotals = useMemo(\n () =>\n hierarchyMode && rootPage.totals\n ? sessionProjectTotals(\n rootPage.totals,\n channels.map((channel) => channel.id),\n )\n : null,\n [channels, hierarchyMode, rootPage.totals],\n );\n const acceptedAttentionRoots = useMemo(\n () =>\n new Set(\n needsYouOnly\n ? [...sessions, ...activeGroupContinuations.flatMap(([, page]) => page.sessions)]\n .filter((session) => session.parentSessionId === null)\n .map((session) => session.id)\n : [],\n ),\n [needsYouOnly, sessions, activeGroupContinuations],\n );\n const browseSessions = useMemo(\n () =>\n (needsYouOnly\n ? hierarchyMode\n ? allSessions.filter(\n (session) =>\n acceptedAttentionRoots.has(session.rootSessionId) ||\n filterNeedsYou([session]).length > 0,\n )\n : filterNeedsYou(allSessions)\n : allSessions\n ).filter((session) => {\n if (archiveTransitions.has(session.rootSessionId)) return false;\n // Child rows inherit their root's archive membership from the\n // lineage query. Only roots carry the personal archive projection.\n return (\n session.parentSessionId !== null ||\n browseStatus === \"all\" ||\n Boolean(session.archived) === (browseStatus === \"archived\")\n );\n }),\n [\n allSessions,\n archiveTransitions,\n browseStatus,\n needsYouOnly,\n hierarchyMode,\n acceptedAttentionRoots,\n ],\n );\n\n // A complete pins-only page makes presence authoritative, but absence does\n // not carry the version of a remotely unpinned relation. Loaded child pages\n // can outlive many root/global polls, so point-read only their stale positive\n // pins and merge the exact revision back into every cached parent page.\n const staleChildPinProbes = useRef(new Map<string, string>());\n useEffect(() => {\n if (globalPinsLoading || globalPinsError) return;\n const pinnedIds = new Set(globalPinned.map((session) => session.id));\n const stalePins = loadedChildren.filter(\n (session) => session.pinned && !pinnedIds.has(session.id),\n );\n const staleKeys = new Set(\n stalePins.map((session) => `${session.id}:${session.pinVersion ?? 0}`),\n );\n for (const [sessionId, key] of staleChildPinProbes.current) {\n if (!staleKeys.has(key)) staleChildPinProbes.current.delete(sessionId);\n }\n const childEpoch = childLoadEpoch.current;\n for (const stale of stalePins) {\n const key = `${stale.id}:${stale.pinVersion ?? 0}`;\n if (staleChildPinProbes.current.get(stale.id) === key) continue;\n staleChildPinProbes.current.set(stale.id, key);\n void context.client\n .getSession(rail.workspaceId, stale.id)\n .then((authoritative) => {\n if (\n childLoadEpoch.current !== childEpoch ||\n staleChildPinProbes.current.get(stale.id) !== key\n ) {\n return;\n }\n setChildPages((current) => {\n let changed = false;\n const next = new Map(current);\n for (const [parentId, page] of current) {\n const projectedSessions = page.sessions.map((session) => {\n if (session.id !== stale.id) return session;\n const projected = applySessionPinProjection(session, authoritative) ?? session;\n if (projected !== session) changed = true;\n return projected;\n });\n if (projectedSessions.some((session, index) => session !== page.sessions[index])) {\n next.set(parentId, { ...page, sessions: projectedSessions });\n }\n }\n return changed ? next : current;\n });\n })\n .catch((requestError: unknown) => {\n if (requestError instanceof OpenGeniApiError && requestError.status === 404) {\n setChildPages((current) => {\n let changed = false;\n const next = new Map(current);\n for (const [parentId, page] of current) {\n const retainedSessions = page.sessions.filter((session) => session.id !== stale.id);\n if (retainedSessions.length !== page.sessions.length) {\n changed = true;\n next.set(parentId, { ...page, sessions: retainedSessions });\n }\n }\n return changed ? next : current;\n });\n }\n if (staleChildPinProbes.current.get(stale.id) === key) {\n staleChildPinProbes.current.delete(stale.id);\n }\n });\n }\n }, [\n context.client,\n globalPinned,\n globalPinsError,\n globalPinsLoading,\n loadedChildren,\n rail.workspaceId,\n ]);\n const openSessionId = context.session?.id;\n const openSessionWorkspaceId = context.session?.workspaceId;\n const openSessionPinned = Boolean(context.session?.pinned);\n const openSessionPinVersion = context.session?.pinVersion ?? 0;\n // The route header and rail intentionally keep separate projections. Merge\n // list-owned pin and project fields into the open session while preserving\n // route/SSE-owned lifecycle and content. Project reconciliation is paused\n // only while an optimistic move owns the row; its point-read fence updates\n // the context directly and prevents a pre-write list response from winning.\n useEffect(() => {\n if (!openSessionId || openSessionWorkspaceId !== rail.workspaceId) return;\n // Do not feed the rail's short-lived optimistic override into the route\n // header. A same-version optimistic timestamp can make a later failed\n // rollback look non-exact, causing its authoritative lower revision to be\n // rejected as stale and leaving the header pinned forever.\n const projected = serverSessions.find((candidate) => candidate.id === openSessionId);\n if (!projected) return;\n setContextSession((current) => {\n const pinProjected = applySessionPinProjection(current, projected);\n return channelMoveOverrides.has(openSessionId)\n ? pinProjected\n : applySessionChannelProjection(pinProjected, projected);\n });\n }, [\n channelMoveOverrides,\n openSessionId,\n openSessionWorkspaceId,\n rail.workspaceId,\n serverSessions,\n setContextSession,\n ]);\n\n const activePinProbe = useRef<{ key: string | null; operation: number }>({\n key: null,\n operation: 0,\n });\n useEffect(() => {\n const globalPageContainsOpenSession = globalPinned.some(\n (candidate) => candidate.id === openSessionId,\n );\n if (\n !openSessionId ||\n openSessionWorkspaceId !== rail.workspaceId ||\n !openSessionPinned ||\n globalPinsLoading ||\n globalPinsError ||\n globalPageContainsOpenSession\n ) {\n activePinProbe.current.key = null;\n activePinProbe.current.operation += 1;\n return;\n }\n\n const key = `${openSessionId}:${openSessionPinVersion}`;\n if (activePinProbe.current.key === key) return;\n const operation = ++activePinProbe.current.operation;\n activePinProbe.current.key = key;\n void context.client\n .getSession(rail.workspaceId, openSessionId)\n .then((authoritative) => {\n if (activePinProbe.current.operation !== operation) return;\n // Point reads are used only for the absent pin projection. Route/SSE\n // remains authoritative for every lifecycle and content field.\n setContextSession((current) => applySessionPinProjection(current, authoritative));\n })\n .catch(() => {\n if (activePinProbe.current.operation === operation) {\n activePinProbe.current.key = null;\n }\n });\n }, [\n context.client,\n globalPinned,\n globalPinsError,\n globalPinsLoading,\n openSessionId,\n openSessionPinned,\n openSessionPinVersion,\n openSessionWorkspaceId,\n rail.workspaceId,\n setContextSession,\n ]);\n\n // Only a route transition or keyboard navigation may reveal a row. Polls and\n // pagination replace `flat` too, so a derived focus index is not itself\n // permission to move this scroll container.\n const rowRevealIntent = useRef<string | null>(activeSessionId);\n\n // Search results are deliberately flat because a partial match set is not a\n // tree. Normal and custom-grouped browsing carry true roots, lazily loaded\n // children, and the active lineage.\n const projectedSessions = useMemo(\n () =>\n projectRailSessions(\n browseStatus === \"archived\" ? [] : browseSessions.filter((session) => !session.archived),\n hierarchyMode,\n ),\n [browseSessions, browseStatus, hierarchyMode],\n );\n const archivedNodes = useMemo(() => {\n const archived = buildPinnedRailSections(\n projectRailSessions(\n browseSessions.filter((session) => browseStatus === \"archived\" || session.archived),\n hierarchyMode,\n ),\n ).complete;\n return [...archived.running, ...archived.grouped.flatMap((bucket) => bucket.sessions)].sort(\n (a, b) => compareSessionArchiveOrder(a.session, b.session),\n );\n }, [browseSessions, browseStatus, hierarchyMode]);\n // A Site pin or move in flight shows at once; the next read confirms it.\n const siteGroups = useMemo(\n () =>\n rootPage.siteGroups?.map((group) => {\n const moved = siteMoveOverrides.get(siteRowKey(group.siteId, group.channelId));\n const placed = moved ? { ...group, channelId: moved.channelId } : group;\n const override = sitePinOverrides.get(group.siteId);\n if (!override) return placed;\n const { pinned: _pinned, pinnedAt: _pinnedAt, ...unpinned } = placed;\n return override.pinned\n ? { ...unpinned, pinned: true as const, pinnedAt: override.pinnedAt }\n : unpinned;\n }),\n [rootPage.siteGroups, sitePinOverrides, siteMoveOverrides],\n );\n // The helper builds all three projections together so explicit nested pins\n // never disappear into an ancestor shortcut.\n const railSections = useMemo(\n () =>\n buildPinnedRailSections(projectedSessions, new Date(), {\n // Sites are stable rows whenever the rail is a hierarchy. Search is\n // flat: a matching conversation is listed as itself.\n groupSites: hierarchyMode,\n siteGroups,\n archivedSiteIds,\n siteRowsByProject: channelMode,\n workspaceId: rail.workspaceId,\n creator: { kind: \"subject\", subjectId: context.accessContext.subjectId },\n }),\n [\n projectedSessions,\n hierarchyMode,\n siteGroups,\n archivedSiteIds,\n channelMode,\n rail.workspaceId,\n context.accessContext.subjectId,\n ],\n );\n const forest = useMemo(\n () =>\n sortSessionForest(\n browseGroupBy === \"activity\"\n ? railSections.ordinary\n : groupSessionForestForBrowse(railSections.ordinary, browseGroupBy, { creatorLabels }),\n browseSortBy,\n ),\n [browseGroupBy, browseSortBy, creatorLabels, railSections.ordinary],\n );\n const visibleForest = useMemo(\n () => ({\n running: visibleNodesForGroup(\"activity:active\", forest.running),\n grouped: forest.grouped.map((bucket) => ({\n ...bucket,\n sessions: visibleNodesForGroup(\n browseGroupBy === \"none\"\n ? \"workspace\"\n : browseGroupBy === \"activity\"\n ? `activity:${bucket.group}`\n : bucket.group,\n bucket.sessions,\n ),\n })),\n }),\n [browseGroupBy, forest, visibleNodesForGroup],\n );\n // Keep personal pin order while applying the selected sort to shortcut descendants.\n const pinnedNodes = useMemo(\n () =>\n railSections.pinned.map((node) => ({\n ...node,\n children: sortSessionForest({ running: node.children, grouped: [] }, browseSortBy).running,\n })),\n [railSections.pinned, browseSortBy],\n );\n // ⌘1 to ⌘9 and next/previous chat open chats; a pinned Site row is not one.\n const pinnedChatNodes = useMemo(\n () => pinnedNodes.filter((node) => !node.siteGroup),\n [pinnedNodes],\n );\n // The hierarchy rail always has the same shape: unfiled Recents first, then\n // workstreams. A workspace with no created workstreams should not fall back\n // to a completely different recency UI.\n const projectPaginationGroups = useMemo(\n () => [\n ...channels.map((channel) => sessionPaginationProjectGroup(channel.id, channel.name)),\n sessionPaginationProjectGroup(null, \"Default\"),\n ],\n [channels],\n );\n const channelSections = useMemo(\n () =>\n channelMode\n ? channelRailSections(forest, channels)\n .map((section) => ({\n ...section,\n sessions: [...section.sessions].sort((a, b) =>\n compareSessionBrowse(a.session, b.session, browseSortBy),\n ),\n }))\n .filter((section) => {\n if (browseStatus === \"archived\") return false;\n if (showEmptyGroups || section.sessions.length > 0) return true;\n const key = sessionPaginationProjectGroup(section.channelId, section.name).key;\n const continuation = activeSessionContinuation(\n groupContinuations.get(key) ?? emptySessionContinuation(pageGeneration),\n pageGeneration,\n );\n // An off-page project still needs a visible retry when its first\n // independent read fails (and a loading state while it starts).\n return continuation.failed || groupLoadingGenerations.get(key) === pageGeneration;\n })\n : [],\n [\n channelMode,\n forest,\n channels,\n browseSortBy,\n browseStatus,\n showEmptyGroups,\n groupContinuations,\n groupLoadingGenerations,\n pageGeneration,\n ],\n );\n // Sections open by default. The ones this person collapsed are remembered\n // per workspace on this device, so they stay collapsed after a reload while\n // new or newly loaded sections still open.\n const [collapsedChannelSections, setCollapsedChannelSections] =\n useCollapsedSessionSections(browsePreferenceStorageId);\n const toggleChannelSection = useCallback(\n (sectionKey: string) => {\n setCollapsedChannelSections((current) => {\n const next = new Set(current);\n if (next.has(sectionKey)) next.delete(sectionKey);\n else next.add(sectionKey);\n return next;\n });\n },\n [setCollapsedChannelSections],\n );\n const submitCreateChannel = useCallback(async () => {\n const name = channelNameDraft.trim();\n if (!name) return;\n const created = await requestCreateChannel({\n name,\n ...(canMakeOnlyMeProject ? { visibility: channelAudienceDraft } : {}),\n });\n if (created) {\n setChannelDialogOpen(false);\n setChannelNameDraft(\"\");\n setChannelAudienceDraft(\"workspace\");\n } else {\n toast.error(\"Couldn't create the project. The name may already be in use.\");\n }\n }, [canMakeOnlyMeProject, channelAudienceDraft, channelNameDraft, requestCreateChannel]);\n const onMoveToChannel = useCallback(\n async (\n session: Session,\n channelId: string | null,\n restoreFocusTo: SessionFocusTarget = \"row\",\n ) => {\n if (session.channelId === channelId) return;\n const acceptedTransition = context.captureWorkspaceInvocation(session.workspaceId);\n if (!acceptedTransition) return;\n const moveRequest = context.sessionChannelProjectionAuthority.beginMove(\n moveRequestOwner.current,\n session,\n );\n if (!moveRequest) return;\n const operation = moveRequest.operation;\n const focusOperation = ++focusRestoreOperation.current;\n pendingSessionFocus.current = {\n sessionId: session.id,\n operation: focusOperation,\n target: restoreFocusTo,\n settled: false,\n };\n setCollapsedChannelSections((current) => {\n const destinationKey = channelId ?? \"default\";\n if (!current.has(destinationKey)) return current;\n const next = new Set(current);\n next.delete(destinationKey);\n return next;\n });\n setChannelMoveOverrides((current) =>\n beginSessionChannelMove(current, session.id, channelId, operation),\n );\n try {\n let moved: Session | null = null;\n try {\n moved = await context.client.updateSessionChannel(session.workspaceId, session.id, {\n channelId,\n });\n } catch {\n // Preserve the existing optimistic rollback UX, while keeping the\n // raw successful response available after this component unmounts.\n }\n if (\n !context.ownsWorkspaceInvocation(session.workspaceId, acceptedTransition) ||\n !context.sessionChannelProjectionAuthority.ownsMove(moveRequestOwner.current, moveRequest)\n ) {\n return;\n }\n if (moved) {\n // The successful write response is exact evidence. Settlement\n // fences reads that started before it returned, while a completed\n // newer read requires the post-response point verification below.\n const disposition = context.sessionChannelProjectionAuthority.recordMove(\n moveRequestOwner.current,\n moveRequest,\n moved,\n );\n if (disposition === \"rejected\") {\n setChannelMoveOverrides((current) =>\n discardRejectedSessionChannelMove(current, session.id, operation),\n );\n return;\n }\n setChannelMoveOverrides((current) =>\n commitSessionChannelMove(current, session.id, moved.channelId ?? null, operation),\n );\n context.setSession((current) =>\n current?.id === moved.id && current.workspaceId === moved.workspaceId\n ? { ...current, channelId: moved.channelId ?? null }\n : current,\n );\n // Always start and await an exact read after the successful response\n // settles. It distinguishes the committed B from a genuinely newer\n // C; if it fails, the persistent move token and settlement fence keep\n // B visible through rail remounts and late overlapping reads.\n await verifySessionChannelMove(session.id, operation);\n } else {\n setChannelMoveOverrides((current) =>\n rollbackSessionChannelMove(current, session.id, operation),\n );\n // Rows don't carry a chat's audience, so name the likely reason here.\n const onlyMeTarget =\n channels.find((project) => project.id === channelId)?.visibility === \"private\";\n toast.error(\n \"Couldn't move the workstream. Its previous project was restored.\",\n onlyMeTarget\n ? { description: \"An Only me project holds only your own Only me chats.\" }\n : undefined,\n );\n }\n await refreshSessionPages();\n } finally {\n context.sessionChannelProjectionAuthority.finishMove(moveRequestOwner.current, moveRequest);\n const pending = pendingSessionFocus.current;\n if (pending?.sessionId === session.id && pending.operation === focusOperation) {\n pending.settled = true;\n setFocusRestoreRevision((current) => current + 1);\n }\n }\n },\n [channels, context, refreshSessionPages, setCollapsedChannelSections, verifySessionChannelMove],\n );\n const saveProjectProfile = useCallback(\n async (project: Channel, change: UpdateChannelRequest): Promise<boolean> => {\n const updated = await updateProject(project.id, change);\n if (!updated) {\n toast.error(\n change.name !== undefined\n ? \"Couldn't save the project. The name may already be in use.\"\n : \"Couldn't save the project.\",\n );\n }\n return updated !== null;\n },\n [updateProject],\n );\n const onToggleProjectPin = useCallback(\n async (project: Channel) => {\n const updated = await updateProject(project.id, { pinned: !project.pinned });\n if (!updated) toast.error(\"Couldn't update the project pin.\");\n },\n [updateProject],\n );\n const onDeleteProject = useCallback(async (): Promise<boolean> => {\n if (!projectPendingDelete) return false;\n const deleted = await removeProject(projectPendingDelete.id);\n if (!deleted) {\n toast.error(\"Couldn't delete the project.\");\n return false;\n }\n await refreshSessionPages();\n return true;\n }, [projectPendingDelete, refreshSessionPages, removeProject]);\n const onShareProject = useCallback(async (): Promise<boolean> => {\n if (!projectPendingShare) return false;\n const shared = await updateProject(projectPendingShare.id, { visibility: \"workspace\" });\n if (!shared) {\n toast.error(\n \"Couldn't share the project. A shared project may already use this name; rename it and try again.\",\n );\n return false;\n }\n return true;\n }, [projectPendingShare, updateProject]);\n const onReorderProjects = useCallback(\n async (sourceProjectId: string, targetProjectId: string) => {\n if (sourceProjectId === targetProjectId) return;\n const sourceIndex = channels.findIndex((project) => project.id === sourceProjectId);\n const sourceProject = channels[sourceIndex];\n const targetProject = channels.find((project) => project.id === targetProjectId);\n if (!sourceProject || !targetProject) return;\n if (sourceProject.pinned !== targetProject.pinned) {\n toast.error(\n \"Pinned projects stay at the top. Pin or unpin it before moving it between groups.\",\n );\n return;\n }\n const ordered = [...channels];\n const [moved] = ordered.splice(sourceIndex, 1);\n if (!moved) return;\n // Dropping on a project always places the dragged project immediately\n // before it, regardless of whether the source began above or below.\n ordered.splice(\n ordered.findIndex((project) => project.id === targetProjectId),\n 0,\n moved,\n );\n const result = await reorderProjects(ordered.map((project) => project.id));\n if (!result) toast.error(\"Couldn't save the project order. Try again.\");\n },\n [channels, reorderProjects],\n );\n const onUpdateAttention = useCallback<UpdateAttentionFn>(\n async (session, update) => {\n try {\n const updated = await context.client.updateSessionAttention(rail.workspaceId, session.id, {\n ...update,\n expectedVersion: session.attentionVersion ?? 0,\n });\n // The open session has a separate detail/SSE projection from the rail\n // page. Reflect the mutation there immediately; waiting for a later\n // navigation or stream event left the action menu showing stale text.\n context.setSession((current) =>\n current?.id === updated.id\n ? {\n ...current,\n ...(updated.unread !== undefined ? { unread: updated.unread } : {}),\n ...(updated.activelyWorking !== undefined\n ? { activelyWorking: updated.activelyWorking }\n : {}),\n ...(updated.attentionVersion !== undefined\n ? { attentionVersion: updated.attentionVersion }\n : {}),\n }\n : current,\n );\n await refreshSessionPages();\n } catch (attentionError) {\n toast.error(\"Couldn't update the session status.\", {\n description: userErrorText(attentionError),\n });\n await refreshSessionPages();\n }\n },\n [context, rail.workspaceId, refreshSessionPages],\n );\n const onArchive = useCallback<ArchiveFn>(\n async function archiveSession(session, archived, restoreFocusTo = \"row\") {\n // Archive belongs to a whole workstream: a spawned row archives its root,\n // exactly as archiving the root row would.\n if (session.parentSessionId !== null) {\n // The root may sit on a page this rail has not loaded (a pinned\n // spawned row, say): read it so the archive acts on the real root.\n const root: Session | null =\n workstreamRootsRef.current.get(session.rootSessionId) ??\n (await context.client\n .getSession(session.workspaceId, session.rootSessionId)\n .catch((): SessionDetails | null => null));\n if (!root || root.parentSessionId !== null) {\n toast.error(archived ? \"Couldn't archive the workstream.\" : \"Couldn't undo the archive.\");\n return;\n }\n return await archiveSession(root, archived, restoreFocusTo);\n }\n const archiveWindowKeys = fillTargetsRef.current\n .filter((target) => target.visibleSessionIds.includes(session.id))\n .map((target) => target.key);\n if (archiving.current.has(session.id)) return;\n const acceptedTransition = context.captureWorkspaceInvocation(session.workspaceId);\n if (!acceptedTransition) return;\n const focusOperation = ++focusRestoreOperation.current;\n pendingSessionFocus.current = {\n sessionId: session.id,\n operation: focusOperation,\n target: restoreFocusTo,\n action: \"archive\",\n settled: false,\n };\n archiving.current.add(session.id);\n if (archived) preserveArchiveWindow(session.id, true, archiveWindowKeys);\n setArchiveTransitions((current) => new Set(current).add(session.id));\n let archivedResult: Session | undefined;\n try {\n const updated = await requestSessionArchive(\n context,\n session,\n archived,\n sessionDisplayTitle(session),\n (next) => {\n if (!context.ownsWorkspaceInvocation(session.workspaceId, acceptedTransition)) return;\n void archiveSession({ ...session, archived: !next }, next);\n },\n );\n if (!updated) return;\n if (!context.ownsWorkspaceInvocation(session.workspaceId, acceptedTransition)) return;\n preserveArchiveWindow(session.id, archived, archiveWindowKeys);\n const completedGeneration = context.sessionChannelProjectionAuthority.beginRead();\n setArchiveOverrides((current) => {\n const next = new Map(current).set(updated.id, { session: updated, completedGeneration });\n if (next.size > 64) next.delete(next.keys().next().value!);\n return next;\n });\n context.setSession((current) =>\n current?.id === updated.id && current.workspaceId === updated.workspaceId\n ? applySessionArchiveProjection(current, updated)\n : current,\n );\n notifySessionListChanged({\n workspaceId: rail.workspaceId,\n sessionId: session.id,\n archived: updated.archived,\n });\n // Recent chats drop it now too, not on a later read.\n rememberChats(context.accessContext.subjectId, [updated]);\n archivedResult = updated;\n await refreshSessionPages();\n } catch (archiveError) {\n if (!context.ownsWorkspaceInvocation(session.workspaceId, acceptedTransition)) return;\n toast.error(archived ? \"Couldn't archive the chat.\" : \"Couldn't undo the archive.\", {\n description: userErrorText(archiveError),\n });\n await refreshSessionPages();\n } finally {\n if (archived && !archivedResult) preserveArchiveWindow(session.id, false);\n archiving.current.delete(session.id);\n const pending = pendingSessionFocus.current;\n if (\n pending?.operation === focusOperation &&\n context.ownsWorkspaceInvocation(session.workspaceId, acceptedTransition)\n ) {\n pending.settled = true;\n setFocusRestoreRevision((current) => current + 1);\n }\n setArchiveTransitions((current) => {\n const next = new Set(current);\n next.delete(session.id);\n return next;\n });\n }\n },\n [context, rail.workspaceId, refreshSessionPages, preserveArchiveWindow],\n );\n // Site rows pin and archive for this person only, like sessions: a pin\n // moves the row to Pinned and archive only hides it from this sidebar.\n const sitePinOperation = useRef(0);\n const onPinSite = useCallback(\n async (origin: SessionSiteOrigin, nextPinned: boolean) => {\n const acceptedTransition = context.captureWorkspaceInvocation(rail.workspaceId);\n if (!acceptedTransition) return;\n const operation = ++sitePinOperation.current;\n const setOverride = (sitePinned: boolean, pinnedAt: string | null) =>\n setSitePinOverrides((current) => {\n const existing = current.get(origin.siteId);\n if (existing && existing.operation > operation) return current;\n return new Map(current).set(origin.siteId, {\n pinned: sitePinned,\n pinnedAt,\n operation,\n });\n });\n setOverride(nextPinned, nextPinned ? new Date().toISOString() : null);\n try {\n const updated = await context.client.updateSiteSidebarState(\n rail.workspaceId,\n origin.siteId,\n { pinned: nextPinned },\n );\n if (!context.ownsWorkspaceInvocation(rail.workspaceId, acceptedTransition)) return;\n setOverride(updated.pinned, updated.pinnedAt);\n await refreshSessionPages();\n if (!context.ownsWorkspaceInvocation(rail.workspaceId, acceptedTransition)) return;\n announcePinResult(`${nextPinned ? \"Pinned\" : \"Unpinned\"} ${origin.title}.`);\n } catch (pinError) {\n if (!context.ownsWorkspaceInvocation(rail.workspaceId, acceptedTransition)) return;\n toast.error(nextPinned ? \"Couldn't pin the Site.\" : \"Couldn't unpin the Site.\", {\n description: userErrorText(pinError),\n });\n } finally {\n setSitePinOverrides((current) => {\n if (current.get(origin.siteId)?.operation !== operation) return current;\n const next = new Map(current);\n next.delete(origin.siteId);\n return next;\n });\n }\n },\n [announcePinResult, context, rail.workspaceId, refreshSessionPages],\n );\n const onArchiveSite = useCallback(\n async function archiveSite(origin: SessionSiteOrigin, archived: boolean) {\n const acceptedTransition = context.captureWorkspaceInvocation(rail.workspaceId);\n if (!acceptedTransition) return;\n // The row leaves the list: keep keyboard focus on the row after it,\n // whether the quick button, the context menu or the overflow menu ran it.\n const list = listRef.current;\n const rowLinks = list\n ? [...list.querySelectorAll<HTMLElement>(\"a[data-session-row], [data-site-row] > a\")]\n : [];\n const inArchivedRow = (link: Element) =>\n link.closest(\"[data-site-row]\")?.getAttribute(\"data-site-row\") === origin.siteId;\n const rowIndex = rowLinks.findIndex(inArchivedRow);\n const nextFocus =\n archived && rowIndex >= 0\n ? (rowLinks.slice(rowIndex + 1).find((link) => !inArchivedRow(link)) ??\n rowLinks.slice(0, rowIndex).at(-1))\n : undefined;\n // Focus moves only if it was on the row or its menu, and is now lost.\n const focusWasOnRow =\n document.activeElement instanceof Element &&\n (inArchivedRow(document.activeElement) ||\n document.activeElement.closest('[role=\"menu\"]') !== null);\n const setArchived = (hidden: boolean) =>\n setArchivedSiteIds((current) => {\n if (current.has(origin.siteId) === hidden) return current;\n const next = new Set(current);\n if (hidden) next.add(origin.siteId);\n else next.delete(origin.siteId);\n return next;\n });\n const inFlight = siteArchivesInFlight.current;\n inFlight.set(origin.siteId, (inFlight.get(origin.siteId) ?? 0) + 1);\n setArchived(archived);\n if (nextFocus && focusWasOnRow) {\n // A closing menu returns focus to its trigger first; wait for that.\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const active = document.activeElement;\n if (!active || active === document.body || !active.isConnected || inArchivedRow(active))\n nextFocus.focus();\n }),\n );\n }\n try {\n await context.client.updateSiteSidebarState(rail.workspaceId, origin.siteId, {\n archived,\n });\n if (!context.ownsWorkspaceInvocation(rail.workspaceId, acceptedTransition)) return;\n await refreshSessionPages();\n if (!context.ownsWorkspaceInvocation(rail.workspaceId, acceptedTransition)) return;\n toast.success(archived ? \"Site archived\" : \"Site restored\", {\n ...(archived\n ? {\n // The Site stays published; only this sidebar changes.\n description: \"Hidden from your sidebar only.\",\n duration: 8000,\n action: {\n label: \"Undo\",\n onClick: () => {\n if (!context.ownsWorkspaceInvocation(rail.workspaceId, acceptedTransition))\n return;\n void archiveSite(origin, false);\n },\n },\n }\n : {}),\n });\n } catch (archiveError) {\n if (!context.ownsWorkspaceInvocation(rail.workspaceId, acceptedTransition)) return;\n setArchived(!archived);\n toast.error(archived ? \"Couldn't archive the Site.\" : \"Couldn't restore the Site.\", {\n description: userErrorText(archiveError),\n });\n } finally {\n const remaining = (inFlight.get(origin.siteId) ?? 1) - 1;\n if (remaining > 0) inFlight.set(origin.siteId, remaining);\n else inFlight.delete(origin.siteId);\n }\n },\n [context, rail.workspaceId, refreshSessionPages],\n );\n // Moving a Site row is shared, like moving a chat: its conversations in that\n // project move with it, and the Site itself when the row is its own project's.\n const siteMoveOperation = useRef(0);\n const onMoveSite = useCallback(\n async (origin: SessionSiteOrigin, fromChannelId: string | null, channelId: string | null) => {\n if (fromChannelId === channelId) return;\n const acceptedTransition = context.captureWorkspaceInvocation(rail.workspaceId);\n if (!acceptedTransition) return;\n const operation = ++siteMoveOperation.current;\n const key = siteRowKey(origin.siteId, fromChannelId);\n setCollapsedChannelSections((current) => {\n const destinationKey = channelId ?? \"default\";\n if (!current.has(destinationKey)) return current;\n const next = new Set(current);\n next.delete(destinationKey);\n return next;\n });\n setSiteMoveOverrides((current) => new Map(current).set(key, { channelId, operation }));\n let moved = false;\n try {\n await context.client.updateSiteProject(rail.workspaceId, origin.siteId, {\n fromChannelId,\n channelId,\n });\n moved = true;\n } catch (moveError) {\n // Says why, for example that an Only me project takes only Only me Sites.\n if (context.ownsWorkspaceInvocation(rail.workspaceId, acceptedTransition))\n toast.error(\"Couldn't move the Site. Its previous project was restored.\", {\n description: userErrorText(moveError),\n });\n }\n try {\n if (context.ownsWorkspaceInvocation(rail.workspaceId, acceptedTransition) && moved)\n await refreshSessionPages();\n } finally {\n setSiteMoveOverrides((current) => {\n if (current.get(key)?.operation !== operation) return current;\n const next = new Map(current);\n next.delete(key);\n return next;\n });\n }\n },\n [context, rail.workspaceId, refreshSessionPages, setCollapsedChannelSections],\n );\n const siteRowActions = useMemo<SiteRowActions | null>(\n () =>\n // An embed's older client may predate Site sidebar state.\n typeof context.client.updateSiteSidebarState === \"function\"\n ? {\n pin: (origin, nextPinned) => void onPinSite(origin, nextPinned),\n archive: (origin) => void onArchiveSite(origin, true),\n ...(typeof context.client.updateSiteProject === \"function\"\n ? {\n move: (origin: SessionSiteOrigin, from: string | null, to: string | null) =>\n void onMoveSite(origin, from, to),\n }\n : {}),\n }\n : null,\n [context.client, onArchiveSite, onMoveSite, onPinSite],\n );\n // The open Site's page offers the same Pin and Archive as its row.\n const pinnedSiteIds = useMemo(\n () =>\n new Set(\n (siteGroups ?? [])\n .filter((group) => \"pinned\" in group && group.pinned === true)\n .map((group) => group.siteId),\n ),\n [siteGroups],\n );\n useEffect(() => {\n if (!siteRowActions) return;\n return publishSiteSidebarBridge({\n workspaceId: rail.workspaceId,\n pinnedSiteIds,\n pin: siteRowActions.pin,\n archive: siteRowActions.archive,\n });\n }, [pinnedSiteIds, rail.workspaceId, siteRowActions]);\n const onDeleteSession = useCallback(async (): Promise<boolean> => {\n if (!sessionPendingDelete) return false;\n try {\n const result = await deleteStoppingIfRunning(\n context.client,\n rail.workspaceId,\n sessionPendingDelete.id,\n );\n deletedRootIds.current.add(sessionPendingDelete.id);\n setArchiveOverrides((current) => {\n if (!current.has(sessionPendingDelete.id)) return current;\n const next = new Map(current);\n next.delete(sessionPendingDelete.id);\n return next;\n });\n setGroupContinuations((current) => {\n let changed = false;\n const next = new Map(current);\n for (const [key, continuation] of current) {\n const removedIds = new Set(\n continuation.sessions\n .filter((session) => session.rootSessionId === sessionPendingDelete.id)\n .map((session) => session.id),\n );\n const retainedSessions = continuation.sessions.filter(\n (session) => !removedIds.has(session.id),\n );\n if (retainedSessions.length !== continuation.sessions.length) {\n next.set(key, {\n ...continuation,\n sessions: retainedSessions,\n authoritativeIds: new Set(\n [...continuation.authoritativeIds].filter((id) => !removedIds.has(id)),\n ),\n channelGenerations: new Map(\n [...continuation.channelGenerations].filter(([id]) => !removedIds.has(id)),\n ),\n });\n changed = true;\n }\n }\n return changed ? next : current;\n });\n const viewingDeletedTree = context.session?.rootSessionId === sessionPendingDelete.id;\n if (viewingDeletedTree) {\n context.resetSessionView();\n await navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId: rail.workspaceId },\n replace: true,\n });\n }\n await refreshSessionPages();\n toast.success(\n result.deletedSessionCount === 1\n ? \"Chat deleted\"\n : `${result.deletedSessionCount} chats deleted`,\n );\n return true;\n } catch (deleteError) {\n toast.error(\"Couldn't delete the chat.\", {\n description: userErrorText(deleteError),\n });\n return false;\n }\n }, [context, navigate, rail.workspaceId, refreshSessionPages, sessionPendingDelete]);\n const nodesById = useMemo(() => {\n const result = new Map<string, SessionTreeNode>();\n const visit = (node: SessionTreeNode): void => {\n if (result.has(node.session.id)) return;\n result.set(node.session.id, node);\n for (const child of node.children) visit(child);\n };\n for (const node of railSections.complete.running) visit(node);\n for (const bucket of railSections.complete.grouped) {\n for (const node of bucket.sessions) visit(node);\n }\n for (const node of archivedNodes) visit(node);\n // Site rows are presentation-only; register them by key for disclosure.\n for (const node of [\n ...railSections.ordinary.running,\n ...railSections.ordinary.grouped.flatMap((bucket) => bucket.sessions),\n ]) {\n if (node.siteGroup && !result.has(node.session.id)) result.set(node.session.id, node);\n }\n return result;\n }, [archivedNodes, railSections.complete, railSections.ordinary]);\n\n // Manual state is separate from the small derived active-path expansion.\n // Polls can therefore never reopen a branch the user explicitly collapsed.\n const [manualExpanded, setManualExpanded] = useState<ReadonlySet<string>>(() => new Set());\n const [manualCollapsed, setManualCollapsed] = useState<ReadonlySet<string>>(() => new Set());\n const parentOf = useMemo(() => {\n const map = new Map<string, string>();\n const byId = new Set(allSessions.map((session) => session.id));\n for (const session of allSessions) {\n if (session.parentSessionId && byId.has(session.parentSessionId)) {\n map.set(session.id, session.parentSessionId);\n }\n }\n return map;\n }, [allSessions]);\n const activeAncestorIds = useMemo(\n () => sessionAncestorPath(activeSessionId, parentOf),\n [activeSessionId, parentOf],\n );\n const autoExpanded = useMemo(\n () => defaultExpandedAncestors(activeAncestorIds, manualCollapsed),\n [activeAncestorIds, manualCollapsed],\n );\n const expanded = useMemo(\n () => new Set([...manualExpanded, ...autoExpanded]),\n [autoExpanded, manualExpanded],\n );\n useEffect(() => {\n setManualExpanded(new Set());\n setManualCollapsed(new Set());\n }, [rail.workspaceId]);\n const branchReadRevision = useCallback(\n (parentId: string) =>\n listHintsAvailable\n ? Math.max(dirtyScopes.all, dirtyScopes.branches.get(parentId) ?? 0)\n : rootReadRevision,\n [listHintsAvailable, dirtyScopes, rootReadRevision],\n );\n const loadChildPage = useCallback(\n async (\n parentSessionId: string,\n cursor?: string,\n options: {\n preserve?: readonly Session[] | undefined;\n feedbackVisible?: boolean | undefined;\n } = {},\n ): Promise<void> => {\n const epoch = childLoadEpoch.current;\n if (!branchSummaryKeys.current.has(parentSessionId)) {\n const parent = branchParentsById.current.get(parentSessionId);\n if (parent) {\n branchSummaryKeys.current.set(\n parentSessionId,\n sessionBranchSummaryKey(parent, branchReadRevision(parentSessionId)),\n );\n }\n }\n childRequestSequence.current += 1;\n const requestId = childRequestSequence.current;\n setChildPages((current) =>\n beginSessionBranchRequest(current, parentSessionId, requestId, cursor, {\n feedbackVisible: options.feedbackVisible,\n }),\n );\n try {\n const readGeneration = context.sessionChannelProjectionAuthority.beginRead();\n // A Site row's \"children\" are the Site's own root conversations.\n const siteRow = parseSiteRowKey(parentSessionId);\n const page = await readLoadedSessionBranchWindow(\n (pageCursor) =>\n context.client.listSessionSummaryPage(rail.workspaceId, {\n limit: 50,\n ...(siteRow\n ? {\n parentSessionId: null,\n originSiteId: siteRow.siteId,\n ...(siteRow.channelId !== undefined ? { channelId: siteRow.channelId } : {}),\n // Its conversations are roots: list exactly the set the\n // Site row's count was computed over.\n ...(needsYouOnly ? { needsYouOnly: true } : {}),\n ...(mineOnly ? { mineOnly: true } : {}),\n }\n : // Work spawned by a Site conversation runs inside the Site too.\n { parentSessionId, siteConversations: \"include\" as const }),\n ...(pageCursor ? { cursor: pageCursor } : {}),\n archiveStatus: browseStatus,\n sortBy: browseSortBy,\n }),\n cursor === undefined\n ? Math.max(50, childPagesRef.current.get(parentSessionId)?.channelGenerations.size ?? 0)\n : 1,\n cursor,\n );\n if (childLoadEpoch.current !== epoch) return;\n setChildPages((current) =>\n commitSessionBranchPage(\n current,\n parentSessionId,\n {\n sessions: page.sessions,\n nextCursor: page.nextCursor,\n },\n {\n append: cursor !== undefined,\n replaceWindow: cursor === undefined,\n preserve: options.preserve,\n requestId,\n readGeneration,\n },\n ),\n );\n } catch {\n if (childLoadEpoch.current !== epoch) return;\n setChildPages((current) => failSessionBranchRequest(current, parentSessionId, requestId));\n }\n },\n [\n context.client,\n context.sessionChannelProjectionAuthority,\n rail.workspaceId,\n branchReadRevision,\n browseSortBy,\n browseStatus,\n needsYouOnly,\n mineOnly,\n ],\n );\n // The active route supplies exact child + ancestor detail even before the\n // lazy branch query catches up. Commit that projection into the branch cache\n // and reconcile the complete sibling page once, so leaving the child route\n // cannot make the row disappear again.\n useEffect(() => {\n const active = context.session;\n if (!hierarchyMode || !active?.parentSessionId) {\n activeBranchHydration.current = null;\n return;\n }\n const cachedPage = childPagesRef.current.get(active.parentSessionId);\n setChildPages((current) => upsertSessionBranchChild(current, active));\n const hydrationKey = `${active.parentSessionId}:${active.id}`;\n if (activeBranchHydration.current === hydrationKey) return;\n activeBranchHydration.current = hydrationKey;\n if (!sessionBranchNeedsHydration(cachedPage)) return;\n void loadChildPage(active.parentSessionId, undefined, {\n preserve: [active],\n feedbackVisible: false,\n });\n }, [context.session, hierarchyMode, loadChildPage]);\n\n // Deep active routes auto-expand their ancestor path. Load every missing\n // parent page on that path, not just the active session's immediate siblings,\n // so leaving the route does not collapse lineage-only projections back out of\n // the durable rail hierarchy.\n useEffect(() => {\n if (!hierarchyMode) return;\n const activeParentSessionId = context.session?.parentSessionId ?? null;\n for (const parentId of autoExpanded) {\n if (parentId === activeParentSessionId) continue;\n const page = childPages.get(parentId);\n if (page && !page.stale) continue;\n const node = nodesById.get(parentId);\n const knownDirectChildren =\n node?.session.treeStats?.directChildren ?? node?.children.length ?? 0;\n if (knownDirectChildren > 0) {\n void loadChildPage(parentId, undefined, { feedbackVisible: false });\n }\n }\n }, [\n autoExpanded,\n childPages,\n context.session?.parentSessionId,\n hierarchyMode,\n loadChildPage,\n nodesById,\n ]);\n\n // Root pages carry bounded descendant summaries. Commit hints refresh only\n // dirty branches; legacy polling refreshes observation-only changes as before.\n // When a loaded branch's summary changes (notably directChildren after an\n // orchestrator spawn), refresh that exact branch instead of retaining its old\n // child list forever. This preserves root-only pagination and lazy hierarchy\n // while making newly authorized children durable sidebar state.\n useEffect(() => {\n const parentsById = new Map(allSessions.map((session) => [session.id, session]));\n const loadedParentIds = new Set(childPages.keys());\n const newlyStale = new Set<string>();\n for (const parentId of branchSummaryKeys.current.keys()) {\n if (!loadedParentIds.has(parentId)) branchSummaryKeys.current.delete(parentId);\n }\n for (const [parentId, page] of childPages) {\n const parent = parentsById.get(parentId);\n if (!parent) continue;\n const nextKey = sessionBranchSummaryKey(parent, branchReadRevision(parentId));\n const previousKey = branchSummaryKeys.current.get(parentId);\n const decision = sessionBranchSummaryDecision({\n previousKey,\n nextKey,\n loading: page.loading,\n expanded: expanded.has(parentId),\n stale: page.stale,\n });\n if (decision.acknowledge) branchSummaryKeys.current.set(parentId, nextKey);\n if (decision.refresh) {\n void loadChildPage(parentId, undefined, {\n feedbackVisible: false,\n preserve: context.session?.parentSessionId === parentId ? [context.session] : undefined,\n });\n } else if (decision.markStale) newlyStale.add(parentId);\n }\n if (newlyStale.size > 0) {\n setChildPages((current) => {\n const next = new Map(current);\n for (const parentId of newlyStale) {\n const page = next.get(parentId);\n if (page) next.set(parentId, { ...page, stale: true });\n }\n return next;\n });\n }\n }, [allSessions, childPages, context.session, expanded, loadChildPage, branchReadRevision]);\n // A loaded Site row follows its complete server summary: a new or newly\n // active conversation reloads an open Site and marks a closed one stale.\n const siteRowSummaryKeys = useRef(new Map<string, string>());\n useEffect(() => {\n const newlyStale = new Set<string>();\n for (const [key, page] of childPages) {\n if (!parseSiteRowKey(key)) continue;\n const summary = nodesById.get(key)?.siteSummary;\n // Membership and status always matter; activity time only when the\n // rows are ordered by it.\n const next = summary\n ? [\n summary.conversations,\n summary.total,\n summary.attention,\n summary.failed,\n summary.active,\n summary.queued,\n summary.waiting,\n summary.unread,\n browseSortBy === \"updatedAt\" ? summary.updatedAt : \"\",\n ].join(\":\")\n : \"\";\n const previous = siteRowSummaryKeys.current.get(key);\n if (page.loading) continue;\n siteRowSummaryKeys.current.set(key, next);\n if (previous === undefined || previous === next) continue;\n if (expanded.has(key)) void loadChildPage(key, undefined, { feedbackVisible: false });\n else if (!page.stale) newlyStale.add(key);\n }\n if (newlyStale.size === 0) return;\n setChildPages((current) => {\n const next = new Map(current);\n for (const key of newlyStale) {\n const page = next.get(key);\n if (page) next.set(key, { ...page, stale: true });\n }\n return next;\n });\n }, [childPages, expanded, loadChildPage, nodesById, browseSortBy]);\n const toggleExpand = useCallback(\n (sessionId: string) => {\n const opening = !expanded.has(sessionId);\n setManualExpanded((current) => {\n const next = new Set(current);\n if (opening) next.add(sessionId);\n else next.delete(sessionId);\n return next;\n });\n setManualCollapsed((current) => {\n const next = new Set(current);\n if (opening) next.delete(sessionId);\n else next.add(sessionId);\n return next;\n });\n const node = nodesById.get(sessionId);\n const knownDirectChildren = node?.siteGroup\n ? siteRowConversationCount(node)\n : (node?.session.treeStats?.directChildren ?? node?.children.length ?? 0);\n if (\n opening &&\n hierarchyMode &&\n knownDirectChildren > 0 &&\n (!childPages.has(sessionId) ||\n childPages.get(sessionId)?.failed === true ||\n childPages.get(sessionId)?.stale === true)\n ) {\n void loadChildPage(sessionId);\n }\n },\n [childPages, expanded, hierarchyMode, loadChildPage, nodesById],\n );\n // Opening one of a Site's conversations opens its Site row once per visit\n // to that Site, as a person's own expansion would: it stays open when\n // another session is selected, and closing it again is respected while\n // switching between the Site's conversations.\n const openSiteId =\n activeSiteId ??\n (activeSessionId &&\n context.session?.id === activeSessionId &&\n context.session.parentSessionId === null\n ? (sessionSiteOrigin(context.session)?.siteId ?? null)\n : null);\n const siteRouteExpansion = useRef<string | null>(null);\n useEffect(() => {\n if (!hierarchyMode || !openSiteId) {\n siteRouteExpansion.current = null;\n return;\n }\n // The Site itself is marked without opening its row.\n if (!activeSessionId || siteRouteExpansion.current === openSiteId) return;\n const rows = [...nodesById.values()].filter((node) => node.siteGroup?.siteId === openSiteId);\n if (rows.length === 0) return;\n siteRouteExpansion.current = openSiteId;\n for (const row of rows) if (!expanded.has(row.session.id)) toggleExpand(row.session.id);\n }, [activeSessionId, expanded, hierarchyMode, nodesById, openSiteId, toggleExpand]);\n const visibleRows = useMemo(() => {\n const seen = new Set<string>();\n // Channel mode replaces the ordinary recency forest with channel sections;\n // the flattened order must match the rendered order or arrow keys drift.\n const ordinaryRows = channelMode\n ? channelSections.flatMap((section) =>\n !collapsedChannelSections.has(section.key)\n ? visibleTreeRows(\n visibleNodesForGroup(\n sessionPaginationProjectGroup(section.channelId, section.name).key,\n section.sessions,\n ),\n expanded,\n activeSessionId,\n )\n : (() => {\n const selected = findSessionTreeNode(section.sessions, activeSessionId);\n return selected ? [{ node: selected, depth: 0 }] : [];\n })(),\n )\n : visibleForestRows(visibleForest, expanded, activeSessionId);\n const archiveRows =\n browseStatus === \"active\"\n ? []\n : archiveExpanded\n ? visibleTreeRows(\n visibleNodesForGroup(\"archived\", archivedNodes),\n expanded,\n activeSessionId,\n )\n : (() => {\n const selected = findSessionTreeNode(archivedNodes, activeSessionId);\n return selected ? [{ node: selected, depth: 0 }] : [];\n })();\n return [\n ...visibleTreeRows(pinnedNodes, expanded, activeSessionId),\n ...ordinaryRows,\n ...archiveRows,\n ].filter(({ node }) => {\n if (seen.has(node.session.id)) return false;\n seen.add(node.session.id);\n return true;\n });\n }, [\n activeSessionId,\n archiveExpanded,\n archivedNodes,\n browseStatus,\n channelMode,\n channelSections,\n expanded,\n collapsedChannelSections,\n visibleForest,\n visibleNodesForGroup,\n pinnedNodes,\n ]);\n const flat = useMemo<Session[]>(() => visibleRows.map((row) => row.node.session), [visibleRows]);\n\n // The ⌘K menu answers from the chats loaded here, and next or previous chat\n // and ⌘1 to ⌘9 follow the order shown here.\n const directorySubject = context.accessContext.subjectId;\n useEffect(() => {\n rememberChats(directorySubject, [...pinned, ...sessions]);\n }, [directorySubject, pinned, sessions]);\n // ⌘K lists the Site rows shown here too: recent ones before anything is\n // typed, and the ones whose title matches. Filtered views (archived, needs\n // you, mine only) are left out so they never replace the full list.\n const sidebarSiteGroups =\n hierarchyMode && browseStatus !== \"archived\" && !needsYouOnly && !mineOnly\n ? rootPage.siteGroups\n : null;\n useEffect(() => {\n if (sidebarSiteGroups)\n rememberSidebarSites(directorySubject, rail.workspaceId, sidebarSiteGroups);\n }, [directorySubject, rail.workspaceId, sidebarSiteGroups]);\n useEffect(() => {\n setSidebarOrder(\n directorySubject,\n rail.workspaceId,\n flat.map((session) => session.id),\n pinnedChatNodes.map((node) => node.session.id),\n );\n }, [directorySubject, rail.workspaceId, flat, pinnedChatNodes]);\n // ⌘1 to ⌘9 open the pinned chats in the order shown; holding ⌘ shows which.\n const pinnedJumpNumbers = useMemo(\n () => new Map(pinnedChatNodes.slice(0, 9).map((node, index) => [node.session.id, index + 1])),\n [pinnedChatNodes],\n );\n // A pinned sub-agent chat sits in Pinned away from its parent, so its row\n // says which chat it belongs to, when that chat is known here.\n const pinnedParentTitlesRef = useRef<ReadonlyMap<string, string>>(new Map());\n const pinnedParentTitles = useMemo(() => {\n const titles = new Map<string, string>();\n const pinnedChildren = pinnedChatNodes.filter((node) => node.session.parentSessionId !== null);\n if (pinnedChildren.length > 0) {\n const loaded = new Map([...allSessions, ...pinned].map((session) => [session.id, session]));\n const known = readChatDirectory(directorySubject, rail.workspaceId).rows;\n for (const { session } of pinnedChildren) {\n const parentId = session.parentSessionId!;\n const parent = loaded.get(parentId);\n const title = parent ? sessionDisplayTitle(parent) : known.get(parentId)?.title;\n if (title) titles.set(session.id, title);\n }\n }\n // The same titles keep the same map, so pinned rows don't re-render for nothing.\n const previous = pinnedParentTitlesRef.current;\n if (\n previous.size === titles.size &&\n [...titles].every(([id, title]) => previous.get(id) === title)\n ) {\n return previous;\n }\n pinnedParentTitlesRef.current = titles;\n return titles;\n }, [allSessions, directorySubject, pinned, pinnedChatNodes, rail.workspaceId]);\n\n useLayoutEffect(() => {\n const pending = pendingSessionFocus.current;\n const root = listRef.current;\n if (!pending || !root) return;\n const operation = pending.operation;\n let cancelled = false;\n let frame: number | null = null;\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const restore = () => {\n if (cancelled) return;\n const current = pendingSessionFocus.current;\n if (!current || current.operation !== operation) return;\n const attribute = sessionFocusAttribute(current.target);\n const destinations = [...root.querySelectorAll<HTMLElement>(`[${attribute}]`)].filter(\n (element) => element.getAttribute(attribute) === current.sessionId,\n );\n const actionMode =\n current.target === \"actions\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(pointer: coarse)\").matches\n ? \"overflow\"\n : \"quick\";\n const destination =\n current.target === \"actions\"\n ? destinations.find(\n (element) =>\n element.getAttribute(\"data-session-actions-mode\") === actionMode &&\n (actionMode === \"overflow\" ||\n !current.action ||\n element.getAttribute(\"data-session-action\") === current.action),\n )\n : destinations[0];\n if (\n destination &&\n shouldRestoreSessionFocus(\n document.activeElement as HTMLElement | null,\n destination,\n current.sessionId,\n document.body,\n )\n ) {\n try {\n destination.focus({ preventScroll: true });\n } catch {\n // A concurrent query transition can remove the destination between\n // the connectivity check and focus(). The next fenced attempt is the\n // only safe recovery; never fall back to an unrelated element.\n }\n }\n };\n const finish = createSessionFocusCompletion(pendingSessionFocus, restore);\n\n // Layout handles the optimistic/rollback commit. The microtask lets\n // Radix finish its close bookkeeping, and rAF handles the post-animation\n // remount; every attempt is fenced to this exact operation.\n restore();\n queueMicrotask(() => {\n restore();\n if (cancelled) return;\n if (typeof window.requestAnimationFrame === \"function\") {\n frame = window.requestAnimationFrame(finish);\n } else {\n timeout = setTimeout(finish, 0);\n }\n });\n\n return () => {\n cancelled = true;\n if (frame !== null) window.cancelAnimationFrame(frame);\n if (timeout !== null) clearTimeout(timeout);\n };\n }, [flat, focusRestoreRevision]);\n\n const onPin = useCallback<PinFn>(\n async (target, nextPinned, restoreFocusTo = \"row\") => {\n if (pinning.current.has(target.id)) {\n return target;\n }\n const acceptedTransition = context.captureWorkspaceInvocation(target.workspaceId);\n if (!acceptedTransition) return null;\n pinning.current.add(target.id);\n const operation = ++pinOperation.current;\n const focusOperation = ++focusRestoreOperation.current;\n // An optimistic pin moves the row between different group subtrees. That\n // remounts the Radix menu trigger before Radix can restore keyboard focus.\n // Keep the intended destination through the whole request so a failed\n // mutation that rolls the row back also restores focus after its remount.\n pendingSessionFocus.current = {\n sessionId: target.id,\n operation: focusOperation,\n target: restoreFocusTo,\n settled: false,\n };\n const optimistic: Session = {\n ...target,\n pinned: nextPinned,\n pinnedAt: nextPinned ? new Date().toISOString() : null,\n pinVersion: (target.pinVersion ?? 0) + 1,\n };\n setPinOverrides((current) =>\n new Map(current).set(target.id, { session: optimistic, operation }),\n );\n try {\n const updated = await context.updateSessionPin(\n target.workspaceId,\n target.id,\n nextPinned,\n target.pinVersion ?? 0,\n );\n if (!context.ownsWorkspaceInvocation(target.workspaceId, acceptedTransition)) return null;\n if (updated) {\n setPinOverrides((current) => {\n if (current.get(target.id)?.operation !== operation) return current;\n return new Map(current).set(target.id, {\n session: updated,\n operation,\n });\n });\n }\n await refreshSessionPages();\n if (!context.ownsWorkspaceInvocation(target.workspaceId, acceptedTransition)) return null;\n const label = sessionDisplayTitle(target);\n announcePinResult(\n updated\n ? `${nextPinned ? \"Pinned\" : \"Unpinned\"} ${label}.`\n : `${label} was not ${nextPinned ? \"pinned\" : \"unpinned\"}. Server state refreshed.`,\n );\n return updated;\n } finally {\n pinning.current.delete(target.id);\n const pending = pendingSessionFocus.current;\n if (pending?.sessionId === target.id && pending.operation === focusOperation) {\n pending.settled = true;\n setFocusRestoreRevision((current) => current + 1);\n }\n setPinOverrides((current) => {\n if (current.get(target.id)?.operation !== operation) return current;\n const next = new Map(current);\n next.delete(target.id);\n return next;\n });\n }\n },\n [announcePinResult, context, refreshSessionPages],\n );\n\n const loadedSessionIdsRef = useRef<ReadonlySet<string>>(new Set());\n const loadedGroupWindows = useRef(\n new Map<string, { generation: number; group: SessionPaginationGroup; rows: number }>(),\n );\n const groupReadRevisions = useRef(new Map<string, string>());\n const [failedGroupRefreshes, setFailedGroupRefreshes] = useState<ReadonlyMap<string, number>>(\n () => new Map(),\n );\n const groupReadRevision = (group: SessionPaginationGroup) =>\n listHintsAvailable\n ? `hint:${sessionListGroupRevision(dirtyScopes, group)}`\n : `poll:${rootReadRevision}`;\n const currentGroupReadRevision = useRef(groupReadRevision);\n currentGroupReadRevision.current = groupReadRevision;\n loadedSessionIdsRef.current = new Set(allSessions.map((session) => session.id));\n const loadMoreInGroup = useCallback(\n async (\n group: SessionPaginationGroup,\n refreshWindow = false,\n minimumAdditional = 0,\n // Automatic fill loads are layout, not a reader action: keep them quiet.\n announce = true,\n ) => {\n const requestGeneration = pageGeneration;\n const current = activeSessionContinuation(\n groupContinuationsRef.current.get(group.key) ?? emptySessionContinuation(requestGeneration),\n requestGeneration,\n );\n if (current.nextCursor === null && !refreshWindow) return;\n // A quiet reconciliation must not consume an explicit pagination retry\n // or race an explicit read. Leave its revision unread instead: the\n // revision effect rereads this window once the explicit read settles.\n if (\n refreshWindow &&\n (current.failed ||\n (groupLoadingRef.current.get(group.key) === requestGeneration &&\n !groupRefreshing.current.has(group.key)))\n ) {\n groupReadRevisions.current.delete(group.key);\n return;\n }\n if (\n groupLoadingRef.current.get(group.key) === requestGeneration &&\n (refreshWindow || !groupRefreshing.current.has(group.key))\n )\n return;\n\n const requestedAt = new Date();\n const groupQuery = sessionPaginationGroupQuery(group, paginationBrowseFilter, requestedAt);\n if (!groupQuery) return;\n\n const attempt = (groupLoadAttempts.current.get(group.key) ?? 0) + 1;\n groupLoadAttempts.current.set(group.key, attempt);\n groupLoadingRef.current = new Map(groupLoadingRef.current).set(group.key, requestGeneration);\n if (refreshWindow) groupRefreshing.current.add(group.key);\n else {\n groupRefreshing.current.delete(group.key);\n setGroupLoadingGenerations(\n new Map(\n [...groupLoadingRef.current].filter(([key]) => !groupRefreshing.current.has(key)),\n ),\n );\n }\n\n const requestIsCurrent = (): boolean =>\n paginationIdentity.current.generation === requestGeneration &&\n groupLoadAttempts.current.get(group.key) === attempt;\n\n // The first read already observes this revision. Do not immediately\n // reread its window on settlement; a newer hint during the read still\n // differs and is reconciled by the effect below.\n if (\n !refreshWindow &&\n loadedGroupWindows.current.get(group.key)?.generation !== requestGeneration\n )\n groupReadRevisions.current.set(group.key, currentGroupReadRevision.current(group));\n\n const pageSize = group.kind === \"channel\" ? SESSION_GROUP_VISIBLE_STEP : 50;\n // A request for more rows than one step (automatic fill) reads them in\n // one bounded page instead of a chain of four-row requests.\n const continuationLimit = Math.min(50, Math.max(pageSize, minimumAdditional));\n const listPage = async (pageCursor?: string, limit = pageSize) => {\n const readGeneration = context.sessionChannelProjectionAuthority.beginRead();\n const page = await context.client.listSessionSummaryPage(rail.workspaceId, {\n // Server-filtered projects fetch only the displayed step. Client-only\n // discovery groups retain larger pages to avoid empty-match reads.\n limit,\n includePinned: false,\n ...(needsYouOnly && group.kind !== \"archived\" ? { needsYouOnly: true } : {}),\n ...(mineOnly ? { mineOnly: true } : {}),\n ...(pageCursor ? { cursor: pageCursor } : {}),\n ...(group.kind !== \"archived\" && search ? { search } : {}),\n ...(group.kind === \"archived\" || hierarchyMode ? { parentSessionId: null } : {}),\n ...groupQuery,\n archiveStatus:\n group.kind === \"archived\"\n ? \"archived\"\n : browseStatus === \"all\"\n ? \"active\"\n : browseStatus,\n ...(group.kind === \"archived\" ? {} : { sortBy: browseSortBy }),\n });\n return { page, readGeneration };\n };\n const filterPage = (page: SessionListResponse): SessionListResponse => ({\n ...page,\n pinned: [],\n sessions: page.sessions.filter(\n (session) =>\n !deletedRootIds.current.has(session.rootSessionId ?? session.id) &&\n sessionMatchesPaginationGroup(session, group, requestedAt),\n ),\n });\n setGroupContinuations((states) => {\n const latest = activeSessionContinuation(\n states.get(group.key) ?? emptySessionContinuation(requestGeneration),\n requestGeneration,\n );\n return new Map(states).set(group.key, { ...latest, failed: false });\n });\n\n try {\n if (refreshWindow) {\n const window = loadedGroupWindows.current.get(group.key);\n if (!window || window.generation !== requestGeneration) return;\n let replacement = emptySessionContinuation(requestGeneration);\n let pagesRead = 0;\n let rowsRead = 0;\n // Revalidate only the window the user already loaded. Keep the old\n // window visible until its replacement is complete, including when\n // another device moves an old row into an exhausted group.\n do {\n // Refresh the retained window in bounded full pages, rather than\n // repeating one network request per four-row disclosure click.\n const readLimit = Math.min(500, Math.max(pageSize, window.rows - rowsRead));\n const read = await listPage(replacement.nextCursor ?? undefined, readLimit);\n if (!requestIsCurrent()) return;\n replacement = mergeSessionContinuation(\n replacement,\n requestGeneration,\n requestGeneration,\n filterPage(read.page),\n attempt,\n pagesRead === 0 ? read.readGeneration : replacement.snapshotGeneration,\n \"group\",\n read.readGeneration,\n );\n pagesRead += 1;\n rowsRead += readLimit;\n } while (replacement.nextCursor && rowsRead < window.rows);\n setGroupContinuations((states) => {\n if (!requestIsCurrent()) return states;\n return new Map(states).set(group.key, {\n ...replacement,\n sessions: replacement.sessions.filter(\n (session) => !deletedRootIds.current.has(session.rootSessionId ?? session.id),\n ),\n });\n });\n loadedGroupWindows.current.set(group.key, {\n ...window,\n rows: Math.max(pageSize, rowsRead),\n });\n setFailedGroupRefreshes((failed) => {\n const next = new Map(failed);\n next.delete(group.key);\n return next;\n });\n return;\n }\n let pageRead;\n let rebased = false;\n try {\n pageRead = await listPage(current.nextCursor ?? undefined, continuationLimit);\n } catch (cursorError) {\n if (!current.nextCursor || !(cursorError instanceof OpenGeniSessionListCursorError)) {\n throw cursorError;\n }\n pageRead = await listPage(undefined, continuationLimit);\n rebased = true;\n }\n if (!requestIsCurrent()) return;\n const reads = [pageRead];\n const receivedIds = new Set(\n filterPage(pageRead.page).sessions.map((session) => session.id),\n );\n const newlyLoadedCount = () =>\n [...receivedIds].filter((id) => !loadedSessionIdsRef.current.has(id)).length;\n // Client-only groups (running/creator discovery) and overlapping\n // discovery pages can contain no new matches. One disclosure action\n // continues until its small display step is filled or the cursor ends.\n while (reads.at(-1)!.page.nextCursor && newlyLoadedCount() < minimumAdditional) {\n const read = await listPage(reads.at(-1)!.page.nextCursor!, continuationLimit);\n if (!requestIsCurrent()) return;\n reads.push(read);\n for (const session of filterPage(read.page).sessions) receivedIds.add(session.id);\n }\n const page = filterPage(reads.at(-1)!.page);\n const pageReadGeneration = pageRead.readGeneration;\n const snapshotRevision =\n current.nextCursor === undefined || rebased ? attempt : current.snapshotRevision;\n const snapshotGeneration =\n current.nextCursor === undefined || rebased\n ? pageReadGeneration\n : current.snapshotGeneration;\n const newlyLoaded = newlyLoadedCount();\n const receivedRowCount = reads.reduce(\n (count, read) => count + read.page.sessions.length,\n 0,\n );\n const previousWindow = loadedGroupWindows.current.get(group.key);\n loadedGroupWindows.current.set(group.key, {\n generation: requestGeneration,\n group,\n rows:\n !rebased && previousWindow?.generation === requestGeneration\n ? previousWindow.rows + receivedRowCount\n : Math.max(pageSize, receivedRowCount),\n });\n setGroupContinuations((states) => {\n if (!requestIsCurrent()) return states;\n const latest = activeSessionContinuation(\n states.get(group.key) ?? emptySessionContinuation(requestGeneration),\n requestGeneration,\n );\n let next = latest;\n for (const [index, read] of reads.entries()) {\n next =\n rebased && index === 0\n ? rebaseSessionContinuation(\n next,\n requestGeneration,\n requestGeneration,\n filterPage(read.page),\n snapshotRevision,\n snapshotGeneration,\n \"group\",\n )\n : mergeSessionContinuation(\n next,\n requestGeneration,\n requestGeneration,\n filterPage(read.page),\n snapshotRevision,\n snapshotGeneration,\n \"group\",\n read.readGeneration,\n );\n }\n return new Map(states).set(group.key, {\n ...next,\n sessions: next.sessions.filter(\n (session) => !deletedRootIds.current.has(session.rootSessionId ?? session.id),\n ),\n });\n });\n if (announce)\n setAnnouncement(\n newlyLoaded > 0\n ? `More sessions are available in ${group.label}.`\n : page.nextCursor\n ? `No additional older sessions in ${group.label} yet.`\n : `No more older sessions in ${group.label}.`,\n );\n return { exhausted: page.nextCursor === null, added: newlyLoaded, failed: false };\n } catch {\n if (!requestIsCurrent()) return;\n if (refreshWindow) {\n // Keep the accepted rows and disclosure cursor usable. A failed\n // background refresh is not a failed request for older rows.\n setFailedGroupRefreshes((failed) => new Map(failed).set(group.key, requestGeneration));\n return;\n }\n setGroupContinuations((states) => {\n if (!requestIsCurrent()) return states;\n const latest = activeSessionContinuation(\n states.get(group.key) ?? emptySessionContinuation(requestGeneration),\n requestGeneration,\n );\n return new Map(states).set(group.key, { ...latest, failed: true });\n });\n if (announce && !refreshWindow)\n setAnnouncement(`Older sessions in ${group.label} did not load. Retry is available.`);\n return { exhausted: false, added: 0, failed: true };\n } finally {\n if (requestIsCurrent()) {\n const nextLoading = new Map(groupLoadingRef.current);\n nextLoading.delete(group.key);\n groupLoadingRef.current = nextLoading;\n groupRefreshing.current.delete(group.key);\n // A dirty hint may have arrived while this quiet refresh was busy.\n // Publish settlement even without a spinner so it cannot be lost.\n setGroupLoadingGenerations(\n new Map([...nextLoading].filter(([key]) => !groupRefreshing.current.has(key))),\n );\n }\n }\n },\n [\n context.client,\n context.sessionChannelProjectionAuthority,\n hierarchyMode,\n pageGeneration,\n paginationBrowseFilter,\n needsYouOnly,\n mineOnly,\n rail.workspaceId,\n search,\n browseSortBy,\n browseStatus,\n ],\n );\n\n useEffect(() => {\n if (!channelMode || search || browseStatus === \"archived\") return;\n for (const group of projectPaginationGroups) {\n const continuation = activeSessionContinuation(\n groupContinuationsRef.current.get(group.key) ?? emptySessionContinuation(pageGeneration),\n pageGeneration,\n );\n if (continuation.nextCursor === undefined && !continuation.failed) {\n void loadMoreInGroup(group);\n }\n }\n }, [browseStatus, channelMode, loadMoreInGroup, pageGeneration, projectPaginationGroups, search]);\n\n // A workspace-wide discovery page may contain only one row for a creator.\n // Hydrate each discovered creator independently before offering disclosure.\n useEffect(() => {\n if (browseGroupBy !== \"creator\" || search || browseStatus === \"archived\") return;\n for (const bucket of forest.grouped) {\n const creator = bucket.sessions[0]?.session.createdBy;\n if (!creator) continue;\n const group: SessionPaginationGroup = {\n key: bucket.group,\n label: bucket.label,\n kind: \"creator\",\n creator: { kind: creator.kind, subjectId: creator.subjectId },\n };\n const continuation = activeSessionContinuation(\n groupContinuationsRef.current.get(group.key) ?? emptySessionContinuation(pageGeneration),\n pageGeneration,\n );\n if (continuation.nextCursor === undefined && !continuation.failed)\n void loadMoreInGroup(group);\n }\n }, [browseGroupBy, browseStatus, forest.grouped, loadMoreInGroup, pageGeneration, search]);\n\n useEffect(() => {\n if (browseStatus === \"active\" || search) return;\n const continuation = activeSessionContinuation(\n groupContinuationsRef.current.get(\"archived\") ?? emptySessionContinuation(pageGeneration),\n pageGeneration,\n );\n if (continuation.nextCursor === undefined && !continuation.failed) {\n void loadMoreInGroup(ARCHIVED_SESSION_GROUP);\n }\n }, [browseStatus, loadMoreInGroup, pageGeneration, search]);\n\n const refreshGroupWindow = useRef(loadMoreInGroup);\n refreshGroupWindow.current = loadMoreInGroup;\n useEffect(() => {\n for (const [key, window] of loadedGroupWindows.current) {\n if (window.generation !== pageGeneration) {\n loadedGroupWindows.current.delete(key);\n groupReadRevisions.current.delete(key);\n }\n }\n }, [pageGeneration]);\n useEffect(() => {\n for (const window of loadedGroupWindows.current.values()) {\n if (window.generation !== pageGeneration) continue;\n const revision = currentGroupReadRevision.current(window.group);\n if (groupReadRevisions.current.get(window.group.key) === revision) continue;\n // A hint arriving during a read remains dirty until that read settles.\n if (groupLoadingRef.current.get(window.group.key) === pageGeneration) continue;\n groupReadRevisions.current.set(window.group.key, revision);\n void refreshGroupWindow.current(window.group, true);\n }\n }, [\n rootReadRevision,\n pageGeneration,\n listHintsAvailable,\n dirtyScopes,\n groupContinuations,\n groupLoadingGenerations,\n ]);\n\n // Successful scopes stay idle. A failed read remains dirty and retries on\n // the existing cadence even if no further database changes occur.\n useEffect(() => {\n if (!listHintsAvailable || document.visibilityState === \"hidden\") return;\n const failedChildren = [...childPages].filter(([, page]) => page.failed);\n const failedGroups = [...failedGroupRefreshes].filter(\n ([, generation]) => generation === pageGeneration,\n );\n if (\n !error &&\n !globalPinsError &&\n !channelsQuery.error &&\n !activeLineage.error &&\n !failedChildren.length &&\n !failedGroups.length\n )\n return;\n const retry = window.setTimeout(() => {\n if (error) void refresh();\n if (globalPinsError) void refreshGlobalPins();\n if (channelsQuery.error) void refreshChannels();\n if (activeLineage.error) void refreshLineage();\n for (const [parentId] of failedChildren)\n void loadChildPage(parentId, undefined, { feedbackVisible: false });\n for (const [key] of failedGroups) {\n const window = loadedGroupWindows.current.get(key);\n if (window?.generation === pageGeneration)\n void refreshGroupWindow.current(window.group, true);\n }\n }, 15_000);\n return () => window.clearTimeout(retry);\n }, [\n listHintsAvailable,\n documentForeground,\n childPages,\n failedGroupRefreshes,\n error,\n globalPinsError,\n channelsQuery.error,\n activeLineage.error,\n refresh,\n refreshGlobalPins,\n refreshChannels,\n refreshLineage,\n loadChildPage,\n pageGeneration,\n ]);\n\n const groupPageState = (\n group: SessionPaginationGroup,\n initialNextCursor: string | null,\n independentlyPaged: boolean,\n ) => {\n const continuation = activeSessionContinuation(\n groupContinuations.get(group.key) ?? emptySessionContinuation(pageGeneration),\n pageGeneration,\n );\n return {\n continuation,\n loading: groupLoadingGenerations.get(group.key) === pageGeneration,\n hasMore:\n continuation.nextCursor === undefined\n ? independentlyPaged || initialNextCursor !== null\n : continuation.nextCursor !== null,\n };\n };\n\n const paginationForGroup = (\n group: SessionPaginationGroup,\n initialNextCursor: string | null,\n independentlyPaged = false,\n nodes?: SessionTreeNode[],\n ): SessionGroupPaginationProps | undefined => {\n const {\n continuation,\n loading: groupLoading,\n hasMore,\n } = groupPageState(group, initialNextCursor, independentlyPaged);\n const visibleCount = visibleCountForGroup(group.key);\n const fillCount = fillCountForGroup(group.key);\n const hiddenLocally = !search && nodes !== undefined && nodes.length > visibleCount;\n if (!hasMore && !hiddenLocally && !continuation.failed && !groupLoading) return undefined;\n return {\n group,\n hasMore: hasMore || hiddenLocally || continuation.failed,\n loading: groupLoading,\n failed: continuation.failed,\n isCurrent: () => paginationIdentity.current.generation === pageGeneration,\n ...(nodes && !search\n ? {\n revealCount:\n hasMore || continuation.failed\n ? SESSION_GROUP_VISIBLE_STEP\n : Math.min(SESSION_GROUP_VISIBLE_STEP, nodes.length - visibleCount),\n }\n : {}),\n onLoadMore: async (requestedGroup) => {\n if (!nodes || search)\n return (await loadMoreInGroup(requestedGroup, false, SESSION_GROUP_VISIBLE_STEP))\n ?.exhausted;\n const { nextCount, needsPage } = sessionGroupDisclosurePlan(\n visibleCount,\n nodes.length,\n hasMore,\n continuation.failed,\n );\n const result = needsPage\n ? await loadMoreInGroup(requestedGroup, false, Math.max(0, nextCount - nodes.length))\n : { exhausted: !hasMore, added: 0, failed: false };\n if (result === undefined || paginationIdentity.current.generation !== pageGeneration)\n return;\n // A current failure keeps its Retry control, but never advances the\n // disclosure window. Stale/no-op loads still return no focus outcome.\n if (result.failed) return false;\n setArchiveWindowReductions((current) => {\n const counts = new Map(current.counts);\n counts.delete(group.key);\n return { ...current, counts };\n });\n // Manual disclosure stacks on the automatic fill shown when clicked.\n setGroupWindows((current) => ({\n generation: pageGeneration,\n memoryId: groupWindowMemoryId,\n counts: new Map(\n current.generation === pageGeneration && current.memoryId === groupWindowMemoryId\n ? current.counts\n : restoredGroupWindows,\n ).set(group.key, Math.max(SESSION_GROUP_VISIBLE_STEP, nextCount - fillCount)),\n }));\n setAnnouncement(`Showing up to ${nextCount} sessions in ${group.label}.`);\n return result.exhausted && nodes.length + result.added <= nextCount;\n },\n };\n };\n\n const paginationGroupForBucket = (\n bucket: SessionForest[\"grouped\"][number],\n ): SessionPaginationGroup | null => {\n if (browseGroupBy === \"none\") return { key: \"workspace\", label: \"sessions\", kind: \"results\" };\n if (browseGroupBy === \"activity\") {\n return {\n key: `activity:${bucket.group}`,\n label: bucket.label,\n kind: \"activity\",\n group: bucket.group as SessionRecencyGroup,\n };\n }\n if (browseGroupBy === \"created\") {\n return {\n key: bucket.group,\n label: bucket.label,\n kind: \"created\",\n group: bucket.group.replace(/^created:/, \"\") as SessionRecencyGroup,\n };\n }\n const creator = bucket.sessions[0]?.session.createdBy;\n return creator\n ? {\n key: bucket.group,\n label: bucket.label,\n kind: \"creator\",\n creator: { kind: creator.kind, subjectId: creator.subjectId },\n }\n : null;\n };\n const matchingResultsPagination = paginationForGroup(\n { key: \"matching-results\", label: \"matching sessions\", kind: \"results\" },\n nextCursor,\n );\n // Default is also a move destination: keep its header when its last row\n // leaves, even if there is no next page of unfiled sessions.\n const renderedChannelSections =\n browseStatus === \"archived\" ||\n !showEmptyGroups ||\n channelSections.some((section) => section.channelId === null)\n ? channelSections\n : [...channelSections, { key: \"default\", channelId: null, name: \"Default\", sessions: [] }];\n const renderedGroupedBuckets =\n browseGroupBy === \"creator\" || browseGroupBy === \"none\" || browseGroupBy === \"project\"\n ? forest.grouped\n : SESSION_GROUP_ORDER.flatMap((group) => {\n const key = browseGroupBy === \"created\" ? `created:${group}` : group;\n const existing = forest.grouped.find((bucket) => bucket.group === key);\n if (existing) return [existing];\n const bucket: SessionForest[\"grouped\"][number] = {\n group: key,\n label:\n browseGroupBy === \"created\"\n ? group === \"today\"\n ? \"Created today\"\n : group === \"yesterday\"\n ? \"Created yesterday\"\n : group === \"previous7\"\n ? \"Created in previous 7 days\"\n : \"Created earlier\"\n : SESSION_GROUP_LABELS(t)[group],\n sessions: [],\n };\n return showEmptyGroups ? [bucket] : [];\n });\n\n // Expanded, windowed groups in rendered (top-down) order. Spare rail height\n // fills these before any \"Show more\" control is needed.\n const fillTargets: (SessionGroupFillCandidate & {\n group: SessionPaginationGroup | null;\n loading: boolean;\n visibleSessionIds: string[];\n })[] = [];\n const addFillTarget = (\n key: string,\n nodes: readonly SessionTreeNode[],\n group: SessionPaginationGroup | null,\n initialNextCursor: string | null,\n independentlyPaged: boolean,\n ) => {\n const state = group ? groupPageState(group, initialNextCursor, independentlyPaged) : null;\n fillTargets.push({\n key,\n group,\n loaded: nodes.length,\n base: Math.max(0, baseCountForGroup(key) - archiveReduction(key)),\n visibleSessionIds: sessionGroupWindowNodes(\n nodes,\n visibleCountForGroup(key),\n activeSessionId,\n 0,\n ).map((node) => node.session.id),\n // Failed pages keep their Retry control. Active sessions are filtered\n // client-side across the whole workspace, so fill uses only loaded rows.\n hasMore:\n state !== null &&\n state.hasMore &&\n !state.continuation.failed &&\n !(group?.kind === \"activity\" && group.group === \"active\"),\n loading: state?.loading ?? false,\n });\n };\n if (!search) {\n if (browseStatus !== \"archived\" && channelMode) {\n for (const section of renderedChannelSections) {\n if (collapsedChannelSections.has(section.key)) continue;\n const group = sessionPaginationProjectGroup(section.channelId, section.name);\n addFillTarget(group.key, section.sessions, group, null, true);\n }\n } else if (browseStatus !== \"archived\") {\n if (browseGroupBy !== \"none\" && forest.running.length > 0) {\n addFillTarget(\n \"activity:active\",\n forest.running,\n { key: \"activity:active\", label: \"Active\", kind: \"activity\", group: \"active\" },\n nextCursor,\n false,\n );\n }\n for (const bucket of renderedGroupedBuckets) {\n const group = paginationGroupForBucket(bucket);\n addFillTarget(\n group?.key ?? bucket.group,\n bucket.sessions,\n group,\n nextCursor,\n browseGroupBy === \"creator\",\n );\n }\n }\n if (browseStatus !== \"active\" && archiveExpanded) {\n addFillTarget(\"archived\", archivedNodes, ARCHIVED_SESSION_GROUP, null, true);\n }\n }\n const fillTargetsRef = useRef(fillTargets);\n fillTargetsRef.current = fillTargets;\n const fillGenerationRef = useRef(pageGeneration);\n fillGenerationRef.current = pageGeneration;\n const lastFillViewportHeight = useRef<number | null>(null);\n const measureFill = useCallback(() => {\n const list = listRef.current;\n const viewport = list?.closest<HTMLElement>(\"[data-rail-scroll-viewport]\");\n if (!list || !viewport) return;\n // Row pitch comes from the rendered rows, so density and coarse-pointer\n // sizing need no constants here.\n const rows = [...list.querySelectorAll<HTMLElement>(\"[data-session-row]\")].map((row) =>\n (row.parentElement ?? row).getBoundingClientRect(),\n );\n const first = rows[0];\n if (!first || first.height <= 0) return;\n const gap = rows[1] ? rows[1].top - first.top : 0;\n const rowHeight = gap > first.height && gap < first.height * 2 ? gap : first.height;\n const viewportHeight = viewport.clientHeight;\n const frozen = archiveFillFreeze.current;\n if (frozen?.generation === fillGenerationRef.current && frozen.height === viewportHeight)\n return;\n archiveFillFreeze.current = null;\n const previousHeight = lastFillViewportHeight.current;\n lastFillViewportHeight.current = viewportHeight;\n const contentBottom =\n list.getBoundingClientRect().bottom -\n viewport.getBoundingClientRect().top +\n viewport.scrollTop;\n const free = viewportHeight - contentBottom;\n const freeRows = free >= 0 ? Math.floor(free / rowHeight) : -Math.ceil(-free / rowHeight);\n // Only a shorter viewport takes rows back. Manual disclosure, expanded\n // branches and new sessions scroll instead of retracting visible rows.\n const shrink = previousHeight !== null && viewportHeight < previousHeight;\n const generation = fillGenerationRef.current;\n setGroupFill((current) => {\n const counts = current.generation === generation ? current.counts : new Map<string, number>();\n const next = planSessionGroupFill(fillTargetsRef.current, counts, freeRows, shrink);\n return current.generation === generation && sameSessionGroupFill(counts, next)\n ? current\n : { generation, counts: next };\n });\n }, []);\n useEffect(() => {\n const list = listRef.current;\n const viewport = list?.closest<HTMLElement>(\"[data-rail-scroll-viewport]\");\n if (!list || !viewport || typeof ResizeObserver === \"undefined\") return;\n let frame = 0;\n const schedule = () => {\n if (frame) return;\n frame = requestAnimationFrame(() => {\n frame = 0;\n measureFill();\n });\n };\n // The viewport resizes with the window and rail chrome; the list resizes\n // when groups collapse, rows load or the selected row changes.\n const observer = new ResizeObserver(schedule);\n observer.observe(viewport);\n observer.observe(list);\n return () => {\n observer.disconnect();\n if (frame) cancelAnimationFrame(frame);\n };\n }, [measureFill]);\n const fillSignature = fillTargets\n .map(\n (target) =>\n `${target.key}:${target.loaded}:${target.base}:${target.hasMore ? 1 : 0}:${\n target.loading ? 1 : 0\n }:${fillCountForGroup(target.key)}`,\n )\n .join(\"|\");\n // Membership or paging can change without resizing the list (for example a\n // group becoming exhausted). Re-plan on those transitions too.\n useEffect(() => {\n const frame = requestAnimationFrame(measureFill);\n return () => cancelAnimationFrame(frame);\n }, [fillSignature, measureFill, pageGeneration]);\n // Load rows that the fill plan shows but no page holds yet. Each request is\n // keyed by what it asks for, so a page with no new rows is not retried.\n const fillRequests = useRef(new Map<string, string>());\n useEffect(() => {\n for (const target of fillTargetsRef.current) {\n const fill = fillCountForGroup(target.key);\n const visible = target.base + fill;\n // Restored manual windows load too, after the rail returns from Settings.\n const restored = target.base > SESSION_GROUP_VISIBLE_STEP;\n if (!target.group || !target.hasMore || target.loading || (fill === 0 && !restored)) continue;\n if (visible <= target.loaded) continue;\n const request = `${pageGeneration}:${target.loaded}:${visible}`;\n if (fillRequests.current.get(target.key) === request) continue;\n fillRequests.current.set(target.key, request);\n void loadMoreInGroup(target.group, false, visible - target.loaded, false);\n }\n }, [fillCountForGroup, fillSignature, loadMoreInGroup, pageGeneration]);\n\n // The discovery cursor is workspace-wide, so it cannot prove that any\n // individual project contains older rows. Keep its control outside projects.\n const workspacePagination = paginationForGroup(\n { key: \"workspace\", label: \"this workspace\", kind: \"results\" },\n nextCursor,\n );\n const activePagination = paginationForGroup(\n { key: \"activity:active\", label: \"Active\", kind: \"activity\", group: \"active\" },\n nextCursor,\n );\n const creatorDiscoveryPagination =\n browseGroupBy === \"creator\" && !paginationBrowseFilter.creator\n ? paginationForGroup(\n {\n key: \"creator-discovery\",\n label: \"More creators\",\n kind: \"creatorDiscovery\",\n knownCreators: forest.grouped.flatMap((bucket) => {\n const creator = bucket.sessions[0]?.session.createdBy;\n return creator ? [{ kind: creator.kind, subjectId: creator.subjectId }] : [];\n }),\n },\n nextCursor,\n )\n : undefined;\n\n // Cross-tab invalidation and lifecycle reconciliation. Cross-device commit\n // hints arrive within the existing 15s cadence; focus/online reconcile now.\n useEffect(\n () => subscribeToSessionPinChanges(rail.workspaceId, () => void refreshSessionPages()),\n [rail.workspaceId, refreshSessionPages],\n );\n useEffect(() => {\n const reconcile = () => void refreshSessionPages();\n const onVisibility = () => {\n if (document.visibilityState === \"visible\") reconcile();\n };\n window.addEventListener(\"focus\", reconcile);\n window.addEventListener(\"online\", reconcile);\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n window.removeEventListener(\"focus\", reconcile);\n window.removeEventListener(\"online\", reconcile);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, [refreshSessionPages]);\n\n const [focusedSessionId, setFocusedSessionId] = useState<string | null>(null);\n const rowFocusIntent = useRef<string | null>(null);\n const focusIndex = useMemo(() => {\n const preferredId = focusedSessionId ?? activeSessionId;\n const preferred = preferredId ? flat.findIndex((session) => session.id === preferredId) : -1;\n return preferred >= 0 ? preferred : flat.length > 0 ? 0 : -1;\n }, [activeSessionId, flat, focusedSessionId]);\n\n // Follow the active session only when the ROUTE changes. Polls, pagination,\n // pin reorder, and cross-device reconciliation also replace `flat`; those\n // refreshes must preserve a keyboard user's still-visible roving target\n // instead of stealing focus back to the route-active row.\n const previousActiveSessionId = useRef(activeSessionId);\n useEffect(() => {\n const routeChanged = previousActiveSessionId.current !== activeSessionId;\n previousActiveSessionId.current = activeSessionId;\n if (routeChanged) {\n rowRevealIntent.current = activeSessionId;\n }\n setFocusedSessionId((current) => {\n if (!routeChanged && current && flat.some((session) => session.id === current)) {\n return current;\n }\n if (activeSessionId && flat.some((session) => session.id === activeSessionId)) {\n return activeSessionId;\n }\n return flat[0]?.id ?? null;\n });\n }, [activeSessionId, flat]);\n\n const onKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (flat.length === 0) {\n return;\n }\n const target = event.target as HTMLElement | null;\n if (!target?.hasAttribute(\"data-session-focus\")) {\n return;\n }\n let nextIndex: number | null = null;\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n nextIndex = Math.min(flat.length - 1, focusIndex + 1);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n nextIndex = Math.max(0, focusIndex - 1);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n nextIndex = 0;\n } else if (event.key === \"End\") {\n event.preventDefault();\n nextIndex = flat.length - 1;\n }\n const next = nextIndex === null ? null : flat[nextIndex];\n if (next && shouldRecordSessionRowFocusIntent(nextIndex, focusIndex)) {\n rowFocusIntent.current = next.id;\n setFocusedSessionId(next.id);\n } else {\n // A boundary key is a navigation no-op. Clear any older intent\n // synchronously so a later list refresh cannot steal focus from a row\n // action that the user focused after the no-op.\n rowFocusIntent.current = null;\n }\n },\n [flat, focusIndex],\n );\n\n // Consume an explicit reveal/focus intent once. Data churn can rerun this\n // effect, but with no intent it owns neither DOM focus nor rail scroll.\n // Layout timing makes real DOM focus part of the discrete keyboard commit;\n // a passive effect can leave Home/End visibly on the prior row for a frame.\n useLayoutEffect(() => {\n const root = listRef.current;\n if (focusIndex < 0 || !root) {\n return;\n }\n const requestedFocusId = rowFocusIntent.current;\n const requestedRevealId = rowRevealIntent.current;\n const requestedSessionId = requestedFocusId ?? requestedRevealId;\n if (!requestedSessionId) {\n return;\n }\n const row = [...root.querySelectorAll<HTMLElement>(\"[data-session-row]\")].find(\n (candidate) => candidate.dataset.sessionRow === requestedSessionId,\n );\n if (!row) {\n return;\n }\n // Arrow/Home/End navigation must move real DOM focus, not just paint a\n // visual highlight. A route/poll/pin reorder has no such intent and must\n // never steal focus from an actions trigger or another active control.\n if (requestedFocusId) {\n const renderedSessionId = flat[focusIndex]?.id ?? null;\n if (\n pendingSessionFocus.current ||\n !root.contains(document.activeElement) ||\n !shouldMoveSessionRowFocus(requestedFocusId, renderedSessionId)\n ) {\n rowFocusIntent.current = null;\n return;\n }\n rowFocusIntent.current = null;\n row.scrollIntoView({ block: \"nearest\" });\n row.focus();\n } else {\n consumeSessionRowRevealIntent(root, rowRevealIntent);\n }\n }, [flat, focusIndex]);\n\n useEffect(() => {\n if (loading || (!search && !browseControlsActive)) return;\n const count = sessionBrowseResultCount(browseSessions, hierarchyMode);\n setAnnouncement(`${count} matching session${count === 1 ? \"\" : \"s\"}.`);\n }, [browseControlsActive, browseSessions, hierarchyMode, loading, search]);\n\n return (\n <SiteRowActionsContext.Provider value={siteRowActions}>\n <WorkstreamRootsContext.Provider value={workstreamRoots}>\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n <div className=\"mb-1 flex min-w-0 shrink-0 items-center gap-1 pl-[18px] pr-3 pt-1\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-normal text-fg-label\">\n {search ? \"Search results\" : browseControlsActive ? \"Browse sessions\" : \"Sessions\"}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={openSearchDialog}\n aria-label=\"Search sessions\"\n aria-haspopup=\"dialog\"\n aria-keyshortcuts={searchShortcut?.ariaKeys}\n className=\"shrink-0 text-fg-label hover:text-fg pointer-coarse:size-11\"\n >\n <SearchIcon aria-hidden=\"true\" className=\"size-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <TooltipWithKeys label=\"Search sessions\" shortcut={searchShortcut} />\n </TooltipContent>\n </Tooltip>\n {channelMode ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"New project\"\n onClick={() => setChannelDialogOpen(true)}\n className=\"shrink-0 text-fg-label hover:text-fg pointer-coarse:size-11\"\n >\n <FolderPlusIcon className=\"size-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">New project</TooltipContent>\n </Tooltip>\n ) : null}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={\n needsYouOnly\n ? \"Session view, showing sessions that need you\"\n : needsYouCount > 0\n ? `Session view, ${needsYouCount} ${needsYouCount === 1 ? \"session needs\" : \"sessions need\"} you`\n : browseControlsActive\n ? \"Session view, customized\"\n : \"Session view\"\n }\n className=\"relative shrink-0 text-fg-label hover:text-fg pointer-coarse:size-11\"\n >\n <ListFilterIcon className=\"size-3.5\" />\n {needsYouCount > 0 && !needsYouOnly ? (\n <span\n data-needs-you-dot\n className=\"absolute right-0.5 top-0.5 size-1.5 rounded-full bg-status-waiting\"\n />\n ) : browseControlsActive ? (\n <span className=\"absolute right-0.5 top-0.5 size-1.5 rounded-full bg-brand\" />\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <SessionBrowseOrderControls\n groupBy={browseGroupBy}\n onGroupByChange={(groupBy) => updateBrowsePreferences({ groupBy })}\n sortBy={browseSortBy}\n onSortByChange={(sortBy) => updateBrowsePreferences({ sortBy })}\n status={browseStatusPreference}\n needsYouCount={needsYouCount}\n onStatusChange={(status) => updateBrowsePreferences({ status })}\n mineOnly={mineOnly}\n onMineOnlyChange={(next) => updateBrowsePreferences({ mineOnly: next })}\n showEmptyGroups={showEmptyGroups}\n onShowEmptyGroupsChange={(show) =>\n updateBrowsePreferences({ showEmptyGroups: show })\n }\n />\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() =>\n void navigate({\n to: \"/workspaces/$workspaceId/archived\",\n params: { workspaceId: rail.workspaceId },\n })\n }\n >\n Archived\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <div\n ref={listRef}\n role=\"region\"\n tabIndex={-1}\n aria-label={search ? \"Session search results\" : \"Sessions\"}\n data-sessionpin-session-list\n onKeyDown={onKeyDown}\n onPointerDown={() => {\n // Direct reader input cancels a reveal whose target has not mounted\n // yet. A generic scroll handler cannot distinguish that input from\n // browser anchoring caused by page merges and other DOM reflow.\n cancelSessionRowRevealIntent(rowRevealIntent);\n }}\n onTouchStart={() => {\n cancelSessionRowRevealIntent(rowRevealIntent);\n }}\n onWheel={() => {\n cancelSessionRowRevealIntent(rowRevealIntent);\n }}\n className=\"min-w-0 pb-2 pl-2 pr-3\"\n >\n <p className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </p>\n {(loading && allSessions.length === 0) ||\n (channelMode && channelsQuery.loading && channels.length === 0) ? (\n // The second clause holds the skeleton until the initial channels\n // read resolves, so the rail paints Recents/workstreams directly\n // instead of flashing the old recency layout first.\n <SessionListSkeleton />\n ) : error && allSessions.length === 0 ? (\n <div role=\"alert\" className=\"px-2 py-3 text-xs text-fg-subtle\">\n Session history is unavailable.{\" \"}\n <button\n type=\"button\"\n className=\"underline hover:text-fg\"\n onClick={() => void refresh()}\n >\n Retry\n </button>\n </div>\n ) : flat.length === 0 &&\n !showEmptyGroups &&\n (search || browseControlsActive) &&\n (search || browseStatus === \"active\") ? (\n <div className=\"px-2 py-4 text-center text-xs text-fg-subtle\">\n <p>\n {needsYouOnly && !search\n ? \"Nothing needs you right now.\"\n : \"No sessions match this view.\"}\n </p>\n {matchingResultsPagination ? (\n <SessionGroupPaginationControl {...matchingResultsPagination} className=\"mt-2\" />\n ) : null}\n <button\n type=\"button\"\n className=\"mt-2 min-h-8 rounded px-2 underline hover:text-fg pointer-coarse:min-h-11\"\n onClick={() => {\n updateSearchDraft(\"\");\n clearBrowseControls();\n }}\n >\n {needsYouOnly && !search ? \"Show all sessions\" : \"Clear search and filters\"}\n </button>\n </div>\n ) : (browseSessions.length === 0 && !hierarchyMode) ||\n (!search &&\n !browseControlsActive &&\n allSessions.length === 0 &&\n pinnedNodes.length === 0) ? (\n <EmptySessions />\n ) : (\n <>\n {pinnedNodes.length > 0 ? (\n <>\n <PinnedJumpNumbers.Provider value={pinnedJumpNumbers}>\n <PinnedParentTitles.Provider value={pinnedParentTitles}>\n <SessionGroup\n label=\"Pinned\"\n nodes={pinnedNodes}\n localDeliveryAttention={localDeliveryAttention}\n flat={flat}\n activeSessionId={activeSessionId}\n focusIndex={focusIndex}\n onFocusSession={setFocusedSessionId}\n expanded={expanded}\n onToggleExpand={toggleExpand}\n childPages={childPages}\n onLoadMoreChildren={loadChildPage}\n onRename={context.updateSessionTitle}\n onPin={onPin}\n channels={channels}\n onMoveToChannel={onMoveToChannel}\n onUpdateAttention={onUpdateAttention}\n onArchive={onArchive}\n onRequestDelete={setSessionPendingDelete}\n />\n </PinnedParentTitles.Provider>\n </PinnedJumpNumbers.Provider>\n {pinnedTruncated ? (\n <p className=\"px-2 pb-2 text-[11px] text-fg-subtle\" role=\"status\">\n Showing the 100 most recently pinned sessions. Older pins are omitted.\n </p>\n ) : null}\n </>\n ) : null}\n {hierarchyMode && browseStatus !== \"archived\" && rootPage.siteGroupsTruncated ? (\n <p className=\"px-2 pb-2 text-[11px] text-fg-subtle\" role=\"status\">\n Some older Sites aren&apos;t shown. Find them in{\" \"}\n <Link\n to=\"/workspaces/$workspaceId/artifacts\"\n params={{ workspaceId: rail.workspaceId }}\n className=\"underline underline-offset-2 hover:text-fg\"\n >\n Artifacts\n </Link>\n .\n </p>\n ) : null}\n {browseStatus === \"archived\" ? null : channelMode ? (\n renderedChannelSections.map((section) => (\n <SessionGroup\n key={section.key}\n label={section.name}\n channelId={section.channelId}\n sectionId={`channel-${section.key}`}\n channelHeader\n completeCounts={projectTotals?.get(section.channelId)}\n project={\n section.channelId\n ? channels.find((project) => project.id === section.channelId)\n : undefined\n }\n onToggleProjectPin={onToggleProjectPin}\n onEditProject={setProjectPendingEdit}\n onShareProject={setProjectPendingShare}\n onDeleteProject={setProjectPendingDelete}\n draggedProjectId={draggedProjectId}\n dragOverProjectId={dragOverProjectId}\n onProjectDragStart={setDraggedProjectId}\n onProjectDragOver={setDragOverProjectId}\n onProjectDrop={(sourceProjectId, targetProjectId) => {\n void onReorderProjects(sourceProjectId, targetProjectId);\n setDraggedProjectId(null);\n setDragOverProjectId(null);\n }}\n onProjectDragEnd={() => {\n setDraggedProjectId(null);\n setDragOverProjectId(null);\n }}\n sectionExpanded={!collapsedChannelSections.has(section.key)}\n onToggleSection={() => toggleChannelSection(section.key)}\n nodes={section.sessions}\n visibleNodes={visibleNodesForGroup(\n sessionPaginationProjectGroup(section.channelId, section.name).key,\n section.sessions,\n )}\n pagination={\n search\n ? undefined\n : paginationForGroup(\n sessionPaginationProjectGroup(section.channelId, section.name),\n null,\n true,\n section.sessions,\n )\n }\n localDeliveryAttention={localDeliveryAttention}\n flat={flat}\n activeSessionId={activeSessionId}\n focusIndex={focusIndex}\n onFocusSession={setFocusedSessionId}\n expanded={expanded}\n onToggleExpand={toggleExpand}\n childPages={childPages}\n onLoadMoreChildren={loadChildPage}\n onRename={context.updateSessionTitle}\n onPin={onPin}\n channels={channels}\n onMoveToChannel={onMoveToChannel}\n onUpdateAttention={onUpdateAttention}\n onArchive={onArchive}\n onRequestDelete={setSessionPendingDelete}\n />\n ))\n ) : (\n <>\n {browseGroupBy !== \"none\" &&\n (forest.running.length > 0 || (showEmptyGroups && activePagination)) ? (\n <SessionGroup\n label=\"Active\"\n nodes={forest.running}\n visibleNodes={visibleForest.running}\n pagination={paginationForGroup(\n {\n key: \"activity:active\",\n label: \"Active\",\n kind: \"activity\",\n group: \"active\",\n },\n nextCursor,\n false,\n forest.running,\n )}\n localDeliveryAttention={localDeliveryAttention}\n flat={flat}\n activeSessionId={activeSessionId}\n focusIndex={focusIndex}\n onFocusSession={setFocusedSessionId}\n expanded={expanded}\n onToggleExpand={toggleExpand}\n childPages={childPages}\n onLoadMoreChildren={loadChildPage}\n onRename={context.updateSessionTitle}\n onPin={onPin}\n channels={channels}\n onMoveToChannel={onMoveToChannel}\n onUpdateAttention={onUpdateAttention}\n onArchive={onArchive}\n onRequestDelete={setSessionPendingDelete}\n />\n ) : null}\n {renderedGroupedBuckets.map((bucket) => {\n const paginationGroup = paginationGroupForBucket(bucket);\n return (\n <SessionGroup\n key={bucket.group}\n label={bucket.label}\n hideHeading={browseGroupBy === \"none\"}\n nodes={bucket.sessions}\n visibleNodes={visibleNodesForGroup(\n paginationGroup?.key ?? bucket.group,\n bucket.sessions,\n )}\n pagination={\n paginationGroup\n ? paginationForGroup(\n paginationGroup,\n nextCursor,\n browseGroupBy === \"creator\",\n bucket.sessions,\n )\n : undefined\n }\n localDeliveryAttention={localDeliveryAttention}\n flat={flat}\n activeSessionId={activeSessionId}\n focusIndex={focusIndex}\n onFocusSession={setFocusedSessionId}\n expanded={expanded}\n onToggleExpand={toggleExpand}\n childPages={childPages}\n onLoadMoreChildren={loadChildPage}\n onRename={context.updateSessionTitle}\n onPin={onPin}\n channels={channels}\n onMoveToChannel={onMoveToChannel}\n onUpdateAttention={onUpdateAttention}\n onArchive={onArchive}\n onRequestDelete={setSessionPendingDelete}\n />\n );\n })}\n {creatorDiscoveryPagination ? (\n <SessionGroup\n label=\"More creators\"\n nodes={[]}\n pagination={creatorDiscoveryPagination}\n localDeliveryAttention={localDeliveryAttention}\n flat={flat}\n activeSessionId={activeSessionId}\n focusIndex={focusIndex}\n onFocusSession={setFocusedSessionId}\n expanded={expanded}\n onToggleExpand={toggleExpand}\n childPages={childPages}\n onLoadMoreChildren={loadChildPage}\n onRename={context.updateSessionTitle}\n onPin={onPin}\n channels={channels}\n onMoveToChannel={onMoveToChannel}\n onUpdateAttention={onUpdateAttention}\n onArchive={onArchive}\n onRequestDelete={setSessionPendingDelete}\n />\n ) : null}\n </>\n )}\n {browseStatus !== \"archived\" &&\n browseGroupBy !== \"none\" &&\n browseGroupBy !== \"creator\" &&\n (!channelMode || search) &&\n workspacePagination ? (\n <SessionGroupPaginationControl {...workspacePagination} />\n ) : null}\n {browseStatus !== \"active\" ? (\n <SessionGroup\n label=\"Archived\"\n sectionId=\"archived\"\n channelHeader\n allowNewSession={false}\n showSummary={false}\n emptyLabel=\"No archived sessions\"\n sectionExpanded={archiveExpanded}\n onToggleSection={() =>\n setArchiveFolder({ generation: pageGeneration, expanded: !archiveExpanded })\n }\n nodes={archivedNodes}\n visibleNodes={visibleNodesForGroup(\"archived\", archivedNodes)}\n pagination={paginationForGroup(\n ARCHIVED_SESSION_GROUP,\n null,\n !search,\n archivedNodes,\n )}\n localDeliveryAttention={localDeliveryAttention}\n flat={flat}\n activeSessionId={activeSessionId}\n focusIndex={focusIndex}\n onFocusSession={setFocusedSessionId}\n expanded={expanded}\n onToggleExpand={toggleExpand}\n childPages={childPages}\n onLoadMoreChildren={loadChildPage}\n onRename={context.updateSessionTitle}\n onPin={onPin}\n channels={channels}\n onMoveToChannel={onMoveToChannel}\n onUpdateAttention={onUpdateAttention}\n onArchive={onArchive}\n onRequestDelete={setSessionPendingDelete}\n />\n ) : null}\n </>\n )}\n </div>\n {projectPendingEdit ? (\n <ProjectProfileDialog\n key={projectPendingEdit.id}\n project={projectPendingEdit}\n open\n onOpenChange={(open) => {\n if (!open) setProjectPendingEdit(null);\n }}\n update={(change) => saveProjectProfile(projectPendingEdit, change)}\n />\n ) : null}\n <ChannelCreateDialog\n open={channelDialogOpen}\n name={channelNameDraft}\n busy={channelsQuery.mutating}\n audience={\n canMakeOnlyMeProject\n ? { value: channelAudienceDraft, onChange: setChannelAudienceDraft }\n : undefined\n }\n onNameChange={setChannelNameDraft}\n onOpenChange={(open) => {\n setChannelDialogOpen(open);\n if (!open) {\n setChannelNameDraft(\"\");\n setChannelAudienceDraft(\"workspace\");\n }\n }}\n onSubmit={() => void submitCreateChannel()}\n />\n <ConfirmDialog\n open={sessionPendingDelete !== null}\n onOpenChange={(open) => {\n if (!open) setSessionPendingDelete(null);\n }}\n title={\n <>Delete “{sessionPendingDelete ? sessionDisplayTitle(sessionPendingDelete) : \"\"}”?</>\n }\n description={\n sessionPendingDelete?.treeStats?.totalDescendants\n ? `This permanently deletes the chat and its ${sessionPendingDelete.treeStats.totalDescendants} sub-chats. A running chat is stopped first. This cannot be undone.`\n : \"This permanently deletes the chat and its history. A running chat is stopped first. This cannot be undone.\"\n }\n confirmLabel=\"Delete\"\n cancelAutoFocus\n onConfirm={onDeleteSession}\n />\n <ConfirmDialog\n open={projectPendingDelete !== null}\n onOpenChange={(open) => {\n if (!open) setProjectPendingDelete(null);\n }}\n title={<>Delete project “{projectPendingDelete?.name}”?</>}\n description=\"Its sessions will remain available in Default. This cannot be undone.\"\n confirmLabel=\"Delete project\"\n cancelAutoFocus\n onConfirm={onDeleteProject}\n />\n <ConfirmDialog\n open={projectPendingShare !== null}\n onOpenChange={(open) => {\n if (!open) setProjectPendingShare(null);\n }}\n title={<>Share “{projectPendingShare?.name}” with the workspace?</>}\n description=\"Everyone in this workspace will see the project and can file their chats in it. Your Only me chats and Sites in it stay Only me. A shared project can't be made Only me again.\"\n confirmLabel=\"Share project\"\n cancelAutoFocus\n onConfirm={onShareProject}\n />\n </div>\n </WorkstreamRootsContext.Provider>\n </SiteRowActionsContext.Provider>\n );\n}\n\n/** Top-level sessions by id, so a spawned row can act on its workstream. */\nconst WorkstreamRootsContext = createContext<ReadonlyMap<string, Session> | null>(null);\n\ntype SessionGroupPaginationProps = {\n group: SessionPaginationGroup;\n hasMore: boolean;\n loading: boolean;\n failed: boolean;\n isCurrent: () => boolean;\n revealCount?: number | undefined;\n onLoadMore: (group: SessionPaginationGroup) => Promise<boolean | void>;\n};\n\nfunction SessionGroupPaginationControl(\n props: SessionGroupPaginationProps & {\n className?: string | undefined;\n fallbackFocusId?: string | undefined;\n },\n) {\n const { failed, fallbackFocusId, group, hasMore, isCurrent, loading, onLoadMore, revealCount } =\n props;\n const buttonRef = useRef<HTMLButtonElement>(null);\n const groupRef = useRef(group);\n groupRef.current = group;\n const focusAttempt = useRef(0);\n const pendingFocus = useRef<{\n attempt: number;\n exhausted?: boolean | undefined;\n restore?: (() => void) | undefined;\n cancel: () => void;\n } | null>(null);\n useLayoutEffect(() => {\n if (!loading && hasMore) pendingFocus.current?.restore?.();\n }, [loading, hasMore]);\n useEffect(\n () => () => {\n // Removal can precede the promise's exhaustion result. Let that result\n // decide fallback; a settled surviving-control intent is abandoned here.\n if (pendingFocus.current?.exhausted === false) pendingFocus.current?.cancel();\n },\n [],\n );\n const loadWithFocus = useCallback(async () => {\n pendingFocus.current?.cancel();\n const button = buttonRef.current;\n const root = button?.closest<HTMLElement>(\"[data-sessionpin-session-list]\") ?? null;\n const shouldRestoreFocus = document.activeElement === button;\n const requestedGroup = groupRef.current;\n const attempt = ++focusAttempt.current;\n let focusMoved = false;\n let cancelled = false;\n const observeFocus = (event: FocusEvent) => {\n if (event.target !== button && event.target !== document.body) focusMoved = true;\n };\n const cancel = () => {\n cancelled = true;\n document.removeEventListener(\"focusin\", observeFocus, true);\n if (pendingFocus.current?.attempt === attempt) pendingFocus.current = null;\n };\n if (shouldRestoreFocus) {\n pendingFocus.current = { attempt, cancel };\n document.addEventListener(\"focusin\", observeFocus, true);\n }\n let restoreScheduled = false;\n try {\n const exhausted = await onLoadMore(requestedGroup);\n if (!shouldRestoreFocus || !root || cancelled || exhausted === undefined) return;\n const restore = () => {\n if (cancelled) return;\n if (\n focusMoved ||\n focusAttempt.current !== attempt ||\n !isCurrent() ||\n groupRef.current.key !== requestedGroup.key ||\n !root.isConnected\n ) {\n cancel();\n return;\n }\n if (\n document.activeElement &&\n document.activeElement !== document.body &&\n document.activeElement !== button\n ) {\n cancel();\n return;\n }\n if (!exhausted) {\n if (\n !button ||\n buttonRef.current !== button ||\n !button.isConnected ||\n !root.contains(button)\n ) {\n cancel();\n return;\n }\n // The promise can settle before React commits disabled={false}.\n // Keep this intent for that commit instead of dropping focus to BODY.\n if (button.disabled) return;\n cancel();\n button.focus({ preventScroll: true });\n return;\n }\n cancel();\n const labelledFallback = fallbackFocusId ? document.getElementById(fallbackFocusId) : null;\n const fallback =\n labelledFallback && root.contains(labelledFallback)\n ? labelledFallback\n : (root.querySelector<HTMLElement>(\"a[data-session-row]\") ?? root);\n fallback.focus();\n };\n pendingFocus.current = { attempt, exhausted, restore, cancel };\n restoreScheduled = true;\n requestAnimationFrame(restore);\n } finally {\n if (!restoreScheduled) cancel();\n }\n }, [onLoadMore, fallbackFocusId, isCurrent]);\n const isActiveGroup = group.kind === \"activity\" && group.group === \"active\";\n\n const action = loading ? \"Loading\" : failed ? \"Retry\" : \"Load\";\n return (\n <div className={cn(\"px-2 py-1 text-center\", props.className)}>\n <button\n ref={buttonRef}\n type=\"button\"\n disabled={loading || !hasMore}\n aria-label={\n revealCount !== undefined\n ? loading\n ? `Loading sessions in ${group.label}`\n : failed\n ? `Retry sessions in ${group.label}`\n : `Show ${revealCount} more sessions in ${group.label}`\n : `${action} older sessions in ${group.label}`\n }\n onClick={() => void loadWithFocus()}\n className=\"min-h-8 rounded-md px-2 text-xs font-normal text-fg-muted hover:bg-hover hover:text-fg disabled:opacity-60 pointer-coarse:min-h-11\"\n >\n {revealCount !== undefined\n ? loading\n ? \"Loading…\"\n : failed\n ? \"Retry\"\n : `Show ${revealCount} more`\n : isActiveGroup\n ? loading\n ? \"Checking older active sessions…\"\n : `${action} older active sessions`\n : loading\n ? \"Loading older…\"\n : failed\n ? \"Retry older\"\n : group.kind === \"creatorDiscovery\"\n ? \"Show more creators\"\n : group.kind === \"results\"\n ? \"Load older sessions\"\n : \"Load older\"}\n </button>\n {failed ? (\n <p role=\"status\" className=\"mt-1 text-2xs text-status-failed\">\n Older sessions in this group didn&apos;t load.\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction SessionGroup(props: {\n label: string;\n hideHeading?: boolean | undefined;\n /**\n * Stable DOM id suffix. Required for folder sections: labels are\n * user-controlled, so slugging them can collide with each other and with\n * the fixed groups (\"Pinned\", the synthetic \"Recents\").\n */\n sectionId?: string | undefined;\n /** Real folder id. Null identifies the synthetic Recents section. */\n channelId?: string | null | undefined;\n /** Folder-styled, collapsible header instead of the recency label. */\n channelHeader?: boolean | undefined;\n completeCounts?: RailStatusCounts | undefined;\n /** Archived folders are navigational only; new chats always start active. */\n allowNewSession?: boolean | undefined;\n project?: Channel | undefined;\n onToggleProjectPin?: ((project: Channel) => void) | undefined;\n onEditProject?: ((project: Channel) => void) | undefined;\n /** Offered on the owner's Only me project: share it with the workspace. */\n onShareProject?: ((project: Channel) => void) | undefined;\n onDeleteProject?: ((project: Channel) => void) | undefined;\n draggedProjectId?: string | null | undefined;\n dragOverProjectId?: string | null | undefined;\n onProjectDragStart?: ((projectId: string) => void) | undefined;\n onProjectDragOver?: ((projectId: string) => void) | undefined;\n onProjectDrop?: ((sourceProjectId: string, targetProjectId: string) => void) | undefined;\n onProjectDragEnd?: (() => void) | undefined;\n /** Archive is a destination, not an attention summary. */\n showSummary?: boolean | undefined;\n sectionExpanded?: boolean | undefined;\n onToggleSection?: (() => void) | undefined;\n nodes: SessionTreeNode[];\n /** Keyboard navigation uses this same disclosure window. Summaries retain all loaded nodes. */\n visibleNodes?: SessionTreeNode[] | undefined;\n emptyLabel?: string | undefined;\n pagination?: SessionGroupPaginationProps | undefined;\n localDeliveryAttention: ReadonlyMap<string, number>;\n flat: Session[];\n activeSessionId: string | null;\n focusIndex: number;\n onFocusSession: (sessionId: string) => void;\n expanded: ReadonlySet<string>;\n onToggleExpand: (sessionId: string) => void;\n childPages: ReadonlyMap<string, ChildPageState>;\n onLoadMoreChildren: (sessionId: string, cursor?: string) => Promise<void>;\n onRename: RenameFn;\n onPin: PinFn;\n channels: Channel[];\n onMoveToChannel: MoveToChannelFn;\n onUpdateAttention: UpdateAttentionFn;\n onArchive: ArchiveFn;\n onRequestDelete: RequestDeleteFn;\n}) {\n const [sessionDragOver, setSessionDragOver] = useState(false);\n const moveSite = useContext(SiteRowActionsContext)?.move;\n const sectionId = `session-group-${\n props.sectionId ?? props.label.toLowerCase().replace(/[^a-z0-9]+/g, \"-\")\n }`;\n const sectionExpanded = props.channelHeader ? Boolean(props.sectionExpanded) : true;\n const loadedSummary = summarizeRailNodes(props.nodes, props.localDeliveryAttention);\n const summary = props.completeCounts\n ? summarizeRailStatusCounts({\n ...props.completeCounts,\n sendFailed: loadedSummary.kind === \"send_failed\" ? loadedSummary.count : 0,\n })\n : loadedSummary;\n const collapsedSelection = props.channelHeader\n ? findSessionTreeNode(props.nodes, props.activeSessionId)\n : null;\n const renderedNodes = sectionExpanded\n ? (props.visibleNodes ?? props.nodes)\n : collapsedSelection\n ? [collapsedSelection]\n : [];\n const treeExpanded = sectionExpanded ? props.expanded : EMPTY_SESSION_IDS;\n const projectDescription = props.project?.description?.trim() || null;\n const projectDescriptionId = useId();\n const sectionToggle = (\n <button\n id={sectionId}\n type=\"button\"\n aria-expanded={sectionExpanded}\n aria-controls={renderedNodes.length > 0 ? `${sectionId}-sessions` : undefined}\n onClick={props.onToggleSection}\n // A described project explains itself in a tooltip instead.\n title={projectDescription ? undefined : `${summary.label} · ${summary.total} total`}\n aria-describedby={projectDescription ? projectDescriptionId : undefined}\n className=\"flex h-full min-w-0 flex-1 items-center gap-1.5 py-1 pl-1.5 text-left text-sm font-normal text-fg\"\n >\n <span className=\"flex w-4 shrink-0 items-center\">\n <ProjectGlyph project={props.project} open={sectionExpanded} />\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{props.label}</span>\n {props.project?.visibility === \"private\" ? (\n <>\n <LockIcon aria-hidden=\"true\" className=\"size-3 shrink-0 text-fg-subtle\" />\n <span className=\"sr-only\">Only me</span>\n </>\n ) : null}\n {props.showSummary !== false ? (\n // The row's actions sit where the summary is, on the translucent\n // hover wash, so the summary steps aside while they show.\n <span\n className={cn(\n \"inline-flex shrink-0\",\n (props.project || props.allowNewSession !== false) &&\n \"group-hover/section:invisible group-focus-within/section:invisible pointer-coarse:invisible\",\n )}\n >\n <RailTrailingMetadata summary={summary} />\n </span>\n ) : null}\n </button>\n );\n return (\n <div role=\"group\" aria-label={props.label} className=\"mb-1.5 min-w-0\">\n {props.channelHeader ? (\n <div\n draggable={Boolean(props.project)}\n onDragStart={(event: DragEvent<HTMLDivElement>) => {\n if (!props.project) return;\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(PROJECT_DRAG_TYPE, props.project.id);\n props.onProjectDragStart?.(props.project.id);\n }}\n onDragOver={(event: DragEvent<HTMLDivElement>) => {\n if (\n event.dataTransfer.types.includes(SESSION_DRAG_TYPE) ||\n (moveSite && event.dataTransfer.types.includes(SITE_DRAG_TYPE))\n ) {\n if (props.allowNewSession === false) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n setSessionDragOver(true);\n return;\n }\n if (!props.project || !event.dataTransfer.types.includes(PROJECT_DRAG_TYPE)) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n props.onProjectDragOver?.(props.project.id);\n }}\n onDrop={(event: DragEvent<HTMLDivElement>) => {\n setSessionDragOver(false);\n if (moveSite && event.dataTransfer.types.includes(SITE_DRAG_TYPE)) {\n event.preventDefault();\n event.stopPropagation();\n if (props.allowNewSession === false) return;\n const dragged = readSiteRowDragPayload(event.dataTransfer.getData(SITE_DRAG_TYPE));\n const destination = props.channelId ?? null;\n if (dragged && dragged.channelId !== destination)\n moveSite(\n { siteId: dragged.siteId, title: dragged.title },\n dragged.channelId,\n destination,\n );\n return;\n }\n if (event.dataTransfer.types.includes(SESSION_DRAG_TYPE)) {\n event.preventDefault();\n event.stopPropagation();\n if (props.allowNewSession === false) return;\n const session = props.flat.find(\n (candidate) => candidate.id === event.dataTransfer.getData(SESSION_DRAG_TYPE),\n );\n if (session && session.parentSessionId === null && !session.archived) {\n void props.onMoveToChannel(session, props.channelId ?? null, \"row\");\n }\n return;\n }\n if (!props.project || !event.dataTransfer.types.includes(PROJECT_DRAG_TYPE)) return;\n event.preventDefault();\n const sourceProjectId = event.dataTransfer.getData(PROJECT_DRAG_TYPE);\n if (sourceProjectId) props.onProjectDrop?.(sourceProjectId, props.project.id);\n }}\n onDragEnd={props.onProjectDragEnd}\n onDragLeave={() => setSessionDragOver(false)}\n className={cn(\n sessionDragOver && \"bg-accent ring-1 ring-ring\",\n \"group/section relative flex h-8 w-full min-w-0 items-center rounded-md pr-1 text-fg hover:bg-hover pointer-coarse:h-11\",\n props.project && \"cursor-grab active:cursor-grabbing\",\n props.project && props.draggedProjectId === props.project.id && \"opacity-45\",\n props.project &&\n props.dragOverProjectId === props.project.id &&\n props.draggedProjectId !== props.project.id &&\n \"ring-1 ring-inset ring-accent\",\n )}\n >\n {projectDescription ? (\n <Tooltip delayDuration={400}>\n <TooltipTrigger asChild>{sectionToggle}</TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-72 whitespace-pre-line text-pretty\">\n {projectDescription}\n </TooltipContent>\n </Tooltip>\n ) : (\n sectionToggle\n )}\n {projectDescription ? (\n <span id={projectDescriptionId} hidden>\n {projectDescription}\n </span>\n ) : null}\n {props.project ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`Actions for ${props.label}`}\n className={cn(\n \"absolute top-1/2 z-10 flex size-6 -translate-y-1/2 items-center justify-center rounded text-fg-subtle opacity-0 transition-opacity hover:bg-hover hover:text-fg focus-visible:opacity-100 focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-accent group-hover/section:opacity-100 pointer-coarse:size-9 pointer-coarse:opacity-100\",\n props.allowNewSession !== false ? \"right-7\" : \"right-0.5\",\n )}\n >\n <EllipsisIcon aria-hidden=\"true\" className=\"size-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" side=\"right\">\n <DropdownMenuItem onSelect={() => props.onEditProject?.(props.project!)}>\n <PencilIcon aria-hidden=\"true\" />\n Edit project…\n </DropdownMenuItem>\n {props.project.visibility === \"private\" && props.onShareProject ? (\n <DropdownMenuItem onSelect={() => props.onShareProject?.(props.project!)}>\n <UsersIcon aria-hidden=\"true\" />\n Share with workspace…\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem onSelect={() => props.onToggleProjectPin?.(props.project!)}>\n <PinIcon\n aria-hidden=\"true\"\n className={props.project.pinned ? \"size-4 fill-current\" : \"size-4\"}\n />\n {props.project.pinned ? \"Unpin project\" : \"Pin project\"}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n variant=\"destructive\"\n onSelect={() => props.onDeleteProject?.(props.project!)}\n >\n <Trash2Icon aria-hidden=\"true\" />\n Delete project\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n {props.allowNewSession !== false ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <NewSessionLink\n channelId={props.channelId}\n aria-label={`New chat in ${props.label}`}\n className=\"absolute right-0.5 top-1/2 z-10 flex size-6 -translate-y-1/2 items-center justify-center rounded text-fg-subtle opacity-0 transition-opacity hover:bg-hover hover:text-fg focus-visible:opacity-100 focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-accent group-hover/section:opacity-100 pointer-coarse:right-0 pointer-coarse:size-9 pointer-coarse:opacity-100\"\n >\n <PlusIcon aria-hidden=\"true\" className=\"size-3.5\" />\n </NewSessionLink>\n </TooltipTrigger>\n <TooltipContent side=\"right\">New chat in {props.label}</TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n ) : (\n <p\n id={sectionId}\n tabIndex={-1}\n className={\n props.hideHeading\n ? \"sr-only\"\n : \"px-1.5 pb-0.5 pt-2 text-2xs font-normal uppercase tracking-wider text-fg-muted\"\n }\n >\n {props.label}\n </p>\n )}\n {renderedNodes.length > 0 ? (\n <div\n id={`${sectionId}-sessions`}\n role=\"list\"\n aria-label={`${props.label} sessions`}\n className=\"grid min-w-0 grid-cols-1 gap-px\"\n >\n {renderedNodes.map((node) => (\n <SessionTreeRow\n key={node.session.id}\n node={node}\n localDeliveryAttention={props.localDeliveryAttention}\n depth={0}\n flat={props.flat}\n activeSessionId={props.activeSessionId}\n focusIndex={props.focusIndex}\n onFocusSession={props.onFocusSession}\n expanded={treeExpanded}\n onToggleExpand={props.onToggleExpand}\n childPages={props.childPages}\n onLoadMoreChildren={props.onLoadMoreChildren}\n onRename={props.onRename}\n onPin={props.onPin}\n channels={props.channels}\n onMoveToChannel={props.onMoveToChannel}\n onUpdateAttention={props.onUpdateAttention}\n onArchive={props.onArchive}\n onRequestDelete={props.onRequestDelete}\n />\n ))}\n </div>\n ) : null}\n {sectionExpanded && renderedNodes.length === 0 && props.emptyLabel && !props.pagination ? (\n <p className=\"px-6 py-2 text-xs text-fg-subtle\">{props.emptyLabel}</p>\n ) : null}\n {sectionExpanded && props.pagination ? (\n <SessionGroupPaginationControl {...props.pagination} fallbackFocusId={sectionId} />\n ) : null}\n </div>\n );\n}\n\n/**\n * A Site row. Its conversations stay nested under it whichever session is\n * open: collapsed it shows only the selected one, expanded it lists them all.\n */\nfunction SiteSessionGroupRow(props: Parameters<typeof SessionTreeRow>[0]) {\n const { node } = props;\n const origin = node.siteGroup!;\n const key = node.session.id;\n const expanded = props.expanded.has(key);\n const summary = summarizeRailNodes([node], props.localDeliveryAttention);\n const selected = selectedDescendantNode(node, props.activeSessionId);\n const children = expanded ? node.children : selected ? [selected] : [];\n const page = props.childPages.get(key);\n const count = siteRowConversationCount(node);\n const activeSiteId = useRouterState({\n select: (state): string | null => railRouteSelection(state.location).siteId,\n });\n return (\n <div role=\"listitem\" className=\"min-w-0\">\n <SiteSessionGroupHeading\n origin={origin}\n workspaceId={node.session.workspaceId}\n active={activeSiteId === origin.siteId && props.activeSessionId === null}\n expanded={expanded}\n onToggle={() => props.onToggleExpand(key)}\n summary={summary}\n count={count}\n relativeTime={relativeTimeLabel(t, node.session.updatedAt)}\n depth={props.depth}\n pinned={node.session.pinned === true}\n channelId={parseSiteRowKey(key)?.channelId}\n channels={props.channels}\n />\n {children.length > 0 || (expanded && page) ? (\n <div role=\"list\" aria-label={`Conversations from ${origin.title}`}>\n {children.map((child) => (\n <SessionTreeRow\n key={child.session.id}\n {...props}\n node={child}\n depth={props.depth + 1}\n nestedInSiteId={origin.siteId}\n />\n ))}\n {expanded && page?.loading && page.feedbackVisible ? (\n <TreeLoadRow depth={props.depth + 1} text=\"Loading conversations…\" />\n ) : null}\n {expanded && page?.failed && page.feedbackVisible ? (\n <TreeLoadRow\n depth={props.depth + 1}\n text=\"Retry loading conversations\"\n onClick={() => void props.onLoadMoreChildren(key, page.retryCursor ?? undefined)}\n />\n ) : null}\n {expanded && !page?.loading && !page?.failed && page?.nextCursor ? (\n <TreeLoadRow\n depth={props.depth + 1}\n text=\"Show more\"\n onClick={() => void props.onLoadMoreChildren(key, page.nextCursor!)}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction SessionTreeRow(props: {\n node: SessionTreeNode;\n localDeliveryAttention: ReadonlyMap<string, number>;\n depth: number;\n flat: Session[];\n activeSessionId: string | null;\n focusIndex: number;\n onFocusSession: (sessionId: string) => void;\n expanded: ReadonlySet<string>;\n onToggleExpand: (sessionId: string) => void;\n childPages: ReadonlyMap<string, ChildPageState>;\n onLoadMoreChildren: (sessionId: string, cursor?: string) => Promise<void>;\n onRename: RenameFn;\n onPin: PinFn;\n channels: Channel[];\n onMoveToChannel: MoveToChannelFn;\n onUpdateAttention: UpdateAttentionFn;\n onArchive: ArchiveFn;\n onRequestDelete: RequestDeleteFn;\n /** Listed under its Site row: opens in that Site's view, which names the Site. */\n nestedInSiteId?: string | undefined;\n}) {\n const { node } = props;\n if (node.siteGroup) return <SiteSessionGroupRow {...props} />;\n const index = props.flat.indexOf(node.session);\n const directChildCount = node.session.treeStats?.directChildren ?? node.children.length;\n // Server treeStats only counts spawned descendants. Repeat runs of a scheduled\n // task are folded in client-side, so take whichever is larger or a grouped\n // entry renders with no child region at all.\n const childCount = Math.max(node.session.treeStats?.totalDescendants ?? 0, node.children.length);\n const childCountTruncated = node.session.treeStats?.truncated ?? false;\n const hasChildren = directChildCount > 0 || node.children.length > 0;\n const aggregateStatus = summarizeRailRow(node, props.localDeliveryAttention);\n const isExpanded = props.expanded.has(node.session.id);\n const childPage = props.childPages.get(node.session.id);\n // A collapsed branch keeps only its selected descendant visible, rendered as\n // the same ordinary row used by the expanded list. This preserves context\n // without opening the whole branch or introducing a second navigation shape.\n const collapsedSelectedNode = !isExpanded\n ? selectedDescendantNode(node, props.activeSessionId)\n : null;\n const title = sessionDisplayTitle(node.session);\n const hasVisibleChildRegion = Boolean(collapsedSelectedNode || (isExpanded && childCount > 0));\n return (\n <div role=\"listitem\" className=\"min-w-0\">\n <SessionRow\n session={node.session}\n index={index}\n depth={props.depth}\n childCount={childCount}\n childCountTruncated={childCountTruncated}\n hasChildren={hasChildren}\n expanded={isExpanded}\n aggregateStatus={aggregateStatus}\n onToggleExpand={() => props.onToggleExpand(node.session.id)}\n active={node.session.id === props.activeSessionId}\n focused={index >= 0 && index === props.focusIndex}\n onFocus={() => props.onFocusSession(node.session.id)}\n onRename={props.onRename}\n onPin={props.onPin}\n channels={props.channels}\n onMoveToChannel={props.onMoveToChannel}\n onUpdateAttention={props.onUpdateAttention}\n onArchive={props.onArchive}\n onRequestDelete={props.onRequestDelete}\n nestedInSiteId={props.nestedInSiteId}\n />\n {hasVisibleChildRegion ? (\n <div role=\"list\" aria-label={`Spawned sessions from ${title}`}>\n {collapsedSelectedNode ? (\n <SessionTreeRow\n node={collapsedSelectedNode}\n localDeliveryAttention={props.localDeliveryAttention}\n depth={props.depth + 1}\n flat={props.flat}\n activeSessionId={props.activeSessionId}\n focusIndex={props.focusIndex}\n onFocusSession={props.onFocusSession}\n expanded={props.expanded}\n onToggleExpand={props.onToggleExpand}\n childPages={props.childPages}\n onLoadMoreChildren={props.onLoadMoreChildren}\n onRename={props.onRename}\n onPin={props.onPin}\n channels={props.channels}\n onMoveToChannel={props.onMoveToChannel}\n onUpdateAttention={props.onUpdateAttention}\n onArchive={props.onArchive}\n onRequestDelete={props.onRequestDelete}\n />\n ) : null}\n {childCount > 0 && isExpanded\n ? node.children.map((child) => (\n <SessionTreeRow\n key={child.session.id}\n node={child}\n localDeliveryAttention={props.localDeliveryAttention}\n depth={props.depth + 1}\n flat={props.flat}\n activeSessionId={props.activeSessionId}\n focusIndex={props.focusIndex}\n onFocusSession={props.onFocusSession}\n expanded={props.expanded}\n onToggleExpand={props.onToggleExpand}\n childPages={props.childPages}\n onLoadMoreChildren={props.onLoadMoreChildren}\n onRename={props.onRename}\n onPin={props.onPin}\n channels={props.channels}\n onMoveToChannel={props.onMoveToChannel}\n onUpdateAttention={props.onUpdateAttention}\n onArchive={props.onArchive}\n onRequestDelete={props.onRequestDelete}\n />\n ))\n : null}\n {isExpanded && childPage?.loading && childPage.feedbackVisible ? (\n <TreeLoadRow depth={props.depth + 1} text=\"Loading sessions…\" />\n ) : null}\n {isExpanded && childPage?.failed && childPage.feedbackVisible ? (\n <TreeLoadRow\n depth={props.depth + 1}\n text=\"Retry loading sessions\"\n onClick={() =>\n void props.onLoadMoreChildren(node.session.id, childPage.retryCursor ?? undefined)\n }\n />\n ) : null}\n {isExpanded && !childPage?.loading && !childPage?.failed && childPage?.nextCursor ? (\n <TreeLoadRow\n depth={props.depth + 1}\n text=\"Show more\"\n onClick={() => void props.onLoadMoreChildren(node.session.id, childPage.nextCursor!)}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction TreeLoadRow({\n depth,\n text,\n onClick,\n}: {\n depth: number;\n text: string;\n onClick?: (() => void) | undefined;\n}) {\n const style = { paddingLeft: 26 + visualTreeDepth(depth) * 12 };\n return onClick ? (\n <div role=\"listitem\">\n <button\n type=\"button\"\n onClick={onClick}\n style={style}\n className=\"h-8 w-full rounded-md pr-2 text-left text-xs text-fg-muted hover:bg-hover hover:text-fg pointer-coarse:h-11\"\n >\n {text}\n </button>\n </div>\n ) : (\n <div role=\"listitem\">\n <div style={style} className=\"flex h-8 items-center text-xs text-fg-subtle\" role=\"status\">\n {text}\n </div>\n </div>\n );\n}\n\n/** The ⌘1 to ⌘9 number of each top-level pinned row; absent outside the Pinned section. */\nconst PinnedJumpNumbers = createContext<ReadonlyMap<string, number> | null>(null);\n/** The parent chat's title for each pinned sub-agent row; absent outside the Pinned section. */\nconst PinnedParentTitles = createContext<ReadonlyMap<string, string> | null>(null);\n\n/** \"⌘3\" while ⌘ is held on a pinned row that ⌘3 opens; otherwise nothing. */\nfunction usePinnedJumpKey(sessionId: string, depth: number, mobile: boolean): string | undefined {\n const jumpNumber = useContext(PinnedJumpNumbers)?.get(sessionId);\n // Only where ⌘1 to ⌘9 work: browsers keep those keys for their own tabs.\n const pinnedKeys = useActionShortcut(\"go.pinnedChat\");\n const platform = currentPlatform();\n const held = useHeldModifier(\n platform,\n Boolean(pinnedKeys && jumpNumber && depth === 0 && !mobile),\n );\n if (!held || !pinnedKeys || !jumpNumber) return undefined;\n return chordLabel({ ...pinnedKeys.chord, code: `Digit${jumpNumber}` }, platform);\n}\n\nfunction SessionRow(props: {\n session: Session;\n index: number;\n /** Nesting depth; children indent one step per level. */\n depth: number;\n /** Spawned-child count; a chevron + badge appear when > 0. */\n childCount: number;\n /** True when childCount is a server traversal lower bound. */\n childCountTruncated: boolean;\n hasChildren: boolean;\n expanded: boolean;\n /** One status for this session and every hidden descendant. */\n aggregateStatus: RailAggregateStatus;\n onToggleExpand: () => void;\n active: boolean;\n focused: boolean;\n onFocus: () => void;\n onRename: RenameFn;\n onPin: PinFn;\n channels: Channel[];\n onMoveToChannel: MoveToChannelFn;\n onUpdateAttention: UpdateAttentionFn;\n onArchive: ArchiveFn;\n onRequestDelete: RequestDeleteFn;\n nestedInSiteId?: string | undefined;\n}) {\n const rail = useRail();\n const context = useAppContext();\n const title = sessionDisplayTitle(props.session);\n const archiveTarget = useWorkstreamArchiveTarget(props.session);\n const rename = useInlineRename(props.session, props.onRename);\n const canEditProfile = useCanEditSessionProfile();\n const [profileOpen, setProfileOpen] = useState(false);\n const contextPinSelection = useRef(false);\n const chatOps = useChatOperations();\n const copyLinkKeys = useActionShortcut(\"chat.copyLink\");\n const pinKeys = useActionShortcut(\"chat.pin\");\n const hasChildren = props.hasChildren;\n const focusEvents = useUiEventTarget(\"window\");\n const creator = railRowCreator(props.session);\n const jumpKey = usePinnedJumpKey(props.session.id, props.depth, rail.isMobile);\n const pinnedParentTitles = useContext(PinnedParentTitles);\n const parentTitle =\n props.depth === 0 ? (pinnedParentTitles?.get(props.session.id) ?? null) : null;\n // A key press puts the person's attention elsewhere (⌘K right after opening a\n // chat, with the pointer still on its row), so the hover card gives way, as\n // tooltips do.\n const [hoverOpen, setHoverOpen] = useState(false);\n useEffect(() => {\n if (!hoverOpen || typeof document === \"undefined\") return;\n const close = () => setHoverOpen(false);\n document.addEventListener(\"keydown\", close, true);\n return () => document.removeEventListener(\"keydown\", close, true);\n }, [hoverOpen]);\n // The right-click menu replaces the preview: it would otherwise stay drawn\n // over the menu, since the pointer is still on the row.\n const [contextMenuOpen, setContextMenuOpen] = useState(false);\n // Who started a session only adds information where other people work too.\n const personalWorkspace = isPersonalWorkspace(\n context.workspaces?.find((workspace) => workspace.id === rail.workspaceId) ?? null,\n null,\n );\n const stateLabel = sessionStateLabel(props.session);\n const hoverDescendantCount = props.session.treeStats?.totalDescendants ?? props.childCount;\n const hoverDescendantCountTruncated =\n props.session.treeStats?.truncated ?? props.childCountTruncated;\n // The hover card is pointer/focus-only and not announced, so the row also\n // describes the same facts to assistive technology.\n const hoverDescriptionId = `session-hover-${useId().replaceAll(\":\", \"\")}`;\n const hoverDescription = sessionHoverDescription(\n sessionHoverFacts(props.session, {\n descendantCount: hoverDescendantCount,\n descendantCountTruncated: hoverDescendantCountTruncated,\n }),\n );\n const waiting = Boolean(sessionInputWait(props.session));\n const [, refreshWaitClock] = useState(0);\n useEffect(() => {\n if (!waiting) return;\n const timer = setInterval(() => refreshWaitClock(Date.now()), 15_000);\n return () => clearInterval(timer);\n }, [waiting]);\n const descendantLabel = sessionDescendantLabel(props.session);\n const childCountAria = sessionDescendantCountAria(props.childCount, props.childCountTruncated);\n const depthLabel = props.depth > MAX_VISUAL_TREE_DEPTH ? `Level ${props.depth + 1}` : null;\n const relativeTime = relativeTimeLabel(t, props.session.updatedAt);\n const automationWait = sessionAutomationWaitWords(t, props.session, { now: new Date() });\n // Indent nested rows without changing the root title column. Parents and\n // leaves reserve the same compact disclosure slot, so the chevron does not\n // push a parent title away from the leaf titles beside it.\n const indentStyle =\n props.depth > 0 ? { marginLeft: visualTreeDepth(props.depth) * 12 } : undefined;\n\n // The open session is a selected row: the selection fill, full-strength\n // text and a faint accent edge. The border is always present (transparent\n // otherwise) so selecting a row never shifts its contents.\n const rowClassName = cn(\n \"group relative flex h-8 w-full items-center gap-1.5 rounded-md border py-1 pl-1.5 pr-1 text-left text-sm pointer-coarse:h-11 pointer-coarse:py-0\",\n rail.isMobile && \"h-12 py-1.5 pointer-coarse:h-12\",\n props.active\n ? \"border-brand/20 bg-selection text-fg\"\n : \"border-transparent text-fg-label hover:bg-hover hover:text-fg\",\n // The roving tab stop shows the hover wash only while it holds keyboard\n // focus; otherwise it would read as a stray hover.\n !props.active && \"has-[[data-session-focus]:focus-visible]:bg-hover\",\n );\n\n const lead = (\n <span className=\"flex w-4 shrink-0 items-center\" style={indentStyle}>\n {hasChildren ? (\n <button\n type=\"button\"\n aria-label={props.expanded ? \"Collapse spawned sessions\" : \"Expand spawned sessions\"}\n aria-expanded={props.expanded}\n onClick={(event) => {\n event.stopPropagation();\n props.onToggleExpand();\n }}\n className=\"flex h-4 w-4 shrink-0 items-center justify-center rounded text-fg-muted outline-hidden hover:text-fg focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:h-11 pointer-coarse:w-11\"\n >\n <ChevronRightIcon\n className={cn(\"size-3 shrink-0 transition-transform\", props.expanded && \"rotate-90\")}\n />\n </button>\n ) : null}\n </span>\n );\n\n // While renaming, the row body becomes an inline input. SessionTreeRow owns\n // the listitem semantics so its spawned-session list can remain nested.\n if (rename.editing) {\n return (\n <div className={rowClassName}>\n {lead}\n <input\n ref={rename.inputRef}\n data-session-index={props.index}\n data-session-focus\n tabIndex={props.focused ? 0 : -1}\n onFocus={props.onFocus}\n value={rename.draft}\n onChange={(event) => rename.setDraft(event.target.value)}\n onBlur={() => void rename.commit()}\n onKeyDown={(event) => {\n // Keep keystrokes (incl. Arrow/Enter/Esc) inside the field, away\n // from the list's keyboard navigation.\n event.stopPropagation();\n if (event.key === \"Enter\") {\n event.preventDefault();\n void rename.commit();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n rename.cancel();\n }\n }}\n maxLength={SESSION_TITLE_MAX_LENGTH}\n aria-label=\"Session title\"\n className=\"min-w-0 flex-1 truncate rounded-sm bg-transparent text-sm outline-hidden ring-1 ring-ring/40 focus-visible:ring-ring\"\n />\n <RailTrailingMetadata\n summary={props.aggregateStatus}\n automationWait={automationWait?.kind ?? null}\n automationWaitLabel={automationWait?.label}\n relativeTime={rail.isMobile ? undefined : relativeTime}\n creator={creator}\n />\n </div>\n );\n }\n\n return (\n <ContextMenu\n onOpenChange={(open) => {\n setContextMenuOpen(open);\n if (open) setHoverOpen(false);\n }}\n >\n <ContextMenuTrigger asChild>\n <div className={rowClassName}>\n {lead}\n {props.nestedInSiteId ? null : <SiteOriginLink session={props.session} compact />}\n <HoverCard\n openDelay={100}\n closeDelay={80}\n open={hoverOpen && !contextMenuOpen}\n onOpenChange={(open) => setHoverOpen(open && !contextMenuOpen)}\n >\n <HoverCardTrigger asChild>\n <Link\n {...(props.nestedInSiteId\n ? {\n to: \"/workspaces/$workspaceId/sites/$siteId\",\n params: { workspaceId: rail.workspaceId, siteId: props.nestedInSiteId },\n search: { conversation: props.session.id },\n }\n : {\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId: rail.workspaceId, sessionId: props.session.id },\n })}\n draggable={props.session.parentSessionId === null && !props.session.archived}\n onDragStart={(event) => {\n if (props.session.parentSessionId !== null || props.session.archived) {\n event.preventDefault();\n return;\n }\n event.stopPropagation();\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(SESSION_DRAG_TYPE, props.session.id);\n }}\n data-session-index={props.index}\n data-session-focus\n data-session-row={props.session.id}\n tabIndex={props.focused ? 0 : -1}\n aria-current={props.active ? \"page\" : undefined}\n aria-label={sessionRowAccessibleName({\n title: parentTitle ? `${title}, in ${parentTitle}` : title,\n stateLabel,\n pinned: Boolean(props.session.pinned),\n statusLabel: props.aggregateStatus.label,\n spawnedLabel: hasChildren\n ? childCountAria.replace(\"descendant\", \"spawned\")\n : null,\n creator,\n })}\n aria-describedby={hoverDescription ? hoverDescriptionId : undefined}\n onFocus={props.onFocus}\n onClick={(event) => {\n if (isModifiedNavigationClick(event)) return;\n if (\n props.session.unread &&\n !props.session.archived &&\n document.visibilityState === \"visible\" &&\n document.hasFocus()\n ) {\n const projection: SessionAttentionProjection = {\n id: props.session.id,\n workspaceId: props.session.workspaceId,\n unread: false,\n ...(props.session.attentionVersion !== undefined\n ? { attentionVersion: props.session.attentionVersion }\n : {}),\n lastSequence: props.session.lastSequence,\n };\n // A rail click is already a foreground view. Commit its exact\n // known frontier before route data loads so a fast second\n // navigation cannot cancel the read.\n notifySessionAttentionChanged(projection);\n const acceptedTransition = context.captureWorkspaceInvocation(\n props.session.workspaceId,\n );\n if (acceptedTransition) {\n const acknowledge = (retry: boolean): void => {\n void context.client\n .updateSessionAttention(props.session.workspaceId, props.session.id, {\n unread: false,\n acknowledgedThroughSequence: props.session.lastSequence,\n })\n .then((updated) => {\n if (\n context.ownsWorkspaceInvocation(\n props.session.workspaceId,\n acceptedTransition,\n )\n ) {\n notifySessionAttentionChanged(updated);\n }\n })\n .catch(() => {\n if (\n retry &&\n context.ownsWorkspaceInvocation(\n props.session.workspaceId,\n acceptedTransition,\n )\n ) {\n acknowledge(false);\n }\n });\n };\n acknowledge(true);\n }\n }\n if (!rail.isMobile) {\n requestSessionComposerFocus(focusEvents, rail.workspaceId, props.session.id);\n }\n rail.setDrawerOpen(false);\n }}\n className=\"flex h-full min-w-0 flex-1 items-center gap-1 rounded-sm text-left outline-hidden focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-1 focus-visible:ring-offset-surface\"\n >\n <SessionRowContent\n quickActionSlots={Number(!props.session.archived) + 1}\n leading={\n props.session.avatar ? (\n <SessionAvatar\n avatar={props.session.avatar}\n name={title}\n workspaceId={props.session.workspaceId}\n seed={props.session.id}\n size=\"xs\"\n className=\"mr-0.5\"\n />\n ) : null\n }\n title={title}\n parentTitle={parentTitle}\n stateLabel={stateLabel}\n depthLabel={depthLabel}\n descendantLabel={descendantLabel}\n mobile={rail.isMobile}\n summary={props.aggregateStatus}\n automationWait={automationWait?.kind ?? null}\n automationWaitLabel={automationWait?.label}\n relativeTime={rail.isMobile ? undefined : relativeTime}\n jumpKey={jumpKey}\n creator={creator}\n />\n </Link>\n </HoverCardTrigger>\n <HoverCardContent\n // The narrow rail fills the screen, so there is no room beside it.\n side={rail.isMobile ? \"bottom\" : \"right\"}\n collisionPadding={8}\n className=\"w-80 max-w-[calc(100vw-16px)] p-3.5\"\n >\n <SessionRowHoverDetails\n session={props.session}\n title={title}\n descendantCount={hoverDescendantCount}\n descendantCountTruncated={hoverDescendantCountTruncated}\n showCreator={!personalWorkspace}\n />\n </HoverCardContent>\n </HoverCard>\n {hoverDescription ? (\n <span id={hoverDescriptionId} hidden>\n {hoverDescription}\n </span>\n ) : null}\n <RowQuickActions\n session={props.session}\n onPin={props.onPin}\n onArchive={props.onArchive}\n />\n <RowActionsMenu\n session={props.session}\n onRename={rename.startEditing}\n onPin={props.onPin}\n channels={props.channels}\n onMoveToChannel={props.onMoveToChannel}\n onUpdateAttention={props.onUpdateAttention}\n onArchive={props.onArchive}\n onRequestDelete={props.onRequestDelete}\n />\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent\n className=\"min-w-40\"\n data-session-menu={props.session.id}\n onCloseAutoFocus={(event) => {\n if (!contextPinSelection.current) return;\n // The original trigger is about to be unmounted by the optimistic\n // group move. SessionList restores the corresponding remounted row.\n event.preventDefault();\n contextPinSelection.current = false;\n }}\n >\n <ContextMenuItem onSelect={rename.startEditing}>\n <PencilIcon className=\"size-4\" />\n Rename\n </ContextMenuItem>\n {canEditProfile ? (\n <ContextMenuItem onSelect={() => setProfileOpen(true)}>\n <UserRoundPenIcon className=\"size-4\" />\n Edit profile…\n </ContextMenuItem>\n ) : null}\n <ContextMenuItem\n aria-keyshortcuts={copyLinkKeys?.ariaKeys}\n onSelect={() => void chatOps.copyLink(props.session)}\n >\n <LinkIcon className=\"size-4\" />\n Copy link\n {copyLinkKeys ? <ContextMenuShortcut>{copyLinkKeys.label}</ContextMenuShortcut> : null}\n </ContextMenuItem>\n {!props.session.archived ? (\n <>\n <ContextMenuItem\n aria-keyshortcuts={pinKeys?.ariaKeys}\n onSelect={() => {\n contextPinSelection.current = true;\n void props.onPin(props.session, !props.session.pinned, \"row\");\n }}\n >\n <PinIcon className={props.session.pinned ? \"size-4 fill-current\" : \"size-4\"} />\n {props.session.pinned ? \"Unpin\" : \"Pin\"}\n {pinKeys ? <ContextMenuShortcut>{pinKeys.label}</ContextMenuShortcut> : null}\n </ContextMenuItem>\n <ContextMenuItem\n onSelect={() =>\n void props.onUpdateAttention(props.session, { unread: !props.session.unread })\n }\n >\n {props.session.unread ? (\n <MailOpenIcon className=\"size-4\" />\n ) : (\n <MailIcon className=\"size-4\" />\n )}\n {props.session.unread ? \"Mark as read\" : \"Mark as unread\"}\n </ContextMenuItem>\n <ContextMenuItem\n onSelect={() =>\n void props.onUpdateAttention(props.session, {\n activelyWorking: !props.session.activelyWorking,\n })\n }\n >\n <ActiveWorkMark className=\"size-4\" />\n {props.session.activelyWorking ? \"Stop actively working\" : \"Mark as actively working\"}\n </ContextMenuItem>\n </>\n ) : null}\n {rowArchiveLabel(context, props.session, archiveTarget) ? (\n <ContextMenuItem onSelect={() => void props.onArchive(archiveTarget, true)}>\n <ArchiveIcon className=\"size-4\" />\n {rowArchiveLabel(context, props.session, archiveTarget)}\n </ContextMenuItem>\n ) : null}\n {props.session.parentSessionId === null && props.session.archived ? (\n <ContextMenuItem\n variant=\"destructive\"\n onSelect={() => props.onRequestDelete(props.session)}\n >\n <Trash2Icon className=\"size-4\" />\n Delete chat\n </ContextMenuItem>\n ) : null}\n {props.channels.length > 0 &&\n props.session.parentSessionId === null &&\n !props.session.archived ? (\n <>\n <ContextMenuSeparator />\n <ContextMenuLabel>Move to project</ContextMenuLabel>\n {[{ id: null, name: \"Default\" }, ...props.channels].map((channel) => {\n const current = props.session.channelId === channel.id;\n return (\n <ContextMenuItem\n key={channel.id ?? \"default\"}\n aria-current={current ? \"true\" : undefined}\n onSelect={() => {\n if (current) return;\n contextPinSelection.current = true;\n void props.onMoveToChannel(props.session, channel.id, \"row\");\n }}\n >\n {channel.id === null ? (\n <FolderIcon aria-hidden=\"true\" />\n ) : (\n <ProjectGlyph project={channel} className=\"size-4\" />\n )}\n <span className=\"min-w-0 flex-1 truncate\">{channel.name}</span>\n <DropdownMenuCheck checked={current} />\n </ContextMenuItem>\n );\n })}\n </>\n ) : null}\n </ContextMenuContent>\n {context.updateSessionProfile && profileOpen ? (\n <SessionProfileEditorDialog\n session={props.session}\n update={context.updateSessionProfile}\n open={profileOpen}\n onOpenChange={setProfileOpen}\n />\n ) : null}\n </ContextMenu>\n );\n}\n\nfunction sessionDescendantLabel(session: Session): string | null {\n const stats = session.treeStats;\n if (!stats || stats.totalDescendants === 0) return null;\n const live = stats.runningDescendants + stats.queuedDescendants;\n const total = sessionDescendantCountText(stats.totalDescendants, stats.truncated);\n if (stats.attentionDescendants > 0) {\n const waiting = stats.attentionSince ? formatWaitingSince(stats.attentionSince) : \"\";\n return `${stats.attentionDescendants} need you${waiting ? ` for ${waiting}` : \"\"} · ${total} total`;\n }\n if (live > 0) return `${live} active · ${total} total`;\n return `${total} session${stats.totalDescendants === 1 && !stats.truncated ? \"\" : \"s\"}`;\n}\n\n/**\n * What archive acts on for a row: a top-level session itself, a spawned one\n * its workstream's root (archive belongs to the whole workstream). The root\n * is the loaded one when known; otherwise the row, resolved on archive.\n */\nfunction useWorkstreamArchiveTarget(session: Session): Session {\n const roots = useContext(WorkstreamRootsContext);\n return session.parentSessionId === null\n ? session\n : (roots?.get(session.rootSessionId) ?? session);\n}\n\n/** \"Archive\" (or \"Archive workstream\" on a spawned row) where allowed, otherwise null. */\nfunction rowArchiveLabel(\n context: Parameters<typeof archiveActionLabel>[0],\n session: Session,\n target: Session,\n): string | null {\n const label = archiveActionLabel(context, target);\n if (label === null || session.parentSessionId === null) return label;\n return `${label} workstream`;\n}\n\n/**\n * The two common row actions stay one click away on desktop, over the row's\n * time and status. Keyboard focus reveals the same controls as hover;\n * right-click still opens the complete context menu owned by SessionRow.\n */\nexport function RowQuickActions({\n session,\n onPin,\n onArchive,\n}: {\n session: Session;\n onPin: PinFn;\n onArchive: ArchiveFn;\n}) {\n const archiveContext = useAppContext();\n const target = useWorkstreamArchiveTarget(session);\n const canPin = !session.archived;\n const archiveLabel = rowArchiveLabel(archiveContext, session, target);\n\n return (\n <div className={RAIL_ROW_QUICK_ACTIONS_CLASS} data-session-quick-actions={session.id}>\n {canPin ? (\n <RailRowQuickAction\n label={session.pinned ? \"Unpin session\" : \"Pin session\"}\n tooltip={session.pinned ? \"Unpin\" : \"Pin\"}\n data-session-actions={session.id}\n data-session-actions-mode=\"quick\"\n onActivate={() => void onPin(session, !session.pinned, \"actions\")}\n >\n <PinIcon className={session.pinned ? \"size-3.5 fill-current\" : \"size-3.5\"} />\n </RailRowQuickAction>\n ) : null}\n {archiveLabel ? (\n <RailRowQuickAction\n label={session.parentSessionId !== null ? archiveLabel : \"Archive session\"}\n tooltip={archiveLabel}\n data-session-actions={session.id}\n data-session-actions-mode=\"quick\"\n data-session-action=\"archive\"\n onActivate={() => void onArchive(target, true, \"actions\")}\n >\n <ArchiveIcon className=\"size-3.5\" />\n </RailRowQuickAction>\n ) : null}\n </div>\n );\n}\n\n/**\n * Touch and other coarse pointers have no dependable hover or right-click, so\n * they retain the complete overflow menu as an always-visible fallback.\n */\nfunction RowActionsMenu({\n session,\n onRename,\n onPin,\n channels,\n onMoveToChannel,\n onUpdateAttention,\n onArchive,\n onRequestDelete,\n}: {\n session: Session;\n onRename: () => void;\n onPin: PinFn;\n channels: Channel[];\n onMoveToChannel: MoveToChannelFn;\n onUpdateAttention: UpdateAttentionFn;\n onArchive: ArchiveFn;\n onRequestDelete: RequestDeleteFn;\n}) {\n const archiveContext = useAppContext();\n const archiveTarget = useWorkstreamArchiveTarget(session);\n const remountSelection = useRef(false);\n const chatOps = useChatOperations();\n const copyLinkKeys = useActionShortcut(\"chat.copyLink\");\n const pinKeys = useActionShortcut(\"chat.pin\");\n // Filing is a root-session concept: the rail groups a whole tree by its\n // root's channel, so children offer no move affordance.\n const canMove = channels.length > 0 && session.parentSessionId === null && !session.archived;\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={`Actions for ${sessionDisplayTitle(session)}`}\n data-session-actions={session.id}\n data-session-actions-mode=\"overflow\"\n onClick={(event) => event.stopPropagation()}\n className={RAIL_ROW_OVERFLOW_TRIGGER_CLASS}\n >\n <EllipsisIcon className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"min-w-40\"\n data-session-menu={session.id}\n onClick={(event) => event.stopPropagation()}\n onCloseAutoFocus={(event) => {\n if (!remountSelection.current) return;\n // The optimistic projection remounts the trigger under another\n // SessionGroup; the list-level focus owner targets that new node.\n event.preventDefault();\n remountSelection.current = false;\n }}\n >\n <DropdownMenuItem\n onSelect={onRename}\n // The menu item lives inside the row; stop the synthetic click from\n // activating the session link.\n onClick={(event) => event.stopPropagation()}\n >\n <PencilIcon className=\"size-4\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n aria-keyshortcuts={copyLinkKeys?.ariaKeys}\n onSelect={() => void chatOps.copyLink(session)}\n onClick={(event) => event.stopPropagation()}\n >\n <LinkIcon className=\"size-4\" />\n Copy link\n {copyLinkKeys ? <DropdownMenuShortcut>{copyLinkKeys.label}</DropdownMenuShortcut> : null}\n </DropdownMenuItem>\n {!session.archived ? (\n <>\n <DropdownMenuItem\n aria-keyshortcuts={pinKeys?.ariaKeys}\n onSelect={() => {\n remountSelection.current = true;\n void onPin(session, !session.pinned, \"actions\");\n }}\n onClick={(event) => event.stopPropagation()}\n >\n <PinIcon className={session.pinned ? \"size-4 fill-current\" : \"size-4\"} />\n {session.pinned ? \"Unpin\" : \"Pin\"}\n {pinKeys ? <DropdownMenuShortcut>{pinKeys.label}</DropdownMenuShortcut> : null}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => void onUpdateAttention(session, { unread: !session.unread })}\n onClick={(event) => event.stopPropagation()}\n >\n {session.unread ? (\n <MailOpenIcon className=\"size-4\" />\n ) : (\n <MailIcon className=\"size-4\" />\n )}\n {session.unread ? \"Mark as read\" : \"Mark as unread\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() =>\n void onUpdateAttention(session, { activelyWorking: !session.activelyWorking })\n }\n onClick={(event) => event.stopPropagation()}\n >\n <ActiveWorkMark className=\"size-4\" />\n {session.activelyWorking ? \"Stop actively working\" : \"Mark as actively working\"}\n </DropdownMenuItem>\n </>\n ) : null}\n {rowArchiveLabel(archiveContext, session, archiveTarget) ? (\n <DropdownMenuItem\n onSelect={() => void onArchive(archiveTarget, true)}\n onClick={(event) => event.stopPropagation()}\n >\n <ArchiveIcon className=\"size-4\" />\n {rowArchiveLabel(archiveContext, session, archiveTarget)}\n </DropdownMenuItem>\n ) : null}\n {session.parentSessionId === null && session.archived ? (\n <DropdownMenuItem\n variant=\"destructive\"\n onSelect={() => onRequestDelete(session)}\n onClick={(event) => event.stopPropagation()}\n >\n <Trash2Icon className=\"size-4\" />\n Delete chat\n </DropdownMenuItem>\n ) : null}\n {canMove ? (\n // Flat section, deliberately not a Radix submenu: the Sub primitives\n // are otherwise unused in the shell graph and pulling them in\n // re-clusters ~470 KB of shared chunks into the startup bundle.\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Move to project</DropdownMenuLabel>\n {[{ id: null, name: \"Default\" }, ...channels].map((channel) => {\n const current = session.channelId === channel.id;\n return (\n <DropdownMenuItem\n key={channel.id ?? \"default\"}\n aria-current={current ? \"true\" : undefined}\n onSelect={() => {\n if (current) return;\n remountSelection.current = true;\n void onMoveToChannel(session, channel.id, \"actions\");\n }}\n onClick={(event) => event.stopPropagation()}\n >\n {channel.id === null ? (\n <FolderIcon aria-hidden=\"true\" />\n ) : (\n <ProjectGlyph project={channel} className=\"size-4\" />\n )}\n <span className=\"min-w-0 flex-1 truncate\">{channel.name}</span>\n <DropdownMenuCheck checked={current} />\n </DropdownMenuItem>\n );\n })}\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction EmptySessions({ archived = false }: { archived?: boolean | undefined }) {\n return (\n <div className=\"mt-2 grid gap-2 rounded-lg border border-dashed border-border px-3 py-4 text-center\">\n <p className=\"text-xs text-fg-muted\">\n {archived ? \"No archived sessions\" : \"No sessions yet\"}\n </p>\n {!archived ? (\n <Button asChild size=\"sm\" className=\"mx-auto\">\n <NewSessionLink>\n <PlusIcon className=\"size-3.5\" />\n Start your first session\n </NewSessionLink>\n </Button>\n ) : null}\n </div>\n );\n}\n\n/**\n * Collapsed-rail stand-in for the list: a Sessions icon carrying a count badge\n * of running sessions; clicking expands the rail to reveal the full list.\n */\nexport function CollapsedSessionsButton() {\n const windowEvents = useUiEventTarget(\"window\");\n const searchShortcut = useActionShortcut(\"commandMenu.open\");\n const rail = useRail();\n const { workspaceSessionListEvent } = useOpenGeni();\n const hintsAvailable =\n workspaceSessionListEvent?.workspaceId === rail.workspaceId &&\n workspaceSessionListEvent.available;\n const { sessions, loading, error, refresh } = useWorkspaceSessions({\n projection: \"summary\",\n limit: 50,\n pollIntervalMs: hintsAvailable ? undefined : 15_000,\n });\n useSessionListHintRefresh(refresh, error);\n const runningCount = useMemo(() => groupSessionsForRail(t, sessions).running.length, [sessions]);\n // The collapsed rail can't render the expanded list's loading/error copy, so\n // it mirrors those states: a failed load shows a failed-tone marker + tooltip\n // (expanding reveals the retry), a first load shows a gentle pulse.\n const failed = Boolean(error) && sessions.length === 0;\n const firstLoad = loading && sessions.length === 0;\n const tooltip = failed ? \"Session history is unavailable\" : \"Sessions\";\n return (\n <div className=\"flex flex-1 flex-col items-center gap-1 px-2 pt-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Search sessions\"\n aria-keyshortcuts={searchShortcut?.ariaKeys}\n onClick={() => requestCommandMenu(windowEvents)}\n className=\"text-fg-label hover:text-fg\"\n >\n <SearchIcon className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n <TooltipWithKeys label=\"Search sessions\" shortcut={searchShortcut} />\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={\n failed\n ? \"Sessions (history unavailable)\"\n : `Sessions${runningCount > 0 ? ` (${runningCount} running)` : \"\"}`\n }\n onClick={() => rail.setCollapsed(false)}\n className=\"relative text-fg-label hover:text-fg\"\n >\n <MessagesSquareIcon\n className={cn(\"size-4\", firstLoad && \"motion-safe:animate-pulse\")}\n />\n {failed ? (\n <span className=\"absolute -right-0.5 -top-0.5 flex size-2 rounded-full bg-status-failed\" />\n ) : runningCount > 0 ? (\n <span className=\"absolute -right-0.5 -top-0.5 flex min-w-3.5 items-center justify-center rounded-full bg-brand-strong px-1 text-2xs font-semibold leading-tight text-brand-fg\">\n {runningCount}\n </span>\n ) : null}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{tooltip}</TooltipContent>\n </Tooltip>\n </div>\n );\n}\n\nfunction SessionListSkeleton() {\n const skeletonRows = [\n \"session-skeleton-1\",\n \"session-skeleton-2\",\n \"session-skeleton-3\",\n \"session-skeleton-4\",\n \"session-skeleton-5\",\n ];\n return (\n <div className=\"grid gap-1 px-1 pt-2\">\n {skeletonRows.map((rowKey) => (\n <div key={rowKey} className=\"flex h-8 items-center gap-2 px-1\">\n <span className=\"size-1.5 shrink-0 rounded-full bg-surface-3\" />\n <span className=\"h-3 flex-1 animate-pulse rounded bg-surface-2\" />\n </div>\n ))}\n </div>\n );\n}\n\n/**\n * Delete a chat, stopping it first when it is still running. The API refuses\n * to delete a chat with an active turn (409), so the person's \"Delete\" stops\n * the chat (terminal cancel) and retries until its turn has wound down. Every\n * other 409 (saved outputs or forks depend on it, background commands, a\n * sub-chat) is permanent: surface it as-is and never cancel the chat for it.\n */\nasync function deleteStoppingIfRunning(\n client: {\n deleteSession(workspaceId: string, sessionId: string): Promise<{ deletedSessionCount: number }>;\n cancelSession(\n workspaceId: string,\n sessionId: string,\n options: { reason?: string },\n ): Promise<unknown>;\n },\n workspaceId: string,\n sessionId: string,\n): Promise<{ deletedSessionCount: number }> {\n try {\n return await client.deleteSession(workspaceId, sessionId);\n } catch (error) {\n if (!isStillRunningDeleteRefusal(error)) throw error;\n }\n await client.cancelSession(workspaceId, sessionId, { reason: \"Deleted by user\" });\n const deadline = Date.now() + 30_000;\n for (let delay = 500; ; delay = Math.min(delay * 2, 4_000)) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n try {\n return await client.deleteSession(workspaceId, sessionId);\n } catch (error) {\n if (!isStillRunningDeleteRefusal(error) || Date.now() > deadline) throw error;\n }\n }\n}\n\n/** Only \"still running\" (or a box still shutting down) is worth stopping the chat and retrying for. */\nexport function isStillRunningDeleteRefusal(error: unknown): boolean {\n if (!(error instanceof OpenGeniApiError) || error.status !== 409) return false;\n const code = error.details?.code;\n if (typeof code === \"string\") {\n return code === \"session_delete_active_sessions\" || code === \"session_delete_live_sandboxes\";\n }\n // Servers before structured refusal codes: keep the old behaviour only for the running case.\n return /still running|still shutting down/i.test(error.message);\n}\n","/**\n * Whether ⌘ (Mac) or Ctrl (elsewhere) is being held on its own, so the page\n * can show which keys it unlocks: the pinned chats show ⌘1 to ⌘9.\n *\n * The hint waits a moment before appearing, so a quick ⌘C or ⌘K never flashes\n * it, and it goes away on release, on any other key, and when the window loses\n * focus (⌘Tab to another app releases the key where the page can't see it).\n */\nimport { useSyncExternalStore } from \"react\";\n\nimport type { ChordPlatform } from \"./chords\";\n\nexport const HELD_MODIFIER_DELAY_MS = 350;\n\ntype HeldModifierTracker = {\n subscribe(listener: () => void): () => void;\n held(): boolean;\n};\n\n/** One tracker per window and platform; every row reads the same state. */\nexport function createHeldModifierTracker(\n target: Pick<Window, \"addEventListener\" | \"removeEventListener\">,\n platform: ChordPlatform,\n timers: Pick<typeof globalThis, \"setTimeout\" | \"clearTimeout\"> = globalThis,\n): HeldModifierTracker {\n const modifierKey = platform === \"mac\" ? \"Meta\" : \"Control\";\n const listeners = new Set<() => void>();\n let held = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const set = (next: boolean) => {\n if (held === next) return;\n held = next;\n for (const listener of listeners) listener();\n };\n const reset = () => {\n if (timer !== null) timers.clearTimeout(timer);\n timer = null;\n set(false);\n };\n const onKeyDown = (event: Event) => {\n const keyEvent = event as KeyboardEvent;\n const alone =\n keyEvent.key === modifierKey &&\n !keyEvent.shiftKey &&\n !keyEvent.altKey &&\n (platform === \"mac\" ? !keyEvent.ctrlKey : !keyEvent.metaKey);\n if (!alone) {\n reset();\n return;\n }\n if (keyEvent.repeat || held || timer !== null) return;\n timer = timers.setTimeout(() => {\n timer = null;\n set(true);\n }, HELD_MODIFIER_DELAY_MS);\n };\n const onKeyUp = (event: Event) => {\n if ((event as KeyboardEvent).key === modifierKey) reset();\n };\n const onVisibility = () => reset();\n\n return {\n subscribe(listener) {\n listeners.add(listener);\n if (listeners.size === 1) {\n target.addEventListener(\"keydown\", onKeyDown, true);\n target.addEventListener(\"keyup\", onKeyUp, true);\n target.addEventListener(\"blur\", reset);\n target.addEventListener(\"visibilitychange\", onVisibility);\n target.addEventListener(\"pointerdown\", reset, true);\n }\n return () => {\n listeners.delete(listener);\n if (listeners.size > 0) return;\n target.removeEventListener(\"keydown\", onKeyDown, true);\n target.removeEventListener(\"keyup\", onKeyUp, true);\n target.removeEventListener(\"blur\", reset);\n target.removeEventListener(\"visibilitychange\", onVisibility);\n target.removeEventListener(\"pointerdown\", reset, true);\n if (timer !== null) timers.clearTimeout(timer);\n timer = null;\n held = false;\n };\n },\n held: () => held,\n };\n}\n\nconst trackers = new Map<ChordPlatform, HeldModifierTracker>();\n\nfunction windowTracker(platform: ChordPlatform): HeldModifierTracker | null {\n if (typeof window === \"undefined\") return null;\n let tracker = trackers.get(platform);\n if (!tracker) {\n tracker = createHeldModifierTracker(window, platform);\n trackers.set(platform, tracker);\n }\n return tracker;\n}\n\nconst NEVER: HeldModifierTracker = { subscribe: () => () => {}, held: () => false };\n\n/** True while ⌘ (Ctrl elsewhere) is held alone; `enabled: false` never listens. */\nexport function useHeldModifier(platform: ChordPlatform, enabled: boolean): boolean {\n const tracker = (enabled ? windowTracker(platform) : null) ?? NEVER;\n return useSyncExternalStore(tracker.subscribe, tracker.held, () => false);\n}\n"],"mappings":"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","names":["useSyncExternalStore","NewSessionLink","useSyncExternalStore","projectedSessions","window","bucket"]}