@opengeni/react 3.3.2 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (855) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +2 -0
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/approvals.d.ts +2 -1
  5. package/dist/artifacts-document.js +5 -3
  6. package/dist/artifacts-presentation.js +5 -3
  7. package/dist/artifacts-spreadsheet.d.ts +1 -1
  8. package/dist/artifacts-spreadsheet.js +5 -3
  9. package/dist/artifacts.d.ts +5 -1
  10. package/dist/artifacts.js +536 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-4EUKJXUO.js +14 -0
  16. package/dist/chunk-2DDJ6YH6.js +41 -0
  17. package/dist/chunk-2DDJ6YH6.js.map +1 -0
  18. package/dist/chunk-2HVLQ26H.js +183 -0
  19. package/dist/chunk-2HVLQ26H.js.map +1 -0
  20. package/dist/{chunk-XYRDDSXF.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-JAQ5K7W6.js → chunk-2SFFYIH3.js} +1178 -166
  23. package/dist/chunk-2SFFYIH3.js.map +1 -0
  24. package/dist/chunk-3PVDYTTB.js +24 -0
  25. package/dist/chunk-3PVDYTTB.js.map +1 -0
  26. package/dist/chunk-3RJKUVCA.js +14068 -0
  27. package/dist/chunk-3RJKUVCA.js.map +1 -0
  28. package/dist/chunk-3UZCWK46.js +298 -0
  29. package/dist/chunk-3UZCWK46.js.map +1 -0
  30. package/dist/chunk-47CKUXTW.js +293 -0
  31. package/dist/chunk-47CKUXTW.js.map +1 -0
  32. package/dist/chunk-4QYP6QUI.js +109 -0
  33. package/dist/chunk-4QYP6QUI.js.map +1 -0
  34. package/dist/chunk-5EY26VZ7.js +1053 -0
  35. package/dist/chunk-5EY26VZ7.js.map +1 -0
  36. package/dist/chunk-5I4VRWBB.js +56 -0
  37. package/dist/chunk-5I4VRWBB.js.map +1 -0
  38. package/dist/chunk-5WOR7UCL.js +191 -0
  39. package/dist/chunk-5WOR7UCL.js.map +1 -0
  40. package/dist/chunk-5YJLGOM5.js +51 -0
  41. package/dist/chunk-5YJLGOM5.js.map +1 -0
  42. package/dist/chunk-6JFN3OWG.js +386 -0
  43. package/dist/chunk-6JFN3OWG.js.map +1 -0
  44. package/dist/chunk-7QJT5O4S.js +35 -0
  45. package/dist/chunk-7QJT5O4S.js.map +1 -0
  46. package/dist/chunk-A55KV72M.js +402 -0
  47. package/dist/chunk-A55KV72M.js.map +1 -0
  48. package/dist/chunk-ADWCLI4G.js +2028 -0
  49. package/dist/chunk-ADWCLI4G.js.map +1 -0
  50. package/dist/chunk-B27E3V37.js +29 -0
  51. package/dist/chunk-B27E3V37.js.map +1 -0
  52. package/dist/chunk-B7TC2A33.js +83 -0
  53. package/dist/chunk-B7TC2A33.js.map +1 -0
  54. package/dist/chunk-BLL56F7R.js +385 -0
  55. package/dist/chunk-BLL56F7R.js.map +1 -0
  56. package/dist/chunk-BOFEQC6K.js +162 -0
  57. package/dist/chunk-BOFEQC6K.js.map +1 -0
  58. package/dist/chunk-CM7LVUKC.js +35 -0
  59. package/dist/chunk-CM7LVUKC.js.map +1 -0
  60. package/dist/chunk-CORUP6JB.js +122 -0
  61. package/dist/chunk-CORUP6JB.js.map +1 -0
  62. package/dist/chunk-CSX5FFKZ.js +35 -0
  63. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  64. package/dist/chunk-EGVHJKGJ.js +3125 -0
  65. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  66. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  67. package/dist/chunk-G76LSA76.js.map +1 -0
  68. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  69. package/dist/chunk-GQMRL52F.js.map +1 -0
  70. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  71. package/dist/chunk-GUUXOISA.js.map +1 -0
  72. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  73. package/dist/chunk-I7X2P4FU.js.map +1 -0
  74. package/dist/chunk-IGFZFLI2.js +1390 -0
  75. package/dist/chunk-IGFZFLI2.js.map +1 -0
  76. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  77. package/dist/chunk-IMSUVYQB.js.map +1 -0
  78. package/dist/chunk-IOYHDEP3.js +38 -0
  79. package/dist/chunk-IOYHDEP3.js.map +1 -0
  80. package/dist/chunk-IZV5FTJC.js +55 -0
  81. package/dist/chunk-IZV5FTJC.js.map +1 -0
  82. package/dist/chunk-KF33GTWN.js +343 -0
  83. package/dist/chunk-KF33GTWN.js.map +1 -0
  84. package/dist/chunk-KSGQ5ODA.js +457 -0
  85. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  86. package/dist/{chunk-ZPBTI3TE.js → chunk-KZC6QRNR.js} +1513 -697
  87. package/dist/chunk-KZC6QRNR.js.map +1 -0
  88. package/dist/chunk-LJUMYUBO.js +218 -0
  89. package/dist/chunk-LJUMYUBO.js.map +1 -0
  90. package/dist/chunk-LSW2OJVV.js +380 -0
  91. package/dist/chunk-LSW2OJVV.js.map +1 -0
  92. package/dist/chunk-M357MHH3.js +2 -0
  93. package/dist/chunk-M357MHH3.js.map +1 -0
  94. package/dist/chunk-MK2TQO4Y.js +24 -0
  95. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  96. package/dist/chunk-N7S72EXK.js +25 -0
  97. package/dist/chunk-N7S72EXK.js.map +1 -0
  98. package/dist/{chunk-YVCHAQZY.js → chunk-NKMYZFHA.js} +616 -621
  99. package/dist/chunk-NKMYZFHA.js.map +1 -0
  100. package/dist/chunk-NX4ADH73.js +14 -0
  101. package/dist/chunk-NX4ADH73.js.map +1 -0
  102. package/dist/chunk-O7F6UJO4.js +71 -0
  103. package/dist/chunk-O7F6UJO4.js.map +1 -0
  104. package/dist/chunk-OYQQJL3J.js +16 -0
  105. package/dist/chunk-OYQQJL3J.js.map +1 -0
  106. package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
  107. package/dist/chunk-P4BNUO57.js.map +1 -0
  108. package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
  109. package/dist/chunk-PEHTX3V7.js.map +1 -0
  110. package/dist/chunk-PMV53IMM.js +26 -0
  111. package/dist/chunk-PMV53IMM.js.map +1 -0
  112. package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
  113. package/dist/chunk-PYEOPA4M.js.map +1 -0
  114. package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
  115. package/dist/chunk-QHUE7E4N.js.map +1 -0
  116. package/dist/chunk-QV3DJVRZ.js +11 -0
  117. package/dist/chunk-QV3DJVRZ.js.map +1 -0
  118. package/dist/chunk-R5SBNG7S.js +810 -0
  119. package/dist/chunk-R5SBNG7S.js.map +1 -0
  120. package/dist/chunk-RI42H5IU.js +326 -0
  121. package/dist/chunk-RI42H5IU.js.map +1 -0
  122. package/dist/chunk-S2QH6EZ5.js +211 -0
  123. package/dist/chunk-S2QH6EZ5.js.map +1 -0
  124. package/dist/chunk-SHLZMAJN.js +304 -0
  125. package/dist/chunk-SHLZMAJN.js.map +1 -0
  126. package/dist/chunk-TGXK4BAZ.js +293 -0
  127. package/dist/chunk-TGXK4BAZ.js.map +1 -0
  128. package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
  129. package/dist/chunk-TNEZNMSN.js.map +1 -0
  130. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  131. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  132. package/dist/chunk-UNJPZGNK.js +63 -0
  133. package/dist/chunk-UNJPZGNK.js.map +1 -0
  134. package/dist/{chunk-IOLVN74D.js → chunk-V5ZUJT2T.js} +175 -42
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-WBJY57A3.js +402 -0
  137. package/dist/chunk-WBJY57A3.js.map +1 -0
  138. package/dist/chunk-WIUKB3LD.js +1911 -0
  139. package/dist/chunk-WIUKB3LD.js.map +1 -0
  140. package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
  141. package/dist/chunk-WNN7NO2N.js.map +1 -0
  142. package/dist/{chunk-3AGBGTRT.js → chunk-X5UVUIMF.js} +1712 -1174
  143. package/dist/chunk-X5UVUIMF.js.map +1 -0
  144. package/dist/chunk-XDA5QJE7.js +402 -0
  145. package/dist/chunk-XDA5QJE7.js.map +1 -0
  146. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  147. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  148. package/dist/chunk-XHF7OYAN.js +1150 -0
  149. package/dist/chunk-XHF7OYAN.js.map +1 -0
  150. package/dist/chunk-YSRBFJMQ.js +43 -0
  151. package/dist/chunk-YSRBFJMQ.js.map +1 -0
  152. package/dist/chunk-ZOZAPAUO.js +174 -0
  153. package/dist/chunk-ZOZAPAUO.js.map +1 -0
  154. package/dist/chunk-ZQV5W7YC.js +809 -0
  155. package/dist/chunk-ZQV5W7YC.js.map +1 -0
  156. package/dist/chunk-ZUWF4NF7.js +13 -0
  157. package/dist/chunk-ZUWF4NF7.js.map +1 -0
  158. package/dist/client.d.ts +16 -7
  159. package/dist/clipboard.js +3 -1
  160. package/dist/commands/types.d.ts +2 -0
  161. package/dist/components/anthropic-mark.d.ts +3 -0
  162. package/dist/components/approval-surface.d.ts +19 -6
  163. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  164. package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
  165. package/dist/components/artifacts/artifact-surface.d.ts +4 -2
  166. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  167. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  168. package/dist/components/artifacts/document-editor.d.ts +4 -2
  169. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  170. package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
  171. package/dist/components/artifacts/editable-document.d.ts +1 -1
  172. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  173. package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
  174. package/dist/components/artifacts/index.d.ts +9 -2
  175. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  176. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  177. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  178. package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
  179. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  180. package/dist/components/artifacts/site-view.d.ts +26 -0
  181. package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
  182. package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
  183. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  184. package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
  185. package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
  186. package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
  187. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  188. package/dist/components/browser-select-control.d.ts +16 -0
  189. package/dist/components/browser-viewer.d.ts +11 -2
  190. package/dist/components/chat-composer.d.ts +21 -3
  191. package/dist/components/child-session-link.d.ts +9 -0
  192. package/dist/components/claude-mark.d.ts +3 -0
  193. package/dist/components/code-editor.d.ts +1 -4
  194. package/dist/components/composer-transcription-control.d.ts +7 -0
  195. package/dist/components/composer.d.ts +34 -67
  196. package/dist/components/computer-viewer.d.ts +1 -1
  197. package/dist/components/copy-button.d.ts +3 -1
  198. package/dist/components/desktop-viewer.d.ts +1 -1
  199. package/dist/components/grok-mark.d.ts +26 -0
  200. package/dist/components/human-input-form.d.ts +28 -32
  201. package/dist/components/human-input-surface.d.ts +7 -2
  202. package/dist/components/linkified-text.d.ts +18 -0
  203. package/dist/components/machine-input-display.d.ts +22 -1
  204. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  205. package/dist/components/machines/machine-detail.d.ts +7 -1
  206. package/dist/components/machines/machine-status.d.ts +48 -0
  207. package/dist/components/markdown-table-layout.d.ts +18 -0
  208. package/dist/components/markdown.d.ts +37 -4
  209. package/dist/components/message-timeline.d.ts +86 -7
  210. package/dist/components/model-mark.d.ts +29 -0
  211. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  212. package/dist/components/model-policy-picker.d.ts +35 -28
  213. package/dist/components/new-conversation.d.ts +32 -0
  214. package/dist/components/open-geni-chat.d.ts +73 -0
  215. package/dist/components/open-geni-links.d.ts +68 -0
  216. package/dist/components/openrouter-mark.d.ts +6 -0
  217. package/dist/components/opper-mark.d.ts +7 -0
  218. package/dist/components/preview-loading.d.ts +2 -0
  219. package/dist/components/provider-recovery-notice.d.ts +16 -0
  220. package/dist/components/queue-item-content.d.ts +9 -0
  221. package/dist/components/rehype-secret-refs.d.ts +23 -0
  222. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  223. package/dist/components/sandbox-files.d.ts +3 -1
  224. package/dist/components/sandbox-workspace.d.ts +18 -0
  225. package/dist/components/secret-question-field.d.ts +31 -0
  226. package/dist/components/secret-ref-chip.d.ts +35 -0
  227. package/dist/components/session-capability-frame.d.ts +37 -0
  228. package/dist/components/session-chrome.d.ts +57 -8
  229. package/dist/components/session-commands-panel.d.ts +6 -0
  230. package/dist/components/session-commands.d.ts +6 -0
  231. package/dist/components/session-connection-request.d.ts +8 -0
  232. package/dist/components/session-conversation.d.ts +157 -0
  233. package/dist/components/session-list.d.ts +39 -0
  234. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  235. package/dist/components/session-proxy-scope.d.ts +35 -0
  236. package/dist/components/session-status.d.ts +4 -1
  237. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  238. package/dist/components/timeline-anchor.d.ts +24 -0
  239. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  240. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  241. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  242. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  243. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  244. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  245. package/dist/components/timeline-annotations.d.ts +13 -3
  246. package/dist/components/timeline-reading-progress.d.ts +11 -0
  247. package/dist/components/timeline-search.d.ts +34 -0
  248. package/dist/components/timeline-settlement.d.ts +16 -0
  249. package/dist/components/tool-action-review.d.ts +47 -0
  250. package/dist/components/tool-review-history.d.ts +25 -0
  251. package/dist/components/usage-limit-notice.d.ts +49 -0
  252. package/dist/components/usage-member-list.d.ts +91 -0
  253. package/dist/components/usage-meter.d.ts +73 -0
  254. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  255. package/dist/components/user-message-body.d.ts +10 -1
  256. package/dist/composer-messages.d.ts +74 -0
  257. package/dist/composer-messages.js +9 -0
  258. package/dist/composer-messages.js.map +1 -0
  259. package/dist/composer-voice-events.d.ts +8 -0
  260. package/dist/composer.d.ts +5 -4
  261. package/dist/composer.js +26 -13
  262. package/dist/computer-viewer-GMLDXPON.js +20 -0
  263. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  264. package/dist/connect-account-identity.d.ts +8 -0
  265. package/dist/connect-accounts.d.ts +15 -0
  266. package/dist/connect-chooser.d.ts +18 -0
  267. package/dist/connect-panel.d.ts +18 -0
  268. package/dist/connect-setup.d.ts +18 -0
  269. package/dist/connect.d.ts +21 -0
  270. package/dist/connect.js +2149 -0
  271. package/dist/connect.js.map +1 -0
  272. package/dist/connection-catalog.d.ts +38 -0
  273. package/dist/connection-discovery.d.ts +12 -0
  274. package/dist/connection-installed.d.ts +17 -0
  275. package/dist/connection-logo.d.ts +9 -0
  276. package/dist/connection-service-logo.d.ts +8 -0
  277. package/dist/connection-service-presentation.d.ts +13 -0
  278. package/dist/connection-skeleton.d.ts +5 -0
  279. package/dist/connection-type-picker.d.ts +6 -0
  280. package/dist/conversation-timeline.d.ts +5 -0
  281. package/dist/desktop.d.ts +7 -0
  282. package/dist/desktop.js +27 -0
  283. package/dist/desktop.js.map +1 -0
  284. package/dist/device-authorization.d.ts +23 -0
  285. package/dist/diffs.d.ts +8 -0
  286. package/dist/diffs.js +15 -0
  287. package/dist/diffs.js.map +1 -0
  288. package/dist/discovery-cache.d.ts +5 -0
  289. package/dist/editor.d.ts +7 -0
  290. package/dist/editor.js +22 -0
  291. package/dist/editor.js.map +1 -0
  292. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  293. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  294. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  295. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  296. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  297. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  298. package/dist/hooks/latest-question.d.ts +25 -0
  299. package/dist/hooks/shared-machines-list.d.ts +4 -0
  300. package/dist/hooks/shared-query.d.ts +113 -0
  301. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  302. package/dist/hooks/use-auth-runs.d.ts +1 -4
  303. package/dist/hooks/use-available-models.d.ts +1 -1
  304. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  305. package/dist/hooks/use-browser-session.d.ts +12 -1
  306. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  307. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  308. package/dist/hooks/use-composer.d.ts +24 -2
  309. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  310. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  311. package/dist/hooks/use-computer-session.d.ts +4 -0
  312. package/dist/hooks/use-connect.d.ts +23 -0
  313. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  314. package/dist/hooks/use-file-attachments.d.ts +12 -0
  315. package/dist/hooks/use-goal.d.ts +2 -1
  316. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  317. package/dist/hooks/use-new-conversation.d.ts +56 -0
  318. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  319. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  320. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  321. package/dist/hooks/use-session-conversation.d.ts +49 -0
  322. package/dist/hooks/use-session-events.d.ts +26 -5
  323. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  324. package/dist/hooks/use-session-model-account.d.ts +48 -0
  325. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  326. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  327. package/dist/hooks/use-usage.d.ts +40 -0
  328. package/dist/hooks/use-vaults.d.ts +53 -0
  329. package/dist/hooks/use-voice-input.d.ts +8 -1
  330. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  331. package/dist/hooks/use-workspace-sessions.d.ts +24 -5
  332. package/dist/human-input-model.d.ts +122 -0
  333. package/dist/identity-link-accounts.d.ts +11 -0
  334. package/dist/identity-link-consent.d.ts +18 -0
  335. package/dist/index.d.ts +82 -20
  336. package/dist/index.js +2340 -6603
  337. package/dist/index.js.map +1 -1
  338. package/dist/interaction.d.ts +1 -1
  339. package/dist/interaction.js +14 -24
  340. package/dist/interaction.js.map +1 -1
  341. package/dist/latest-question-R77KWSUP.js +118 -0
  342. package/dist/latest-question-R77KWSUP.js.map +1 -0
  343. package/dist/lib/clipboard.d.ts +7 -0
  344. package/dist/lib/error-message.d.ts +7 -0
  345. package/dist/lib/format.d.ts +58 -4
  346. package/dist/lib/host-theme.d.ts +77 -0
  347. package/dist/lib/interaction-errors.d.ts +3 -0
  348. package/dist/lib/menu-styles.d.ts +22 -0
  349. package/dist/lib/notify-observer.d.ts +2 -0
  350. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  351. package/dist/lib/provider-recovery.d.ts +55 -0
  352. package/dist/lib/scrollbars.d.ts +11 -0
  353. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  354. package/dist/lib/transient-retry.d.ts +25 -0
  355. package/dist/lib/workbench-peers.d.ts +36 -0
  356. package/dist/lib/xterm-theme.d.ts +7 -5
  357. package/dist/machines.js +9 -5
  358. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  359. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  360. package/dist/mcp-connection-status.d.ts +14 -0
  361. package/dist/model-mark-paths.d.ts +34 -0
  362. package/dist/model-mark-paths.js +16 -0
  363. package/dist/model-mark-paths.js.map +1 -0
  364. package/dist/model-picker-model.d.ts +111 -0
  365. package/dist/model-picker-model.js +25 -0
  366. package/dist/model-picker-model.js.map +1 -0
  367. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  368. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  369. package/dist/model-policy.d.ts +30 -3
  370. package/dist/model-policy.js +14 -1
  371. package/dist/native-previews.d.ts +28 -0
  372. package/dist/native-previews.js +82 -0
  373. package/dist/native-previews.js.map +1 -0
  374. package/dist/new-session-draft.d.ts +7 -0
  375. package/dist/new-session-draft.js +639 -0
  376. package/dist/new-session-draft.js.map +1 -0
  377. package/dist/notification-text.d.ts +27 -0
  378. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  379. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  380. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  381. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  382. package/dist/older-history.d.ts +3 -2
  383. package/dist/organization-model.d.ts +32 -0
  384. package/dist/organization-model.js +65 -0
  385. package/dist/organization-model.js.map +1 -0
  386. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  387. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  388. package/dist/plugin-details.d.ts +14 -0
  389. package/dist/plugin-discovery.d.ts +25 -0
  390. package/dist/preview-loading-paint.d.ts +20 -0
  391. package/dist/provider.d.ts +25 -2
  392. package/dist/queue-presentation-model.d.ts +72 -0
  393. package/dist/queue-presentation-model.js +38 -0
  394. package/dist/queue-presentation-model.js.map +1 -0
  395. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  396. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  397. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  398. package/dist/realtime/embedded-voice.d.ts +1 -0
  399. package/dist/realtime/realtime-control.d.ts +4 -65
  400. package/dist/realtime/session-realtime.d.ts +78 -0
  401. package/dist/realtime.js +25 -1333
  402. package/dist/realtime.js.map +1 -1
  403. package/dist/sandbox-files-O27IPOZW.js +21 -0
  404. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  405. package/dist/sandbox-label-model.d.ts +30 -0
  406. package/dist/sandbox-label-model.js +20 -0
  407. package/dist/sandbox-label-model.js.map +1 -0
  408. package/dist/scrollbars.d.ts +1 -0
  409. package/dist/scrollbars.js +10 -0
  410. package/dist/scrollbars.js.map +1 -0
  411. package/dist/secret-reference-label.d.ts +14 -0
  412. package/dist/secrets-ui.d.ts +57 -0
  413. package/dist/session-agents-model.d.ts +10 -0
  414. package/dist/session-agents-model.js +25 -0
  415. package/dist/session-agents-model.js.map +1 -0
  416. package/dist/session-attention-model.d.ts +8 -0
  417. package/dist/session-attention-model.js +47 -0
  418. package/dist/session-attention-model.js.map +1 -0
  419. package/dist/session-auth-recommendation.d.ts +5 -0
  420. package/dist/session-capability-policy.d.ts +31 -0
  421. package/dist/session-feedback-model.d.ts +20 -0
  422. package/dist/session-feedback-model.js +56 -0
  423. package/dist/session-feedback-model.js.map +1 -0
  424. package/dist/session-list-model.d.ts +138 -0
  425. package/dist/session-list-model.js +274 -0
  426. package/dist/session-list-model.js.map +1 -0
  427. package/dist/session-realtime-7DJOIHQW.js +21 -0
  428. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  429. package/dist/session-realtime.d.ts +7 -0
  430. package/dist/session-realtime.js +19 -0
  431. package/dist/session-realtime.js.map +1 -0
  432. package/dist/session-status-model.d.ts +36 -0
  433. package/dist/session-ui.d.ts +39 -1
  434. package/dist/session-ui.js +126 -12
  435. package/dist/session-ui.js.map +1 -1
  436. package/dist/session.d.ts +8 -2
  437. package/dist/session.js +35 -20
  438. package/dist/site-snapshot.d.ts +14 -0
  439. package/dist/sites-ui.d.ts +24 -0
  440. package/dist/sites.d.ts +3 -0
  441. package/dist/sites.js +14 -0
  442. package/dist/sites.js.map +1 -0
  443. package/dist/skill-discovery.d.ts +47 -0
  444. package/dist/terminal.d.ts +8 -0
  445. package/dist/terminal.js +32 -0
  446. package/dist/terminal.js.map +1 -0
  447. package/dist/testing/session-scenarios.d.ts +10 -0
  448. package/dist/testing/session-scenarios.js +367 -0
  449. package/dist/testing/session-scenarios.js.map +1 -0
  450. package/dist/timeline/activity-rail.d.ts +11 -2
  451. package/dist/timeline/agent-identity.d.ts +30 -0
  452. package/dist/timeline/agent-row.d.ts +31 -0
  453. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  454. package/dist/timeline/compaction-copy.d.ts +46 -0
  455. package/dist/timeline/focus-sequence.d.ts +9 -0
  456. package/dist/timeline/genie-copy.d.ts +3 -0
  457. package/dist/timeline/genie-loading.d.ts +47 -0
  458. package/dist/timeline/index.d.ts +10 -5
  459. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  460. package/dist/timeline/message-sender.d.ts +19 -0
  461. package/dist/timeline/notice-presentation.d.ts +13 -0
  462. package/dist/timeline/parsers.d.ts +11 -0
  463. package/dist/timeline/patch-apply-command.d.ts +18 -0
  464. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  465. package/dist/timeline/platform-activity-row.d.ts +1 -2
  466. package/dist/timeline/presented-image.d.ts +11 -0
  467. package/dist/timeline/projection.d.ts +31 -2
  468. package/dist/timeline/provider-logo.d.ts +15 -0
  469. package/dist/timeline/question-nav-model.d.ts +23 -0
  470. package/dist/timeline/registry.d.ts +12 -1
  471. package/dist/timeline/retained-image.d.ts +18 -0
  472. package/dist/timeline/retained-loaders.d.ts +27 -0
  473. package/dist/timeline/rolling-activity.d.ts +11 -0
  474. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  475. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  476. package/dist/timeline/shared.d.ts +4 -1
  477. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  478. package/dist/timeline/startup-preference.d.ts +3 -0
  479. package/dist/timeline/startup-timings.d.ts +4 -0
  480. package/dist/timeline/tool-display-name.d.ts +5 -2
  481. package/dist/timeline/tool-presentation.d.ts +172 -0
  482. package/dist/timeline/turn-summary-model.d.ts +95 -0
  483. package/dist/timeline/turn-summary.d.ts +20 -54
  484. package/dist/timeline/types.d.ts +179 -7
  485. package/dist/timeline/work-presentation.d.ts +60 -0
  486. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  487. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  488. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  489. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  490. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  491. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  492. package/dist/timeline-model.d.ts +29 -0
  493. package/dist/timeline-model.js +254 -0
  494. package/dist/timeline-model.js.map +1 -0
  495. package/dist/usage/allowance-copy.d.ts +25 -0
  496. package/dist/usage/session-usage-limit.d.ts +88 -0
  497. package/dist/usage/summary.d.ts +35 -0
  498. package/dist/usage.d.ts +17 -0
  499. package/dist/usage.js +1187 -0
  500. package/dist/usage.js.map +1 -0
  501. package/dist/voice-recording-owner.d.ts +7 -0
  502. package/package.json +106 -7
  503. package/src/approvals.ts +8 -1
  504. package/src/artifacts-spreadsheet.ts +1 -0
  505. package/src/artifacts.ts +44 -0
  506. package/src/assets/README.md +8 -0
  507. package/src/assets/gmail.ico +0 -0
  508. package/src/assets/outlook.ico +0 -0
  509. package/src/capability-catalog-row.tsx +94 -0
  510. package/src/capability-logo-fallback.ts +22 -0
  511. package/src/client.ts +20 -31
  512. package/src/commands/registry.ts +18 -15
  513. package/src/commands/types.ts +2 -0
  514. package/src/components/anthropic-mark.tsx +10 -0
  515. package/src/components/approval-surface.tsx +401 -138
  516. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  517. package/src/components/artifacts/artifact-sandbox.tsx +193 -0
  518. package/src/components/artifacts/artifact-surface.tsx +40 -20
  519. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  520. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  521. package/src/components/artifacts/document-editor.tsx +141 -16
  522. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  523. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  524. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  525. package/src/components/artifacts/editable-document.tsx +37 -36
  526. package/src/components/artifacts/editable-presentation.tsx +36 -18
  527. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  528. package/src/components/artifacts/index.ts +45 -0
  529. package/src/components/artifacts/inline-html-document.ts +24 -0
  530. package/src/components/artifacts/latest-task-runner.ts +49 -0
  531. package/src/components/artifacts/presentation-editor.tsx +323 -67
  532. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  533. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  534. package/src/components/artifacts/site-view.tsx +121 -0
  535. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  536. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  537. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  538. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  539. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  540. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  541. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  542. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  543. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  544. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  545. package/src/components/browser-select-control.tsx +312 -0
  546. package/src/components/browser-viewer.tsx +778 -318
  547. package/src/components/chat-composer.tsx +47 -5
  548. package/src/components/child-session-link.tsx +36 -0
  549. package/src/components/claude-mark.tsx +11 -0
  550. package/src/components/code-editor.tsx +13 -16
  551. package/src/components/composer-transcription-control.tsx +128 -30
  552. package/src/components/composer.tsx +404 -195
  553. package/src/components/computer-viewer.tsx +880 -253
  554. package/src/components/copy-button.tsx +13 -5
  555. package/src/components/desktop-viewer.tsx +1 -1
  556. package/src/components/enrollment-consent.tsx +1 -1
  557. package/src/components/enrollment-device-flow.tsx +1 -1
  558. package/src/components/file-browser.tsx +10 -14
  559. package/src/components/fleet-tile.tsx +5 -3
  560. package/src/components/generated-video-player.tsx +4 -2
  561. package/src/components/grok-mark.tsx +34 -0
  562. package/src/components/human-input-form.tsx +590 -283
  563. package/src/components/human-input-surface.tsx +11 -0
  564. package/src/components/interaction-intervention-banner.tsx +2 -2
  565. package/src/components/linkified-text.tsx +79 -0
  566. package/src/components/machine-card.tsx +35 -78
  567. package/src/components/machine-dock-bar.tsx +1 -1
  568. package/src/components/machine-input-display.ts +197 -3
  569. package/src/components/machines/agent-status-icon.tsx +31 -0
  570. package/src/components/machines/machine-detail.tsx +200 -31
  571. package/src/components/machines/machine-operation-policy.tsx +1 -1
  572. package/src/components/machines/machine-status.ts +241 -0
  573. package/src/components/machines-dashboard.tsx +2 -17
  574. package/src/components/markdown-table-layout.ts +143 -0
  575. package/src/components/markdown.tsx +466 -129
  576. package/src/components/message-timeline.tsx +2370 -667
  577. package/src/components/model-mark.tsx +102 -0
  578. package/src/components/model-picker.tsx +15 -4
  579. package/src/components/model-policy-picker-menu.tsx +371 -0
  580. package/src/components/model-policy-picker.tsx +252 -429
  581. package/src/components/new-conversation.tsx +221 -0
  582. package/src/components/open-geni-chat.tsx +309 -0
  583. package/src/components/open-geni-links.tsx +179 -0
  584. package/src/components/openrouter-mark.tsx +13 -0
  585. package/src/components/opper-mark.tsx +18 -0
  586. package/src/components/pierre-diff.tsx +41 -16
  587. package/src/components/pierre-file.tsx +35 -10
  588. package/src/components/preview-loading.tsx +109 -0
  589. package/src/components/provider-recovery-notice.tsx +49 -0
  590. package/src/components/queue-item-content.ts +14 -0
  591. package/src/components/queue-surface-implementation.tsx +51 -356
  592. package/src/components/queue-surface-state.tsx +3 -1
  593. package/src/components/rehype-secret-refs.ts +98 -0
  594. package/src/components/remark-soft-line-breaks.ts +166 -0
  595. package/src/components/sandbox-files.tsx +91 -15
  596. package/src/components/sandbox-terminal.tsx +84 -13
  597. package/src/components/sandbox-workspace.tsx +147 -51
  598. package/src/components/secret-question-field.tsx +324 -0
  599. package/src/components/secret-ref-chip.tsx +185 -0
  600. package/src/components/session-capability-frame.tsx +197 -0
  601. package/src/components/session-chrome.tsx +842 -251
  602. package/src/components/session-commands-panel.tsx +126 -0
  603. package/src/components/session-commands.tsx +18 -0
  604. package/src/components/session-connection-request.tsx +97 -0
  605. package/src/components/session-conversation.tsx +876 -0
  606. package/src/components/session-list.tsx +257 -0
  607. package/src/components/session-mcp-capability-card.tsx +680 -0
  608. package/src/components/session-proxy-scope.tsx +153 -0
  609. package/src/components/session-status.tsx +26 -17
  610. package/src/components/session-usage-limit-notice.tsx +174 -0
  611. package/src/components/timeline-anchor.tsx +119 -0
  612. package/src/components/timeline-annotation-chrome.tsx +196 -0
  613. package/src/components/timeline-annotation-layout.ts +268 -0
  614. package/src/components/timeline-annotation-markers.tsx +185 -0
  615. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  616. package/src/components/timeline-annotation-selection.tsx +106 -54
  617. package/src/components/timeline-annotation-shared.ts +245 -0
  618. package/src/components/timeline-annotations-dialog.tsx +185 -128
  619. package/src/components/timeline-annotations.tsx +189 -45
  620. package/src/components/timeline-reading-progress.ts +80 -0
  621. package/src/components/timeline-search.tsx +168 -0
  622. package/src/components/timeline-settlement.ts +60 -0
  623. package/src/components/tool-action-review.tsx +650 -0
  624. package/src/components/tool-review-history.tsx +88 -0
  625. package/src/components/usage-limit-notice.tsx +179 -0
  626. package/src/components/usage-member-list.tsx +792 -0
  627. package/src/components/usage-meter.tsx +382 -0
  628. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  629. package/src/components/user-message-body.tsx +27 -2
  630. package/src/components/workspace-dock.tsx +18 -1
  631. package/src/composer-messages.ts +150 -0
  632. package/src/composer-voice-events.ts +12 -0
  633. package/src/composer.ts +6 -1
  634. package/src/connect-account-identity.tsx +34 -0
  635. package/src/connect-accounts.tsx +233 -0
  636. package/src/connect-chooser.tsx +336 -0
  637. package/src/connect-panel.tsx +99 -0
  638. package/src/connect-setup.tsx +355 -0
  639. package/src/connect.ts +60 -0
  640. package/src/connection-assets.d.ts +4 -0
  641. package/src/connection-catalog.tsx +162 -0
  642. package/src/connection-discovery.tsx +238 -0
  643. package/src/connection-installed.tsx +51 -0
  644. package/src/connection-logo.tsx +37 -0
  645. package/src/connection-service-logo.tsx +55 -0
  646. package/src/connection-service-presentation.ts +46 -0
  647. package/src/connection-skeleton.tsx +16 -0
  648. package/src/connection-type-picker.tsx +36 -0
  649. package/src/conversation-timeline.ts +92 -0
  650. package/src/desktop.ts +24 -0
  651. package/src/device-authorization.tsx +98 -0
  652. package/src/diffs.ts +16 -0
  653. package/src/discovery-cache.ts +42 -0
  654. package/src/editor.ts +13 -0
  655. package/src/hooks/internal.ts +3 -2
  656. package/src/hooks/latest-question.ts +164 -0
  657. package/src/hooks/shared-machines-list.ts +34 -1
  658. package/src/hooks/shared-query.ts +721 -0
  659. package/src/hooks/use-attached-browsers.ts +1 -1
  660. package/src/hooks/use-auth-runs.ts +0 -27
  661. package/src/hooks/use-available-models.ts +2 -2
  662. package/src/hooks/use-browser-frame-stream.ts +19 -2
  663. package/src/hooks/use-browser-session.ts +680 -205
  664. package/src/hooks/use-browser-sessions.ts +32 -1
  665. package/src/hooks/use-client-config-flags.ts +118 -0
  666. package/src/hooks/use-codex-accounts.ts +247 -47
  667. package/src/hooks/use-composer.ts +227 -44
  668. package/src/hooks/use-computer-frame-stream.ts +25 -7
  669. package/src/hooks/use-computer-input-posture.ts +94 -0
  670. package/src/hooks/use-computer-session.ts +409 -95
  671. package/src/hooks/use-connect.ts +23 -0
  672. package/src/hooks/use-desktop-stream.ts +19 -28
  673. package/src/hooks/use-file-attachments.ts +80 -4
  674. package/src/hooks/use-goal.ts +79 -9
  675. package/src/hooks/use-last-started-turn-policy.ts +37 -11
  676. package/src/hooks/use-machines.ts +4 -0
  677. package/src/hooks/use-new-conversation.ts +374 -0
  678. package/src/hooks/use-new-session-draft.ts +813 -0
  679. package/src/hooks/use-realtime-voice-models.ts +46 -0
  680. package/src/hooks/use-sandbox-files.ts +68 -20
  681. package/src/hooks/use-session-background-commands.ts +22 -11
  682. package/src/hooks/use-session-capabilities.ts +3 -2
  683. package/src/hooks/use-session-conversation.ts +150 -0
  684. package/src/hooks/use-session-events.ts +531 -335
  685. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  686. package/src/hooks/use-session-model-account.ts +174 -0
  687. package/src/hooks/use-session.ts +30 -2
  688. package/src/hooks/use-slash-commands.ts +6 -11
  689. package/src/hooks/use-supergrok-accounts.ts +22 -8
  690. package/src/hooks/use-terminal-stream.ts +153 -27
  691. package/src/hooks/use-transcription.ts +6 -0
  692. package/src/hooks/use-turn-queue.ts +2 -1
  693. package/src/hooks/use-usage.ts +100 -0
  694. package/src/hooks/use-vaults.ts +153 -0
  695. package/src/hooks/use-video-artifact-playback.ts +1 -1
  696. package/src/hooks/use-voice-input.ts +127 -19
  697. package/src/hooks/use-workspace-capture.ts +3 -2
  698. package/src/hooks/use-workspace-edit.ts +23 -5
  699. package/src/hooks/use-workspace-sessions.ts +74 -7
  700. package/src/human-input-model.ts +359 -0
  701. package/src/identity-link-accounts.tsx +148 -0
  702. package/src/identity-link-consent.tsx +192 -0
  703. package/src/index.ts +262 -16
  704. package/src/interaction.ts +1 -0
  705. package/src/lib/clipboard.ts +29 -0
  706. package/src/lib/error-message.ts +37 -0
  707. package/src/lib/format.ts +205 -10
  708. package/src/lib/host-theme.ts +529 -0
  709. package/src/lib/interaction-errors.ts +15 -0
  710. package/src/lib/menu-styles.ts +44 -0
  711. package/src/lib/notify-observer.ts +15 -0
  712. package/src/lib/pierre-diffs-loader.ts +53 -0
  713. package/src/lib/provider-recovery.ts +243 -0
  714. package/src/lib/scrollbars.ts +30 -0
  715. package/src/lib/terminal-input-readiness.ts +51 -0
  716. package/src/lib/transient-retry.ts +99 -0
  717. package/src/lib/workbench-peers.ts +62 -0
  718. package/src/lib/xterm-theme.ts +23 -21
  719. package/src/mcp-connection-status.ts +35 -0
  720. package/src/model-mark-paths.ts +53 -0
  721. package/src/model-picker-model.ts +330 -0
  722. package/src/model-policy.ts +299 -74
  723. package/src/native-previews.ts +100 -0
  724. package/src/new-session-draft.ts +22 -0
  725. package/src/notification-text.ts +81 -0
  726. package/src/older-history.ts +22 -4
  727. package/src/organization-model.ts +118 -0
  728. package/src/plugin-details.tsx +185 -0
  729. package/src/plugin-discovery.tsx +196 -0
  730. package/src/preview-loading-paint.ts +68 -0
  731. package/src/provider.tsx +74 -15
  732. package/src/queue-presentation-model.ts +464 -0
  733. package/src/realtime/dropdown-menu.tsx +19 -12
  734. package/src/realtime/embedded-new-voice.tsx +1 -0
  735. package/src/realtime/embedded-voice.tsx +3 -0
  736. package/src/realtime/realtime-control.tsx +138 -550
  737. package/src/realtime/session-realtime.ts +566 -0
  738. package/src/sandbox-label-model.ts +53 -0
  739. package/src/scrollbars.ts +3 -0
  740. package/src/secret-reference-label.ts +43 -0
  741. package/src/secrets-ui.tsx +59 -0
  742. package/src/session-agents-model.ts +33 -0
  743. package/src/session-attention-model.ts +62 -0
  744. package/src/session-auth-recommendation.ts +48 -0
  745. package/src/session-capability-policy.ts +196 -0
  746. package/src/session-context.ts +3 -4
  747. package/src/session-feedback-model.ts +95 -0
  748. package/src/session-list-model.ts +434 -0
  749. package/src/session-realtime.ts +18 -0
  750. package/src/session-status-model.ts +99 -0
  751. package/src/session-ui.ts +98 -1
  752. package/src/session.ts +17 -1
  753. package/src/site-snapshot.ts +74 -0
  754. package/src/sites-ui.tsx +348 -0
  755. package/src/sites.ts +3 -0
  756. package/src/skill-discovery.tsx +208 -0
  757. package/src/terminal.ts +26 -0
  758. package/src/testing/session-scenarios.ts +404 -0
  759. package/src/timeline/activity-rail.tsx +242 -101
  760. package/src/timeline/agent-identity.tsx +84 -0
  761. package/src/timeline/agent-row.tsx +231 -0
  762. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  763. package/src/timeline/compaction-copy.ts +115 -0
  764. package/src/timeline/fleet-decision-projection.ts +2 -1
  765. package/src/timeline/fleet-decision-row.tsx +1 -0
  766. package/src/timeline/focus-sequence.ts +44 -0
  767. package/src/timeline/genie-copy.ts +19 -0
  768. package/src/timeline/genie-loading.tsx +143 -0
  769. package/src/timeline/index.ts +30 -2
  770. package/src/timeline/knowledge-receipt.tsx +100 -0
  771. package/src/timeline/message-sender.tsx +71 -0
  772. package/src/timeline/notice-presentation.ts +48 -0
  773. package/src/timeline/parsers.ts +42 -2
  774. package/src/timeline/patch-apply-command.tsx +135 -0
  775. package/src/timeline/platform-activity-presentation.ts +166 -0
  776. package/src/timeline/platform-activity-row.tsx +15 -90
  777. package/src/timeline/presented-image.ts +63 -0
  778. package/src/timeline/projection.ts +1742 -76
  779. package/src/timeline/provider-logo.tsx +53 -0
  780. package/src/timeline/question-nav-model.ts +28 -0
  781. package/src/timeline/registry.ts +26 -4
  782. package/src/timeline/retained-image.ts +97 -0
  783. package/src/timeline/retained-loaders.ts +91 -0
  784. package/src/timeline/rolling-activity.tsx +80 -0
  785. package/src/timeline/screenshot-lightbox.tsx +228 -5
  786. package/src/timeline/session-usage-limit-row.tsx +42 -0
  787. package/src/timeline/shared.tsx +42 -15
  788. package/src/timeline/startup-dispatch-details.tsx +36 -0
  789. package/src/timeline/startup-preference.ts +33 -0
  790. package/src/timeline/startup-timings.tsx +145 -0
  791. package/src/timeline/tool-display-name.ts +19 -7
  792. package/src/timeline/tool-presentation.ts +1316 -0
  793. package/src/timeline/tool-renderers.tsx +835 -1138
  794. package/src/timeline/turn-summary-model.ts +343 -0
  795. package/src/timeline/turn-summary.tsx +272 -365
  796. package/src/timeline/types.ts +189 -6
  797. package/src/timeline/work-presentation.ts +189 -0
  798. package/src/timeline-model.ts +143 -0
  799. package/src/usage/allowance-copy.ts +64 -0
  800. package/src/usage/session-usage-limit.ts +266 -0
  801. package/src/usage/summary.ts +93 -0
  802. package/src/usage.ts +70 -0
  803. package/src/voice-recording-owner.ts +22 -0
  804. package/styles/compiled.css +2319 -748
  805. package/styles/connect.css +290 -0
  806. package/styles/connect.d.ts +1 -0
  807. package/styles/effective-tokens.css +1 -0
  808. package/styles/index.css +309 -9
  809. package/styles/responsive.css +99 -7
  810. package/styles/session-capability.css +44 -0
  811. package/styles/tokens.css +134 -66
  812. package/dist/browser-viewer-MKKFRRRV.js +0 -14
  813. package/dist/chunk-2DZVYHVO.js +0 -470
  814. package/dist/chunk-2DZVYHVO.js.map +0 -1
  815. package/dist/chunk-3AGBGTRT.js.map +0 -1
  816. package/dist/chunk-4MDLEHXL.js.map +0 -1
  817. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  818. package/dist/chunk-7EAFGICR.js +0 -302
  819. package/dist/chunk-7EAFGICR.js.map +0 -1
  820. package/dist/chunk-ELIYWBZR.js.map +0 -1
  821. package/dist/chunk-H5YGYNXS.js.map +0 -1
  822. package/dist/chunk-HUIKIDM5.js.map +0 -1
  823. package/dist/chunk-ICA6R6TW.js.map +0 -1
  824. package/dist/chunk-IOLVN74D.js.map +0 -1
  825. package/dist/chunk-JAQ5K7W6.js.map +0 -1
  826. package/dist/chunk-JVYQRRC4.js.map +0 -1
  827. package/dist/chunk-KCGXPP5V.js.map +0 -1
  828. package/dist/chunk-KZ73RL76.js.map +0 -1
  829. package/dist/chunk-NEXLLTP4.js.map +0 -1
  830. package/dist/chunk-PEI6RANI.js.map +0 -1
  831. package/dist/chunk-VTOREEXF.js +0 -142
  832. package/dist/chunk-VTOREEXF.js.map +0 -1
  833. package/dist/chunk-WSK7G5LE.js +0 -170
  834. package/dist/chunk-WSK7G5LE.js.map +0 -1
  835. package/dist/chunk-X4A66EWZ.js +0 -223
  836. package/dist/chunk-X4A66EWZ.js.map +0 -1
  837. package/dist/chunk-XYRDDSXF.js.map +0 -1
  838. package/dist/chunk-YG4QEQF5.js +0 -9557
  839. package/dist/chunk-YG4QEQF5.js.map +0 -1
  840. package/dist/chunk-YVCHAQZY.js.map +0 -1
  841. package/dist/chunk-ZPBTI3TE.js.map +0 -1
  842. package/dist/computer-viewer-FWEZISW4.js +0 -16
  843. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  844. package/dist/hooks/use-environments.d.ts +0 -41
  845. package/dist/hooks/use-packs.d.ts +0 -32
  846. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  847. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  848. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  849. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  850. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  851. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  852. package/src/hooks/use-environments.ts +0 -182
  853. package/src/hooks/use-packs.ts +0 -157
  854. /package/dist/{browser-viewer-MKKFRRRV.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  855. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-4EUKJXUO.js.map} +0 -0
