@opengeni/react 6.7.0 → 6.7.1-canary.41759707569001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (758) hide show
  1. package/dist/app/app-state.js +9 -9
  2. package/dist/app/components/Composer.js +19 -19
  3. package/dist/app/components/agent/agent-capability-picker.js +6 -6
  4. package/dist/app/components/artifacts/artifact-browse-controls.js +2 -2
  5. package/dist/app/components/artifacts/artifact-library.js +13 -13
  6. package/dist/app/components/artifacts/artifact-viewer.js +21 -21
  7. package/dist/app/components/artifacts/chat-interactive-block.js +14 -14
  8. package/dist/app/components/artifacts/copy-artifact-link.js +2 -2
  9. package/dist/app/components/artifacts/file-reach-dialog.js +7 -7
  10. package/dist/app/components/artifacts/inline-chat-image.js +22 -22
  11. package/dist/app/components/artifacts/retained-file-preview.js +23 -23
  12. package/dist/app/components/artifacts/retained-text-preview.js +3 -3
  13. package/dist/app/components/artifacts/site-actions.d.ts +43 -0
  14. package/dist/app/components/artifacts/site-actions.js +38 -0
  15. package/dist/app/components/artifacts/site-audience.js +5 -5
  16. package/dist/app/components/artifacts/site-conversations.js +13 -13
  17. package/dist/app/components/artifacts/site-data.js +14 -14
  18. package/dist/app/components/artifacts/site-publishing-page.js +31 -31
  19. package/dist/app/components/artifacts/site-publishing.js +25 -25
  20. package/dist/app/components/artifacts/site-settings.js +30 -30
  21. package/dist/app/components/artifacts/site-version-menu.js +3 -3
  22. package/dist/app/components/billing-class-mark.js +3 -3
  23. package/dist/app/components/bots/bot-launch-strip.js +23 -23
  24. package/dist/app/components/bots/bot-template-dialog.js +30 -30
  25. package/dist/app/components/bots/bot-template-shortcuts.js +23 -23
  26. package/dist/app/components/bots/bot-templates-page.js +37 -37
  27. package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
  28. package/dist/app/components/capabilities/capability-logo-source.js +15 -16
  29. package/dist/app/components/capabilities/connection-ownership-selector.js +4 -4
  30. package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
  31. package/dist/app/components/capabilities/detail-dialog.js +3 -3
  32. package/dist/app/components/capabilities/native-connect-setup.js +17 -18
  33. package/dist/app/components/capabilities/native-connect-setup.js.map +1 -1
  34. package/dist/app/components/capabilities/own-logins-shared-heads-up.js +3 -3
  35. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -18
  36. package/dist/app/components/capabilities/session-capability-card.js +55 -56
  37. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  38. package/dist/app/components/capabilities/session-chrome-card.js +24 -25
  39. package/dist/app/components/capabilities/session-custom-mcp-card.js +18 -19
  40. package/dist/app/components/capabilities/session-github-card.js +18 -19
  41. package/dist/app/components/capabilities/session-machine-card.js +23 -24
  42. package/dist/app/components/capabilities/session-personal-github-card.js +16 -17
  43. package/dist/app/components/capabilities/session-plugin-card.js +9 -10
  44. package/dist/app/components/capabilities/use-connection-accounts.js +2 -2
  45. package/dist/app/components/command-menu/chat-status.js +19 -19
  46. package/dist/app/components/command-menu/chat-switcher.js +35 -35
  47. package/dist/app/components/command-menu/command-menu.js +42 -42
  48. package/dist/app/components/command-menu/shortcut-sheet.js +11 -11
  49. package/dist/app/components/composer-capabilities-menu-body.js +4 -4
  50. package/dist/app/components/composer-mobile-plus-panel.js +10 -10
  51. package/dist/app/components/composer-mobile-plus.js +3 -3
  52. package/dist/app/components/credit-required-gate.js +1 -1
  53. package/dist/app/components/credit-required-prompt.js +4 -4
  54. package/dist/app/components/credits/checkout-credits-celebration.js +3 -3
  55. package/dist/app/components/credits/checkout-return.js +3 -3
  56. package/dist/app/components/credits/credit-refusal-notice.js +2 -2
  57. package/dist/app/components/desktop/app-shots.js +6 -6
  58. package/dist/app/components/desktop/computer-use.js +2 -2
  59. package/dist/app/components/desktop/this-computer.js +5 -5
  60. package/dist/app/components/feedback.js +5 -5
  61. package/dist/app/components/github-app-connect-launcher.js +1 -1
  62. package/dist/app/components/machines/connect-machine-dialog.js +14 -14
  63. package/dist/app/components/markdown.js +7 -7
  64. package/dist/app/components/models/models-ui.js +6 -6
  65. package/dist/app/components/my-things.js +6 -6
  66. package/dist/app/components/own-where-it-works.js +5 -5
  67. package/dist/app/components/personal-resource-attachment-surface.js +4 -4
  68. package/dist/app/components/pickers.js +5 -5
  69. package/dist/app/components/rail/channel-create-dialog.js +5 -5
  70. package/dist/app/components/rail/project-glyph.js +23 -23
  71. package/dist/app/components/rail/project-profile.js +32 -32
  72. package/dist/app/components/rail/rail-context.js +1 -1
  73. package/dist/app/components/rail/rail-sections.js +69 -60
  74. package/dist/app/components/rail/session-header.js +54 -53
  75. package/dist/app/components/rail/session-list.js +67 -58
  76. package/dist/app/components/rail/session-row-content.js +4 -4
  77. package/dist/app/components/rail/session-row-hover-details.js +18 -18
  78. package/dist/app/components/rail/session-shell.js +86 -77
  79. package/dist/app/components/rail/site-session-group-heading.js +29 -12
  80. package/dist/app/components/session/agent-configuration-panel.js +14 -14
  81. package/dist/app/components/session/artifact-session-page.js +5 -5
  82. package/dist/app/components/session/banners.js +9 -9
  83. package/dist/app/components/session/console-new-conversation.js +42 -43
  84. package/dist/app/components/session/descendant-requests.js +38 -39
  85. package/dist/app/components/session/descendant-requests.js.map +1 -1
  86. package/dist/app/components/session/editable-artifacts-workspace.js +27 -27
  87. package/dist/app/components/session/failed-session-banner.js +9 -9
  88. package/dist/app/components/session/failure-recovery-boundary.js +3 -3
  89. package/dist/app/components/session/human-input-delegation-record.js +2 -2
  90. package/dist/app/components/session/human-input.js +36 -37
  91. package/dist/app/components/session/inspector.js +45 -46
  92. package/dist/app/components/session/inspector.js.map +1 -1
  93. package/dist/app/components/session/message-actions.js +5 -5
  94. package/dist/app/components/session/message-resource-attachments.js +13 -13
  95. package/dist/app/components/session/model-recovery-notice.js +3 -3
  96. package/dist/app/components/session/new-session-settings-menu.js +6 -6
  97. package/dist/app/components/session/new-session-setup-strip.js +24 -24
  98. package/dist/app/components/session/sandbox-recovery-actions.js +5 -5
  99. package/dist/app/components/session/sandbox-switcher.js +8 -8
  100. package/dist/app/components/session/sandbox-workspace.js +52 -53
  101. package/dist/app/components/session/search-markdown-highlight.js +8 -8
  102. package/dist/app/components/session/search-results-view.js +9 -9
  103. package/dist/app/components/session/session-admin-access.js +5 -5
  104. package/dist/app/components/session/session-admission-notice.js +4 -4
  105. package/dist/app/components/session/session-avatar-picker.js +24 -24
  106. package/dist/app/components/session/session-avatar.js +22 -22
  107. package/dist/app/components/session/session-machine-access-notice.js +4 -4
  108. package/dist/app/components/session/session-profile-dialog.js +29 -29
  109. package/dist/app/components/session/session-profile-editor.js +30 -30
  110. package/dist/app/components/session/session-retention.js +3 -3
  111. package/dist/app/components/session/session-search-dialog.js +11 -11
  112. package/dist/app/components/session/session-tenancy-control.js +4 -4
  113. package/dist/app/components/session/session-usage-limit-section.js +4 -4
  114. package/dist/app/components/session/share-chat-dialog.js +7 -7
  115. package/dist/app/components/session/subagents.js +12 -12
  116. package/dist/app/components/session/subscription-account-indicator.js +6 -6
  117. package/dist/app/components/settings/row-select.js +4 -4
  118. package/dist/app/components/transcription-settings.js +6 -6
  119. package/dist/app/components/ui/destructive-confirm.js +7 -7
  120. package/dist/app/components/usage/usage-entry.js +3 -3
  121. package/dist/app/components/window-bar.d.ts +3 -1
  122. package/dist/app/components/window-bar.js +13 -11
  123. package/dist/app/components/workspace-composer-plus.js +20 -21
  124. package/dist/app/components/workspace-reach.js +4 -4
  125. package/dist/app/embed/session-app.js +168 -162
  126. package/dist/app/lib/actions/actions-provider.js +9 -9
  127. package/dist/app/lib/agent-capabilities.js +3 -3
  128. package/dist/app/lib/codex-usage-query.js +2 -2
  129. package/dist/app/lib/composer-connectors.js +16 -17
  130. package/dist/app/lib/composer-send-blocking.d.ts +135 -1
  131. package/dist/app/lib/composer-send-blocking.js +30 -3
  132. package/dist/app/lib/console-site.js +2 -2
  133. package/dist/app/lib/console-text.js +2 -2
  134. package/dist/app/lib/copy-link.d.ts +2 -0
  135. package/dist/app/lib/events.js +15 -15
  136. package/dist/app/lib/failed-session-copy.js +4 -4
  137. package/dist/app/lib/model-access-onboarding.js +3 -3
  138. package/dist/app/lib/model-access.js +2 -2
  139. package/dist/app/lib/move-chat-to-machine.js +3 -3
  140. package/dist/app/lib/session-branch-cache.js +12 -12
  141. package/dist/app/lib/session-composer-readiness.d.ts +2 -2
  142. package/dist/app/lib/session-create.js +4 -4
  143. package/dist/app/lib/session-group-pagination.js +12 -12
  144. package/dist/app/lib/session-hover-facts.js +17 -17
  145. package/dist/app/lib/session-model.js +2 -2
  146. package/dist/app/lib/session-rail.js +9 -9
  147. package/dist/app/lib/session-rename.js +3 -3
  148. package/dist/app/lib/sessions-group.js +11 -11
  149. package/dist/app/lib/site-sidebar-bridge.d.ts +24 -0
  150. package/dist/app/lib/site-tool-consent-dialog.js +10 -11
  151. package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
  152. package/dist/app/lib/site-tool-consent.js +1 -1
  153. package/dist/app/lib/turn-failure-analytics.js +5 -5
  154. package/dist/app/lib/use-follow-up-repositories.js +5 -5
  155. package/dist/app/lib/use-workspace-machines.js +5 -5
  156. package/dist/app/lib/use-workspace-model-catalog.js +3 -3
  157. package/dist/app/lib/use-workspace-rigs.js +2 -2
  158. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  159. package/dist/app/lib/workspace-scope-context.js +3 -3
  160. package/dist/app/routes/artifacts.js +70 -70
  161. package/dist/app/routes/retained-artifact.js +50 -50
  162. package/dist/app/routes/session.js +98 -99
  163. package/dist/app/routes/sessions-index-hydration.js +5 -5
  164. package/dist/app/routes/sessions-index.js +85 -85
  165. package/dist/app/routes/site-view.js +174 -82
  166. package/dist/app/routes/site-view.js.map +1 -1
  167. package/dist/artifacts-document.js +4 -4
  168. package/dist/artifacts-presentation.js +4 -4
  169. package/dist/artifacts-spreadsheet.js +4 -4
  170. package/dist/artifacts.js +13 -13
  171. package/dist/automations.js +12 -12
  172. package/dist/{browser-viewer-TC27OCIP.js → browser-viewer-ZHQDVHZ2.js} +5 -5
  173. package/dist/{chat-interactive-block-RWPQBHVS.js → chat-interactive-block-VSDD6X3M.js} +5 -5
  174. package/dist/{chunk-5MOJZORA.js → chunk-2EA4IRIP.js} +34 -3
  175. package/dist/chunk-2EA4IRIP.js.map +1 -0
  176. package/dist/{chunk-C43KRXGA.js → chunk-2GCHGWNE.js} +3 -3
  177. package/dist/{chunk-XLH7QY2R.js → chunk-2J77TWGH.js} +3 -3
  178. package/dist/{chunk-Q3DPEYX4.js → chunk-2LMJXRXK.js} +7 -7
  179. package/dist/{chunk-77WAKEAH.js → chunk-2OXSB2OL.js} +2 -2
  180. package/dist/{chunk-H3T7IWNA.js → chunk-2VJOSU4H.js} +2 -2
  181. package/dist/{chunk-IMDQUHBJ.js → chunk-2ZAQA5GE.js} +6 -6
  182. package/dist/{chunk-L7YTNTIK.js → chunk-3CDJSKDW.js} +3 -3
  183. package/dist/{chunk-EWSOC6WF.js → chunk-3DRLCX5V.js} +2 -2
  184. package/dist/{chunk-JEUPAVYY.js → chunk-3L465FBR.js} +6 -6
  185. package/dist/{chunk-4SAWSRAA.js → chunk-3LTSLMVL.js} +5 -5
  186. package/dist/{chunk-5NWEKLDZ.js → chunk-3NNAC43A.js} +2 -2
  187. package/dist/{chunk-EDI6SJ2N.js → chunk-3OK7Y6ES.js} +2 -2
  188. package/dist/{chunk-AWKES45Y.js → chunk-3PM3M2Q6.js} +2 -2
  189. package/dist/{chunk-I7XIZRFD.js → chunk-3PZ3LRPV.js} +3 -3
  190. package/dist/{chunk-6BCXNDEI.js → chunk-3RGLQG6S.js} +69 -55
  191. package/dist/chunk-3RGLQG6S.js.map +1 -0
  192. package/dist/{chunk-2M3J7ZWQ.js → chunk-467WDSOK.js} +2 -2
  193. package/dist/{chunk-UTIAXH52.js → chunk-477DTTMH.js} +3 -3
  194. package/dist/{chunk-J5F5HPPW.js → chunk-4BWMAGJJ.js} +3 -3
  195. package/dist/{chunk-YSJEAAOL.js → chunk-4F3AEJI6.js} +4 -4
  196. package/dist/{chunk-LHPNABDH.js → chunk-4JXPLTWV.js} +2 -2
  197. package/dist/{chunk-NUNZS36W.js → chunk-4O2XWOLZ.js} +3 -3
  198. package/dist/{chunk-BHNSJVBC.js → chunk-4OTNYMJH.js} +5 -5
  199. package/dist/{chunk-2Z3NQNTM.js → chunk-4POXUODO.js} +15 -15
  200. package/dist/{chunk-QB2KMIDP.js → chunk-4SJAEPM2.js} +2 -2
  201. package/dist/{chunk-TAT5USZN.js → chunk-4T3NE262.js} +3 -3
  202. package/dist/{chunk-6JHU2UBS.js → chunk-4Z5X7PLC.js} +3 -3
  203. package/dist/{chunk-2STUPWEL.js → chunk-54U6ZBEX.js} +3 -3
  204. package/dist/{chunk-XXSOHN35.js → chunk-5FLYHX5R.js} +2 -2
  205. package/dist/{chunk-MIYFS2XN.js → chunk-5MHMCE2G.js} +3 -3
  206. package/dist/{chunk-YWVI6ZMK.js → chunk-5MIBQ4P5.js} +2 -2
  207. package/dist/{chunk-HAX4LCR5.js → chunk-5TKTWXAU.js} +3 -3
  208. package/dist/chunk-6B73WNLR.js +173 -0
  209. package/dist/chunk-6B73WNLR.js.map +1 -0
  210. package/dist/{chunk-F2OPHAUN.js → chunk-6HRYJERP.js} +5 -5
  211. package/dist/{chunk-5O2FCCHZ.js → chunk-6JGB4XGH.js} +3 -3
  212. package/dist/{chunk-RPVREAU7.js → chunk-736RUNIA.js} +4 -4
  213. package/dist/{chunk-2KALVELR.js → chunk-74CBR5YE.js} +3 -3
  214. package/dist/{chunk-5IE76VCY.js → chunk-752WXSDN.js} +2 -2
  215. package/dist/{chunk-SEO7TICN.js → chunk-76MC7KOE.js} +1 -1
  216. package/dist/{chunk-OPJJSKUK.js → chunk-77B6UCNK.js} +6 -6
  217. package/dist/{chunk-ZUA3JMI6.js → chunk-77SYIH6O.js} +2 -2
  218. package/dist/{chunk-ILDXWY37.js → chunk-7AI4E7PV.js} +2 -2
  219. package/dist/{chunk-7X6SDK2C.js → chunk-7HESG3ET.js} +3 -3
  220. package/dist/{chunk-2RG7NIAS.js → chunk-7MY3XB6I.js} +7 -7
  221. package/dist/{chunk-C372BFOV.js → chunk-7NLF35YL.js} +4 -4
  222. package/dist/{chunk-IFB3WJ36.js → chunk-7YTR3UFO.js} +4 -4
  223. package/dist/{chunk-BMICEQZQ.js → chunk-7Z76QP64.js} +3 -3
  224. package/dist/{chunk-YWIFM7D7.js → chunk-AAS7OWV6.js} +3 -3
  225. package/dist/{chunk-5QAY6K77.js → chunk-AB5IW227.js} +3 -3
  226. package/dist/{chunk-ZBIXBQNI.js → chunk-ABJZDRW2.js} +2 -2
  227. package/dist/{chunk-4DVJ6ONS.js → chunk-AH3DGOTK.js} +2 -2
  228. package/dist/{chunk-HGKTHF2U.js → chunk-AJBDAVX3.js} +8 -8
  229. package/dist/{chunk-HD5X76TP.js → chunk-AQQT2FIC.js} +5 -5
  230. package/dist/chunk-AQQT2FIC.js.map +1 -0
  231. package/dist/{chunk-SC6RRD2D.js → chunk-ARTEEI2E.js} +11 -2
  232. package/dist/{chunk-SC6RRD2D.js.map → chunk-ARTEEI2E.js.map} +1 -1
  233. package/dist/{chunk-IXPTECSC.js → chunk-AVXDIRRW.js} +2 -2
  234. package/dist/{chunk-QK5EFEUT.js → chunk-BASI553K.js} +4 -4
  235. package/dist/{chunk-AW2MQB37.js → chunk-BD5FMBO4.js} +2 -2
  236. package/dist/{chunk-CRU35QQH.js → chunk-BFFNINCC.js} +108 -66
  237. package/dist/chunk-BFFNINCC.js.map +1 -0
  238. package/dist/{chunk-OVKYVZMW.js → chunk-BIHGCQXA.js} +2 -2
  239. package/dist/{chunk-Z4FMAFNH.js → chunk-BQYRZIZ7.js} +2 -2
  240. package/dist/{chunk-DZWARC4M.js → chunk-BWMIWRUK.js} +3 -3
  241. package/dist/{chunk-Y4OBB2VN.js → chunk-CV4VVLPZ.js} +2 -2
  242. package/dist/{chunk-JQL7ZH6C.js → chunk-CXAN2FHF.js} +7 -7
  243. package/dist/{chunk-3PZ7JZI2.js → chunk-D3PTVN2I.js} +2 -2
  244. package/dist/{chunk-FPXASDG5.js → chunk-D5TIVCXG.js} +2 -2
  245. package/dist/{chunk-7W37NS3I.js → chunk-D74Z2N4K.js} +2 -2
  246. package/dist/{chunk-MNZG4OHU.js → chunk-DCEQCGVN.js} +2 -2
  247. package/dist/{chunk-ND2BXV3P.js → chunk-DEHLWZSI.js} +4 -4
  248. package/dist/{chunk-ZTPXACWB.js → chunk-DHIGEK6P.js} +6 -6
  249. package/dist/{chunk-2YUOVM3G.js → chunk-DIP7YALH.js} +2 -2
  250. package/dist/{chunk-6PZ7OBYU.js → chunk-DLVIRJGK.js} +4 -4
  251. package/dist/{chunk-KLEUWIMZ.js → chunk-DQPIEQGP.js} +2 -2
  252. package/dist/{chunk-T2QX3FDP.js → chunk-DWJ6J3YW.js} +4 -4
  253. package/dist/{chunk-3CPWWGNK.js → chunk-E5KOWRDU.js} +2 -2
  254. package/dist/{chunk-6WGRDRMA.js → chunk-EBIVTDEG.js} +2 -2
  255. package/dist/{chunk-5CPEEAFD.js → chunk-EDDKPIIV.js} +2 -2
  256. package/dist/{chunk-TX3VECZU.js → chunk-EGKARC53.js} +2 -2
  257. package/dist/{chunk-JEA3QDX7.js → chunk-EKJHOWTZ.js} +4 -4
  258. package/dist/{chunk-UVN5TMHU.js → chunk-ESXAECZ3.js} +2 -2
  259. package/dist/{chunk-3SOIESJM.js → chunk-EWZ2RLNG.js} +2 -2
  260. package/dist/{chunk-ORJPS5VN.js → chunk-F4GCGN7J.js} +91 -31
  261. package/dist/chunk-F4GCGN7J.js.map +1 -0
  262. package/dist/{chunk-NW53H5RW.js → chunk-F7GARVTE.js} +160 -59
  263. package/dist/chunk-F7GARVTE.js.map +1 -0
  264. package/dist/{chunk-CMKGILJK.js → chunk-FBA2NXYH.js} +4 -4
  265. package/dist/{chunk-O6N4ABCA.js → chunk-FER6EVIY.js} +2 -2
  266. package/dist/{chunk-DF5EAHDN.js → chunk-FLWQJDJ5.js} +5 -5
  267. package/dist/{chunk-PTAG4PDC.js → chunk-FNXCFIPW.js} +2 -2
  268. package/dist/chunk-FPSS23S4.js +36 -0
  269. package/dist/chunk-FPSS23S4.js.map +1 -0
  270. package/dist/{chunk-BJEJFISW.js → chunk-FSDQQQIA.js} +3 -3
  271. package/dist/{chunk-FVXBNBHO.js → chunk-FTIC5VXR.js} +6 -6
  272. package/dist/{chunk-PTF5B7TJ.js → chunk-G5UQBTXY.js} +2 -2
  273. package/dist/{chunk-4E3ZJRTZ.js → chunk-G6ICCGJ3.js} +2 -2
  274. package/dist/{chunk-5YKW2K6I.js → chunk-GB5SOTIB.js} +12 -12
  275. package/dist/{chunk-NRTE7DNV.js → chunk-GIWFLWXG.js} +4 -4
  276. package/dist/{chunk-MM4FNWI4.js → chunk-GMHIOYB7.js} +4 -4
  277. package/dist/{chunk-6DK6Z4UN.js → chunk-GOCODNQS.js} +3 -3
  278. package/dist/{chunk-TPQTRNER.js → chunk-GSCGKJNK.js} +2 -2
  279. package/dist/{chunk-7VMZGLYI.js → chunk-GTHCHCWW.js} +3 -3
  280. package/dist/{chunk-SQJIKMN3.js → chunk-GTRAH4FG.js} +2 -2
  281. package/dist/{chunk-ZYAZUPPV.js → chunk-GU7T2S5N.js} +3 -3
  282. package/dist/{chunk-JKHKLL5W.js → chunk-H6BX6WOW.js} +3 -3
  283. package/dist/{chunk-IMZCQBOT.js → chunk-H6MJFMHZ.js} +3 -3
  284. package/dist/{chunk-HSOXMJOT.js → chunk-HEGV4QMS.js} +2 -2
  285. package/dist/{chunk-JDTGRRNU.js → chunk-HGS5KMZS.js} +45 -27
  286. package/dist/chunk-HGS5KMZS.js.map +1 -0
  287. package/dist/chunk-HROITVQJ.js +85 -0
  288. package/dist/chunk-HROITVQJ.js.map +1 -0
  289. package/dist/{chunk-OF4TIKYC.js → chunk-HTMQGS63.js} +17 -9
  290. package/dist/chunk-HTMQGS63.js.map +1 -0
  291. package/dist/{chunk-NC7PVOEK.js → chunk-HWVPLFIW.js} +2 -2
  292. package/dist/{chunk-ECJBYNLJ.js → chunk-ICAMYP5M.js} +2 -2
  293. package/dist/{chunk-DJAXC5OK.js → chunk-IFSXVU2S.js} +2 -2
  294. package/dist/{chunk-N6AACDUW.js → chunk-IHLRYWA7.js} +4 -4
  295. package/dist/{chunk-I4MRDSUF.js → chunk-IJR6VOLU.js} +3 -3
  296. package/dist/{chunk-YCVD6CI3.js → chunk-IN3VQFKS.js} +2 -2
  297. package/dist/{chunk-TXLIEOJX.js → chunk-IWKHF2FN.js} +106 -75
  298. package/dist/chunk-IWKHF2FN.js.map +1 -0
  299. package/dist/{chunk-MFROMEKA.js → chunk-J2BTILRR.js} +3 -3
  300. package/dist/{chunk-NCYMNCJO.js → chunk-J2WY42FA.js} +2 -2
  301. package/dist/{chunk-DGMR6JEJ.js → chunk-J4XSTXZP.js} +2 -2
  302. package/dist/{chunk-P77WNZDY.js → chunk-JMHEFZOB.js} +2 -2
  303. package/dist/{chunk-GVN5SZLX.js → chunk-JMI53ZMU.js} +3 -3
  304. package/dist/{chunk-IDANQPRH.js → chunk-JV3UI7BH.js} +3 -3
  305. package/dist/{chunk-XEQMZB3C.js → chunk-K4DQS2ML.js} +24 -6
  306. package/dist/chunk-K4DQS2ML.js.map +1 -0
  307. package/dist/{chunk-GKVJIDHF.js → chunk-KFNZZ2N6.js} +2 -2
  308. package/dist/{chunk-I4QEJ62Y.js → chunk-KI46GKMD.js} +7 -7
  309. package/dist/{chunk-SIRLACNZ.js → chunk-KO3OHHY2.js} +3 -3
  310. package/dist/{chunk-NULUNM7H.js → chunk-KUE5BOQE.js} +5 -5
  311. package/dist/{chunk-O3LKCBP5.js → chunk-LIJNVIT3.js} +3 -3
  312. package/dist/{chunk-JWB44UGJ.js → chunk-LIJPDVYP.js} +2 -2
  313. package/dist/{chunk-BJFH6JI5.js → chunk-LN4DJOMX.js} +13 -13
  314. package/dist/{chunk-KYS77RPN.js → chunk-LPKJ77EK.js} +2 -2
  315. package/dist/{chunk-RMFKVOM7.js → chunk-LQKVNREV.js} +4 -4
  316. package/dist/{chunk-E7XERZWC.js → chunk-LTJFV2JI.js} +2 -2
  317. package/dist/{chunk-INXGSG3J.js → chunk-LVDNY5RC.js} +2 -2
  318. package/dist/{chunk-2INLDVK3.js → chunk-LVELUUK6.js} +2 -2
  319. package/dist/{chunk-5EWSRZ2Y.js → chunk-M3HGBO2Y.js} +1 -1
  320. package/dist/{chunk-J3DY5HWQ.js → chunk-M5IQVMLR.js} +4 -4
  321. package/dist/{chunk-53AGXXZM.js → chunk-MKDFYE2E.js} +2 -2
  322. package/dist/{chunk-2I7HDP53.js → chunk-MT2R57SF.js} +2 -2
  323. package/dist/{chunk-Z7Y523PS.js → chunk-MV2CLIO6.js} +6 -6
  324. package/dist/{chunk-JZ4NLCAP.js → chunk-MZY3VKKM.js} +2 -2
  325. package/dist/{chunk-YENLNISG.js → chunk-N3FM4BNA.js} +2 -2
  326. package/dist/{chunk-RQKLF42C.js → chunk-NPGLNXYI.js} +4 -4
  327. package/dist/{chunk-I5QZJODL.js → chunk-NQ2CPQJF.js} +3 -3
  328. package/dist/{chunk-6DVCC7QS.js → chunk-OBGOLHCP.js} +164 -43
  329. package/dist/chunk-OBGOLHCP.js.map +1 -0
  330. package/dist/{chunk-CUIWCGMA.js → chunk-OCXEY7HE.js} +2 -2
  331. package/dist/{chunk-KRDR5RJD.js → chunk-OGU73VUN.js} +2 -2
  332. package/dist/{chunk-YIRVLKAX.js → chunk-OI6VI6SU.js} +9 -9
  333. package/dist/{chunk-X6KAJI3V.js → chunk-OK7BQMCI.js} +9 -9
  334. package/dist/chunk-OP2GD6QW.js +166 -0
  335. package/dist/chunk-OP2GD6QW.js.map +1 -0
  336. package/dist/{chunk-TUIN4MB7.js → chunk-ORV7EFSL.js} +4 -4
  337. package/dist/{chunk-3IK6UYO6.js → chunk-OTW25A6I.js} +3 -3
  338. package/dist/{chunk-NPGISCU6.js → chunk-OWET7EY2.js} +16 -16
  339. package/dist/{chunk-3ED2U6XE.js → chunk-OYCK4JRS.js} +2 -2
  340. package/dist/{chunk-YQXTDZSU.js → chunk-OYOFPNLC.js} +4 -4
  341. package/dist/{chunk-4NQHXYMW.js → chunk-PD7NWM7V.js} +2 -2
  342. package/dist/{chunk-4YCA2Y73.js → chunk-PF2WU2IL.js} +3 -3
  343. package/dist/{chunk-Z654FWNU.js → chunk-PLYVGZIN.js} +2 -2
  344. package/dist/{chunk-MVW6HNPI.js → chunk-PRT4J2DL.js} +2 -2
  345. package/dist/{chunk-OPWCMA4D.js → chunk-PUUEI4W3.js} +6 -6
  346. package/dist/{chunk-RLBKLAEY.js → chunk-PVB4YVDP.js} +2 -2
  347. package/dist/{chunk-NXCMHIKI.js → chunk-PWUSSSSL.js} +2 -2
  348. package/dist/{chunk-MJUCFQMS.js → chunk-PYB4BFEC.js} +3 -3
  349. package/dist/{chunk-2FSBSCZJ.js → chunk-PZKHST7A.js} +2 -2
  350. package/dist/{chunk-QZAAUQRN.js → chunk-Q5EZNBPI.js} +3 -3
  351. package/dist/{chunk-ZHDFQITM.js → chunk-Q5K2J5GG.js} +2 -2
  352. package/dist/{chunk-DZXEDSQI.js → chunk-QKBFIJE7.js} +5 -5
  353. package/dist/{chunk-FZC5N55X.js → chunk-QL5NQ3JX.js} +8 -8
  354. package/dist/{chunk-7T2ZE3VT.js → chunk-QPQ7R77C.js} +8 -1
  355. package/dist/chunk-QPQ7R77C.js.map +1 -0
  356. package/dist/{chunk-OV6QJRT4.js → chunk-QRECBCJM.js} +2 -2
  357. package/dist/{chunk-3GZA4BUW.js → chunk-QURYQFDN.js} +2 -2
  358. package/dist/{chunk-I5B5L6Q4.js → chunk-QVZVUROX.js} +1 -1
  359. package/dist/{chunk-VS7AHPCZ.js → chunk-R33SBMB7.js} +3 -3
  360. package/dist/{chunk-KCBMFSMS.js → chunk-R4JA5JFI.js} +3 -3
  361. package/dist/{chunk-HC4JFZVU.js → chunk-R5QAL43H.js} +2 -2
  362. package/dist/{chunk-QPSGCC5D.js → chunk-RGR57NYY.js} +2 -2
  363. package/dist/{chunk-XWFAMUZQ.js → chunk-RHXYO4H2.js} +2 -2
  364. package/dist/{chunk-Y4BB2KS2.js → chunk-RISUROBM.js} +7 -7
  365. package/dist/{chunk-U3DN4HEY.js → chunk-RMCLFSMX.js} +2 -2
  366. package/dist/{chunk-YK7756IF.js → chunk-RTZANSSC.js} +3 -3
  367. package/dist/{chunk-ZEG4VPBL.js → chunk-S27VZ5DO.js} +6 -6
  368. package/dist/{chunk-54YW6SZZ.js → chunk-SBXSKRFA.js} +3 -3
  369. package/dist/{chunk-QIOQ2NPQ.js → chunk-SGH7I7OY.js} +2 -2
  370. package/dist/{chunk-K2A5PXQ5.js → chunk-SJYTQLN3.js} +3 -3
  371. package/dist/{chunk-X3MWB2QU.js → chunk-SN2WENRP.js} +3 -3
  372. package/dist/{chunk-OSY5K7L7.js → chunk-SP44O3OU.js} +2 -2
  373. package/dist/{chunk-OZCBM3UC.js → chunk-SSR4ZX52.js} +2 -2
  374. package/dist/{chunk-QCSJ4CWE.js → chunk-SXGJL7UT.js} +14 -14
  375. package/dist/{chunk-NC55IFN3.js → chunk-T67LTMSW.js} +10 -10
  376. package/dist/{chunk-AXHZYXUV.js → chunk-TDTD66BK.js} +2 -2
  377. package/dist/{chunk-NGJJJPZZ.js → chunk-TK5FWVZR.js} +3 -3
  378. package/dist/{chunk-YPWU5KPE.js → chunk-TKQL7EDB.js} +56 -19
  379. package/dist/chunk-TKQL7EDB.js.map +1 -0
  380. package/dist/{chunk-2OP6WLGV.js → chunk-TNSJFZ6Q.js} +4 -4
  381. package/dist/{chunk-O732GAFC.js → chunk-U4LTPFD2.js} +2 -2
  382. package/dist/{chunk-4DVNUCRR.js → chunk-U5UGM5XD.js} +6 -6
  383. package/dist/{chunk-UJK53QFL.js → chunk-UBRQ3PQD.js} +2 -2
  384. package/dist/{chunk-SODC7T6L.js → chunk-UMX6DZME.js} +2 -2
  385. package/dist/{chunk-YLS6QE5G.js → chunk-UO35OEOX.js} +4 -4
  386. package/dist/{chunk-VTTAJOQ7.js → chunk-UO3X52YM.js} +2 -2
  387. package/dist/{chunk-SHHJCL7X.js → chunk-UTRNLNCW.js} +3 -3
  388. package/dist/{chunk-HEFPPMBQ.js → chunk-UU5FBVRX.js} +2 -2
  389. package/dist/{chunk-GQXZPKK7.js → chunk-V6UOVHW3.js} +2 -2
  390. package/dist/{chunk-7TIX2UAR.js → chunk-VCJQQYRE.js} +4 -4
  391. package/dist/{chunk-6WD2INST.js → chunk-WDASYY4S.js} +7 -7
  392. package/dist/{chunk-DXBYWSL5.js → chunk-WIFDNUKD.js} +3 -3
  393. package/dist/{chunk-RT7CJMER.js → chunk-WIXHUBQN.js} +2 -2
  394. package/dist/{chunk-57AZS3IE.js → chunk-WRMUXZ7C.js} +3 -3
  395. package/dist/{chunk-CRAOSVHC.js → chunk-WSDBQSPP.js} +2 -2
  396. package/dist/{chunk-2CLNIEK4.js → chunk-WTSQUCHB.js} +3 -3
  397. package/dist/{chunk-MIHN76LX.js → chunk-WYGTAQMX.js} +3 -3
  398. package/dist/{chunk-GAVYGBFI.js → chunk-X2R73NGG.js} +2 -2
  399. package/dist/{chunk-T7OXJZCX.js → chunk-XOIDUM2H.js} +1 -1
  400. package/dist/{chunk-XHIQ5I6N.js → chunk-XVLEBB4Y.js} +2 -2
  401. package/dist/{chunk-T3OWFVMS.js → chunk-Y3XZEKDQ.js} +2 -2
  402. package/dist/{chunk-ROKQU7WG.js → chunk-YMI27QPF.js} +2 -2
  403. package/dist/{chunk-U7XM7CB4.js → chunk-YNTLWCF4.js} +4 -4
  404. package/dist/{chunk-ZQCND77P.js → chunk-YRYF76OE.js} +2 -2
  405. package/dist/{chunk-2BDT3UZQ.js → chunk-ZAX4XQLN.js} +3 -3
  406. package/dist/{chunk-DXR5PDFP.js → chunk-ZBHGNE2J.js} +3 -3
  407. package/dist/{chunk-KODELWYT.js → chunk-ZF6ZS77B.js} +3 -3
  408. package/dist/{chunk-KUDGXAF7.js → chunk-ZM5YP5NJ.js} +10 -10
  409. package/dist/{chunk-I7ITSXSJ.js → chunk-ZR5EKJT6.js} +2 -2
  410. package/dist/{chunk-IZXHMZQ6.js → chunk-ZW5YTIH3.js} +4 -4
  411. package/dist/components/artifacts/artifact-sandbox.d.ts +6 -1
  412. package/dist/components/artifacts/site-view.d.ts +4 -2
  413. package/dist/components/timeline-anchor.d.ts +8 -3
  414. package/dist/components/timeline-reading-progress.d.ts +1 -1
  415. package/dist/components/timeline-settlement.d.ts +1 -1
  416. package/dist/composer-messages.js +2 -2
  417. package/dist/composer.js +9 -9
  418. package/dist/{computer-viewer-TDDO25AV.js → computer-viewer-5LKRCEVQ.js} +5 -5
  419. package/dist/connect.js +14 -15
  420. package/dist/desktop-dictation.js +7 -7
  421. package/dist/desktop.js +2 -2
  422. package/dist/editor.js +2 -2
  423. package/dist/{embedded-new-voice-2G3VLPVQ.js → embedded-new-voice-GHJRY3YL.js} +5 -5
  424. package/dist/{embedded-voice-T5IWOWGD.js → embedded-voice-ASQXBSTX.js} +5 -5
  425. package/dist/{fleet-decision-row-WM64KXP3.js → fleet-decision-row-U7LDVBEM.js} +2 -2
  426. package/dist/in-chat-connect-model.js +6 -6
  427. package/dist/index.js +53 -54
  428. package/dist/interaction.js +6 -6
  429. package/dist/{latest-question-OX56OVQ5.js → latest-question-RNVF262Q.js} +5 -5
  430. package/dist/lib/format.d.ts +10 -0
  431. package/dist/machines.js +4 -4
  432. package/dist/meetings-recorder.js +1 -1
  433. package/dist/meetings.js +24 -24
  434. package/dist/messages/en.d.ts +7 -0
  435. package/dist/messages.js +1 -1
  436. package/dist/{model-policy-picker-menu-SMC6J6QN.js → model-policy-picker-menu-E6XKMFTA.js} +4 -4
  437. package/dist/{payment-page-card-G4U63KUV.js → payment-page-card-DJDKV2LW.js} +6 -5
  438. package/dist/{payment-page-card-G4U63KUV.js.map → payment-page-card-DJDKV2LW.js.map} +1 -1
  439. package/dist/{platform-activity-row-BUZGZAKZ.js → platform-activity-row-MSDCSMET.js} +17 -7
  440. package/dist/platform-activity-row-MSDCSMET.js.map +1 -0
  441. package/dist/{queue-surface-implementation-4KUZ4PJV.js → queue-surface-implementation-GUAIG6TK.js} +5 -5
  442. package/dist/realtime.js +4 -4
  443. package/dist/{recorder-host-WF2RRR56.js → recorder-host-2MYDJPQW.js} +4 -4
  444. package/dist/recordings.js +3 -3
  445. package/dist/{sandbox-files-ESDMOFSD.js → sandbox-files-W5W2LW4K.js} +6 -6
  446. package/dist/session-app.js +168 -162
  447. package/dist/{session-connect-cards-Q53KMMYY.js → session-connect-cards-TUY62MVP.js} +10 -11
  448. package/dist/session-list-model.js +2 -2
  449. package/dist/{session-realtime-CF3I35WJ.js → session-realtime-SDTKFFIR.js} +3 -3
  450. package/dist/session-realtime-SDTKFFIR.js.map +1 -0
  451. package/dist/session-realtime.js +2 -2
  452. package/dist/session-ui.js +36 -37
  453. package/dist/session.js +9 -9
  454. package/dist/sites.js +2 -2
  455. package/dist/terminal.js +2 -2
  456. package/dist/this-computer.js +3 -3
  457. package/dist/timeline/shared.d.ts +2 -0
  458. package/dist/{timeline-annotation-markers-CJK4RYZ4.js → timeline-annotation-markers-FNILLWNU.js} +2 -2
  459. package/dist/{timeline-annotation-selection-67GF5H26.js → timeline-annotation-selection-MBCIDO2Q.js} +2 -2
  460. package/dist/{timeline-annotations-dialog-ONJPQDJQ.js → timeline-annotations-dialog-JPNKLOTE.js} +3 -3
  461. package/dist/timeline-model.js +6 -6
  462. package/dist/ui/access-list.js +6 -6
  463. package/dist/ui/cadence-picker.js +4 -4
  464. package/dist/ui/choice-cards.js +3 -3
  465. package/dist/ui/confirm-dialog.js +4 -4
  466. package/dist/ui/copy-field.js +3 -3
  467. package/dist/ui/detail-page.js +5 -5
  468. package/dist/ui/detail-sheet.js +4 -4
  469. package/dist/ui/dialog.js +2 -2
  470. package/dist/ui/disclosure.js +5 -5
  471. package/dist/ui/email-chips-input.js +3 -3
  472. package/dist/ui/field.js +2 -2
  473. package/dist/ui/flush-form-page.js +4 -4
  474. package/dist/ui/form-dialog.js +3 -3
  475. package/dist/ui/list-row.js +3 -3
  476. package/dist/ui/page-header.js +2 -2
  477. package/dist/ui/relative-time.js +2 -2
  478. package/dist/ui/revision-history.js +4 -4
  479. package/dist/ui/role-select.js +6 -6
  480. package/dist/ui/select-menu.js +3 -3
  481. package/dist/ui/sheet.js +2 -2
  482. package/dist/ui/usage-meter.js +3 -3
  483. package/dist/ui/window-bar-title.d.ts +7 -3
  484. package/dist/ui/window-bar-title.js +1 -1
  485. package/dist/usage.js +2 -2
  486. package/dist/workbench.js +4 -4
  487. package/package.json +6 -5
  488. package/src/app/components/artifacts/site-actions.tsx +105 -0
  489. package/src/app/components/rail/session-header-copy.test.tsx +172 -0
  490. package/src/app/components/rail/session-header.tsx +68 -12
  491. package/src/app/components/rail/session-list.tsx +20 -0
  492. package/src/app/components/rail/site-session-group-heading.test.tsx +210 -0
  493. package/src/app/components/rail/site-session-group-heading.tsx +119 -60
  494. package/src/app/components/session/failed-session-actions.test.tsx +4 -0
  495. package/src/app/components/window-bar.tsx +63 -15
  496. package/src/app/lib/composer-send-blocking.tsx +312 -1
  497. package/src/app/lib/copy-link.ts +10 -0
  498. package/src/app/lib/session-composer-readiness.ts +4 -3
  499. package/src/app/lib/site-sidebar-bridge.test.tsx +67 -0
  500. package/src/app/lib/site-sidebar-bridge.ts +57 -0
  501. package/src/app/routes/session.tsx +45 -12
  502. package/src/app/routes/sessions-index.tsx +164 -105
  503. package/src/app/routes/site-view.test.tsx +74 -6
  504. package/src/app/routes/site-view.tsx +135 -14
  505. package/src/components/approval-surface.tsx +78 -3
  506. package/src/components/artifacts/artifact-sandbox.tsx +27 -2
  507. package/src/components/artifacts/site-view.tsx +13 -1
  508. package/src/components/message-timeline.tsx +25 -52
  509. package/src/components/session-capability-frame.tsx +2 -30
  510. package/src/components/timeline-anchor.tsx +19 -14
  511. package/src/components/timeline-reading-progress.ts +1 -2
  512. package/src/components/timeline-settlement.ts +3 -3
  513. package/src/lib/format.ts +46 -1
  514. package/src/messages/en.ts +11 -0
  515. package/src/timeline/platform-activity-row.tsx +20 -8
  516. package/src/timeline/shared.tsx +203 -32
  517. package/src/ui/window-bar-title.test.tsx +37 -0
  518. package/src/ui/window-bar-title.tsx +13 -6
  519. package/styles/compiled.css +5 -0
  520. package/dist/chunk-5MOJZORA.js.map +0 -1
  521. package/dist/chunk-6BCXNDEI.js.map +0 -1
  522. package/dist/chunk-6DVCC7QS.js.map +0 -1
  523. package/dist/chunk-7T2ZE3VT.js.map +0 -1
  524. package/dist/chunk-AFRGP2VP.js +0 -17
  525. package/dist/chunk-AFRGP2VP.js.map +0 -1
  526. package/dist/chunk-CRU35QQH.js.map +0 -1
  527. package/dist/chunk-FO4LYKJL.js +0 -197
  528. package/dist/chunk-FO4LYKJL.js.map +0 -1
  529. package/dist/chunk-HD5X76TP.js.map +0 -1
  530. package/dist/chunk-JDTGRRNU.js.map +0 -1
  531. package/dist/chunk-NW53H5RW.js.map +0 -1
  532. package/dist/chunk-OF4TIKYC.js.map +0 -1
  533. package/dist/chunk-ORJPS5VN.js.map +0 -1
  534. package/dist/chunk-TXLIEOJX.js.map +0 -1
  535. package/dist/chunk-VBUVBHFJ.js +0 -16
  536. package/dist/chunk-VBUVBHFJ.js.map +0 -1
  537. package/dist/chunk-XEQMZB3C.js.map +0 -1
  538. package/dist/chunk-YPWU5KPE.js.map +0 -1
  539. package/dist/components/timeline-answer-follow.d.ts +0 -8
  540. package/dist/platform-activity-row-BUZGZAKZ.js.map +0 -1
  541. package/src/components/timeline-answer-follow.ts +0 -15
  542. /package/dist/{browser-viewer-TC27OCIP.js.map → app/components/artifacts/site-actions.js.map} +0 -0
  543. /package/dist/{chat-interactive-block-RWPQBHVS.js.map → browser-viewer-ZHQDVHZ2.js.map} +0 -0
  544. /package/dist/{computer-viewer-TDDO25AV.js.map → chat-interactive-block-VSDD6X3M.js.map} +0 -0
  545. /package/dist/{chunk-C43KRXGA.js.map → chunk-2GCHGWNE.js.map} +0 -0
  546. /package/dist/{chunk-XLH7QY2R.js.map → chunk-2J77TWGH.js.map} +0 -0
  547. /package/dist/{chunk-Q3DPEYX4.js.map → chunk-2LMJXRXK.js.map} +0 -0
  548. /package/dist/{chunk-77WAKEAH.js.map → chunk-2OXSB2OL.js.map} +0 -0
  549. /package/dist/{chunk-H3T7IWNA.js.map → chunk-2VJOSU4H.js.map} +0 -0
  550. /package/dist/{chunk-IMDQUHBJ.js.map → chunk-2ZAQA5GE.js.map} +0 -0
  551. /package/dist/{chunk-L7YTNTIK.js.map → chunk-3CDJSKDW.js.map} +0 -0
  552. /package/dist/{chunk-EWSOC6WF.js.map → chunk-3DRLCX5V.js.map} +0 -0
  553. /package/dist/{chunk-JEUPAVYY.js.map → chunk-3L465FBR.js.map} +0 -0
  554. /package/dist/{chunk-4SAWSRAA.js.map → chunk-3LTSLMVL.js.map} +0 -0
  555. /package/dist/{chunk-5NWEKLDZ.js.map → chunk-3NNAC43A.js.map} +0 -0
  556. /package/dist/{chunk-EDI6SJ2N.js.map → chunk-3OK7Y6ES.js.map} +0 -0
  557. /package/dist/{chunk-AWKES45Y.js.map → chunk-3PM3M2Q6.js.map} +0 -0
  558. /package/dist/{chunk-I7XIZRFD.js.map → chunk-3PZ3LRPV.js.map} +0 -0
  559. /package/dist/{chunk-2M3J7ZWQ.js.map → chunk-467WDSOK.js.map} +0 -0
  560. /package/dist/{chunk-UTIAXH52.js.map → chunk-477DTTMH.js.map} +0 -0
  561. /package/dist/{chunk-J5F5HPPW.js.map → chunk-4BWMAGJJ.js.map} +0 -0
  562. /package/dist/{chunk-YSJEAAOL.js.map → chunk-4F3AEJI6.js.map} +0 -0
  563. /package/dist/{chunk-LHPNABDH.js.map → chunk-4JXPLTWV.js.map} +0 -0
  564. /package/dist/{chunk-NUNZS36W.js.map → chunk-4O2XWOLZ.js.map} +0 -0
  565. /package/dist/{chunk-BHNSJVBC.js.map → chunk-4OTNYMJH.js.map} +0 -0
  566. /package/dist/{chunk-2Z3NQNTM.js.map → chunk-4POXUODO.js.map} +0 -0
  567. /package/dist/{chunk-QB2KMIDP.js.map → chunk-4SJAEPM2.js.map} +0 -0
  568. /package/dist/{chunk-TAT5USZN.js.map → chunk-4T3NE262.js.map} +0 -0
  569. /package/dist/{chunk-6JHU2UBS.js.map → chunk-4Z5X7PLC.js.map} +0 -0
  570. /package/dist/{chunk-2STUPWEL.js.map → chunk-54U6ZBEX.js.map} +0 -0
  571. /package/dist/{chunk-XXSOHN35.js.map → chunk-5FLYHX5R.js.map} +0 -0
  572. /package/dist/{chunk-MIYFS2XN.js.map → chunk-5MHMCE2G.js.map} +0 -0
  573. /package/dist/{chunk-YWVI6ZMK.js.map → chunk-5MIBQ4P5.js.map} +0 -0
  574. /package/dist/{chunk-HAX4LCR5.js.map → chunk-5TKTWXAU.js.map} +0 -0
  575. /package/dist/{chunk-F2OPHAUN.js.map → chunk-6HRYJERP.js.map} +0 -0
  576. /package/dist/{chunk-5O2FCCHZ.js.map → chunk-6JGB4XGH.js.map} +0 -0
  577. /package/dist/{chunk-RPVREAU7.js.map → chunk-736RUNIA.js.map} +0 -0
  578. /package/dist/{chunk-2KALVELR.js.map → chunk-74CBR5YE.js.map} +0 -0
  579. /package/dist/{chunk-5IE76VCY.js.map → chunk-752WXSDN.js.map} +0 -0
  580. /package/dist/{chunk-SEO7TICN.js.map → chunk-76MC7KOE.js.map} +0 -0
  581. /package/dist/{chunk-OPJJSKUK.js.map → chunk-77B6UCNK.js.map} +0 -0
  582. /package/dist/{chunk-ZUA3JMI6.js.map → chunk-77SYIH6O.js.map} +0 -0
  583. /package/dist/{chunk-ILDXWY37.js.map → chunk-7AI4E7PV.js.map} +0 -0
  584. /package/dist/{chunk-7X6SDK2C.js.map → chunk-7HESG3ET.js.map} +0 -0
  585. /package/dist/{chunk-2RG7NIAS.js.map → chunk-7MY3XB6I.js.map} +0 -0
  586. /package/dist/{chunk-C372BFOV.js.map → chunk-7NLF35YL.js.map} +0 -0
  587. /package/dist/{chunk-IFB3WJ36.js.map → chunk-7YTR3UFO.js.map} +0 -0
  588. /package/dist/{chunk-BMICEQZQ.js.map → chunk-7Z76QP64.js.map} +0 -0
  589. /package/dist/{chunk-YWIFM7D7.js.map → chunk-AAS7OWV6.js.map} +0 -0
  590. /package/dist/{chunk-5QAY6K77.js.map → chunk-AB5IW227.js.map} +0 -0
  591. /package/dist/{chunk-ZBIXBQNI.js.map → chunk-ABJZDRW2.js.map} +0 -0
  592. /package/dist/{chunk-4DVJ6ONS.js.map → chunk-AH3DGOTK.js.map} +0 -0
  593. /package/dist/{chunk-HGKTHF2U.js.map → chunk-AJBDAVX3.js.map} +0 -0
  594. /package/dist/{chunk-IXPTECSC.js.map → chunk-AVXDIRRW.js.map} +0 -0
  595. /package/dist/{chunk-QK5EFEUT.js.map → chunk-BASI553K.js.map} +0 -0
  596. /package/dist/{chunk-AW2MQB37.js.map → chunk-BD5FMBO4.js.map} +0 -0
  597. /package/dist/{chunk-OVKYVZMW.js.map → chunk-BIHGCQXA.js.map} +0 -0
  598. /package/dist/{chunk-Z4FMAFNH.js.map → chunk-BQYRZIZ7.js.map} +0 -0
  599. /package/dist/{chunk-DZWARC4M.js.map → chunk-BWMIWRUK.js.map} +0 -0
  600. /package/dist/{chunk-Y4OBB2VN.js.map → chunk-CV4VVLPZ.js.map} +0 -0
  601. /package/dist/{chunk-JQL7ZH6C.js.map → chunk-CXAN2FHF.js.map} +0 -0
  602. /package/dist/{chunk-3PZ7JZI2.js.map → chunk-D3PTVN2I.js.map} +0 -0
  603. /package/dist/{chunk-FPXASDG5.js.map → chunk-D5TIVCXG.js.map} +0 -0
  604. /package/dist/{chunk-7W37NS3I.js.map → chunk-D74Z2N4K.js.map} +0 -0
  605. /package/dist/{chunk-MNZG4OHU.js.map → chunk-DCEQCGVN.js.map} +0 -0
  606. /package/dist/{chunk-ND2BXV3P.js.map → chunk-DEHLWZSI.js.map} +0 -0
  607. /package/dist/{chunk-ZTPXACWB.js.map → chunk-DHIGEK6P.js.map} +0 -0
  608. /package/dist/{chunk-2YUOVM3G.js.map → chunk-DIP7YALH.js.map} +0 -0
  609. /package/dist/{chunk-6PZ7OBYU.js.map → chunk-DLVIRJGK.js.map} +0 -0
  610. /package/dist/{chunk-KLEUWIMZ.js.map → chunk-DQPIEQGP.js.map} +0 -0
  611. /package/dist/{chunk-T2QX3FDP.js.map → chunk-DWJ6J3YW.js.map} +0 -0
  612. /package/dist/{chunk-3CPWWGNK.js.map → chunk-E5KOWRDU.js.map} +0 -0
  613. /package/dist/{chunk-6WGRDRMA.js.map → chunk-EBIVTDEG.js.map} +0 -0
  614. /package/dist/{chunk-5CPEEAFD.js.map → chunk-EDDKPIIV.js.map} +0 -0
  615. /package/dist/{chunk-TX3VECZU.js.map → chunk-EGKARC53.js.map} +0 -0
  616. /package/dist/{chunk-JEA3QDX7.js.map → chunk-EKJHOWTZ.js.map} +0 -0
  617. /package/dist/{chunk-UVN5TMHU.js.map → chunk-ESXAECZ3.js.map} +0 -0
  618. /package/dist/{chunk-3SOIESJM.js.map → chunk-EWZ2RLNG.js.map} +0 -0
  619. /package/dist/{chunk-CMKGILJK.js.map → chunk-FBA2NXYH.js.map} +0 -0
  620. /package/dist/{chunk-O6N4ABCA.js.map → chunk-FER6EVIY.js.map} +0 -0
  621. /package/dist/{chunk-DF5EAHDN.js.map → chunk-FLWQJDJ5.js.map} +0 -0
  622. /package/dist/{chunk-PTAG4PDC.js.map → chunk-FNXCFIPW.js.map} +0 -0
  623. /package/dist/{chunk-BJEJFISW.js.map → chunk-FSDQQQIA.js.map} +0 -0
  624. /package/dist/{chunk-FVXBNBHO.js.map → chunk-FTIC5VXR.js.map} +0 -0
  625. /package/dist/{chunk-PTF5B7TJ.js.map → chunk-G5UQBTXY.js.map} +0 -0
  626. /package/dist/{chunk-4E3ZJRTZ.js.map → chunk-G6ICCGJ3.js.map} +0 -0
  627. /package/dist/{chunk-5YKW2K6I.js.map → chunk-GB5SOTIB.js.map} +0 -0
  628. /package/dist/{chunk-NRTE7DNV.js.map → chunk-GIWFLWXG.js.map} +0 -0
  629. /package/dist/{chunk-MM4FNWI4.js.map → chunk-GMHIOYB7.js.map} +0 -0
  630. /package/dist/{chunk-6DK6Z4UN.js.map → chunk-GOCODNQS.js.map} +0 -0
  631. /package/dist/{chunk-TPQTRNER.js.map → chunk-GSCGKJNK.js.map} +0 -0
  632. /package/dist/{chunk-7VMZGLYI.js.map → chunk-GTHCHCWW.js.map} +0 -0
  633. /package/dist/{chunk-SQJIKMN3.js.map → chunk-GTRAH4FG.js.map} +0 -0
  634. /package/dist/{chunk-ZYAZUPPV.js.map → chunk-GU7T2S5N.js.map} +0 -0
  635. /package/dist/{chunk-JKHKLL5W.js.map → chunk-H6BX6WOW.js.map} +0 -0
  636. /package/dist/{chunk-IMZCQBOT.js.map → chunk-H6MJFMHZ.js.map} +0 -0
  637. /package/dist/{chunk-HSOXMJOT.js.map → chunk-HEGV4QMS.js.map} +0 -0
  638. /package/dist/{chunk-NC7PVOEK.js.map → chunk-HWVPLFIW.js.map} +0 -0
  639. /package/dist/{chunk-ECJBYNLJ.js.map → chunk-ICAMYP5M.js.map} +0 -0
  640. /package/dist/{chunk-DJAXC5OK.js.map → chunk-IFSXVU2S.js.map} +0 -0
  641. /package/dist/{chunk-N6AACDUW.js.map → chunk-IHLRYWA7.js.map} +0 -0
  642. /package/dist/{chunk-I4MRDSUF.js.map → chunk-IJR6VOLU.js.map} +0 -0
  643. /package/dist/{chunk-YCVD6CI3.js.map → chunk-IN3VQFKS.js.map} +0 -0
  644. /package/dist/{chunk-MFROMEKA.js.map → chunk-J2BTILRR.js.map} +0 -0
  645. /package/dist/{chunk-NCYMNCJO.js.map → chunk-J2WY42FA.js.map} +0 -0
  646. /package/dist/{chunk-DGMR6JEJ.js.map → chunk-J4XSTXZP.js.map} +0 -0
  647. /package/dist/{chunk-P77WNZDY.js.map → chunk-JMHEFZOB.js.map} +0 -0
  648. /package/dist/{chunk-GVN5SZLX.js.map → chunk-JMI53ZMU.js.map} +0 -0
  649. /package/dist/{chunk-IDANQPRH.js.map → chunk-JV3UI7BH.js.map} +0 -0
  650. /package/dist/{chunk-GKVJIDHF.js.map → chunk-KFNZZ2N6.js.map} +0 -0
  651. /package/dist/{chunk-I4QEJ62Y.js.map → chunk-KI46GKMD.js.map} +0 -0
  652. /package/dist/{chunk-SIRLACNZ.js.map → chunk-KO3OHHY2.js.map} +0 -0
  653. /package/dist/{chunk-NULUNM7H.js.map → chunk-KUE5BOQE.js.map} +0 -0
  654. /package/dist/{chunk-O3LKCBP5.js.map → chunk-LIJNVIT3.js.map} +0 -0
  655. /package/dist/{chunk-JWB44UGJ.js.map → chunk-LIJPDVYP.js.map} +0 -0
  656. /package/dist/{chunk-BJFH6JI5.js.map → chunk-LN4DJOMX.js.map} +0 -0
  657. /package/dist/{chunk-KYS77RPN.js.map → chunk-LPKJ77EK.js.map} +0 -0
  658. /package/dist/{chunk-RMFKVOM7.js.map → chunk-LQKVNREV.js.map} +0 -0
  659. /package/dist/{chunk-E7XERZWC.js.map → chunk-LTJFV2JI.js.map} +0 -0
  660. /package/dist/{chunk-INXGSG3J.js.map → chunk-LVDNY5RC.js.map} +0 -0
  661. /package/dist/{chunk-2INLDVK3.js.map → chunk-LVELUUK6.js.map} +0 -0
  662. /package/dist/{chunk-5EWSRZ2Y.js.map → chunk-M3HGBO2Y.js.map} +0 -0
  663. /package/dist/{chunk-J3DY5HWQ.js.map → chunk-M5IQVMLR.js.map} +0 -0
  664. /package/dist/{chunk-53AGXXZM.js.map → chunk-MKDFYE2E.js.map} +0 -0
  665. /package/dist/{chunk-2I7HDP53.js.map → chunk-MT2R57SF.js.map} +0 -0
  666. /package/dist/{chunk-Z7Y523PS.js.map → chunk-MV2CLIO6.js.map} +0 -0
  667. /package/dist/{chunk-JZ4NLCAP.js.map → chunk-MZY3VKKM.js.map} +0 -0
  668. /package/dist/{chunk-YENLNISG.js.map → chunk-N3FM4BNA.js.map} +0 -0
  669. /package/dist/{chunk-RQKLF42C.js.map → chunk-NPGLNXYI.js.map} +0 -0
  670. /package/dist/{chunk-I5QZJODL.js.map → chunk-NQ2CPQJF.js.map} +0 -0
  671. /package/dist/{chunk-CUIWCGMA.js.map → chunk-OCXEY7HE.js.map} +0 -0
  672. /package/dist/{chunk-KRDR5RJD.js.map → chunk-OGU73VUN.js.map} +0 -0
  673. /package/dist/{chunk-YIRVLKAX.js.map → chunk-OI6VI6SU.js.map} +0 -0
  674. /package/dist/{chunk-X6KAJI3V.js.map → chunk-OK7BQMCI.js.map} +0 -0
  675. /package/dist/{chunk-TUIN4MB7.js.map → chunk-ORV7EFSL.js.map} +0 -0
  676. /package/dist/{chunk-3IK6UYO6.js.map → chunk-OTW25A6I.js.map} +0 -0
  677. /package/dist/{chunk-NPGISCU6.js.map → chunk-OWET7EY2.js.map} +0 -0
  678. /package/dist/{chunk-3ED2U6XE.js.map → chunk-OYCK4JRS.js.map} +0 -0
  679. /package/dist/{chunk-YQXTDZSU.js.map → chunk-OYOFPNLC.js.map} +0 -0
  680. /package/dist/{chunk-4NQHXYMW.js.map → chunk-PD7NWM7V.js.map} +0 -0
  681. /package/dist/{chunk-4YCA2Y73.js.map → chunk-PF2WU2IL.js.map} +0 -0
  682. /package/dist/{chunk-Z654FWNU.js.map → chunk-PLYVGZIN.js.map} +0 -0
  683. /package/dist/{chunk-MVW6HNPI.js.map → chunk-PRT4J2DL.js.map} +0 -0
  684. /package/dist/{chunk-OPWCMA4D.js.map → chunk-PUUEI4W3.js.map} +0 -0
  685. /package/dist/{chunk-RLBKLAEY.js.map → chunk-PVB4YVDP.js.map} +0 -0
  686. /package/dist/{chunk-NXCMHIKI.js.map → chunk-PWUSSSSL.js.map} +0 -0
  687. /package/dist/{chunk-MJUCFQMS.js.map → chunk-PYB4BFEC.js.map} +0 -0
  688. /package/dist/{chunk-2FSBSCZJ.js.map → chunk-PZKHST7A.js.map} +0 -0
  689. /package/dist/{chunk-QZAAUQRN.js.map → chunk-Q5EZNBPI.js.map} +0 -0
  690. /package/dist/{chunk-ZHDFQITM.js.map → chunk-Q5K2J5GG.js.map} +0 -0
  691. /package/dist/{chunk-DZXEDSQI.js.map → chunk-QKBFIJE7.js.map} +0 -0
  692. /package/dist/{chunk-FZC5N55X.js.map → chunk-QL5NQ3JX.js.map} +0 -0
  693. /package/dist/{chunk-OV6QJRT4.js.map → chunk-QRECBCJM.js.map} +0 -0
  694. /package/dist/{chunk-3GZA4BUW.js.map → chunk-QURYQFDN.js.map} +0 -0
  695. /package/dist/{chunk-I5B5L6Q4.js.map → chunk-QVZVUROX.js.map} +0 -0
  696. /package/dist/{chunk-VS7AHPCZ.js.map → chunk-R33SBMB7.js.map} +0 -0
  697. /package/dist/{chunk-KCBMFSMS.js.map → chunk-R4JA5JFI.js.map} +0 -0
  698. /package/dist/{chunk-HC4JFZVU.js.map → chunk-R5QAL43H.js.map} +0 -0
  699. /package/dist/{chunk-QPSGCC5D.js.map → chunk-RGR57NYY.js.map} +0 -0
  700. /package/dist/{chunk-XWFAMUZQ.js.map → chunk-RHXYO4H2.js.map} +0 -0
  701. /package/dist/{chunk-Y4BB2KS2.js.map → chunk-RISUROBM.js.map} +0 -0
  702. /package/dist/{chunk-U3DN4HEY.js.map → chunk-RMCLFSMX.js.map} +0 -0
  703. /package/dist/{chunk-YK7756IF.js.map → chunk-RTZANSSC.js.map} +0 -0
  704. /package/dist/{chunk-ZEG4VPBL.js.map → chunk-S27VZ5DO.js.map} +0 -0
  705. /package/dist/{chunk-54YW6SZZ.js.map → chunk-SBXSKRFA.js.map} +0 -0
  706. /package/dist/{chunk-QIOQ2NPQ.js.map → chunk-SGH7I7OY.js.map} +0 -0
  707. /package/dist/{chunk-K2A5PXQ5.js.map → chunk-SJYTQLN3.js.map} +0 -0
  708. /package/dist/{chunk-X3MWB2QU.js.map → chunk-SN2WENRP.js.map} +0 -0
  709. /package/dist/{chunk-OSY5K7L7.js.map → chunk-SP44O3OU.js.map} +0 -0
  710. /package/dist/{chunk-OZCBM3UC.js.map → chunk-SSR4ZX52.js.map} +0 -0
  711. /package/dist/{chunk-QCSJ4CWE.js.map → chunk-SXGJL7UT.js.map} +0 -0
  712. /package/dist/{chunk-NC55IFN3.js.map → chunk-T67LTMSW.js.map} +0 -0
  713. /package/dist/{chunk-AXHZYXUV.js.map → chunk-TDTD66BK.js.map} +0 -0
  714. /package/dist/{chunk-NGJJJPZZ.js.map → chunk-TK5FWVZR.js.map} +0 -0
  715. /package/dist/{chunk-2OP6WLGV.js.map → chunk-TNSJFZ6Q.js.map} +0 -0
  716. /package/dist/{chunk-O732GAFC.js.map → chunk-U4LTPFD2.js.map} +0 -0
  717. /package/dist/{chunk-4DVNUCRR.js.map → chunk-U5UGM5XD.js.map} +0 -0
  718. /package/dist/{chunk-UJK53QFL.js.map → chunk-UBRQ3PQD.js.map} +0 -0
  719. /package/dist/{chunk-SODC7T6L.js.map → chunk-UMX6DZME.js.map} +0 -0
  720. /package/dist/{chunk-YLS6QE5G.js.map → chunk-UO35OEOX.js.map} +0 -0
  721. /package/dist/{chunk-VTTAJOQ7.js.map → chunk-UO3X52YM.js.map} +0 -0
  722. /package/dist/{chunk-SHHJCL7X.js.map → chunk-UTRNLNCW.js.map} +0 -0
  723. /package/dist/{chunk-HEFPPMBQ.js.map → chunk-UU5FBVRX.js.map} +0 -0
  724. /package/dist/{chunk-GQXZPKK7.js.map → chunk-V6UOVHW3.js.map} +0 -0
  725. /package/dist/{chunk-7TIX2UAR.js.map → chunk-VCJQQYRE.js.map} +0 -0
  726. /package/dist/{chunk-6WD2INST.js.map → chunk-WDASYY4S.js.map} +0 -0
  727. /package/dist/{chunk-DXBYWSL5.js.map → chunk-WIFDNUKD.js.map} +0 -0
  728. /package/dist/{chunk-RT7CJMER.js.map → chunk-WIXHUBQN.js.map} +0 -0
  729. /package/dist/{chunk-57AZS3IE.js.map → chunk-WRMUXZ7C.js.map} +0 -0
  730. /package/dist/{chunk-CRAOSVHC.js.map → chunk-WSDBQSPP.js.map} +0 -0
  731. /package/dist/{chunk-2CLNIEK4.js.map → chunk-WTSQUCHB.js.map} +0 -0
  732. /package/dist/{chunk-MIHN76LX.js.map → chunk-WYGTAQMX.js.map} +0 -0
  733. /package/dist/{chunk-GAVYGBFI.js.map → chunk-X2R73NGG.js.map} +0 -0
  734. /package/dist/{chunk-T7OXJZCX.js.map → chunk-XOIDUM2H.js.map} +0 -0
  735. /package/dist/{chunk-XHIQ5I6N.js.map → chunk-XVLEBB4Y.js.map} +0 -0
  736. /package/dist/{chunk-T3OWFVMS.js.map → chunk-Y3XZEKDQ.js.map} +0 -0
  737. /package/dist/{chunk-ROKQU7WG.js.map → chunk-YMI27QPF.js.map} +0 -0
  738. /package/dist/{chunk-U7XM7CB4.js.map → chunk-YNTLWCF4.js.map} +0 -0
  739. /package/dist/{chunk-ZQCND77P.js.map → chunk-YRYF76OE.js.map} +0 -0
  740. /package/dist/{chunk-2BDT3UZQ.js.map → chunk-ZAX4XQLN.js.map} +0 -0
  741. /package/dist/{chunk-DXR5PDFP.js.map → chunk-ZBHGNE2J.js.map} +0 -0
  742. /package/dist/{chunk-KODELWYT.js.map → chunk-ZF6ZS77B.js.map} +0 -0
  743. /package/dist/{chunk-KUDGXAF7.js.map → chunk-ZM5YP5NJ.js.map} +0 -0
  744. /package/dist/{chunk-I7ITSXSJ.js.map → chunk-ZR5EKJT6.js.map} +0 -0
  745. /package/dist/{chunk-IZXHMZQ6.js.map → chunk-ZW5YTIH3.js.map} +0 -0
  746. /package/dist/{embedded-new-voice-2G3VLPVQ.js.map → computer-viewer-5LKRCEVQ.js.map} +0 -0
  747. /package/dist/{embedded-voice-T5IWOWGD.js.map → embedded-new-voice-GHJRY3YL.js.map} +0 -0
  748. /package/dist/{model-policy-picker-menu-SMC6J6QN.js.map → embedded-voice-ASQXBSTX.js.map} +0 -0
  749. /package/dist/{fleet-decision-row-WM64KXP3.js.map → fleet-decision-row-U7LDVBEM.js.map} +0 -0
  750. /package/dist/{latest-question-OX56OVQ5.js.map → latest-question-RNVF262Q.js.map} +0 -0
  751. /package/dist/{sandbox-files-ESDMOFSD.js.map → model-policy-picker-menu-E6XKMFTA.js.map} +0 -0
  752. /package/dist/{queue-surface-implementation-4KUZ4PJV.js.map → queue-surface-implementation-GUAIG6TK.js.map} +0 -0
  753. /package/dist/{recorder-host-WF2RRR56.js.map → recorder-host-2MYDJPQW.js.map} +0 -0
  754. /package/dist/{session-connect-cards-Q53KMMYY.js.map → sandbox-files-W5W2LW4K.js.map} +0 -0
  755. /package/dist/{session-realtime-CF3I35WJ.js.map → session-connect-cards-TUY62MVP.js.map} +0 -0
  756. /package/dist/{timeline-annotation-markers-CJK4RYZ4.js.map → timeline-annotation-markers-FNILLWNU.js.map} +0 -0
  757. /package/dist/{timeline-annotation-selection-67GF5H26.js.map → timeline-annotation-selection-MBCIDO2Q.js.map} +0 -0
  758. /package/dist/{timeline-annotations-dialog-ONJPQDJQ.js.map → timeline-annotations-dialog-JPNKLOTE.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/routes/sessions-index.tsx"],"sourcesContent":["import { useAppApi } from \"../lib/app-api\";\nimport { useAppHost } from \"../lib/app-host\";\nimport { useSessionUiFeature } from \"../lib/session-ui-features\";\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 { 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 NewSessionDraft,\n type NewSessionSelectionHistory,\n type Rig,\n type SessionRealtimeModel,\n} from \"@opengeni/sdk\";\nimport { Link, useNavigate, usePage } from \"../lib/navigation\";\nimport { CreditCardIcon, LockIcon } 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 {\n ChannelCreateDialog,\n type ProjectAudience,\n} 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 SessionSetupStrip,\n runsOnSetupIcon,\n visibilitySetupIcon,\n type SessionSetupSetting,\n} from \"../components/session/new-session-setup-strip\";\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 { Notice } from \"../../ui/notice\";\nimport { CreditRefusalNotice } from \"../components/credits/credit-refusal-notice\";\nimport { coveredModelChoice, creditRefusalGap, freeCreditGap } from \"../lib/free-credit-gap\";\nimport {\n pickerPolicyRunnable,\n ComposerSendBlockerNotice,\n composerSendBlockerIsLoading,\n composerSendBlockerNotice,\n getNewSessionSendBlocker,\n NewSessionCreateFailureNotice,\n newSessionCreateFailureRecord,\n newSessionSendSignature,\n newSessionStartBlockerReason,\n visibleNewSessionCreateFailure,\n type NewSessionCreateFailure,\n type NewSessionSendState,\n} from \"../lib/composer-send-blocking\";\nimport {\n creditRefusalRecord,\n isPaymentRequiredError,\n type CreditRefusalRecord,\n} from \"../lib/model-access\";\nimport { composerSubmissionErrorMessage } from \"../../lib/format\";\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 continueArchivedChatMessage,\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 { findPickerRow, modelUsesCredits, type PickerModelRow } 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 recentSessionsWithOpened,\n relativeTimeLabel,\n sessionRepoLabel,\n type OpenedChat,\n} from \"../../session-list-model\";\nimport { readChatDirectory, useChatDirectoryVersion } from \"../lib/actions/chat-directory\";\nimport { newChatWording, 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 { SandboxBackend, Session } from \"../types\";\nimport { useUiEventTarget } from \"../lib/ui-events\";\nimport { BotLaunchStrip, type BotLaunchState } from \"../components/bots/bot-launch-strip\";\nimport { BotTemplateShortcuts } from \"../components/bots/bot-template-shortcuts\";\nimport { useBotTemplates } from \"../lib/bot-templates\";\nimport { useWindowBarTitle } from \"../../ui/window-bar-title\";\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 // The macOS window bar names the page; the hero keeps its greeting.\n useWindowBarTitle(\"New session\");\n const starters = useSessionUiFeature(\"starters\");\n const hostStarters = useAppHost().starters;\n const addCredits = useSessionUiFeature(\"addCredits\");\n // Without the chat list, the new-chat page shows no other chats either: no\n // recent chats and no project picker that files the chat among them.\n const chatList = useSessionUiFeature(\"chatList\");\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 [projectAudienceDraft, setProjectAudienceDraft] = useState<ProjectAudience>(\"workspace\");\n const { resetSessionView } = context;\n const [message, setMessage] = useState(\"\");\n // ?botTemplateId= starts this chat as a bot: the template's setup\n // instructions fill the composer (to read and change before sending), and\n // the chat is created with its name, description and avatar, kept live.\n const launchBotTemplateId = launch.botTemplateId;\n const workspaceBotTemplates = useBotTemplates(workspaceId);\n const [botLaunch, setBotLaunch] = useState<{\n id: string;\n state: BotLaunchState;\n } | null>(null);\n useEffect(() => {\n if (!launchBotTemplateId) {\n setBotLaunch(null);\n return;\n }\n let live = true;\n setBotLaunch({ id: launchBotTemplateId, state: { kind: \"loading\" } });\n context.client.getBotTemplate(workspaceId, launchBotTemplateId).then(\n (template) => {\n if (live)\n setBotLaunch({\n id: launchBotTemplateId,\n state: { kind: \"ready\", template },\n });\n },\n (error: unknown) => {\n if (live)\n setBotLaunch({\n id: launchBotTemplateId,\n state: { kind: \"error\", message: userErrorText(error) },\n });\n },\n );\n return () => {\n live = false;\n };\n }, [context.client, launchBotTemplateId, workspaceId]);\n const botTemplate = botLaunch?.state.kind === \"ready\" ? botLaunch.state.template : null;\n const newSessionBot = botTemplate\n ? {\n name: botTemplate.name,\n description: botTemplate.description,\n avatar: botTemplate.avatar,\n }\n : undefined;\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 = hasWorkspacePermission(context.accessContext, workspaceId, \"secrets: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 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 canCreatePrivateChat = tenancyCapabilities?.canCreatePrivate === true;\n // A new project can be Only me wherever a new chat can.\n const projectAudienceOffered = hasVisibilityChoice({\n personalWorkspace,\n canCreatePrivate: canCreatePrivateChat,\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 (a setup chip above the message): where the new chat runs and on\n // 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<CreditRefusalRecord<{\n workspaceId: string;\n }> | null>(null);\n const [createFailure, setCreateFailure] = useState<NewSessionCreateFailure | 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({\n name,\n ...(projectAudienceOffered ? { visibility: projectAudienceDraft } : {}),\n });\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 setProjectAudienceDraft(\"workspace\");\n }, [\n channelsQuery,\n projectAudienceDraft,\n projectAudienceOffered,\n projectNameDraft,\n selectProject,\n ]);\n\n // An Only me project holds only Only me chats, so choosing one makes the new\n // chat Only me. Where Only me is off, its Only me projects take no new chats.\n const selectedProjectOnlyMe =\n channelsQuery.channels.find((channel) => channel.id === selectedChannelId)?.visibility ===\n \"private\";\n useEffect(() => {\n if (!selectedProjectOnlyMe || !tenancyCapabilities) return;\n if (!canCreatePrivateChat) {\n selectProject(null, false);\n return;\n }\n setDraft((current) =>\n current.visibility === \"private\" ? current : { ...current, visibility: \"private\" },\n );\n }, [canCreatePrivateChat, selectProject, selectedProjectOnlyMe, tenancyCapabilities]);\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 (\n remote: NewSessionDraftEditable,\n history: NewSessionSelectionHistory,\n memberTarget: NewSessionDraft[\"memberDefaultExecutionTarget\"] | null,\n ) => {\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 memberTarget,\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 // The signup answer picks the starters, and with them the heading and placeholder.\n const starterSet = signupStarterSet(\n context.authSession?.user.email,\n workspace?.accountId,\n context.managedSelfContext?.memberships.find(\n (membership) => membership.organizationId === workspace?.accountId,\n )?.signupUseCase,\n );\n const wording = newChatWording(starterSet);\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 const refusal = creditRefusalRecord(error, { workspaceId }, request.model ?? context.model);\n if (!refusal) return false;\n setCreateCreditRefusal(refusal);\n // Re-read funding so the notice and picker name what the credit covers now.\n void modelCatalog.refresh();\n return true;\n };\n // What this Send carries; a refused start stays visible until it changes.\n const sendSignature = newSessionSendSignature({\n text: message,\n model: context.model,\n reasoningEffort: context.reasoningEffort,\n latencyMode: context.latencyMode,\n });\n const createFailureMessage = visibleNewSessionCreateFailure(createFailure, {\n workspaceId,\n signature: sendSignature,\n });\n const currentSendSignature = useLatestCallback(() => sendSignature);\n // Any other refused start is shown under the composer instead of a toast:\n // the chat was never created, so nothing else would say why.\n const noteCreateFailure = (error: Error, sentSignature: string): boolean => {\n // A payment refusal keeps its own dialog.\n if (isPaymentRequiredError(error)) return false;\n const failure = newSessionCreateFailureRecord({\n workspaceId,\n sent: sentSignature,\n current: currentSendSignature(),\n message: composerSubmissionErrorMessage(t, error),\n });\n if (!failure) return false;\n setCreateFailure(failure);\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 = pickerPolicyRunnable(\n selectedPolicyRow,\n context.reasoningEffort,\n 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 // 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 pendingFallbackModel = useMemo(() => {\n if (modelCatalog.loading || newSessionDraft.loading) return null;\n if (findPickerRow(modelCatalog.rows, context.model)?.selectable) return null;\n const next = composerFallbackModel({\n models: modelCatalog.models,\n rows: modelCatalog.rows,\n defaultSelection: modelCatalog.defaultSelection,\n });\n return next && next.id !== context.model ? next : null;\n }, [\n context.model,\n modelCatalog.defaultSelection,\n modelCatalog.loading,\n modelCatalog.models,\n modelCatalog.rows,\n newSessionDraft.loading,\n ]);\n useEffect(() => {\n const next = pendingFallbackModel;\n if (!next) return;\n setModel(next.id);\n setReasoningEffort(next.effort);\n // The replacement keeps the speed only where it runs it (a Free ChatGPT\n // plan's GPT-6 Luna has no Ultrafast), so the swap never leaves a choice\n // that cannot send.\n const row = findPickerRow(modelCatalog.rows, next.id);\n const fitted = row ? coveredModelChoice(row, next.effort, context.latencyMode) : null;\n if (fitted?.latencyMode) setLatencyMode(fitted.latencyMode);\n // An automatic replacement is not the person's choice.\n setModelProvided((current) => (current === undefined ? current : false));\n }, [\n context.latencyMode,\n modelCatalog.rows,\n pendingFallbackModel,\n setLatencyMode,\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 // Send's one guard: its enabled state, the early-Send hold, the guard Send\n // runs and the visible line below the composer all read it.\n const sendState: NewSessionSendState = {\n created: createdSessionAuthority !== null,\n draftLoading: newSessionDraft.loading,\n catalogLoading: modelCatalog.loading,\n catalogFailed: Boolean(modelCatalog.error),\n replacingModel: pendingFallbackModel !== null,\n policyValid: newSessionPolicyValid,\n anyModelSelectable: modelCatalog.rows.some((row) => row.selectable),\n selectedModelNotConnected: Boolean(\n selectedPolicyRow &&\n selectedPolicyRow.billingClass !== \"opengeni_credits\" &&\n selectedPolicyRow.catalog.credentialReadiness.status !== \"ready\",\n ),\n selectedModelSelectable: selectedPolicyRow?.selectable === true,\n // Null capabilities only mean the request is still in flight.\n privateSessionLoading:\n tenancyCapabilities === null && (personalWorkspace || draft.visibility === \"private\"),\n privateSessionUnavailable: privateCreateUnavailable,\n toolsLoading: !context.workspaceMcpCatalogReady || personalResourceCatalogRefreshPending,\n accountsLoading: connectionAccounts.loading,\n accountsFailed: connectionAccounts.error !== null,\n accountChoice: connectionAccounts.requiresAccountChoice,\n resourcesLoading:\n fixedResourceCatalogEnabled && (rigs.loading || !personalResourceEligibilitySettled),\n resourcesResolved: fixedResourceSelection.selectionResolved,\n uploadPending: attachments.hasUnresolved,\n computeLoading: draft.compute.kind === \"machine\" && fleet.loading,\n computeReady,\n };\n const sendBlocker = getNewSessionSendBlocker(sendState);\n // Voice skips the connected-tool accounts; its control and URL launch read\n // the same guard so a voice start can't be dropped silently either.\n const voiceSendBlocker = getNewSessionSendBlocker({ ...sendState, voice: true });\n const startBlocker = newSessionStartBlockerReason(sendBlocker);\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 // The same guard as Send's enabled state and the visible line, so a\n // Send that runs here was shown as available and a refusal is explained.\n if (busy || getNewSessionSendBlocker({ ...sendState, voice: realtimeModel !== null }))\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 (createdSessionAuthority === null && !text && !realtimeModel) return false;\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 // What this request carries, so its refusal is matched to the composer.\n const sentSignature = newSessionSendSignature({\n text: persistedValue.text,\n model,\n reasoningEffort,\n latencyMode,\n });\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 bot: newSessionBot,\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 noteCreateFailure(error, sentSignature)\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 setCreateFailure(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 bot: newSessionBot,\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 noteCreateFailure(error, sentSignature)\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 setCreateFailure(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 // A bot template's setup instructions fill an empty composer once its saved\n // draft has loaded, so the remote draft cannot overwrite them. Text the\n // person already typed stays; they can still start the bot with it.\n const prefilledBotTemplateRef = useRef<string | null>(null);\n // The instructions this page put in the composer, so leaving the bot launch\n // (dismissing it, or a link without the template) takes them out again\n // instead of leaving them behind as an ordinary chat's first message.\n const prefilledBotInstructionsRef = useRef<string | null>(null);\n const fillBotInstructions = useCallback((instructions: string) => {\n prefilledBotInstructionsRef.current = instructions;\n setMessage(instructions);\n }, []);\n useEffect(() => {\n if (!botTemplate || newSessionDraft.loading) return;\n if (prefilledBotTemplateRef.current === botTemplate.id) return;\n prefilledBotTemplateRef.current = botTemplate.id;\n if (message.trim().length === 0 || message === botTemplate.setupInstructions) {\n fillBotInstructions(botTemplate.setupInstructions);\n } else {\n toast.info(\"Kept your unsent message\", {\n description: \"Clear it to use the template's setup instructions instead.\",\n action: {\n label: \"Use setup instructions\",\n onClick: () => fillBotInstructions(botTemplate.setupInstructions),\n },\n });\n }\n }, [botTemplate, fillBotInstructions, message, newSessionDraft.loading]);\n useEffect(() => {\n if (launchBotTemplateId) return;\n prefilledBotTemplateRef.current = null;\n const prefilled = prefilledBotInstructionsRef.current;\n prefilledBotInstructionsRef.current = null;\n if (prefilled !== null) setMessage((current) => (current === prefilled ? \"\" : current));\n }, [launchBotTemplateId]);\n // After a reload the page no longer knows it filled the composer, but the\n // saved draft still holds the instructions. Untouched instructions of a\n // template, without that template's launch, are taken out the same way.\n const leftoverBotInstructionsCheckedRef = useRef(false);\n useEffect(() => {\n if (leftoverBotInstructionsCheckedRef.current) return;\n if (newSessionDraft.loading || workspaceBotTemplates.templates === undefined) return;\n leftoverBotInstructionsCheckedRef.current = true;\n if (launchBotTemplateId || message.length === 0) return;\n if (workspaceBotTemplates.templates.some((entry) => entry.setupInstructions === message)) {\n setMessage(\"\");\n }\n }, [launchBotTemplateId, message, newSessionDraft.loading, workspaceBotTemplates.templates]);\n // ?continueSessionId= (an archived chat's \"Continue in a new chat\") starts\n // the composer with a link to that chat once the saved draft has loaded,\n // ahead of anything the person already typed, then leaves the URL.\n const launchContinueSessionId = launch.continueSessionId;\n const continuedSessionRef = useRef<string | null>(null);\n useEffect(() => {\n if (!launchContinueSessionId || newSessionDraft.loading) return;\n if (continuedSessionRef.current === launchContinueSessionId) return;\n continuedSessionRef.current = launchContinueSessionId;\n const pointer = continueArchivedChatMessage(\n page.origin(),\n workspaceId,\n launchContinueSessionId,\n );\n setMessage((current) =>\n current.includes(pointer.trim()) ? current : `${pointer}${current.trimStart()}`,\n );\n void navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId },\n search: (previous: Record<string, unknown>) => {\n const { continueSessionId: _dropped, ...rest } = previous;\n return rest;\n },\n replace: true,\n });\n }, [launchContinueSessionId, navigate, newSessionDraft.loading, page, workspaceId]);\n const dismissBotLaunch = useCallback(() => {\n void navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId },\n search: (previous: Record<string, unknown>) => {\n const { botTemplateId: _dropped, ...rest } = previous;\n return rest;\n },\n replace: true,\n });\n }, [navigate, workspaceId]);\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 ...(launch.botTemplateId ? { botTemplateId: launch.botTemplateId } : {}),\n },\n replace: true,\n });\n return;\n }\n if (busy || voiceSendBlocker !== null) return;\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 busy,\n launchEffort,\n launchFollowDefault,\n launchLatency,\n launchModel,\n launchRealtime,\n launchSkillCapabilityId,\n launchKey,\n launch.botTemplateId,\n launch.channelId,\n navigate,\n newSessionDraft.loading,\n setLatencyMode,\n setModel,\n setReasoningEffort,\n submitNewSession,\n voiceSendBlocker,\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 // Nothing runs before the session exists: Send just sends.\n working: false,\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 sendBlocker === null,\n // What Send needs right after the page opens is still loading: an early\n // Send waits for it instead of doing nothing. Any other blocker shows its\n // line below the composer.\n preparing: composerSendBlockerIsLoading(sendBlocker),\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 // With no usable credit, the notice above the composer carries the one\n // Add credits action, so the heading's top-up button steps aside. Hosts that\n // turn off addCredits (side panes) get the notice's billing link instead of\n // the dialog.\n const canTopUpCredits =\n addCredits &&\n context.clientConfig.billingMode === \"stripe\" &&\n Boolean(workspace?.accountId) &&\n hasAccountPermission(context.accessContext, workspace?.accountId ?? \"\", \"billing:manage\");\n const noUsableCredit =\n creditGap !== null ||\n (modelUsesCredits(selectedPolicyRow?.catalog) &&\n selectedPolicyRow?.catalog.creditFunding === \"unavailable\");\n const openCreditTopup = () => setCreditTopupOpen(true);\n\n // Where the chat runs and who can see it are chosen beside the project chip,\n // above the message, and only when there is something to choose.\n const setupDisabled = busy || newSessionDraft.loading;\n const runsOnSetup: SessionSetupSetting | null = hasRunsOnChoices(runsOnChoices)\n ? {\n label: \"Runs on\",\n summary: runsOnSummary(runsOnChoices),\n icon: runsOnSetupIcon(runsOnChoices),\n disabled: setupDisabled,\n renderMenu: () => (\n <RunsOnMenuBody\n {...runsOnChoices}\n disabled={setupDisabled}\n onChange={setDraft}\n onComputeChange={setExplicitComputeDraft}\n onRetryMachines={() => void fleet.refresh()}\n />\n ),\n }\n : null;\n const visibilitySetup: SessionSetupSetting | null = hasVisibilityChoice({\n personalWorkspace,\n canCreatePrivate: tenancyCapabilities?.canCreatePrivate === true,\n })\n ? {\n label: \"Visibility\",\n summary: visibilitySummary(draft.visibility),\n icon: visibilitySetupIcon(draft.visibility),\n disabled: setupDisabled,\n renderMenu: (close) => (\n <VisibilityMenuBody\n value={draft.visibility}\n disabled={setupDisabled}\n onChange={(visibility) => {\n visibilityChosenRef.current = true;\n // A shared chat can't go in an Only me project.\n if (visibility === \"workspace\" && selectedProjectOnlyMe) selectProject(null);\n setDraft((current) => ({ ...current, visibility }));\n close();\n }}\n />\n ),\n }\n : null;\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 {wording.heading}\n </h1>\n {canTopUpCredits && workspace?.accountId ? (\n <>\n {noUsableCredit ? null : (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={openCreditTopup}\n >\n <CreditCardIcon className=\"size-4\" />\n Add credits\n </Button>\n )}\n <Suspense fallback={null}>\n <CreditTopupPrompt\n purpose=\"topup\"\n refusalCode={\n refusedCreate?.code === \"byok_paid_credit_required\"\n ? \"byok_paid_credit_required\"\n : null\n }\n open={creditTopupOpen}\n workspaceId={workspaceId}\n accountId={workspace.accountId}\n canBuyCredits\n onOpenChange={setCreditTopupOpen}\n beforeLeave={newSessionDraft.flush}\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 refusalCode={refusedCreate?.code}\n workspaceId={workspaceId}\n accountId={workspace?.accountId ?? null}\n canReadBilling={hasAccountPermission(\n context.accessContext,\n workspace?.accountId ?? \"\",\n \"billing:read\",\n )}\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 {...(canTopUpCredits ? { onAddCredits: openCreditTopup } : {})}\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 {...(canTopUpCredits ? { onAddCredits: openCreditTopup } : {})}\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={wording.placeholder}\n messages={wording.composerMessages}\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 {...(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 // While the chat models load, \"choose supported model settings\"\n // is not a real blocker yet.\n loadState={\n voiceSelection.loadState === \"ready\" && modelCatalog.loading\n ? \"loading\"\n : voiceSelection.loadState\n }\n modelMenu=\"split\"\n disabled={busy || voiceSendBlocker !== null || personalMachineSelected}\n disabledReason={\n voiceSendBlocker === \"upload\"\n ? \"Wait for attachments to finish before starting voice.\"\n : voiceSendBlocker === \"policy\"\n ? \"Choose supported model settings before starting voice.\"\n : voiceSendBlocker === \"compute\"\n ? \"Choose where this session should run first.\"\n : voiceSendBlocker !== null &&\n composerSendBlockerIsLoading(voiceSendBlocker)\n ? \"Wait for the chat to finish loading.\"\n : voiceSendBlocker !== null\n ? (composerSendBlockerNotice(voiceSendBlocker)?.message ?? null)\n : personalMachineSelected\n ? \"Start with a message so personal machine access can attach to an accepted turn.\"\n : null\n }\n onStart={async (model) => await submitNewSession(model)}\n />\n </>\n }\n header={\n chatList || botLaunch || runsOnSetup || visibilitySetup ? (\n <>\n {botLaunch ? (\n <BotLaunchStrip\n state={botLaunch.state}\n workspaceId={workspaceId}\n onDismiss={dismissBotLaunch}\n />\n ) : null}\n {chatList || runsOnSetup || visibilitySetup ? (\n <SessionSetupStrip\n disabled={busy || newSessionDraft.loading}\n project={\n chatList\n ? {\n channels: canCreatePrivateChat\n ? channelsQuery.channels\n : channelsQuery.channels.filter(\n (channel) => channel.visibility !== \"private\",\n ),\n selectedChannelId,\n onChange: selectProject,\n onCreate: () => setProjectDialogOpen(true),\n }\n : null\n }\n runsOn={runsOnSetup}\n visibility={visibilitySetup}\n />\n ) : null}\n </>\n ) : undefined\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 {/* A refused start, until the person changes what they send. */}\n <NewSessionCreateFailureNotice\n message={createFailureMessage}\n onDismiss={() => setCreateFailure(null)}\n className=\"mt-3\"\n />\n\n {/* Send's blocker, when no other surface already explains it. */}\n <ComposerSendBlockerNotice\n blocker={sendBlocker}\n explained={\n fixedResourceCatalogError\n ? [...NEW_SESSION_EXPLAINED_BLOCKERS, \"resources\"]\n : NEW_SESSION_EXPLAINED_BLOCKERS\n }\n className=\"mt-3\"\n onAction={(action) => {\n if (action === \"fix_model_settings\") chooseCoveredModel(context.model);\n else if (sendBlocker === \"model_catalog\") void modelCatalog.refresh();\n else if (sendBlocker === \"accounts\") void connectionAccounts.refresh();\n }}\n />\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 {!botLaunch ? (\n <BotTemplateShortcuts\n workspaceId={workspaceId}\n templates={workspaceBotTemplates.templates}\n disabled={busy}\n />\n ) : null}\n {chatList ? <RecentSessions workspaceId={workspaceId} /> : null}\n {starters ? (\n <NewSessionStarters\n workspaceId={workspaceId}\n set={starterSet}\n hostStarters={hostStarters}\n fileUploads={context.clientConfig.fileUploads.enabled === true}\n disabled={busy || newSessionDraft.loading}\n onSelect={(prompt) => {\n setMessage(prompt);\n composerRegionRef.current?.querySelector(\"textarea\")?.focus({ preventScroll: true });\n }}\n />\n ) : null}\n </div>\n <ChannelCreateDialog\n open={projectDialogOpen}\n name={projectNameDraft}\n busy={channelsQuery.mutating}\n audience={\n projectAudienceOffered\n ? { value: projectAudienceDraft, onChange: setProjectAudienceDraft }\n : undefined\n }\n onNameChange={setProjectNameDraft}\n onOpenChange={(open) => {\n setProjectDialogOpen(open);\n if (!open) {\n setProjectNameDraft(\"\");\n setProjectAudienceDraft(\"workspace\");\n }\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 subjectId = useAppContext().accessContext.subjectId;\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 // The chats the person opened here lead (kept across reloads, so the pane\n // of an app that reopens often still shows them); then pins, which are\n // server-authoritative, then running and recency rows.\n const directoryVersion = useChatDirectoryVersion(subjectId);\n const opened = useMemo<OpenedChat[]>(() => {\n void directoryVersion;\n const directory = readChatDirectory(subjectId, workspaceId);\n return directory.recent.flatMap((id) => {\n const record = directory.rows.get(id);\n return record && record.workspaceId === workspaceId && !record.archived\n ? [{ id, title: record.title, openedAt: record.updatedAt }]\n : [];\n });\n }, [directoryVersion, subjectId, workspaceId]);\n const recent = useMemo(\n () => recentSessionsWithOpened(t, sessions, pinned, opened, 6),\n [opened, pinned, sessions],\n );\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((entry) =>\n entry.kind === \"session\" ? (\n <RecentSessionRow\n key={entry.session.id}\n workspaceId={workspaceId}\n session={entry.session}\n catalogRows={modelCatalog.rows}\n />\n ) : (\n <OpenedChatRow key={entry.chat.id} workspaceId={workspaceId} chat={entry.chat} />\n ),\n )}\n </ul>\n </section>\n );\n}\n\n/**\n * A chat opened here that the current page of the list doesn't hold: its\n * title and when it was opened. Its status isn't known here, so the row keeps\n * the dot's place without claiming one.\n */\nfunction OpenedChatRow({ workspaceId, chat }: { workspaceId: string; chat: OpenedChat }) {\n return (\n <li className=\"min-w-0\">\n <Link\n to=\"/workspaces/$workspaceId/sessions/$sessionId\"\n params={{ workspaceId, sessionId: chat.id }}\n className=\"group flex items-center gap-3 rounded-md px-1 py-2.5 transition-colors hover:bg-hover\"\n >\n <span aria-hidden className=\"inline-block size-2 shrink-0\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm text-fg group-hover:text-fg\">{chat.title}</span>\n </span>\n <span className=\"shrink-0 text-2xs tabular-nums text-fg-subtle\">\n {chat.openedAt > 0 ? relativeTimeLabel(t, new Date(chat.openedAt).toISOString()) : null}\n </span>\n </Link>\n </li>\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/** The accounts notice below the new-chat composer explains these itself. */\nconst NEW_SESSION_EXPLAINED_BLOCKERS = [\"accounts\", \"account_choice\"] as const;\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 claudeSubscriptionAvailable={context.clientConfig.claudeSubscriptionEnabled === true}\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 workspaceRepositoryPickerProps(\n context: ReturnType<typeof useAppContext>,\n workspaceId: string,\n disabled: boolean,\n onConnectWorkspaceApp: () => void,\n): RepositoryContextPickerProps {\n const githubSettingsUrl = `/workspaces/${encodeURIComponent(workspaceId)}/plugins?open=integration:github`;\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 personalGitHubManageUrl: `${githubSettingsUrl}&github=personal`,\n githubSettingsUrl,\n groups: context.repositoryGroups,\n selectedRepoIds: context.selectedRepoIds,\n selectedRepoRefs: context.selectedRepoRefs,\n manualRepos: context.manualRepos,\n manualOpen: context.manualReposOpen,\n org: context.githubOrg,\n pending: context.busy || disabled,\n repoBusy: context.repoBusy,\n githubLoadFailed: context.githubStatusFailed && !context.githubCatalogReady,\n githubUpdateFailed: context.githubStatusFailed && context.githubCatalogReady,\n githubAppBusy: context.githubAppBusy,\n onRefresh: async () => {\n await Promise.all([\n context.refreshGitHub(workspaceId, undefined, { sync: true, userInitiated: true }),\n context.refreshPersonalGitHub(workspaceId, undefined, { userInitiated: true }),\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 = 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 onOrgChange: context.setGithubOrg,\n onStartGitHubApp: () => void context.startGitHubAppManifestFlow(workspaceId),\n onConnectWorkspaceApp,\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 context = useAppContext();\n return (\n <RepositoryContextMenuBody\n {...workspaceRepositoryPickerProps(context, workspaceId, disabled, onConnectWorkspaceApp)}\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 with the Runs on chip above the message. 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":[]}
