@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
@@ -1 +0,0 @@
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 { creditRefusalRecord, type CreditRefusalRecord } from \"../lib/model-access\";\nimport { isTransientServiceFailure, OPENGENI_UPDATING_NOTICE } from \"../lib/transient-retry\";\nimport { useConnectionAccounts } from \"../components/capabilities/use-connection-accounts\";\nimport { StatusDot } from \"../../ui/status-dot\";\nimport { useAppContext, useLatestCallback } from \"../app-context\";\nimport { useBrowserAccountBridgeBlocker } from \"../lib/browser-account-bridge\";\nimport {\n EMPTY_COMPOSER_LAUNCH,\n composerLaunchSearchKey,\n 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 {\n effortOptionsForModel,\n findPickerRow,\n modelUsesCredits,\n runnableLatencyModesForModel,\n type PickerModelRow,\n} from \"../lib/model-policy\";\nimport { isPersonalWorkspace } from \"../lib/managed-self-context\";\nimport { attachManualRepository } from \"../lib/manual-repositories\";\nimport { hasAccountPermission, hasWorkspacePermission } from \"../lib/permissions\";\nimport {\n isPersonalAttachmentConflict,\n newSessionFixedResourceCatalogFailed,\n newSessionPersonalResourceAttachment,\n personalResourceSelectionIdentityKey,\n reconcileNewSessionFixedResources,\n recoverNewSessionPersonalResourceAttachment,\n resolvePersonalResourceOwnerScope,\n} from \"../lib/personal-resource-attachments\";\nimport {\n recentSessionModelPresentation,\n recentSessionStatus,\n 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 [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 const chooseCoveredModel = (id: string) => {\n const row = findPickerRow(modelCatalog.rows, id);\n const choice = row\n ? coveredModelChoice(row, context.reasoningEffort, context.latencyMode)\n : null;\n if (!choice) return;\n setModelProvided(true);\n context.setModel(choice.model);\n context.setReasoningEffort(choice.effort);\n if (choice.latencyMode !== null) context.setLatencyMode(choice.latencyMode);\n };\n const newSessionPolicyValid = Boolean(\n selectedPolicyRow?.selectable &&\n effortOptionsForModel(selectedPolicyRow.catalog).includes(context.reasoningEffort) &&\n (context.latencyMode === \"standard\" ||\n runnableLatencyModesForModel(selectedPolicyRow.catalog).includes(context.latencyMode)),\n );\n const noRunnableModel =\n !modelCatalog.loading &&\n modelCatalog.rows.length > 0 &&\n !modelCatalog.rows.some((row) => row.selectable);\n const newSessionPolicyError =\n !modelCatalog.loading &&\n !newSessionPolicyValid &&\n !noRunnableModel &&\n selectedPolicyRow?.selectable\n ? \"Choose a supported model, reasoning level, and speed.\"\n : null;\n // 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 // An automatic replacement is not the person's choice.\n setModelProvided((current) => (current === undefined ? current : false));\n }, [pendingFallbackModel, setModel, setReasoningEffort]);\n const codexConnected = modelCatalog.models.some(\n (candidate) =>\n candidate.provider === \"codex-subscription\" &&\n candidate.credentialReadiness.status === \"ready\",\n );\n const startBlocker =\n modelCatalog.loading || newSessionDraft.loading\n ? null\n : modelCatalog.error\n ? \"model_catalog_unavailable\"\n : !newSessionPolicyValid\n ? !modelCatalog.rows.some((row) => row.selectable)\n ? \"no_model_connected\"\n : selectedPolicyRow &&\n selectedPolicyRow.billingClass !== \"opengeni_credits\" &&\n selectedPolicyRow.catalog.credentialReadiness.status !== \"ready\"\n ? \"selected_model_not_connected\"\n : \"model_policy_unavailable\"\n : privateCreateUnavailable\n ? \"private_session_unavailable\"\n : attachments.hasUnresolved\n ? \"attachments_pending\"\n : !computeReady\n ? \"compute_unavailable\"\n : null;\n useEffect(() => {\n const record = () => {\n if (startBlocker)\n captureAnalyticsEvent(\"session_start_blocker_viewed\", {\n workspace_id: workspaceId,\n reason: startBlocker,\n });\n };\n record();\n window.addEventListener(ANALYTICS_COLLECTION_ENABLED_EVENT, record);\n return () => window.removeEventListener(ANALYTICS_COLLECTION_ENABLED_EVENT, record);\n }, [startBlocker, workspaceId]);\n // Shared with the bar start control and the mobile “+ → Voice model” panel.\n const voiceSelection = useRealtimeModelSelection({\n client: context.client,\n workspaceId,\n codexConnected,\n });\n\n useEffect(() => {\n if (createComposerFocusGen === 0 || newSessionDraft.loading) return;\n const textarea = composerRegionRef.current?.querySelector(\"textarea\");\n if (!textarea || textarea.disabled) return;\n textarea.focus();\n }, [createComposerFocusGen, newSessionDraft.loading]);\n\n const submitNewSession = useLatestCallback(\n async (\n realtimeModel: SessionRealtimeModel | null,\n policy?: Pick<ComposerLaunchSearch, \"model\" | \"effort\" | \"latency\">,\n ): Promise<boolean> => {\n if (startBlocker)\n captureAnalyticsEvent(\"session_start_blocked\", {\n workspace_id: workspaceId,\n reason: startBlocker,\n });\n const hasTypedText = message.trim().length > 0;\n const text = hasTypedText\n ? message\n : attachments.readyResources.length > 0\n ? FILE_ONLY_MESSAGE_TEXT(t)\n : \"\";\n if (\n busy ||\n !context.workspaceMcpCatalogReady ||\n newSessionDraft.loading ||\n !newSessionPolicyValid ||\n privateCreateUnavailable ||\n personalResourceCatalogRefreshPending ||\n (!realtimeModel &&\n createdSessionAuthority === null &&\n (connectionAccounts.loading ||\n connectionAccounts.error !== null ||\n connectionAccounts.requiresAccountChoice)) ||\n (createdSessionAuthority === null && !fixedResourceSelection.selectionResolved)\n )\n return false;\n if (createdSessionAuthority === null) {\n const unavailable = unavailableSessionMcpServerIds(\n context.selectedCapabilityToolIds,\n context.toolMcpServers,\n context.workspaceMcpCatalogLoadedSuccessfully,\n );\n if (unavailable.length > 0) {\n const removed = new Set(unavailable);\n context.setSelectedCapabilityToolIds(\n (current) => new Set([...current].filter((id) => !removed.has(id))),\n );\n setConnectorExclusions((current) => [...new Set([...current, ...unavailable])]);\n toast.error(\"Some selected tools are no longer available\", {\n description:\n \"Removed them from this draft. Your message is still here; review the tools and send again.\",\n });\n return false;\n }\n }\n if (realtimeModel && personalMachineSelected) {\n toast.error(\"Voice can't start on a personal Connected Machine\", {\n description:\n \"Start the session with a message first so Opengeni can attach the machine to an accepted turn.\",\n });\n return false;\n }\n if (\n createdSessionAuthority === null &&\n ((!text && !realtimeModel) || attachments.hasUnresolved || !computeReady)\n ) {\n return false;\n }\n // A chosen limit must be a valid amount; an older server never gets one.\n const usageLimit =\n usageLimitCapability === \"enabled\" ? parseSessionUsageLimitDraft(usageLimitDraft) : null;\n if (createdSessionAuthority === null && usageLimit && !usageLimit.ok) {\n setUsageLimitSendBlocked(true);\n toast.error(\"Check the usage limit\", {\n description: `${usageLimit.error} Change it under + > Usage limit.`,\n });\n return false;\n }\n const usageLimitMicros = usageLimit?.ok ? usageLimit.limitMicros : null;\n const model = policy?.model ?? persistedValue.model;\n const reasoningEffort = policy?.effort ?? persistedValue.reasoningEffort;\n const latencyMode = policy?.latency ?? persistedValue.latencyMode;\n // One Send always refers to one visible snapshot, even if a sibling edit\n // forces a draft save or create retry while the user continues typing.\n const visibleSignature = stableJson(persistedValue);\n const submittedSnapshot = newSessionCreateSnapshot(\n persistedValue,\n realtimeModel ? persistedValue.text : text,\n {\n model,\n reasoningEffort,\n latencyMode,\n },\n );\n const preserveNewerLocalDraft = async () => {\n if (!newSessionDraft.isCurrentSignature(visibleSignature)) {\n // A definitive create failure must not leave text typed during the\n // attempt unsaved after a retry persisted the clicked snapshot.\n await (realtimeModel ? newSessionDraft.flush() : newSessionDraft.flushForSend());\n }\n };\n setSubmitting(true);\n try {\n return await runNewSessionRouteSubmission({\n authority: createdSessionAuthority,\n onAuthorityChange: setCreatedSessionAuthority,\n create: async () => {\n // Voice launch is realtime-only: never turn composer text/files into\n // an initial message. Persist the draft so a pending autosave is not\n // lost on navigate, but do not consume it — text stays for later.\n if (realtimeModel) {\n for (let attempt = 0; attempt < 3; attempt += 1) {\n // Voice launch does not consume the draft. Save local edits if\n // possible, but never rebase an old voice draft over a sibling's\n // newer unsent message merely to start a realtime session.\n const flushed = await newSessionDraft.flush();\n if (!flushed) {\n reportDraftSaveFailure(newSessionDraft);\n return null;\n }\n const submission = submissionFromSessionDraft(\n draft,\n defaultFirstPartyMcpTools,\n personalResourceAttachment.intent,\n );\n let draftConflict = false;\n let outcomeUnknown = false;\n const created = await context.startSession(\n workspaceId,\n {\n text: \"\",\n resources: [],\n tools: submittedSnapshot.tools,\n model,\n reasoningEffort,\n latencyMode,\n ...submission.extras,\n },\n {\n targetSandboxId: submission.options.targetSandboxId,\n workingDir: submission.options.workingDir,\n channelId: selectedChannelId,\n omitWorkspaceResources: submission.omitWorkspaceResources,\n installedSkillIds: launch.skillCapabilityId\n ? [launch.skillCapabilityId]\n : undefined,\n 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 );\n },\n },\n );\n if (!created) {\n if (draftConflict) continue;\n if (!outcomeUnknown) await preserveNewerLocalDraft();\n return null;\n }\n setUsageLimitDraft(NO_SESSION_USAGE_LIMIT);\n setCreateCreditRefusal(null);\n setUsageLimitSendBlocked(false);\n return {\n sessionId: created.id,\n settleDraft: async () => true,\n };\n }\n await preserveNewerLocalDraft();\n newSessionDraft.clearError();\n toast.error(\"Couldn't start voice\", {\n description: DRAFT_CHANGED_DURING_SEND_TEXT,\n });\n return null;\n }\n\n const submittedResources = submittedSnapshot.resources;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const flushed = await newSessionDraft.flushForSend(submittedSnapshot);\n if (!flushed) {\n reportDraftSaveFailure(newSessionDraft);\n return null;\n }\n const submission = submissionFromSessionDraft(\n draft,\n defaultFirstPartyMcpTools,\n personalResourceAttachment.intent,\n );\n let draftConflict = false;\n let outcomeUnknown = false;\n const created = await context.startSession(\n workspaceId,\n {\n text,\n resources: submittedResources,\n tools: submittedSnapshot.tools,\n model,\n reasoningEffort,\n latencyMode,\n ...submission.extras,\n connectionAccounts: connectionAccounts.selections,\n },\n {\n targetSandboxId: submission.options.targetSandboxId,\n workingDir: submission.options.workingDir,\n channelId: selectedChannelId,\n omitWorkspaceResources: submission.omitWorkspaceResources,\n installedSkillIds: launch.skillCapabilityId\n ? [launch.skillCapabilityId]\n : undefined,\n 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 );\n },\n },\n );\n if (!created) {\n if (draftConflict) continue;\n if (!outcomeUnknown) await preserveNewerLocalDraft();\n return null;\n }\n // The limit belongs to the chat just created; the next starts with none.\n setUsageLimitDraft(NO_SESSION_USAGE_LIMIT);\n setCreateCreditRefusal(null);\n setUsageLimitSendBlocked(false);\n return {\n sessionId: created.id,\n settleDraft: async () => {\n const acknowledged = await newSessionDraft.acknowledgeConsumed(\n flushed,\n visibleSignature,\n );\n if (\n acknowledged?.kind === \"consumed\" &&\n newSessionDraft.isCurrentSignature(visibleSignature)\n ) {\n setMessage(\"\");\n visibilityChosenRef.current = false;\n setDraft({\n ...emptySessionDraft(defaultFirstPartyMcpTools, defaultSandboxBackend),\n visibility:\n tenancyCapabilities?.canCreatePrivate === true &&\n tenancyCapabilities.defaultVisibility === \"private\"\n ? \"private\"\n : \"workspace\",\n });\n attachments.removeReadyFiles(\n submittedResources.flatMap((resource) =>\n resource.kind === \"file\" ? [resource.fileId] : [],\n ),\n );\n } else if (\n acknowledged?.kind !== \"preserved\" ||\n !newSessionDraft.isCurrentSignature(acknowledged.flushed.signature)\n ) {\n // The message was already accepted. If there is no newer\n // local edit, leave a sibling's later draft untouched.\n if (!acknowledged && newSessionDraft.isCurrentSignature(visibleSignature)) {\n return true;\n }\n const preserved = await newSessionDraft.flushForSend();\n if (!preserved || !newSessionDraft.isCurrentSignature(preserved.signature)) {\n return false;\n }\n }\n return true;\n },\n };\n }\n await preserveNewerLocalDraft();\n // Each attempt saved the draft before the create refused it, so the\n // draft is not unsaved: clear that notice and resume autosave.\n newSessionDraft.clearError();\n toast.error(\"Couldn't send\", {\n description: DRAFT_CHANGED_DURING_SEND_TEXT,\n });\n return null;\n },\n navigate: async (sessionId) => {\n // Voice connects while the session page loads; the page adopts\n // the running call (`?realtime=` still selects its model there).\n const sessionPath = `/workspaces/${workspaceId}/sessions/${sessionId}`;\n const abandonVoice = realtimeModel\n ? prestartSessionRealtime({\n client: api.voiceRealtimeClient(\n context.client,\n () => new URL(sessionPath, page.origin()).href,\n ),\n workspaceId,\n sessionId,\n model: realtimeModel,\n language: voiceSelection.languageFor(realtimeModel),\n voiceSettings: voiceSelection.voiceSettingsFor(realtimeModel),\n })\n : null;\n try {\n await navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n search: realtimeModel ? { realtime: realtimeModel } : {},\n });\n } catch (error) {\n abandonVoice?.();\n throw error;\n }\n },\n });\n } finally {\n setSubmitting(false);\n }\n },\n );\n\n // 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 (\n busy ||\n !computeReady ||\n !newSessionPolicyValid ||\n !context.workspaceMcpCatalogReady ||\n attachments.hasUnresolved\n ) {\n return;\n }\n handledLaunchKeyRef.current = launchKey;\n void submitNewSession(launchRealtime, {\n model: launchModel,\n effort: launchEffort,\n latency: launchLatency,\n }).then((ok) => {\n if (!ok) handledLaunchKeyRef.current = null;\n });\n }, [\n attachments.hasUnresolved,\n busy,\n computeReady,\n context.workspaceMcpCatalogReady,\n launchEffort,\n launchFollowDefault,\n launchLatency,\n launchModel,\n launchRealtime,\n launchSkillCapabilityId,\n launchKey,\n launch.botTemplateId,\n launch.channelId,\n navigate,\n newSessionDraft.loading,\n newSessionPolicyValid,\n setLatencyMode,\n setModel,\n setReasoningEffort,\n submitNewSession,\n workspaceId,\n ]);\n\n // The session does not exist yet, so this surface cannot use `useComposer`\n // (that hook sends to a session). It still renders the package ChatComposer\n // by implementing the same `ComposerState` contract over session creation.\n const createComposer: ComposerState = {\n value: message,\n setValue: setMessage,\n hasDraftContent: () => message.length > 0 || attachments.attachments.length > 0,\n sending: busy,\n // 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 !newSessionDraft.loading &&\n newSessionPolicyValid &&\n !personalResourceCatalogRefreshPending &&\n (createdSessionAuthority !== null ||\n (!connectionAccounts.loading &&\n connectionAccounts.error === null &&\n !connectionAccounts.requiresAccountChoice)) &&\n (createdSessionAuthority !== null || fixedResourceSelection.selectionResolved) &&\n (createdSessionAuthority !== null || (!attachments.hasUnresolved && computeReady)),\n // What Send needs right after the page opens is still loading: an early\n // Send waits for it instead of doing nothing.\n preparing:\n modelCatalog.loading ||\n newSessionDraft.loading ||\n pendingFallbackModel !== null ||\n personalResourceCatalogRefreshPending ||\n (createdSessionAuthority === null &&\n (connectionAccounts.loading ||\n (fixedResourceCatalogEnabled && (rigs.loading || !personalResourceEligibilitySettled)) ||\n (draft.compute.kind === \"machine\" && fleet.loading))),\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={\n busy ||\n newSessionDraft.loading ||\n attachments.hasUnresolved ||\n !newSessionPolicyValid ||\n !computeReady ||\n personalMachineSelected ||\n !context.workspaceMcpCatalogReady\n }\n disabledReason={\n attachments.hasUnresolved\n ? \"Wait for attachments to finish before starting voice.\"\n : !newSessionPolicyValid\n ? \"Choose supported model settings before starting voice.\"\n : !computeReady\n ? \"Choose where this session should run first.\"\n : personalMachineSelected\n ? \"Start with a message so personal machine access can attach to an accepted turn.\"\n : !context.workspaceMcpCatalogReady\n ? \"Wait for session tools to finish loading.\"\n : null\n }\n onStart={async (model) => await submitNewSession(model)}\n />\n </>\n }\n header={\n 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 {/* 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/** 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":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/artifacts/site-view.tsx","../src/components/artifacts/editable-artifact-view.tsx","../src/components/artifacts/editable-artifact-workbench.tsx","../src/components/artifacts/session-artifact-viewer.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { SiteViewer } from \"@opengeni/sdk\";\n\nimport { loadSiteSnapshot } from \"../../sites-ui\";\nimport {\n ArtifactLoading,\n ArtifactProblem,\n artifactLoadErrorView,\n useArtifactLabels,\n} from \"./artifact-chrome\";\nimport { ArtifactSandbox } from \"./artifact-sandbox\";\nimport type { SiteLiveState } from \"./artifact-sandbox\";\nimport type { SiteSnapshotClient, SiteToolBridgeFactory } from \"./chat-interactive-block\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\n\ntype Snapshot = Awaited<ReturnType<typeof loadSiteSnapshot>>;\n\nexport type SiteViewProps = {\n client: SiteSnapshotClient;\n workspaceId: string;\n siteId: string;\n /** Host-owned Site API access. Omit it and the Site renders without workspace tools. */\n toolBridge?: SiteToolBridgeFactory | undefined;\n /** Who is viewing, answered to the Site's `site.viewer`. */\n viewer?: SiteViewer | undefined;\n /**\n * The Site's own address (`/admin?tab=2`), answered to `site.location`;\n * with `onSiteLocationChange` the host keeps it, for example in its URL.\n * Omit both and the view keeps it itself, starting at `/`.\n */\n siteLocation?: string | undefined;\n /** The Site moved itself with `site.navigate`. */\n onSiteLocationChange?: ((href: string, options: { replace: boolean }) => void) | undefined;\n theme?: \"light\" | \"dark\" | undefined;\n /** Shown instead of the archived notice; the console links to its full page. */\n archivedMessage?: string | undefined;\n /** Show the Site title in the frame bar; hide it under a host header that already does. */\n showTitle?: boolean | undefined;\n /** Loading copy; defaults to \"Loading Site…\". */\n loadingLabel?: string | undefined;\n /** Called with the loaded title, for a host header. */\n onTitle?: ((title: string) => void) | undefined;\n /** Hide the frame toolbar under a host header that draws reload and full screen. */\n showToolbar?: boolean | undefined;\n /**\n * Replaces the toolbar's \"Live\" indicator, for example with a link to the\n * published Site; `null` shows nothing there. Omit it for the default.\n */\n liveStatus?: ReactNode | undefined;\n /** Reload the Site whenever this changes. */\n reloadToken?: number | undefined;\n /**\n * The Site's current version as the host last read it, for a host that\n * watches the Site for new versions. When it differs from the version\n * shown, the view loads it and the Site reloads in place; the version on\n * screen stays until the new one has loaded.\n */\n versionId?: string | null | undefined;\n /**\n * Whether the host's watch for new versions is working: `live` (the\n * default once `versionId` is given) or `reconnecting`. With it, the frame's\n * Live label tells the truth: Live, Updating while a new version loads, or\n * Reconnecting. Without `versionId` or this, the label stays as before.\n */\n watch?: \"live\" | \"reconnecting\" | undefined;\n /** Drawn instead of the version badge, for example a version history menu. */\n versionControl?: ReactNode | undefined;\n /**\n * The toolbar's first control, for example a Back to the page the Site was\n * opened from. It shows while the Site loads or can't be shown, too.\n */\n toolbarStart?: ReactNode | undefined;\n /** Host-controlled full screen; omit to let the frame manage it. */\n fullScreen?: boolean | undefined;\n onFullScreenChange?: ((fullScreen: boolean) => void) | undefined;\n className?: string | undefined;\n};\n\n/**\n * A published Site filling its container: the console's session dock and an\n * embedding host's artifact viewer render the same view.\n */\nexport function SiteView({\n client,\n workspaceId,\n siteId,\n toolBridge,\n viewer,\n siteLocation,\n onSiteLocationChange,\n theme,\n archivedMessage,\n showTitle = true,\n loadingLabel,\n onTitle,\n showToolbar,\n liveStatus,\n reloadToken,\n versionId,\n watch,\n versionControl,\n toolbarStart,\n fullScreen,\n onFullScreenChange,\n className,\n}: SiteViewProps) {\n const t = useOpenGeniText();\n const labels = useArtifactLabels();\n const [snapshot, setSnapshot] = useState<Snapshot | null>(null);\n const [error, setError] = useState<unknown>(null);\n // A newer version is loading (or failed to) behind the one on screen.\n const [refresh, setRefresh] = useState<\"idle\" | \"loading\" | \"failed\">(\"idle\");\n const readAbort = useRef<AbortController | null>(null);\n // Failed background loads in a row, for the wait before the next try.\n const [failures, setFailures] = useState(0);\n const onTitleRef = useRef(onTitle);\n onTitleRef.current = onTitle;\n const load = useCallback(\n async (background = false) => {\n readAbort.current?.abort();\n const abort = new AbortController();\n readAbort.current = abort;\n try {\n if (background) setRefresh(\"loading\");\n else setError(null);\n const next = await loadSiteSnapshot(client, workspaceId, siteId, {\n signal: abort.signal,\n includeArchivedContent: true,\n });\n if (abort.signal.aborted) return;\n setSnapshot(next);\n setError(null);\n setRefresh(\"idle\");\n setFailures(0);\n onTitleRef.current?.(next.detail.artifact.title);\n } catch (nextError) {\n if (abort.signal.aborted) return;\n // A failed update keeps the version on screen; the label says so.\n if (background) {\n setRefresh(\"failed\");\n setFailures((count) => count + 1);\n } else {\n setSnapshot(null);\n setError(nextError);\n }\n }\n },\n [client, siteId, workspaceId],\n );\n useEffect(() => {\n setSnapshot(null);\n setRefresh(\"idle\");\n void load();\n return () => readAbort.current?.abort();\n }, [load]);\n const content = snapshot?.content;\n const shownVersion = content?.versionId ?? null;\n // Follow the host's current version once something is on screen. Only a\n // change of `versionId` asks again, so a host that read an older version\n // than the one shown never makes the view load in a loop.\n const loaded = snapshot !== null;\n const shownRef = useRef(shownVersion);\n shownRef.current = shownVersion;\n useEffect(() => {\n if (!loaded || !versionId || versionId === shownRef.current) return;\n void load(true);\n }, [load, loaded, versionId]);\n // A failed update tries again, waiting longer each time (up to 30 s), until\n // the version on screen is the host's or the host moves on to another. A\n // hidden tab waits and tries once it is shown again.\n useEffect(() => {\n if (refresh !== \"failed\" || !versionId || versionId === shownRef.current) return;\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n const onVisible = () => {\n if (document.visibilityState === \"visible\") void load(true);\n };\n document.addEventListener(\"visibilitychange\", onVisible);\n return () => document.removeEventListener(\"visibilitychange\", onVisible);\n }\n const delay = Math.min(30_000, 2_000 * 2 ** Math.max(0, failures - 1));\n const timer = setTimeout(() => void load(true), delay);\n return () => clearTimeout(timer);\n }, [failures, load, refresh, versionId]);\n const bridge = useMemo(\n () =>\n content\n ? toolBridge?.({\n artifactId: siteId,\n siteVersionId: content.versionId,\n requestedTools: content.requestedTools,\n })\n : undefined,\n [content, siteId, toolBridge],\n );\n // Without the Site there is no toolbar, but its first control stays, so a\n // Back never disappears while the Site loads or fails.\n const withStart = (state: ReactNode) =>\n toolbarStart ? (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex min-h-12 shrink-0 items-center border-b border-border/80 px-3 sm:px-4\">\n {toolbarStart}\n </div>\n {state}\n </div>\n ) : (\n state\n );\n if (error)\n return withStart(\n <ArtifactProblem\n view={artifactLoadErrorView(t, error, \"site\", labels)}\n onRetry={() => void load()}\n />,\n );\n if (!snapshot || !content)\n return withStart(<ArtifactLoading label={loadingLabel ?? labels.loadingSite} />);\n if (snapshot.detail.artifact.status === \"archived\")\n return withStart(\n <div className=\"p-4 text-sm text-fg-muted\">{archivedMessage ?? labels.siteArchived}</div>,\n );\n const liveState: SiteLiveState | undefined =\n versionId === undefined && watch === undefined\n ? undefined\n : refresh === \"loading\" || (versionId && versionId !== shownVersion && refresh !== \"failed\")\n ? \"updating\"\n : watch === \"reconnecting\" || refresh === \"failed\"\n ? \"reconnecting\"\n : \"live\";\n return (\n <ArtifactSandbox\n html={content.html}\n title={snapshot.detail.artifact.title}\n showTitle={showTitle}\n versionLabel={\n !versionControl && snapshot.detail.artifact.currentVersion\n ? t(\"artifacts.siteView.vRevision\", {\n revision: snapshot.detail.artifact.currentVersion.revision,\n })\n : undefined\n }\n headerControls={versionControl}\n {...(toolbarStart ? { toolbarStart } : {})}\n liveState={liveState}\n toolBridge={bridge}\n viewer={viewer}\n {...(siteLocation !== undefined ? { siteLocation } : {})}\n {...(onSiteLocationChange ? { onSiteLocationChange } : {})}\n connectedToolCount={content.requestedTools.length}\n theme={theme}\n {...(showToolbar !== undefined ? { showToolbar } : {})}\n {...(liveStatus !== undefined ? { liveStatus } : {})}\n {...(reloadToken !== undefined ? { reloadToken } : {})}\n // A new version is a new page, even when its HTML is unchanged (its\n // tool bridge is bound to the version); it replaces the frame in the\n // same render as its HTML, so the Site loads once.\n frameKey={content.versionId}\n {...(fullScreen !== undefined ? { fullScreen } : {})}\n {...(onFullScreenChange ? { onFullScreenChange } : {})}\n fill\n className={className ?? \"h-full rounded-none border-0\"}\n />\n );\n}\n","import type { EditableArtifactResource } from \"@opengeni/sdk/artifacts\";\nimport {\n createBrowserEditableArtifactSession,\n type CreateBrowserEditableArtifactSessionOptions,\n type EditableArtifactBrowserRuntime,\n type EditableArtifactCacheAuthority,\n type EditableArtifactModality,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n ArtifactLoading,\n ArtifactProblem,\n artifactLoadErrorView,\n useArtifactLabels,\n type ArtifactLoadErrorView,\n} from \"./artifact-chrome\";\nimport { EditableArtifactWorkbenchHost } from \"./editable-artifact-workbench\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\n\n/**\n * The browser kernels an editor needs, one per modality, plus the host-built\n * Worker URL (for Vite: `@opengeni/sdk/editable-artifacts/worker?worker&url`).\n * Kernels come from `@opengeni/artifact-kernel-wasm-{document,spreadsheet,presentation}`.\n */\nexport type EditableArtifactRuntimes = Readonly<{\n document: Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\">;\n spreadsheet: Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\">;\n presentation: Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\">;\n workerUrl: string;\n applicationOrigin?: string | undefined;\n /** Loopback development only. */\n allowInsecureDevelopmentAssets?: boolean | undefined;\n}>;\n\n/** Everything needed to open one artifact for the current principal. */\nexport type OpenedEditableArtifact = Readonly<{\n artifact: EditableArtifactResource;\n authority: EditableArtifactCacheAuthority;\n replicaId: string;\n}>;\n\nexport type EditableArtifactViewProps = Readonly<{\n /** Absolute API (or session proxy) base the live transport talks to. */\n baseUrl: URL;\n workspaceId: string;\n artifactId: string;\n /** Resolve metadata, cache authority, and replica; called again on retry. */\n open: (signal: AbortSignal) => Promise<OpenedEditableArtifact>;\n runtimes: EditableArtifactRuntimes;\n transport?: CreateBrowserEditableArtifactSessionOptions[\"transport\"];\n /** Show the editor's own title header (hosts with their own header hide it). */\n showHeader?: boolean | undefined;\n /** Re-open when this changes (for example the host's credential version). */\n authorityKey?: string | undefined;\n describeError?: ((error: unknown) => ArtifactLoadErrorView) | undefined;\n onTitle?: ((title: string) => void) | undefined;\n /** Loading copy; defaults to the `opening` label. */\n loadingLabel?: string | undefined;\n /**\n * Host-authenticated Office export (DOCX, XLSX, or PPTX by modality); omitted\n * for hosts without export support. Every editor shows Download when set.\n */\n downloadArtifact?:\n | ((opened: OpenedEditableArtifact, signal: AbortSignal) => Promise<Blob>)\n | undefined;\n /** Spreadsheet-only XLSX export; `downloadArtifact` takes precedence when both are set. */\n downloadSpreadsheet?:\n | ((opened: OpenedEditableArtifact, signal: AbortSignal) => Promise<Blob>)\n | undefined;\n}>;\n\ntype LoadState =\n | Readonly<{ key: string | null; kind: \"loading\" }>\n | Readonly<{ key: string; kind: \"ready\"; value: OpenedEditableArtifact }>\n | Readonly<{ key: string; kind: \"error\"; error: unknown }>;\n\n/**\n * One editable document, spreadsheet, or presentation with its first-party\n * editor. The console dock/page and embedding hosts supply only data access.\n */\nexport function EditableArtifactView({\n baseUrl,\n workspaceId,\n artifactId,\n open,\n runtimes,\n transport,\n showHeader = true,\n authorityKey,\n describeError,\n onTitle,\n loadingLabel,\n downloadArtifact,\n downloadSpreadsheet,\n}: EditableArtifactViewProps) {\n const t = useOpenGeniText();\n const [loadEpoch, setLoadEpoch] = useState(0);\n const labels = useArtifactLabels();\n const loadKey = JSON.stringify([artifactId, authorityKey, baseUrl.href, workspaceId, loadEpoch]);\n const [state, setState] = useState<LoadState>({ key: null, kind: \"loading\" });\n const current = state.key === loadKey ? state : null;\n const openRef = useRef(open);\n openRef.current = open;\n const onTitleRef = useRef(onTitle);\n onTitleRef.current = onTitle;\n useEffect(() => {\n const abort = new AbortController();\n setState({ key: loadKey, kind: \"loading\" });\n void openRef\n .current(abort.signal)\n .then((value) => {\n if (abort.signal.aborted) return;\n setState({ key: loadKey, kind: \"ready\", value });\n onTitleRef.current?.(value.artifact.title);\n })\n .catch((error: unknown) => {\n if (!abort.signal.aborted) setState({ key: loadKey, kind: \"error\", error });\n });\n return () => abort.abort();\n }, [loadKey]);\n\n const ready = current?.kind === \"ready\" ? current.value : null;\n const transportRef = useRef(transport);\n transportRef.current = transport;\n const sessionKey = useMemo(\n () =>\n ready\n ? JSON.stringify({\n baseUrl: baseUrl.href,\n authorityKey,\n workspaceId,\n artifact: { id: ready.artifact.id, modality: ready.artifact.modality },\n authority: ready.authority,\n replicaId: ready.replicaId,\n workerUrl: runtimes.workerUrl,\n })\n : \"\",\n [authorityKey, baseUrl.href, ready, runtimes.workerUrl, workspaceId],\n );\n const createSession = useCallback(() => {\n if (!ready) throw new Error(\"Artifact is not open\");\n return createBrowserEditableArtifactSession({\n baseUrl,\n workspaceId,\n artifact: ready.artifact,\n storageAuthority: ready.authority,\n replicaId: ready.replicaId,\n runtime: {\n ...runtimeFor(runtimes, ready.artifact.modality),\n workerUrl: runtimes.workerUrl,\n ...(runtimes.applicationOrigin ? { applicationOrigin: runtimes.applicationOrigin } : {}),\n ...(runtimes.allowInsecureDevelopmentAssets\n ? { allowInsecureDevelopmentAssets: true }\n : {}),\n },\n ...(transportRef.current ? { transport: transportRef.current } : {}),\n });\n }, [baseUrl, ready, runtimes, workspaceId]);\n\n if (!current || current.kind === \"loading\")\n return <ArtifactLoading label={loadingLabel ?? labels.opening} />;\n if (current.kind === \"error\") {\n return (\n <ArtifactProblem\n view={\n describeError\n ? describeError(current.error)\n : artifactLoadErrorView(t, current.error, \"editable\", labels)\n }\n onRetry={() => setLoadEpoch((value) => value + 1)}\n />\n );\n }\n const { artifact } = current.value;\n const surface = { title: artifact.title, showHeader };\n const opened = current.value;\n const exportFor = (\n host: ((opened: OpenedEditableArtifact, signal: AbortSignal) => Promise<Blob>) | undefined,\n ) => (host ? (signal: AbortSignal) => host(opened, signal) : undefined);\n return (\n <div className=\"h-full min-h-0 bg-og-bg text-og-fg\">\n <EditableArtifactWorkbenchHost\n sessionKey={sessionKey}\n createSession={createSession}\n document={{ ...surface, download: exportFor(downloadArtifact) }}\n spreadsheet={{ ...surface, download: exportFor(downloadArtifact ?? downloadSpreadsheet) }}\n presentation={{ ...surface, download: exportFor(downloadArtifact) }}\n />\n </div>\n );\n}\n\nfunction runtimeFor(\n runtimes: EditableArtifactRuntimes,\n modality: EditableArtifactModality,\n): Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\"> {\n switch (modality) {\n case \"document\":\n return runtimes.document;\n case \"spreadsheet\":\n return runtimes.spreadsheet;\n case \"presentation\":\n return runtimes.presentation;\n }\n}\n","import {\n createBrowserEditableArtifactSession,\n type CreateBrowserEditableArtifactSessionOptions,\n type EditableArtifactBrowserRuntime,\n type EditableArtifactSession,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useArtifactLabels } from \"./artifact-chrome\";\nimport { EditableArtifactMessage } from \"./editable-artifact-ui\";\nimport {\n EditableDocumentArtifactSurface,\n type EditableDocumentArtifactSurfaceProps,\n} from \"./editable-document\";\nimport {\n EditablePresentationArtifactSurface,\n type EditablePresentationArtifactSurfaceProps,\n} from \"./editable-presentation\";\nimport {\n EditableSpreadsheetArtifactSurface,\n type EditableSpreadsheetArtifactSurfaceProps,\n} from \"./editable-spreadsheet\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\n\nexport type EditableArtifactWorkbenchProps = Readonly<{\n session: EditableArtifactSession;\n document?: Omit<EditableDocumentArtifactSurfaceProps, \"session\">;\n spreadsheet?: Omit<EditableSpreadsheetArtifactSurfaceProps, \"session\">;\n presentation?: Omit<EditablePresentationArtifactSurfaceProps, \"session\">;\n}>;\n\nexport type EditableArtifactWorkbenchHostProps = Omit<EditableArtifactWorkbenchProps, \"session\"> &\n Readonly<{\n /**\n * Complete identity of the browser session authority. Change this when the\n * artifact, deployment, principal, or authorization epoch changes.\n */\n sessionKey: string;\n /** Called for the active keyed lifecycle and again only after replacement or retry. */\n createSession: () => EditableArtifactSession;\n }>;\n\ntype DefaultBrowserArtifactTransport = Omit<\n NonNullable<CreateBrowserEditableArtifactSessionOptions[\"transport\"]>,\n \"apiKey\" | \"fetch\" | \"headers\" | \"webSocketFactory\"\n> &\n Readonly<{\n /** Static deployment auth headers; rotate authorizationEpoch when they change. */\n headers?: Readonly<Record<string, string>>;\n }>;\n\nexport type BrowserEditableArtifactWorkbenchOptions = Omit<\n CreateBrowserEditableArtifactSessionOptions,\n \"runtime\" | \"storage\" | \"transport\"\n> &\n Readonly<{\n /** Default module Worker only; custom Worker hosts use EditableArtifactWorkbenchHost. */\n runtime: Omit<EditableArtifactBrowserRuntime, \"workerFactory\">;\n /** Default fetch/WebSocket only; static deployment auth headers are supported. */\n transport?: DefaultBrowserArtifactTransport;\n }>;\n\nexport type BrowserEditableArtifactWorkbenchProps = Omit<\n EditableArtifactWorkbenchProps,\n \"session\"\n> &\n Readonly<{ options: BrowserEditableArtifactWorkbenchOptions }>;\n\n/**\n * One modality-neutral SDK workbench. Embedding hosts keep one route/component;\n * each artifact still renders through its complete first-party editor surface.\n */\nexport function EditableArtifactWorkbench({\n session,\n document,\n spreadsheet,\n presentation,\n}: EditableArtifactWorkbenchProps) {\n const t = useOpenGeniText();\n switch (session.modality) {\n case \"document\":\n return (\n <EditableDocumentArtifactSurface\n {...document}\n session={session}\n title={document?.title ?? t(\"artifacts.editableArtifactWorkbench.document\")}\n />\n );\n case \"spreadsheet\":\n return <EditableSpreadsheetArtifactSurface {...spreadsheet} session={session} />;\n case \"presentation\":\n return <EditablePresentationArtifactSurface {...presentation} session={session} />;\n }\n}\n\n/**\n * Route/embed composition that owns exactly one SDK session. The host supplies\n * the authenticated SDK factory; React guarantees replacement and teardown.\n */\nexport function EditableArtifactWorkbenchHost({\n sessionKey,\n createSession,\n document,\n spreadsheet,\n presentation,\n}: EditableArtifactWorkbenchHostProps) {\n const createSessionRef = useRef(createSession);\n const [retryEpoch, setRetryEpoch] = useState(0);\n const [state, setState] = useState<\n | Readonly<{ key: string; session: EditableArtifactSession; error: null }>\n | Readonly<{ key: string | null; session: null; error: Error | null }>\n >({ key: null, session: null, error: null });\n\n useEffect(() => {\n createSessionRef.current = createSession;\n }, [createSession]);\n\n useEffect(() => {\n let owned: EditableArtifactSession | null = null;\n setState({ key: sessionKey, session: null, error: null });\n try {\n owned = createSessionRef.current();\n setState({ key: sessionKey, session: owned, error: null });\n } catch (cause) {\n setState({\n key: sessionKey,\n session: null,\n error: cause instanceof Error ? cause : new Error(\"Could not create artifact session\"),\n });\n }\n return () => {\n const closing = owned;\n owned = null;\n if (closing) void closing.close().catch(() => undefined);\n };\n }, [retryEpoch, sessionKey]);\n\n const retry = useCallback(() => setRetryEpoch((value) => value + 1), []);\n const labels = useArtifactLabels();\n const currentError = state.key === sessionKey ? state.error : null;\n if (state.key === sessionKey && state.session) {\n return (\n <EditableArtifactWorkbench\n session={state.session}\n {...(document ? { document } : {})}\n {...(spreadsheet ? { spreadsheet } : {})}\n {...(presentation ? { presentation } : {})}\n />\n );\n }\n return (\n <EditableArtifactMessage\n title={currentError ? labels.editableErrors.transient.title : labels.opening}\n detail={currentError?.message ?? labels.startingEditor}\n retry={currentError ? retry : undefined}\n retryLabel={labels.retry}\n />\n );\n}\n\n/**\n * Complete default-browser composition for embedders: verified WASM Worker,\n * durable IndexedDB state, authenticated live sync, teardown, and the matching\n * first-party editor. Advanced/custom transports compose the lower-level host.\n */\nexport function BrowserEditableArtifactWorkbench({\n options,\n document,\n spreadsheet,\n presentation,\n}: BrowserEditableArtifactWorkbenchProps) {\n const sessionKey = browserSessionKey(options);\n const createSession = useCallback(() => createBrowserEditableArtifactSession(options), [options]);\n return (\n <EditableArtifactWorkbenchHost\n sessionKey={sessionKey}\n createSession={createSession}\n {...(document ? { document } : {})}\n {...(spreadsheet ? { spreadsheet } : {})}\n {...(presentation ? { presentation } : {})}\n />\n );\n}\n\nfunction browserSessionKey(options: BrowserEditableArtifactWorkbenchOptions): string {\n const transport = options.transport\n ? {\n ...options.transport,\n // Credentials must not be copied into React lifecycle keys. The\n // authorization epoch is the explicit credential/grant rotation fence.\n headers: options.transport.headers\n ? Object.keys(options.transport.headers).sort()\n : undefined,\n }\n : null;\n return JSON.stringify(\n {\n baseUrl: options.baseUrl,\n workspaceId: options.workspaceId,\n artifact: { id: options.artifact.id, modality: options.artifact.modality },\n storageAuthority: options.storageAuthority,\n runtime: options.runtime,\n replicaId: options.replicaId ?? null,\n transport,\n },\n (_key, value: unknown) => (value instanceof URL ? value.href : value),\n );\n}\n","import { SESSION_SCOPE_HEADER, type ClientConfig, type OpenGeniClient } from \"@opengeni/sdk\";\nimport { createEditableArtifactReplicaId } from \"@opengeni/sdk/editable-artifacts\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { joinClientConfigRead } from \"../../lib/client-config-read\";\nimport { useOpenGeni, type ClientOverride } from \"../../session-context\";\nimport {\n ArtifactLabelsProvider,\n ArtifactLoading,\n ArtifactProblem,\n ArtifactViewerHeader,\n artifactLoadErrorView,\n useArtifactLabels,\n type ArtifactKind,\n type ArtifactLabels,\n} from \"./artifact-chrome\";\nimport { EditableArtifactView, type EditableArtifactRuntimes } from \"./editable-artifact-view\";\nimport type { SiteToolBridgeFactory } from \"./chat-interactive-block\";\nimport { SiteView } from \"./site-view\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\n\n/** An artifact opened from a session: the targets agent links and Site previews name. */\nexport type SessionArtifactTarget = Readonly<\n | { kind: \"editable-artifact\"; artifactId: string; title?: string | undefined }\n | { kind: \"site\"; artifactId: string; title?: string | undefined }\n>;\n\n/** Every string the viewer shows, including its Site frame and states. */\nexport type SessionArtifactViewerLabels = Partial<ArtifactLabels>;\n\nexport type SessionArtifactViewerProps = ClientOverride &\n Readonly<{\n /** The conversation the artifact belongs to; the proxy only serves its artifacts. */\n sessionId: string;\n target: SessionArtifactTarget;\n onClose: () => void;\n /** Show a Back control, for example to return to the conversation on phones. */\n onBack?: (() => void) | undefined;\n /** Browser kernels and Worker for documents, spreadsheets, and presentations. */\n editableRuntimes?: EditableArtifactRuntimes | undefined;\n theme?: \"light\" | \"dark\" | undefined;\n /** Host-owned Site API access; omit it and Sites render without workspace tools. */\n siteToolBridge?: SiteToolBridgeFactory | undefined;\n labels?: SessionArtifactViewerLabels | undefined;\n className?: string | undefined;\n }>;\n\ntype ViewerClient = Pick<\n OpenGeniClient,\n | \"withHeaders\"\n | \"apiUrl\"\n | \"fetchApi\"\n | \"getClientConfig\"\n | \"getEditableArtifact\"\n | \"getWorkspaceArtifact\"\n | \"getWorkspaceArtifactHtml\"\n>;\n\nconst viewerClientKeys = new WeakMap<ViewerClient, string>();\n\nfunction viewerClientKey(client: ViewerClient): string {\n let key = viewerClientKeys.get(client);\n if (!key) {\n key = crypto.randomUUID();\n viewerClientKeys.set(client, key);\n }\n return key;\n}\n\n/**\n * A host-mountable viewer for one editable artifact or Site from a session,\n * with its own header (title, Back, Close). Mount it in any sized container\n * (a side panel, a sheet); it fills it. Data flows through the provider's\n * client (for example through `createSessionProxyHandler`), scoped to\n * `sessionId`.\n */\nexport function SessionArtifactViewer({ labels, ...props }: SessionArtifactViewerProps) {\n return (\n <ArtifactLabelsProvider labels={labels}>\n <Viewer {...props} />\n </ArtifactLabelsProvider>\n );\n}\n\nfunction Viewer({\n client: clientOverride,\n workspaceId: workspaceOverride,\n sessionId,\n target,\n onClose,\n onBack,\n editableRuntimes,\n theme,\n siteToolBridge,\n className,\n}: Omit<SessionArtifactViewerProps, \"labels\">) {\n const labels = useArtifactLabels();\n const context = useOpenGeni({ client: clientOverride, workspaceId: workspaceOverride });\n const base = context.client as unknown as ViewerClient;\n const workspaceId = context.workspaceId;\n const client = useMemo(\n () => base.withHeaders({ [SESSION_SCOPE_HEADER]: sessionId }),\n [base, sessionId],\n );\n const [loaded, setLoaded] = useState<{\n key: string;\n client: ViewerClient;\n workspaceId: string;\n title: string;\n kind: ArtifactKind | null;\n } | null>(null);\n const targetKey = `${target.kind}:${target.artifactId}`;\n const current =\n loaded?.key === targetKey && loaded.client === client && loaded.workspaceId === workspaceId\n ? loaded\n : null;\n const kind: ArtifactKind | null = target.kind === \"site\" ? \"site\" : (current?.kind ?? null);\n const [unavailable, setUnavailable] = useState<{\n key: string;\n client: ViewerClient;\n workspaceId: string;\n } | null>(null);\n const markUnavailable = useCallback(\n () => setUnavailable({ key: targetKey, client, workspaceId }),\n [client, targetKey, workspaceId],\n );\n const title =\n current?.title ??\n target.title ??\n (unavailable?.key === targetKey &&\n unavailable.client === client &&\n unavailable.workspaceId === workspaceId\n ? labels.artifact\n : labels.opening);\n return (\n <section\n aria-label={title}\n data-og-artifact-viewer={target.kind}\n className={cn(\"og-root flex h-full min-h-0 w-full min-w-0 flex-col bg-bg text-fg\", className)}\n >\n <ArtifactViewerHeader\n kind={kind}\n title={title}\n onBack={onBack}\n backLabel={labels.back}\n onClose={onClose}\n closeLabel={labels.close}\n />\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n {target.kind === \"site\" ? (\n <SiteView\n key={targetKey}\n client={client}\n workspaceId={workspaceId}\n siteId={target.artifactId}\n theme={theme}\n toolBridge={siteToolBridge}\n showTitle={false}\n onTitle={(next) =>\n setLoaded({ key: targetKey, client, workspaceId, title: next, kind: \"site\" })\n }\n />\n ) : (\n <EditableBody\n key={targetKey}\n client={client}\n workspaceId={workspaceId}\n sessionId={sessionId}\n artifactId={target.artifactId}\n runtimes={editableRuntimes}\n onOpened={(next, modality) =>\n setLoaded({ key: targetKey, client, workspaceId, title: next, kind: modality })\n }\n onUnavailable={markUnavailable}\n />\n )}\n </div>\n </section>\n );\n}\n\nfunction EditableBody({\n client,\n workspaceId,\n sessionId,\n artifactId,\n runtimes,\n onOpened,\n onUnavailable,\n}: {\n client: ViewerClient;\n workspaceId: string;\n sessionId: string;\n artifactId: string;\n runtimes: EditableArtifactRuntimes | undefined;\n onOpened: (title: string, modality: ArtifactKind) => void;\n onUnavailable: () => void;\n}) {\n const t = useOpenGeniText();\n const labels = useArtifactLabels();\n const clientKey = viewerClientKey(client);\n const [retryEpoch, setRetryEpoch] = useState(0);\n const [configState, setConfigState] = useState<{\n client: ViewerClient;\n workspaceId: string;\n sessionId: string;\n result:\n | { kind: \"ready\"; config: Exclude<NonNullable<ClientConfig[\"artifacts\"]>, false> }\n | { kind: \"unavailable\" }\n | { kind: \"error\"; error: unknown };\n } | null>(null);\n const current =\n configState?.client === client &&\n configState.workspaceId === workspaceId &&\n configState.sessionId === sessionId\n ? configState.result\n : null;\n const config = current?.kind === \"ready\" ? current.config : null;\n const scopeRef = useRef({ client, workspaceId, sessionId });\n scopeRef.current = { client, workspaceId, sessionId };\n useEffect(() => {\n let live = true;\n setConfigState(null);\n joinClientConfigRead(client).then(\n (value) =>\n live &&\n setConfigState({\n client,\n workspaceId,\n sessionId,\n result: value.artifacts\n ? { kind: \"ready\", config: value.artifacts }\n : { kind: \"unavailable\" },\n }),\n (error: unknown) =>\n live &&\n setConfigState({ client, workspaceId, sessionId, result: { kind: \"error\", error } }),\n );\n return () => {\n live = false;\n };\n }, [client, retryEpoch, sessionId, workspaceId]);\n const baseUrl = useMemo(\n () => new URL(client.apiUrl(\"/\"), globalThis.location?.href ?? \"http://localhost/\"),\n [client],\n );\n const transport = useMemo(() => {\n if (!config) return undefined;\n const socket = new URL(config.editableLiveUrl);\n let scope = new AbortController();\n const checkCurrent = (signal: AbortSignal) => {\n signal.throwIfAborted();\n if (\n scopeRef.current.client !== client ||\n scopeRef.current.workspaceId !== workspaceId ||\n scopeRef.current.sessionId !== sessionId\n ) {\n throw new DOMException(\"Artifact viewer scope changed\", \"AbortError\");\n }\n };\n return {\n activate: () => {\n if (scope.signal.aborted) scope = new AbortController();\n },\n abort: () => scope.abort(),\n fetch: (async (input: RequestInfo | URL, init?: RequestInit) => {\n const signal = AbortSignal.any([scope.signal, ...(init?.signal ? [init.signal] : [])]);\n checkCurrent(signal);\n const url = new URL(input instanceof Request ? input.url : input, baseUrl);\n if (\n init?.method === \"POST\" &&\n url.pathname ===\n new URL(\n `v1/workspaces/${encodeURIComponent(workspaceId)}/editable-artifacts/${encodeURIComponent(artifactId)}/live-ticket`,\n baseUrl,\n ).pathname\n ) {\n // A reconnect must revalidate the current host principal before\n // minting a ticket for the editor's retained cache partition.\n const next = (await client.getClientConfig({ signal })).artifacts;\n checkCurrent(signal);\n if (!next || artifactCapabilityKey(next) !== artifactCapabilityKey(config)) {\n setConfigState({\n client,\n workspaceId,\n sessionId,\n result: next ? { kind: \"ready\", config: next } : { kind: \"unavailable\" },\n });\n scope.abort();\n signal.throwIfAborted();\n }\n const { replicaId } = (await new Request(input, init).json()) as {\n replicaId?: unknown;\n };\n if (typeof replicaId !== \"string\") throw new TypeError(\"Artifact replica is required\");\n await client.getEditableArtifact(workspaceId, artifactId, { replicaId, signal });\n checkCurrent(signal);\n }\n return client.fetchApi(url, { ...init, signal });\n }) as typeof fetch,\n webSocketUrl: socket,\n ...(isLoopback(baseUrl) && isLoopback(socket)\n ? { allowInsecureDevelopmentTransport: true }\n : {}),\n };\n }, [artifactId, baseUrl, client, config, sessionId, workspaceId]);\n useEffect(() => {\n transport?.activate();\n return () => transport?.abort();\n }, [transport]);\n const blocked = current !== null && (current.kind !== \"ready\" || !runtimes);\n useEffect(() => {\n if (blocked) onUnavailable();\n }, [blocked, onUnavailable]);\n if (!current) return <ArtifactLoading label={labels.opening} />;\n if (current.kind === \"error\") {\n return (\n <ArtifactProblem\n view={artifactLoadErrorView(t, current.error, \"editable\", labels)}\n onRetry={() => setRetryEpoch((value) => value + 1)}\n />\n );\n }\n if (!config || !transport) {\n return <ArtifactProblem view={{ ...labels.viewingDisabled, retryable: false }} />;\n }\n if (!runtimes) {\n return <ArtifactProblem view={{ ...labels.editorsMissing, retryable: false }} />;\n }\n return (\n <EditableArtifactView\n baseUrl={baseUrl}\n workspaceId={workspaceId}\n artifactId={artifactId}\n authorityKey={JSON.stringify([clientKey, sessionId, artifactCapabilityKey(config)])}\n runtimes={{\n ...runtimes,\n ...(isLoopback(baseUrl) ? { allowInsecureDevelopmentAssets: true } : {}),\n }}\n transport={transport}\n showHeader={false}\n open={async (signal) => {\n const replicaId = createEditableArtifactReplicaId();\n const artifact = await client.getEditableArtifact(workspaceId, artifactId, {\n replicaId,\n signal,\n });\n signal.throwIfAborted();\n onOpened(artifact.title, artifact.modality);\n return {\n artifact,\n replicaId,\n authority: {\n deploymentOrigin: baseUrl.origin,\n workspaceId,\n ...config.cachePartition,\n },\n };\n }}\n />\n );\n}\n\nfunction artifactCapabilityKey(\n config: Exclude<NonNullable<ClientConfig[\"artifacts\"]>, false>,\n): string {\n return JSON.stringify([\n config.editableLiveUrl,\n config.cachePartition.accountId,\n config.cachePartition.principalId,\n config.cachePartition.authorizationEpoch,\n ]);\n}\n\nfunction isLoopback(url: URL): boolean {\n return (\n (url.protocol === \"http:\" || url.protocol === \"ws:\") &&\n (url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\" || url.hostname === \"[::1]\")\n );\n}\n"],"mappings":"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","names":["createBrowserEditableArtifactSession","useCallback","useEffect","useMemo","useRef","useState","useCallback","useEffect","useRef","useState","jsx","document","useRef","useState","useEffect","useCallback","jsx","useState","useRef","useEffect","useMemo","useCallback","createBrowserEditableArtifactSession","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","useMemo","useState","useCallback","useRef","useEffect"]}