@opengeni/react 3.1.0 → 3.1.3-canary.38890816741001

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 (863) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +89 -11
  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-BO2IWXVK.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-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -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-3UZCWK46.js +298 -0
  27. package/dist/chunk-3UZCWK46.js.map +1 -0
  28. package/dist/chunk-47CKUXTW.js +293 -0
  29. package/dist/chunk-47CKUXTW.js.map +1 -0
  30. package/dist/chunk-4QYP6QUI.js +109 -0
  31. package/dist/chunk-4QYP6QUI.js.map +1 -0
  32. package/dist/chunk-5EY26VZ7.js +1053 -0
  33. package/dist/chunk-5EY26VZ7.js.map +1 -0
  34. package/dist/chunk-5I4VRWBB.js +56 -0
  35. package/dist/chunk-5I4VRWBB.js.map +1 -0
  36. package/dist/chunk-5WOR7UCL.js +191 -0
  37. package/dist/chunk-5WOR7UCL.js.map +1 -0
  38. package/dist/chunk-5YJLGOM5.js +51 -0
  39. package/dist/chunk-5YJLGOM5.js.map +1 -0
  40. package/dist/chunk-6JFN3OWG.js +386 -0
  41. package/dist/chunk-6JFN3OWG.js.map +1 -0
  42. package/dist/chunk-7QJT5O4S.js +35 -0
  43. package/dist/chunk-7QJT5O4S.js.map +1 -0
  44. package/dist/chunk-A55KV72M.js +402 -0
  45. package/dist/chunk-A55KV72M.js.map +1 -0
  46. package/dist/chunk-ADWCLI4G.js +2028 -0
  47. package/dist/chunk-ADWCLI4G.js.map +1 -0
  48. package/dist/chunk-B27E3V37.js +29 -0
  49. package/dist/chunk-B27E3V37.js.map +1 -0
  50. package/dist/chunk-B7TC2A33.js +83 -0
  51. package/dist/chunk-B7TC2A33.js.map +1 -0
  52. package/dist/chunk-BLL56F7R.js +385 -0
  53. package/dist/chunk-BLL56F7R.js.map +1 -0
  54. package/dist/chunk-BOFEQC6K.js +162 -0
  55. package/dist/chunk-BOFEQC6K.js.map +1 -0
  56. package/dist/chunk-CM7LVUKC.js +35 -0
  57. package/dist/chunk-CM7LVUKC.js.map +1 -0
  58. package/dist/chunk-CORUP6JB.js +122 -0
  59. package/dist/chunk-CORUP6JB.js.map +1 -0
  60. package/dist/chunk-CSX5FFKZ.js +35 -0
  61. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  62. package/dist/chunk-EGVHJKGJ.js +3125 -0
  63. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  64. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  65. package/dist/chunk-G76LSA76.js.map +1 -0
  66. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  67. package/dist/chunk-GQMRL52F.js.map +1 -0
  68. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  69. package/dist/chunk-GUUXOISA.js.map +1 -0
  70. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  71. package/dist/chunk-I7X2P4FU.js.map +1 -0
  72. package/dist/chunk-IGFZFLI2.js +1390 -0
  73. package/dist/chunk-IGFZFLI2.js.map +1 -0
  74. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  75. package/dist/chunk-IMSUVYQB.js.map +1 -0
  76. package/dist/chunk-IOYHDEP3.js +38 -0
  77. package/dist/chunk-IOYHDEP3.js.map +1 -0
  78. package/dist/chunk-IZV5FTJC.js +55 -0
  79. package/dist/chunk-IZV5FTJC.js.map +1 -0
  80. package/dist/chunk-KF33GTWN.js +343 -0
  81. package/dist/chunk-KF33GTWN.js.map +1 -0
  82. package/dist/chunk-KSGQ5ODA.js +457 -0
  83. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  84. package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
  85. package/dist/chunk-KZC6QRNR.js.map +1 -0
  86. package/dist/chunk-LJUMYUBO.js +218 -0
  87. package/dist/chunk-LJUMYUBO.js.map +1 -0
  88. package/dist/chunk-LSW2OJVV.js +380 -0
  89. package/dist/chunk-LSW2OJVV.js.map +1 -0
  90. package/dist/chunk-M357MHH3.js +2 -0
  91. package/dist/chunk-M357MHH3.js.map +1 -0
  92. package/dist/chunk-MK2TQO4Y.js +24 -0
  93. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  94. package/dist/chunk-N7S72EXK.js +25 -0
  95. package/dist/chunk-N7S72EXK.js.map +1 -0
  96. package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
  97. package/dist/chunk-NKMYZFHA.js.map +1 -0
  98. package/dist/chunk-NX4ADH73.js +14 -0
  99. package/dist/chunk-NX4ADH73.js.map +1 -0
  100. package/dist/chunk-O7F6UJO4.js +71 -0
  101. package/dist/chunk-O7F6UJO4.js.map +1 -0
  102. package/dist/chunk-OVB5WIG5.js +14064 -0
  103. package/dist/chunk-OVB5WIG5.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-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-VIUEOHXY.js +394 -0
  137. package/dist/chunk-VIUEOHXY.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-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
  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/fleet-tile.d.ts +2 -2
  200. package/dist/components/grok-mark.d.ts +26 -0
  201. package/dist/components/human-input-form.d.ts +28 -32
  202. package/dist/components/human-input-surface.d.ts +7 -2
  203. package/dist/components/linkified-text.d.ts +18 -0
  204. package/dist/components/machine-input-display.d.ts +22 -1
  205. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  206. package/dist/components/machines/machine-detail.d.ts +7 -1
  207. package/dist/components/machines/machine-status.d.ts +48 -0
  208. package/dist/components/markdown-table-layout.d.ts +18 -0
  209. package/dist/components/markdown.d.ts +37 -4
  210. package/dist/components/message-timeline.d.ts +86 -7
  211. package/dist/components/model-mark.d.ts +29 -0
  212. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  213. package/dist/components/model-policy-picker.d.ts +41 -25
  214. package/dist/components/new-conversation.d.ts +32 -0
  215. package/dist/components/open-geni-chat.d.ts +73 -0
  216. package/dist/components/open-geni-links.d.ts +68 -0
  217. package/dist/components/openrouter-mark.d.ts +6 -0
  218. package/dist/components/opper-mark.d.ts +7 -0
  219. package/dist/components/preview-loading.d.ts +2 -0
  220. package/dist/components/provider-recovery-notice.d.ts +16 -0
  221. package/dist/components/queue-item-content.d.ts +9 -0
  222. package/dist/components/rehype-secret-refs.d.ts +23 -0
  223. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  224. package/dist/components/sandbox-files.d.ts +3 -1
  225. package/dist/components/sandbox-workspace.d.ts +18 -0
  226. package/dist/components/secret-question-field.d.ts +31 -0
  227. package/dist/components/secret-ref-chip.d.ts +35 -0
  228. package/dist/components/session-capability-frame.d.ts +37 -0
  229. package/dist/components/session-chrome.d.ts +57 -8
  230. package/dist/components/session-commands-panel.d.ts +6 -0
  231. package/dist/components/session-commands.d.ts +6 -0
  232. package/dist/components/session-connection-request.d.ts +8 -0
  233. package/dist/components/session-conversation.d.ts +157 -0
  234. package/dist/components/session-list.d.ts +39 -0
  235. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  236. package/dist/components/session-proxy-scope.d.ts +35 -0
  237. package/dist/components/session-status.d.ts +4 -1
  238. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  239. package/dist/components/timeline-anchor.d.ts +24 -0
  240. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  241. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  242. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  243. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  244. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  245. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  246. package/dist/components/timeline-annotations.d.ts +13 -3
  247. package/dist/components/timeline-reading-progress.d.ts +11 -0
  248. package/dist/components/timeline-search.d.ts +34 -0
  249. package/dist/components/timeline-settlement.d.ts +16 -0
  250. package/dist/components/tip-follow.d.ts +16 -0
  251. package/dist/components/tool-action-review.d.ts +47 -0
  252. package/dist/components/tool-review-history.d.ts +25 -0
  253. package/dist/components/usage-limit-notice.d.ts +49 -0
  254. package/dist/components/usage-member-list.d.ts +91 -0
  255. package/dist/components/usage-meter.d.ts +73 -0
  256. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  257. package/dist/components/user-message-body.d.ts +10 -1
  258. package/dist/composer-messages.d.ts +74 -0
  259. package/dist/composer-messages.js +9 -0
  260. package/dist/composer-messages.js.map +1 -0
  261. package/dist/composer-voice-events.d.ts +8 -0
  262. package/dist/composer.d.ts +5 -4
  263. package/dist/composer.js +26 -13
  264. package/dist/computer-viewer-GMLDXPON.js +20 -0
  265. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  266. package/dist/connect-account-identity.d.ts +8 -0
  267. package/dist/connect-accounts.d.ts +15 -0
  268. package/dist/connect-chooser.d.ts +18 -0
  269. package/dist/connect-panel.d.ts +18 -0
  270. package/dist/connect-setup.d.ts +18 -0
  271. package/dist/connect.d.ts +21 -0
  272. package/dist/connect.js +2149 -0
  273. package/dist/connect.js.map +1 -0
  274. package/dist/connection-catalog.d.ts +38 -0
  275. package/dist/connection-discovery.d.ts +12 -0
  276. package/dist/connection-installed.d.ts +17 -0
  277. package/dist/connection-logo.d.ts +9 -0
  278. package/dist/connection-service-logo.d.ts +8 -0
  279. package/dist/connection-service-presentation.d.ts +13 -0
  280. package/dist/connection-skeleton.d.ts +5 -0
  281. package/dist/connection-type-picker.d.ts +6 -0
  282. package/dist/conversation-timeline.d.ts +5 -0
  283. package/dist/desktop.d.ts +7 -0
  284. package/dist/desktop.js +27 -0
  285. package/dist/desktop.js.map +1 -0
  286. package/dist/device-authorization.d.ts +23 -0
  287. package/dist/diffs.d.ts +8 -0
  288. package/dist/diffs.js +15 -0
  289. package/dist/diffs.js.map +1 -0
  290. package/dist/discovery-cache.d.ts +5 -0
  291. package/dist/editor.d.ts +7 -0
  292. package/dist/editor.js +22 -0
  293. package/dist/editor.js.map +1 -0
  294. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  295. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  296. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  297. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  298. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  299. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  300. package/dist/hooks/latest-question.d.ts +25 -0
  301. package/dist/hooks/shared-machines-list.d.ts +4 -0
  302. package/dist/hooks/shared-query.d.ts +113 -0
  303. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  304. package/dist/hooks/use-auth-runs.d.ts +1 -4
  305. package/dist/hooks/use-available-models.d.ts +1 -1
  306. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  307. package/dist/hooks/use-browser-session.d.ts +12 -1
  308. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  309. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  310. package/dist/hooks/use-composer.d.ts +24 -2
  311. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  312. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  313. package/dist/hooks/use-computer-session.d.ts +4 -0
  314. package/dist/hooks/use-connect.d.ts +23 -0
  315. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  316. package/dist/hooks/use-file-attachments.d.ts +12 -0
  317. package/dist/hooks/use-goal.d.ts +2 -1
  318. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  319. package/dist/hooks/use-new-conversation.d.ts +56 -0
  320. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  321. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  322. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  323. package/dist/hooks/use-session-conversation.d.ts +49 -0
  324. package/dist/hooks/use-session-events.d.ts +28 -7
  325. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  326. package/dist/hooks/use-session-model-account.d.ts +48 -0
  327. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  328. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  329. package/dist/hooks/use-usage.d.ts +40 -0
  330. package/dist/hooks/use-vaults.d.ts +53 -0
  331. package/dist/hooks/use-voice-input.d.ts +8 -1
  332. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  333. package/dist/hooks/use-workspace-sessions.d.ts +22 -5
  334. package/dist/human-input-model.d.ts +122 -0
  335. package/dist/identity-link-accounts.d.ts +11 -0
  336. package/dist/identity-link-consent.d.ts +18 -0
  337. package/dist/index.d.ts +82 -20
  338. package/dist/index.js +2350 -6605
  339. package/dist/index.js.map +1 -1
  340. package/dist/interaction.d.ts +1 -1
  341. package/dist/interaction.js +14 -24
  342. package/dist/interaction.js.map +1 -1
  343. package/dist/latest-question-R77KWSUP.js +118 -0
  344. package/dist/latest-question-R77KWSUP.js.map +1 -0
  345. package/dist/lib/clipboard.d.ts +7 -0
  346. package/dist/lib/error-message.d.ts +7 -0
  347. package/dist/lib/format.d.ts +58 -4
  348. package/dist/lib/host-theme.d.ts +77 -0
  349. package/dist/lib/interaction-errors.d.ts +3 -0
  350. package/dist/lib/menu-styles.d.ts +22 -0
  351. package/dist/lib/notify-observer.d.ts +2 -0
  352. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  353. package/dist/lib/provider-recovery.d.ts +55 -0
  354. package/dist/lib/scrollbars.d.ts +11 -0
  355. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  356. package/dist/lib/transient-retry.d.ts +25 -0
  357. package/dist/lib/workbench-peers.d.ts +36 -0
  358. package/dist/lib/xterm-theme.d.ts +7 -5
  359. package/dist/machines.js +9 -5
  360. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  361. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  362. package/dist/mcp-connection-status.d.ts +14 -0
  363. package/dist/model-mark-paths.d.ts +34 -0
  364. package/dist/model-mark-paths.js +16 -0
  365. package/dist/model-mark-paths.js.map +1 -0
  366. package/dist/model-picker-model.d.ts +111 -0
  367. package/dist/model-picker-model.js +25 -0
  368. package/dist/model-picker-model.js.map +1 -0
  369. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  370. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  371. package/dist/model-policy.d.ts +30 -3
  372. package/dist/model-policy.js +14 -1
  373. package/dist/native-previews.d.ts +28 -0
  374. package/dist/native-previews.js +82 -0
  375. package/dist/native-previews.js.map +1 -0
  376. package/dist/new-session-draft.d.ts +7 -0
  377. package/dist/new-session-draft.js +639 -0
  378. package/dist/new-session-draft.js.map +1 -0
  379. package/dist/notification-text.d.ts +27 -0
  380. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  381. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  382. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  383. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  384. package/dist/older-history.d.ts +3 -2
  385. package/dist/organization-model.d.ts +32 -0
  386. package/dist/organization-model.js +65 -0
  387. package/dist/organization-model.js.map +1 -0
  388. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  389. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  390. package/dist/plugin-details.d.ts +14 -0
  391. package/dist/plugin-discovery.d.ts +25 -0
  392. package/dist/preview-loading-paint.d.ts +20 -0
  393. package/dist/provider.d.ts +25 -2
  394. package/dist/queue-presentation-model.d.ts +72 -0
  395. package/dist/queue-presentation-model.js +38 -0
  396. package/dist/queue-presentation-model.js.map +1 -0
  397. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  398. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  399. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  400. package/dist/realtime/embedded-voice.d.ts +1 -0
  401. package/dist/realtime/realtime-control.d.ts +4 -65
  402. package/dist/realtime/session-realtime.d.ts +78 -0
  403. package/dist/realtime.js +25 -1294
  404. package/dist/realtime.js.map +1 -1
  405. package/dist/sandbox-files-O27IPOZW.js +21 -0
  406. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  407. package/dist/sandbox-label-model.d.ts +30 -0
  408. package/dist/sandbox-label-model.js +20 -0
  409. package/dist/sandbox-label-model.js.map +1 -0
  410. package/dist/scrollbars.d.ts +1 -0
  411. package/dist/scrollbars.js +10 -0
  412. package/dist/scrollbars.js.map +1 -0
  413. package/dist/secret-reference-label.d.ts +14 -0
  414. package/dist/secrets-ui.d.ts +57 -0
  415. package/dist/session-agents-model.d.ts +10 -0
  416. package/dist/session-agents-model.js +25 -0
  417. package/dist/session-agents-model.js.map +1 -0
  418. package/dist/session-attention-model.d.ts +8 -0
  419. package/dist/session-attention-model.js +47 -0
  420. package/dist/session-attention-model.js.map +1 -0
  421. package/dist/session-auth-recommendation.d.ts +5 -0
  422. package/dist/session-capability-policy.d.ts +31 -0
  423. package/dist/session-feedback-model.d.ts +20 -0
  424. package/dist/session-feedback-model.js +56 -0
  425. package/dist/session-feedback-model.js.map +1 -0
  426. package/dist/session-list-model.d.ts +138 -0
  427. package/dist/session-list-model.js +274 -0
  428. package/dist/session-list-model.js.map +1 -0
  429. package/dist/session-realtime-7DJOIHQW.js +21 -0
  430. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  431. package/dist/session-realtime.d.ts +7 -0
  432. package/dist/session-realtime.js +19 -0
  433. package/dist/session-realtime.js.map +1 -0
  434. package/dist/session-status-model.d.ts +36 -0
  435. package/dist/session-ui.d.ts +39 -1
  436. package/dist/session-ui.js +126 -12
  437. package/dist/session-ui.js.map +1 -1
  438. package/dist/session.d.ts +8 -2
  439. package/dist/session.js +35 -20
  440. package/dist/site-snapshot.d.ts +14 -0
  441. package/dist/sites-ui.d.ts +24 -0
  442. package/dist/sites.d.ts +3 -0
  443. package/dist/sites.js +14 -0
  444. package/dist/sites.js.map +1 -0
  445. package/dist/skill-discovery.d.ts +47 -0
  446. package/dist/terminal.d.ts +8 -0
  447. package/dist/terminal.js +32 -0
  448. package/dist/terminal.js.map +1 -0
  449. package/dist/testing/session-scenarios.d.ts +10 -0
  450. package/dist/testing/session-scenarios.js +367 -0
  451. package/dist/testing/session-scenarios.js.map +1 -0
  452. package/dist/timeline/activity-rail.d.ts +11 -2
  453. package/dist/timeline/agent-identity.d.ts +30 -0
  454. package/dist/timeline/agent-row.d.ts +31 -0
  455. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  456. package/dist/timeline/compaction-copy.d.ts +46 -0
  457. package/dist/timeline/entrance.d.ts +13 -1
  458. package/dist/timeline/focus-sequence.d.ts +9 -0
  459. package/dist/timeline/genie-copy.d.ts +3 -0
  460. package/dist/timeline/genie-loading.d.ts +47 -0
  461. package/dist/timeline/index.d.ts +10 -5
  462. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  463. package/dist/timeline/message-sender.d.ts +19 -0
  464. package/dist/timeline/notice-presentation.d.ts +13 -0
  465. package/dist/timeline/parsers.d.ts +11 -0
  466. package/dist/timeline/patch-apply-command.d.ts +18 -0
  467. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  468. package/dist/timeline/platform-activity-row.d.ts +1 -2
  469. package/dist/timeline/presented-image.d.ts +11 -0
  470. package/dist/timeline/projection.d.ts +31 -2
  471. package/dist/timeline/provider-logo.d.ts +15 -0
  472. package/dist/timeline/question-nav-model.d.ts +23 -0
  473. package/dist/timeline/registry.d.ts +12 -1
  474. package/dist/timeline/retained-image.d.ts +18 -0
  475. package/dist/timeline/retained-loaders.d.ts +27 -0
  476. package/dist/timeline/rolling-activity.d.ts +11 -0
  477. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  478. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  479. package/dist/timeline/shared.d.ts +4 -1
  480. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  481. package/dist/timeline/startup-preference.d.ts +3 -0
  482. package/dist/timeline/startup-timings.d.ts +4 -0
  483. package/dist/timeline/tool-display-name.d.ts +5 -2
  484. package/dist/timeline/tool-presentation.d.ts +172 -0
  485. package/dist/timeline/turn-summary-model.d.ts +95 -0
  486. package/dist/timeline/turn-summary.d.ts +20 -54
  487. package/dist/timeline/types.d.ts +179 -7
  488. package/dist/timeline/work-presentation.d.ts +60 -0
  489. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  490. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  491. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  492. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  493. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  494. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  495. package/dist/timeline-model.d.ts +29 -0
  496. package/dist/timeline-model.js +254 -0
  497. package/dist/timeline-model.js.map +1 -0
  498. package/dist/usage/allowance-copy.d.ts +25 -0
  499. package/dist/usage/session-usage-limit.d.ts +88 -0
  500. package/dist/usage/summary.d.ts +35 -0
  501. package/dist/usage.d.ts +17 -0
  502. package/dist/usage.js +1187 -0
  503. package/dist/usage.js.map +1 -0
  504. package/dist/voice-recording-owner.d.ts +7 -0
  505. package/package.json +107 -7
  506. package/src/accounts.tsx +116 -14
  507. package/src/approvals.ts +8 -1
  508. package/src/artifacts-spreadsheet.ts +1 -0
  509. package/src/artifacts.ts +44 -0
  510. package/src/assets/README.md +8 -0
  511. package/src/assets/gmail.ico +0 -0
  512. package/src/assets/outlook.ico +0 -0
  513. package/src/capability-catalog-row.tsx +94 -0
  514. package/src/capability-logo-fallback.ts +22 -0
  515. package/src/client.ts +20 -31
  516. package/src/commands/registry.ts +18 -15
  517. package/src/commands/types.ts +2 -0
  518. package/src/components/anthropic-mark.tsx +10 -0
  519. package/src/components/approval-surface.tsx +401 -138
  520. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  521. package/src/components/artifacts/artifact-sandbox.tsx +189 -0
  522. package/src/components/artifacts/artifact-surface.tsx +40 -20
  523. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  524. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  525. package/src/components/artifacts/document-editor.tsx +141 -16
  526. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  527. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  528. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  529. package/src/components/artifacts/editable-document.tsx +37 -36
  530. package/src/components/artifacts/editable-presentation.tsx +36 -18
  531. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  532. package/src/components/artifacts/index.ts +45 -0
  533. package/src/components/artifacts/inline-html-document.ts +24 -0
  534. package/src/components/artifacts/latest-task-runner.ts +49 -0
  535. package/src/components/artifacts/presentation-editor.tsx +323 -67
  536. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  537. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  538. package/src/components/artifacts/site-view.tsx +121 -0
  539. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  540. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  541. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  542. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  543. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  544. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  545. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  546. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  547. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  548. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  549. package/src/components/browser-select-control.tsx +312 -0
  550. package/src/components/browser-viewer.tsx +778 -318
  551. package/src/components/chat-composer.tsx +47 -5
  552. package/src/components/child-session-link.tsx +36 -0
  553. package/src/components/claude-mark.tsx +11 -0
  554. package/src/components/code-editor.tsx +13 -16
  555. package/src/components/composer-transcription-control.tsx +128 -30
  556. package/src/components/composer.tsx +404 -195
  557. package/src/components/computer-viewer.tsx +880 -253
  558. package/src/components/copy-button.tsx +13 -5
  559. package/src/components/desktop-viewer.tsx +1 -1
  560. package/src/components/enrollment-consent.tsx +1 -1
  561. package/src/components/enrollment-device-flow.tsx +1 -1
  562. package/src/components/file-browser.tsx +10 -14
  563. package/src/components/fleet-tile.tsx +9 -18
  564. package/src/components/generated-video-player.tsx +4 -2
  565. package/src/components/grok-mark.tsx +34 -0
  566. package/src/components/human-input-form.tsx +590 -283
  567. package/src/components/human-input-surface.tsx +11 -0
  568. package/src/components/interaction-intervention-banner.tsx +2 -2
  569. package/src/components/linkified-text.tsx +79 -0
  570. package/src/components/machine-card.tsx +35 -78
  571. package/src/components/machine-dock-bar.tsx +1 -1
  572. package/src/components/machine-input-display.ts +197 -3
  573. package/src/components/machines/agent-status-icon.tsx +31 -0
  574. package/src/components/machines/machine-detail.tsx +200 -31
  575. package/src/components/machines/machine-operation-policy.tsx +1 -1
  576. package/src/components/machines/machine-status.ts +241 -0
  577. package/src/components/machines-dashboard.tsx +2 -17
  578. package/src/components/markdown-table-layout.ts +143 -0
  579. package/src/components/markdown.tsx +466 -129
  580. package/src/components/message-timeline.tsx +2567 -728
  581. package/src/components/model-mark.tsx +102 -0
  582. package/src/components/model-picker.tsx +15 -4
  583. package/src/components/model-policy-picker-menu.tsx +371 -0
  584. package/src/components/model-policy-picker.tsx +256 -412
  585. package/src/components/new-conversation.tsx +221 -0
  586. package/src/components/open-geni-chat.tsx +309 -0
  587. package/src/components/open-geni-links.tsx +179 -0
  588. package/src/components/openrouter-mark.tsx +13 -0
  589. package/src/components/opper-mark.tsx +18 -0
  590. package/src/components/pierre-diff.tsx +41 -16
  591. package/src/components/pierre-file.tsx +35 -10
  592. package/src/components/preview-loading.tsx +109 -0
  593. package/src/components/provider-recovery-notice.tsx +49 -0
  594. package/src/components/queue-item-content.ts +14 -0
  595. package/src/components/queue-surface-implementation.tsx +51 -356
  596. package/src/components/queue-surface-state.tsx +3 -1
  597. package/src/components/rehype-secret-refs.ts +98 -0
  598. package/src/components/remark-soft-line-breaks.ts +166 -0
  599. package/src/components/sandbox-files.tsx +91 -15
  600. package/src/components/sandbox-terminal.tsx +84 -13
  601. package/src/components/sandbox-workspace.tsx +147 -51
  602. package/src/components/secret-question-field.tsx +324 -0
  603. package/src/components/secret-ref-chip.tsx +185 -0
  604. package/src/components/session-capability-frame.tsx +197 -0
  605. package/src/components/session-chrome.tsx +842 -251
  606. package/src/components/session-commands-panel.tsx +126 -0
  607. package/src/components/session-commands.tsx +18 -0
  608. package/src/components/session-connection-request.tsx +97 -0
  609. package/src/components/session-conversation.tsx +876 -0
  610. package/src/components/session-list.tsx +257 -0
  611. package/src/components/session-mcp-capability-card.tsx +680 -0
  612. package/src/components/session-proxy-scope.tsx +153 -0
  613. package/src/components/session-status.tsx +26 -17
  614. package/src/components/session-usage-limit-notice.tsx +174 -0
  615. package/src/components/timeline-anchor.tsx +119 -0
  616. package/src/components/timeline-annotation-chrome.tsx +196 -0
  617. package/src/components/timeline-annotation-layout.ts +268 -0
  618. package/src/components/timeline-annotation-markers.tsx +185 -0
  619. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  620. package/src/components/timeline-annotation-selection.tsx +106 -54
  621. package/src/components/timeline-annotation-shared.ts +245 -0
  622. package/src/components/timeline-annotations-dialog.tsx +185 -128
  623. package/src/components/timeline-annotations.tsx +189 -45
  624. package/src/components/timeline-reading-progress.ts +80 -0
  625. package/src/components/timeline-search.tsx +168 -0
  626. package/src/components/timeline-settlement.ts +60 -0
  627. package/src/components/tip-follow.ts +52 -0
  628. package/src/components/tool-action-review.tsx +650 -0
  629. package/src/components/tool-review-history.tsx +88 -0
  630. package/src/components/tooltip.tsx +38 -5
  631. package/src/components/usage-limit-notice.tsx +179 -0
  632. package/src/components/usage-member-list.tsx +792 -0
  633. package/src/components/usage-meter.tsx +382 -0
  634. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  635. package/src/components/user-message-body.tsx +27 -2
  636. package/src/components/workspace-dock.tsx +18 -1
  637. package/src/composer-messages.ts +150 -0
  638. package/src/composer-voice-events.ts +12 -0
  639. package/src/composer.ts +6 -1
  640. package/src/connect-account-identity.tsx +34 -0
  641. package/src/connect-accounts.tsx +233 -0
  642. package/src/connect-chooser.tsx +336 -0
  643. package/src/connect-panel.tsx +99 -0
  644. package/src/connect-setup.tsx +355 -0
  645. package/src/connect.ts +60 -0
  646. package/src/connection-assets.d.ts +4 -0
  647. package/src/connection-catalog.tsx +162 -0
  648. package/src/connection-discovery.tsx +238 -0
  649. package/src/connection-installed.tsx +51 -0
  650. package/src/connection-logo.tsx +37 -0
  651. package/src/connection-service-logo.tsx +55 -0
  652. package/src/connection-service-presentation.ts +46 -0
  653. package/src/connection-skeleton.tsx +16 -0
  654. package/src/connection-type-picker.tsx +36 -0
  655. package/src/conversation-timeline.ts +92 -0
  656. package/src/desktop.ts +24 -0
  657. package/src/device-authorization.tsx +98 -0
  658. package/src/diffs.ts +16 -0
  659. package/src/discovery-cache.ts +42 -0
  660. package/src/editor.ts +13 -0
  661. package/src/hooks/internal.ts +3 -2
  662. package/src/hooks/latest-question.ts +164 -0
  663. package/src/hooks/shared-machines-list.ts +34 -1
  664. package/src/hooks/shared-query.ts +721 -0
  665. package/src/hooks/use-attached-browsers.ts +1 -1
  666. package/src/hooks/use-auth-runs.ts +0 -27
  667. package/src/hooks/use-available-models.ts +21 -15
  668. package/src/hooks/use-browser-frame-stream.ts +19 -2
  669. package/src/hooks/use-browser-session.ts +680 -205
  670. package/src/hooks/use-browser-sessions.ts +32 -1
  671. package/src/hooks/use-client-config-flags.ts +118 -0
  672. package/src/hooks/use-codex-accounts.ts +247 -47
  673. package/src/hooks/use-composer.ts +276 -47
  674. package/src/hooks/use-computer-frame-stream.ts +25 -7
  675. package/src/hooks/use-computer-input-posture.ts +94 -0
  676. package/src/hooks/use-computer-session.ts +409 -95
  677. package/src/hooks/use-connect.ts +23 -0
  678. package/src/hooks/use-desktop-stream.ts +19 -28
  679. package/src/hooks/use-file-attachments.ts +80 -4
  680. package/src/hooks/use-goal.ts +107 -13
  681. package/src/hooks/use-last-started-turn-policy.ts +46 -14
  682. package/src/hooks/use-machines.ts +4 -0
  683. package/src/hooks/use-new-conversation.ts +374 -0
  684. package/src/hooks/use-new-session-draft.ts +813 -0
  685. package/src/hooks/use-realtime-voice-models.ts +46 -0
  686. package/src/hooks/use-sandbox-files.ts +68 -20
  687. package/src/hooks/use-session-background-commands.ts +22 -11
  688. package/src/hooks/use-session-capabilities.ts +3 -2
  689. package/src/hooks/use-session-conversation.ts +150 -0
  690. package/src/hooks/use-session-events.ts +703 -382
  691. package/src/hooks/use-session-lineage.ts +20 -16
  692. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  693. package/src/hooks/use-session-model-account.ts +174 -0
  694. package/src/hooks/use-session.ts +53 -21
  695. package/src/hooks/use-slash-commands.ts +6 -11
  696. package/src/hooks/use-supergrok-accounts.ts +22 -8
  697. package/src/hooks/use-terminal-stream.ts +153 -27
  698. package/src/hooks/use-transcription.ts +6 -0
  699. package/src/hooks/use-turn-queue.ts +2 -1
  700. package/src/hooks/use-usage.ts +100 -0
  701. package/src/hooks/use-vaults.ts +153 -0
  702. package/src/hooks/use-video-artifact-playback.ts +1 -1
  703. package/src/hooks/use-voice-input.ts +127 -19
  704. package/src/hooks/use-workspace-capture.ts +3 -2
  705. package/src/hooks/use-workspace-edit.ts +23 -5
  706. package/src/hooks/use-workspace-sessions.ts +97 -32
  707. package/src/human-input-model.ts +359 -0
  708. package/src/identity-link-accounts.tsx +148 -0
  709. package/src/identity-link-consent.tsx +192 -0
  710. package/src/index.ts +262 -16
  711. package/src/interaction.ts +1 -0
  712. package/src/lib/clipboard.ts +29 -0
  713. package/src/lib/error-message.ts +37 -0
  714. package/src/lib/format.ts +213 -16
  715. package/src/lib/host-theme.ts +529 -0
  716. package/src/lib/interaction-errors.ts +15 -0
  717. package/src/lib/menu-styles.ts +44 -0
  718. package/src/lib/notify-observer.ts +15 -0
  719. package/src/lib/pierre-diffs-loader.ts +53 -0
  720. package/src/lib/provider-recovery.ts +243 -0
  721. package/src/lib/scrollbars.ts +30 -0
  722. package/src/lib/terminal-input-readiness.ts +51 -0
  723. package/src/lib/transient-retry.ts +99 -0
  724. package/src/lib/workbench-peers.ts +62 -0
  725. package/src/lib/xterm-theme.ts +23 -21
  726. package/src/mcp-connection-status.ts +35 -0
  727. package/src/model-mark-paths.ts +53 -0
  728. package/src/model-picker-model.ts +330 -0
  729. package/src/model-policy.ts +299 -74
  730. package/src/native-previews.ts +100 -0
  731. package/src/new-session-draft.ts +22 -0
  732. package/src/notification-text.ts +81 -0
  733. package/src/older-history.ts +22 -4
  734. package/src/organization-model.ts +118 -0
  735. package/src/plugin-details.tsx +185 -0
  736. package/src/plugin-discovery.tsx +196 -0
  737. package/src/preview-loading-paint.ts +68 -0
  738. package/src/provider.tsx +74 -15
  739. package/src/queue-presentation-model.ts +464 -0
  740. package/src/realtime/dropdown-menu.tsx +19 -12
  741. package/src/realtime/embedded-new-voice.tsx +1 -0
  742. package/src/realtime/embedded-voice.tsx +3 -0
  743. package/src/realtime/realtime-control.tsx +138 -501
  744. package/src/realtime/session-realtime.ts +566 -0
  745. package/src/sandbox-label-model.ts +53 -0
  746. package/src/scrollbars.ts +3 -0
  747. package/src/secret-reference-label.ts +43 -0
  748. package/src/secrets-ui.tsx +59 -0
  749. package/src/session-agents-model.ts +33 -0
  750. package/src/session-attention-model.ts +62 -0
  751. package/src/session-auth-recommendation.ts +48 -0
  752. package/src/session-capability-policy.ts +196 -0
  753. package/src/session-context.ts +3 -4
  754. package/src/session-feedback-model.ts +95 -0
  755. package/src/session-list-model.ts +434 -0
  756. package/src/session-realtime.ts +18 -0
  757. package/src/session-status-model.ts +99 -0
  758. package/src/session-ui.ts +98 -1
  759. package/src/session.ts +17 -1
  760. package/src/site-snapshot.ts +74 -0
  761. package/src/sites-ui.tsx +348 -0
  762. package/src/sites.ts +3 -0
  763. package/src/skill-discovery.tsx +208 -0
  764. package/src/terminal.ts +26 -0
  765. package/src/testing/session-scenarios.ts +404 -0
  766. package/src/timeline/activity-rail.tsx +242 -101
  767. package/src/timeline/agent-identity.tsx +84 -0
  768. package/src/timeline/agent-row.tsx +231 -0
  769. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  770. package/src/timeline/compaction-copy.ts +115 -0
  771. package/src/timeline/entrance.tsx +28 -3
  772. package/src/timeline/fleet-decision-projection.ts +2 -1
  773. package/src/timeline/fleet-decision-row.tsx +1 -0
  774. package/src/timeline/focus-sequence.ts +44 -0
  775. package/src/timeline/genie-copy.ts +19 -0
  776. package/src/timeline/genie-loading.tsx +143 -0
  777. package/src/timeline/index.ts +30 -2
  778. package/src/timeline/knowledge-receipt.tsx +100 -0
  779. package/src/timeline/message-sender.tsx +71 -0
  780. package/src/timeline/notice-presentation.ts +48 -0
  781. package/src/timeline/parsers.ts +42 -2
  782. package/src/timeline/patch-apply-command.tsx +135 -0
  783. package/src/timeline/platform-activity-presentation.ts +166 -0
  784. package/src/timeline/platform-activity-row.tsx +15 -90
  785. package/src/timeline/presented-image.ts +63 -0
  786. package/src/timeline/projection.ts +1746 -76
  787. package/src/timeline/provider-logo.tsx +53 -0
  788. package/src/timeline/question-nav-model.ts +28 -0
  789. package/src/timeline/registry.ts +26 -4
  790. package/src/timeline/retained-image.ts +97 -0
  791. package/src/timeline/retained-loaders.ts +91 -0
  792. package/src/timeline/rolling-activity.tsx +80 -0
  793. package/src/timeline/screenshot-lightbox.tsx +228 -5
  794. package/src/timeline/session-usage-limit-row.tsx +42 -0
  795. package/src/timeline/shared.tsx +42 -15
  796. package/src/timeline/startup-dispatch-details.tsx +36 -0
  797. package/src/timeline/startup-preference.ts +33 -0
  798. package/src/timeline/startup-timings.tsx +145 -0
  799. package/src/timeline/tool-display-name.ts +19 -7
  800. package/src/timeline/tool-presentation.ts +1316 -0
  801. package/src/timeline/tool-renderers.tsx +835 -1138
  802. package/src/timeline/turn-summary-model.ts +343 -0
  803. package/src/timeline/turn-summary.tsx +272 -365
  804. package/src/timeline/types.ts +189 -6
  805. package/src/timeline/work-presentation.ts +189 -0
  806. package/src/timeline-model.ts +143 -0
  807. package/src/usage/allowance-copy.ts +64 -0
  808. package/src/usage/session-usage-limit.ts +266 -0
  809. package/src/usage/summary.ts +93 -0
  810. package/src/usage.ts +70 -0
  811. package/src/voice-recording-owner.ts +22 -0
  812. package/styles/compiled.css +2319 -748
  813. package/styles/connect.css +290 -0
  814. package/styles/connect.d.ts +1 -0
  815. package/styles/effective-tokens.css +1 -0
  816. package/styles/index.css +309 -9
  817. package/styles/responsive.css +99 -7
  818. package/styles/session-capability.css +44 -0
  819. package/styles/tokens.css +134 -66
  820. package/dist/browser-viewer-AEFHUYZK.js +0 -14
  821. package/dist/chunk-4MDLEHXL.js.map +0 -1
  822. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  823. package/dist/chunk-D3UIAJKY.js.map +0 -1
  824. package/dist/chunk-ELIYWBZR.js.map +0 -1
  825. package/dist/chunk-H5YGYNXS.js.map +0 -1
  826. package/dist/chunk-HQVCKCLG.js +0 -9458
  827. package/dist/chunk-HQVCKCLG.js.map +0 -1
  828. package/dist/chunk-HUIKIDM5.js.map +0 -1
  829. package/dist/chunk-ICA6R6TW.js.map +0 -1
  830. package/dist/chunk-JVYQRRC4.js.map +0 -1
  831. package/dist/chunk-KCGXPP5V.js.map +0 -1
  832. package/dist/chunk-KZ73RL76.js.map +0 -1
  833. package/dist/chunk-LAKLF4PA.js +0 -141
  834. package/dist/chunk-LAKLF4PA.js.map +0 -1
  835. package/dist/chunk-MZ2G2XBA.js.map +0 -1
  836. package/dist/chunk-NEXLLTP4.js.map +0 -1
  837. package/dist/chunk-OAM4WAAM.js.map +0 -1
  838. package/dist/chunk-PEI6RANI.js.map +0 -1
  839. package/dist/chunk-RGALCTWO.js.map +0 -1
  840. package/dist/chunk-W6NFJXSA.js +0 -454
  841. package/dist/chunk-W6NFJXSA.js.map +0 -1
  842. package/dist/chunk-WSK7G5LE.js +0 -170
  843. package/dist/chunk-WSK7G5LE.js.map +0 -1
  844. package/dist/chunk-X4A66EWZ.js +0 -223
  845. package/dist/chunk-X4A66EWZ.js.map +0 -1
  846. package/dist/chunk-XXWH2JLC.js.map +0 -1
  847. package/dist/chunk-YFKJ7VZH.js +0 -268
  848. package/dist/chunk-YFKJ7VZH.js.map +0 -1
  849. package/dist/chunk-YJFGAFBD.js.map +0 -1
  850. package/dist/computer-viewer-FWEZISW4.js +0 -16
  851. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  852. package/dist/hooks/use-environments.d.ts +0 -41
  853. package/dist/hooks/use-packs.d.ts +0 -32
  854. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  855. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  856. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  857. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  858. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  859. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  860. package/src/hooks/use-environments.ts +0 -182
  861. package/src/hooks/use-packs.ts +0 -157
  862. /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  863. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.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,331 +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