@@ -7,7 +7,7 @@ import {
7
7
  useInteractionInterventions,
8
8
  useInteractionInvalidation,
9
9
  useViewerMenuDismiss
10
- } from "./chunk-O6N4ABCA.js";
10
+ } from "./chunk-FER6EVIY.js";
11
11
  import {
12
12
  useClientConfigFlags
13
13
  } from "./chunk-XESA3B7W.js";
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-RV3O5OCQ.js";
20
20
  import {
21
21
  formatBytes
22
- } from "./chunk-5MOJZORA.js";
22
+ } from "./chunk-2EA4IRIP.js";
23
23
  import {
24
24
  interactionHostPlatform
25
25
  } from "./chunk-ZUWF4NF7.js";
@@ -40,7 +40,7 @@ import {
40
40
  } from "./chunk-TXS65BB2.js";
41
41
  import {
42
42
  useOpenGeniText
43
- } from "./chunk-7T2ZE3VT.js";
43
+ } from "./chunk-QPQ7R77C.js";
44
44
 
45
45
  // src/components/browser-viewer.tsx
46
46
  import { interactionControlFailureFromError } from "@opengeni/sdk/interaction";
@@ -4821,4 +4821,4 @@ export {
4821
4821
  staleBrowserEndRetryDelayMs,
4822
4822
  BrowserViewer
4823
4823
  };