@@ -1,14 +1,12 @@
1
+ import {
2
+ COMPOSER_VOICE_INPUT_START_EVENT,
3
+ composerVoiceEventScope,
4
+ } from "../composer-voice-events";
1
5
  import { type EffectiveSessionControl, type SessionEvent, type SessionStatus } from "@opengeni/sdk";
2
6
  import {
3
- hasStoredSessionRealtimeOwnerProof,
4
7
  projectSessionRealtimeLifecycle,
5
- type SessionRealtimeClientLike,
6
- type SessionRealtimeController,
7
8
  type SessionRealtimeControllerSnapshot,
8
- type CreateSessionRealtimeControllerOptions,
9
- type SessionRealtimeLifecycleProjection,
10
9
  type SessionRealtimeModel,
11
- type WorkspaceRealtimeModelCatalogItem,
12
10
  } from "@opengeni/sdk/realtime";
13
11
  import {
14
12
  AudioLinesIcon,
@@ -22,6 +20,7 @@ import {
22
20
  SquareIcon,
23
21
  Volume2Icon,
24
22
  VolumeXIcon,
23
+ XIcon,
25
24
  } from "lucide-react";
26
25
  import { AnimatePresence, motion, useReducedMotion } from "motion/react";
27
26
  import {
@@ -40,10 +39,8 @@ import {
40
39
  PickerBackHeader,
41
40
  PickerNavRow,
42
41
  } from "../components/model-policy-picker";
43
- import type { EmbeddedRealtimeSessionClientLike } from "../client";
44
42
  import { cn } from "../lib/cn";
45
43
  import type { PickerBillingClass as BillingClass } from "../model-policy";
46
- import { useEmbeddedRealtimeSession } from "../session-context";
47
44
  import {
48
45
  DropdownMenu,
49
46
  DropdownMenuContent,
@@ -54,26 +51,43 @@ import {
54
51
  DropdownMenuSubTrigger,
55
52
  DropdownMenuTrigger,
56
53
  } from "./dropdown-menu";
57
-
58
- export type RealtimeModelOption = {
59
- id: SessionRealtimeModel;
60
- label: string;
61
- provider: "OpenGeni" | "Connected Codex" | "Connected SuperGrok" | "Your Gateway";
62
- description: string;
63
- available: boolean;
64
- unavailableReason: string | null;
65
- recommended: boolean;
66
- };
67
-
68
- const CODEX_LIVE_MODEL: RealtimeModelOption = {
69
- id: "gpt-live-1-boulder-alpha",
70
- label: "Codex Live",
71
- provider: "Connected Codex",
72
- description: "Deep session integration",
73
- available: false,
74
- unavailableReason: "Connect Codex to use this voice model",
75
- recommended: false,
76
- };
54
+ import { MENU_CHECK_CLASS } from "../lib/menu-styles";
55
+ import {
56
+ CODEX_LIVE_MODEL,
57
+ type RealtimeControllerClient,
58
+ type RealtimeModelOption,
59
+ type SessionRealtimeControllerFactory,
60
+ sessionRealtimeLifecycleIsActive,
61
+ useRealtimeModelSelection,
62
+ useSessionRealtime,
63
+ } from "./session-realtime";
64
+
65
+ export {
66
+ codexRealtimeAdmissionAllowed,
67
+ codexRealtimeAdmissionBlocker,
68
+ CODEX_LIVE_MODEL,
69
+ sessionRealtimeLifecycleIsActive,
70
+ useRealtimeModelSelection,
71
+ useSessionRealtime,
72
+ } from "./session-realtime";
73
+ export type { RealtimeModelOption, SessionRealtimeControllerFactory } from "./session-realtime";
74
+
75
+ /** Short status label for a credit/availability refusal (shared with the model menu). */
76
+ function realtimeRefusalLabel(code: string | null | undefined): string | null {
77
+ switch (code) {
78
+ case "insufficient_credits":
79
+ return "Credits needed";
80
+ case "allowance_exhausted":
81
+ case "monthly_model_cost_limit":
82
+ return "Usage limit reached";
83
+ case "realtime_voice_unavailable":
84
+ return "Voice unavailable";
85
+ case "credits_disabled":
86
+ return "Credits off";
87
+ default:
88
+ return null;
89
+ }
90
+ }
77
91
 
78
92
  const REALTIME_MODEL_PROVIDERS = [
79
93
  "OpenGeni",
@@ -85,378 +99,30 @@ type RealtimeModelProvider = (typeof REALTIME_MODEL_PROVIDERS)[number];
85
99
 
86
100
  const REALTIME_PROVIDER_META: Record<
87
101
  RealtimeModelProvider,
88
- { billingClass: BillingClass; hint: string }
102
+ { billingClass: BillingClass; label: string; hint: string }
89
103
  > = {
90
- OpenGeni: { billingClass: "opengeni_credits", hint: "Will use credits" },
104
+ // The wire value keeps its historical spelling; the product name is Opengeni.
105
+ OpenGeni: { billingClass: "opengeni_credits", label: "Opengeni", hint: "Uses Opengeni credits" },
91
106
  "Connected Codex": {
92
107
  billingClass: "codex_subscription",
108
+ label: "Connected Codex",
93
109
  hint: "ChatGPT / Codex plan",
94
110
  },
95
111
  "Connected SuperGrok": {
96
112
  billingClass: "supergrok_subscription",
113
+ label: "Connected SuperGrok",
97
114
  hint: "SuperGrok / xAI plan",
98
115
  },
99
- "Your Gateway": { billingClass: "byok", hint: "Billed to your AI Gateway" },
100
- };
101
- const REALTIME_MODEL_STORAGE_PREFIX = "opengeni:realtime-model";
102
- const REALTIME_MODEL_CATALOG_CACHE_TTL_MS = 60_000;
103
- const REALTIME_MODEL_CATALOG_CACHE_MAX_WORKSPACES = 64;
104
-
105
- type RealtimeControllerClient = EmbeddedRealtimeSessionClientLike & SessionRealtimeClientLike;
106
-
107
- type RealtimeModelCatalogCacheEntry =
108
- | {
109
- state: "loading";
110
- promise: Promise<RealtimeModelOption[]>;
111
- controller: AbortController;
112
- consumers: number;
113
- }
114
- | { state: "ready"; models: RealtimeModelOption[]; expiresAt: number };
115
-
116
- // Scope advisory availability to the exact client object and workspace. The
117
- // server still authorizes every realtime operation; changing principals should
118
- // replace the client just as it does for the rest of the SDK state.
119
- const realtimeModelCatalogCache = new WeakMap<
120
- RealtimeControllerClient,
121
- Map<string, RealtimeModelCatalogCacheEntry>
122
- >();
123
-
124
- function realtimeModelFallback(codexConnected: boolean): RealtimeModelOption[] {
125
- return [
126
- {
127
- ...CODEX_LIVE_MODEL,
128
- available: codexConnected,
129
- unavailableReason: codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,
130
- },
131
- ];
132
- }
133
-
134
- function realtimeModelCatalogCacheFor(
135
- client: RealtimeControllerClient,
136
- ): Map<string, RealtimeModelCatalogCacheEntry> {
137
- const existing = realtimeModelCatalogCache.get(client);
138
- if (existing) return existing;
139
- const created = new Map<string, RealtimeModelCatalogCacheEntry>();
140
- realtimeModelCatalogCache.set(client, created);
141
- return created;
142
- }
143
-
144
- function readCachedRealtimeModelCatalog(
145
- client: RealtimeControllerClient,
146
- workspaceId: string,
147
- now = Date.now(),
148
- ): RealtimeModelOption[] | null {
149
- const cache = realtimeModelCatalogCache.get(client);
150
- const entry = cache?.get(workspaceId);
151
- if (!entry || entry.state === "loading") return null;
152
- if (entry.expiresAt > now) return entry.models;
153
- cache?.delete(workspaceId);
154
- return null;
155
- }
156
-
157
- function pruneRealtimeModelCatalogCache(
158
- cache: Map<string, RealtimeModelCatalogCacheEntry>,
159
- now: number,
160
- ): void {
161
- for (const [workspaceId, entry] of cache) {
162
- if (entry.state === "ready" && entry.expiresAt <= now) cache.delete(workspaceId);
163
- }
164
- while (cache.size >= REALTIME_MODEL_CATALOG_CACHE_MAX_WORKSPACES) {
165
- const oldestWorkspaceId = cache.keys().next().value;
166
- if (oldestWorkspaceId === undefined) return;
167
- cache.delete(oldestWorkspaceId);
168
- }
169
- }
170
-
171
- function loadRealtimeModelCatalog(
172
- client: RealtimeControllerClient,
173
- workspaceId: string,
174
- signal?: AbortSignal,
175
- ): Promise<RealtimeModelOption[]> | null {
176
- const load = client.getWorkspaceRealtimeModelCatalog;
177
- if (!load) return null;
178
- if (signal?.aborted) {
179
- return Promise.reject(signal.reason ?? new DOMException("Request aborted", "AbortError"));
180
- }
181
- const now = Date.now();
182
- const cache = realtimeModelCatalogCacheFor(client);
183
- const entry = cache.get(workspaceId);
184
- if (entry?.state === "loading" && !entry.controller.signal.aborted) {
185
- return consumeRealtimeModelCatalog(entry, signal);
186
- }
187
- if (entry?.state === "ready" && entry.expiresAt > now) return Promise.resolve(entry.models);
188
- if (entry) cache.delete(workspaceId);
189
- pruneRealtimeModelCatalogCache(cache, now);
190
-
191
- const controller = new AbortController();
192
- const promise = load
193
- .call(client, workspaceId, { signal: controller.signal })
194
- .then((response) => response.models.map(toRealtimeModelOption))
195
- .then((models) => {
196
- const current = cache.get(workspaceId);
197
- if (current?.state === "loading" && current.promise === promise) {
198
- cache.delete(workspaceId);
199
- cache.set(workspaceId, {
200
- state: "ready",
201
- models,
202
- expiresAt: Date.now() + REALTIME_MODEL_CATALOG_CACHE_TTL_MS,
203
- });
204
- }
205
- return models;
206
- })
207
- .catch((error: unknown) => {
208
- const current = cache.get(workspaceId);
209
- if (current?.state === "loading" && current.promise === promise) cache.delete(workspaceId);
210
- throw error;
211
- });
212
- const loading: RealtimeModelCatalogCacheEntry & { state: "loading" } = {
213
- state: "loading",
214
- promise,
215
- controller,
216
- consumers: 0,
217
- };
218
- cache.set(workspaceId, loading);
219
- return consumeRealtimeModelCatalog(loading, signal);
220
- }
221
-
222
- function consumeRealtimeModelCatalog(
223
- entry: RealtimeModelCatalogCacheEntry & { state: "loading" },
224
- signal?: AbortSignal,
225
- ): Promise<RealtimeModelOption[]> {
226
- entry.consumers += 1;
227
- return new Promise((resolve, reject) => {
228
- let released = false;
229
- const release = (abandoned: boolean) => {
230
- if (released) return;
231
- released = true;
232
- entry.consumers = Math.max(0, entry.consumers - 1);
233
- if (abandoned && entry.consumers === 0) {
234
- entry.controller.abort(
235
- signal?.reason ?? new DOMException("Request abandoned", "AbortError"),
236
- );
237
- }
238
- };
239
- const onAbort = () => {
240
- release(true);
241
- reject(signal?.reason ?? new DOMException("Request aborted", "AbortError"));
242
- };
243
- signal?.addEventListener("abort", onAbort, { once: true });
244
- void entry.promise.then(resolve, reject).finally(() => {
245
- signal?.removeEventListener("abort", onAbort);
246
- release(false);
247
- });
248
- });
249
- }
250
-
251
- export type SessionRealtimeControllerFactory = (
252
- options: CreateSessionRealtimeControllerOptions,
253
- ) => SessionRealtimeController;
254
-
255
- type AdmissionInput = {
256
- sessionStatus: SessionStatus;
257
- controlState: "active" | "paused";
258
- settlement: { state: string } | null;
259
- codexConnected: boolean;
260
- lifecycleActive: boolean;
116
+ "Your Gateway": {
117
+ billingClass: "byok",
118
+ label: "Your Gateway",
119
+ hint: "Billed to your AI Gateway",
120
+ },
261
121
  };
262
-
263
- export function codexRealtimeAdmissionAllowed(input: AdmissionInput): boolean {
264
- return codexRealtimeAdmissionBlocker(input) === null;
265
- }
266
-
267
- export function codexRealtimeAdmissionBlocker(input: AdmissionInput): string | null {
268
- if (input.sessionStatus === "cancelled") return "This session was cancelled.";
269
- if (input.controlState !== "active") return "Resume this session before starting voice.";
270
- if (input.settlement !== null) return "Wait for the current session transition to finish.";
271
- if (!input.codexConnected) return "Connect Codex to use this voice model.";
272
- if (input.lifecycleActive) return "Voice is already active for this session.";
273
- return null;
122
+ /** Display name; the catalog's `provider` value stays the wire identifier. */
123
+ function realtimeProviderLabel(provider: RealtimeModelProvider): string {
124
+ return provider === "OpenGeni" ? "Opengeni" : provider;
274
125
  }
275
-
276
- export function useSessionRealtime(options: {
277
- client?: RealtimeControllerClient | undefined;
278
- workspaceId?: string | undefined;
279
- sessionId: string;
280
- sessionStatus: SessionStatus;
281
- effectiveControl: EffectiveSessionControl;
282
- events: SessionEvent[];
283
- eventsReady: boolean;
284
- codexConnected: boolean;
285
- model?: SessionRealtimeModel | undefined;
286
- modelAvailable?: boolean | undefined;
287
- modelUnavailableReason?: string | null | undefined;
288
- /** Model-visible application context captured with each durable realtime message. */
289
- getModelContext?: (() => string | undefined) | undefined;
290
- /** Deterministic browser-test/demo seam. Production hosts should use the SDK default. */
291
- controllerFactory?: SessionRealtimeControllerFactory | undefined;
292
- }) {
293
- const { client, workspaceId } = useEmbeddedRealtimeSession({
294
- client: options.client,
295
- workspaceId: options.workspaceId,
296
- });
297
- const model = options.model ?? CODEX_LIVE_MODEL.id;
298
- const audioRef = useRef<HTMLAudioElement>(null);
299
- const controllerRef = useRef<SessionRealtimeController | null>(null);
300
- const controllerModelRef = useRef<SessionRealtimeModel | null>(null);
301
- const modelContextProviderRef = useRef(options.getModelContext);
302
- modelContextProviderRef.current = options.getModelContext;
303
- const [snapshot, setSnapshot] = useState<SessionRealtimeControllerSnapshot>(() => ({
304
- status: hasStoredSessionRealtimeOwnerProof({
305
- workspaceId,
306
- sessionId: options.sessionId,
307
- model,
308
- })
309
- ? "recovering"
310
- : "idle",
311
- realtimeId: null,
312
- mode: null,
313
- bridge: null,
314
- microphone: "inactive",
315
- inputMuted: false,
316
- audibleOutput: "inactive",
317
- outputMuted: false,
318
- connectionGeneration: 0,
319
- reconnectAttempt: 0,
320
- diagnostic: null,
321
- error: null,
322
- }));
323
- const lifecycle = useMemo(
324
- () => projectSessionRealtimeLifecycle(options.events),
325
- [options.events],
326
- );
327
- const lifecycleRef = useRef(lifecycle);
328
- const eventsReadyRef = useRef(options.eventsReady);
329
- lifecycleRef.current = lifecycle;
330
- eventsReadyRef.current = options.eventsReady;
331
- const lifecycleActive = sessionRealtimeLifecycleIsActive(lifecycle);
332
-
333
- useEffect(() => {
334
- let disposed = false;
335
- let controller: SessionRealtimeController | null = null;
336
- let unsubscribe: (() => void) | null = null;
337
- void import("@opengeni/sdk/realtime")
338
- .then(({ createSessionRealtimeController }) => {
339
- if (disposed) return;
340
- const controllerFactory = options.controllerFactory ?? createSessionRealtimeController;
341
- controller = controllerFactory({
342
- client,
343
- workspaceId,
344
- sessionId: options.sessionId,
345
- ...(audioRef.current ? { remoteAudio: audioRef.current } : {}),
346
- model,
347
- getModelContext: () => modelContextProviderRef.current?.(),
348
- });
349
- controllerRef.current = controller;
350
- controllerModelRef.current = model;
351
- unsubscribe = controller.subscribe(setSnapshot);
352
- if (eventsReadyRef.current) {
353
- void controller.observeLifecycle(lifecycleRef.current).catch(() => undefined);
354
- }
355
- })
356
- .catch((error: unknown) => {
357
- if (disposed) return;
358
- setSnapshot({
359
- status: "error",
360
- realtimeId: null,
361
- mode: null,
362
- bridge: null,
363
- microphone: "inactive",
364
- inputMuted: false,
365
- audibleOutput: "inactive",
366
- outputMuted: false,
367
- connectionGeneration: 0,
368
- reconnectAttempt: 0,
369
- diagnostic: {
370
- kind: "negotiation_failure",
371
- message:
372
- error instanceof Error ? error.message : "Codex realtime controller failed to load",
373
- recoverable: false,
374
- connectionGeneration: 0,
375
- attempt: 0,
376
- },
377
- error:
378
- error instanceof Error ? error.message : "Codex realtime controller failed to load",
379
- });
380
- });
381
- return () => {
382
- disposed = true;
383
- unsubscribe?.();
384
- controller?.close();
385
- if (controllerRef.current === controller) {
386
- controllerRef.current = null;
387
- controllerModelRef.current = null;
388
- }
389
- };
390
- }, [client, model, options.controllerFactory, options.sessionId, workspaceId]);
391
-
392
- useEffect(() => {
393
- if (!options.eventsReady) return;
394
- void controllerRef.current?.observeLifecycle(lifecycle).catch(() => undefined);
395
- }, [lifecycle, options.eventsReady]);
396
-
397
- const start = useCallback(async () => {
398
- const controller = controllerRef.current;
399
- if (!controller || controllerModelRef.current !== model) {
400
- throw new Error("The selected voice model is still preparing");
401
- }
402
- await controller.start();
403
- }, [model]);
404
- const stop = useCallback(async () => {
405
- await controllerRef.current?.stop();
406
- }, []);
407
- const retry = useCallback(async () => {
408
- await controllerRef.current?.retry();
409
- }, []);
410
- const retryAudibleOutput = useCallback(async () => {
411
- await controllerRef.current?.retryAudibleOutput();
412
- }, []);
413
- const setInputMuted = useCallback((muted: boolean) => {
414
- controllerRef.current?.setInputMuted(muted);
415
- }, []);
416
- const setOutputMuted = useCallback((muted: boolean) => {
417
- controllerRef.current?.setOutputMuted(muted);
418
- }, []);
419
- const admissionInput = {
420
- sessionStatus: options.sessionStatus,
421
- controlState: options.effectiveControl.state,
422
- settlement: options.effectiveControl.settlement,
423
- codexConnected: options.modelAvailable ?? options.codexConnected,
424
- lifecycleActive,
425
- } satisfies AdmissionInput;
426
- const admissionBlocker =
427
- options.modelAvailable === false
428
- ? (options.modelUnavailableReason ?? "This voice model is unavailable.")
429
- : codexRealtimeAdmissionBlocker(admissionInput);
430
- const canStart =
431
- controllerRef.current !== null &&
432
- controllerModelRef.current === model &&
433
- ["idle", "error"].includes(snapshot.status) &&
434
- admissionBlocker === null;
435
-
436
- return {
437
- snapshot,
438
- lifecycleActive,
439
- canStart,
440
- admissionBlocker,
441
- codexConnected: options.codexConnected,
442
- audioRef,
443
- start,
444
- stop,
445
- retry,
446
- retryAudibleOutput,
447
- setInputMuted,
448
- setOutputMuted,
449
- };
450
- }
451
-
452
- function sessionRealtimeLifecycleIsActive(
453
- lifecycle: SessionRealtimeLifecycleProjection | null,
454
- ): boolean {
455
- if (lifecycle?.state !== "active") return false;
456
- const leaseExpiresAt = Date.parse(lifecycle.leaseExpiresAt);
457
- return !Number.isFinite(leaseExpiresAt) || leaseExpiresAt > Date.now();
458
- }
459
-
460
126
  export function SessionRealtimeControl(props: {
461
127
  client?: RealtimeControllerClient | undefined;
462
128
  workspaceId?: string | undefined;
@@ -511,6 +177,7 @@ export function SessionRealtimeControl(props: {
511
177
  useEffect(() => {
512
178
  onVoiceActiveChange?.(voiceActive);
513
179
  }, [onVoiceActiveChange, voiceActive]);
180
+ useEffect(() => () => onVoiceActiveChange?.(false), [onVoiceActiveChange]);
514
181
 
515
182
  useEffect(() => {
516
183
  const pending = autostartModelRef.current;
@@ -523,14 +190,13 @@ export function SessionRealtimeControl(props: {
523
190
  }
524
191
  if (!canStart) return;
525
192
  autostartStartedRef.current = true;
526
- void start()
527
- .then(() => {
528
- autostartModelRef.current = null;
529
- onRealtimeAutostartConsumed?.();
530
- })
531
- .catch(() => {
532
- autostartStartedRef.current = false;
533
- });
193
+ // One automatic attempt. A failed start stays visible with its reason and
194
+ // the user retries explicitly; re-arming would loop on a definitive refusal.
195
+ const consume = () => {
196
+ autostartModelRef.current = null;
197
+ onRealtimeAutostartConsumed?.();
198
+ };
199
+ void start().then(consume, consume);
534
200
  }, [
535
201
  canStart,
536
202
  lifecycleActive,
@@ -566,96 +232,6 @@ export function SessionRealtimeControl(props: {
566
232
  );
567
233
  }
568
234
 
569
- export function useRealtimeModelSelection(options: {
570
- client?: RealtimeControllerClient | undefined;
571
- workspaceId?: string | undefined;
572
- codexConnected: boolean;
573
- activeModel?: SessionRealtimeModel | null | undefined;
574
- }) {
575
- const { client, workspaceId } = useEmbeddedRealtimeSession({
576
- client: options.client,
577
- workspaceId: options.workspaceId,
578
- });
579
- const activeModel = options.activeModel;
580
- const initialCachedCatalog = readCachedRealtimeModelCatalog(client, workspaceId);
581
- const [catalog, setCatalog] = useState<RealtimeModelOption[]>(
582
- () => initialCachedCatalog ?? realtimeModelFallback(options.codexConnected),
583
- );
584
- const catalogScopeRef = useRef({
585
- client,
586
- workspaceId,
587
- source: initialCachedCatalog ? ("cache" as const) : ("fallback" as const),
588
- });
589
- const [selectedModelId, setSelectedModelId] = useState<SessionRealtimeModel>(() => {
590
- const preferred = readRealtimeModelPreference(workspaceId) ?? CODEX_LIVE_MODEL.id;
591
- if (!initialCachedCatalog) return preferred;
592
- if (initialCachedCatalog.some((model) => model.id === preferred && model.available)) {
593
- return preferred;
594
- }
595
- return initialCachedCatalog.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
596
- });
597
-
598
- useEffect(() => {
599
- let disposed = false;
600
- const requestAbort = new AbortController();
601
- const applyCatalog = (models: RealtimeModelOption[]) => {
602
- catalogScopeRef.current = { client, workspaceId, source: "cache" };
603
- setCatalog(models);
604
- setSelectedModelId((current) => {
605
- if (models.some((model) => model.id === current && model.available)) return current;
606
- return models.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
607
- });
608
- };
609
- const cached = readCachedRealtimeModelCatalog(client, workspaceId);
610
- if (cached) {
611
- const scope = catalogScopeRef.current;
612
- if (
613
- scope.client !== client ||
614
- scope.workspaceId !== workspaceId ||
615
- scope.source !== "cache"
616
- ) {
617
- applyCatalog(cached);
618
- }
619
- return;
620
- }
621
- const loading = loadRealtimeModelCatalog(client, workspaceId, requestAbort.signal);
622
- if (!loading) return;
623
- void loading
624
- .then((models) => {
625
- if (disposed) return;
626
- applyCatalog(models);
627
- })
628
- .catch(() => undefined);
629
- return () => {
630
- disposed = true;
631
- requestAbort.abort();
632
- };
633
- }, [client, workspaceId]);
634
-
635
- useEffect(() => {
636
- if (activeModel) setSelectedModelId(activeModel);
637
- }, [activeModel]);
638
-
639
- const selectedModel =
640
- catalog.find((model) => model.id === selectedModelId) ??
641
- ({
642
- ...CODEX_LIVE_MODEL,
643
- available: options.codexConnected,
644
- unavailableReason: options.codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,
645
- } satisfies RealtimeModelOption);
646
- const selectModel = useCallback(
647
- (value: string) => {
648
- const model = catalog.find((candidate) => candidate.id === value);
649
- if (!model || !model.available || activeModel) return;
650
- setSelectedModelId(model.id);
651
- writeRealtimeModelPreference(workspaceId, model.id);
652
- },
653
- [activeModel, catalog, workspaceId],
654
- );
655
-
656
- return { models: catalog, selectedModel, selectModel };
657
- }
658
-
659
235
  const IDLE_REALTIME_SNAPSHOT: SessionRealtimeControllerSnapshot = {
660
236
  status: "idle",
661
237
  realtimeId: null,
@@ -821,6 +397,7 @@ export function RealtimeVoiceControl(props: {
821
397
  props.canStart,
822
398
  props.admissionBlocker ?? null,
823
399
  selectedModel.label,
400
+ selectedModel.unavailableCode ?? null,
824
401
  );
825
402
  const modeOwned = props.snapshot.mode?.state === "active";
826
403
  const retryConnection =
@@ -829,6 +406,11 @@ export function RealtimeVoiceControl(props: {
829
406
  props.snapshot.status !== "active" &&
830
407
  props.snapshot.diagnostic?.recoverable === true;
831
408
  const audioBlocked = props.snapshot.audibleOutput === "blocked" && !props.snapshot.outputMuted;
409
+ // A call that ended in a failure keeps its reason on screen, not only in a
410
+ // tooltip or the model menu, until the user starts again or changes model.
411
+ const startFailed = props.snapshot.status === "error" && !modeOwned;
412
+ const failureText =
413
+ status.label === "Voice unavailable" ? status.detail : `${status.label}. ${status.detail}`;
832
414
  const mainDisabled =
833
415
  props.snapshot.status === "stopping" ||
834
416
  props.snapshot.status === "lost_owner" ||
@@ -840,7 +422,11 @@ export function RealtimeVoiceControl(props: {
840
422
  ? "Retry voice connection"
841
423
  : modeOwned
842
424
  ? "End voice conversation"
843
- : `Start voice with ${selectedModel.label}`;
425
+ : !props.canStart && status.phase === "unavailable"
426
+ ? `${status.label}: ${status.detail}`
427
+ : startFailed
428
+ ? `Try voice again with ${selectedModel.label}`
429
+ : `Start voice with ${selectedModel.label}`;
844
430
  const runMainAction = audioBlocked
845
431
  ? props.onRetryAudibleOutput
846
432
  : retryConnection
@@ -857,6 +443,20 @@ export function RealtimeVoiceControl(props: {
857
443
  selectedModel.provider,
858
444
  );
859
445
  const [pickerDirection, setPickerDirection] = useState<1 | -1>(1);
446
+ const [failureDismissed, setFailureDismissed] = useState(false);
447
+ useEffect(() => {
448
+ if (!startFailed) setFailureDismissed(false);
449
+ }, [startFailed]);
450
+ const rootRef = useRef<HTMLDivElement>(null);
451
+ useEffect(() => {
452
+ if (!startFailed) return;
453
+ // Starting dictation in this composer supersedes a stale start failure.
454
+ const scope = composerVoiceEventScope(rootRef.current);
455
+ if (!scope) return;
456
+ const dismiss = () => setFailureDismissed(true);
457
+ scope.addEventListener(COMPOSER_VOICE_INPUT_START_EVENT, dismiss);
458
+ return () => scope.removeEventListener(COMPOSER_VOICE_INPUT_START_EVENT, dismiss);
459
+ }, [startFailed]);
860
460
 
861
461
  useEffect(() => {
862
462
  if (!pickerOpen) setPickerProvider(selectedModel.provider);
@@ -864,6 +464,7 @@ export function RealtimeVoiceControl(props: {
864
464
 
865
465
  return (
866
466
  <div
467
+ ref={rootRef}
867
468
  role="group"
868
469
  aria-label="Realtime voice"
869
470
  data-picker-side={props.menuSide ?? "top"}
@@ -945,6 +546,20 @@ export function RealtimeVoiceControl(props: {
945
546
  </motion.div>
946
547
  ) : null}
947
548
  </AnimatePresence>
549
+ {startFailed && !failureDismissed ? (
550
+ <button
551
+ type="button"
552
+ data-realtime-attention=""
553
+ data-testid="realtime-failure-reason"
554
+ title="Dismiss"
555
+ aria-label={`Dismiss: ${failureText}`}
556
+ onClick={() => setFailureDismissed(true)}
557
+ className="og-realtime-failure mr-1.5 inline-flex min-w-0 items-center gap-1 rounded-og-sm text-right text-og-xs leading-tight text-og-status-failed outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/45"
558
+ >
559
+ <span className="og-realtime-failure-label line-clamp-2 max-w-56">{failureText}</span>
560
+ <XIcon className="size-3 shrink-0 opacity-70" aria-hidden />
561
+ </button>
562
+ ) : null}
948
563
  <div className="inline-flex shrink-0 items-center">
949
564
  <motion.button
950
565
  type="button"
@@ -1005,7 +620,7 @@ export function RealtimeVoiceControl(props: {
1005
620
  align="end"
1006
621
  sideOffset={8}
1007
622
  collisionPadding={12}
1008
- className="og-realtime-menu flex w-72 max-h-[min(20rem,var(--radix-dropdown-menu-content-available-height))] flex-col overflow-hidden rounded-xl border-border bg-surface p-1.5 shadow-xl"
623
+ className="og-realtime-menu flex w-72 max-h-[min(20rem,var(--radix-dropdown-menu-content-available-height))] flex-col overflow-hidden"
1009
624
  onCloseAutoFocus={(event) => event.preventDefault()}
1010
625
  >
1011
626
  <div className="min-h-0 flex-1 overflow-y-auto overscroll-contain">
@@ -1028,9 +643,15 @@ export function RealtimeVoiceControl(props: {
1028
643
  />
1029
644
  </div>
1030
645
 
1031
- {status.phase !== "idle" ? (
646
+ {status.phase !== "idle" &&
647
+ // Say it once: the selected model's row already carries its reason.
648
+ !(
649
+ status.phase === "unavailable" &&
650
+ pickerProvider === selectedModel.provider &&
651
+ selectedModel.unavailableReason === status.detail
652
+ ) ? (
1032
653
  <>
1033
- <DropdownMenuSeparator className="mx-1 bg-og-border" />
654
+ <DropdownMenuSeparator />
1034
655
  <div className="px-2.5 py-2" role="status" aria-live="polite">
1035
656
  <div className="flex items-center gap-2 text-og-sm font-medium text-og-fg">
1036
657
  <RealtimeStatusDot
@@ -1046,7 +667,6 @@ export function RealtimeVoiceControl(props: {
1046
667
 
1047
668
  {audioBlocked ? (
1048
669
  <DropdownMenuItem
1049
- className="rounded-og-md"
1050
670
  onSelect={() => void props.onRetryAudibleOutput().catch(() => undefined)}
1051
671
  >
1052
672
  <Volume2Icon />
@@ -1054,10 +674,7 @@ export function RealtimeVoiceControl(props: {
1054
674
  </DropdownMenuItem>
1055
675
  ) : null}
1056
676
  {retryConnection ? (
1057
- <DropdownMenuItem
1058
- className="rounded-og-md"
1059
- onSelect={() => void props.onRetry().catch(() => undefined)}
1060
- >
677
+ <DropdownMenuItem onSelect={() => void props.onRetry().catch(() => undefined)}>
1061
678
  <RotateCcwIcon />
1062
679
  Retry connection
1063
680
  </DropdownMenuItem>
@@ -1065,7 +682,6 @@ export function RealtimeVoiceControl(props: {
1065
682
  {modeOwned && props.snapshot.status !== "lost_owner" ? (
1066
683
  <DropdownMenuItem
1067
684
  variant="destructive"
1068
- className="rounded-og-md"
1069
685
  disabled={props.snapshot.status === "stopping"}
1070
686
  onSelect={() => void props.onStop().catch(() => undefined)}
1071
687
  >
@@ -1105,16 +721,14 @@ export function RealtimeVoiceModelPanel(props: {
1105
721
 
1106
722
  return (
1107
723
  <div className="flex min-h-0 flex-1 flex-col" data-testid="realtime-voice-model-panel">
1108
- <div className="flex shrink-0 items-start gap-1 px-2 pt-1 pb-1.5">
724
+ <div className="flex min-h-10 shrink-0 items-center gap-2 border-b border-og-border px-2 pb-2">
1109
725
  {props.leading}
1110
- <div className="min-w-0">
1111
- <div className="text-og-menu font-medium text-og-fg">Voice model</div>
1112
- <p className="mt-0.5 text-og-control text-og-fg-subtle">
1113
- Used when you start a voice conversation.
1114
- </p>
1115
- </div>
726
+ <div className="min-w-0 flex-1 text-og-menu font-medium text-og-fg">Voice model</div>
1116
727
  </div>
1117
- <div className="min-h-0 flex-1 overflow-y-auto overscroll-contain px-1.5 pb-1.5">
728
+ <div className="min-h-0 flex-1 overflow-y-auto overscroll-contain p-2">
729
+ <p className="mb-3 text-og-control text-og-fg-muted">
730
+ Used when you start a voice conversation.
731
+ </p>
1118
732
  <RealtimeModelPickerMenu
1119
733
  models={props.models}
1120
734
  selectedModel={props.selectedModel}
@@ -1202,7 +816,7 @@ export function RealtimeModelPickerMenu(props: {
1202
816
  const body = props.provider ? (
1203
817
  <div data-testid="realtime-model-picker-models">
1204
818
  <PickerBackHeader
1205
- label={props.provider}
819
+ label={realtimeProviderLabel(props.provider)}
1206
820
  icon={
1207
821
  <BillingClassMark
1208
822
  billingClass={REALTIME_PROVIDER_META[props.provider].billingClass}
@@ -1228,7 +842,9 @@ export function RealtimeModelPickerMenu(props: {
1228
842
  title={model.unavailableReason ?? model.description}
1229
843
  active={selected}
1230
844
  showChevron={false}
1231
- trailing={selected ? <CheckIcon className="size-3.5" aria-hidden /> : undefined}
845
+ trailing={
846
+ selected ? <CheckIcon className={MENU_CHECK_CLASS} aria-hidden /> : undefined
847
+ }
1232
848
  testId={`realtime-model-choice-${model.id}`}
1233
849
  onClick={() => props.onSelect(model.id)}
1234
850
  />
@@ -1243,7 +859,7 @@ export function RealtimeModelPickerMenu(props: {
1243
859
  return (
1244
860
  <PickerNavRow
1245
861
  key={provider}
1246
- label={provider}
862
+ label={realtimeProviderLabel(provider)}
1247
863
  hint={meta.hint}
1248
864
  icon={<BillingClassMark billingClass={meta.billingClass} aria-label="" />}
1249
865
  active={props.selectedModel.provider === provider}
@@ -1291,12 +907,12 @@ function RealtimeDiagnosticsMenu({ snapshot }: { snapshot: SessionRealtimeContro
1291
907
 
1292
908
  return (
1293
909
  <>
1294
- <DropdownMenuSeparator className="mx-1 bg-og-border" />
910
+ <DropdownMenuSeparator />
1295
911
  <DropdownMenuSub>
1296
- <DropdownMenuSubTrigger className="rounded-og-md text-og-fg-muted">
912
+ <DropdownMenuSubTrigger className="text-og-fg-muted">
1297
913
  Realtime diagnostics
1298
914
  </DropdownMenuSubTrigger>
1299
- <DropdownMenuSubContent className="max-h-80 w-72 overflow-y-auto rounded-og-lg border-og-border bg-og-surface-1 p-1.5 text-og-fg shadow-og-lg">
915
+ <DropdownMenuSubContent className="max-h-80 w-72 overflow-y-auto">
1300
916
  {rows.map(([label, value]) => (
1301
917
  <DropdownMenuItem
1302
918
  key={label}
@@ -1331,6 +947,7 @@ function statusContent(
1331
947
  canStart: boolean,
1332
948
  admissionBlocker: string | null,
1333
949
  modelLabel: string,
950
+ unavailableCode: string | null = null,
1334
951
  ): { phase: RealtimeVisualPhase; label: string; detail: string } {
1335
952
  if (snapshot.audibleOutput === "blocked" && !snapshot.outputMuted) {
1336
953
  return {
@@ -1377,6 +994,13 @@ function statusContent(
1377
994
  detail: "Return to the browser that started it, or wait for that connection to expire.",
1378
995
  };
1379
996
  case "error":
997
+ if (snapshot.refusal) {
998
+ return {
999
+ phase: "unavailable",
1000
+ label: realtimeRefusalLabel(snapshot.refusal.code) ?? "Voice unavailable",
1001
+ detail: snapshot.refusal.message,
1002
+ };
1003
+ }
1380
1004
  return {
1381
1005
  phase: "error",
1382
1006
  label: "Voice unavailable",
@@ -1386,7 +1010,7 @@ function statusContent(
1386
1010
  if (!modelAvailable) {
1387
1011
  return {
1388
1012
  phase: "unavailable",
1389
- label: "Voice model unavailable",
1013
+ label: realtimeRefusalLabel(unavailableCode) ?? "Voice model unavailable",
1390
1014
  detail: admissionBlocker ?? "Choose another voice model.",
1391
1015
  };
1392
1016
  }
@@ -1528,7 +1152,7 @@ function RealtimeStatusDot(props: { phase: RealtimeVisualPhase; reduceMotion: bo
1528
1152
 
1529
1153
  function voiceButtonTone(phase: RealtimeVisualPhase): string {
1530
1154
  if (phase === "listening" || phase === "speaking") {
1531
- return "border border-og-accent/45 bg-og-accent text-og-accent-fg shadow-og-sm hover:bg-og-accent-strong";
1155
+ return "border border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover";
1532
1156
  }
1533
1157
  if (phase === "blocked" || phase === "error") {
1534
1158
  return "border border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting hover:bg-og-status-waiting/15";
@@ -1542,7 +1166,7 @@ function voiceButtonTone(phase: RealtimeVisualPhase): string {
1542
1166
 
1543
1167
  function voiceChevronTone(phase: RealtimeVisualPhase): string {
1544
1168
  if (phase === "listening" || phase === "speaking") {
1545
- return "border border-l-0 border-og-accent/45 bg-og-accent text-og-accent-fg hover:bg-og-accent-strong";
1169
+ return "border border-l-0 border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover";
1546
1170
  }
1547
1171
  if (phase === "blocked" || phase === "error") {
1548
1172
  return "border border-l-0 border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting hover:bg-og-status-waiting/15";
@@ -1553,42 +1177,6 @@ function voiceChevronTone(phase: RealtimeVisualPhase): string {
1553
1177
  return "text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg";
1554
1178
  }
1555
1179
 
1556
- function toRealtimeModelOption(model: WorkspaceRealtimeModelCatalogItem): RealtimeModelOption {
1557
- return { ...model };
1558
- }
1559
-
1560
- function readRealtimeModelPreference(workspaceId: string): SessionRealtimeModel | null {
1561
- if (typeof localStorage === "undefined") return null;
1562
- try {
1563
- const value = localStorage.getItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`);
1564
- return isRealtimeModel(value) ? value : null;
1565
- } catch {
1566
- return null;
1567
- }
1568
- }
1569
-
1570
- function writeRealtimeModelPreference(workspaceId: string, model: SessionRealtimeModel): void {
1571
- if (typeof localStorage === "undefined") return;
1572
- try {
1573
- localStorage.setItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`, model);
1574
- } catch {
1575
- // Voice selection still works when browser storage is unavailable.
1576
- }
1577
- }
1578
-
1579
- function isRealtimeModel(value: string | null): value is SessionRealtimeModel {
1580
- return (
1581
- value === "gpt-live-1-boulder-alpha" ||
1582
- value === "opengeni-gateway/openai/gpt-realtime-2.1" ||
1583
- value === "opengeni-gateway/openai/gpt-realtime-mini" ||
1584
- value === "opengeni-gateway/xai/grok-voice-think-fast-2.0" ||
1585
- value === "supergrok/grok-voice-think-fast-2.0" ||
1586
- value === "workspace-gateway/openai/gpt-realtime-2.1" ||
1587
- value === "workspace-gateway/openai/gpt-realtime-mini" ||
1588
- value === "workspace-gateway/xai/grok-voice-think-fast-2.0"
1589
- );
1590
- }
1591
-
1592
1180
  /** @deprecated Use the provider-neutral realtime names. */
1593
1181
  export const useSessionCodexRealtime = useSessionRealtime;
1594
1182
  /** @deprecated Use the provider-neutral realtime names. */