@opengeni/react 4.3.3-canary.39786771332001 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (710) hide show
  1. package/dist/app/app-state.js +29 -29
  2. package/dist/app/components/Composer.js +27 -27
  3. package/dist/app/components/agent/agent-capability-picker.js +4 -4
  4. package/dist/app/components/artifacts/artifact-browse-controls.js +2 -2
  5. package/dist/app/components/artifacts/artifact-library.js +19 -19
  6. package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
  7. package/dist/app/components/artifacts/chat-interactive-block.js +16 -16
  8. package/dist/app/components/artifacts/inline-chat-image.js +31 -30
  9. package/dist/app/components/artifacts/retained-file-preview.js +35 -34
  10. package/dist/app/components/artifacts/retained-text-preview.js +5 -5
  11. package/dist/app/components/artifacts/site-audience.js +4 -4
  12. package/dist/app/components/artifacts/site-conversations.js +22 -21
  13. package/dist/app/components/artifacts/site-data.js +19 -19
  14. package/dist/app/components/artifacts/site-publishing.js +41 -41
  15. package/dist/app/components/artifacts/site-settings.js +50 -50
  16. package/dist/app/components/billing-class-mark.js +5 -5
  17. package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
  18. package/dist/app/components/capabilities/capability-logo-source.js +12 -12
  19. package/dist/app/components/capabilities/connector-tool-permissions.js +3 -3
  20. package/dist/app/components/capabilities/native-connect-setup.js +14 -14
  21. package/dist/app/components/capabilities/perform-capability-action.js +1 -1
  22. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +16 -16
  23. package/dist/app/components/capabilities/session-capability-card.js +94 -76
  24. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  25. package/dist/app/components/capabilities/session-chrome-card.css +1023 -0
  26. package/dist/app/components/capabilities/session-chrome-card.css.map +1 -0
  27. package/dist/app/components/capabilities/session-chrome-card.d.ts +18 -0
  28. package/dist/app/components/capabilities/session-chrome-card.js +72 -0
  29. package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -20
  30. package/dist/app/components/capabilities/session-github-card.js +24 -24
  31. package/dist/app/components/capabilities/session-machine-card.d.ts +27 -1
  32. package/dist/app/components/capabilities/session-machine-card.js +40 -36
  33. package/dist/app/components/capabilities/use-capabilities-catalog.js +3 -3
  34. package/dist/app/components/capabilities/use-connection-accounts.js +1 -1
  35. package/dist/app/components/command-menu/chat-status.js +18 -17
  36. package/dist/app/components/command-menu/chat-switcher.js +19 -18
  37. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  38. package/dist/app/components/command-menu/command-menu.js +36 -114
  39. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  40. package/dist/app/components/command-menu/shortcut-sheet.js +17 -17
  41. package/dist/app/components/composer-capabilities-menu-body.js +3 -3
  42. package/dist/app/components/composer-mobile-plus-panel.js +20 -20
  43. package/dist/app/components/composer-mobile-plus.js +1 -1
  44. package/dist/app/components/credit-required-gate.js +1 -1
  45. package/dist/app/components/credit-required-prompt.js +12 -12
  46. package/dist/app/components/credits/coupon-redeem.js +2 -2
  47. package/dist/app/components/credits/credit-refusal-notice.js +2 -2
  48. package/dist/app/components/desktop/app-shots.js +7 -7
  49. package/dist/app/components/desktop/this-computer.js +4 -4
  50. package/dist/app/components/feedback.js +4 -4
  51. package/dist/app/components/follow-up-repository-menu-body.js +5 -5
  52. package/dist/app/components/follow-up-repository-picker.js +1 -1
  53. package/dist/app/components/github-app-connect-launcher.js +2 -2
  54. package/dist/app/components/in-app-help-link.js +2 -2
  55. package/dist/app/components/knowledge/agent-learning-settings.js +3 -3
  56. package/dist/app/components/machines/connect-machine-dialog.js +18 -18
  57. package/dist/app/components/markdown.js +9 -9
  58. package/dist/app/components/message-context-pills.js +2 -2
  59. package/dist/app/components/models/models-ui.js +8 -8
  60. package/dist/app/components/new-session-starters.js +2 -2
  61. package/dist/app/components/pickers.js +9 -9
  62. package/dist/app/components/rail/rail-context.js +2 -2
  63. package/dist/app/components/rail/rail-sections.js +69 -66
  64. package/dist/app/components/rail/session-header.js +49 -48
  65. package/dist/app/components/rail/session-list.js +68 -65
  66. package/dist/app/components/rail/session-row-content.d.ts +6 -2
  67. package/dist/app/components/rail/session-row-content.js +1 -1
  68. package/dist/app/components/rail/session-row-hover-details.js +24 -23
  69. package/dist/app/components/rail/session-shell.js +107 -104
  70. package/dist/app/components/rail/site-session-group-heading.d.ts +7 -1
  71. package/dist/app/components/rail/site-session-group-heading.js +20 -3
  72. package/dist/app/components/repository-picker.js +5 -5
  73. package/dist/app/components/secrets/session-secrets-panel.js +3 -3
  74. package/dist/app/components/session/agent-configuration-panel.js +38 -38
  75. package/dist/app/components/session/artifact-link-boundary.js +2 -2
  76. package/dist/app/components/session/artifact-session-page.js +4 -4
  77. package/dist/app/components/session/banners.js +11 -11
  78. package/dist/app/components/session/codex-account-indicator.js +12 -12
  79. package/dist/app/components/session/editable-artifacts-workspace.js +45 -45
  80. package/dist/app/components/session/failed-session-banner.js +11 -11
  81. package/dist/app/components/session/human-input.js +59 -55
  82. package/dist/app/components/session/inspector.js +91 -87
  83. package/dist/app/components/session/inspector.js.map +1 -1
  84. package/dist/app/components/session/message-actions.js +4 -4
  85. package/dist/app/components/session/message-resource-attachments.js +21 -20
  86. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  87. package/dist/app/components/session/model-account-indicator.js +11 -11
  88. package/dist/app/components/session/model-context-inspector.js +2 -2
  89. package/dist/app/components/session/model-recovery-notice.js +3 -3
  90. package/dist/app/components/session/new-session-settings-menu.js +12 -12
  91. package/dist/app/components/session/sandbox-switcher.js +16 -16
  92. package/dist/app/components/session/sandbox-workspace.js +83 -79
  93. package/dist/app/components/session/search-markdown-highlight.js +10 -10
  94. package/dist/app/components/session/search-results-view.js +11 -11
  95. package/dist/app/components/session/session-admin-access.js +9 -9
  96. package/dist/app/components/session/session-admission-notice.js +6 -6
  97. package/dist/app/components/session/session-machine-access-notice.js +6 -6
  98. package/dist/app/components/session/session-retention.js +4 -4
  99. package/dist/app/components/session/session-search-dialog.js +12 -12
  100. package/dist/app/components/session/session-skill-reviews.js +1 -1
  101. package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
  102. package/dist/app/components/session/session-tenancy-control.js +41 -26
  103. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  104. package/dist/app/components/session/session-usage-limit-section.js +11 -11
  105. package/dist/app/components/session/session-wait-status.js +10 -9
  106. package/dist/app/components/session/session-wait-status.js.map +1 -1
  107. package/dist/app/components/session/site-origin-link.d.ts +1 -0
  108. package/dist/app/components/session/site-origin-link.js +2 -2
  109. package/dist/app/components/session/subagents.js +17 -16
  110. package/dist/app/components/session-connectors-menu-body.js +5 -5
  111. package/dist/app/components/settings/row-select.js +1 -1
  112. package/dist/app/components/transcription-settings.js +2 -2
  113. package/dist/app/components/ui/destructive-confirm.js +6 -6
  114. package/dist/app/components/usage/usage-entry.js +8 -8
  115. package/dist/app/components/workspace-composer-plus.js +22 -22
  116. package/dist/app/embed/memory-navigation.js +2 -2
  117. package/dist/app/embed/session-app.js +275 -269
  118. package/dist/app/lib/actions/actions-provider.js +14 -14
  119. package/dist/app/lib/actions/held-modifier.d.ts +11 -0
  120. package/dist/app/lib/app-surfaces.js +2 -2
  121. package/dist/app/lib/codex-usage-query.js +6 -6
  122. package/dist/app/lib/composer-connectors.js +13 -13
  123. package/dist/app/lib/console-site.d.ts +6 -0
  124. package/dist/app/lib/console-site.js +14 -0
  125. package/dist/app/lib/console-text.js +2 -2
  126. package/dist/app/lib/events.js +18 -17
  127. package/dist/app/lib/failed-session-copy.js +3 -3
  128. package/dist/app/lib/model-access-onboarding.js +3 -3
  129. package/dist/app/lib/move-chat-to-machine.js +3 -3
  130. package/dist/app/lib/navigation.d.ts +5 -0
  131. package/dist/app/lib/navigation.js +1 -1
  132. package/dist/app/lib/routes.d.ts +17 -0
  133. package/dist/app/lib/routes.js +9 -3
  134. package/dist/app/lib/session-branch-cache.js +14 -13
  135. package/dist/app/lib/session-create.js +2 -2
  136. package/dist/app/lib/session-deep-link.js +2 -2
  137. package/dist/app/lib/session-failure-toasts.d.ts +8 -0
  138. package/dist/app/lib/session-group-pagination.js +14 -13
  139. package/dist/app/lib/session-hover-facts.js +15 -14
  140. package/dist/app/lib/session-model.js +3 -3
  141. package/dist/app/lib/session-rail.js +10 -9
  142. package/dist/app/lib/session-rename.js +3 -3
  143. package/dist/app/lib/session-ui-features.d.ts +6 -1
  144. package/dist/app/lib/session-ui-features.js +1 -1
  145. package/dist/app/lib/sessions-group.d.ts +43 -3
  146. package/dist/app/lib/sessions-group.js +22 -15
  147. package/dist/app/lib/shared-query.js +3 -3
  148. package/dist/app/lib/site-opened.d.ts +6 -0
  149. package/dist/app/lib/site-opened.js +10 -0
  150. package/dist/app/lib/turn-failure-analytics.js +5 -5
  151. package/dist/app/lib/use-duplicate-site.js +3 -3
  152. package/dist/app/lib/use-follow-up-repositories.js +4 -4
  153. package/dist/app/lib/use-session-list-hint-refresh.d.ts +20 -2
  154. package/dist/app/lib/use-session-list-hint-refresh.js +5 -1
  155. package/dist/app/lib/use-workspace-machines.js +6 -6
  156. package/dist/app/lib/use-workspace-model-catalog.js +8 -8
  157. package/dist/app/lib/use-workspace-rigs.js +8 -8
  158. package/dist/app/lib/workspace-navigation-preference.js +5 -5
  159. package/dist/app/lib/workspace-scope-context.js +4 -4
  160. package/dist/app/routes/artifacts.js +136 -153
  161. package/dist/app/routes/artifacts.js.map +1 -1
  162. package/dist/app/routes/retained-artifact.js +63 -62
  163. package/dist/app/routes/retained-artifact.js.map +1 -1
  164. package/dist/app/routes/session-unavailable.js +7 -5
  165. package/dist/app/routes/session.js +177 -173
  166. package/dist/app/routes/sessions-index-hydration.js +3 -3
  167. package/dist/app/routes/sessions-index.js +123 -121
  168. package/dist/app/routes/site-view.d.ts +11 -0
  169. package/dist/app/routes/site-view.js +597 -0
  170. package/dist/app/routes/site-view.js.map +1 -0
  171. package/dist/artifacts-document.js +4 -4
  172. package/dist/artifacts-presentation.js +4 -4
  173. package/dist/artifacts-spreadsheet.js +4 -4
  174. package/dist/artifacts.js +39 -39
  175. package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-QMCNV4RI.js} +9 -7
  176. package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-PMIAUXSO.js} +6 -6
  177. package/dist/{chunk-GIZGNFIX.js → chunk-22FFOHPT.js} +11 -11
  178. package/dist/chunk-22GTC4MZ.js +15 -0
  179. package/dist/chunk-22GTC4MZ.js.map +1 -0
  180. package/dist/{chunk-Z5WMLJKI.js → chunk-22JFMNMF.js} +92 -4
  181. package/dist/chunk-22JFMNMF.js.map +1 -0
  182. package/dist/{chunk-UHFWF6ZU.js → chunk-2FPS5H2D.js} +2 -2
  183. package/dist/{chunk-NAWXARTY.js → chunk-2KO2G3RI.js} +72 -6
  184. package/dist/chunk-2KO2G3RI.js.map +1 -0
  185. package/dist/{chunk-5POTDNQT.js → chunk-2NC7NZCE.js} +6 -6
  186. package/dist/{chunk-ZKYYZH6L.js → chunk-2QBYDGWO.js} +9 -9
  187. package/dist/{chunk-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
  188. package/dist/{chunk-LQKKSUCR.js → chunk-35BC2FU2.js} +19 -19
  189. package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
  190. package/dist/{chunk-S4SC5SSV.js → chunk-3GU7AWG7.js} +18 -18
  191. package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
  192. package/dist/{chunk-OQAAI33Y.js → chunk-3RMKPHBL.js} +3 -3
  193. package/dist/{chunk-6JKZILLF.js → chunk-3RQUWFZT.js} +67 -67
  194. package/dist/{chunk-6JKZILLF.js.map → chunk-3RQUWFZT.js.map} +1 -1
  195. package/dist/{chunk-GCGTYXJJ.js → chunk-3STBLX4O.js} +9 -9
  196. package/dist/{chunk-YXIW7H4N.js → chunk-3X5FKDYQ.js} +28 -28
  197. package/dist/{chunk-KTRKZRID.js → chunk-4GLLWX33.js} +11 -11
  198. package/dist/{chunk-ROQOVH4N.js → chunk-4HEXNAFI.js} +20 -20
  199. package/dist/chunk-4HEXNAFI.js.map +1 -0
  200. package/dist/{chunk-SD2K5ZN5.js → chunk-4LPA25NQ.js} +4 -4
  201. package/dist/{chunk-DKCX643S.js → chunk-4RMN4E2Y.js} +13 -13
  202. package/dist/{chunk-E5FCEDMU.js → chunk-4SAGYEVB.js} +2 -2
  203. package/dist/{chunk-HTT3FB7T.js → chunk-4VK2R5QC.js} +3 -3
  204. package/dist/{chunk-CKG2EG62.js → chunk-4XQC7VLT.js} +14 -14
  205. package/dist/{chunk-IVOA3DXA.js → chunk-4YXAQMTD.js} +12 -12
  206. package/dist/{chunk-HOJGAJAB.js → chunk-52WK2GGK.js} +8 -8
  207. package/dist/{chunk-NYZQ7LO7.js → chunk-552UYIQ7.js} +20 -20
  208. package/dist/{chunk-LEXPBQ56.js → chunk-5DSKMG2I.js} +4 -4
  209. package/dist/{chunk-WNG757ID.js → chunk-5FA455GR.js} +4 -4
  210. package/dist/{chunk-MNWQAYY3.js → chunk-5FEN3KYH.js} +11 -11
  211. package/dist/{chunk-OSVHU2WU.js → chunk-5JHRMUAZ.js} +12 -12
  212. package/dist/{chunk-PM3OSANE.js → chunk-5MJHH72T.js} +14 -3
  213. package/dist/chunk-5MJHH72T.js.map +1 -0
  214. package/dist/{chunk-RKB2Z457.js → chunk-5VGJXWQ2.js} +2 -2
  215. package/dist/{chunk-GFUUFM2O.js → chunk-5W6ZDKRR.js} +6 -6
  216. package/dist/{chunk-NDETTZQA.js → chunk-5W7KJ5NQ.js} +37 -37
  217. package/dist/{chunk-Q35YZVDZ.js → chunk-5Y2FPLZE.js} +9 -9
  218. package/dist/{chunk-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
  219. package/dist/chunk-5YFY4SFC.js.map +1 -0
  220. package/dist/{chunk-F3NERYBQ.js → chunk-62VER7O4.js} +6 -6
  221. package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
  222. package/dist/{chunk-WUHB422G.js → chunk-73WI7FL2.js} +18 -18
  223. package/dist/chunk-756MKA2J.js +45 -0
  224. package/dist/chunk-756MKA2J.js.map +1 -0
  225. package/dist/{chunk-QECZVL7S.js → chunk-7FJMRJDG.js} +2 -2
  226. package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
  227. package/dist/{chunk-XVM566II.js → chunk-7KIENXRE.js} +2 -2
  228. package/dist/{chunk-CBY5CXBD.js → chunk-7NPCEBZE.js} +5 -5
  229. package/dist/{chunk-46VBQG2D.js → chunk-7P4AQMGA.js} +13 -13
  230. package/dist/{chunk-CKZW7A5S.js → chunk-7TCT7KPQ.js} +742 -644
  231. package/dist/chunk-7TCT7KPQ.js.map +1 -0
  232. package/dist/{chunk-O77Q4NG2.js → chunk-7XO7YKPC.js} +283 -1038
  233. package/dist/chunk-7XO7YKPC.js.map +1 -0
  234. package/dist/{chunk-S7PVL7XH.js → chunk-A4BD4ZVB.js} +4 -4
  235. package/dist/{chunk-VSQHDBHU.js → chunk-ACL2V2KE.js} +68 -35
  236. package/dist/chunk-ACL2V2KE.js.map +1 -0
  237. package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
  238. package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
  239. package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
  240. package/dist/{chunk-P5WABK2H.js → chunk-BCM7C3MJ.js} +9 -9
  241. package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
  242. package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
  243. package/dist/{chunk-3XOISKZC.js → chunk-BXQYAAVE.js} +4 -4
  244. package/dist/{chunk-IBTXYLBW.js → chunk-CCFWY4GF.js} +2 -2
  245. package/dist/{chunk-ZOC3OP6F.js → chunk-CCR33J7L.js} +2 -2
  246. package/dist/{chunk-GTQ3SNEI.js → chunk-CD3MO3IC.js} +2 -2
  247. package/dist/{chunk-WSMYOLHG.js → chunk-CDEXRJB6.js} +5 -5
  248. package/dist/{chunk-3GLAPCVI.js → chunk-CFFNT2OY.js} +8 -8
  249. package/dist/{chunk-FUSFVUIJ.js → chunk-CMLJSF2F.js} +12 -12
  250. package/dist/{chunk-O4DYOSOL.js → chunk-CP7ZQHBW.js} +13 -13
  251. package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
  252. package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
  253. package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
  254. package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
  255. package/dist/{chunk-4EAF3HSD.js → chunk-EJ7WARW7.js} +2 -2
  256. package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
  257. package/dist/{chunk-OOEO4MKY.js → chunk-EPWD4KRA.js} +2 -2
  258. package/dist/{chunk-V5RJAWRP.js → chunk-EQE3MNQN.js} +5 -5
  259. package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
  260. package/dist/{chunk-OO2T63BY.js → chunk-EYS4ZOF5.js} +2 -2
  261. package/dist/{chunk-IC7KNOBB.js → chunk-FDAV72IX.js} +7 -7
  262. package/dist/{chunk-AG7VGUIW.js → chunk-FFNPUSVO.js} +7 -7
  263. package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
  264. package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
  265. package/dist/{chunk-ZHFKMMOT.js → chunk-FTX5CNHA.js} +6 -6
  266. package/dist/{chunk-KYBALSWW.js → chunk-FWOBNL2A.js} +1 -1
  267. package/dist/{chunk-HJ5XWW62.js → chunk-FWYEZ3LE.js} +34 -34
  268. package/dist/{chunk-WSLPZ43N.js → chunk-G4HQUBO4.js} +12 -12
  269. package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
  270. package/dist/chunk-GGV4NSG3.js +792 -0
  271. package/dist/chunk-GGV4NSG3.js.map +1 -0
  272. package/dist/{chunk-G3S2F35T.js → chunk-GHHM6WN4.js} +3 -3
  273. package/dist/{chunk-OANSIX34.js → chunk-GRSODLVO.js} +4 -4
  274. package/dist/{chunk-DDIBZA4X.js → chunk-GT7JFQ4E.js} +405 -148
  275. package/dist/chunk-GT7JFQ4E.js.map +1 -0
  276. package/dist/{chunk-EU6XSQFM.js → chunk-GXW2I2M2.js} +2 -2
  277. package/dist/{chunk-4246UYVG.js → chunk-GZS37O3G.js} +1 -1
  278. package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
  279. package/dist/chunk-H5M33DAL.js.map +1 -0
  280. package/dist/{chunk-Y7WMW74G.js → chunk-HQWVDQXW.js} +7 -7
  281. package/dist/{chunk-YTZQV2DD.js → chunk-HU6JTNWF.js} +2 -2
  282. package/dist/{chunk-QRVNI5V6.js → chunk-I6KIQKU6.js} +3 -3
  283. package/dist/{chunk-Q262Y2YX.js → chunk-IBA5FMRE.js} +141 -137
  284. package/dist/chunk-IBA5FMRE.js.map +1 -0
  285. package/dist/{chunk-BNUPYHHZ.js → chunk-IDXTASGN.js} +4 -4
  286. package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
  287. package/dist/chunk-IECRGM6K.js.map +1 -0
  288. package/dist/chunk-IJYL5BZM.js +38 -0
  289. package/dist/chunk-IJYL5BZM.js.map +1 -0
  290. package/dist/{chunk-L6RXRRN3.js → chunk-ILDOW2IQ.js} +3 -3
  291. package/dist/{chunk-VUHPA3XQ.js → chunk-ITX2TB4K.js} +6 -6
  292. package/dist/{chunk-ETCB6SUJ.js → chunk-J22HD2PB.js} +6 -6
  293. package/dist/{chunk-U47YDYLQ.js → chunk-J5MEDX7C.js} +8 -8
  294. package/dist/{chunk-6VQTHC4W.js → chunk-J7FBBLHF.js} +36 -36
  295. package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
  296. package/dist/chunk-JFK7NTEA.js.map +1 -0
  297. package/dist/{chunk-QZRDCFHI.js → chunk-JM4HQPAI.js} +5 -5
  298. package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
  299. package/dist/{chunk-XWWXIZFP.js → chunk-JO6R5EXF.js} +7 -7
  300. package/dist/{chunk-MM7OKOTE.js → chunk-JQCGPTZ6.js} +9 -9
  301. package/dist/chunk-JRSNCSZN.js +37 -0
  302. package/dist/chunk-JRSNCSZN.js.map +1 -0
  303. package/dist/{chunk-KNFDWNCH.js → chunk-JXT5QDJC.js} +5 -5
  304. package/dist/{chunk-OR37STQZ.js → chunk-KEXYBG7Q.js} +3 -3
  305. package/dist/{chunk-AZVANYMB.js → chunk-KUNFUSZ7.js} +2 -2
  306. package/dist/{chunk-DXZNDKQD.js → chunk-LEEJBZ5B.js} +2 -2
  307. package/dist/{chunk-STUCI6QA.js → chunk-LEKBNKLD.js} +1 -1
  308. package/dist/{chunk-STUCI6QA.js.map → chunk-LEKBNKLD.js.map} +1 -1
  309. package/dist/{chunk-C535KSTY.js → chunk-LF5CBAOS.js} +4 -4
  310. package/dist/{chunk-BJIZ7PL7.js → chunk-LHLK7FUA.js} +145 -29
  311. package/dist/chunk-LHLK7FUA.js.map +1 -0
  312. package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
  313. package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
  314. package/dist/{chunk-H5WGWAYX.js → chunk-LT4J7RHI.js} +13 -13
  315. package/dist/{chunk-DSGMYES6.js → chunk-MCTTONOW.js} +28 -28
  316. package/dist/{chunk-IGHELZI7.js → chunk-MIECLOQC.js} +9 -9
  317. package/dist/{chunk-FM4OUCC2.js → chunk-MOKYT3X3.js} +3 -3
  318. package/dist/{chunk-GZ64CASI.js → chunk-MVZYNZXE.js} +5 -4
  319. package/dist/chunk-MVZYNZXE.js.map +1 -0
  320. package/dist/{chunk-RKILMLA7.js → chunk-MXLKI7BI.js} +3 -3
  321. package/dist/{chunk-45WYYFP6.js → chunk-N3ZP4IDU.js} +2 -2
  322. package/dist/{chunk-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
  323. package/dist/{chunk-UWJ5P5CU.js → chunk-NEK4WB5P.js} +3 -3
  324. package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
  325. package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
  326. package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
  327. package/dist/{chunk-D3RK3NGM.js → chunk-PCFK7HKD.js} +17 -17
  328. package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
  329. package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
  330. package/dist/{chunk-HGMWMK5K.js → chunk-PO3BH3KQ.js} +2 -2
  331. package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
  332. package/dist/{chunk-JSIDLTTG.js → chunk-PZ2V2XIK.js} +2 -2
  333. package/dist/{chunk-TMEQPODK.js → chunk-PZ37VDB5.js} +2 -2
  334. package/dist/{chunk-QIYBOFUV.js → chunk-QFMLAT7L.js} +246 -237
  335. package/dist/chunk-QFMLAT7L.js.map +1 -0
  336. package/dist/{chunk-LVONK3YQ.js → chunk-QRKTESVE.js} +2 -2
  337. package/dist/{chunk-HT5WSUC7.js → chunk-QXEDIDBZ.js} +3 -3
  338. package/dist/{chunk-WURSS6MP.js → chunk-R66YMYJU.js} +2 -2
  339. package/dist/{chunk-HDHK3SXK.js → chunk-RFLYID6H.js} +5 -5
  340. package/dist/{chunk-V77JK73U.js → chunk-RIYZFKIM.js} +37 -35
  341. package/dist/chunk-RIYZFKIM.js.map +1 -0
  342. package/dist/{chunk-VMFID36H.js → chunk-RQNZDTKT.js} +19 -19
  343. package/dist/{chunk-EHCUFCXM.js → chunk-RYSRFAHN.js} +32 -22
  344. package/dist/chunk-RYSRFAHN.js.map +1 -0
  345. package/dist/{chunk-I6VUUEXH.js → chunk-S2U4CDAC.js} +150 -150
  346. package/dist/chunk-S2U4CDAC.js.map +1 -0
  347. package/dist/chunk-S37GP7LX.js +204 -0
  348. package/dist/chunk-S37GP7LX.js.map +1 -0
  349. package/dist/{chunk-A2EWJQXX.js → chunk-SM5QX6UK.js} +4 -4
  350. package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
  351. package/dist/{chunk-Q4NM77K7.js → chunk-SSOO4GWN.js} +193 -194
  352. package/dist/chunk-SSOO4GWN.js.map +1 -0
  353. package/dist/{chunk-PFKTGZKE.js → chunk-SY2AAZNB.js} +2 -2
  354. package/dist/{chunk-DFZMKCVP.js → chunk-TIQPKOFW.js} +4 -4
  355. package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
  356. package/dist/chunk-TL7BOFFL.js +89 -0
  357. package/dist/chunk-TL7BOFFL.js.map +1 -0
  358. package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
  359. package/dist/{chunk-QM5H4FPT.js → chunk-TV6BWONY.js} +3 -3
  360. package/dist/{chunk-EDFJBX3V.js → chunk-U6MPB3K6.js} +9 -9
  361. package/dist/{chunk-TZD3U2S5.js → chunk-ULJAOMJA.js} +4 -4
  362. package/dist/chunk-ULYQEFNH.js +529 -0
  363. package/dist/chunk-ULYQEFNH.js.map +1 -0
  364. package/dist/{chunk-H5EVWF6L.js → chunk-UNNJUJVD.js} +2 -2
  365. package/dist/{chunk-324X6T6G.js → chunk-UP7I3W6O.js} +57 -55
  366. package/dist/chunk-UP7I3W6O.js.map +1 -0
  367. package/dist/{chunk-VU2EWALC.js → chunk-UUGR3X5I.js} +19 -12
  368. package/dist/chunk-UUGR3X5I.js.map +1 -0
  369. package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
  370. package/dist/{chunk-OBQVTCTW.js → chunk-UYNCMZX5.js} +4 -4
  371. package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
  372. package/dist/chunk-V3K4RQO7.js.map +1 -0
  373. package/dist/{chunk-KZHW27BV.js → chunk-V4QZ7UBK.js} +2 -2
  374. package/dist/{chunk-NEVRLD77.js → chunk-VH5EGTH2.js} +3 -3
  375. package/dist/{chunk-MYNUBDU7.js → chunk-VYKW6TB2.js} +1 -1
  376. package/dist/chunk-VYKW6TB2.js.map +1 -0
  377. package/dist/{chunk-QEJTQTF5.js → chunk-W6T5HR3Z.js} +3 -3
  378. package/dist/{chunk-H6WWEKEV.js → chunk-WCMG4HYI.js} +10 -10
  379. package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
  380. package/dist/{chunk-VW3BBTMA.js → chunk-WKHUZIOW.js} +1 -1
  381. package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
  382. package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
  383. package/dist/{chunk-Z2DAWUO3.js → chunk-XMNUZUUA.js} +6 -6
  384. package/dist/{chunk-GAIM5RNE.js → chunk-XN7NSPE6.js} +3 -3
  385. package/dist/chunk-XV6ZYRHK.js +59 -0
  386. package/dist/chunk-XV6ZYRHK.js.map +1 -0
  387. package/dist/{chunk-FLGUVRR7.js → chunk-Y5BSA3I7.js} +5 -5
  388. package/dist/{chunk-WRLWLGEF.js → chunk-Y5E3XQ2S.js} +25 -2
  389. package/dist/{chunk-WRLWLGEF.js.map → chunk-Y5E3XQ2S.js.map} +1 -1
  390. package/dist/{chunk-QILLL4JE.js → chunk-YEROLKOA.js} +16 -16
  391. package/dist/{chunk-NDF3SH3X.js → chunk-YJPKDRI2.js} +15 -15
  392. package/dist/{chunk-TQGJN5UZ.js → chunk-YV56F4UP.js} +318 -700
  393. package/dist/chunk-YV56F4UP.js.map +1 -0
  394. package/dist/{chunk-VAIESMPY.js → chunk-YVBHGMKC.js} +4 -4
  395. package/dist/{chunk-AD22P5X3.js → chunk-YXA2EKV3.js} +3 -3
  396. package/dist/{chunk-FDNJVZRE.js → chunk-YYCOSTUU.js} +17 -17
  397. package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
  398. package/dist/{chunk-BJW7G6EF.js → chunk-Z7IGO5EA.js} +3 -3
  399. package/dist/{chunk-N7JKT4ZU.js → chunk-ZEIFJ6PX.js} +7 -7
  400. package/dist/{chunk-Q4OHNGGB.js → chunk-ZS2UQ3DV.js} +68 -11
  401. package/dist/chunk-ZS2UQ3DV.js.map +1 -0
  402. package/dist/{chunk-VRGOOVDB.js → chunk-ZVVT72MT.js} +2 -2
  403. package/dist/components/browser-viewer.d.ts +1 -1
  404. package/dist/composer.js +14 -14
  405. package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-25AJIDYA.js} +9 -9
  406. package/dist/connect.js +11 -11
  407. package/dist/desktop.js +2 -2
  408. package/dist/editor.js +2 -2
  409. package/dist/{embedded-new-voice-5PYRDZ6T.js → embedded-new-voice-RZZEJT6M.js} +8 -8
  410. package/dist/{embedded-voice-PABC5NBD.js → embedded-voice-6OKSSPLW.js} +8 -8
  411. package/dist/{fleet-decision-row-QNSTP3VX.js → fleet-decision-row-NN2HXDX3.js} +2 -2
  412. package/dist/hooks/internal.d.ts +38 -0
  413. package/dist/hooks/use-client-config-flags.d.ts +12 -0
  414. package/dist/hooks/use-workspace-sessions.d.ts +10 -1
  415. package/dist/index.js +233 -227
  416. package/dist/interaction.js +11 -9
  417. package/dist/interaction.js.map +1 -1
  418. package/dist/{latest-question-5LIRVG4G.js → latest-question-2PFWQSSG.js} +4 -3
  419. package/dist/{latest-question-5LIRVG4G.js.map → latest-question-2PFWQSSG.js.map} +1 -1
  420. package/dist/machines.js +5 -5
  421. package/dist/messages/en.d.ts +3 -3
  422. package/dist/messages.js +1 -1
  423. package/dist/{model-policy-picker-menu-CURJ247L.js → model-policy-picker-menu-VVFGGAI6.js} +6 -6
  424. package/dist/model-policy-picker-menu-VVFGGAI6.js.map +1 -0
  425. package/dist/native-previews.js +3 -3
  426. package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
  427. package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-4SHOQPQQ.js} +10 -8
  428. package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-4SHOQPQQ.js.map} +1 -1
  429. package/dist/realtime.js +7 -7
  430. package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-CCOTGXXA.js} +11 -11
  431. package/dist/sandbox-files-CCOTGXXA.js.map +1 -0
  432. package/dist/session-app.js +277 -271
  433. package/dist/session-list-model.d.ts +1 -0
  434. package/dist/session-list-model.js +8 -2
  435. package/dist/{session-realtime-2XIB254N.js → session-realtime-JNKDSGH7.js} +3 -3
  436. package/dist/session-realtime-JNKDSGH7.js.map +1 -0
  437. package/dist/session-realtime.js +2 -2
  438. package/dist/session-ui.js +77 -72
  439. package/dist/session.js +27 -25
  440. package/dist/sites.js +2 -2
  441. package/dist/terminal.js +2 -2
  442. package/dist/this-computer.js +3 -3
  443. package/dist/timeline/invoked-tool.d.ts +5 -0
  444. package/dist/timeline/tool-display-name.d.ts +2 -2
  445. package/dist/timeline/tool-icon.d.ts +14 -0
  446. package/dist/timeline/tool-presentation.d.ts +8 -3
  447. package/dist/timeline/types.d.ts +2 -0
  448. package/dist/{timeline-annotation-markers-X4K2IEOO.js → timeline-annotation-markers-KHNYNY2J.js} +5 -5
  449. package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-AXEDJHBP.js} +7 -7
  450. package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-AV4ZBXRC.js} +9 -9
  451. package/dist/timeline-model.js +28 -26
  452. package/dist/ui/access-list.js +20 -20
  453. package/dist/ui/choice-cards.js +2 -2
  454. package/dist/ui/detail-page.js +2 -2
  455. package/dist/ui/detail-sheet.js +2 -2
  456. package/dist/ui/diff-view.js +2 -2
  457. package/dist/ui/disclosure.js +4 -4
  458. package/dist/ui/flush-form-page.js +3 -3
  459. package/dist/ui/form-dialog.js +2 -2
  460. package/dist/ui/list-row.js +5 -5
  461. package/dist/ui/revision-history.js +11 -11
  462. package/dist/ui/role-select.js +6 -6
  463. package/dist/ui/settings-nav.js +3 -3
  464. package/dist/usage.js +3 -3
  465. package/dist/workbench.js +11 -11
  466. package/package.json +4 -4
  467. package/src/app/app-state.tsx +3 -1
  468. package/src/app/components/capabilities/session-capability-card.tsx +14 -1
  469. package/src/app/components/capabilities/session-chrome-card.dom-fixture.tsx +377 -0
  470. package/src/app/components/capabilities/session-chrome-card.test.tsx +18 -0
  471. package/src/app/components/capabilities/session-chrome-card.tsx +243 -0
  472. package/src/app/components/capabilities/session-machine-card.dom-fixture.tsx +2 -0
  473. package/src/app/components/capabilities/session-machine-card.tsx +74 -16
  474. package/src/app/components/rail/session-list.tsx +254 -44
  475. package/src/app/components/rail/session-row-content.tsx +24 -2
  476. package/src/app/components/rail/session-shell.tsx +14 -9
  477. package/src/app/components/rail/site-session-group-heading.tsx +59 -20
  478. package/src/app/components/session/session-tenancy-control.tsx +18 -0
  479. package/src/app/components/session/site-origin-link.test.tsx +73 -0
  480. package/src/app/components/session/site-origin-link.tsx +4 -2
  481. package/src/app/embed/memory-navigation.tsx +1 -0
  482. package/src/app/lib/actions/held-modifier.test.ts +101 -0
  483. package/src/app/lib/actions/held-modifier.ts +108 -0
  484. package/src/app/lib/console-site.tsx +38 -0
  485. package/src/app/lib/navigation.tsx +4 -0
  486. package/src/app/lib/routes.tsx +42 -0
  487. package/src/app/lib/session-failure-toasts.ts +26 -0
  488. package/src/app/lib/session-ui-features.tsx +18 -4
  489. package/src/app/lib/sessions-group.tsx +219 -30
  490. package/src/app/lib/site-opened.tsx +48 -0
  491. package/src/app/lib/site-session-groups.test.ts +173 -6
  492. package/src/app/lib/site-view-routes.test.ts +55 -0
  493. package/src/app/lib/use-session-list-hint-refresh.tsx +44 -4
  494. package/src/app/routes/artifacts.tsx +2 -29
  495. package/src/app/routes/session-transient-failures.test.tsx +343 -0
  496. package/src/app/routes/session-unavailable.tsx +74 -3
  497. package/src/app/routes/session.tsx +4 -13
  498. package/src/app/routes/sessions-index.tsx +13 -9
  499. package/src/app/routes/site-view.test.tsx +476 -0
  500. package/src/app/routes/site-view.tsx +583 -0
  501. package/src/components/browser-viewer.tsx +16 -2
  502. package/src/hooks/internal.ts +129 -6
  503. package/src/hooks/use-client-config-flags.ts +8 -0
  504. package/src/hooks/use-session-events.ts +83 -9
  505. package/src/hooks/use-workspace-sessions.ts +21 -1
  506. package/src/messages/en.ts +3 -3
  507. package/src/session-list-model.ts +4 -0
  508. package/src/timeline/activity-rail.tsx +3 -2
  509. package/src/timeline/invoked-tool.ts +14 -4
  510. package/src/timeline/projection.ts +15 -8
  511. package/src/timeline/rolling-activity.tsx +6 -2
  512. package/src/timeline/tool-display-name.ts +2 -2
  513. package/src/timeline/tool-icon.tsx +165 -0
  514. package/src/timeline/tool-presentation.ts +207 -48
  515. package/src/timeline/tool-renderers.tsx +1 -70
  516. package/src/timeline/types.ts +2 -0
  517. package/styles/compiled.css +38 -0
  518. package/dist/chunk-22ZBT6CN.js +0 -50
  519. package/dist/chunk-22ZBT6CN.js.map +0 -1
  520. package/dist/chunk-324X6T6G.js.map +0 -1
  521. package/dist/chunk-5JZYPZ72.js.map +0 -1
  522. package/dist/chunk-6W3LF3DB.js.map +0 -1
  523. package/dist/chunk-BJIZ7PL7.js.map +0 -1
  524. package/dist/chunk-CKZW7A5S.js.map +0 -1
  525. package/dist/chunk-DDIBZA4X.js.map +0 -1
  526. package/dist/chunk-EHCUFCXM.js.map +0 -1
  527. package/dist/chunk-GZ64CASI.js.map +0 -1
  528. package/dist/chunk-I6VUUEXH.js.map +0 -1
  529. package/dist/chunk-KF3MF6FP.js.map +0 -1
  530. package/dist/chunk-MYNUBDU7.js.map +0 -1
  531. package/dist/chunk-NAWXARTY.js.map +0 -1
  532. package/dist/chunk-O77Q4NG2.js.map +0 -1
  533. package/dist/chunk-PM3OSANE.js.map +0 -1
  534. package/dist/chunk-Q262Y2YX.js.map +0 -1
  535. package/dist/chunk-Q4NM77K7.js.map +0 -1
  536. package/dist/chunk-Q4OHNGGB.js.map +0 -1
  537. package/dist/chunk-QIYBOFUV.js.map +0 -1
  538. package/dist/chunk-R25ZKOZR.js +0 -24
  539. package/dist/chunk-R25ZKOZR.js.map +0 -1
  540. package/dist/chunk-RGPYMHKI.js.map +0 -1
  541. package/dist/chunk-ROQOVH4N.js.map +0 -1
  542. package/dist/chunk-TQGJN5UZ.js.map +0 -1
  543. package/dist/chunk-V77JK73U.js.map +0 -1
  544. package/dist/chunk-VSQHDBHU.js.map +0 -1
  545. package/dist/chunk-VU2EWALC.js.map +0 -1
  546. package/dist/chunk-XFNLU7EW.js.map +0 -1
  547. package/dist/chunk-Z5WMLJKI.js.map +0 -1
  548. /package/dist/{browser-viewer-RYYQSRTC.js.map → app/components/capabilities/session-chrome-card.js.map} +0 -0
  549. /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/console-site.js.map} +0 -0
  550. /package/dist/{computer-viewer-KEDVLD42.js.map → app/lib/site-opened.js.map} +0 -0
  551. /package/dist/{embedded-new-voice-5PYRDZ6T.js.map → browser-viewer-QMCNV4RI.js.map} +0 -0
  552. /package/dist/{embedded-voice-PABC5NBD.js.map → chat-interactive-block-PMIAUXSO.js.map} +0 -0
  553. /package/dist/{chunk-GIZGNFIX.js.map → chunk-22FFOHPT.js.map} +0 -0
  554. /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
  555. /package/dist/{chunk-5POTDNQT.js.map → chunk-2NC7NZCE.js.map} +0 -0
  556. /package/dist/{chunk-ZKYYZH6L.js.map → chunk-2QBYDGWO.js.map} +0 -0
  557. /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
  558. /package/dist/{chunk-LQKKSUCR.js.map → chunk-35BC2FU2.js.map} +0 -0
  559. /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
  560. /package/dist/{chunk-S4SC5SSV.js.map → chunk-3GU7AWG7.js.map} +0 -0
  561. /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
  562. /package/dist/{chunk-OQAAI33Y.js.map → chunk-3RMKPHBL.js.map} +0 -0
  563. /package/dist/{chunk-GCGTYXJJ.js.map → chunk-3STBLX4O.js.map} +0 -0
  564. /package/dist/{chunk-YXIW7H4N.js.map → chunk-3X5FKDYQ.js.map} +0 -0
  565. /package/dist/{chunk-KTRKZRID.js.map → chunk-4GLLWX33.js.map} +0 -0
  566. /package/dist/{chunk-SD2K5ZN5.js.map → chunk-4LPA25NQ.js.map} +0 -0
  567. /package/dist/{chunk-DKCX643S.js.map → chunk-4RMN4E2Y.js.map} +0 -0
  568. /package/dist/{chunk-E5FCEDMU.js.map → chunk-4SAGYEVB.js.map} +0 -0
  569. /package/dist/{chunk-HTT3FB7T.js.map → chunk-4VK2R5QC.js.map} +0 -0
  570. /package/dist/{chunk-CKG2EG62.js.map → chunk-4XQC7VLT.js.map} +0 -0
  571. /package/dist/{chunk-IVOA3DXA.js.map → chunk-4YXAQMTD.js.map} +0 -0
  572. /package/dist/{chunk-HOJGAJAB.js.map → chunk-52WK2GGK.js.map} +0 -0
  573. /package/dist/{chunk-NYZQ7LO7.js.map → chunk-552UYIQ7.js.map} +0 -0
  574. /package/dist/{chunk-LEXPBQ56.js.map → chunk-5DSKMG2I.js.map} +0 -0
  575. /package/dist/{chunk-WNG757ID.js.map → chunk-5FA455GR.js.map} +0 -0
  576. /package/dist/{chunk-MNWQAYY3.js.map → chunk-5FEN3KYH.js.map} +0 -0
  577. /package/dist/{chunk-OSVHU2WU.js.map → chunk-5JHRMUAZ.js.map} +0 -0
  578. /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
  579. /package/dist/{chunk-GFUUFM2O.js.map → chunk-5W6ZDKRR.js.map} +0 -0
  580. /package/dist/{chunk-NDETTZQA.js.map → chunk-5W7KJ5NQ.js.map} +0 -0
  581. /package/dist/{chunk-Q35YZVDZ.js.map → chunk-5Y2FPLZE.js.map} +0 -0
  582. /package/dist/{chunk-F3NERYBQ.js.map → chunk-62VER7O4.js.map} +0 -0
  583. /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
  584. /package/dist/{chunk-WUHB422G.js.map → chunk-73WI7FL2.js.map} +0 -0
  585. /package/dist/{chunk-QECZVL7S.js.map → chunk-7FJMRJDG.js.map} +0 -0
  586. /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
  587. /package/dist/{chunk-XVM566II.js.map → chunk-7KIENXRE.js.map} +0 -0
  588. /package/dist/{chunk-CBY5CXBD.js.map → chunk-7NPCEBZE.js.map} +0 -0
  589. /package/dist/{chunk-46VBQG2D.js.map → chunk-7P4AQMGA.js.map} +0 -0
  590. /package/dist/{chunk-S7PVL7XH.js.map → chunk-A4BD4ZVB.js.map} +0 -0
  591. /package/dist/{chunk-73SOCVLS.js.map → chunk-AIEXYO2X.js.map} +0 -0
  592. /package/dist/{chunk-U7TC2XJQ.js.map → chunk-AJPW3SV4.js.map} +0 -0
  593. /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
  594. /package/dist/{chunk-P5WABK2H.js.map → chunk-BCM7C3MJ.js.map} +0 -0
  595. /package/dist/{chunk-DT7BORXG.js.map → chunk-BMJTNPWK.js.map} +0 -0
  596. /package/dist/{chunk-HIHO2QE7.js.map → chunk-BT2MVGHT.js.map} +0 -0
  597. /package/dist/{chunk-3XOISKZC.js.map → chunk-BXQYAAVE.js.map} +0 -0
  598. /package/dist/{chunk-IBTXYLBW.js.map → chunk-CCFWY4GF.js.map} +0 -0
  599. /package/dist/{chunk-ZOC3OP6F.js.map → chunk-CCR33J7L.js.map} +0 -0
  600. /package/dist/{chunk-GTQ3SNEI.js.map → chunk-CD3MO3IC.js.map} +0 -0
  601. /package/dist/{chunk-WSMYOLHG.js.map → chunk-CDEXRJB6.js.map} +0 -0
  602. /package/dist/{chunk-3GLAPCVI.js.map → chunk-CFFNT2OY.js.map} +0 -0
  603. /package/dist/{chunk-FUSFVUIJ.js.map → chunk-CMLJSF2F.js.map} +0 -0
  604. /package/dist/{chunk-O4DYOSOL.js.map → chunk-CP7ZQHBW.js.map} +0 -0
  605. /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
  606. /package/dist/{chunk-SQGXMHJO.js.map → chunk-DGLRZMXL.js.map} +0 -0
  607. /package/dist/{chunk-GNEHAPKV.js.map → chunk-DJFTH2DI.js.map} +0 -0
  608. /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
  609. /package/dist/{chunk-4EAF3HSD.js.map → chunk-EJ7WARW7.js.map} +0 -0
  610. /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
  611. /package/dist/{chunk-OOEO4MKY.js.map → chunk-EPWD4KRA.js.map} +0 -0
  612. /package/dist/{chunk-V5RJAWRP.js.map → chunk-EQE3MNQN.js.map} +0 -0
  613. /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
  614. /package/dist/{chunk-OO2T63BY.js.map → chunk-EYS4ZOF5.js.map} +0 -0
  615. /package/dist/{chunk-IC7KNOBB.js.map → chunk-FDAV72IX.js.map} +0 -0
  616. /package/dist/{chunk-AG7VGUIW.js.map → chunk-FFNPUSVO.js.map} +0 -0
  617. /package/dist/{chunk-P5T36BA3.js.map → chunk-FRP64DEK.js.map} +0 -0
  618. /package/dist/{chunk-KBF3SE7G.js.map → chunk-FSP334UU.js.map} +0 -0
  619. /package/dist/{chunk-ZHFKMMOT.js.map → chunk-FTX5CNHA.js.map} +0 -0
  620. /package/dist/{chunk-KYBALSWW.js.map → chunk-FWOBNL2A.js.map} +0 -0
  621. /package/dist/{chunk-HJ5XWW62.js.map → chunk-FWYEZ3LE.js.map} +0 -0
  622. /package/dist/{chunk-WSLPZ43N.js.map → chunk-G4HQUBO4.js.map} +0 -0
  623. /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
  624. /package/dist/{chunk-G3S2F35T.js.map → chunk-GHHM6WN4.js.map} +0 -0
  625. /package/dist/{chunk-OANSIX34.js.map → chunk-GRSODLVO.js.map} +0 -0
  626. /package/dist/{chunk-EU6XSQFM.js.map → chunk-GXW2I2M2.js.map} +0 -0
  627. /package/dist/{chunk-4246UYVG.js.map → chunk-GZS37O3G.js.map} +0 -0
  628. /package/dist/{chunk-Y7WMW74G.js.map → chunk-HQWVDQXW.js.map} +0 -0
  629. /package/dist/{chunk-YTZQV2DD.js.map → chunk-HU6JTNWF.js.map} +0 -0
  630. /package/dist/{chunk-QRVNI5V6.js.map → chunk-I6KIQKU6.js.map} +0 -0
  631. /package/dist/{chunk-BNUPYHHZ.js.map → chunk-IDXTASGN.js.map} +0 -0
  632. /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
  633. /package/dist/{chunk-VUHPA3XQ.js.map → chunk-ITX2TB4K.js.map} +0 -0
  634. /package/dist/{chunk-ETCB6SUJ.js.map → chunk-J22HD2PB.js.map} +0 -0
  635. /package/dist/{chunk-U47YDYLQ.js.map → chunk-J5MEDX7C.js.map} +0 -0
  636. /package/dist/{chunk-6VQTHC4W.js.map → chunk-J7FBBLHF.js.map} +0 -0
  637. /package/dist/{chunk-QZRDCFHI.js.map → chunk-JM4HQPAI.js.map} +0 -0
  638. /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
  639. /package/dist/{chunk-XWWXIZFP.js.map → chunk-JO6R5EXF.js.map} +0 -0
  640. /package/dist/{chunk-MM7OKOTE.js.map → chunk-JQCGPTZ6.js.map} +0 -0
  641. /package/dist/{chunk-KNFDWNCH.js.map → chunk-JXT5QDJC.js.map} +0 -0
  642. /package/dist/{chunk-OR37STQZ.js.map → chunk-KEXYBG7Q.js.map} +0 -0
  643. /package/dist/{chunk-AZVANYMB.js.map → chunk-KUNFUSZ7.js.map} +0 -0
  644. /package/dist/{chunk-DXZNDKQD.js.map → chunk-LEEJBZ5B.js.map} +0 -0
  645. /package/dist/{chunk-C535KSTY.js.map → chunk-LF5CBAOS.js.map} +0 -0
  646. /package/dist/{chunk-RIMKJBCD.js.map → chunk-LMPTC4CX.js.map} +0 -0
  647. /package/dist/{chunk-3KVWXKD6.js.map → chunk-LQ47YL6E.js.map} +0 -0
  648. /package/dist/{chunk-H5WGWAYX.js.map → chunk-LT4J7RHI.js.map} +0 -0
  649. /package/dist/{chunk-DSGMYES6.js.map → chunk-MCTTONOW.js.map} +0 -0
  650. /package/dist/{chunk-IGHELZI7.js.map → chunk-MIECLOQC.js.map} +0 -0
  651. /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
  652. /package/dist/{chunk-RKILMLA7.js.map → chunk-MXLKI7BI.js.map} +0 -0
  653. /package/dist/{chunk-45WYYFP6.js.map → chunk-N3ZP4IDU.js.map} +0 -0
  654. /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
  655. /package/dist/{chunk-UWJ5P5CU.js.map → chunk-NEK4WB5P.js.map} +0 -0
  656. /package/dist/{chunk-6L7U46Y2.js.map → chunk-NKNVIO66.js.map} +0 -0
  657. /package/dist/{chunk-JKUICTLM.js.map → chunk-NLAFNMPK.js.map} +0 -0
  658. /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
  659. /package/dist/{chunk-D3RK3NGM.js.map → chunk-PCFK7HKD.js.map} +0 -0
  660. /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
  661. /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
  662. /package/dist/{chunk-HGMWMK5K.js.map → chunk-PO3BH3KQ.js.map} +0 -0
  663. /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
  664. /package/dist/{chunk-JSIDLTTG.js.map → chunk-PZ2V2XIK.js.map} +0 -0
  665. /package/dist/{chunk-TMEQPODK.js.map → chunk-PZ37VDB5.js.map} +0 -0
  666. /package/dist/{chunk-LVONK3YQ.js.map → chunk-QRKTESVE.js.map} +0 -0
  667. /package/dist/{chunk-HT5WSUC7.js.map → chunk-QXEDIDBZ.js.map} +0 -0
  668. /package/dist/{chunk-WURSS6MP.js.map → chunk-R66YMYJU.js.map} +0 -0
  669. /package/dist/{chunk-HDHK3SXK.js.map → chunk-RFLYID6H.js.map} +0 -0
  670. /package/dist/{chunk-VMFID36H.js.map → chunk-RQNZDTKT.js.map} +0 -0
  671. /package/dist/{chunk-A2EWJQXX.js.map → chunk-SM5QX6UK.js.map} +0 -0
  672. /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
  673. /package/dist/{chunk-PFKTGZKE.js.map → chunk-SY2AAZNB.js.map} +0 -0
  674. /package/dist/{chunk-DFZMKCVP.js.map → chunk-TIQPKOFW.js.map} +0 -0
  675. /package/dist/{chunk-HPPKLBTJ.js.map → chunk-TJQDL3JH.js.map} +0 -0
  676. /package/dist/{chunk-FD4Q5KFL.js.map → chunk-TLL22FFO.js.map} +0 -0
  677. /package/dist/{chunk-QM5H4FPT.js.map → chunk-TV6BWONY.js.map} +0 -0
  678. /package/dist/{chunk-EDFJBX3V.js.map → chunk-U6MPB3K6.js.map} +0 -0
  679. /package/dist/{chunk-TZD3U2S5.js.map → chunk-ULJAOMJA.js.map} +0 -0
  680. /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
  681. /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
  682. /package/dist/{chunk-OBQVTCTW.js.map → chunk-UYNCMZX5.js.map} +0 -0
  683. /package/dist/{chunk-KZHW27BV.js.map → chunk-V4QZ7UBK.js.map} +0 -0
  684. /package/dist/{chunk-NEVRLD77.js.map → chunk-VH5EGTH2.js.map} +0 -0
  685. /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
  686. /package/dist/{chunk-H6WWEKEV.js.map → chunk-WCMG4HYI.js.map} +0 -0
  687. /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
  688. /package/dist/{chunk-VW3BBTMA.js.map → chunk-WKHUZIOW.js.map} +0 -0
  689. /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
  690. /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
  691. /package/dist/{chunk-Z2DAWUO3.js.map → chunk-XMNUZUUA.js.map} +0 -0
  692. /package/dist/{chunk-GAIM5RNE.js.map → chunk-XN7NSPE6.js.map} +0 -0
  693. /package/dist/{chunk-FLGUVRR7.js.map → chunk-Y5BSA3I7.js.map} +0 -0
  694. /package/dist/{chunk-QILLL4JE.js.map → chunk-YEROLKOA.js.map} +0 -0
  695. /package/dist/{chunk-NDF3SH3X.js.map → chunk-YJPKDRI2.js.map} +0 -0
  696. /package/dist/{chunk-VAIESMPY.js.map → chunk-YVBHGMKC.js.map} +0 -0
  697. /package/dist/{chunk-AD22P5X3.js.map → chunk-YXA2EKV3.js.map} +0 -0
  698. /package/dist/{chunk-FDNJVZRE.js.map → chunk-YYCOSTUU.js.map} +0 -0
  699. /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
  700. /package/dist/{chunk-BJW7G6EF.js.map → chunk-Z7IGO5EA.js.map} +0 -0
  701. /package/dist/{chunk-N7JKT4ZU.js.map → chunk-ZEIFJ6PX.js.map} +0 -0
  702. /package/dist/{chunk-VRGOOVDB.js.map → chunk-ZVVT72MT.js.map} +0 -0
  703. /package/dist/{model-policy-picker-menu-CURJ247L.js.map → computer-viewer-25AJIDYA.js.map} +0 -0
  704. /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-new-voice-RZZEJT6M.js.map} +0 -0
  705. /package/dist/{session-realtime-2XIB254N.js.map → embedded-voice-6OKSSPLW.js.map} +0 -0
  706. /package/dist/{fleet-decision-row-QNSTP3VX.js.map → fleet-decision-row-NN2HXDX3.js.map} +0 -0
  707. /package/dist/{platform-activity-row-BMXXNZKX.js.map → platform-activity-row-ENQVIFTL.js.map} +0 -0
  708. /package/dist/{timeline-annotation-markers-X4K2IEOO.js.map → timeline-annotation-markers-KHNYNY2J.js.map} +0 -0
  709. /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-AXEDJHBP.js.map} +0 -0
  710. /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-AV4ZBXRC.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/components/rail/session-row-content.tsx"],"sourcesContent":["import {\n CalendarClockIcon,\n Clock3Icon,\n HourglassIcon,\n Loader2Icon,\n TriangleAlertIcon,\n} from \"lucide-react\";\nimport { Children, isValidElement, useId } from \"react\";\n\nimport { CreatorMonogram } from \"../creator-monogram\";\nimport { type CreatorRef, creatorAnnouncement, creatorInitials } from \"../../lib/creator-initials\";\nimport { formatWaitingSince } from \"../../lib/format\";\nimport { cn } from \"../../lib/utils\";\nimport type { RailAggregateStatus } from \"../../lib/sessions-group\";\n\nexport function ActiveWorkMark({ className }: { className?: string | undefined }) {\n const maskId = `active-work-${useId().replaceAll(\":\", \"\")}`;\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 108 108\"\n className={cn(\"size-2.5 shrink-0 text-session-update\", className)}\n >\n <defs>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"108\" height=\"108\">\n <circle cx=\"54\" cy=\"54\" r=\"48\" fill=\"white\" />\n <g fill=\"none\" stroke=\"black\" strokeWidth=\"21\" strokeLinecap=\"round\">\n <path d=\"M-8 43 C35 40 71 29 116 16\" />\n <path d=\"M-8 86 C35 83 71 72 116 59\" />\n </g>\n </mask>\n </defs>\n <circle cx=\"54\" cy=\"54\" r=\"48\" fill=\"currentColor\" mask={`url(#${maskId})`} />\n <circle cx=\"54\" cy=\"54\" r=\"48\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" />\n </svg>\n );\n}\n\n/** The one descendant-aware status marker shared by rows and section headers. */\nfunction RailAggregateDot({ summary }: { summary: RailAggregateStatus }) {\n if (summary.kind === \"neutral\") return null;\n if (summary.kind === \"active\") {\n return (\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3 shrink-0 animate-spin text-fg-subtle motion-reduce:animate-none\"\n style={{ animationDuration: \"1.333333s\" }}\n />\n );\n }\n if (summary.kind === \"queued\") {\n return <Clock3Icon aria-hidden=\"true\" className=\"size-3 shrink-0 text-fg-subtle\" />;\n }\n if (summary.kind === \"waiting\") {\n // Parked until input or its wake-up time: nothing is executing, so no spinner.\n return <HourglassIcon aria-hidden=\"true\" className=\"size-3 shrink-0 text-fg-subtle\" />;\n }\n if (summary.kind === \"active_work\") {\n return <ActiveWorkMark />;\n }\n if (summary.kind === \"send_failed\") {\n return (\n <TriangleAlertIcon aria-hidden=\"true\" className=\"size-3.5 shrink-0 text-status-failed\" />\n );\n }\n const tone =\n summary.kind === \"needs_attention\"\n ? \"bg-status-waiting\"\n : summary.kind === \"failed\"\n ? \"bg-status-failed\"\n : \"bg-session-update\";\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\"relative inline-flex size-2 shrink-0 rounded-full\", tone)}\n />\n );\n}\n\n/**\n * The row's announced name.\n *\n * `aria-label` replaces name-from-content, so this string is the whole of what\n * a screen reader hears for the row: the creator chip is `aria-hidden`, and\n * even the sr-only state line inside the link is inert for it. Every fact a\n * sighted user reads off the row belongs here, and in exactly one place.\n */\nexport function sessionRowAccessibleName({\n title,\n stateLabel,\n pinned,\n statusLabel,\n spawnedLabel,\n creator,\n}: {\n title: string;\n stateLabel: string;\n pinned: boolean;\n statusLabel: string;\n spawnedLabel?: string | null | undefined;\n creator?: CreatorRef | null | undefined;\n}): string {\n const spokenCreator = creatorAnnouncement(creator ?? null);\n return `Open ${title}. ${stateLabel}${pinned ? \". Pinned\" : \"\"}. ${statusLabel}${\n spawnedLabel ? `. ${spawnedLabel}` : \"\"\n }${spokenCreator ? `. Created by ${spokenCreator}` : \"\"}`;\n}\n\nexport function RailTrailingMetadata({\n summary,\n scheduled = false,\n relativeTime,\n creator,\n quickActionSlots = 0,\n}: {\n summary: RailAggregateStatus;\n scheduled?: boolean | undefined;\n relativeTime?: string | undefined;\n /** Rightmost items replaced in place by the row's desktop quick actions. */\n quickActionSlots?: number | undefined;\n /**\n * Session creator for a top-level row, else null; callers decide which rows\n * are roots. A chip is its own reason to render this block: a mobile root row\n * can have no status marker and no time and still name who started it.\n */\n creator?: CreatorRef | null | undefined;\n}) {\n const hasStatusMarker = summary.kind !== \"neutral\";\n const hasRelativeTime = Boolean(relativeTime);\n const hasMonogram = creator ? creatorInitials(creator) !== null : false;\n // How long the longest-waiting session behind a \"needs you\" marker has been\n // blocked on a human. A collapsed parent with a child parked for ten hours\n // must say so, not hide it behind a dot.\n const waitingFor =\n summary.kind === \"needs_attention\" && summary.attentionSince\n ? formatWaitingSince(summary.attentionSince)\n : \"\";\n if (!scheduled && !hasStatusMarker && !hasRelativeTime && !hasMonogram && !quickActionSlots)\n return null;\n const items = Children.toArray([\n scheduled ? (\n <CalendarClockIcon\n key=\"schedule\"\n aria-label=\"Scheduled task\"\n className=\"size-3.5 shrink-0 text-fg-subtle\"\n />\n ) : null,\n hasMonogram && creator ? (\n <CreatorMonogram key=\"creator\" createdBy={creator} showTitle={false} />\n ) : null,\n waitingFor ? (\n <span\n key=\"waiting\"\n data-session-row-waiting\n title={summary.label}\n className=\"shrink-0 whitespace-nowrap text-2xs tabular-nums text-status-waiting\"\n >\n {waitingFor}\n </span>\n ) : null,\n hasStatusMarker ? (\n <span key=\"status\" className=\"flex size-3 items-center justify-center\" title={summary.label}>\n <RailAggregateDot summary={summary} />\n </span>\n ) : null,\n hasRelativeTime ? (\n <span\n key=\"time\"\n className=\"min-w-9 shrink-0 whitespace-nowrap text-right text-2xs tabular-nums text-fg\"\n >\n {relativeTime}\n </span>\n ) : null,\n ]).filter(isValidElement);\n if (!quickActionSlots) {\n return (\n <span\n data-session-row-metadata\n className=\"inline-flex shrink-0 items-center justify-end gap-1\"\n >\n {items}\n </span>\n );\n }\n // Empty rows still reserve their action footprint. Visibility (never display\n // or padding) swaps the last items, keeping every other box stationary.\n while (items.length < quickActionSlots) items.unshift(<span key={`empty-${items.length}`} />);\n return (\n <span data-session-row-metadata className=\"inline-flex shrink-0 items-center justify-end\">\n {items.map((item, index) => (\n <span\n key={item.key}\n data-session-row-slot\n className={cn(\n \"inline-flex min-w-6 shrink-0 items-center justify-center last:min-w-10\",\n index >= items.length - quickActionSlots &&\n \"pointer-fine:group-hover:invisible pointer-fine:group-focus-within:invisible\",\n )}\n >\n {item}\n </span>\n ))}\n </span>\n );\n}\n\nexport function SessionRowContent({\n title,\n stateLabel,\n depthLabel,\n descendantLabel,\n mobile,\n summary,\n scheduled = false,\n relativeTime,\n creator,\n quickActionSlots = 0,\n}: {\n title: string;\n stateLabel: string;\n depthLabel?: string | null | undefined;\n descendantLabel?: string | null | undefined;\n mobile: boolean;\n summary: RailAggregateStatus;\n scheduled?: boolean | undefined;\n relativeTime?: string | undefined;\n quickActionSlots?: number | undefined;\n /** Session creator for a top-level row, else null. See RailTrailingMetadata. */\n creator?: CreatorRef | null | undefined;\n}) {\n return (\n <>\n {/* Inert for the row's accessible name, which its `aria-label` owns -\n including the creator. Kept as-is so this change regresses nothing. */}\n <span className=\"sr-only\">{stateLabel}. </span>\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span data-session-row-title className=\"block min-w-0 overflow-hidden whitespace-nowrap\">\n {title}\n </span>\n {mobile ? (\n <span\n data-session-row-state\n className=\"mt-0.5 truncate text-2xs font-normal text-fg-muted\"\n >\n {[stateLabel, depthLabel, descendantLabel, relativeTime].filter(Boolean).join(\" · \")}\n </span>\n ) : null}\n </span>\n <RailTrailingMetadata\n quickActionSlots={quickActionSlots}\n summary={summary}\n scheduled={scheduled}\n relativeTime={relativeTime}\n creator={creator}\n />\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/routes/sessions-index.tsx"],"sourcesContent":["import { useAppApi } from \"../lib/app-api\";\nimport { initialWorkspaceMachineCompute } from \"../lib/workspace-default-machine\";\nimport { t } from \"../lib/console-text\";\nimport { ANALYTICS_COLLECTION_ENABLED_EVENT } from \"../lib/analytics-consent\";\nimport { useWorkspaceRigs } from \"../lib/use-workspace-rigs\";\nimport { useRepositoryCatalogRefresh } from \"../lib/use-follow-up-repositories\";\nimport { useGitHubAppConnectLauncher } from \"../components/github-app-connect-launcher\";\nimport { openGitHubInstallationSettings } from \"../lib/github-app-connect\";\nimport { captureAnalyticsEvent } from \"../lib/analytics-observer\";\nimport { useWorkspaceMachines } from \"../lib/use-workspace-machines\";\nimport { useSessionListHintRefresh } from \"../lib/use-session-list-hint-refresh\";\nimport { useOpenGeni } from \"../../session-context\";\nimport {\n addsConnectorOutsideDefaults,\n changedConnectorExclusions,\n defaultConnectorSelection,\n newSessionConnectorCustomizeState,\n} from \"../lib/composer-connectors\";\n// The sessions index: the centered \"Start a session\" composer. The form is\n// organised top-down — (A) message + model/tools/repos pills → (B) WHERE SHOULD\n// THIS RUN? (when machines exist) → (C) rig or machine fields.\n// Goals are set by the agent (or later surfaces), not at create.\n//\n// \"Where should this run?\" is a first-class segmented control with two kinds:\n// Managed Sandbox (ephemeral, platform-owned — clones repos, injects env) vs\n// Connected Machine (a user-owned enrolled machine — its own checkout & git\n// auth, a working folder, no clone, no env injection). The kind gates the band\n// below it; invalid states (\"clone my repo onto a machine\") are unreachable by\n// construction.\n//\n// The Connected Machine path is opt-in when the deployment owns a managed\n// sandbox. On a selfhosted-primary deployment it is the only truthful default:\n// the composer selects an online machine and remains blocked when none exists.\nimport { FILE_ONLY_MESSAGE_TEXT, type ComposerState } from \"../../hooks/use-composer\";\nimport { LightboxProvider } from \"../../timeline\";\nimport { ModelMark } from \"../../components/model-mark\";\nimport { useChannels } from \"../../hooks/use-channels\";\nimport { useWorkspaceSessions } from \"../../hooks/use-workspace-sessions\";\nimport { resolveWorkspaceSessionToolDefaults, stableJson } from \"@opengeni/contracts\";\nimport { MACHINES_COMPOSER_POLL_MS, type MachineView } from \"../../machines\";\nimport {\n NewSessionRealtimeControl,\n prestartSessionRealtime,\n useRealtimeModelSelection,\n} from \"../../realtime\";\nimport {\n OpenGeniApiError,\n type NewSessionSelectionHistory,\n type Rig,\n type SessionRealtimeModel,\n} from \"@opengeni/sdk\";\nimport { Link, type PageHost, useNavigate, usePage } from \"../lib/navigation\";\nimport { ChevronDownIcon, CreditCardIcon, FolderIcon, LockIcon, PlusIcon } from \"lucide-react\";\nimport {\n createElement,\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { toast } from \"../lib/toast\";\n\nimport { BillingClassMark } from \"../components/billing-class-mark\";\nimport { ChannelCreateDialog } from \"../components/rail/channel-create-dialog\";\nimport { ConsoleComposer, useDraftAttachments } from \"../components/Composer\";\nimport { NewSessionStarters } from \"../components/new-session-starters\";\nimport { NewSessionDraftSyncNotice } from \"../components/new-session-draft-sync-notice\";\nimport { WorkspaceComposerPlus as ComposerMobilePlus } from \"../components/workspace-composer-plus\";\nimport {\n RunsOnMenuBody,\n RunsOnNotice,\n UsageLimitMenuBody,\n VisibilityMenuBody,\n hasRunsOnChoices,\n runsOnAttention,\n hasVisibilityChoice,\n runsOnSummary,\n visibilitySummary,\n} from \"../components/session/new-session-settings-menu\";\nimport {\n NO_SESSION_USAGE_LIMIT,\n parseSessionUsageLimitDraft,\n sessionUsageLimitCapability,\n sessionUsageLimitDraftSummary,\n type SessionUsageLimitDraft,\n} from \"../lib/session-usage-limit\";\nimport { ModelPicker, type SessionToolSelection } from \"../components/pickers\";\nimport {\n RepositoryContextMenuBody,\n type RepositoryContextPickerProps,\n} from \"../components/repository-picker\";\nimport { Button } from \"../../ui/button\";\nimport { sessionDisplayTitle } from \"../lib/session-rename\";\nimport {\n DropdownMenu,\n DropdownMenuCheck,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"../../ui/dropdown-menu\";\nimport { Notice } from \"../../ui/notice\";\nimport { CreditRefusalNotice } from \"../components/credits/credit-refusal-notice\";\nimport { coveredModelChoice, creditRefusalGap, freeCreditGap } from \"../lib/free-credit-gap\";\nimport { isPaymentRequiredError } from \"../lib/model-access\";\nimport { isTransientServiceFailure, OPENGENI_UPDATING_NOTICE } from \"../lib/transient-retry\";\nimport { useConnectionAccounts } from \"../components/capabilities/use-connection-accounts\";\nimport { StatusDot } from \"../../ui/status-dot\";\nimport { useAppContext, useLatestCallback } from \"../app-context\";\nimport { useBrowserAccountBridgeBlocker } from \"../lib/browser-account-bridge\";\nimport {\n EMPTY_COMPOSER_LAUNCH,\n composerLaunchSearchKey,\n modelProvidedAfterLaunch,\n type ComposerLaunchSearch,\n} from \"../lib/composer-launch\";\nimport {\n FOCUS_CREATE_COMPOSER_EVENT,\n type CreateComposerFocusIntent,\n} from \"../lib/create-composer-focus\";\nimport type { RepoDraft } from \"../lib/session-tools\";\nimport { composerFallbackModel } from \"../lib/model-access-onboarding\";\nimport { useForgetLastSession } from \"../lib/last-session-memory\";\nimport {\n isMachineComputeSelectable,\n resolveSelectableMachineSandboxId,\n} from \"../lib/machine-selectability\";\nimport {\n effortOptionsForModel,\n findPickerRow,\n modelUsesCredits,\n runnableLatencyModesForModel,\n type PickerModelRow,\n} from \"../lib/model-policy\";\nimport { isPersonalWorkspace } from \"../lib/managed-self-context\";\nimport { attachManualRepository } from \"../lib/manual-repositories\";\nimport { hasAccountPermission, hasWorkspacePermission } from \"../lib/permissions\";\nimport {\n isPersonalAttachmentConflict,\n newSessionFixedResourceCatalogFailed,\n newSessionPersonalResourceAttachment,\n personalResourceSelectionIdentityKey,\n reconcileNewSessionFixedResources,\n recoverNewSessionPersonalResourceAttachment,\n resolvePersonalResourceOwnerScope,\n} from \"../lib/personal-resource-attachments\";\nimport {\n recentSessionModelPresentation,\n recentSessionStatus,\n recentSessionsForHome,\n relativeTimeLabel,\n sessionRepoLabel,\n} from \"../../session-list-model\";\nimport { signupStarterSet } from \"../lib/signup-starter-set\";\nimport {\n useWorkspaceModelCatalog,\n type WorkspaceModelCatalogState,\n} from \"../lib/use-workspace-model-catalog\";\nimport { resolveWorkspaceAgentDefaults } from \"@opengeni/contracts\";\nimport { ComposerCapabilitiesChip } from \"../components/composer-capabilities-chip\";\nimport { useVaults } from \"../../hooks/use-vaults\";\nimport {\n SessionSecretsMenuBody,\n draftSecretsRows,\n sessionSecretsSummary,\n} from \"../components/secrets/session-secrets-panel\";\nimport {\n capabilityAvailability,\n capabilityOn,\n capabilitySummary,\n draftFromRequest,\n requestFromDraft,\n workspaceAgentDefaultsDraft,\n type AgentCapabilityDraft,\n} from \"../lib/agent-capabilities\";\nimport {\n emptySessionDraft,\n fitToolPolicyToAgentCapabilities,\n isSessionDraftComputeReady,\n newSessionCreateVisibility,\n newSessionDraftOptionsFromSessionDraft,\n rememberedMachineFolder,\n sessionDraftFromNewSessionDraftOptions,\n submissionFromSessionDraft,\n type SessionDraft,\n} from \"../lib/session-create\";\nimport {\n clientFirstPartyMcpToolPolicy,\n firstPartySessionToolOptionsFor,\n selectableSessionMcpServerIds,\n unavailableSessionMcpServerIds,\n newSessionDraftToolPolicy,\n rehydrateRepositoryResources,\n repositorySelectionFromResources,\n} from \"../lib/session-tools\";\nimport { useNewSessionDraft, type NewSessionDraftEditable } from \"../lib/use-new-session-draft\";\nimport { userErrorText } from \"../../ui/api-error\";\nimport {\n newSessionCreateSnapshot,\n runNewSessionRouteSubmission,\n type CreatedSessionRouteAuthority,\n} from \"./sessions-index-submission\";\nimport {\n hydratedNewSessionProjectProvenancePresent,\n initialNewSessionProjectLaunchIntent,\n newSessionProjectSelection,\n nextFocusedNewSessionProjectLaunchIntent,\n nextNewSessionProjectLaunchIntent,\n resolveAmbientNewSessionProjectChannelId,\n resolveHydratedNewSessionProjectSelection,\n} from \"./sessions-index-hydration\";\nimport type { Channel, SandboxBackend, Session } from \"../types\";\nimport { useUiEventTarget } from \"../lib/ui-events\";\n\nconst useCommitSynchronousEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nconst EmptyCreditsNotice = lazy(() =>\n import(\"../components/credit-required-prompt\").then((module) => ({\n default: module.EmptyCreditsNotice,\n })),\n);\nconst CreditTopupPrompt = lazy(() =>\n import(\"../components/credit-required-prompt\").then((module) => ({\n default: module.CreditRequiredPrompt,\n })),\n);\n\nexport function SessionsIndexRoute({\n workspaceId,\n launch = EMPTY_COMPOSER_LAUNCH,\n}: {\n workspaceId: string;\n launch?: ComposerLaunchSearch | undefined;\n}) {\n const { accessKeyVersion, accessContext } = useAppContext();\n useForgetLastSession(accessContext.subjectId, workspaceId);\n return (\n <SessionsIndexRouteContent\n key={`${workspaceId}:${accessKeyVersion}`}\n workspaceId={workspaceId}\n launch={launch}\n />\n );\n}\n\nfunction SessionsIndexRouteContent({\n workspaceId,\n launch,\n}: {\n workspaceId: string;\n launch: ComposerLaunchSearch;\n}) {\n const uiEvents = useUiEventTarget(\"window\");\n const context = useAppContext();\n const api = useAppApi();\n const page = usePage();\n const connectionAccounts = useConnectionAccounts(\n context.client,\n {\n id: \"new-session\",\n workspaceId,\n selectedIds: [...context.selectedCapabilityToolIds],\n },\n context.workspaceCapabilityCatalog,\n context.accessContext === null\n ? null\n : hasWorkspacePermission(context.accessContext, workspaceId, \"connections:read\"),\n );\n const repositoryCatalogRefresh = useRepositoryCatalogRefresh(workspaceId, context);\n // Hosted here, outside the repository menu, so the menu closing when the\n // authorization popup opens does not unmount GitHub App setup.\n const githubAppConnect = useGitHubAppConnectLauncher(workspaceId);\n const firstPartyMcpToolPolicy = useMemo(\n () => clientFirstPartyMcpToolPolicy(context.clientConfig),\n [context.clientConfig],\n );\n const workspace = context.workspaces.find((candidate) => candidate.id === workspaceId) ?? null;\n const configuredToolDefaults = useMemo(\n () => resolveWorkspaceSessionToolDefaults(workspace?.settings),\n [workspace?.settings],\n );\n const defaultFirstPartyMcpTools = useMemo(\n () =>\n configuredToolDefaults?.firstPartyMcpTools?.filter((tool) =>\n firstPartyMcpToolPolicy.allowed.includes(tool),\n ) ?? firstPartyMcpToolPolicy.default,\n [configuredToolDefaults, firstPartyMcpToolPolicy],\n );\n const defaultSandboxBackend = context.clientConfig.defaultSandboxBackend;\n const firstPartyToolOptions = useMemo(\n () => firstPartySessionToolOptionsFor(firstPartyMcpToolPolicy.allowed),\n [firstPartyMcpToolPolicy],\n );\n const navigate = useNavigate();\n const modelCatalog = useWorkspaceModelCatalog(workspaceId);\n const channelsQuery = useChannels({ pollIntervalMs: 60_000 });\n const launchChannelId = launch.channelId === \"default\" ? null : launch.channelId;\n const [selectedChannelId, setSelectedChannelId] = useState<string | null>(\n launchChannelId ?? null,\n );\n const selectedChannelIdRef = useRef(selectedChannelId);\n const setSelectedProjectChannelId = useCallback((channelId: string | null) => {\n selectedChannelIdRef.current = channelId;\n setSelectedChannelId(channelId);\n }, []);\n const [selectionHistory, setSelectionHistory] = useState<NewSessionSelectionHistory>({\n projects: [],\n });\n const [projectProvenancePresent, setProjectProvenancePresent] = useState(\n launchChannelId !== undefined,\n );\n const remoteDraftHydratedRef = useRef(false);\n const previousLaunchChannelIdRef = useRef<string | null | undefined>(launchChannelId);\n const launchProjectIntentRef = useRef(initialNewSessionProjectLaunchIntent(launchChannelId));\n const recentChannelId = selectionHistory.projects[0]?.channelId ?? null;\n const [projectDialogOpen, setProjectDialogOpen] = useState(false);\n const [projectNameDraft, setProjectNameDraft] = useState(\"\");\n const { resetSessionView } = context;\n const [message, setMessage] = useState(\"\");\n const [creditTopupOpen, setCreditTopupOpen] = useState(false);\n const [draft, setDraft] = useState<SessionDraft>(() =>\n emptySessionDraft(defaultFirstPartyMcpTools, defaultSandboxBackend),\n );\n const personalWorkspace = isPersonalWorkspace(workspace, context.managedSelfContext);\n const [capabilitiesOpenRequest, setCapabilitiesOpenRequest] = useState<\n { panel: \"capabilities\"; nonce: number } | undefined\n >(undefined);\n // \"+\" > Capabilities: the workspace's defaults, or this chat's own choice.\n const agentAvailability = useMemo(\n () => capabilityAvailability(context.clientConfig.agentConfig),\n [context.clientConfig.agentConfig],\n );\n const workspaceAgentDraft = useMemo(\n () =>\n workspaceAgentDefaultsDraft({\n capabilities: resolveWorkspaceAgentDefaults(workspace?.settings)?.capabilities,\n legacyHumanInputOff: workspace?.settings.agentHumanInputEnabled === false,\n }),\n [workspace?.settings],\n );\n const composerAgentCapabilities = {\n customized: draft.agentCapabilities !== undefined,\n draft:\n draft.agentCapabilities !== undefined\n ? draftFromRequest(draft.agentCapabilities)\n : workspaceAgentDraft,\n availability: agentAvailability,\n onCustomizedChange: (customized: boolean) =>\n setDraft((current) => {\n if (!customized) {\n const { agentCapabilities: _dropped, ...rest } = current;\n return rest;\n }\n return {\n ...current,\n agentCapabilities: requestFromDraft(workspaceAgentDraft, agentAvailability),\n };\n }),\n onChange: (next: AgentCapabilityDraft) =>\n setDraft((current) => ({\n ...current,\n agentCapabilities: requestFromDraft(next, agentAvailability),\n })),\n };\n // \"+\" > Secrets: which vaults this chat may use. Shown only while its agent\n // can use secrets (the workspace default or this chat's own capabilities).\n const draftSecretsOn =\n agentAvailability.isAvailable(\"secrets\") &&\n capabilityOn(composerAgentCapabilities.draft.values, \"secrets\");\n const canListSecrets =\n hasWorkspacePermission(context.accessContext, workspaceId, \"secrets:list\") ||\n hasWorkspacePermission(context.accessContext, workspaceId, \"variable-sets:list\");\n const draftVaults = useVaults({\n client: context.client,\n workspaceId,\n enabled: canListSecrets && draftSecretsOn,\n });\n const draftVaultPolicy = draft.vaultPolicy ?? { mode: \"all\" as const };\n const draftVaultRows = draftVaults.vaults\n ? draftSecretsRows(draftVaults.vaults, draftVaultPolicy)\n : null;\n const attachments = useDraftAttachments(\n workspaceId,\n personalWorkspace || draft.visibility === \"private\" ? \"personal\" : \"workspace\",\n );\n const fixedResourceCatalogEnabled = draft.compute.kind === \"sandbox\";\n const canUseRigs = hasWorkspacePermission(context.accessContext, workspaceId, \"rigs:use\");\n const rigs = useWorkspaceRigs({\n enabled: fixedResourceCatalogEnabled && canUseRigs,\n });\n const [tenancyCapabilities, setTenancyCapabilities] = useState<{\n activated: boolean;\n canCreatePrivate: boolean;\n reason: \"available\" | \"not_activated\" | \"managed_session_required\" | \"unavailable\";\n defaultVisibility?: \"private\" | \"workspace\" | undefined;\n } | null>(null);\n const tenancyCapabilityGeneration = useRef(0);\n // Whether the person picked who can see this new chat. Until they do, it\n // starts with the organization's default.\n const visibilityChosenRef = useRef(false);\n useEffect(() => {\n const generation = ++tenancyCapabilityGeneration.current;\n visibilityChosenRef.current = false;\n setTenancyCapabilities(null);\n void context.client\n .getSessionTenancyCreateCapabilities(workspaceId)\n .then((capabilities) => {\n if (tenancyCapabilityGeneration.current !== generation) return;\n setTenancyCapabilities(capabilities);\n if (!capabilities.canCreatePrivate) {\n setDraft((current) =>\n current.visibility === \"private\" ? { ...current, visibility: \"workspace\" } : current,\n );\n } else if (capabilities.defaultVisibility === \"private\" && !visibilityChosenRef.current) {\n setDraft((current) =>\n current.visibility === \"private\" ? current : { ...current, visibility: \"private\" },\n );\n }\n })\n .catch(() => {\n if (tenancyCapabilityGeneration.current !== generation) return;\n setTenancyCapabilities({\n activated: false,\n canCreatePrivate: false,\n reason: \"unavailable\",\n });\n setDraft((current) =>\n current.visibility === \"private\" ? { ...current, visibility: \"workspace\" } : current,\n );\n });\n }, [context.client, personalWorkspace, workspaceId]);\n const createVisibility = newSessionCreateVisibility(\n personalWorkspace,\n draft.visibility,\n tenancyCapabilities?.canCreatePrivate === true,\n );\n const personalOwnerScope = resolvePersonalResourceOwnerScope({\n authMode: context.clientConfig.auth.mode,\n authSession: context.authSession,\n accessSubjectId: context.accessContext.subjectId,\n managedSelfContext: context.managedSelfContext,\n workspace,\n });\n const personalResourcesAvailable =\n personalOwnerScope !== null && (personalWorkspace || tenancyCapabilities?.activated === true);\n const personalResourceEligibilitySettled =\n personalWorkspace || personalOwnerScope === null || tenancyCapabilities !== null;\n // Sandbox Environments configure the managed sandbox; a deployment without\n // one has nothing for them to apply to.\n const noManagedSandbox = defaultSandboxBackend === \"none\";\n const selectableRigs = noManagedSandbox\n ? []\n : rigs.rigs.filter((rig) => rig.scope !== \"user\" || personalResourcesAvailable);\n const selectedRig = selectableRigs.find((candidate) => candidate.id === draft.rigId);\n const selectableRigIdsKey = selectableRigs.map((rig) => rig.id).join(\"\\u0000\");\n const fixedResourceSelection = reconcileNewSessionFixedResources({\n selectedRigId: draft.rigId,\n selectableRigIds: fixedResourceCatalogEnabled\n ? selectableRigs.map((rig) => rig.id)\n : draft.rigId\n ? [draft.rigId]\n : [],\n rigsSettled:\n !fixedResourceCatalogEnabled ||\n (personalResourceEligibilitySettled && !rigs.loading && rigs.error === null),\n });\n const fixedResourceCatalogError =\n draft.compute.kind === \"sandbox\" &&\n newSessionFixedResourceCatalogFailed({\n selectedRigId: draft.rigId,\n selectionResolved: fixedResourceSelection.selectionResolved,\n rigCatalogFailed: rigs.error !== null,\n });\n useEffect(() => {\n setDraft((current) => {\n if (current.compute.kind !== \"sandbox\") return current;\n const reconciled = reconcileNewSessionFixedResources({\n selectedRigId: current.rigId,\n selectableRigIds: selectableRigIdsKey ? selectableRigIdsKey.split(\"\\u0000\") : [],\n rigsSettled: personalResourceEligibilitySettled && !rigs.loading && rigs.error === null,\n });\n return reconciled.rigId === current.rigId ? current : { ...current, rigId: reconciled.rigId };\n });\n }, [\n draft.rigId,\n personalResourceEligibilitySettled,\n rigs.error,\n rigs.loading,\n selectableRigIdsKey,\n ]);\n const [fleetPollMs, setFleetPollMs] = useState<number | undefined>(undefined);\n const fleet = useWorkspaceMachines({ pollIntervalMs: fleetPollMs });\n const machines = fleet.machines.filter((machine) => machine.kind === \"selfhosted\");\n // \"+\" > Runs on: where the new chat runs and on which environment or folder.\n const runsOnChoices = {\n draft,\n machines,\n rigs: selectableRigs,\n workspaceDefaultRigId: workspace?.defaultRigId ?? null,\n selfhostedPrimary: defaultSandboxBackend === \"selfhosted\",\n noManagedSandbox,\n // A 404 means Connected Machines are off here, not a failure.\n fleetLoadFailed:\n fleet.error != null &&\n !(fleet.error instanceof OpenGeniApiError && fleet.error.status === 404),\n selectedChannelId,\n selectionHistory,\n };\n const fleetEmpty = machines.length === 0;\n const fleetLoadFailed =\n fleet.error != null && !(fleet.error instanceof OpenGeniApiError && fleet.error.status === 404);\n useEffect(() => {\n if (fleet.loading) return;\n setFleetPollMs(!fleetEmpty || fleetLoadFailed ? MACHINES_COMPOSER_POLL_MS : undefined);\n }, [fleet.loading, fleetEmpty, fleetLoadFailed]);\n const selectedMachineSandboxId =\n draft.compute.kind === \"machine\" ? draft.compute.sandboxId : null;\n const selectedMachine = selectedMachineSandboxId\n ? (machines.find((machine) => machine.sandboxId === selectedMachineSandboxId) ?? null)\n : null;\n const personalMachineSelected = selectedMachine?.scope === \"user\";\n const selectedPersonalResourceNames =\n draft.compute.kind === \"sandbox\"\n ? selectedRig?.scope === \"user\"\n ? [selectedRig.name]\n : []\n : personalMachineSelected && selectedMachine\n ? [selectedMachine.name]\n : [];\n const personalResourceSelectionKey = personalResourceSelectionIdentityKey({\n rigId: selectedRig?.scope === \"user\" ? selectedRig.id : null,\n connectedMachineId:\n personalMachineSelected && selectedMachine ? selectedMachine.enrollmentId : null,\n });\n const selectedPersonalResourceCount = personalResourceSelectionKey\n ? personalResourceSelectionKey.split(\"\\u0000\").length\n : 0;\n const [personalResourceCatalogRefreshPending, setPersonalResourceCatalogRefreshPending] =\n useState(false);\n const personalResourceCatalogRefreshGeneration = useRef(0);\n const personalResourceAttachment = newSessionPersonalResourceAttachment({\n personalResourceCount: selectedPersonalResourceCount,\n visibility: createVisibility,\n });\n const refreshPersonalResourceCatalogs = useLatestCallback(async (): Promise<void> => {\n const generation = ++personalResourceCatalogRefreshGeneration.current;\n setPersonalResourceCatalogRefreshPending(true);\n try {\n if (canUseRigs) await rigs.refresh();\n } finally {\n if (personalResourceCatalogRefreshGeneration.current === generation) {\n setPersonalResourceCatalogRefreshPending(false);\n }\n }\n });\n const recoverPersonalResourceAttachment = useLatestCallback(\n (error: unknown, attemptedInput: Parameters<typeof isPersonalAttachmentConflict>[1]): void => {\n if (!isPersonalAttachmentConflict(error, attemptedInput)) return;\n void recoverNewSessionPersonalResourceAttachment({\n error,\n attemptedInput,\n refreshCatalogs: refreshPersonalResourceCatalogs,\n });\n },\n );\n const [toolSelectionExplicit, setToolSelectionExplicit] = useState(false);\n // Whether the person chose the composer's model policy. False follows the\n // server-resolved new-chat default; undefined means an older server that\n // does not report the marker, so none is sent back.\n const [modelProvided, setModelProvided] = useState<boolean | undefined>(undefined);\n const [connectorCustomizing, setConnectorCustomizing] = useState(false);\n const [connectorExclusions, setConnectorExclusions] = useState<string[]>([]);\n const followWorkspaceConnectors = () => {\n connectionAccounts.resetEmptyChoices();\n setConnectorCustomizing(false);\n setToolSelectionExplicit(false);\n setConnectorExclusions([]);\n context.setSelectedCapabilityToolIds(\n defaultConnectorSelection(context.workspaceDefaultToolIds, []),\n );\n };\n const changeConnectorSelection = (selection: SessionToolSelection) => {\n // Choosing accounts is also an explicit connector customization. Apply it\n // in this event, rather than waiting for the header switch to re-render.\n if (!connectorCustomizing) setConnectorCustomizing(true);\n if (\n !toolSelectionExplicit &&\n addsConnectorOutsideDefaults(\n context.selectedCapabilityToolIds,\n selection.mcpServerIds,\n context.workspaceDefaultToolIds,\n )\n ) {\n setToolSelectionExplicit(true);\n } else if (!toolSelectionExplicit) {\n setConnectorExclusions((current) =>\n changedConnectorExclusions(\n current,\n context.selectedCapabilityToolIds,\n selection.mcpServerIds,\n ),\n );\n }\n context.setSelectedCapabilityToolIds(selection.mcpServerIds);\n };\n const [submitting, setSubmitting] = useState(false);\n // The new chat's usage limit: local to this composer (never the synced\n // draft or a remembered default), and only offered when the server can\n // enforce it.\n const usageLimitCapability = sessionUsageLimitCapability(context.clientConfig);\n const [usageLimitDraft, setUsageLimitDraft] =\n useState<SessionUsageLimitDraft>(NO_SESSION_USAGE_LIMIT);\n const [usageLimitSendBlocked, setUsageLimitSendBlocked] = useState(false);\n // The API refused to start this chat because no credit pays for its model.\n const [createCreditRefusal, setCreateCreditRefusal] = useState<{\n workspaceId: string;\n model: string;\n message: string;\n } | null>(null);\n const [createdSessionAuthority, setCreatedSessionAuthority] =\n useState<CreatedSessionRouteAuthority | null>(null);\n const composerRegionRef = useRef<HTMLDivElement | null>(null);\n // 0 = no explicit request (mount uses ConsoleComposer autoFocus). >0 = same-route\n // new-session / shortcut asked us to put the caret back in the create composer.\n const [createComposerFocusGen, setCreateComposerFocusGen] = useState(0);\n const selectProject = useLatestCallback((channelId: string | null, explicit = true) => {\n const previousChannelId = selectedChannelIdRef.current;\n if (explicit) setProjectProvenancePresent(true);\n setSelectedProjectChannelId(channelId);\n setDraft((current) => {\n const selection = newSessionProjectSelection(\n selectionHistory,\n channelId,\n { channelId: previousChannelId, compute: current.compute },\n defaultSandboxBackend,\n );\n return selection.compute === current.compute\n ? current\n : { ...current, compute: selection.compute };\n });\n });\n const setExplicitComputeDraft = useLatestCallback((nextDraft: SessionDraft) => {\n setProjectProvenancePresent(true);\n setDraft(\n nextDraft.compute.kind === \"sandbox\" &&\n !nextDraft.compute.backend &&\n defaultSandboxBackend !== \"selfhosted\"\n ? {\n ...nextDraft,\n compute: {\n ...nextDraft.compute,\n backend: defaultSandboxBackend ?? \"\",\n },\n }\n : nextDraft,\n );\n });\n\n useEffect(() => {\n resetSessionView();\n }, [resetSessionView, workspaceId]);\n\n // Folder-launch links preselect their exact destination, including Default,\n // while the ordinary New session entry starts in Recents. Commit this intent\n // before pending draft continuations can run; keeping it in an effect also\n // preserves render purity and the useEffect server fallback preserves SSR.\n useCommitSynchronousEffect(() => {\n const previousLaunchChannelId = previousLaunchChannelIdRef.current;\n previousLaunchChannelIdRef.current = launchChannelId;\n launchProjectIntentRef.current = nextNewSessionProjectLaunchIntent(\n launchProjectIntentRef.current,\n previousLaunchChannelId,\n launchChannelId,\n );\n const channelId = resolveAmbientNewSessionProjectChannelId({\n launchChannelId,\n previousLaunchChannelId,\n recentChannelId,\n remoteDraftHydrated: remoteDraftHydratedRef.current,\n });\n if (channelId === undefined) return;\n if (launchChannelId === undefined && previousLaunchChannelId !== undefined) {\n setProjectProvenancePresent(false);\n }\n selectProject(channelId, launchChannelId !== undefined);\n }, [launchChannelId, recentChannelId, selectProject]);\n\n useEffect(() => {\n if (\n selectedChannelId !== null &&\n !channelsQuery.loading &&\n !channelsQuery.channels.some((channel) => channel.id === selectedChannelId)\n ) {\n selectProject(null, false);\n }\n }, [channelsQuery.channels, channelsQuery.loading, selectedChannelId, selectProject]);\n const createProject = useCallback(async () => {\n const name = projectNameDraft.trim();\n if (!name) return;\n const project = await channelsQuery.create({ name });\n if (!project) {\n toast.error(\"Couldn't create the project. The name may already be in use.\");\n return;\n }\n selectProject(project.id);\n setProjectDialogOpen(false);\n setProjectNameDraft(\"\");\n }, [channelsQuery, projectNameDraft, selectProject]);\n\n useEffect(() => {\n const onRequest = (event: Event) => {\n const requestedChannelId = (event as CustomEvent<CreateComposerFocusIntent>).detail\n ?.channelId;\n launchProjectIntentRef.current = nextFocusedNewSessionProjectLaunchIntent(\n launchProjectIntentRef.current,\n requestedChannelId,\n );\n if (requestedChannelId !== undefined) {\n selectProject(requestedChannelId);\n } else if (remoteDraftHydratedRef.current) {\n setProjectProvenancePresent(false);\n selectProject(recentChannelId, false);\n }\n setCreateComposerFocusGen((current) => current + 1);\n };\n uiEvents.addEventListener(FOCUS_CREATE_COMPOSER_EVENT, onRequest);\n return () => uiEvents.removeEventListener(FOCUS_CREATE_COMPOSER_EVENT, onRequest);\n }, [recentChannelId, selectProject, uiEvents]);\n\n const computeReady =\n isSessionDraftComputeReady(draft) &&\n (draft.compute.kind !== \"machine\" ||\n (!fleet.loading &&\n selectedMachine !== null &&\n isMachineComputeSelectable(selectedMachine.state)));\n const persistedToolPolicy = useMemo(\n () =>\n fitToolPolicyToAgentCapabilities(\n newSessionDraftToolPolicy({\n selectedMcpServerIds: context.selectedCapabilityToolIds,\n workspaceDefaultMcpServerIds: context.workspaceDefaultToolIds,\n catalogReady: context.workspaceMcpCatalogReady,\n customizing: connectorCustomizing,\n explicit: toolSelectionExplicit,\n ...(!toolSelectionExplicit ? { excludedMcpServerIds: connectorExclusions } : {}),\n }),\n draft.agentCapabilities,\n ),\n [\n context.selectedCapabilityToolIds,\n context.workspaceMcpCatalogReady,\n context.workspaceDefaultToolIds,\n toolSelectionExplicit,\n connectorCustomizing,\n connectorExclusions,\n draft.agentCapabilities,\n ],\n );\n const persistedValue = useMemo(\n () => ({\n text: message,\n resources: [\n ...(draft.compute.kind === \"machine\" ? [] : context.currentResources),\n ...attachments.readyResources,\n ],\n tools: persistedToolPolicy.tools,\n toolsProvided: persistedToolPolicy.toolsProvided,\n model: context.model,\n reasoningEffort: context.reasoningEffort,\n latencyMode: context.latencyMode,\n ...(modelProvided !== undefined ? { modelProvided } : {}),\n ...(projectProvenancePresent ? { selectedProjectChannelId: selectedChannelId } : {}),\n options: {\n ...newSessionDraftOptionsFromSessionDraft(\n draft,\n defaultFirstPartyMcpTools,\n createVisibility,\n ),\n ...(persistedToolPolicy.excludedMcpServerIds !== undefined\n ? { excludedMcpServerIds: persistedToolPolicy.excludedMcpServerIds }\n : {}),\n },\n }),\n [\n attachments.readyResources,\n context.model,\n context.latencyMode,\n context.reasoningEffort,\n context.currentResources,\n draft,\n defaultFirstPartyMcpTools,\n message,\n modelProvided,\n createVisibility,\n persistedToolPolicy,\n projectProvenancePresent,\n selectedChannelId,\n ],\n );\n useEffect(() => {\n if (\n context.selectedPersonalGitHubRepoIds.size > 0 &&\n !context.personalGitHubAuthority &&\n context.personalGitHubCatalogReady\n ) {\n void context.ensurePersonalGitHubAuthority(workspaceId);\n }\n }, [\n context,\n context.ensurePersonalGitHubAuthority,\n context.personalGitHubAuthority,\n context.personalGitHubCatalogReady,\n context.selectedPersonalGitHubRepoIds.size,\n workspaceId,\n ]);\n const hydrateResources = useLatestCallback((resources: NewSessionDraftEditable[\"resources\"]) =>\n rehydrateRepositoryResources(resources, context.githubRepos, {\n catalogReady: context.githubCatalogReady,\n personalRepositories: context.personalGitHubRepositories,\n personalCatalogReady: context.personalGitHubCatalogReady,\n }),\n );\n const setModel = context.setModel;\n const setReasoningEffort = context.setReasoningEffort;\n const setLatencyMode = context.setLatencyMode;\n const setSelectedCapabilityToolIds = context.setSelectedCapabilityToolIds;\n const setManualRepos = context.setManualRepos;\n const setSelectedRepoIds = context.setSelectedRepoIds;\n const setSelectedRepoRefs = context.setSelectedRepoRefs;\n const setSelectedPersonalGitHubRepoIds = context.setSelectedPersonalGitHubRepoIds;\n const setSelectedPersonalGitHubRepoRefs = context.setSelectedPersonalGitHubRepoRefs;\n const githubRepos = context.githubRepos;\n const workspaceDefaultToolIdsForHydration = context.workspaceDefaultToolIds;\n const applyRemoteDraft = useCallback(\n (remote: NewSessionDraftEditable, history: NewSessionSelectionHistory) => {\n setMessage(remote.text);\n const restored = sessionDraftFromNewSessionDraftOptions(\n remote.options,\n defaultFirstPartyMcpTools,\n defaultSandboxBackend,\n );\n const projectSelection = resolveHydratedNewSessionProjectSelection({\n launchIntent: launchProjectIntentRef.current,\n remote,\n history,\n restoredCompute: restored.compute,\n defaultSandboxBackend,\n });\n // Fence the ambient Recents effect before installing history. That state\n // update changes recentChannelId, but must not replace this hydrated\n // explicit/persisted selection (or the legacy fallback resolved above).\n remoteDraftHydratedRef.current = true;\n setSelectionHistory(history);\n setProjectProvenancePresent(\n hydratedNewSessionProjectProvenancePresent(launchProjectIntentRef.current, remote),\n );\n setSelectedProjectChannelId(projectSelection.channelId);\n const compute = initialWorkspaceMachineCompute({\n settings: workspace?.settings,\n options: remote.options,\n fallback: projectSelection.compute,\n backend: defaultSandboxBackend,\n });\n setDraft({ ...restored, compute });\n setModel(remote.model);\n setReasoningEffort(remote.reasoningEffort);\n setLatencyMode(remote.latencyMode);\n setModelProvided(remote.modelProvided);\n const customize = newSessionConnectorCustomizeState({\n toolsProvided: remote.toolsProvided,\n tools: remote.tools,\n excludedMcpServerIds: remote.options.excludedMcpServerIds,\n });\n setConnectorCustomizing(customize.customizing);\n setToolSelectionExplicit(customize.explicit);\n setConnectorExclusions(remote.options.excludedMcpServerIds ?? []);\n const selected = new Set(\n customize.explicit\n ? remote.tools.map((tool) => tool.id)\n : defaultConnectorSelection(\n workspaceDefaultToolIdsForHydration,\n customize.customizing ? (remote.options.excludedMcpServerIds ?? []) : [],\n ),\n );\n setSelectedCapabilityToolIds(selectableSessionMcpServerIds(selected));\n const repositorySelection = repositorySelectionFromResources(remote.resources, githubRepos);\n setManualRepos(repositorySelection.manualRepos);\n setSelectedRepoIds(repositorySelection.selectedRepoIds);\n setSelectedRepoRefs(repositorySelection.selectedRepoRefs);\n setSelectedPersonalGitHubRepoIds(repositorySelection.selectedPersonalRepoIds);\n setSelectedPersonalGitHubRepoRefs(repositorySelection.selectedPersonalRepoRefs);\n },\n [\n setManualRepos,\n setModel,\n setLatencyMode,\n setReasoningEffort,\n setSelectedCapabilityToolIds,\n setSelectedRepoIds,\n setSelectedRepoRefs,\n setSelectedPersonalGitHubRepoIds,\n setSelectedPersonalGitHubRepoRefs,\n githubRepos,\n defaultFirstPartyMcpTools,\n defaultSandboxBackend,\n setSelectedProjectChannelId,\n workspaceDefaultToolIdsForHydration,\n workspace?.settings,\n ],\n );\n const newSessionDraft = useNewSessionDraft({\n workspaceId,\n client: context.client,\n value: persistedValue,\n onApplyRemote: applyRemoteDraft,\n restoreReadyFiles: attachments.restoreReadyFiles,\n hydrateResources,\n suspendAutosave: submitting,\n // Establish the passive baseline only after effective visibility settles.\n // Otherwise a late Personal-workspace capability response turns hydration\n // into an autosave, racing navigation and sibling drafts without a user edit.\n // Failed capability reads settle to the existing unavailable fallback too.\n // GitHub remains optional and must not keep the composer unsendable.\n resourceHydrationReady: context.workspaceMcpCatalogReady && tenancyCapabilities !== null,\n });\n useEffect(() => {\n if (newSessionDraft.loading || !context.workspaceMcpCatalogReady || toolSelectionExplicit)\n return;\n const next = defaultConnectorSelection(\n context.workspaceDefaultToolIds,\n connectorCustomizing ? connectorExclusions : [],\n );\n setSelectedCapabilityToolIds((current) =>\n current.size === next.size && [...next].every((id) => current.has(id)) ? current : next,\n );\n }, [\n newSessionDraft.loading,\n context.workspaceMcpCatalogReady,\n context.workspaceDefaultToolIds,\n setSelectedCapabilityToolIds,\n connectorCustomizing,\n connectorExclusions,\n toolSelectionExplicit,\n ]);\n const busy = context.busy || submitting;\n const privateCreateUnavailable =\n (personalWorkspace && tenancyCapabilities === null) ||\n (!personalWorkspace &&\n draft.visibility === \"private\" &&\n tenancyCapabilities?.canCreatePrivate !== true);\n const selectedPolicyRow = findPickerRow(modelCatalog.rows, context.model);\n // A refused start names its model until the next start or a dismissal; before\n // any Send, an uncovered model with free credit left for others does the same.\n const refusedCreate =\n createCreditRefusal?.workspaceId === workspaceId ? createCreditRefusal : null;\n const creditCoverageOptions = {\n selectedModel: context.model,\n preferredModel: modelCatalog.defaultSelection?.model,\n };\n const creditGap = refusedCreate\n ? creditRefusalGap(modelCatalog.rows, refusedCreate.model, creditCoverageOptions)\n : freeCreditGap(modelCatalog.rows, context.model, creditCoverageOptions);\n const noteCreditRefusal = (error: Error, request: { model?: string | undefined }): boolean => {\n if (!isPaymentRequiredError(error)) return false;\n setCreateCreditRefusal({\n workspaceId,\n model: request.model ?? context.model,\n message: error.message,\n });\n // Re-read funding so the notice and picker name what the credit covers now.\n void modelCatalog.refresh();\n return true;\n };\n const chooseCoveredModel = (id: string) => {\n const row = findPickerRow(modelCatalog.rows, id);\n const choice = row\n ? coveredModelChoice(row, context.reasoningEffort, context.latencyMode)\n : null;\n if (!choice) return;\n setModelProvided(true);\n context.setModel(choice.model);\n context.setReasoningEffort(choice.effort);\n if (choice.latencyMode !== null) context.setLatencyMode(choice.latencyMode);\n };\n const newSessionPolicyValid = Boolean(\n selectedPolicyRow?.selectable &&\n effortOptionsForModel(selectedPolicyRow.catalog).includes(context.reasoningEffort) &&\n (context.latencyMode === \"standard\" ||\n runnableLatencyModesForModel(selectedPolicyRow.catalog).includes(context.latencyMode)),\n );\n const noRunnableModel =\n !modelCatalog.loading &&\n modelCatalog.rows.length > 0 &&\n !modelCatalog.rows.some((row) => row.selectable);\n const newSessionPolicyError =\n !modelCatalog.loading &&\n !newSessionPolicyValid &&\n !noRunnableModel &&\n selectedPolicyRow?.selectable\n ? \"Choose a supported model, reasoning level, and speed.\"\n : null;\n useEffect(() => {\n if (modelCatalog.loading || newSessionDraft.loading) return;\n if (findPickerRow(modelCatalog.rows, context.model)?.selectable) return;\n // The server-resolved default comes first (saved workspace default, then a\n // connected subscription, then credits, then the deployment default); the\n // client ranking only covers a default that is itself unavailable.\n const resolvedDefault = modelCatalog.defaultSelection;\n const next = composerFallbackModel({\n models: modelCatalog.models,\n rows: modelCatalog.rows,\n defaultSelection: resolvedDefault,\n });\n if (!next || next.id === context.model) return;\n setModel(next.id);\n setReasoningEffort(next.effort);\n // An automatic replacement is not the person's choice.\n setModelProvided((current) => (current === undefined ? current : false));\n }, [\n context.model,\n modelCatalog.defaultSelection,\n modelCatalog.loading,\n modelCatalog.models,\n modelCatalog.rows,\n newSessionDraft.loading,\n setModel,\n setReasoningEffort,\n ]);\n const codexConnected = modelCatalog.models.some(\n (candidate) =>\n candidate.provider === \"codex-subscription\" &&\n candidate.credentialReadiness.status === \"ready\",\n );\n const startBlocker =\n modelCatalog.loading || newSessionDraft.loading\n ? null\n : modelCatalog.error\n ? \"model_catalog_unavailable\"\n : !newSessionPolicyValid\n ? !modelCatalog.rows.some((row) => row.selectable)\n ? \"no_model_connected\"\n : selectedPolicyRow &&\n selectedPolicyRow.billingClass !== \"opengeni_credits\" &&\n selectedPolicyRow.catalog.credentialReadiness.status !== \"ready\"\n ? \"selected_model_not_connected\"\n : \"model_policy_unavailable\"\n : privateCreateUnavailable\n ? \"private_session_unavailable\"\n : attachments.hasUnresolved\n ? \"attachments_pending\"\n : !computeReady\n ? \"compute_unavailable\"\n : null;\n useEffect(() => {\n const record = () => {\n if (startBlocker)\n captureAnalyticsEvent(\"session_start_blocker_viewed\", {\n workspace_id: workspaceId,\n reason: startBlocker,\n });\n };\n record();\n window.addEventListener(ANALYTICS_COLLECTION_ENABLED_EVENT, record);\n return () => window.removeEventListener(ANALYTICS_COLLECTION_ENABLED_EVENT, record);\n }, [startBlocker, workspaceId]);\n // Shared with the bar start control and the mobile “+ → Voice model” panel.\n const voiceSelection = useRealtimeModelSelection({\n client: context.client,\n workspaceId,\n codexConnected,\n });\n\n useEffect(() => {\n if (createComposerFocusGen === 0 || newSessionDraft.loading) return;\n const textarea = composerRegionRef.current?.querySelector(\"textarea\");\n if (!textarea || textarea.disabled) return;\n textarea.focus();\n }, [createComposerFocusGen, newSessionDraft.loading]);\n\n const submitNewSession = useLatestCallback(\n async (\n realtimeModel: SessionRealtimeModel | null,\n policy?: Pick<ComposerLaunchSearch, \"model\" | \"effort\" | \"latency\">,\n ): Promise<boolean> => {\n if (startBlocker)\n captureAnalyticsEvent(\"session_start_blocked\", {\n workspace_id: workspaceId,\n reason: startBlocker,\n });\n const hasTypedText = message.trim().length > 0;\n const text = hasTypedText\n ? message\n : attachments.readyResources.length > 0\n ? FILE_ONLY_MESSAGE_TEXT(t)\n : \"\";\n if (\n busy ||\n !context.workspaceMcpCatalogReady ||\n newSessionDraft.loading ||\n !newSessionPolicyValid ||\n privateCreateUnavailable ||\n personalResourceCatalogRefreshPending ||\n (!realtimeModel &&\n createdSessionAuthority === null &&\n (connectionAccounts.loading ||\n connectionAccounts.error !== null ||\n connectionAccounts.requiresAccountChoice)) ||\n (createdSessionAuthority === null && !fixedResourceSelection.selectionResolved)\n )\n return false;\n if (createdSessionAuthority === null) {\n const unavailable = unavailableSessionMcpServerIds(\n context.selectedCapabilityToolIds,\n context.toolMcpServers,\n context.workspaceMcpCatalogLoadedSuccessfully,\n );\n if (unavailable.length > 0) {\n const removed = new Set(unavailable);\n context.setSelectedCapabilityToolIds(\n (current) => new Set([...current].filter((id) => !removed.has(id))),\n );\n setConnectorExclusions((current) => [...new Set([...current, ...unavailable])]);\n toast.error(\"Some selected tools are no longer available\", {\n description:\n \"Removed them from this draft. Your message is still here; review the tools and send again.\",\n });\n return false;\n }\n }\n if (realtimeModel && personalMachineSelected) {\n toast.error(\"Voice can't start on a personal Connected Machine\", {\n description:\n \"Start the session with a message first so Opengeni can attach the machine to an accepted turn.\",\n });\n return false;\n }\n if (\n createdSessionAuthority === null &&\n ((!text && !realtimeModel) || attachments.hasUnresolved || !computeReady)\n ) {\n return false;\n }\n // A chosen limit must be a valid amount; an older server never gets one.\n const usageLimit =\n usageLimitCapability === \"enabled\" ? parseSessionUsageLimitDraft(usageLimitDraft) : null;\n if (createdSessionAuthority === null && usageLimit && !usageLimit.ok) {\n setUsageLimitSendBlocked(true);\n toast.error(\"Check the usage limit\", {\n description: `${usageLimit.error} Change it under + > Usage limit.`,\n });\n return false;\n }\n const usageLimitMicros = usageLimit?.ok ? usageLimit.limitMicros : null;\n const model = policy?.model ?? persistedValue.model;\n const reasoningEffort = policy?.effort ?? persistedValue.reasoningEffort;\n const latencyMode = policy?.latency ?? persistedValue.latencyMode;\n // One Send always refers to one visible snapshot, even if a sibling edit\n // forces a draft save or create retry while the user continues typing.\n const visibleSignature = stableJson(persistedValue);\n const submittedSnapshot = newSessionCreateSnapshot(\n persistedValue,\n realtimeModel ? persistedValue.text : text,\n {\n model,\n reasoningEffort,\n latencyMode,\n },\n );\n const preserveNewerLocalDraft = async () => {\n if (!newSessionDraft.isCurrentSignature(visibleSignature)) {\n // A definitive create failure must not leave text typed during the\n // attempt unsaved after a retry persisted the clicked snapshot.\n await (realtimeModel ? newSessionDraft.flush() : newSessionDraft.flushForSend());\n }\n };\n setSubmitting(true);\n try {\n return await runNewSessionRouteSubmission({\n authority: createdSessionAuthority,\n onAuthorityChange: setCreatedSessionAuthority,\n create: async () => {\n // Voice launch is realtime-only: never turn composer text/files into\n // an initial message. Persist the draft so a pending autosave is not\n // lost on navigate, but do not consume it — text stays for later.\n if (realtimeModel) {\n for (let attempt = 0; attempt < 3; attempt += 1) {\n // Voice launch does not consume the draft. Save local edits if\n // possible, but never rebase an old voice draft over a sibling's\n // newer unsent message merely to start a realtime session.\n const flushed = await newSessionDraft.flush();\n if (!flushed) {\n reportDraftSaveFailure(newSessionDraft);\n return null;\n }\n const submission = submissionFromSessionDraft(\n draft,\n defaultFirstPartyMcpTools,\n personalResourceAttachment.intent,\n );\n let draftConflict = false;\n let outcomeUnknown = false;\n const created = await context.startSession(\n workspaceId,\n {\n text: \"\",\n resources: [],\n tools: submittedSnapshot.tools,\n model,\n reasoningEffort,\n latencyMode,\n ...submission.extras,\n },\n {\n targetSandboxId: submission.options.targetSandboxId,\n workingDir: submission.options.workingDir,\n channelId: selectedChannelId,\n omitWorkspaceResources: submission.omitWorkspaceResources,\n installedSkillIds: launch.skillCapabilityId\n ? [launch.skillCapabilityId]\n : undefined,\n startMode: \"realtime\",\n expectedNewSessionDraftRevision: flushed.revision,\n newSessionDraftToolPolicy: persistedToolPolicy,\n agentLearning: draft.agentLearning,\n usageLimitMicros,\n visibility: newSessionCreateVisibility(\n personalWorkspace,\n submission.options.visibility ?? \"workspace\",\n tenancyCapabilities?.canCreatePrivate === true,\n ),\n onFailure: ({ error, request, outcomeUnknown: uncertain }) => {\n draftConflict = newSessionDraft.captureConflict(error);\n outcomeUnknown = uncertain;\n recoverPersonalResourceAttachment(error, request);\n connectionAccounts.onSelectionError(error);\n // A brief outage shows the updating notice, not a toast.\n return (\n draftConflict ||\n newSessionDraft.reportUnavailable(error) ||\n noteCreditRefusal(error, request)\n );\n },\n },\n );\n if (!created) {\n if (draftConflict) continue;\n if (!outcomeUnknown) await preserveNewerLocalDraft();\n return null;\n }\n setUsageLimitDraft(NO_SESSION_USAGE_LIMIT);\n setCreateCreditRefusal(null);\n setUsageLimitSendBlocked(false);\n return {\n sessionId: created.id,\n settleDraft: async () => true,\n };\n }\n await preserveNewerLocalDraft();\n newSessionDraft.clearError();\n toast.error(\"Couldn't start voice\", {\n description: DRAFT_CHANGED_DURING_SEND_TEXT,\n });\n return null;\n }\n\n const submittedResources = submittedSnapshot.resources;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const flushed = await newSessionDraft.flushForSend(submittedSnapshot);\n if (!flushed) {\n reportDraftSaveFailure(newSessionDraft);\n return null;\n }\n const submission = submissionFromSessionDraft(\n draft,\n defaultFirstPartyMcpTools,\n personalResourceAttachment.intent,\n );\n let draftConflict = false;\n let outcomeUnknown = false;\n const created = await context.startSession(\n workspaceId,\n {\n text,\n resources: submittedResources,\n tools: submittedSnapshot.tools,\n model,\n reasoningEffort,\n latencyMode,\n ...submission.extras,\n connectionAccounts: connectionAccounts.selections,\n },\n {\n targetSandboxId: submission.options.targetSandboxId,\n workingDir: submission.options.workingDir,\n channelId: selectedChannelId,\n omitWorkspaceResources: submission.omitWorkspaceResources,\n installedSkillIds: launch.skillCapabilityId\n ? [launch.skillCapabilityId]\n : undefined,\n expectedNewSessionDraftRevision: flushed.revision,\n newSessionDraftToolPolicy: persistedToolPolicy,\n agentLearning: draft.agentLearning,\n usageLimitMicros,\n visibility: newSessionCreateVisibility(\n personalWorkspace,\n submission.options.visibility ?? \"workspace\",\n tenancyCapabilities?.canCreatePrivate === true,\n ),\n onFailure: ({ error, request, outcomeUnknown: uncertain }) => {\n draftConflict = newSessionDraft.captureConflict(error);\n outcomeUnknown = uncertain;\n recoverPersonalResourceAttachment(error, request);\n connectionAccounts.onSelectionError(error);\n // A brief outage shows the updating notice, not a toast.\n // An unconfirmed create keeps its idempotency key, so the\n // person's next Send cannot start a second session.\n return (\n draftConflict ||\n newSessionDraft.reportUnavailable(error) ||\n noteCreditRefusal(error, request)\n );\n },\n },\n );\n if (!created) {\n if (draftConflict) continue;\n if (!outcomeUnknown) await preserveNewerLocalDraft();\n return null;\n }\n // The limit belongs to the chat just created; the next starts with none.\n setUsageLimitDraft(NO_SESSION_USAGE_LIMIT);\n setCreateCreditRefusal(null);\n setUsageLimitSendBlocked(false);\n return {\n sessionId: created.id,\n settleDraft: async () => {\n const acknowledged = await newSessionDraft.acknowledgeConsumed(\n flushed,\n visibleSignature,\n );\n if (\n acknowledged?.kind === \"consumed\" &&\n newSessionDraft.isCurrentSignature(visibleSignature)\n ) {\n setMessage(\"\");\n visibilityChosenRef.current = false;\n setDraft({\n ...emptySessionDraft(defaultFirstPartyMcpTools, defaultSandboxBackend),\n visibility:\n tenancyCapabilities?.canCreatePrivate === true &&\n tenancyCapabilities.defaultVisibility === \"private\"\n ? \"private\"\n : \"workspace\",\n });\n attachments.removeReadyFiles(\n submittedResources.flatMap((resource) =>\n resource.kind === \"file\" ? [resource.fileId] : [],\n ),\n );\n } else if (\n acknowledged?.kind !== \"preserved\" ||\n !newSessionDraft.isCurrentSignature(acknowledged.flushed.signature)\n ) {\n // The message was already accepted. If there is no newer\n // local edit, leave a sibling's later draft untouched.\n if (!acknowledged && newSessionDraft.isCurrentSignature(visibleSignature)) {\n return true;\n }\n const preserved = await newSessionDraft.flushForSend();\n if (!preserved || !newSessionDraft.isCurrentSignature(preserved.signature)) {\n return false;\n }\n }\n return true;\n },\n };\n }\n await preserveNewerLocalDraft();\n // Each attempt saved the draft before the create refused it, so the\n // draft is not unsaved: clear that notice and resume autosave.\n newSessionDraft.clearError();\n toast.error(\"Couldn't send\", {\n description: DRAFT_CHANGED_DURING_SEND_TEXT,\n });\n return null;\n },\n navigate: async (sessionId) => {\n // Voice connects while the session page loads; the page adopts\n // the running call (`?realtime=` still selects its model there).\n const sessionPath = `/workspaces/${workspaceId}/sessions/${sessionId}`;\n const abandonVoice = realtimeModel\n ? prestartSessionRealtime({\n client: api.voiceRealtimeClient(\n context.client,\n () => new URL(sessionPath, page.origin()).href,\n ),\n workspaceId,\n sessionId,\n model: realtimeModel,\n language: voiceSelection.languageFor(realtimeModel),\n voiceSettings: voiceSelection.voiceSettingsFor(realtimeModel),\n })\n : null;\n try {\n await navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n search: realtimeModel ? { realtime: realtimeModel } : {},\n });\n } catch (error) {\n abandonVoice?.();\n throw error;\n }\n },\n });\n } finally {\n setSubmitting(false);\n }\n },\n );\n\n // URL launch: ?model=&effort=&latency= prefill the composer; +?realtime= also\n // creates a realtime-first session and autostarts voice on the session page.\n // Wait for the durable new-session draft so remote hydrate cannot stomp the\n // URL policy after we apply it.\n const launchModel = launch.model;\n const launchEffort = launch.effort;\n const launchLatency = launch.latency;\n const launchRealtime = launch.realtime;\n const launchFollowDefault = launch.followDefault === true;\n const launchSkillCapabilityId = launch.skillCapabilityId;\n const launchKey = composerLaunchSearchKey(launch);\n const handledLaunchKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (!launchKey || handledLaunchKeyRef.current === launchKey) return;\n if (newSessionDraft.loading) return;\n if (launchModel) setModel(launchModel);\n if (launchEffort) setReasoningEffort(launchEffort);\n if (launchLatency) setLatencyMode(launchLatency);\n // A checkout return carries the credits default and keeps following the\n // default; any other launch policy is the person's choice.\n setModelProvided((current) =>\n modelProvidedAfterLaunch(\n {\n ...(launchModel ? { model: launchModel } : {}),\n ...(launchEffort ? { effort: launchEffort } : {}),\n ...(launchLatency ? { latency: launchLatency } : {}),\n ...(launchFollowDefault ? { followDefault: true } : {}),\n },\n current,\n ),\n );\n if (!launchRealtime) {\n handledLaunchKeyRef.current = launchKey;\n void navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId },\n search: {\n ...(launch.channelId ? { channelId: launch.channelId } : {}),\n ...(launchSkillCapabilityId ? { skillCapabilityId: launchSkillCapabilityId } : {}),\n },\n replace: true,\n });\n return;\n }\n if (\n busy ||\n !computeReady ||\n !newSessionPolicyValid ||\n !context.workspaceMcpCatalogReady ||\n attachments.hasUnresolved\n ) {\n return;\n }\n handledLaunchKeyRef.current = launchKey;\n void submitNewSession(launchRealtime, {\n model: launchModel,\n effort: launchEffort,\n latency: launchLatency,\n }).then((ok) => {\n if (!ok) handledLaunchKeyRef.current = null;\n });\n }, [\n attachments.hasUnresolved,\n busy,\n computeReady,\n context.workspaceMcpCatalogReady,\n launchEffort,\n launchFollowDefault,\n launchLatency,\n launchModel,\n launchRealtime,\n launchSkillCapabilityId,\n launchKey,\n launch.channelId,\n navigate,\n newSessionDraft.loading,\n newSessionPolicyValid,\n setLatencyMode,\n setModel,\n setReasoningEffort,\n submitNewSession,\n workspaceId,\n ]);\n\n // The session does not exist yet, so this surface cannot use `useComposer`\n // (that hook sends to a session). It still renders the package ChatComposer\n // by implementing the same `ComposerState` contract over session creation.\n const createComposer: ComposerState = {\n value: message,\n setValue: setMessage,\n hasDraftContent: () => message.length > 0 || attachments.attachments.length > 0,\n sending: busy,\n // Mirrors useComposer's gate: a ready attachment with no typed draft is a\n // sendable file-only message (the API requires non-empty text, so send()\n // substitutes FILE_ONLY_MESSAGE_TEXT).\n canSend:\n (createdSessionAuthority !== null ||\n message.trim().length > 0 ||\n attachments.readyResources.length > 0) &&\n !busy &&\n !newSessionDraft.loading &&\n newSessionPolicyValid &&\n !personalResourceCatalogRefreshPending &&\n (createdSessionAuthority !== null ||\n (!connectionAccounts.loading &&\n connectionAccounts.error === null &&\n !connectionAccounts.requiresAccountChoice)) &&\n (createdSessionAuthority !== null || fixedResourceSelection.selectionResolved) &&\n (createdSessionAuthority !== null || (!attachments.hasUnresolved && computeReady)),\n pause: async () => {},\n pausing: false,\n resume: async () => {},\n resumeScope: async () => {},\n resuming: false,\n draft: null,\n draftRevision: newSessionDraft.revision,\n draftLoading: newSessionDraft.loading,\n draftSaving: newSessionDraft.saving,\n // A stale autosaved draft must not block or distract from explicit Send.\n draftConflict: null,\n policy: {\n model: context.model,\n reasoningEffort: context.reasoningEffort,\n latencyMode: context.latencyMode,\n },\n setModel: (model) => {\n setModelProvided(true);\n context.setModel(model);\n },\n setReasoningEffort: (effort) => {\n setModelProvided(true);\n context.setReasoningEffort(effort);\n },\n setLatencyMode: (latencyMode) => {\n setModelProvided(true);\n context.setLatencyMode(latencyMode);\n },\n draftPersistence: \"disabled\",\n applyDraft: () => {},\n reloadDraft: newSessionDraft.reload,\n resolveDraftConflict: newSessionDraft.resolveConflict,\n restoredResources: [],\n removeRestoredResource: () => {},\n // A brief outage is explained once by the updating notice below the\n // composer, never as a red error with a request reference.\n error: newSessionDraft.unavailable || newSessionDraft.conflict ? null : newSessionDraft.error,\n clearError: newSessionDraft.clearError,\n send: async () => await submitNewSession(null),\n steer: async () => {\n const text =\n message.trim() || (attachments.readyResources.length > 0 ? FILE_ONLY_MESSAGE_TEXT(t) : \"\");\n if (!text || busy || attachments.hasUnresolved || !computeReady || !newSessionPolicyValid) {\n return false;\n }\n return await createComposer.send();\n },\n };\n useBrowserAccountBridgeBlocker(`new-session-composer:${workspaceId}`, () => {\n if (attachments.hasUnresolved) {\n return {\n id: \"ignored\",\n label: \"A file upload is not settled\",\n detail: \"Wait for the upload or remove it before changing accounts.\",\n };\n }\n if (busy || submitting || newSessionDraft.saving) {\n return {\n id: \"ignored\",\n label: \"A new-session mutation is still running\",\n detail: \"Wait for the current save or session creation to finish.\",\n };\n }\n return createComposer.hasDraftContent()\n ? {\n id: \"ignored\",\n label: \"The new-session composer has an unsent draft\",\n detail: \"Continuing clears the account-bound draft.\",\n }\n : null;\n });\n\n // A transient outage is covered by the updating notice instead.\n const accountsFailure = connectionAccounts.error !== null && !connectionAccounts.unavailable;\n\n return createElement(\n LightboxProvider,\n null,\n // The canvas parent is overflow-hidden, so this route owns its scrolling —\n // without it the page clips (recent sessions were unreachable below the fold).\n <div\n data-workspace-scroll-owner=\"self-managed\"\n data-window-top-page\n className=\"min-h-0 flex-1 overflow-y-auto\"\n >\n {githubAppConnect.element}\n <div className=\"mx-auto flex w-full max-w-3xl flex-col px-4 pt-10 pb-16 sm:px-6 sm:pt-16\">\n <section className=\"flex flex-col items-center gap-2 text-center\">\n <h1 className=\"text-balance text-2xl font-semibold tracking-tight sm:text-3xl\">\n What should the agent do?\n </h1>\n {context.clientConfig.billingMode === \"stripe\" &&\n workspace?.accountId &&\n hasAccountPermission(context.accessContext, workspace.accountId, \"billing:manage\") ? (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() => setCreditTopupOpen(true)}\n >\n <CreditCardIcon className=\"size-4\" />\n Add credits\n </Button>\n <Suspense fallback={null}>\n <CreditTopupPrompt\n purpose=\"topup\"\n open={creditTopupOpen}\n workspaceId={workspaceId}\n accountId={workspace.accountId}\n canBuyCredits\n onOpenChange={setCreditTopupOpen}\n />\n </Suspense>\n </>\n ) : null}\n </section>\n\n {launchSkillCapabilityId ? (\n <div className=\"mt-6\">\n <Notice tone=\"info\" title=\"Implementation guidance selected\">\n This installed Skill will be frozen onto this session only. Other workspace sessions\n will not receive it.\n </Notice>\n </div>\n ) : null}\n\n {creditGap ? (\n <div className=\"mt-6\">\n <CreditRefusalNotice\n gap={creditGap}\n message={refusedCreate?.message}\n workspaceId={workspaceId}\n canBuyCredits={\n context.clientConfig.billingMode === \"stripe\" &&\n hasAccountPermission(\n context.accessContext,\n workspace?.accountId ?? \"\",\n \"billing:manage\",\n )\n }\n canConnectModel={hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"connections:write\",\n )}\n onChooseModel={busy ? undefined : chooseCoveredModel}\n {...(refusedCreate ? { onDismiss: () => setCreateCreditRefusal(null) } : {})}\n />\n </div>\n ) : modelUsesCredits(selectedPolicyRow?.catalog) &&\n hasAccountPermission(\n context.accessContext,\n workspace?.accountId ?? \"\",\n \"billing:read\",\n ) ? (\n <div className=\"mt-6\">\n <Suspense fallback={null}>\n <EmptyCreditsNotice\n creditFunding={selectedPolicyRow?.catalog.creditFunding}\n workspaceId={workspaceId}\n accountId={workspace?.accountId ?? null}\n canBuyCredits={hasAccountPermission(\n context.accessContext,\n workspace?.accountId ?? \"\",\n \"billing:manage\",\n )}\n canReadBilling\n />\n </Suspense>\n </div>\n ) : null}\n\n <div ref={composerRegionRef} className=\"mt-8 [&_textarea]:min-h-[calc(2lh+1rem)]\">\n <ConsoleComposer\n workspaceId={workspaceId}\n composer={createComposer}\n attachments={attachments}\n autoFocus\n disabled={newSessionDraft.loading || submitting}\n fileUploadsEnabled={context.clientConfig.fileUploads.enabled === true}\n placeholder=\"Describe a task for the agent…\"\n controlsLeading={\n <>\n <ComposerMobilePlus\n openRequest={capabilitiesOpenRequest}\n connectorActions={{\n accountControls: {\n groups: connectionAccounts.availableAccountGroups,\n choices: connectionAccounts.accountChoices,\n onChoose: connectionAccounts.selectAccount,\n loading: connectionAccounts.loading,\n error: connectionAccounts.error,\n accessDenied: connectionAccounts.accessDenied,\n onRefresh: () => void connectionAccounts.refresh(),\n disabled: busy || newSessionDraft.loading,\n },\n }}\n menuSide=\"bottom\"\n agentCapabilities={{\n ...composerAgentCapabilities,\n disabled: busy || newSessionDraft.loading,\n }}\n draftChatSettings={{\n workspaceId,\n scope:\n createVisibility === \"private\" || personalWorkspace\n ? \"personal\"\n : \"workspace\",\n value: draft.agentLearning ?? {},\n onChange: (agentLearning) =>\n setDraft((current) => ({ ...current, agentLearning })),\n }}\n workspaceId={workspaceId}\n disabled={busy || newSessionDraft.loading}\n fileUploadsEnabled={context.clientConfig.fileUploads.enabled === true}\n servers={context.toolMcpServers}\n firstPartyTools={firstPartyToolOptions}\n selection={{\n mcpServerIds: context.selectedCapabilityToolIds,\n firstPartyToolIds: draft.firstPartyMcpTools,\n }}\n toolsDisabled={busy || newSessionDraft.loading}\n connectorCustomizing={connectorCustomizing}\n onConnectorCustomizingChange={(next) => {\n if (next) setConnectorCustomizing(true);\n else followWorkspaceConnectors();\n }}\n onToolSelectionChange={(selection) => {\n changeConnectorSelection(selection);\n }}\n {...(hasRunsOnChoices(runsOnChoices)\n ? {\n runsOn: {\n summary: runsOnSummary(runsOnChoices),\n disabled: busy || newSessionDraft.loading,\n panel: (\n <RunsOnMenuBody\n {...runsOnChoices}\n disabled={busy || newSessionDraft.loading}\n onChange={setDraft}\n onComputeChange={setExplicitComputeDraft}\n onRetryMachines={() => void fleet.refresh()}\n />\n ),\n },\n }\n : {})}\n {...(hasVisibilityChoice({\n personalWorkspace,\n canCreatePrivate: tenancyCapabilities?.canCreatePrivate === true,\n })\n ? {\n visibility: {\n summary: visibilitySummary(draft.visibility),\n disabled: busy || newSessionDraft.loading,\n panel: (\n <VisibilityMenuBody\n value={draft.visibility}\n disabled={busy || newSessionDraft.loading}\n onChange={(visibility) => {\n visibilityChosenRef.current = true;\n setDraft((current) => ({\n ...current,\n visibility,\n }));\n }}\n />\n ),\n },\n }\n : {})}\n {...(usageLimitCapability === \"enabled\"\n ? {\n usageLimit: {\n summary: sessionUsageLimitDraftSummary(usageLimitDraft),\n disabled: busy || newSessionDraft.loading,\n panel: (\n <UsageLimitMenuBody\n value={usageLimitDraft}\n disabled={busy || newSessionDraft.loading}\n showRequiredError={usageLimitSendBlocked}\n onChange={setUsageLimitDraft}\n />\n ),\n },\n }\n : {})}\n {...(draft.compute.kind === \"sandbox\"\n ? {\n repositories: {\n selectedCount:\n context.selectedRepoIds.size +\n context.selectedPersonalGitHubRepoIds.size +\n context.manualRepos.filter((repo) => repo.url.trim().length > 0).length,\n disabled: busy || newSessionDraft.loading,\n panel: (\n <WorkspaceRepositoryMenuBody\n workspaceId={workspaceId}\n disabled={busy || newSessionDraft.loading}\n catalogRefresh={repositoryCatalogRefresh}\n onConnectWorkspaceApp={githubAppConnect.open}\n />\n ),\n },\n }\n : {})}\n {...(draftSecretsOn && canListSecrets\n ? {\n secrets: {\n summary: sessionSecretsSummary(draftVaultPolicy, draftVaultRows),\n disabled: busy || newSessionDraft.loading,\n panel: (\n <SessionSecretsMenuBody\n vaults={draftVaultRows}\n policy={draftVaultPolicy}\n narrowedByParent={false}\n canEdit\n disabled={busy || newSessionDraft.loading}\n loading={draftVaults.loading}\n error={draftVaults.error}\n onRetry={() => void draftVaults.refresh()}\n onPolicyChange={(policy) =>\n setDraft((current) => {\n const { vaultPolicy: _previous, ...rest } = current;\n return policy.mode === \"all\"\n ? rest\n : { ...rest, vaultPolicy: policy };\n })\n }\n onManage={() =>\n void navigate({\n to: \"/workspaces/$workspaceId/secrets\",\n params: { workspaceId },\n })\n }\n />\n ),\n },\n }\n : {})}\n />\n {composerAgentCapabilities.customized ? (\n <ComposerCapabilitiesChip\n summary={capabilitySummary(\n composerAgentCapabilities.draft.values,\n composerAgentCapabilities.availability,\n )}\n disabled={busy || newSessionDraft.loading}\n onOpen={() =>\n setCapabilitiesOpenRequest((current) => ({\n panel: \"capabilities\",\n nonce: (current?.nonce ?? 0) + 1,\n }))\n }\n />\n ) : null}\n </>\n }\n controls={\n <div className=\"@container/model-controls flex min-w-0 flex-1 items-center gap-1.5\">\n <SessionModelControl\n hasImageAttachments={attachments.attachments.some(\n (file) => file.status !== \"failed\" && file.contentType.startsWith(\"image/\"),\n )}\n modelCatalog={modelCatalog}\n policyError={newSessionPolicyError}\n disabled={busy || newSessionDraft.loading}\n workspaceId={workspaceId}\n onPolicyChosen={() => setModelProvided(true)}\n />\n </div>\n }\n actions={\n <>\n <NewSessionRealtimeControl\n client={context.client}\n workspaceId={workspaceId}\n codexConnected={codexConnected}\n models={voiceSelection.models}\n selectedModel={voiceSelection.selectedModel}\n onSelectModel={voiceSelection.selectModel}\n modelMenu=\"split\"\n disabled={\n busy ||\n newSessionDraft.loading ||\n attachments.hasUnresolved ||\n !newSessionPolicyValid ||\n !computeReady ||\n personalMachineSelected ||\n !context.workspaceMcpCatalogReady\n }\n disabledReason={\n attachments.hasUnresolved\n ? \"Wait for attachments to finish before starting voice.\"\n : !newSessionPolicyValid\n ? \"Choose supported model settings before starting voice.\"\n : !computeReady\n ? \"Choose where this session should run first.\"\n : personalMachineSelected\n ? \"Start with a message so personal machine access can attach to an accepted turn.\"\n : !context.workspaceMcpCatalogReady\n ? \"Wait for session tools to finish loading.\"\n : null\n }\n onStart={async (model) => await submitNewSession(model)}\n />\n </>\n }\n header={\n <SessionSetupStrip\n disabled={busy || newSessionDraft.loading}\n channels={channelsQuery.channels}\n selectedChannelId={selectedChannelId}\n onChannelChange={selectProject}\n onCreateProject={() => setProjectDialogOpen(true)}\n />\n }\n />\n\n {personalWorkspace ? <PrivateWorkspaceNote /> : null}\n {newSessionDraft.conflict ? <NewSessionDraftSyncNotice /> : null}\n\n {/* A deploy or restart makes Opengeni unreachable for a few seconds.\n Reads retry quietly first; if it lasts longer, this one calm line\n replaces every error, the message stays in the composer, and the\n hooks reconnect on their own so Send works again. */}\n {newSessionDraft.unavailable || connectionAccounts.unavailable ? (\n <div role=\"status\" className=\"mt-3\">\n <Notice tone=\"info\">{OPENGENI_UPDATING_NOTICE(t)}</Notice>\n </div>\n ) : null}\n\n {/* Accounts load quietly with the composer: only a problem shows here,\n never a loading line behind an open menu. */}\n {accountsFailure || connectionAccounts.accountChoiceMessage ? (\n <div role=\"alert\" className=\"mt-3\">\n <Notice\n tone=\"waiting\"\n action={\n accountsFailure && !connectionAccounts.accessDenied ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void connectionAccounts.refresh()}\n >\n Retry\n </Button>\n ) : undefined\n }\n >\n {accountsFailure\n ? connectionAccounts.accessDenied\n ? connectionAccounts.error\n : \"Couldn't send your message. Try again.\"\n : connectionAccounts.accountChoiceMessage}\n </Notice>\n </div>\n ) : null}\n\n <ComputeTargetControl\n workspaceId={workspaceId}\n defaultSandboxBackend={defaultSandboxBackend}\n draft={draft}\n onChange={setDraft}\n onComputeChange={setExplicitComputeDraft}\n disabled={busy || newSessionDraft.loading}\n personalResourceAccess={{\n names: selectedPersonalResourceNames,\n visibility: createVisibility,\n }}\n fleet={fleet}\n machines={machines}\n rigs={selectableRigs}\n workspaceDefaultRigId={workspace?.defaultRigId ?? null}\n catalogRecovery={{\n error: fixedResourceCatalogError,\n refreshing: personalResourceCatalogRefreshPending,\n onRetry: () => void refreshPersonalResourceCatalogs(),\n }}\n selectedChannelId={selectedChannelId}\n selectionHistory={selectionHistory}\n />\n </div>\n\n <RecentSessions workspaceId={workspaceId} />\n <NewSessionStarters\n workspaceId={workspaceId}\n set={signupStarterSet(context.authSession?.user.email, workspace?.accountId)}\n disabled={busy || newSessionDraft.loading}\n onSelect={(prompt) => {\n setMessage(prompt);\n composerRegionRef.current?.querySelector(\"textarea\")?.focus({ preventScroll: true });\n }}\n />\n </div>\n <ChannelCreateDialog\n open={projectDialogOpen}\n name={projectNameDraft}\n busy={channelsQuery.mutating}\n onNameChange={setProjectNameDraft}\n onOpenChange={(open) => {\n setProjectDialogOpen(open);\n if (!open) setProjectNameDraft(\"\");\n }}\n onSubmit={() => void createProject()}\n />\n </div>,\n );\n}\n\n/** Send kept losing to a newer draft saved elsewhere (another tab or window). */\nconst DRAFT_CHANGED_DURING_SEND_TEXT =\n \"Your message is saved, but this draft kept changing in another tab or window. Check it and send again.\";\n\n/** A draft that didn't save: the message is kept, then what to do. */\nfunction draftSaveFailureText(draft: { conflict: Error | null; error: Error | null }): string {\n if (draft.conflict || !draft.error) return \"Your message is still here. Try again.\";\n return `Your message is still here. ${userErrorText(draft.error)}`;\n}\n\n/** A failed pre-send draft save: a brief outage shows the updating notice instead of a toast. */\nfunction reportDraftSaveFailure(draft: {\n conflict: Error | null;\n currentError: () => Error | null;\n}): void {\n const error = draft.currentError();\n if (isTransientServiceFailure(error)) return;\n toast.error(\"Couldn't save the draft\", {\n description: draftSaveFailureText({ conflict: draft.conflict, error }),\n });\n}\n\n// ── Recent sessions — the quiet main-canvas browser the rail can't be (D4.2) ──\n// A calm section below the composer: the most recent sessions as compact rows\n// (status, title, provider mark + catalog model label, relative time). Reuses\n// the rail's session list + the workspace model catalog so labels/marks match\n// the model picker — never raw wire ids as the primary display.\nfunction RecentSessions({ workspaceId }: { workspaceId: string }) {\n const { workspaceSessionListEvent } = useOpenGeni();\n const hintsAvailable =\n workspaceSessionListEvent?.workspaceId === workspaceId && workspaceSessionListEvent.available;\n const { sessions, pinned, refresh, error } = useWorkspaceSessions({\n limit: 12,\n // Top-level conversations: sub-agents open from their parent and would\n // otherwise fill this short page in a workspace that runs many of them.\n parentSessionId: null,\n pollIntervalMs: hintsAvailable ? undefined : 30_000,\n });\n useSessionListHintRefresh(refresh, error);\n const modelCatalog = useWorkspaceModelCatalog(workspaceId);\n // Pins are server-authoritative and sit above running and recency rows.\n const recent = useMemo(() => recentSessionsForHome(t, sessions, pinned, 6), [pinned, sessions]);\n\n if (recent.length === 0) {\n return null;\n }\n\n return (\n <section className=\"mt-12\">\n <h2 className=\"mb-1.5 px-0.5 text-2xs font-semibold uppercase tracking-wider text-fg\">\n Recent sessions\n </h2>\n {/* flex-col, not grid: a grid auto track grows to a nowrap row's full\n min-content width, defeating truncate and overflowing the page. */}\n <ul className=\"flex min-w-0 flex-col divide-y divide-border/60\">\n {recent.map((session) => (\n <RecentSessionRow\n key={session.id}\n workspaceId={workspaceId}\n session={session}\n catalogRows={modelCatalog.rows}\n />\n ))}\n </ul>\n </section>\n );\n}\n\nfunction RecentSessionRow({\n workspaceId,\n session,\n catalogRows,\n}: {\n workspaceId: string;\n session: Session;\n catalogRows: readonly PickerModelRow[];\n}) {\n const title = sessionDisplayTitle(session);\n const model = recentSessionModelPresentation(session.model, catalogRows);\n const repo = sessionRepoLabel(session);\n const metaBits = [model.label, repo].filter(Boolean);\n const status = recentSessionStatus(session);\n return (\n <li className=\"min-w-0\">\n <Link\n to=\"/workspaces/$workspaceId/sessions/$sessionId\"\n params={{ workspaceId, sessionId: session.id }}\n className=\"group flex items-center gap-3 rounded-md px-1 py-2.5 transition-colors hover:bg-hover\"\n >\n <StatusDot tone={status.tone} pulse={status.pulse} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm text-fg group-hover:text-fg\">{title}</span>\n {metaBits.length > 0 ? (\n <span className=\"mt-0.5 flex min-w-0 items-center gap-1.5 text-2xs text-fg-subtle\">\n <ModelMark\n model={{ id: session.model, logoUrl: model.logoUrl }}\n className=\"size-3 text-fg-muted\"\n fallback={\n <BillingClassMark\n billingClass={model.billingClass}\n className=\"size-3\"\n aria-label=\"\"\n />\n }\n />\n <span className=\"truncate\">{metaBits.join(\" · \")}</span>\n </span>\n ) : null}\n </span>\n <span className=\"shrink-0 text-2xs tabular-nums text-fg-subtle\">\n {relativeTimeLabel(t, session.updatedAt)}\n </span>\n </Link>\n </li>\n );\n}\n\n// Setup selections sit above the prompt so the footer remains an action row.\n// Repo stays out of the compute band so that band only shows when rigs /\n// machines exist. Tools and repos live under “+” at every width.\nfunction SessionSetupStrip({\n disabled,\n channels,\n selectedChannelId,\n onChannelChange,\n onCreateProject,\n}: {\n disabled: boolean;\n channels: Channel[];\n selectedChannelId: string | null;\n onChannelChange: (channelId: string | null) => void;\n onCreateProject: () => void;\n}) {\n return (\n <div className=\"flex min-w-0 items-center gap-1.5 border-b border-border/70 px-3 py-2 sm:px-4\">\n <SessionFolderPicker\n channels={channels}\n selectedChannelId={selectedChannelId}\n disabled={disabled}\n onChange={onChannelChange}\n onCreateProject={onCreateProject}\n />\n </div>\n );\n}\n\n/** Keep model policy adjacent to voice/send in the bottom action row. */\nfunction SessionModelControl({\n hasImageAttachments,\n modelCatalog,\n policyError,\n disabled,\n workspaceId,\n onPolicyChosen,\n}: {\n hasImageAttachments: boolean;\n modelCatalog: WorkspaceModelCatalogState;\n policyError: string | null;\n disabled: boolean;\n workspaceId: string;\n /** The person picked a model, reasoning level, or speed. */\n onPolicyChosen: () => void;\n}) {\n const context = useAppContext();\n return (\n <ModelPicker\n hasImageAttachments={hasImageAttachments}\n onOpenChange={(open) => {\n if (open) void modelCatalog.refresh();\n }}\n rows={modelCatalog.rows}\n model={context.model}\n effort={context.reasoningEffort}\n latencyMode={context.latencyMode}\n disabled={disabled}\n loading={modelCatalog.loading}\n error={modelCatalog.error ?? policyError}\n menuSide=\"bottom\"\n connectModelsHref={`/workspaces/${encodeURIComponent(workspaceId)}/settings?section=models`}\n onModelChange={(model) => {\n onPolicyChosen();\n context.setModel(model);\n }}\n onEffortChange={(effort) => {\n onPolicyChosen();\n context.setReasoningEffort(effort);\n }}\n onLatencyModeChange={(latencyMode) => {\n onPolicyChosen();\n context.setLatencyMode(latencyMode);\n }}\n />\n );\n}\n\nfunction SessionFolderPicker({\n channels,\n selectedChannelId,\n disabled,\n onChange,\n onCreateProject,\n}: {\n channels: Channel[];\n selectedChannelId: string | null;\n disabled: boolean;\n onChange: (channelId: string | null) => void;\n onCreateProject: () => void;\n}) {\n const selected = channels.find((channel) => channel.id === selectedChannelId) ?? null;\n const label = selected?.name ?? \"Default\";\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={disabled}\n aria-label={`Project: ${label}`}\n title={label}\n className=\"h-8 min-w-0 max-w-[12rem] shrink gap-1.5 overflow-hidden rounded-full border border-transparent px-2.5 text-xs text-fg-muted hover:border-border hover:bg-surface-2 hover:text-fg sm:shrink-0\"\n >\n <FolderIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" side=\"bottom\" sideOffset={8} className=\"w-60\">\n <DropdownMenuLabel>Save new session in</DropdownMenuLabel>\n <DropdownMenuItem onSelect={() => onChange(null)}>\n <FolderIcon />\n <span className=\"min-w-0 flex-1 truncate\">Default</span>\n <DropdownMenuCheck checked={selectedChannelId === null} />\n </DropdownMenuItem>\n {channels.map((channel) => (\n <DropdownMenuItem key={channel.id} onSelect={() => onChange(channel.id)}>\n <FolderIcon />\n <span className=\"min-w-0 flex-1 truncate\">{channel.name}</span>\n <DropdownMenuCheck checked={channel.id === selectedChannelId} />\n </DropdownMenuItem>\n ))}\n <DropdownMenuItem onSelect={onCreateProject}>\n <PlusIcon />\n New project\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction workspaceRepositoryPickerProps(\n context: ReturnType<typeof useAppContext>,\n workspaceId: string,\n disabled: boolean,\n onConnectWorkspaceApp: () => void,\n page: PageHost,\n): RepositoryContextPickerProps {\n return {\n setupMode:\n context.githubStatus?.setupMode ??\n (context.clientConfig.productAccessMode === \"managed\" ? \"platform\" : \"operator\"),\n configured: context.githubStatus?.configured === true,\n status: context.githubStatus?.status ?? (\"disabled\" as const),\n installUrl: context.githubStatus?.installUrl ?? null,\n linkUrl: context.githubStatus?.linkUrl ?? null,\n installations: context.githubStatus?.installations ?? [],\n repositories: context.githubRepos,\n personalGitHubStatus: context.personalGitHubStatus,\n personalGitHubRepositories: context.personalGitHubRepositories,\n selectedPersonalGitHubRepoIds: context.selectedPersonalGitHubRepoIds,\n selectedPersonalGitHubRepoRefs: context.selectedPersonalGitHubRepoRefs,\n personalGitHubBusy: context.personalGitHubBusy,\n groups: context.repositoryGroups,\n selectedRepoIds: context.selectedRepoIds,\n selectedRepoRefs: context.selectedRepoRefs,\n selectedInstallationId: context.selectedInstallationId,\n manualRepos: context.manualRepos,\n manualOpen: context.manualReposOpen,\n githubAppOpen: context.githubAppOpen,\n org: context.githubOrg,\n pending: context.busy || disabled,\n repoBusy: context.repoBusy,\n githubAppBusy: context.githubAppBusy,\n onRefresh: async () => {\n await Promise.all([\n context.refreshGitHub(workspaceId, undefined, { sync: true }),\n context.refreshPersonalGitHub(workspaceId),\n ]);\n },\n onConnectPersonalGitHub: () => void context.connectPersonalGitHub(workspaceId),\n onTogglePersonalGitHubRepo: (repository) =>\n void context.togglePersonalGitHubRepository(workspaceId, repository),\n onPersonalGitHubRefChange: (repositoryId: string, ref: string) =>\n context.setSelectedPersonalGitHubRepoRefs((current) => ({\n ...current,\n [repositoryId]: ref,\n })),\n onToggleRepo: context.toggleGitHubRepository,\n onRefChange: (repoId: number, ref: string) =>\n context.setSelectedRepoRefs((current) => ({ ...current, [repoId]: ref })),\n onLoadGitHubBranches: async (repository) => {\n const acceptedTransition = context.captureWorkspaceInvocation(workspaceId);\n if (!acceptedTransition) throw new Error(\"The workspace changed; refresh and try again.\");\n const { listGitHubRepositoryBranches } = await import(\"@opengeni/sdk/github-repositories\");\n const response = await listGitHubRepositoryBranches(\n context.client,\n workspaceId,\n repository.installationId,\n repository.id,\n { limit: 100 },\n );\n if (!context.ownsWorkspaceInvocation(workspaceId, acceptedTransition)) {\n throw new Error(\"The workspace changed; refresh and try again.\");\n }\n return response.branches;\n },\n onLoadPersonalGitHubBranches: async (repository) => {\n const acceptedTransition = context.captureWorkspaceInvocation(workspaceId);\n if (!acceptedTransition) throw new Error(\"The workspace changed; refresh and try again.\");\n const connectionId = context.personalGitHubStatus?.connection?.id;\n if (!connectionId) throw new Error(\"Connect your GitHub identity to load branches.\");\n const { listPersonalGitHubRepositoryBranches } =\n await import(\"@opengeni/sdk/github-repositories\");\n const response = await listPersonalGitHubRepositoryBranches(\n context.client,\n workspaceId,\n connectionId,\n repository.repositoryId,\n { limit: 100 },\n );\n if (!context.ownsWorkspaceInvocation(workspaceId, acceptedTransition)) {\n throw new Error(\"The workspace changed; refresh and try again.\");\n }\n return response.branches;\n },\n onManualOpenChange: context.setManualReposOpen,\n onManualAdd: context.addManualRepository,\n onManualUpdate: (id: number, patch: Partial<RepoDraft>) =>\n context.setManualRepos((current) =>\n current.map((repo) => (repo.id === id ? { ...repo, ...patch } : repo)),\n ),\n onManualRemove: (id: number) =>\n context.setManualRepos((current) => current.filter((repo) => repo.id !== id)),\n onManualAttach: async (repository) => {\n const acceptedTransition = context.captureWorkspaceInvocation(workspaceId);\n if (!acceptedTransition) throw new Error(\"The workspace changed; try again.\");\n const assertCurrent = () => {\n if (!context.ownsWorkspaceInvocation(workspaceId, acceptedTransition)) {\n throw new Error(\"The workspace changed; try again.\");\n }\n };\n assertCurrent();\n return await attachManualRepository({\n repository,\n workspaceRepositories: context.githubRepos,\n personalRepositories: context.personalGitHubRepositories,\n selectWorkspaceRepository: (matched, ref) => {\n assertCurrent();\n context.setSelectedRepoIds((current) => {\n const next =\n context.selectedInstallationId !== null &&\n context.selectedInstallationId !== matched.installationId\n ? new Set<number>()\n : new Set(current);\n next.add(matched.id);\n return next;\n });\n context.setSelectedRepoRefs((current) => ({\n ...current,\n [matched.id]: ref,\n }));\n context.setSelectedPersonalGitHubRepoIds(\n (current) =>\n new Set(\n [...current].filter(\n (id) =>\n context.personalGitHubRepositories\n .find((candidate) => candidate.repositoryId === id)\n ?.fullName.toLowerCase() !== matched.fullName.toLowerCase(),\n ),\n ),\n );\n },\n selectPersonalRepository: async (matched, ref) => {\n if (!(await context.ensurePersonalGitHubAuthority(workspaceId))) {\n throw new Error(\"Your GitHub identity could not be authorized for this workspace.\");\n }\n assertCurrent();\n context.setSelectedRepoIds(\n (current) =>\n new Set(\n [...current].filter(\n (id) =>\n context.githubRepos\n .find((candidate) => candidate.id === id)\n ?.fullName.toLowerCase() !== matched.fullName.toLowerCase(),\n ),\n ),\n );\n context.setSelectedPersonalGitHubRepoIds((current) =>\n new Set(current).add(matched.repositoryId),\n );\n context.setSelectedPersonalGitHubRepoRefs((current) => ({\n ...current,\n [matched.repositoryId]: ref,\n }));\n },\n verifyPublicGitHubRepository: async (request) => {\n const { verifyPublicGitHubRepositoryRef } =\n await import(\"@opengeni/sdk/github-repositories\");\n const verified = await verifyPublicGitHubRepositoryRef(\n context.client,\n workspaceId,\n request,\n );\n assertCurrent();\n return verified;\n },\n attach: (attached) => {\n assertCurrent();\n context.setManualRepos((current) =>\n current.map((candidate) => (candidate.id === attached.id ? attached : candidate)),\n );\n },\n remove: (id) => {\n assertCurrent();\n context.setManualRepos((current) => current.filter((candidate) => candidate.id !== id));\n },\n });\n },\n validationError: context.repositoryValidationError,\n onGitHubAppOpenChange: context.setGithubAppOpen,\n onOrgChange: context.setGithubOrg,\n onStartGitHubApp: () => void context.startGitHubAppManifestFlow(workspaceId),\n onConnectWorkspaceApp,\n onConfigureInstallation: (installationId: number) =>\n openGitHubInstallationSettings(context.client, workspaceId, installationId, page.assign),\n onDisconnectInstallation: async (installationId: number) => {\n await context.disconnectGitHubInstallation(workspaceId, installationId);\n },\n };\n}\n\nfunction WorkspaceRepositoryMenuBody({\n workspaceId,\n disabled,\n leading,\n catalogRefresh,\n onConnectWorkspaceApp,\n}: {\n workspaceId: string;\n disabled: boolean;\n leading?: ReactNode | undefined;\n catalogRefresh: ReturnType<typeof useRepositoryCatalogRefresh>;\n onConnectWorkspaceApp: () => void;\n}) {\n const page = usePage();\n const context = useAppContext();\n return (\n <RepositoryContextMenuBody\n {...workspaceRepositoryPickerProps(\n context,\n workspaceId,\n disabled,\n onConnectWorkspaceApp,\n page,\n )}\n {...catalogRefresh}\n {...(leading ? { leading } : {})}\n />\n );\n}\n\n// ── The promoted top-level compute target (the parent that gates the band) ────\n\ntype NewSessionPersonalResourceAccess = {\n names: string[];\n visibility: \"private\" | \"workspace\";\n};\n\ntype FixedResourceCatalogRecovery = {\n error: boolean;\n refreshing: boolean;\n onRetry: () => void;\n};\n\nfunction ComputeTargetControl(props: {\n workspaceId: string;\n defaultSandboxBackend?: SandboxBackend | undefined;\n draft: SessionDraft;\n onChange: (draft: SessionDraft) => void;\n onComputeChange: (draft: SessionDraft) => void;\n disabled: boolean;\n personalResourceAccess: NewSessionPersonalResourceAccess;\n fleet: ReturnType<typeof useWorkspaceMachines>;\n machines: MachineView[];\n rigs: Rig[];\n workspaceDefaultRigId: string | null;\n catalogRecovery: FixedResourceCatalogRecovery;\n selectedChannelId: string | null;\n selectionHistory: NewSessionSelectionHistory;\n}) {\n const { draft, onChange } = props;\n const { fleet, machines } = props;\n const selfhostedPrimary = props.defaultSandboxBackend === \"selfhosted\";\n // Managed-primary deployments keep Connected Machine opt-in and hide the\n // chooser when the fleet is empty. Selfhosted-primary deployments always show\n // the required machine path, including its honest unavailable state.\n const machineAvailabilityKey = machines\n .map((machine) => `${machine.sandboxId}:${machine.state}`)\n .join(\"\\u0000\");\n\n const selectedMachineSandboxId =\n draft.compute.kind === \"machine\" ? draft.compute.sandboxId : null;\n\n // A named machine stays selected when it disconnects or is removed. The\n // unavailable notice and submission gate require an explicit replacement.\n useEffect(() => {\n if (\n selfhostedPrimary &&\n draft.compute.kind === \"machine\" &&\n selectedMachineSandboxId === null &&\n !fleet.loading\n ) {\n const firstSelectableId = resolveSelectableMachineSandboxId(machines, null);\n if (firstSelectableId)\n onChange({\n ...draft,\n compute: {\n kind: \"machine\",\n sandboxId: firstSelectableId,\n folder: rememberedMachineFolder(\n props.selectionHistory,\n props.selectedChannelId,\n firstSelectableId,\n ),\n },\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selfhostedPrimary, fleet.loading, machineAvailabilityKey, selectedMachineSandboxId]);\n\n // A 404 means Connected Machines are off here, not a failure.\n const fleetLoadFailed =\n fleet.error != null && !(fleet.error instanceof OpenGeniApiError && fleet.error.status === 404);\n const attention = runsOnAttention({\n draft,\n machines,\n fleetLoadFailed,\n fleetLoading: fleet.loading,\n });\n\n // Where it runs is chosen under \"+\" > Runs on. Only what needs attention\n // shows under the composer: why Send waits on where it runs (with a retry\n // for a failed machine load), a catalog that couldn't be verified, and the\n // personal resources this chat will use.\n return (\n <>\n {attention ? (\n <div className=\"mt-3\">\n <RunsOnNotice\n attention={attention}\n machines={machines}\n disabled={props.disabled}\n onRetryMachines={() => void fleet.refresh()}\n connectAction={\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link\n to=\"/workspaces/$workspaceId/machines\"\n params={{ workspaceId: props.workspaceId }}\n >\n Connect a machine\n </Link>\n </Button>\n }\n />\n </div>\n ) : null}\n {props.catalogRecovery.error ? (\n <div role=\"alert\" className=\"mt-3\">\n <Notice\n tone=\"failed\"\n title=\"Couldn’t verify the selected Sandbox Environment\"\n action={\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={props.disabled || props.catalogRecovery.refreshing}\n onClick={props.catalogRecovery.onRetry}\n >\n Try again\n </Button>\n }\n >\n Try again to reload your available resources before starting this session.\n </Notice>\n </div>\n ) : null}\n <div className=\"mt-3\">\n <PersonalResourceAccessInline access={props.personalResourceAccess} />\n </div>\n </>\n );\n}\n\nfunction PersonalResourceAccessInline(props: {\n access: NewSessionPersonalResourceAccess;\n embedded?: boolean | undefined;\n}) {\n if (props.access.names.length === 0) return null;\n const content = (\n <p className=\"text-2xs text-fg-subtle\">\n {props.access.names.join(\", \")} will be available for your work in this session.\n {props.access.visibility === \"workspace\"\n ? \" Results are visible to people who can access this chat.\"\n : null}\n </p>\n );\n return props.embedded ? (\n <div className=\"border-t border-border/70 px-3 py-2.5\">{content}</div>\n ) : (\n <div className=\"px-0.5\">{content}</div>\n );\n}\n\n/** One quiet line on the new-chat page of a Personal workspace: its chats are private. */\nfunction PrivateWorkspaceNote() {\n return (\n <p className=\"mt-3 flex items-center gap-1.5 px-0.5 text-xs text-fg-muted\">\n <LockIcon aria-hidden=\"true\" className=\"size-3.5 shrink-0\" />\n Private: only you can see chats here.\n </p>\n );\n}\n"],"mappings":"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","names":[]}