4824
- //# sourceMappingURL=chunk-CMKGILJK.js.map
4824
+ //# sourceMappingURL=chunk-FBA2NXYH.js.map
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-TXS65BB2.js";
11
11
  import {
12
12
  useOpenGeniText
13
- } from "./chunk-7T2ZE3VT.js";
13
+ } from "./chunk-QPQ7R77C.js";
14
14
 
15
15
  // src/lib/interaction-errors.ts
16
16
  import { OpenGeniApiError } from "@opengeni/sdk";
@@ -373,4 +373,4 @@ export {
373
373
  InteractionInterventionBanner,
374
374
  useViewerMenuDismiss
375
375
  };
376
- //# sourceMappingURL=chunk-O6N4ABCA.js.map
376
+ //# sourceMappingURL=chunk-FER6EVIY.js.map
@@ -18,7 +18,7 @@ import {
18
18
  isToolOutputPreviewEvent,
19
19
  sessionStatusFromEvents,
20
20
  useToolOutputReads
21
- } from "./chunk-4YCA2Y73.js";
21
+ } from "./chunk-PF2WU2IL.js";
22
22
  import {
23
23
  useFileAttachments
24
24
  } from "./chunk-I6FIXEL4.js";
@@ -50,7 +50,7 @@ import {
50
50
  FILE_ONLY_MESSAGE_TEXT,
51
51
  notifyObserver,
52
52
  useComposer
53
- } from "./chunk-MIHN76LX.js";
53
+ } from "./chunk-WYGTAQMX.js";
54
54
  import {
55
55
  DEFAULT_TRANSIENT_READ_RETRY,
56
56
  projectionReadThrough,
@@ -81,7 +81,7 @@ import {
81
81
  } from "./chunk-ZHC47M2B.js";
82
82
  import {
83
83
  useOpenGeniText
84
- } from "./chunk-7T2ZE3VT.js";
84
+ } from "./chunk-QPQ7R77C.js";
85
85
 
