@opengeni/react 4.4.1 → 4.5.1-canary.39832248373001

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 (654) hide show
  1. package/dist/app/app-state.js +15 -15
  2. package/dist/app/components/Composer.js +19 -19
  3. package/dist/app/components/artifacts/artifact-browse-controls.js +3 -3
  4. package/dist/app/components/artifacts/artifact-library.js +9 -9
  5. package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
  6. package/dist/app/components/artifacts/chat-interactive-block.js +14 -14
  7. package/dist/app/components/artifacts/inline-chat-image.js +22 -21
  8. package/dist/app/components/artifacts/retained-file-preview.js +24 -23
  9. package/dist/app/components/artifacts/retained-text-preview.js +2 -2
  10. package/dist/app/components/artifacts/site-audience.js +2 -2
  11. package/dist/app/components/artifacts/site-conversations.js +14 -13
  12. package/dist/app/components/artifacts/site-data.js +4 -4
  13. package/dist/app/components/artifacts/site-publishing.js +20 -20
  14. package/dist/app/components/artifacts/site-settings.js +25 -25
  15. package/dist/app/components/billing-class-mark.js +3 -3
  16. package/dist/app/components/capabilities/capability-detail-sheet.js +6 -6
  17. package/dist/app/components/capabilities/capability-logo-source.js +8 -8
  18. package/dist/app/components/capabilities/connector-tool-permissions.js +3 -3
  19. package/dist/app/components/capabilities/native-connect-setup.js +8 -8
  20. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +10 -10
  21. package/dist/app/components/capabilities/session-capability-card.js +43 -41
  22. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  23. package/dist/app/components/capabilities/session-chrome-card.js +20 -18
  24. package/dist/app/components/capabilities/session-custom-mcp-card.js +11 -11
  25. package/dist/app/components/capabilities/session-github-card.js +13 -13
  26. package/dist/app/components/capabilities/session-machine-card.js +19 -17
  27. package/dist/app/components/command-menu/chat-status.js +16 -15
  28. package/dist/app/components/command-menu/chat-switcher.js +19 -18
  29. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  30. package/dist/app/components/command-menu/command-menu.js +29 -107
  31. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  32. package/dist/app/components/command-menu/shortcut-sheet.js +9 -9
  33. package/dist/app/components/composer-mobile-plus-panel.js +9 -9
  34. package/dist/app/components/composer-mobile-plus.js +1 -1
  35. package/dist/app/components/credit-required-gate.js +1 -1
  36. package/dist/app/components/credit-required-prompt.js +5 -5
  37. package/dist/app/components/credits/coupon-redeem.js +2 -2
  38. package/dist/app/components/credits/credit-refusal-notice.js +2 -2
  39. package/dist/app/components/desktop/app-shots.js +7 -7
  40. package/dist/app/components/desktop/this-computer.js +4 -4
  41. package/dist/app/components/feedback.js +3 -3
  42. package/dist/app/components/follow-up-repository-menu-body.js +2 -2
  43. package/dist/app/components/follow-up-repository-picker.js +1 -1
  44. package/dist/app/components/github-app-connect-launcher.js +2 -2
  45. package/dist/app/components/in-app-help-link.js +2 -2
  46. package/dist/app/components/machines/connect-machine-dialog.js +3 -3
  47. package/dist/app/components/markdown.js +5 -5
  48. package/dist/app/components/models/models-ui.js +3 -3
  49. package/dist/app/components/new-session-starters.js +2 -2
  50. package/dist/app/components/pickers.js +6 -6
  51. package/dist/app/components/rail/rail-context.js +3 -3
  52. package/dist/app/components/rail/rail-sections.js +51 -48
  53. package/dist/app/components/rail/session-header.js +29 -28
  54. package/dist/app/components/rail/session-list.js +50 -47
  55. package/dist/app/components/rail/session-row-content.d.ts +6 -2
  56. package/dist/app/components/rail/session-row-content.js +1 -1
  57. package/dist/app/components/rail/session-row-hover-details.js +17 -16
  58. package/dist/app/components/rail/session-shell.js +78 -75
  59. package/dist/app/components/rail/site-session-group-heading.d.ts +7 -1
  60. package/dist/app/components/rail/site-session-group-heading.js +20 -3
  61. package/dist/app/components/repository-picker.js +2 -2
  62. package/dist/app/components/session/agent-configuration-panel.js +18 -18
  63. package/dist/app/components/session/artifact-link-boundary.js +2 -2
  64. package/dist/app/components/session/artifact-session-page.js +5 -5
  65. package/dist/app/components/session/banners.js +7 -7
  66. package/dist/app/components/session/codex-account-indicator.js +10 -10
  67. package/dist/app/components/session/editable-artifacts-workspace.js +24 -24
  68. package/dist/app/components/session/failed-session-banner.js +6 -6
  69. package/dist/app/components/session/human-input.js +41 -37
  70. package/dist/app/components/session/inspector.js +61 -57
  71. package/dist/app/components/session/inspector.js.map +1 -1
  72. package/dist/app/components/session/message-actions.js +3 -3
  73. package/dist/app/components/session/message-resource-attachments.js +12 -11
  74. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  75. package/dist/app/components/session/model-account-indicator.js +9 -9
  76. package/dist/app/components/session/model-recovery-notice.js +3 -3
  77. package/dist/app/components/session/new-session-settings-menu.js +8 -8
  78. package/dist/app/components/session/sandbox-switcher.js +12 -12
  79. package/dist/app/components/session/sandbox-workspace.js +58 -54
  80. package/dist/app/components/session/search-markdown-highlight.js +6 -6
  81. package/dist/app/components/session/search-results-view.js +7 -7
  82. package/dist/app/components/session/session-admin-access.js +3 -3
  83. package/dist/app/components/session/session-admission-notice.js +5 -5
  84. package/dist/app/components/session/session-machine-access-notice.js +5 -5
  85. package/dist/app/components/session/session-search-dialog.js +8 -8
  86. package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
  87. package/dist/app/components/session/session-tenancy-control.js +26 -11
  88. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  89. package/dist/app/components/session/session-usage-limit-section.js +4 -4
  90. package/dist/app/components/session/session-wait-status.js +8 -7
  91. package/dist/app/components/session/session-wait-status.js.map +1 -1
  92. package/dist/app/components/session/site-origin-link.d.ts +1 -0
  93. package/dist/app/components/session/site-origin-link.js +2 -2
  94. package/dist/app/components/session/subagents.js +13 -12
  95. package/dist/app/components/settings/row-select.js +3 -3
  96. package/dist/app/components/transcription-settings.js +4 -4
  97. package/dist/app/components/usage/usage-entry.js +5 -5
  98. package/dist/app/components/workspace-composer-plus.js +12 -12
  99. package/dist/app/embed/memory-navigation.js +2 -2
  100. package/dist/app/embed/session-app.js +196 -190
  101. package/dist/app/lib/actions/actions-provider.js +9 -9
  102. package/dist/app/lib/actions/held-modifier.d.ts +11 -0
  103. package/dist/app/lib/app-surfaces.js +2 -2
  104. package/dist/app/lib/codex-usage-query.js +6 -6
  105. package/dist/app/lib/composer-connectors.js +9 -9
  106. package/dist/app/lib/console-site.d.ts +6 -0
  107. package/dist/app/lib/console-site.js +14 -0
  108. package/dist/app/lib/console-text.js +2 -2
  109. package/dist/app/lib/events.js +13 -12
  110. package/dist/app/lib/failed-session-copy.js +3 -3
  111. package/dist/app/lib/model-access-onboarding.js +3 -3
  112. package/dist/app/lib/move-chat-to-machine.js +3 -3
  113. package/dist/app/lib/navigation.d.ts +5 -0
  114. package/dist/app/lib/navigation.js +1 -1
  115. package/dist/app/lib/routes.d.ts +17 -0
  116. package/dist/app/lib/routes.js +9 -3
  117. package/dist/app/lib/session-branch-cache.js +12 -11
  118. package/dist/app/lib/session-create.js +2 -2
  119. package/dist/app/lib/session-deep-link.js +2 -2
  120. package/dist/app/lib/session-failure-toasts.d.ts +8 -0
  121. package/dist/app/lib/session-group-pagination.js +12 -11
  122. package/dist/app/lib/session-hover-facts.js +12 -11
  123. package/dist/app/lib/session-model.js +2 -2
  124. package/dist/app/lib/session-rail.js +8 -7
  125. package/dist/app/lib/session-rename.js +2 -2
  126. package/dist/app/lib/session-ui-features.d.ts +6 -1
  127. package/dist/app/lib/session-ui-features.js +1 -1
  128. package/dist/app/lib/sessions-group.d.ts +43 -3
  129. package/dist/app/lib/sessions-group.js +19 -12
  130. package/dist/app/lib/shared-query.js +3 -3
  131. package/dist/app/lib/site-opened.d.ts +6 -0
  132. package/dist/app/lib/site-opened.js +10 -0
  133. package/dist/app/lib/turn-failure-analytics.js +5 -5
  134. package/dist/app/lib/use-duplicate-site.js +2 -2
  135. package/dist/app/lib/use-follow-up-repositories.js +2 -2
  136. package/dist/app/lib/use-session-list-hint-refresh.d.ts +20 -2
  137. package/dist/app/lib/use-session-list-hint-refresh.js +5 -1
  138. package/dist/app/lib/use-workspace-machines.js +5 -5
  139. package/dist/app/lib/use-workspace-model-catalog.js +7 -7
  140. package/dist/app/lib/use-workspace-rigs.js +7 -7
  141. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  142. package/dist/app/lib/workspace-scope-context.js +3 -3
  143. package/dist/app/routes/artifacts.js +70 -87
  144. package/dist/app/routes/artifacts.js.map +1 -1
  145. package/dist/app/routes/retained-artifact.js +36 -35
  146. package/dist/app/routes/retained-artifact.js.map +1 -1
  147. package/dist/app/routes/session-unavailable.js +6 -4
  148. package/dist/app/routes/session.js +127 -123
  149. package/dist/app/routes/sessions-index-hydration.js +3 -3
  150. package/dist/app/routes/sessions-index.js +96 -94
  151. package/dist/app/routes/site-view.d.ts +11 -0
  152. package/dist/app/routes/site-view.js +597 -0
  153. package/dist/app/routes/site-view.js.map +1 -0
  154. package/dist/artifacts-document.js +4 -4
  155. package/dist/artifacts-presentation.js +4 -4
  156. package/dist/artifacts-spreadsheet.js +4 -4
  157. package/dist/artifacts.js +13 -13
  158. package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-VPK3CV2H.js} +7 -5
  159. package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-AMDSW656.js} +5 -5
  160. package/dist/chunk-22GTC4MZ.js +15 -0
  161. package/dist/chunk-22GTC4MZ.js.map +1 -0
  162. package/dist/{chunk-RQDFYQHA.js → chunk-25LWDG5D.js} +6 -6
  163. package/dist/{chunk-U3HSFCON.js → chunk-2CKVVAGP.js} +15 -15
  164. package/dist/{chunk-F6LBGYS6.js → chunk-2DL6NJP5.js} +15 -15
  165. package/dist/{chunk-UHFWF6ZU.js → chunk-2FPS5H2D.js} +2 -2
  166. package/dist/{chunk-NAWXARTY.js → chunk-2KO2G3RI.js} +72 -6
  167. package/dist/chunk-2KO2G3RI.js.map +1 -0
  168. package/dist/{chunk-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
  169. package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
  170. package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
  171. package/dist/{chunk-N3ZP4IDU.js → chunk-45WYYFP6.js} +2 -2
  172. package/dist/{chunk-HOJGAJAB.js → chunk-4MQLGMV2.js} +5 -5
  173. package/dist/{chunk-L7YURQI2.js → chunk-4U4GXWXS.js} +3 -3
  174. package/dist/{chunk-63VGE4OH.js → chunk-5HIOVXOX.js} +3 -3
  175. package/dist/{chunk-GFUUFM2O.js → chunk-5M23GZA2.js} +3 -3
  176. package/dist/{chunk-PM3OSANE.js → chunk-5MJHH72T.js} +14 -3
  177. package/dist/chunk-5MJHH72T.js.map +1 -0
  178. package/dist/{chunk-RKB2Z457.js → chunk-5VGJXWQ2.js} +2 -2
  179. package/dist/{chunk-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
  180. package/dist/chunk-5YFY4SFC.js.map +1 -0
  181. package/dist/{chunk-I6VUUEXH.js → chunk-6AFSZKZA.js} +3 -3
  182. package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
  183. package/dist/{chunk-5MZTJMZ3.js → chunk-6MRY2RUZ.js} +13 -7
  184. package/dist/chunk-6MRY2RUZ.js.map +1 -0
  185. package/dist/{chunk-4EONHNJU.js → chunk-6O4VWKSO.js} +2 -2
  186. package/dist/chunk-756MKA2J.js +45 -0
  187. package/dist/chunk-756MKA2J.js.map +1 -0
  188. package/dist/{chunk-BSX2R4CW.js → chunk-767WCGAX.js} +6 -6
  189. package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
  190. package/dist/{chunk-OSVHU2WU.js → chunk-7IYAHFPE.js} +2 -2
  191. package/dist/{chunk-4EAF3HSD.js → chunk-7J7PZB4S.js} +2 -2
  192. package/dist/{chunk-ADJJQSYC.js → chunk-7PUFAH4I.js} +34 -32
  193. package/dist/chunk-7PUFAH4I.js.map +1 -0
  194. package/dist/{chunk-OR37STQZ.js → chunk-7R2JQHBX.js} +3 -3
  195. package/dist/{chunk-QM5H4FPT.js → chunk-7VN6VC3D.js} +3 -3
  196. package/dist/{chunk-HWDGJFM4.js → chunk-A2E3ZF6N.js} +4 -4
  197. package/dist/{chunk-RGW24ZZM.js → chunk-A6CK4ENG.js} +19 -17
  198. package/dist/chunk-A6CK4ENG.js.map +1 -0
  199. package/dist/{chunk-4432A3HQ.js → chunk-A6T4FGE7.js} +4 -4
  200. package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
  201. package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
  202. package/dist/{chunk-46VBQG2D.js → chunk-AOUCHCSB.js} +5 -5
  203. package/dist/{chunk-HDHK3SXK.js → chunk-AT4K4F6S.js} +2 -2
  204. package/dist/{chunk-TQGJN5UZ.js → chunk-AW3QEFOF.js} +140 -522
  205. package/dist/chunk-AW3QEFOF.js.map +1 -0
  206. package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
  207. package/dist/{chunk-HO5Y2OOX.js → chunk-BLPXOHG6.js} +6 -6
  208. package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
  209. package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
  210. package/dist/{chunk-AOLE4IRZ.js → chunk-C535KSTY.js} +2 -2
  211. package/dist/{chunk-IVOA3DXA.js → chunk-CB574ERL.js} +4 -4
  212. package/dist/{chunk-IBTXYLBW.js → chunk-CCFWY4GF.js} +2 -2
  213. package/dist/{chunk-ZOC3OP6F.js → chunk-CCR33J7L.js} +2 -2
  214. package/dist/{chunk-NYZQ7LO7.js → chunk-CDUDKETD.js} +2 -2
  215. package/dist/{chunk-JTN3T4QN.js → chunk-D3RK3NGM.js} +4 -4
  216. package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
  217. package/dist/{chunk-BJIZ7PL7.js → chunk-D64Z4V26.js} +145 -29
  218. package/dist/chunk-D64Z4V26.js.map +1 -0
  219. package/dist/{chunk-XWWXIZFP.js → chunk-DFXZYNTX.js} +7 -7
  220. package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
  221. package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
  222. package/dist/{chunk-KWKGBGAF.js → chunk-DKCX643S.js} +11 -11
  223. package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
  224. package/dist/{chunk-GTQ3SNEI.js → chunk-E36IC3LU.js} +2 -2
  225. package/dist/{chunk-CVG4FILQ.js → chunk-ECHYJP63.js} +253 -1008
  226. package/dist/chunk-ECHYJP63.js.map +1 -0
  227. package/dist/{chunk-Q35DT6I6.js → chunk-EH7TTYE6.js} +179 -170
  228. package/dist/chunk-EH7TTYE6.js.map +1 -0
  229. package/dist/{chunk-72J6C2AJ.js → chunk-EMCB6XKU.js} +2 -2
  230. package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
  231. package/dist/{chunk-AG7VGUIW.js → chunk-ERG355NM.js} +3 -3
  232. package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
  233. package/dist/{chunk-Z5WMLJKI.js → chunk-F2RMKGDQ.js} +89 -1
  234. package/dist/chunk-F2RMKGDQ.js.map +1 -0
  235. package/dist/{chunk-X7L4H4VG.js → chunk-F33EDYS7.js} +524 -426
  236. package/dist/chunk-F33EDYS7.js.map +1 -0
  237. package/dist/{chunk-HTT3FB7T.js → chunk-F3FN6DO6.js} +2 -2
  238. package/dist/{chunk-ST22GONV.js → chunk-FB3B45FP.js} +11 -11
  239. package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
  240. package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
  241. package/dist/{chunk-4VKA5O7T.js → chunk-FVL4B552.js} +9 -9
  242. package/dist/{chunk-VP62LPLW.js → chunk-G2BX56CN.js} +5 -5
  243. package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
  244. package/dist/{chunk-PN66T6JA.js → chunk-GFSOXB2K.js} +2 -2
  245. package/dist/{chunk-S4EZ3JUB.js → chunk-GZGQHQI7.js} +29 -29
  246. package/dist/chunk-H4IE2PYF.js +792 -0
  247. package/dist/chunk-H4IE2PYF.js.map +1 -0
  248. package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
  249. package/dist/chunk-H5M33DAL.js.map +1 -0
  250. package/dist/{chunk-BXRIQZAH.js → chunk-HNNM2GDN.js} +3 -3
  251. package/dist/{chunk-EU6XSQFM.js → chunk-HPB4KSV3.js} +2 -2
  252. package/dist/{chunk-QCD5Y7K5.js → chunk-HSQRYJ4P.js} +5 -5
  253. package/dist/{chunk-YXOKAG66.js → chunk-HUXDGWAN.js} +2 -2
  254. package/dist/{chunk-VUHPA3XQ.js → chunk-I66ZB6KD.js} +3 -3
  255. package/dist/{chunk-7CZTKBTI.js → chunk-IC7KNOBB.js} +5 -5
  256. package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
  257. package/dist/chunk-IECRGM6K.js.map +1 -0
  258. package/dist/{chunk-HGMWMK5K.js → chunk-IIO2MR3B.js} +2 -2
  259. package/dist/chunk-IJYL5BZM.js +38 -0
  260. package/dist/chunk-IJYL5BZM.js.map +1 -0
  261. package/dist/{chunk-L6RXRRN3.js → chunk-ILDOW2IQ.js} +3 -3
  262. package/dist/{chunk-O756O2I7.js → chunk-IPPVX5GF.js} +1 -1
  263. package/dist/{chunk-X7ASQHR6.js → chunk-IUK5QGP5.js} +2 -2
  264. package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
  265. package/dist/chunk-JFK7NTEA.js.map +1 -0
  266. package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
  267. package/dist/chunk-JRSNCSZN.js +37 -0
  268. package/dist/chunk-JRSNCSZN.js.map +1 -0
  269. package/dist/{chunk-DDK4WFJ3.js → chunk-JWN7SLTO.js} +9 -9
  270. package/dist/{chunk-Q35YZVDZ.js → chunk-KFWVBTUH.js} +3 -3
  271. package/dist/{chunk-JXT5QDJC.js → chunk-KNFDWNCH.js} +5 -5
  272. package/dist/{chunk-AZVANYMB.js → chunk-KUNFUSZ7.js} +2 -2
  273. package/dist/{chunk-DXZNDKQD.js → chunk-LEEJBZ5B.js} +2 -2
  274. package/dist/{chunk-STUCI6QA.js → chunk-LEKBNKLD.js} +1 -1
  275. package/dist/{chunk-STUCI6QA.js.map → chunk-LEKBNKLD.js.map} +1 -1
  276. package/dist/{chunk-RSNYGEVZ.js → chunk-LKJ2C7PH.js} +8 -8
  277. package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
  278. package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
  279. package/dist/{chunk-GAIM5RNE.js → chunk-MJQBC7C5.js} +3 -3
  280. package/dist/{chunk-NWZW2WHN.js → chunk-MM7OKOTE.js} +6 -6
  281. package/dist/{chunk-FM4OUCC2.js → chunk-MOKYT3X3.js} +3 -3
  282. package/dist/{chunk-GZ64CASI.js → chunk-MVZYNZXE.js} +5 -4
  283. package/dist/chunk-MVZYNZXE.js.map +1 -0
  284. package/dist/{chunk-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
  285. package/dist/{chunk-XOFUXMPP.js → chunk-ND2WCWXI.js} +4 -4
  286. package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
  287. package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
  288. package/dist/{chunk-OO2T63BY.js → chunk-NML44AW2.js} +2 -2
  289. package/dist/chunk-NQQKOJDI.js +89 -0
  290. package/dist/chunk-NQQKOJDI.js.map +1 -0
  291. package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
  292. package/dist/{chunk-RA3FNMWF.js → chunk-O4DYOSOL.js} +5 -5
  293. package/dist/{chunk-ZKYYZH6L.js → chunk-OFB6TUDC.js} +4 -4
  294. package/dist/{chunk-DWPOQ3S5.js → chunk-OTMWHZBY.js} +2 -2
  295. package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
  296. package/dist/{chunk-WSMYOLHG.js → chunk-PEKPWK5M.js} +2 -2
  297. package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
  298. package/dist/{chunk-KTRKZRID.js → chunk-PKEKZ2VA.js} +5 -5
  299. package/dist/{chunk-6JKZILLF.js → chunk-PMD7V4N7.js} +3 -3
  300. package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
  301. package/dist/{chunk-ZRJCGBVV.js → chunk-PVR5EELP.js} +2 -2
  302. package/dist/{chunk-JSIDLTTG.js → chunk-PZ2V2XIK.js} +2 -2
  303. package/dist/{chunk-TMEQPODK.js → chunk-PZ37VDB5.js} +2 -2
  304. package/dist/{chunk-FLGUVRR7.js → chunk-QBADR2FO.js} +6 -6
  305. package/dist/{chunk-TGVVEGZG.js → chunk-QLIDZGPV.js} +6 -6
  306. package/dist/{chunk-LVONK3YQ.js → chunk-QRKTESVE.js} +2 -2
  307. package/dist/{chunk-HT5WSUC7.js → chunk-QXEDIDBZ.js} +3 -3
  308. package/dist/{chunk-WURSS6MP.js → chunk-R66YMYJU.js} +2 -2
  309. package/dist/{chunk-6PQNLL4E.js → chunk-R7XCJWCD.js} +11 -11
  310. package/dist/{chunk-4R3JCVID.js → chunk-RAMZTZOB.js} +360 -103
  311. package/dist/chunk-RAMZTZOB.js.map +1 -0
  312. package/dist/{chunk-QRVNI5V6.js → chunk-SCNEQFIW.js} +3 -3
  313. package/dist/{chunk-BNUPYHHZ.js → chunk-SD4PPZFB.js} +4 -4
  314. package/dist/{chunk-ROQOVH4N.js → chunk-SFAU5R5S.js} +3 -3
  315. package/dist/{chunk-R63QEVPK.js → chunk-SJORXXLV.js} +6 -6
  316. package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
  317. package/dist/{chunk-JRXHSVD5.js → chunk-SOXZ4LGS.js} +68 -11
  318. package/dist/chunk-SOXZ4LGS.js.map +1 -0
  319. package/dist/{chunk-EF5SYXAY.js → chunk-SQDPHCK2.js} +22 -14
  320. package/dist/chunk-SQDPHCK2.js.map +1 -0
  321. package/dist/{chunk-NDF3SH3X.js → chunk-TDIOBPLA.js} +5 -5
  322. package/dist/{chunk-EHCUFCXM.js → chunk-TEPPPAJI.js} +17 -7
  323. package/dist/chunk-TEPPPAJI.js.map +1 -0
  324. package/dist/{chunk-33TPANCR.js → chunk-TFK4KFKA.js} +4 -4
  325. package/dist/{chunk-6NIB2KGJ.js → chunk-THVIT3PW.js} +22 -22
  326. package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
  327. package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
  328. package/dist/{chunk-7DU35P5J.js → chunk-TN5T5HRZ.js} +7 -7
  329. package/dist/{chunk-JK7C5A4I.js → chunk-TR4HIKJ2.js} +8 -8
  330. package/dist/{chunk-HNYJEAES.js → chunk-UGEWCWVV.js} +3 -3
  331. package/dist/chunk-ULYQEFNH.js +529 -0
  332. package/dist/chunk-ULYQEFNH.js.map +1 -0
  333. package/dist/{chunk-H5EVWF6L.js → chunk-UNNJUJVD.js} +2 -2
  334. package/dist/{chunk-AD22P5X3.js → chunk-UUSAOIJR.js} +3 -3
  335. package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
  336. package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
  337. package/dist/chunk-V3K4RQO7.js.map +1 -0
  338. package/dist/{chunk-UP4BE32Y.js → chunk-VO6RVVP7.js} +5 -5
  339. package/dist/{chunk-S4SC5SSV.js → chunk-VPNXQUUS.js} +11 -11
  340. package/dist/{chunk-7BST7BA6.js → chunk-VW3BBTMA.js} +1 -1
  341. package/dist/{chunk-CBY5CXBD.js → chunk-VWSFA4LJ.js} +2 -2
  342. package/dist/{chunk-MYNUBDU7.js → chunk-VYKW6TB2.js} +1 -1
  343. package/dist/chunk-VYKW6TB2.js.map +1 -0
  344. package/dist/{chunk-QEJTQTF5.js → chunk-W6T5HR3Z.js} +3 -3
  345. package/dist/{chunk-5JEIDFPD.js → chunk-WBPQ7OPC.js} +1 -1
  346. package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
  347. package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
  348. package/dist/{chunk-DLOYMWUQ.js → chunk-WSLPZ43N.js} +7 -7
  349. package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
  350. package/dist/{chunk-LE2EDBXU.js → chunk-WUHB422G.js} +5 -5
  351. package/dist/{chunk-BJW7G6EF.js → chunk-WVX5AQXS.js} +3 -3
  352. package/dist/{chunk-5POTDNQT.js → chunk-WWOHORRO.js} +3 -3
  353. package/dist/{chunk-4W7VISE7.js → chunk-WYDZP5F2.js} +93 -94
  354. package/dist/chunk-WYDZP5F2.js.map +1 -0
  355. package/dist/{chunk-KZHW27BV.js → chunk-WYEPUXGL.js} +2 -2
  356. package/dist/{chunk-GALB2G3W.js → chunk-X2AH4DRF.js} +2 -2
  357. package/dist/{chunk-NCX5SAQY.js → chunk-XN6CALYY.js} +9 -9
  358. package/dist/{chunk-SUVEDKE2.js → chunk-XNACICAB.js} +3 -3
  359. package/dist/{chunk-FDNJVZRE.js → chunk-XU4I47IP.js} +4 -4
  360. package/dist/chunk-XV6ZYRHK.js +59 -0
  361. package/dist/chunk-XV6ZYRHK.js.map +1 -0
  362. package/dist/{chunk-WRLWLGEF.js → chunk-Y5E3XQ2S.js} +25 -2
  363. package/dist/{chunk-WRLWLGEF.js.map → chunk-Y5E3XQ2S.js.map} +1 -1
  364. package/dist/{chunk-U36PO27Q.js → chunk-YG3IJCM2.js} +3 -3
  365. package/dist/{chunk-UWJ5P5CU.js → chunk-YGSJWWT3.js} +3 -3
  366. package/dist/{chunk-APU42QDI.js → chunk-YO64YVYL.js} +105 -101
  367. package/dist/chunk-YO64YVYL.js.map +1 -0
  368. package/dist/{chunk-P5WABK2H.js → chunk-Z4GJB24B.js} +2 -2
  369. package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
  370. package/dist/{chunk-OBQVTCTW.js → chunk-ZX5H7LWD.js} +2 -2
  371. package/dist/components/browser-viewer.d.ts +1 -1
  372. package/dist/composer.js +8 -8
  373. package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-VA5JONUH.js} +6 -6
  374. package/dist/connect.js +7 -7
  375. package/dist/desktop.js +2 -2
  376. package/dist/editor.js +2 -2
  377. package/dist/{embedded-new-voice-LFHWWYD2.js → embedded-new-voice-6BILAOUG.js} +6 -6
  378. package/dist/{embedded-voice-6QS4ANNX.js → embedded-voice-UDE4JRKB.js} +6 -6
  379. package/dist/{fleet-decision-row-QNSTP3VX.js → fleet-decision-row-NN2HXDX3.js} +2 -2
  380. package/dist/hooks/internal.d.ts +38 -0
  381. package/dist/hooks/use-client-config-flags.d.ts +12 -0
  382. package/dist/hooks/use-workspace-sessions.d.ts +10 -1
  383. package/dist/index.js +86 -80
  384. package/dist/interaction.js +8 -6
  385. package/dist/interaction.js.map +1 -1
  386. package/dist/{latest-question-AW3PPDUM.js → latest-question-4WDBECXB.js} +4 -3
  387. package/dist/{latest-question-AW3PPDUM.js.map → latest-question-4WDBECXB.js.map} +1 -1
  388. package/dist/machines.js +4 -4
  389. package/dist/messages/en.d.ts +3 -3
  390. package/dist/messages.js +1 -1
  391. package/dist/{model-policy-picker-menu-CURJ247L.js → model-policy-picker-menu-NRTO6FRP.js} +4 -4
  392. package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
  393. package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-H4XSNHZE.js} +8 -6
  394. package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-H4XSNHZE.js.map} +1 -1
  395. package/dist/realtime.js +5 -5
  396. package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-IEHODU35.js} +9 -9
  397. package/dist/sandbox-files-IEHODU35.js.map +1 -0
  398. package/dist/session-app.js +198 -192
  399. package/dist/session-list-model.d.ts +1 -0
  400. package/dist/session-list-model.js +7 -1
  401. package/dist/{session-realtime-2XIB254N.js → session-realtime-JNKDSGH7.js} +3 -3
  402. package/dist/session-realtime-JNKDSGH7.js.map +1 -0
  403. package/dist/session-realtime.js +2 -2
  404. package/dist/session-ui.js +48 -43
  405. package/dist/session.js +20 -18
  406. package/dist/sites.js +2 -2
  407. package/dist/terminal.js +2 -2
  408. package/dist/this-computer.js +3 -3
  409. package/dist/timeline/invoked-tool.d.ts +5 -0
  410. package/dist/timeline/tool-display-name.d.ts +2 -2
  411. package/dist/timeline/tool-icon.d.ts +14 -0
  412. package/dist/timeline/tool-presentation.d.ts +8 -3
  413. package/dist/{timeline-annotation-markers-X4K2IEOO.js → timeline-annotation-markers-ZSOFW7PG.js} +2 -2
  414. package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-YWV2UC34.js} +2 -2
  415. package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-ZWQVX2HI.js} +3 -3
  416. package/dist/timeline-model.js +16 -14
  417. package/dist/ui/access-list.js +7 -7
  418. package/dist/ui/cadence-picker.js +2 -2
  419. package/dist/ui/list-row.js +3 -3
  420. package/dist/ui/revision-history.js +2 -2
  421. package/dist/ui/role-select.js +3 -3
  422. package/dist/ui/select-menu.js +2 -2
  423. package/dist/usage.js +3 -3
  424. package/dist/workbench.js +4 -4
  425. package/package.json +4 -4
  426. package/src/app/app-state.tsx +3 -1
  427. package/src/app/components/capabilities/session-machine-card.tsx +9 -2
  428. package/src/app/components/rail/session-list.tsx +254 -44
  429. package/src/app/components/rail/session-row-content.tsx +24 -2
  430. package/src/app/components/rail/session-shell.tsx +14 -9
  431. package/src/app/components/rail/site-session-group-heading.tsx +59 -20
  432. package/src/app/components/session/session-tenancy-control.tsx +18 -0
  433. package/src/app/components/session/site-origin-link.test.tsx +73 -0
  434. package/src/app/components/session/site-origin-link.tsx +4 -2
  435. package/src/app/embed/memory-navigation.tsx +1 -0
  436. package/src/app/lib/actions/held-modifier.test.ts +101 -0
  437. package/src/app/lib/actions/held-modifier.ts +108 -0
  438. package/src/app/lib/console-site.tsx +38 -0
  439. package/src/app/lib/navigation.tsx +4 -0
  440. package/src/app/lib/routes.tsx +42 -0
  441. package/src/app/lib/session-failure-toasts.ts +26 -0
  442. package/src/app/lib/session-ui-features.tsx +18 -4
  443. package/src/app/lib/sessions-group.tsx +219 -30
  444. package/src/app/lib/site-opened.tsx +48 -0
  445. package/src/app/lib/site-session-groups.test.ts +173 -6
  446. package/src/app/lib/site-view-routes.test.ts +55 -0
  447. package/src/app/lib/use-session-list-hint-refresh.tsx +44 -4
  448. package/src/app/routes/artifacts.tsx +2 -29
  449. package/src/app/routes/session-transient-failures.test.tsx +343 -0
  450. package/src/app/routes/session-unavailable.tsx +74 -3
  451. package/src/app/routes/session.tsx +4 -13
  452. package/src/app/routes/sessions-index.tsx +13 -9
  453. package/src/app/routes/site-view.test.tsx +476 -0
  454. package/src/app/routes/site-view.tsx +583 -0
  455. package/src/components/browser-viewer.tsx +16 -2
  456. package/src/hooks/internal.ts +129 -6
  457. package/src/hooks/use-client-config-flags.ts +8 -0
  458. package/src/hooks/use-session-events.ts +83 -9
  459. package/src/hooks/use-workspace-sessions.ts +21 -1
  460. package/src/messages/en.ts +3 -3
  461. package/src/session-list-model.ts +4 -0
  462. package/src/timeline/activity-rail.tsx +3 -2
  463. package/src/timeline/invoked-tool.ts +14 -4
  464. package/src/timeline/projection.ts +11 -6
  465. package/src/timeline/rolling-activity.tsx +6 -2
  466. package/src/timeline/tool-display-name.ts +2 -2
  467. package/src/timeline/tool-icon.tsx +165 -0
  468. package/src/timeline/tool-presentation.ts +207 -48
  469. package/src/timeline/tool-renderers.tsx +1 -70
  470. package/styles/compiled.css +38 -0
  471. package/dist/chunk-22ZBT6CN.js +0 -50
  472. package/dist/chunk-22ZBT6CN.js.map +0 -1
  473. package/dist/chunk-4R3JCVID.js.map +0 -1
  474. package/dist/chunk-4W7VISE7.js.map +0 -1
  475. package/dist/chunk-5JZYPZ72.js.map +0 -1
  476. package/dist/chunk-5MZTJMZ3.js.map +0 -1
  477. package/dist/chunk-6W3LF3DB.js.map +0 -1
  478. package/dist/chunk-ADJJQSYC.js.map +0 -1
  479. package/dist/chunk-APU42QDI.js.map +0 -1
  480. package/dist/chunk-BJIZ7PL7.js.map +0 -1
  481. package/dist/chunk-CVG4FILQ.js.map +0 -1
  482. package/dist/chunk-EF5SYXAY.js.map +0 -1
  483. package/dist/chunk-EHCUFCXM.js.map +0 -1
  484. package/dist/chunk-GZ64CASI.js.map +0 -1
  485. package/dist/chunk-JRXHSVD5.js.map +0 -1
  486. package/dist/chunk-KF3MF6FP.js.map +0 -1
  487. package/dist/chunk-MYNUBDU7.js.map +0 -1
  488. package/dist/chunk-NAWXARTY.js.map +0 -1
  489. package/dist/chunk-PM3OSANE.js.map +0 -1
  490. package/dist/chunk-Q35DT6I6.js.map +0 -1
  491. package/dist/chunk-R25ZKOZR.js +0 -24
  492. package/dist/chunk-R25ZKOZR.js.map +0 -1
  493. package/dist/chunk-RGPYMHKI.js.map +0 -1
  494. package/dist/chunk-RGW24ZZM.js.map +0 -1
  495. package/dist/chunk-TQGJN5UZ.js.map +0 -1
  496. package/dist/chunk-X7L4H4VG.js.map +0 -1
  497. package/dist/chunk-XFNLU7EW.js.map +0 -1
  498. package/dist/chunk-Z5WMLJKI.js.map +0 -1
  499. /package/dist/{browser-viewer-RYYQSRTC.js.map → app/lib/console-site.js.map} +0 -0
  500. /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/site-opened.js.map} +0 -0
  501. /package/dist/{computer-viewer-KEDVLD42.js.map → browser-viewer-VPK3CV2H.js.map} +0 -0
  502. /package/dist/{embedded-new-voice-LFHWWYD2.js.map → chat-interactive-block-AMDSW656.js.map} +0 -0
  503. /package/dist/{chunk-RQDFYQHA.js.map → chunk-25LWDG5D.js.map} +0 -0
  504. /package/dist/{chunk-U3HSFCON.js.map → chunk-2CKVVAGP.js.map} +0 -0
  505. /package/dist/{chunk-F6LBGYS6.js.map → chunk-2DL6NJP5.js.map} +0 -0
  506. /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
  507. /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
  508. /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
  509. /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
  510. /package/dist/{chunk-N3ZP4IDU.js.map → chunk-45WYYFP6.js.map} +0 -0
  511. /package/dist/{chunk-HOJGAJAB.js.map → chunk-4MQLGMV2.js.map} +0 -0
  512. /package/dist/{chunk-L7YURQI2.js.map → chunk-4U4GXWXS.js.map} +0 -0
  513. /package/dist/{chunk-63VGE4OH.js.map → chunk-5HIOVXOX.js.map} +0 -0
  514. /package/dist/{chunk-GFUUFM2O.js.map → chunk-5M23GZA2.js.map} +0 -0
  515. /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
  516. /package/dist/{chunk-I6VUUEXH.js.map → chunk-6AFSZKZA.js.map} +0 -0
  517. /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
  518. /package/dist/{chunk-4EONHNJU.js.map → chunk-6O4VWKSO.js.map} +0 -0
  519. /package/dist/{chunk-BSX2R4CW.js.map → chunk-767WCGAX.js.map} +0 -0
  520. /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
  521. /package/dist/{chunk-OSVHU2WU.js.map → chunk-7IYAHFPE.js.map} +0 -0
  522. /package/dist/{chunk-4EAF3HSD.js.map → chunk-7J7PZB4S.js.map} +0 -0
  523. /package/dist/{chunk-OR37STQZ.js.map → chunk-7R2JQHBX.js.map} +0 -0
  524. /package/dist/{chunk-QM5H4FPT.js.map → chunk-7VN6VC3D.js.map} +0 -0
  525. /package/dist/{chunk-HWDGJFM4.js.map → chunk-A2E3ZF6N.js.map} +0 -0
  526. /package/dist/{chunk-4432A3HQ.js.map → chunk-A6T4FGE7.js.map} +0 -0
  527. /package/dist/{chunk-73SOCVLS.js.map → chunk-AIEXYO2X.js.map} +0 -0
  528. /package/dist/{chunk-U7TC2XJQ.js.map → chunk-AJPW3SV4.js.map} +0 -0
  529. /package/dist/{chunk-46VBQG2D.js.map → chunk-AOUCHCSB.js.map} +0 -0
  530. /package/dist/{chunk-HDHK3SXK.js.map → chunk-AT4K4F6S.js.map} +0 -0
  531. /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
  532. /package/dist/{chunk-HO5Y2OOX.js.map → chunk-BLPXOHG6.js.map} +0 -0
  533. /package/dist/{chunk-DT7BORXG.js.map → chunk-BMJTNPWK.js.map} +0 -0
  534. /package/dist/{chunk-HIHO2QE7.js.map → chunk-BT2MVGHT.js.map} +0 -0
  535. /package/dist/{chunk-AOLE4IRZ.js.map → chunk-C535KSTY.js.map} +0 -0
  536. /package/dist/{chunk-IVOA3DXA.js.map → chunk-CB574ERL.js.map} +0 -0
  537. /package/dist/{chunk-IBTXYLBW.js.map → chunk-CCFWY4GF.js.map} +0 -0
  538. /package/dist/{chunk-ZOC3OP6F.js.map → chunk-CCR33J7L.js.map} +0 -0
  539. /package/dist/{chunk-NYZQ7LO7.js.map → chunk-CDUDKETD.js.map} +0 -0
  540. /package/dist/{chunk-JTN3T4QN.js.map → chunk-D3RK3NGM.js.map} +0 -0
  541. /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
  542. /package/dist/{chunk-XWWXIZFP.js.map → chunk-DFXZYNTX.js.map} +0 -0
  543. /package/dist/{chunk-SQGXMHJO.js.map → chunk-DGLRZMXL.js.map} +0 -0
  544. /package/dist/{chunk-GNEHAPKV.js.map → chunk-DJFTH2DI.js.map} +0 -0
  545. /package/dist/{chunk-KWKGBGAF.js.map → chunk-DKCX643S.js.map} +0 -0
  546. /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
  547. /package/dist/{chunk-GTQ3SNEI.js.map → chunk-E36IC3LU.js.map} +0 -0
  548. /package/dist/{chunk-72J6C2AJ.js.map → chunk-EMCB6XKU.js.map} +0 -0
  549. /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
  550. /package/dist/{chunk-AG7VGUIW.js.map → chunk-ERG355NM.js.map} +0 -0
  551. /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
  552. /package/dist/{chunk-HTT3FB7T.js.map → chunk-F3FN6DO6.js.map} +0 -0
  553. /package/dist/{chunk-ST22GONV.js.map → chunk-FB3B45FP.js.map} +0 -0
  554. /package/dist/{chunk-P5T36BA3.js.map → chunk-FRP64DEK.js.map} +0 -0
  555. /package/dist/{chunk-KBF3SE7G.js.map → chunk-FSP334UU.js.map} +0 -0
  556. /package/dist/{chunk-4VKA5O7T.js.map → chunk-FVL4B552.js.map} +0 -0
  557. /package/dist/{chunk-VP62LPLW.js.map → chunk-G2BX56CN.js.map} +0 -0
  558. /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
  559. /package/dist/{chunk-PN66T6JA.js.map → chunk-GFSOXB2K.js.map} +0 -0
  560. /package/dist/{chunk-S4EZ3JUB.js.map → chunk-GZGQHQI7.js.map} +0 -0
  561. /package/dist/{chunk-BXRIQZAH.js.map → chunk-HNNM2GDN.js.map} +0 -0
  562. /package/dist/{chunk-EU6XSQFM.js.map → chunk-HPB4KSV3.js.map} +0 -0
  563. /package/dist/{chunk-QCD5Y7K5.js.map → chunk-HSQRYJ4P.js.map} +0 -0
  564. /package/dist/{chunk-YXOKAG66.js.map → chunk-HUXDGWAN.js.map} +0 -0
  565. /package/dist/{chunk-VUHPA3XQ.js.map → chunk-I66ZB6KD.js.map} +0 -0
  566. /package/dist/{chunk-7CZTKBTI.js.map → chunk-IC7KNOBB.js.map} +0 -0
  567. /package/dist/{chunk-HGMWMK5K.js.map → chunk-IIO2MR3B.js.map} +0 -0
  568. /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
  569. /package/dist/{chunk-O756O2I7.js.map → chunk-IPPVX5GF.js.map} +0 -0
  570. /package/dist/{chunk-X7ASQHR6.js.map → chunk-IUK5QGP5.js.map} +0 -0
  571. /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
  572. /package/dist/{chunk-DDK4WFJ3.js.map → chunk-JWN7SLTO.js.map} +0 -0
  573. /package/dist/{chunk-Q35YZVDZ.js.map → chunk-KFWVBTUH.js.map} +0 -0
  574. /package/dist/{chunk-JXT5QDJC.js.map → chunk-KNFDWNCH.js.map} +0 -0
  575. /package/dist/{chunk-AZVANYMB.js.map → chunk-KUNFUSZ7.js.map} +0 -0
  576. /package/dist/{chunk-DXZNDKQD.js.map → chunk-LEEJBZ5B.js.map} +0 -0
  577. /package/dist/{chunk-RSNYGEVZ.js.map → chunk-LKJ2C7PH.js.map} +0 -0
  578. /package/dist/{chunk-RIMKJBCD.js.map → chunk-LMPTC4CX.js.map} +0 -0
  579. /package/dist/{chunk-3KVWXKD6.js.map → chunk-LQ47YL6E.js.map} +0 -0
  580. /package/dist/{chunk-GAIM5RNE.js.map → chunk-MJQBC7C5.js.map} +0 -0
  581. /package/dist/{chunk-NWZW2WHN.js.map → chunk-MM7OKOTE.js.map} +0 -0
  582. /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
  583. /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
  584. /package/dist/{chunk-XOFUXMPP.js.map → chunk-ND2WCWXI.js.map} +0 -0
  585. /package/dist/{chunk-6L7U46Y2.js.map → chunk-NKNVIO66.js.map} +0 -0
  586. /package/dist/{chunk-JKUICTLM.js.map → chunk-NLAFNMPK.js.map} +0 -0
  587. /package/dist/{chunk-OO2T63BY.js.map → chunk-NML44AW2.js.map} +0 -0
  588. /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
  589. /package/dist/{chunk-RA3FNMWF.js.map → chunk-O4DYOSOL.js.map} +0 -0
  590. /package/dist/{chunk-ZKYYZH6L.js.map → chunk-OFB6TUDC.js.map} +0 -0
  591. /package/dist/{chunk-DWPOQ3S5.js.map → chunk-OTMWHZBY.js.map} +0 -0
  592. /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
  593. /package/dist/{chunk-WSMYOLHG.js.map → chunk-PEKPWK5M.js.map} +0 -0
  594. /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
  595. /package/dist/{chunk-KTRKZRID.js.map → chunk-PKEKZ2VA.js.map} +0 -0
  596. /package/dist/{chunk-6JKZILLF.js.map → chunk-PMD7V4N7.js.map} +0 -0
  597. /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
  598. /package/dist/{chunk-ZRJCGBVV.js.map → chunk-PVR5EELP.js.map} +0 -0
  599. /package/dist/{chunk-JSIDLTTG.js.map → chunk-PZ2V2XIK.js.map} +0 -0
  600. /package/dist/{chunk-TMEQPODK.js.map → chunk-PZ37VDB5.js.map} +0 -0
  601. /package/dist/{chunk-FLGUVRR7.js.map → chunk-QBADR2FO.js.map} +0 -0
  602. /package/dist/{chunk-TGVVEGZG.js.map → chunk-QLIDZGPV.js.map} +0 -0
  603. /package/dist/{chunk-LVONK3YQ.js.map → chunk-QRKTESVE.js.map} +0 -0
  604. /package/dist/{chunk-HT5WSUC7.js.map → chunk-QXEDIDBZ.js.map} +0 -0
  605. /package/dist/{chunk-WURSS6MP.js.map → chunk-R66YMYJU.js.map} +0 -0
  606. /package/dist/{chunk-6PQNLL4E.js.map → chunk-R7XCJWCD.js.map} +0 -0
  607. /package/dist/{chunk-QRVNI5V6.js.map → chunk-SCNEQFIW.js.map} +0 -0
  608. /package/dist/{chunk-BNUPYHHZ.js.map → chunk-SD4PPZFB.js.map} +0 -0
  609. /package/dist/{chunk-ROQOVH4N.js.map → chunk-SFAU5R5S.js.map} +0 -0
  610. /package/dist/{chunk-R63QEVPK.js.map → chunk-SJORXXLV.js.map} +0 -0
  611. /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
  612. /package/dist/{chunk-NDF3SH3X.js.map → chunk-TDIOBPLA.js.map} +0 -0
  613. /package/dist/{chunk-33TPANCR.js.map → chunk-TFK4KFKA.js.map} +0 -0
  614. /package/dist/{chunk-6NIB2KGJ.js.map → chunk-THVIT3PW.js.map} +0 -0
  615. /package/dist/{chunk-HPPKLBTJ.js.map → chunk-TJQDL3JH.js.map} +0 -0
  616. /package/dist/{chunk-FD4Q5KFL.js.map → chunk-TLL22FFO.js.map} +0 -0
  617. /package/dist/{chunk-7DU35P5J.js.map → chunk-TN5T5HRZ.js.map} +0 -0
  618. /package/dist/{chunk-JK7C5A4I.js.map → chunk-TR4HIKJ2.js.map} +0 -0
  619. /package/dist/{chunk-HNYJEAES.js.map → chunk-UGEWCWVV.js.map} +0 -0
  620. /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
  621. /package/dist/{chunk-AD22P5X3.js.map → chunk-UUSAOIJR.js.map} +0 -0
  622. /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
  623. /package/dist/{chunk-UP4BE32Y.js.map → chunk-VO6RVVP7.js.map} +0 -0
  624. /package/dist/{chunk-S4SC5SSV.js.map → chunk-VPNXQUUS.js.map} +0 -0
  625. /package/dist/{chunk-7BST7BA6.js.map → chunk-VW3BBTMA.js.map} +0 -0
  626. /package/dist/{chunk-CBY5CXBD.js.map → chunk-VWSFA4LJ.js.map} +0 -0
  627. /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
  628. /package/dist/{chunk-5JEIDFPD.js.map → chunk-WBPQ7OPC.js.map} +0 -0
  629. /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
  630. /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
  631. /package/dist/{chunk-DLOYMWUQ.js.map → chunk-WSLPZ43N.js.map} +0 -0
  632. /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
  633. /package/dist/{chunk-LE2EDBXU.js.map → chunk-WUHB422G.js.map} +0 -0
  634. /package/dist/{chunk-BJW7G6EF.js.map → chunk-WVX5AQXS.js.map} +0 -0
  635. /package/dist/{chunk-5POTDNQT.js.map → chunk-WWOHORRO.js.map} +0 -0
  636. /package/dist/{chunk-KZHW27BV.js.map → chunk-WYEPUXGL.js.map} +0 -0
  637. /package/dist/{chunk-GALB2G3W.js.map → chunk-X2AH4DRF.js.map} +0 -0
  638. /package/dist/{chunk-NCX5SAQY.js.map → chunk-XN6CALYY.js.map} +0 -0
  639. /package/dist/{chunk-SUVEDKE2.js.map → chunk-XNACICAB.js.map} +0 -0
  640. /package/dist/{chunk-FDNJVZRE.js.map → chunk-XU4I47IP.js.map} +0 -0
  641. /package/dist/{chunk-U36PO27Q.js.map → chunk-YG3IJCM2.js.map} +0 -0
  642. /package/dist/{chunk-UWJ5P5CU.js.map → chunk-YGSJWWT3.js.map} +0 -0
  643. /package/dist/{chunk-P5WABK2H.js.map → chunk-Z4GJB24B.js.map} +0 -0
  644. /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
  645. /package/dist/{chunk-OBQVTCTW.js.map → chunk-ZX5H7LWD.js.map} +0 -0
  646. /package/dist/{embedded-voice-6QS4ANNX.js.map → computer-viewer-VA5JONUH.js.map} +0 -0
  647. /package/dist/{model-policy-picker-menu-CURJ247L.js.map → embedded-new-voice-6BILAOUG.js.map} +0 -0
  648. /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-voice-UDE4JRKB.js.map} +0 -0
  649. /package/dist/{fleet-decision-row-QNSTP3VX.js.map → fleet-decision-row-NN2HXDX3.js.map} +0 -0
  650. /package/dist/{session-realtime-2XIB254N.js.map → model-policy-picker-menu-NRTO6FRP.js.map} +0 -0
  651. /package/dist/{platform-activity-row-BMXXNZKX.js.map → platform-activity-row-ENQVIFTL.js.map} +0 -0
  652. /package/dist/{timeline-annotation-markers-X4K2IEOO.js.map → timeline-annotation-markers-ZSOFW7PG.js.map} +0 -0
  653. /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-YWV2UC34.js.map} +0 -0
  654. /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-ZWQVX2HI.js.map} +0 -0