- | { state: "loading"; promise: Promise<RealtimeModelOption[]> }
109
- | { state: "ready"; models: RealtimeModelOption[]; expiresAt: number };
110
-
111
- // Scope advisory availability to the exact client object and workspace. The
112
- // server still authorizes every realtime operation; changing principals should
113
- // replace the client just as it does for the rest of the SDK state.
114
- const realtimeModelCatalogCache = new WeakMap<
115
- RealtimeControllerClient,
116
- Map<string, RealtimeModelCatalogCacheEntry>
117
- >();
118
-
119
- function realtimeModelFallback(codexConnected: boolean): RealtimeModelOption[] {
120
- return [
121
- {
122
- ...CODEX_LIVE_MODEL,
123
- available: codexConnected,
124
- unavailableReason: codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,
125
- },
126
- ];
127
- }
128
-
129
- function realtimeModelCatalogCacheFor(
130
- client: RealtimeControllerClient,
131
- ): Map<string, RealtimeModelCatalogCacheEntry> {
132
- const existing = realtimeModelCatalogCache.get(client);
133
- if (existing) return existing;
134
- const created = new Map<string, RealtimeModelCatalogCacheEntry>();
135
- realtimeModelCatalogCache.set(client, created);
136
- return created;
137
- }
138
-
139
- function readCachedRealtimeModelCatalog(
140
- client: RealtimeControllerClient,
141
- workspaceId: string,
142
- now = Date.now(),
143
- ): RealtimeModelOption[] | null {
144
- const cache = realtimeModelCatalogCache.get(client);
145
- const entry = cache?.get(workspaceId);
146
- if (!entry || entry.state === "loading") return null;
147
- if (entry.expiresAt > now) return entry.models;
148
- cache?.delete(workspaceId);
149
- return null;
150
- }
151
-
152
- function pruneRealtimeModelCatalogCache(
153
- cache: Map<string, RealtimeModelCatalogCacheEntry>,
154
- now: number,
155
- ): void {
156
- for (const [workspaceId, entry] of cache) {
157
- if (entry.state === "ready" && entry.expiresAt <= now) cache.delete(workspaceId);
158
- }
159
- while (cache.size >= REALTIME_MODEL_CATALOG_CACHE_MAX_WORKSPACES) {
160
- const oldestWorkspaceId = cache.keys().next().value;
161
- if (oldestWorkspaceId === undefined) return;
162
- cache.delete(oldestWorkspaceId);
163
- }
164
- }
165
-
166
- function loadRealtimeModelCatalog(
167
- client: RealtimeControllerClient,
168
- workspaceId: string,
169
- ): Promise<RealtimeModelOption[]> | null {
170
- const load = client.getWorkspaceRealtimeModelCatalog;
171
- if (!load) return null;
172
- const now = Date.now();
173
- const cache = realtimeModelCatalogCacheFor(client);
174
- const entry = cache.get(workspaceId);
175
- if (entry?.state === "loading") return entry.promise;
176
- if (entry?.state === "ready" && entry.expiresAt > now) return Promise.resolve(entry.models);
177
- if (entry) cache.delete(workspaceId);
178
- pruneRealtimeModelCatalogCache(cache, now);
179
-
180
- const promise = load
181
- .call(client, workspaceId)
182
- .then((response) => response.models.map(toRealtimeModelOption))
183
- .then((models) => {
184
- const current = cache.get(workspaceId);
185
- if (current?.state === "loading" && current.promise === promise) {
186
- cache.delete(workspaceId);
187
- cache.set(workspaceId, {
188
- state: "ready",
189
- models,
190
- expiresAt: Date.now() + REALTIME_MODEL_CATALOG_CACHE_TTL_MS,
191
- });
192
- }
193
- return models;
194
- })
195
- .catch((error: unknown) => {
196
- const current = cache.get(workspaceId);
197
- if (current?.state === "loading" && current.promise === promise) cache.delete(workspaceId);
198
- throw error;
199
- });
200
- cache.set(workspaceId, { state: "loading", promise });
201
- return promise;
202
- }
203
-
204
- export type SessionRealtimeControllerFactory = (
205
- options: CreateSessionRealtimeControllerOptions,
206
- ) => SessionRealtimeController;
207
-
208
- type AdmissionInput = {
209
- sessionStatus: SessionStatus;
210
- controlState: "active" | "paused";
211
- settlement: { state: string } | null;
212
- codexConnected: boolean;
213
- lifecycleActive: boolean;
116
+ "Your Gateway": {
117
+ billingClass: "byok",
118
+ label: "Your Gateway",
119
+ hint: "Billed to your AI Gateway",
120
+ },
214
121
  };