86
86
  // src/hooks/use-session.ts
87
87
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -1694,7 +1694,7 @@ function useSessionEvents(sessionId, options = {}) {
1694
1694
  let generation = navigationGenerationRef.current;
1695
1695
  const current = () => ownsNavigation() && generation === navigationGenerationRef.current;
1696
1696
  try {
1697
- const { resolveLatestQuestion } = await import("./latest-question-OX56OVQ5.js");
1697
+ const { resolveLatestQuestion } = await import("./latest-question-RNVF262Q.js");
1698
1698
  if (!current()) return null;
1699
1699
  const destination = await resolveLatestQuestion(t, {
1700
1700
  client,
@@ -4458,4 +4458,4 @@ export {
4458
4458
  useSessionReadAcknowledgement,
4459
4459
  useNewConversation
4460
4460
  };
4461
- //# sourceMappingURL=chunk-DF5EAHDN.js.map
4461
+ //# sourceMappingURL=chunk-FLWQJDJ5.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  LoadFailureNotice,
4
4
  isChunkLoadError
5
- } from "./chunk-KYS77RPN.js";
5
+ } from "./chunk-LPKJ77EK.js";
6
6
 
7
7
  // src/app/components/session/failure-recovery-boundary.tsx
8
8
  import { Component } from "react";
@@ -24,4 +24,4 @@ var FailureRecoveryBoundary = class extends Component {
24
24
  export {
25
25
  FailureRecoveryBoundary
26
26
  };
27
- //# sourceMappingURL=chunk-PTAG4PDC.js.map
27
+ //# sourceMappingURL=chunk-FNXCFIPW.js.map
@@ -0,0 +1,36 @@
1
+ "use client";
2
+
3
+ // src/app/lib/site-sidebar-bridge.ts
4
+ import { useSyncExternalStore } from "react";
5
+ var registrations = [];
6
+ var listeners = /* @__PURE__ */ new Set();
7
+ function publishSiteSidebarBridge(bridge) {
8
+ registrations = [...registrations, bridge];
9
+ for (const listener of listeners) listener();
10
+ return () => {
11
+ if (!registrations.includes(bridge)) return;
12
+ registrations = registrations.filter((registered) => registered !== bridge);
13
+ for (const listener of listeners) listener();
14
+ };
15
+ }
16
+ function subscribe(listener) {
17
+ listeners.add(listener);
18
+ return () => listeners.delete(listener);
19
+ }
20
+ var snapshot = () => registrations.at(-1) ?? null;
21
+ function useSiteSidebarActions(workspaceId, origin) {
22
+ const bridge = useSyncExternalStore(subscribe, snapshot, () => null);
23
+ if (!bridge || !origin || bridge.workspaceId !== workspaceId) return null;
24
+ const pinned = bridge.pinnedSiteIds.has(origin.siteId);
25
+ return {
26
+ pinned,
27
+ togglePin: () => bridge.pin(origin, !pinned),
28
+ archive: () => bridge.archive(origin)
29
+ };
30
+ }
31
+
32
+ export {
33
+ publishSiteSidebarBridge,
34
+ useSiteSidebarActions
35
+ };
36
+ //# sourceMappingURL=chunk-FPSS23S4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/lib/site-sidebar-bridge.ts"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\n\nimport type { SessionSiteOrigin } from \"./session-site-origin\";\n\n/**\n * The sidebar's Site actions for the Site's own page: Pin and Archive there\n * act exactly as on the Site's row (same optimistic row, toasts and Undo),\n * because the sidebar that owns those rows publishes them here while it is\n * mounted. Absent while there is no sidebar list (a collapsed rail, a closed\n * phone drawer, an embed without Site sidebar state); the page then offers\n * neither.\n */\nexport type SiteSidebarBridge = {\n workspaceId: string;\n /** Sites pinned in this person's sidebar. */\n pinnedSiteIds: ReadonlySet<string>;\n pin: (origin: SessionSiteOrigin, pinned: boolean) => void;\n archive: (origin: SessionSiteOrigin) => void;\n};\n\n// Newest last: when two sidebars are mounted (the shell's and an embedded\n// chat's), the newest acts until it unmounts, then the one before it again.\nlet registrations: readonly SiteSidebarBridge[] = [];\nconst listeners = new Set<() => void>();\n\n/** Publishes the sidebar's actions; returns the matching withdrawal. */\nexport function publishSiteSidebarBridge(bridge: SiteSidebarBridge): () => void {\n registrations = [...registrations, bridge];\n for (const listener of listeners) listener();\n return () => {\n if (!registrations.includes(bridge)) return;\n registrations = registrations.filter((registered) => registered !== bridge);\n for (const listener of listeners) listener();\n };\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nconst snapshot = (): SiteSidebarBridge | null => registrations.at(-1) ?? null;\n\n/** The sidebar's Pin and Archive for one Site, or null while there are none. */\nexport function useSiteSidebarActions(\n workspaceId: string,\n origin: SessionSiteOrigin | null,\n): { pinned: boolean; togglePin: () => void; archive: () => void } | null {\n const bridge = useSyncExternalStore(subscribe, snapshot, () => null);\n if (!bridge || !origin || bridge.workspaceId !== workspaceId) return null;\n const pinned = bridge.pinnedSiteIds.has(origin.siteId);\n return {\n pinned,\n togglePin: () => bridge.pin(origin, !pinned),\n archive: () => bridge.archive(origin),\n };\n}\n"],"mappings":";;;AAAA,SAAS,4BAA4B;AAsBrC,IAAI,gBAA8C,CAAC;AACnD,IAAM,YAAY,oBAAI,IAAgB;AAG/B,SAAS,yBAAyB,QAAuC;AAC9E,kBAAgB,CAAC,GAAG,eAAe,MAAM;AACzC,aAAW,YAAY,UAAW,UAAS;AAC3C,SAAO,MAAM;AACX,QAAI,CAAC,cAAc,SAAS,MAAM,EAAG;AACrC,oBAAgB,cAAc,OAAO,CAAC,eAAe,eAAe,MAAM;AAC1E,eAAW,YAAY,UAAW,UAAS;AAAA,EAC7C;AACF;AAEA,SAAS,UAAU,UAAkC;AACnD,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM,UAAU,OAAO,QAAQ;AACxC;AAEA,IAAM,WAAW,MAAgC,cAAc,GAAG,EAAE,KAAK;AAGlE,SAAS,sBACd,aACA,QACwE;AACxE,QAAM,SAAS,qBAAqB,WAAW,UAAU,MAAM,IAAI;AACnE,MAAI,CAAC,UAAU,CAAC,UAAU,OAAO,gBAAgB,YAAa,QAAO;AACrE,QAAM,SAAS,OAAO,cAAc,IAAI,OAAO,MAAM;AACrD,SAAO;AAAA,IACL;AAAA,IACA,WAAW,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM;AAAA,IAC3C,SAAS,MAAM,OAAO,QAAQ,MAAM;AAAA,EACtC;AACF;","names":[]}
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import {
3
3
  SessionProfileDialog
4
- } from "./chunk-JEUPAVYY.js";
4
+ } from "./chunk-3L465FBR.js";
5
5
  import {
6
6
  useOptionalAppContext
7
7
  } from "./chunk-JDFDPMKX.js";
8
8
  import {
9
9
  sessionDisplayTitle
10
- } from "./chunk-3PZ7JZI2.js";
10
+ } from "./chunk-D3PTVN2I.js";
11
11
 
12
12
  // src/app/components/session/session-profile-editor.tsx
13
13
  import { jsx } from "react/jsx-runtime";
@@ -47,4 +47,4 @@ export {
47
47
  useCanEditSessionProfile,
48
48
  SessionProfileEditorDialog
49
49
  };
50
- //# sourceMappingURL=chunk-BJEJFISW.js.map
50
+ //# sourceMappingURL=chunk-FSDQQQIA.js.map