package/dist/usage.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  summarizeUsage,
14
14
  usagePercentLabel,
15
15
  useUsage
16
- } from "./chunk-U7TC2XJQ.js";
16
+ } from "./chunk-AJPW3SV4.js";
17
17
  import {
18
18
  DEFAULT_ALLOWANCE_LABELS,
19
19
  DEFAULT_SESSION_USAGE_LIMIT_LABELS,
@@ -26,11 +26,11 @@ import {
26
26
  summarizeSessionUsageLimit,
27
27
  summarizeSessionUsageLimitRefusal
28
28
  } from "./chunk-4U7SHFQ2.js";
29
- import "./chunk-NAWXARTY.js";
29
+ import "./chunk-2KO2G3RI.js";
30
30
  import "./chunk-CM7LVUKC.js";
31
31
  import "./chunk-TVQCDDSZ.js";
32
32
  import "./chunk-TXS65BB2.js";
33
- import "./chunk-5JZYPZ72.js";
33
+ import "./chunk-JFK7NTEA.js";
34
34
  export {
35
35
  DEFAULT_ALLOWANCE_LABELS,
36
36
  DEFAULT_SESSION_USAGE_LIMIT_LABELS,
package/dist/workbench.js CHANGED
@@ -6,21 +6,21 @@ import {
6
6
  enableCodeEditor
7
7
  } from "./chunk-TOTNIUZK.js";
8
8
  import "./chunk-YSRBFJMQ.js";
9
- import "./chunk-Z6DKXQG7.js";
9
+ import "./chunk-UXXFMF4X.js";
10
10
  import {
11
11
  enableDesktopViewer
12
12
  } from "./chunk-QIOARE4I.js";
13
- import "./chunk-PZ24CYDO.js";
13
+ import "./chunk-PFAUGEV5.js";
14
14
  import "./chunk-ZUWF4NF7.js";
15
15
  import {
16
16
  enableSandboxTerminal
17
17
  } from "./chunk-FPS7ARET.js";
18
- import "./chunk-HTT3FB7T.js";
18
+ import "./chunk-F3FN6DO6.js";
19
19
  import "./chunk-QV3DJVRZ.js";
20
20
  import "./chunk-TNEZNMSN.js";
21
21
  import "./chunk-5I4VRWBB.js";
22
22
  import "./chunk-TXS65BB2.js";
23
- import "./chunk-5JZYPZ72.js";
23
+ import "./chunk-JFK7NTEA.js";
24
24
 
25
25
  // src/workbench.ts
26
26
  function enableWorkbench() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/react",
3
- "version": "4.4.1",
3
+ "version": "4.5.1-canary.39832248373001",
4
4
  "description": "React hooks and styled components for Opengeni: live session streaming, chat composer, message timeline, session status, and fleet views — token-themed (CSS variables), dark-first, built on Tailwind v4 + Radix + Motion.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -251,9 +251,9 @@
251
251
  "@dnd-kit/utilities": "3.2.2",
252
252
  "@fontsource-variable/noto-sans-arabic": "5.2.10",
253
253
  "@fontsource-variable/noto-sans-jp": "5.2.10",
254
- "@opengeni/connect": "4.4.1",
255
- "@opengeni/contracts": "4.4.1",
256
- "@opengeni/sdk": "4.4.1",
254
+ "@opengeni/connect": "4.5.1-canary.39832248373001",
255
+ "@opengeni/contracts": "4.5.1-canary.39832248373001",
256
+ "@opengeni/sdk": "4.5.1-canary.39832248373001",
257
257
  "@tanstack/react-virtual": "^3.14.11",
258
258
  "class-variance-authority": "^0.7.1",
259
259
  "clsx": "^2.1.1",
@@ -15,7 +15,7 @@ import {
15
15
  import { startWorkspaceVoiceCapabilityRefresh } from "./lib/workspace-voice-capability";
16
16
  import { markIntegrationConnectRedirect } from "./lib/integration-connect-redirect";
17
17
  import { userErrorText } from "../ui/api-error";
18
- import { hasWorkspacePermission } from "./lib/permissions";
18
+ import { hasWorkspacePermission, isWorkspacePermissionDenied } from "./lib/permissions";
19
19
  import { creationHandoffReconciled } from "./lib/session-creation-handoff";
20
20
  import { useConsoleSharedQueries } from "./lib/shared-query";
21
21
  import { useNavigate, usePage, useRouterState } from "./lib/navigation";
@@ -1385,6 +1385,8 @@ export function useAppState(host: AppStateHost, appStateOptions: AppStateOptions
1385
1385
  // first-load failure must not look like an empty catalog, or draft
1386
1386
  // hydration would drop GitHub-identity repos and autosave that loss.
1387
1387
  setGithubStatusFailed(true);
1388
+ // Someone without GitHub access in this workspace has nothing to fix.
1389
+ if (isWorkspacePermissionDenied(error)) return;
1388
1390
  toast.error("GitHub status unavailable", {
1389
1391
  description: userErrorText(error),
1390
1392
  });
@@ -29,6 +29,7 @@ import { LogoTile } from "../../../ui/logo-tile";
29
29
  import { Notice } from "../../../ui/notice";
30
30
  import { RowButton } from "../../../ui/page-actions";
31
31
  import { useAppContext } from "../../app-context";
32
+ import { useClientConfigFlags } from "../../../hooks/use-client-config-flags";
32
33
  import { userErrorText } from "../../../ui/api-error";
33
34
  import { isMachineComputeSelectable } from "../../lib/machine-selectability";
34
35
  import { useDesktopThisComputer } from "../desktop/this-computer";
@@ -929,6 +930,12 @@ function ScreenControlStep({
929
930
  }
930
931
 
931
932
  function ChromeStep({ chrome, machineName }: { chrome: ChromeState; machineName: string }) {
933
+ const { client } = useAppContext();
934
+ // The deployment's own extension when it ships one, else Opengeni Browser.
935
+ const extension = useClientConfigFlags(client).browserExtension ?? {
936
+ name: "Opengeni Browser",
937
+ installUrl: OPENGENI_BROWSER_EXTENSION_URL,
938
+ };
932
939
  return (
933
940
  <div data-slot="chrome-extension">
934
941
  <RowList label="Chrome" flush>
@@ -938,7 +945,7 @@ function ChromeStep({ chrome, machineName }: { chrome: ChromeState; machineName:
938
945
  description={
939
946
  chrome.connected
940
947
  ? `${chrome.connected.name} on ${machineName}`
941
- : `Add Opengeni Browser on ${machineName}`
948
+ : `Add ${extension.name} on ${machineName}`
942
949
  }
943
950
  control={
944
951
  chrome.connected ? (
@@ -949,7 +956,7 @@ function ChromeStep({ chrome, machineName }: { chrome: ChromeState; machineName:
949
956
  ) : (
950
957
  <Button asChild size="sm" variant="outline" className="rounded-[10px]">
951
958
  <a
952
- href={OPENGENI_BROWSER_EXTENSION_URL}
959
+ href={extension.installUrl}
953
960
  target="_blank"
954
961
  rel="noreferrer"
955
962
  onClick={chrome.watch}
@@ -5,6 +5,7 @@
5
5
  // active session (from the URL) is highlighted with an accent bar.
6
6
  import { t } from "../../lib/console-text";
7
7
  import { useSessionListHintRefresh } from "../../lib/use-session-list-hint-refresh";
8
+ import { useSiteOpenedListener } from "../../lib/site-opened";
8
9
  import { useOpenGeni } from "../../../session-context";
9
10
  import { useChannels } from "../../../hooks/use-channels";
10
11
  import { useSessionLineage } from "../../../hooks/use-session-lineage";
@@ -15,6 +16,7 @@ import {
15
16
  sessionListGroupRevision,
16
17
  } from "../../lib/session-list-dirty-scopes";
17
18
  import { SiteOriginLink } from "../session/site-origin-link";
19
+ import { sessionSiteOrigin } from "../../lib/session-site-origin";
18
20
  import { SiteSessionGroupHeading } from "./site-session-group-heading";
19
21
  import { SessionBrowseOrderControls } from "./session-browse-order-controls";
20
22
  import {
@@ -43,7 +45,9 @@ import {
43
45
  } from "lucide-react";
44
46
  import { toast } from "../../lib/toast";
45
47
  import {
48
+ createContext,
46
49
  useCallback,
50
+ useContext,
47
51
  useEffect,
48
52
  useId,
49
53
  useLayoutEffect,
@@ -188,9 +192,11 @@ import {
188
192
  projectRailSessions,
189
193
  groupSessionsForRail,
190
194
  mergeSessionForRail,
195
+ parseSiteRowKey,
191
196
  relativeTimeLabel,
192
197
  sessionBrowseResultCount,
193
198
  selectedDescendantNode,
199
+ siteRowConversationCount,
194
200
  sessionCreatorLabelMap,
195
201
  visibleForestRows,
196
202
  visibleTreeRows,
@@ -205,6 +211,7 @@ import {
205
211
  type SessionForest,
206
212
  type SessionRecencyGroup,
207
213
  } from "../../lib/sessions-group";
214
+ import { railRouteSelection } from "../../lib/routes";
208
215
  import {
209
216
  readSessionBrowsePreferences,
210
217
  DEFAULT_SESSION_BROWSE_PREFERENCES,
@@ -241,6 +248,8 @@ import type { Channel, Session as SessionDetails } from "../../types";
241
248
  import type { RailSession as Session } from "../../lib/session-list-entry";
242
249
  import { useUiEventTarget } from "../../lib/ui-events";
243
250
  import { useActionShortcut } from "../../lib/actions/actions-provider";
251
+ import { chordLabel, currentPlatform } from "../../lib/actions/chords";
252
+ import { useHeldModifier } from "../../lib/actions/held-modifier";
244
253
  import { requestCommandMenu } from "../../lib/actions/events";
245
254
  import { rememberChats, setSidebarOrder } from "../../lib/actions/chat-directory";
246
255
  import { useChatOperations } from "../../lib/actions/chat-operations";
@@ -358,10 +367,11 @@ export function SessionList() {
358
367
  const setContextSession = context.setSession;
359
368
  const navigate = useNavigate();
360
369
  const activeSessionId = useRouterState({
361
- select: (state): string | null => {
362
- const match = /\/sessions\/([^/]+)/.exec(state.location.pathname);
363
- return match?.[1] ?? null;
364
- },
370
+ select: (state): string | null => railRouteSelection(state.location).sessionId,
371
+ });
372
+ // The Site view marks its Site row, or the conversation open beside it.
373
+ const activeSiteId = useRouterState({
374
+ select: (state): string | null => railRouteSelection(state.location).siteId,
365
375
  });
366
376
  const [documentForeground, setDocumentForeground] = useState(() =>
367
377
  Boolean(document.visibilityState === "visible" && document.hasFocus()),
@@ -450,6 +460,9 @@ export function SessionList() {
450
460
  mineOnly,
451
461
  search,
452
462
  ...(hierarchyMode ? { parentSessionId: null } : {}),
463
+ // Sites are rows of their own: their conversations nest under them and
464
+ // arrive as complete Site rows. Search and Archived list them as rows.
465
+ siteConversations: hierarchyMode && browseStatus !== "archived" ? "group" : "include",
453
466
  archiveStatus: browseStatus,
454
467
  ...(browseStatus === "archived" ? {} : { sortBy: browseSortBy }),
455
468
  pollIntervalMs: listHintsAvailable ? undefined : 15_000,
@@ -463,6 +476,7 @@ export function SessionList() {
463
476
  projection: "summary",
464
477
  limit: 1,
465
478
  pinsOnly: true,
479
+ siteConversations: "include",
466
480
  includeTotals: !hierarchyMode || browseStatus === "archived",
467
481
  pollIntervalMs: listHintsAvailable ? undefined : 15_000,
468
482
  beginRead: context.sessionChannelProjectionAuthority.beginRead,
@@ -524,10 +538,25 @@ export function SessionList() {
524
538
  },
525
539
  [refresh, refreshGlobalPins, refreshChannels],
526
540
  );
541
+ // Opening a Site moves its row: only the grouped root page carries Site rows.
542
+ const refreshSiteRows = useCallback(() => void refresh(), [refresh]);
543
+ useSiteOpenedListener(
544
+ rail.workspaceId,
545
+ refreshSiteRows,
546
+ hierarchyMode && browseStatus !== "archived",
547
+ );
527
548
  useEffect(() => {
528
549
  if (workspaceSessionListEvent?.workspaceId !== rail.workspaceId) return;
529
- if (workspaceSessionListEvent.available)
530
- void refreshSessionPages(workspaceSessionListEvent.sessionIds);
550
+ if (!workspaceSessionListEvent.available) return;
551
+ const { sessionIds, siteSessionIds = [] } = workspaceSessionListEvent;
552
+ // A Site conversation the rail has not loaded sits in a collapsed Site
553
+ // row, whose summary arrives with the root page this always re-reads.
554
+ // Only loaded ones dirty their own branch; none forces a full reload.
555
+ void refreshSessionPages(
556
+ sessionIds === null
557
+ ? null
558
+ : [...sessionIds, ...siteSessionIds.filter((id) => knownListSessions.current.has(id))],
559
+ );
531
560
  }, [workspaceSessionListEvent, rail.workspaceId, refreshSessionPages]);
532
561
  useEffect(() => {
533
562
  if (workspaceControlEvent) void refreshSessionPages();
@@ -716,7 +745,8 @@ export function SessionList() {
716
745
  branchSummaryKeys.current.clear();
717
746
  activeBranchHydration.current = null;
718
747
  setChildPages(new Map());
719
- }, [rail.workspaceId, hierarchyMode, browseSortBy, browseStatus]);
748
+ // Site rows list root conversations, so the root filters scope them too.
749
+ }, [rail.workspaceId, hierarchyMode, browseSortBy, browseStatus, needsYouOnly, mineOnly]);
720
750
  // Short-lived optimistic projections only. The page returned by the server
721
751
  // remains canonical; after each mutation we replace the projection with that
722
752
  // returned row and refresh once to reconcile tabs/devices/offline recovery.
@@ -1475,9 +1505,22 @@ export function SessionList() {
1475
1505
  const railSections = useMemo(
1476
1506
  () =>
1477
1507
  buildPinnedRailSections(projectedSessions, new Date(), {
1478
- groupSites: hierarchyMode && browseGroupBy === "project",
1508
+ // Sites are stable rows whenever the rail is a hierarchy. Search is
1509
+ // flat: a matching conversation is listed as itself.
1510
+ groupSites: hierarchyMode,
1511
+ siteGroups: rootPage.siteGroups ?? undefined,
1512
+ siteRowsByProject: channelMode,
1513
+ workspaceId: rail.workspaceId,
1514
+ creator: { kind: "subject", subjectId: context.accessContext.subjectId },
1479
1515
  }),
1480
- [projectedSessions, hierarchyMode, browseGroupBy],
1516
+ [
1517
+ projectedSessions,
1518
+ hierarchyMode,
1519
+ rootPage.siteGroups,
1520
+ channelMode,
1521
+ rail.workspaceId,
1522
+ context.accessContext.subjectId,
1523
+ ],
1481
1524
  );
1482
1525
  const forest = useMemo(
1483
1526
  () =>
@@ -1939,8 +1982,15 @@ export function SessionList() {
1939
1982
  for (const node of bucket.sessions) visit(node);
1940
1983
  }
1941
1984
  for (const node of archivedNodes) visit(node);
1985
+ // Site rows are presentation-only; register them by key for disclosure.
1986
+ for (const node of [
1987
+ ...railSections.ordinary.running,
1988
+ ...railSections.ordinary.grouped.flatMap((bucket) => bucket.sessions),
1989
+ ]) {
1990
+ if (node.siteGroup && !result.has(node.session.id)) result.set(node.session.id, node);
1991
+ }
1942
1992
  return result;
1943
- }, [archivedNodes, railSections.complete]);
1993
+ }, [archivedNodes, railSections.complete, railSections.ordinary]);
1944
1994
 
1945
1995
  // Manual state is separate from the small derived active-path expansion.
1946
1996
  // Polls can therefore never reopen a branch the user explicitly collapsed.
@@ -2007,11 +2057,24 @@ export function SessionList() {
2007
2057
  );
2008
2058
  try {
2009
2059
  const readGeneration = context.sessionChannelProjectionAuthority.beginRead();
2060
+ // A Site row's "children" are the Site's own root conversations.
2061
+ const siteRow = parseSiteRowKey(parentSessionId);
2010
2062
  const page = await readLoadedSessionBranchWindow(
2011
2063
  (pageCursor) =>
2012
2064
  context.client.listSessionSummaryPage(rail.workspaceId, {
2013
2065
  limit: 50,
2014
- parentSessionId,
2066
+ ...(siteRow
2067
+ ? {
2068
+ parentSessionId: null,
2069
+ originSiteId: siteRow.siteId,
2070
+ ...(siteRow.channelId !== undefined ? { channelId: siteRow.channelId } : {}),
2071
+ // Its conversations are roots: list exactly the set the
2072
+ // Site row's count was computed over.
2073
+ ...(needsYouOnly ? { needsYouOnly: true } : {}),
2074
+ ...(mineOnly ? { mineOnly: true } : {}),
2075
+ }
2076
+ : // Work spawned by a Site conversation runs inside the Site too.
2077
+ { parentSessionId, siteConversations: "include" as const }),
2015
2078
  ...(pageCursor ? { cursor: pageCursor } : {}),
2016
2079
  archiveStatus: browseStatus,
2017
2080
  sortBy: browseSortBy,
@@ -2051,6 +2114,8 @@ export function SessionList() {
2051
2114
  branchReadRevision,
2052
2115
  browseSortBy,
2053
2116
  browseStatus,
2117
+ needsYouOnly,
2118
+ mineOnly,
2054
2119
  ],
2055
2120
  );
2056
2121
  // The active route supplies exact child + ancestor detail even before the
@@ -2146,6 +2211,46 @@ export function SessionList() {
2146
2211
  });
2147
2212
  }
2148
2213
  }, [allSessions, childPages, context.session, expanded, loadChildPage, branchReadRevision]);
2214
+ // A loaded Site row follows its complete server summary: a new or newly
2215
+ // active conversation reloads an open Site and marks a closed one stale.
2216
+ const siteRowSummaryKeys = useRef(new Map<string, string>());
2217
+ useEffect(() => {
2218
+ const newlyStale = new Set<string>();
2219
+ for (const [key, page] of childPages) {
2220
+ if (!parseSiteRowKey(key)) continue;
2221
+ const summary = nodesById.get(key)?.siteSummary;
2222
+ // Membership and status always matter; activity time only when the
2223
+ // rows are ordered by it.
2224
+ const next = summary
2225
+ ? [
2226
+ summary.conversations,
2227
+ summary.total,
2228
+ summary.attention,
2229
+ summary.failed,
2230
+ summary.active,
2231
+ summary.queued,
2232
+ summary.waiting,
2233
+ summary.unread,
2234
+ browseSortBy === "updatedAt" ? summary.updatedAt : "",
2235
+ ].join(":")
2236
+ : "";
2237
+ const previous = siteRowSummaryKeys.current.get(key);
2238
+ if (page.loading) continue;
2239
+ siteRowSummaryKeys.current.set(key, next);
2240
+ if (previous === undefined || previous === next) continue;
2241
+ if (expanded.has(key)) void loadChildPage(key, undefined, { feedbackVisible: false });
2242
+ else if (!page.stale) newlyStale.add(key);
2243
+ }
2244
+ if (newlyStale.size === 0) return;
2245
+ setChildPages((current) => {
2246
+ const next = new Map(current);
2247
+ for (const key of newlyStale) {
2248
+ const page = next.get(key);
2249
+ if (page) next.set(key, { ...page, stale: true });
2250
+ }
2251
+ return next;
2252
+ });
2253
+ }, [childPages, expanded, loadChildPage, nodesById, browseSortBy]);
2149
2254
  const toggleExpand = useCallback(
2150
2255
  (sessionId: string) => {
2151
2256
  const opening = !expanded.has(sessionId);
@@ -2162,9 +2267,9 @@ export function SessionList() {
2162
2267
  return next;
2163
2268
  });
2164
2269
  const node = nodesById.get(sessionId);
2165
- if (sessionId.startsWith("site:")) return;
2166
- const knownDirectChildren =
2167
- node?.session.treeStats?.directChildren ?? node?.children.length ?? 0;
2270
+ const knownDirectChildren = node?.siteGroup
2271
+ ? siteRowConversationCount(node)
2272
+ : (node?.session.treeStats?.directChildren ?? node?.children.length ?? 0);
2168
2273
  if (
2169
2274
  opening &&
2170
2275
  hierarchyMode &&
@@ -2178,6 +2283,30 @@ export function SessionList() {
2178
2283
  },
2179
2284
  [childPages, expanded, hierarchyMode, loadChildPage, nodesById],
2180
2285
  );
2286
+ // Opening one of a Site's conversations opens its Site row once per visit
2287
+ // to that Site, as a person's own expansion would: it stays open when
2288
+ // another session is selected, and closing it again is respected while
2289
+ // switching between the Site's conversations.
2290
+ const openSiteId =
2291
+ activeSiteId ??
2292
+ (activeSessionId &&
2293
+ context.session?.id === activeSessionId &&
2294
+ context.session.parentSessionId === null
2295
+ ? (sessionSiteOrigin(context.session)?.siteId ?? null)
2296
+ : null);
2297
+ const siteRouteExpansion = useRef<string | null>(null);
2298
+ useEffect(() => {
2299
+ if (!hierarchyMode || !openSiteId) {
2300
+ siteRouteExpansion.current = null;
2301
+ return;
2302
+ }
2303
+ // The Site itself is marked without opening its row.
2304
+ if (!activeSessionId || siteRouteExpansion.current === openSiteId) return;
2305
+ const rows = [...nodesById.values()].filter((node) => node.siteGroup?.siteId === openSiteId);
2306
+ if (rows.length === 0) return;
2307
+ siteRouteExpansion.current = openSiteId;
2308
+ for (const row of rows) if (!expanded.has(row.session.id)) toggleExpand(row.session.id);
2309
+ }, [activeSessionId, expanded, hierarchyMode, nodesById, openSiteId, toggleExpand]);
2181
2310
  const visibleRows = useMemo(() => {
2182
2311
  const seen = new Set<string>();
2183
2312
  // Channel mode replaces the ordinary recency forest with channel sections;
@@ -2247,9 +2376,14 @@ export function SessionList() {
2247
2376
  directorySubject,
2248
2377
  rail.workspaceId,
2249
2378
  flat.map((session) => session.id),
2250
- pinned.map((session) => session.id),
2379
+ pinnedNodes.map((node) => node.session.id),
2251
2380
  );
2252
- }, [directorySubject, rail.workspaceId, flat, pinned]);
2381
+ }, [directorySubject, rail.workspaceId, flat, pinnedNodes]);
2382
+ // ⌘1 to ⌘9 open the pinned chats in the order shown; holding ⌘ shows which.
2383
+ const pinnedJumpNumbers = useMemo(
2384
+ () => new Map(pinnedNodes.slice(0, 9).map((node, index) => [node.session.id, index + 1])),
2385
+ [pinnedNodes],
2386
+ );
2253
2387
 
2254
2388
  useLayoutEffect(() => {
2255
2389
  const pending = pendingSessionFocus.current;
@@ -3475,26 +3609,28 @@ export function SessionList() {
3475
3609
  <>
3476
3610
  {pinnedNodes.length > 0 ? (
3477
3611
  <>
3478
- <SessionGroup
3479
- label="Pinned"
3480
- nodes={pinnedNodes}
3481
- localDeliveryAttention={localDeliveryAttention}
3482
- flat={flat}
3483
- activeSessionId={activeSessionId}
3484
- focusIndex={focusIndex}
3485
- onFocusSession={setFocusedSessionId}
3486
- expanded={expanded}
3487
- onToggleExpand={toggleExpand}
3488
- childPages={childPages}
3489
- onLoadMoreChildren={loadChildPage}
3490
- onRename={context.updateSessionTitle}
3491
- onPin={onPin}
3492
- channels={channels}
3493
- onMoveToChannel={onMoveToChannel}
3494
- onUpdateAttention={onUpdateAttention}
3495
- onArchive={onArchive}
3496
- onRequestDelete={setSessionPendingDelete}
3497
- />
3612
+ <PinnedJumpNumbers.Provider value={pinnedJumpNumbers}>
3613
+ <SessionGroup
3614
+ label="Pinned"
3615
+ nodes={pinnedNodes}
3616
+ localDeliveryAttention={localDeliveryAttention}
3617
+ flat={flat}
3618
+ activeSessionId={activeSessionId}
3619
+ focusIndex={focusIndex}
3620
+ onFocusSession={setFocusedSessionId}
3621
+ expanded={expanded}
3622
+ onToggleExpand={toggleExpand}
3623
+ childPages={childPages}
3624
+ onLoadMoreChildren={loadChildPage}
3625
+ onRename={context.updateSessionTitle}
3626
+ onPin={onPin}
3627
+ channels={channels}
3628
+ onMoveToChannel={onMoveToChannel}
3629
+ onUpdateAttention={onUpdateAttention}
3630
+ onArchive={onArchive}
3631
+ onRequestDelete={setSessionPendingDelete}
3632
+ />
3633
+ </PinnedJumpNumbers.Provider>
3498
3634
  {pinnedTruncated ? (
3499
3635
  <p className="px-2 pb-2 text-[11px] text-fg-subtle" role="status">
3500
3636
  Showing the 100 most recently pinned sessions. Older pins are omitted.
@@ -3502,6 +3638,19 @@ export function SessionList() {
3502
3638
  ) : null}
3503
3639
  </>
3504
3640
  ) : null}
3641
+ {hierarchyMode && browseStatus !== "archived" && rootPage.siteGroupsTruncated ? (
3642
+ <p className="px-2 pb-2 text-[11px] text-fg-subtle" role="status">
3643
+ Some older Sites aren&apos;t shown. Find them in{" "}
3644
+ <Link
3645
+ to="/workspaces/$workspaceId/artifacts"
3646
+ params={{ workspaceId: rail.workspaceId }}
3647
+ className="underline underline-offset-2 hover:text-fg"
3648
+ >
3649
+ Artifacts
3650
+ </Link>
3651
+ .
3652
+ </p>
3653
+ ) : null}
3505
3654
  {browseStatus === "archived" ? null : channelMode ? (
3506
3655
  renderedChannelSections.map((section) => (
3507
3656
  <SessionGroup
@@ -4209,25 +4358,37 @@ function SessionGroup(props: {
4209
4358
  );
4210
4359
  }
4211
4360
 
4212
- /** A node plus, when expanded, its spawned children rendered one level deeper. */
4361
+ /**
4362
+ * A Site row. Its conversations stay nested under it whichever session is
4363
+ * open: collapsed it shows only the selected one, expanded it lists them all.
4364
+ */
4213
4365
  function SiteSessionGroupRow(props: Parameters<typeof SessionTreeRow>[0]) {
4214
4366
  const { node } = props;
4215
4367
  const origin = node.siteGroup!;
4216
- const key = `site:${origin.siteId}`;
4368
+ const key = node.session.id;
4217
4369
  const expanded = props.expanded.has(key);
4218
- const summary = summarizeRailNodes(node.children, props.localDeliveryAttention);
4370
+ const summary = summarizeRailNodes([node], props.localDeliveryAttention);
4219
4371
  const selected = selectedDescendantNode(node, props.activeSessionId);
4220
4372
  const children = expanded ? node.children : selected ? [selected] : [];
4373
+ const page = props.childPages.get(key);
4374
+ const count = siteRowConversationCount(node);
4375
+ const activeSiteId = useRouterState({
4376
+ select: (state): string | null => railRouteSelection(state.location).siteId,
4377
+ });
4221
4378
  return (
4222
4379
  <div role="listitem" className="min-w-0">
4223
4380
  <SiteSessionGroupHeading
4224
4381
  origin={origin}
4225
4382
  workspaceId={node.session.workspaceId}
4383
+ active={activeSiteId === origin.siteId && props.activeSessionId === null}
4226
4384
  expanded={expanded}
4227
4385
  onToggle={() => props.onToggleExpand(key)}
4228
4386
  summary={summary}
4387
+ count={count}
4388
+ relativeTime={relativeTimeLabel(t, node.session.updatedAt)}
4389
+ depth={props.depth}
4229
4390
  />
4230
- {children.length > 0 && (
4391
+ {children.length > 0 || (expanded && page) ? (
4231
4392
  <div role="list" aria-label={`Conversations from ${origin.title}`}>
4232
4393
  {children.map((child) => (
4233
4394
  <SessionTreeRow
@@ -4235,10 +4396,28 @@ function SiteSessionGroupRow(props: Parameters<typeof SessionTreeRow>[0]) {
4235
4396
  {...props}
4236
4397
  node={child}
4237
4398
  depth={props.depth + 1}
4399
+ nestedInSiteId={origin.siteId}
4238
4400
  />
4239
4401
  ))}
4402
+ {expanded && page?.loading && page.feedbackVisible ? (
4403
+ <TreeLoadRow depth={props.depth + 1} text="Loading conversations…" />
4404
+ ) : null}
4405
+ {expanded && page?.failed && page.feedbackVisible ? (
4406
+ <TreeLoadRow
4407
+ depth={props.depth + 1}
4408
+ text="Retry loading conversations"
4409
+ onClick={() => void props.onLoadMoreChildren(key, page.retryCursor ?? undefined)}
4410
+ />
4411
+ ) : null}
4412
+ {expanded && !page?.loading && !page?.failed && page?.nextCursor ? (
4413
+ <TreeLoadRow
4414
+ depth={props.depth + 1}
4415
+ text="Show more"
4416
+ onClick={() => void props.onLoadMoreChildren(key, page.nextCursor!)}
4417
+ />
4418
+ ) : null}
4240
4419
  </div>
4241
- )}
4420
+ ) : null}
4242
4421
  </div>
4243
4422
  );
4244
4423
  }
@@ -4262,6 +4441,8 @@ function SessionTreeRow(props: {
4262
4441
  onUpdateAttention: UpdateAttentionFn;
4263
4442
  onArchive: ArchiveFn;
4264
4443
  onRequestDelete: RequestDeleteFn;
4444
+ /** Listed under its Site row: opens in that Site's view, which names the Site. */
4445
+ nestedInSiteId?: string | undefined;
4265
4446
  }) {
4266
4447
  const { node } = props;
4267
4448
  if (node.siteGroup) return <SiteSessionGroupRow {...props} />;
@@ -4306,6 +4487,7 @@ function SessionTreeRow(props: {
4306
4487
  onUpdateAttention={props.onUpdateAttention}
4307
4488
  onArchive={props.onArchive}
4308
4489
  onRequestDelete={props.onRequestDelete}
4490
+ nestedInSiteId={props.nestedInSiteId}
4309
4491
  />
4310
4492
  {hasVisibleChildRegion ? (
4311
4493
  <div role="list" aria-label={`Spawned sessions from ${title}`}>
@@ -4411,6 +4593,23 @@ function TreeLoadRow({
4411
4593
  );
4412
4594
  }
4413
4595
 
4596
+ /** The ⌘1 to ⌘9 number of each top-level pinned row; absent outside the Pinned section. */
4597
+ const PinnedJumpNumbers = createContext<ReadonlyMap<string, number> | null>(null);
4598
+
4599
+ /** "⌘3" while ⌘ is held on a pinned row that ⌘3 opens; otherwise nothing. */
4600
+ function usePinnedJumpKey(sessionId: string, depth: number, mobile: boolean): string | undefined {
4601
+ const jumpNumber = useContext(PinnedJumpNumbers)?.get(sessionId);
4602
+ // Only where ⌘1 to ⌘9 work: browsers keep those keys for their own tabs.
4603
+ const pinnedKeys = useActionShortcut("go.pinnedChat");
4604
+ const platform = currentPlatform();
4605
+ const held = useHeldModifier(
4606
+ platform,
4607
+ Boolean(pinnedKeys && jumpNumber && depth === 0 && !mobile),
4608
+ );
4609
+ if (!held || !pinnedKeys || !jumpNumber) return undefined;
4610
+ return chordLabel({ ...pinnedKeys.chord, code: `Digit${jumpNumber}` }, platform);
4611
+ }
4612
+
4414
4613
  function SessionRow(props: {
4415
4614
  session: Session;
4416
4615
  index: number;
@@ -4435,6 +4634,7 @@ function SessionRow(props: {
4435
4634
  onUpdateAttention: UpdateAttentionFn;
4436
4635
  onArchive: ArchiveFn;
4437
4636
  onRequestDelete: RequestDeleteFn;
4637
+ nestedInSiteId?: string | undefined;
4438
4638
  }) {
4439
4639
  const rail = useRail();
4440
4640
  const context = useAppContext();
@@ -4447,6 +4647,7 @@ function SessionRow(props: {
4447
4647
  const hasChildren = props.hasChildren;
4448
4648
  const focusEvents = useUiEventTarget("window");
4449
4649
  const creator = railRowCreator(props.session);
4650
+ const jumpKey = usePinnedJumpKey(props.session.id, props.depth, rail.isMobile);
4450
4651
  // A key press puts the person's attention elsewhere (⌘K right after opening a
4451
4652
  // chat, with the pointer still on its row), so the hover card gives way, as
4452
4653
  // tooltips do.
@@ -4581,7 +4782,7 @@ function SessionRow(props: {
4581
4782
  <ContextMenuTrigger asChild>
4582
4783
  <div className={rowClassName}>
4583
4784
  {lead}
4584
- <SiteOriginLink session={props.session} compact />
4785
+ {props.nestedInSiteId ? null : <SiteOriginLink session={props.session} compact />}
4585
4786
  <HoverCard
4586
4787
  openDelay={100}
4587
4788
  closeDelay={80}
@@ -4590,7 +4791,16 @@ function SessionRow(props: {
4590
4791
  >
4591
4792
  <HoverCardTrigger asChild>
4592
4793
  <Link
4593
- to="/workspaces/$workspaceId/sessions/$sessionId"
4794
+ {...(props.nestedInSiteId
4795
+ ? {
4796
+ to: "/workspaces/$workspaceId/sites/$siteId",
4797
+ params: { workspaceId: rail.workspaceId, siteId: props.nestedInSiteId },
4798
+ search: { conversation: props.session.id },
4799
+ }
4800
+ : {
4801
+ to: "/workspaces/$workspaceId/sessions/$sessionId",
4802
+ params: { workspaceId: rail.workspaceId, sessionId: props.session.id },
4803
+ })}
4594
4804
  draggable={props.session.parentSessionId === null && !props.session.archived}
4595
4805
  onDragStart={(event) => {
4596
4806
  if (props.session.parentSessionId !== null || props.session.archived) {
@@ -4601,7 +4811,6 @@ function SessionRow(props: {
4601
4811
  event.dataTransfer.effectAllowed = "move";
4602
4812
  event.dataTransfer.setData(SESSION_DRAG_TYPE, props.session.id);
4603
4813
  }}
4604
- params={{ workspaceId: rail.workspaceId, sessionId: props.session.id }}
4605
4814
  data-session-index={props.index}
4606
4815
  data-session-focus
4607
4816
  data-session-row={props.session.id}
@@ -4694,6 +4903,7 @@ function SessionRow(props: {
4694
4903
  summary={props.aggregateStatus}
4695
4904
  scheduled={sessionHasUpcomingSchedule(props.session)}
4696
4905
  relativeTime={rail.isMobile ? undefined : relativeTime}
4906
+ jumpKey={jumpKey}
4697
4907
  creator={creator}
4698
4908
  />
4699
4909
  </Link>