215
-
216
- export function codexRealtimeAdmissionAllowed(input: AdmissionInput): boolean {
217
- return codexRealtimeAdmissionBlocker(input) === null;
218
- }
219
-
220
- export function codexRealtimeAdmissionBlocker(input: AdmissionInput): string | null {
221
- if (input.sessionStatus === "cancelled") return "This session was cancelled.";
222
- if (input.controlState !== "active") return "Resume this session before starting voice.";
223
- if (input.settlement !== null) return "Wait for the current session transition to finish.";
224
- if (!input.codexConnected) return "Connect Codex to use this voice model.";
225
- if (input.lifecycleActive) return "Voice is already active for this session.";
226
- return null;
227
- }
228
-
229
- export function useSessionRealtime(options: {
230
- client?: RealtimeControllerClient | undefined;
231
- workspaceId?: string | undefined;
232
- sessionId: string;
233
- sessionStatus: SessionStatus;
234
- effectiveControl: EffectiveSessionControl;
235
- events: SessionEvent[];
236
- eventsReady: boolean;
237
- codexConnected: boolean;
238
- model?: SessionRealtimeModel | undefined;
239
- modelAvailable?: boolean | undefined;
240
- modelUnavailableReason?: string | null | undefined;
241
- /** Model-visible application context captured with each durable realtime message. */
242
- getModelContext?: (() => string | undefined) | undefined;
243
- /** Deterministic browser-test/demo seam. Production hosts should use the SDK default. */
244
- controllerFactory?: SessionRealtimeControllerFactory | undefined;
245
- }) {
246
- const { client, workspaceId } = useEmbeddedRealtimeSession({
247
- client: options.client,
248
- workspaceId: options.workspaceId,
249
- });
250
- const model = options.model ?? CODEX_LIVE_MODEL.id;
251
- const audioRef = useRef<HTMLAudioElement>(null);
252
- const controllerRef = useRef<SessionRealtimeController | null>(null);
253
- const controllerModelRef = useRef<SessionRealtimeModel | null>(null);
254
- const modelContextProviderRef = useRef(options.getModelContext);
255
- modelContextProviderRef.current = options.getModelContext;
256
- const [snapshot, setSnapshot] = useState<SessionRealtimeControllerSnapshot>(() => ({
257
- status: hasStoredSessionRealtimeOwnerProof({
258
- workspaceId,
259
- sessionId: options.sessionId,
260
- model,
261
- })
262
- ? "recovering"
263
- : "idle",
264
- realtimeId: null,
265
- mode: null,
266
- bridge: null,
267
- microphone: "inactive",
268
- inputMuted: false,
269
- audibleOutput: "inactive",
270
- outputMuted: false,
271
- connectionGeneration: 0,
272
- reconnectAttempt: 0,
273
- diagnostic: null,
274
- error: null,
275
- }));
276
- const lifecycle = useMemo(
277
- () => projectSessionRealtimeLifecycle(options.events),
278
- [options.events],
279
- );
280
- const lifecycleRef = useRef(lifecycle);
281
- const eventsReadyRef = useRef(options.eventsReady);
282
- lifecycleRef.current = lifecycle;
283
- eventsReadyRef.current = options.eventsReady;
284
- const lifecycleActive = sessionRealtimeLifecycleIsActive(lifecycle);
285
-
286
- useEffect(() => {
287
- let disposed = false;
288
- let controller: SessionRealtimeController | null = null;
289
- let unsubscribe: (() => void) | null = null;
290
- void import("@opengeni/sdk/realtime")
291
- .then(({ createSessionRealtimeController }) => {
292
- if (disposed) return;
293
- const controllerFactory = options.controllerFactory ?? createSessionRealtimeController;
294
- controller = controllerFactory({
295
- client,
296
- workspaceId,
297
- sessionId: options.sessionId,
298
- ...(audioRef.current ? { remoteAudio: audioRef.current } : {}),
299
- model,
300
- getModelContext: () => modelContextProviderRef.current?.(),
301
- });
302
- controllerRef.current = controller;
303
- controllerModelRef.current = model;
304
- unsubscribe = controller.subscribe(setSnapshot);
305
- if (eventsReadyRef.current) {
306
- void controller.observeLifecycle(lifecycleRef.current).catch(() => undefined);
307
- }
308
- })
309
- .catch((error: unknown) => {
310
- if (disposed) return;
311
- setSnapshot({
312
- status: "error",
313
- realtimeId: null,
314
- mode: null,
315
- bridge: null,
316
- microphone: "inactive",
317
- inputMuted: false,
318
- audibleOutput: "inactive",
319
- outputMuted: false,
320
- connectionGeneration: 0,
321
- reconnectAttempt: 0,
322
- diagnostic: {
323
- kind: "negotiation_failure",
324
- message:
325
- error instanceof Error ? error.message : "Codex realtime controller failed to load",
326
- recoverable: false,
327
- connectionGeneration: 0,
328
- attempt: 0,
329
- },
330
- error:
331
- error instanceof Error ? error.message : "Codex realtime controller failed to load",
332
- });
333
- });
334
- return () => {
335
- disposed = true;
336
- unsubscribe?.();
337
- controller?.close();
338
- if (controllerRef.current === controller) {
339
- controllerRef.current = null;
340
- controllerModelRef.current = null;
341
- }
342
- };
343
- }, [client, model, options.controllerFactory, options.sessionId, workspaceId]);
344
-
345
- useEffect(() => {
346
- if (!options.eventsReady) return;
347
- void controllerRef.current?.observeLifecycle(lifecycle).catch(() => undefined);
348
- }, [lifecycle, options.eventsReady]);
349
-
350
- const start = useCallback(async () => {
351
- const controller = controllerRef.current;
352
- if (!controller || controllerModelRef.current !== model) {
353
- throw new Error("The selected voice model is still preparing");
354
- }
355
- await controller.start();
356
- }, [model]);
357
- const stop = useCallback(async () => {
358
- await controllerRef.current?.stop();
359
- }, []);
360
- const retry = useCallback(async () => {
361
- await controllerRef.current?.retry();
362
- }, []);
363
- const retryAudibleOutput = useCallback(async () => {
364
- await controllerRef.current?.retryAudibleOutput();
365
- }, []);
366
- const setInputMuted = useCallback((muted: boolean) => {
367
- controllerRef.current?.setInputMuted(muted);
368
- }, []);
369
- const setOutputMuted = useCallback((muted: boolean) => {
370
- controllerRef.current?.setOutputMuted(muted);
371
- }, []);
372
- const admissionInput = {
373
- sessionStatus: options.sessionStatus,
374
- controlState: options.effectiveControl.state,
375
- settlement: options.effectiveControl.settlement,
376
- codexConnected: options.modelAvailable ?? options.codexConnected,
377
- lifecycleActive,
378
- } satisfies AdmissionInput;
379
- const admissionBlocker =
380
- options.modelAvailable === false
381
- ? (options.modelUnavailableReason ?? "This voice model is unavailable.")
382
- : codexRealtimeAdmissionBlocker(admissionInput);
383
- const canStart =
384
- controllerRef.current !== null &&
385
- controllerModelRef.current === model &&
386
- ["idle", "error"].includes(snapshot.status) &&
387
- admissionBlocker === null;
388
-
389
- return {
390
- snapshot,
391
- lifecycleActive,
392
- canStart,
393
- admissionBlocker,
394
- codexConnected: options.codexConnected,
395
- audioRef,
396
- start,
397
- stop,
398
- retry,
399
- retryAudibleOutput,
400
- setInputMuted,
401
- setOutputMuted,
402
- };
403
- }
404
-
405
- function sessionRealtimeLifecycleIsActive(
406
- lifecycle: SessionRealtimeLifecycleProjection | null,
407
- ): boolean {
408
- if (lifecycle?.state !== "active") return false;
409
- const leaseExpiresAt = Date.parse(lifecycle.leaseExpiresAt);
410
- return !Number.isFinite(leaseExpiresAt) || leaseExpiresAt > Date.now();
122
+ /** Display name; the catalog's `provider` value stays the wire identifier. */
123
+ function realtimeProviderLabel(provider: RealtimeModelProvider): string {
124
+ return provider === "OpenGeni" ? "Opengeni" : provider;
411
125
  }
412
-
413
126
  export function SessionRealtimeControl(props: {
414
127
  client?: RealtimeControllerClient | undefined;
415
128
  workspaceId?: string | undefined;
@@ -464,6 +177,7 @@ export function SessionRealtimeControl(props: {
464
177
  useEffect(() => {
465
178
  onVoiceActiveChange?.(voiceActive);
466
179
  }, [onVoiceActiveChange, voiceActive]);
180
+ useEffect(() => () => onVoiceActiveChange?.(false), [onVoiceActiveChange]);
467
181
 
468
182
  useEffect(() => {
469
183
  const pending = autostartModelRef.current;
@@ -476,14 +190,13 @@ export function SessionRealtimeControl(props: {
476
190
  }
477
191
  if (!canStart) return;
478
192
  autostartStartedRef.current = true;
479
- void start()
480
- .then(() => {
481
- autostartModelRef.current = null;
482
- onRealtimeAutostartConsumed?.();
483
- })
484
- .catch(() => {
485
- autostartStartedRef.current = false;
486
- });
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);
487
200
  }, [
488
201
  canStart,
489
202
  lifecycleActive,
@@ -519,94 +232,6 @@ export function SessionRealtimeControl(props: {
519
232
  );
520
233
  }
521
234
 
522
- export function useRealtimeModelSelection(options: {
523
- client?: RealtimeControllerClient | undefined;
524
- workspaceId?: string | undefined;
525
- codexConnected: boolean;
526
- activeModel?: SessionRealtimeModel | null | undefined;
527
- }) {
528
- const { client, workspaceId } = useEmbeddedRealtimeSession({
529
- client: options.client,
530
- workspaceId: options.workspaceId,
531
- });
532
- const activeModel = options.activeModel;
533
- const initialCachedCatalog = readCachedRealtimeModelCatalog(client, workspaceId);
534
- const [catalog, setCatalog] = useState<RealtimeModelOption[]>(
535
- () => initialCachedCatalog ?? realtimeModelFallback(options.codexConnected),
536
- );
537
- const catalogScopeRef = useRef({
538
- client,
539
- workspaceId,
540
- source: initialCachedCatalog ? ("cache" as const) : ("fallback" as const),
541
- });
542
- const [selectedModelId, setSelectedModelId] = useState<SessionRealtimeModel>(() => {
543
- const preferred = readRealtimeModelPreference(workspaceId) ?? CODEX_LIVE_MODEL.id;
544
- if (!initialCachedCatalog) return preferred;
545
- if (initialCachedCatalog.some((model) => model.id === preferred && model.available)) {
546
- return preferred;
547
- }
548
- return initialCachedCatalog.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
549
- });
550
-
551
- useEffect(() => {
552
- let disposed = false;
553
- const applyCatalog = (models: RealtimeModelOption[]) => {
554
- catalogScopeRef.current = { client, workspaceId, source: "cache" };
555
- setCatalog(models);
556
- setSelectedModelId((current) => {
557
- if (models.some((model) => model.id === current && model.available)) return current;
558
- return models.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
559
- });
560
- };
561
- const cached = readCachedRealtimeModelCatalog(client, workspaceId);
562
- if (cached) {
563
- const scope = catalogScopeRef.current;
564
- if (
565
- scope.client !== client ||
566
- scope.workspaceId !== workspaceId ||
567
- scope.source !== "cache"
568
- ) {
569
- applyCatalog(cached);
570
- }
571
- return;
572
- }
573
- const loading = loadRealtimeModelCatalog(client, workspaceId);
574
- if (!loading) return;
575
- void loading
576
- .then((models) => {
577
- if (disposed) return;
578
- applyCatalog(models);
579
- })
580
- .catch(() => undefined);
581
- return () => {
582
- disposed = true;
583
- };
584
- }, [client, workspaceId]);
585
-
586
- useEffect(() => {
587
- if (activeModel) setSelectedModelId(activeModel);
588
- }, [activeModel]);
589
-
590
- const selectedModel =
591
- catalog.find((model) => model.id === selectedModelId) ??
592
- ({
593
- ...CODEX_LIVE_MODEL,
594
- available: options.codexConnected,
595
- unavailableReason: options.codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,
596
- } satisfies RealtimeModelOption);
597
- const selectModel = useCallback(
598
- (value: string) => {
599
- const model = catalog.find((candidate) => candidate.id === value);
600
- if (!model || !model.available || activeModel) return;
601
- setSelectedModelId(model.id);
602
- writeRealtimeModelPreference(workspaceId, model.id);
603
- },
604
- [activeModel, catalog, workspaceId],
605
- );
606
-
607
- return { models: catalog, selectedModel, selectModel };
608
- }
609
-
610
235
  const IDLE_REALTIME_SNAPSHOT: SessionRealtimeControllerSnapshot = {
611
236
  status: "idle",
612
237
  realtimeId: null,
@@ -772,6 +397,7 @@ export function RealtimeVoiceControl(props: {
772
397
  props.canStart,
773
398
  props.admissionBlocker ?? null,
774
399
  selectedModel.label,
400
+ selectedModel.unavailableCode ?? null,
775
401
  );
776
402
  const modeOwned = props.snapshot.mode?.state === "active";
777
403
  const retryConnection =
@@ -780,6 +406,11 @@ export function RealtimeVoiceControl(props: {
780
406
  props.snapshot.status !== "active" &&
781
407
  props.snapshot.diagnostic?.recoverable === true;
782
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}`;
783
414
  const mainDisabled =
784
415
  props.snapshot.status === "stopping" ||
785
416
  props.snapshot.status === "lost_owner" ||
@@ -791,7 +422,11 @@ export function RealtimeVoiceControl(props: {
791
422
  ? "Retry voice connection"
792
423
  : modeOwned
793
424
  ? "End voice conversation"
794
- : `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}`;
795
430
  const runMainAction = audioBlocked
796
431
  ? props.onRetryAudibleOutput
797
432
  : retryConnection
@@ -808,6 +443,20 @@ export function RealtimeVoiceControl(props: {
808
443
  selectedModel.provider,
809
444
  );
810
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]);
811
460
 
812
461
  useEffect(() => {
813
462
  if (!pickerOpen) setPickerProvider(selectedModel.provider);
@@ -815,6 +464,7 @@ export function RealtimeVoiceControl(props: {
815
464
 
816
465
  return (
817
466
  <div
467
+ ref={rootRef}
818
468
  role="group"
819
469
  aria-label="Realtime voice"
820
470
  data-picker-side={props.menuSide ?? "top"}
@@ -896,6 +546,20 @@ export function RealtimeVoiceControl(props: {
896
546
  </motion.div>
897
547
  ) : null}
898
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}
899
563
  <div className="inline-flex shrink-0 items-center">
900
564
  <motion.button
901
565
  type="button"
@@ -956,7 +620,7 @@ export function RealtimeVoiceControl(props: {
956
620
  align="end"
957
621
  sideOffset={8}
958
622
  collisionPadding={12}
959
- 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"
960
624
  onCloseAutoFocus={(event) => event.preventDefault()}
961
625
  >
962
626
  <div className="min-h-0 flex-1 overflow-y-auto overscroll-contain">
@@ -979,9 +643,15 @@ export function RealtimeVoiceControl(props: {
979
643
  />
980
644
  </div>
981
645
 
982
- {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
+ ) ? (
983
653
  <>
984
- <DropdownMenuSeparator className="mx-1 bg-og-border" />
654
+ <DropdownMenuSeparator />
985
655
  <div className="px-2.5 py-2" role="status" aria-live="polite">
986
656
  <div className="flex items-center gap-2 text-og-sm font-medium text-og-fg">
987
657
  <RealtimeStatusDot
@@ -997,7 +667,6 @@ export function RealtimeVoiceControl(props: {
997
667
 
998
668
  {audioBlocked ? (
999
669
  <DropdownMenuItem
1000
- className="rounded-og-md"
1001
670
  onSelect={() => void props.onRetryAudibleOutput().catch(() => undefined)}
1002
671
  >
1003
672
  <Volume2Icon />
@@ -1005,10 +674,7 @@ export function RealtimeVoiceControl(props: {
1005
674
  </DropdownMenuItem>
1006
675
  ) : null}
1007
676
  {retryConnection ? (
1008
- <DropdownMenuItem
1009
- className="rounded-og-md"
1010
- onSelect={() => void props.onRetry().catch(() => undefined)}
1011
- >
677
+ <DropdownMenuItem onSelect={() => void props.onRetry().catch(() => undefined)}>
1012
678
  <RotateCcwIcon />
1013
679
  Retry connection
1014
680
  </DropdownMenuItem>
@@ -1016,7 +682,6 @@ export function RealtimeVoiceControl(props: {
1016
682
  {modeOwned && props.snapshot.status !== "lost_owner" ? (
1017
683
  <DropdownMenuItem
1018
684
  variant="destructive"
1019
- className="rounded-og-md"
1020
685
  disabled={props.snapshot.status === "stopping"}
1021
686
  onSelect={() => void props.onStop().catch(() => undefined)}
1022
687
  >
@@ -1056,16 +721,14 @@ export function RealtimeVoiceModelPanel(props: {
1056
721
 
1057
722
  return (
1058
723
  <div className="flex min-h-0 flex-1 flex-col" data-testid="realtime-voice-model-panel">
1059
- <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">
1060
725
  {props.leading}
1061
- <div className="min-w-0">
1062
- <div className="text-og-menu font-medium text-og-fg">Voice model</div>
1063
- <p className="mt-0.5 text-og-control text-og-fg-subtle">
1064
- Used when you start a voice conversation.
1065
- </p>
1066
- </div>
726
+ <div className="min-w-0 flex-1 text-og-menu font-medium text-og-fg">Voice model</div>
1067
727
  </div>
1068
- <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>
1069
732
  <RealtimeModelPickerMenu
1070
733
  models={props.models}
1071
734
  selectedModel={props.selectedModel}
@@ -1153,7 +816,7 @@ export function RealtimeModelPickerMenu(props: {
1153
816
  const body = props.provider ? (
1154
817
  <div data-testid="realtime-model-picker-models">
1155
818
  <PickerBackHeader
1156
- label={props.provider}
819
+ label={realtimeProviderLabel(props.provider)}
1157
820
  icon={
1158
821
  <BillingClassMark
1159
822
  billingClass={REALTIME_PROVIDER_META[props.provider].billingClass}
@@ -1179,7 +842,9 @@ export function RealtimeModelPickerMenu(props: {
1179
842
  title={model.unavailableReason ?? model.description}
1180
843
  active={selected}
1181
844
  showChevron={false}
1182
- trailing={selected ? <CheckIcon className="size-3.5" aria-hidden /> : undefined}
845
+ trailing={
846
+ selected ? <CheckIcon className={MENU_CHECK_CLASS} aria-hidden /> : undefined
847
+ }
1183
848
  testId={`realtime-model-choice-${model.id}`}
1184
849
  onClick={() => props.onSelect(model.id)}
1185
850
  />
@@ -1194,7 +859,7 @@ export function RealtimeModelPickerMenu(props: {
1194
859
  return (
1195
860
  <PickerNavRow
1196
861
  key={provider}
1197
- label={provider}
862
+ label={realtimeProviderLabel(provider)}
1198
863
  hint={meta.hint}
1199
864
  icon={<BillingClassMark billingClass={meta.billingClass} aria-label="" />}
1200
865
  active={props.selectedModel.provider === provider}
@@ -1242,12 +907,12 @@ function RealtimeDiagnosticsMenu({ snapshot }: { snapshot: SessionRealtimeContro
1242
907
 
1243
908
  return (
1244
909
  <>
1245
- <DropdownMenuSeparator className="mx-1 bg-og-border" />
910
+ <DropdownMenuSeparator />
1246
911
  <DropdownMenuSub>
1247
- <DropdownMenuSubTrigger className="rounded-og-md text-og-fg-muted">
912
+ <DropdownMenuSubTrigger className="text-og-fg-muted">
1248
913
  Realtime diagnostics
1249
914
  </DropdownMenuSubTrigger>
1250
- <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">
1251
916
  {rows.map(([label, value]) => (
1252
917
  <DropdownMenuItem
1253
918
  key={label}
@@ -1282,6 +947,7 @@ function statusContent(
1282
947
  canStart: boolean,
1283
948
  admissionBlocker: string | null,
1284
949
  modelLabel: string,
950
+ unavailableCode: string | null = null,
1285
951
  ): { phase: RealtimeVisualPhase; label: string; detail: string } {
1286
952
  if (snapshot.audibleOutput === "blocked" && !snapshot.outputMuted) {
1287
953
  return {
@@ -1328,6 +994,13 @@ function statusContent(
1328
994
  detail: "Return to the browser that started it, or wait for that connection to expire.",
1329
995
  };
1330
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
+ }
1331
1004
  return {
1332
1005
  phase: "error",
1333
1006
  label: "Voice unavailable",
@@ -1337,7 +1010,7 @@ function statusContent(
1337
1010
  if (!modelAvailable) {
1338
1011
  return {
1339
1012
  phase: "unavailable",
1340
- label: "Voice model unavailable",
1013
+ label: realtimeRefusalLabel(unavailableCode) ?? "Voice model unavailable",
1341
1014
  detail: admissionBlocker ?? "Choose another voice model.",
1342
1015
  };
1343
1016
  }
@@ -1479,7 +1152,7 @@ function RealtimeStatusDot(props: { phase: RealtimeVisualPhase; reduceMotion: bo
1479
1152
 
1480
1153
  function voiceButtonTone(phase: RealtimeVisualPhase): string {
1481
1154
  if (phase === "listening" || phase === "speaking") {
1482
- 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";
1483
1156
  }
1484
1157
  if (phase === "blocked" || phase === "error") {
1485
1158
  return "border border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting hover:bg-og-status-waiting/15";
@@ -1493,7 +1166,7 @@ function voiceButtonTone(phase: RealtimeVisualPhase): string {
1493
1166
 
1494
1167
  function voiceChevronTone(phase: RealtimeVisualPhase): string {
1495
1168
  if (phase === "listening" || phase === "speaking") {
1496
- 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";
1497
1170
  }
1498
1171
  if (phase === "blocked" || phase === "error") {
1499
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";
@@ -1504,42 +1177,6 @@ function voiceChevronTone(phase: RealtimeVisualPhase): string {
1504
1177
  return "text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg";
1505
1178
  }
1506
1179
 
1507
- function toRealtimeModelOption(model: WorkspaceRealtimeModelCatalogItem): RealtimeModelOption {
1508
- return { ...model };
1509
- }
1510
-
1511
- function readRealtimeModelPreference(workspaceId: string): SessionRealtimeModel | null {
1512
- if (typeof localStorage === "undefined") return null;
1513
- try {
1514
- const value = localStorage.getItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`);
1515
- return isRealtimeModel(value) ? value : null;
1516
- } catch {
1517
- return null;
1518
- }
1519
- }
1520
-
1521
- function writeRealtimeModelPreference(workspaceId: string, model: SessionRealtimeModel): void {
1522
- if (typeof localStorage === "undefined") return;
1523
- try {
1524
- localStorage.setItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`, model);
1525
- } catch {
1526
- // Voice selection still works when browser storage is unavailable.
1527
- }
1528
- }
1529
-
1530
- function isRealtimeModel(value: string | null): value is SessionRealtimeModel {
1531
- return (
1532
- value === "gpt-live-1-boulder-alpha" ||
1533
- value === "opengeni-gateway/openai/gpt-realtime-2.1" ||
1534
- value === "opengeni-gateway/openai/gpt-realtime-mini" ||
1535
- value === "opengeni-gateway/xai/grok-voice-think-fast-2.0" ||
1536
- value === "supergrok/grok-voice-think-fast-2.0" ||
1537
- value === "workspace-gateway/openai/gpt-realtime-2.1" ||
1538
- value === "workspace-gateway/openai/gpt-realtime-mini" ||
1539
- value === "workspace-gateway/xai/grok-voice-think-fast-2.0"
1540
- );
1541
- }
1542
-
1543
1180
  /** @deprecated Use the provider-neutral realtime names. */
1544
1181
  export const useSessionCodexRealtime = useSessionRealtime;
1545
1182
  /** @deprecated Use the provider-neutral realtime names. */