@opengeni/react 2.5.0-canary.2 → 3.0.1-canary.38817070914001

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 (865) hide show
  1. package/README.md +784 -22
  2. package/dist/accounts.d.ts +64 -0
  3. package/dist/accounts.js +824 -0
  4. package/dist/accounts.js.map +1 -0
  5. package/dist/approvals.d.ts +2 -1
  6. package/dist/artifacts-document.js +5 -3
  7. package/dist/artifacts-presentation.js +5 -3
  8. package/dist/artifacts-spreadsheet.d.ts +1 -1
  9. package/dist/artifacts-spreadsheet.js +5 -3
  10. package/dist/artifacts.d.ts +5 -1
  11. package/dist/artifacts.js +536 -42
  12. package/dist/artifacts.js.map +1 -1
  13. package/dist/browser-viewer-M7BIVFTW.js +19 -0
  14. package/dist/capability-catalog-row.d.ts +20 -0
  15. package/dist/capability-logo-fallback.d.ts +3 -0
  16. package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
  17. package/dist/chunk-2DDJ6YH6.js +41 -0
  18. package/dist/chunk-2DDJ6YH6.js.map +1 -0
  19. package/dist/chunk-2HVLQ26H.js +183 -0
  20. package/dist/chunk-2HVLQ26H.js.map +1 -0
  21. package/dist/chunk-3PVDYTTB.js +24 -0
  22. package/dist/chunk-3PVDYTTB.js.map +1 -0
  23. package/dist/chunk-3UZCWK46.js +298 -0
  24. package/dist/chunk-3UZCWK46.js.map +1 -0
  25. package/dist/chunk-47CKUXTW.js +293 -0
  26. package/dist/chunk-47CKUXTW.js.map +1 -0
  27. package/dist/chunk-4QYP6QUI.js +109 -0
  28. package/dist/chunk-4QYP6QUI.js.map +1 -0
  29. package/dist/chunk-5EY26VZ7.js +1053 -0
  30. package/dist/chunk-5EY26VZ7.js.map +1 -0
  31. package/dist/chunk-5I4VRWBB.js +56 -0
  32. package/dist/chunk-5I4VRWBB.js.map +1 -0
  33. package/dist/chunk-5WOR7UCL.js +191 -0
  34. package/dist/chunk-5WOR7UCL.js.map +1 -0
  35. package/dist/chunk-5XEXTWEM.js +1911 -0
  36. package/dist/chunk-5XEXTWEM.js.map +1 -0
  37. package/dist/chunk-5YJLGOM5.js +51 -0
  38. package/dist/chunk-5YJLGOM5.js.map +1 -0
  39. package/dist/chunk-6JFN3OWG.js +386 -0
  40. package/dist/chunk-6JFN3OWG.js.map +1 -0
  41. package/dist/chunk-6SNDCUPB.js +83 -0
  42. package/dist/chunk-6SNDCUPB.js.map +1 -0
  43. package/dist/chunk-7QJT5O4S.js +35 -0
  44. package/dist/chunk-7QJT5O4S.js.map +1 -0
  45. package/dist/chunk-A55KV72M.js +402 -0
  46. package/dist/chunk-A55KV72M.js.map +1 -0
  47. package/dist/chunk-B27E3V37.js +29 -0
  48. package/dist/chunk-B27E3V37.js.map +1 -0
  49. package/dist/chunk-BOFEQC6K.js +162 -0
  50. package/dist/chunk-BOFEQC6K.js.map +1 -0
  51. package/dist/chunk-CM7LVUKC.js +35 -0
  52. package/dist/chunk-CM7LVUKC.js.map +1 -0
  53. package/dist/chunk-CORUP6JB.js +122 -0
  54. package/dist/chunk-CORUP6JB.js.map +1 -0
  55. package/dist/chunk-CSX5FFKZ.js +35 -0
  56. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  57. package/dist/chunk-EGVHJKGJ.js +3125 -0
  58. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  59. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  60. package/dist/chunk-G76LSA76.js.map +1 -0
  61. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  62. package/dist/chunk-GQMRL52F.js.map +1 -0
  63. package/dist/{chunk-QGBJ6GHG.js → chunk-GUUXOISA.js} +1113 -457
  64. package/dist/chunk-GUUXOISA.js.map +1 -0
  65. package/dist/{chunk-MXJGO7LE.js → chunk-HGKELH6Z.js} +1178 -115
  66. package/dist/chunk-HGKELH6Z.js.map +1 -0
  67. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  68. package/dist/chunk-I7X2P4FU.js.map +1 -0
  69. package/dist/chunk-IGFZFLI2.js +1390 -0
  70. package/dist/chunk-IGFZFLI2.js.map +1 -0
  71. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  72. package/dist/chunk-IMSUVYQB.js.map +1 -0
  73. package/dist/chunk-IOYHDEP3.js +38 -0
  74. package/dist/chunk-IOYHDEP3.js.map +1 -0
  75. package/dist/{chunk-X4JAFD5R.js → chunk-ISN726VG.js} +1513 -697
  76. package/dist/chunk-ISN726VG.js.map +1 -0
  77. package/dist/chunk-IZV5FTJC.js +55 -0
  78. package/dist/chunk-IZV5FTJC.js.map +1 -0
  79. package/dist/chunk-KF33GTWN.js +343 -0
  80. package/dist/chunk-KF33GTWN.js.map +1 -0
  81. package/dist/chunk-KSGQ5ODA.js +457 -0
  82. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  83. package/dist/chunk-KZENYIA2.js +382 -0
  84. package/dist/chunk-KZENYIA2.js.map +1 -0
  85. package/dist/chunk-LJUMYUBO.js +218 -0
  86. package/dist/chunk-LJUMYUBO.js.map +1 -0
  87. package/dist/chunk-LSW2OJVV.js +380 -0
  88. package/dist/chunk-LSW2OJVV.js.map +1 -0
  89. package/dist/chunk-M357MHH3.js +2 -0
  90. package/dist/chunk-M357MHH3.js.map +1 -0
  91. package/dist/chunk-N7S72EXK.js +25 -0
  92. package/dist/chunk-N7S72EXK.js.map +1 -0
  93. package/dist/chunk-NX4ADH73.js +14 -0
  94. package/dist/chunk-NX4ADH73.js.map +1 -0
  95. package/dist/chunk-O5GPRG76.js +3006 -0
  96. package/dist/chunk-O5GPRG76.js.map +1 -0
  97. package/dist/chunk-O7F6UJO4.js +71 -0
  98. package/dist/chunk-O7F6UJO4.js.map +1 -0
  99. package/dist/chunk-OYQQJL3J.js +16 -0
  100. package/dist/chunk-OYQQJL3J.js.map +1 -0
  101. package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
  102. package/dist/chunk-P4BNUO57.js.map +1 -0
  103. package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
  104. package/dist/chunk-PEHTX3V7.js.map +1 -0
  105. package/dist/chunk-PMV53IMM.js +26 -0
  106. package/dist/chunk-PMV53IMM.js.map +1 -0
  107. package/dist/{chunk-ZUT5QSQB.js → chunk-PWCBMEV2.js} +4262 -3917
  108. package/dist/chunk-PWCBMEV2.js.map +1 -0
  109. package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
  110. package/dist/chunk-PYEOPA4M.js.map +1 -0
  111. package/dist/{chunk-T7VAYG2I.js → chunk-Q26UAIXI.js} +257 -45
  112. package/dist/chunk-Q26UAIXI.js.map +1 -0
  113. package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
  114. package/dist/chunk-QHUE7E4N.js.map +1 -0
  115. package/dist/chunk-QV3DJVRZ.js +11 -0
  116. package/dist/chunk-QV3DJVRZ.js.map +1 -0
  117. package/dist/chunk-R5SBNG7S.js +810 -0
  118. package/dist/chunk-R5SBNG7S.js.map +1 -0
  119. package/dist/chunk-RI42H5IU.js +326 -0
  120. package/dist/chunk-RI42H5IU.js.map +1 -0
  121. package/dist/chunk-S2QH6EZ5.js +211 -0
  122. package/dist/chunk-S2QH6EZ5.js.map +1 -0
  123. package/dist/chunk-S5ZT4TBR.js +2028 -0
  124. package/dist/chunk-S5ZT4TBR.js.map +1 -0
  125. package/dist/chunk-SHLZMAJN.js +304 -0
  126. package/dist/chunk-SHLZMAJN.js.map +1 -0
  127. package/dist/chunk-TGXK4BAZ.js +293 -0
  128. package/dist/chunk-TGXK4BAZ.js.map +1 -0
  129. package/dist/{chunk-XXWH2JLC.js → chunk-TIHSXNBC.js} +616 -621
  130. package/dist/chunk-TIHSXNBC.js.map +1 -0
  131. package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
  132. package/dist/chunk-TNEZNMSN.js.map +1 -0
  133. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  134. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  135. package/dist/chunk-UNJPZGNK.js +63 -0
  136. package/dist/chunk-UNJPZGNK.js.map +1 -0
  137. package/dist/chunk-VIUEOHXY.js +394 -0
  138. package/dist/chunk-VIUEOHXY.js.map +1 -0
  139. package/dist/chunk-VWH3YAV7.js +14058 -0
  140. package/dist/chunk-VWH3YAV7.js.map +1 -0
  141. package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
  142. package/dist/chunk-WNN7NO2N.js.map +1 -0
  143. package/dist/chunk-XDA5QJE7.js +402 -0
  144. package/dist/chunk-XDA5QJE7.js.map +1 -0
  145. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  146. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  147. package/dist/chunk-XHF7OYAN.js +1150 -0
  148. package/dist/chunk-XHF7OYAN.js.map +1 -0
  149. package/dist/chunk-YSRBFJMQ.js +43 -0
  150. package/dist/chunk-YSRBFJMQ.js.map +1 -0
  151. package/dist/chunk-ZOZAPAUO.js +174 -0
  152. package/dist/chunk-ZOZAPAUO.js.map +1 -0
  153. package/dist/chunk-ZQV5W7YC.js +809 -0
  154. package/dist/chunk-ZQV5W7YC.js.map +1 -0
  155. package/dist/chunk-ZUWF4NF7.js +13 -0
  156. package/dist/chunk-ZUWF4NF7.js.map +1 -0
  157. package/dist/client.d.ts +16 -7
  158. package/dist/clipboard.js +3 -1
  159. package/dist/commands/types.d.ts +2 -0
  160. package/dist/components/anthropic-mark.d.ts +3 -0
  161. package/dist/components/approval-surface.d.ts +19 -6
  162. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  163. package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
  164. package/dist/components/artifacts/artifact-surface.d.ts +4 -2
  165. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  166. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  167. package/dist/components/artifacts/document-editor.d.ts +4 -2
  168. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  169. package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
  170. package/dist/components/artifacts/editable-document.d.ts +1 -1
  171. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  172. package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
  173. package/dist/components/artifacts/index.d.ts +9 -2
  174. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  175. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  176. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  177. package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
  178. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  179. package/dist/components/artifacts/site-view.d.ts +26 -0
  180. package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
  181. package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
  182. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  183. package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
  184. package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
  185. package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
  186. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  187. package/dist/components/browser-select-control.d.ts +16 -0
  188. package/dist/components/browser-viewer.d.ts +11 -2
  189. package/dist/components/chat-composer.d.ts +21 -3
  190. package/dist/components/child-session-link.d.ts +9 -0
  191. package/dist/components/claude-mark.d.ts +3 -0
  192. package/dist/components/code-editor.d.ts +1 -4
  193. package/dist/components/composer-transcription-control.d.ts +7 -0
  194. package/dist/components/composer.d.ts +38 -63
  195. package/dist/components/computer-viewer.d.ts +1 -1
  196. package/dist/components/copy-button.d.ts +3 -1
  197. package/dist/components/desktop-viewer.d.ts +1 -1
  198. package/dist/components/file-browser.d.ts +4 -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 +6 -1
  225. package/dist/components/sandbox-workspace.d.ts +23 -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-session-client.d.ts +23 -0
  297. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  298. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  299. package/dist/file-node-visibility.d.ts +15 -0
  300. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  301. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  302. package/dist/hooks/latest-question.d.ts +25 -0
  303. package/dist/hooks/shared-machines-list.d.ts +4 -0
  304. package/dist/hooks/shared-query.d.ts +113 -0
  305. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  306. package/dist/hooks/use-auth-runs.d.ts +1 -4
  307. package/dist/hooks/use-available-models.d.ts +1 -1
  308. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  309. package/dist/hooks/use-browser-session.d.ts +12 -1
  310. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  311. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  312. package/dist/hooks/use-composer.d.ts +24 -2
  313. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  314. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  315. package/dist/hooks/use-computer-session.d.ts +4 -0
  316. package/dist/hooks/use-connect.d.ts +23 -0
  317. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  318. package/dist/hooks/use-file-attachments.d.ts +21 -2
  319. package/dist/hooks/use-goal.d.ts +2 -1
  320. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  321. package/dist/hooks/use-new-conversation.d.ts +56 -0
  322. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  323. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  324. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  325. package/dist/hooks/use-session-conversation.d.ts +49 -0
  326. package/dist/hooks/use-session-events.d.ts +28 -7
  327. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  328. package/dist/hooks/use-session-model-account.d.ts +48 -0
  329. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  330. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  331. package/dist/hooks/use-usage.d.ts +40 -0
  332. package/dist/hooks/use-vaults.d.ts +53 -0
  333. package/dist/hooks/use-voice-input.d.ts +8 -1
  334. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  335. package/dist/hooks/use-workspace-sessions.d.ts +22 -5
  336. package/dist/human-input-model.d.ts +122 -0
  337. package/dist/human-input.d.ts +3 -1
  338. package/dist/identity-link-accounts.d.ts +11 -0
  339. package/dist/identity-link-consent.d.ts +18 -0
  340. package/dist/index.d.ts +85 -20
  341. package/dist/index.js +2371 -6544
  342. package/dist/index.js.map +1 -1
  343. package/dist/interaction.d.ts +1 -1
  344. package/dist/interaction.js +14 -24
  345. package/dist/interaction.js.map +1 -1
  346. package/dist/latest-question-CHE7E753.js +118 -0
  347. package/dist/latest-question-CHE7E753.js.map +1 -0
  348. package/dist/lib/clipboard.d.ts +7 -0
  349. package/dist/lib/error-message.d.ts +7 -0
  350. package/dist/lib/format.d.ts +58 -4
  351. package/dist/lib/host-theme.d.ts +77 -0
  352. package/dist/lib/interaction-errors.d.ts +3 -0
  353. package/dist/lib/menu-styles.d.ts +22 -0
  354. package/dist/lib/notify-observer.d.ts +2 -0
  355. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  356. package/dist/lib/provider-recovery.d.ts +55 -0
  357. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  358. package/dist/lib/transient-retry.d.ts +25 -0
  359. package/dist/lib/workbench-peers.d.ts +36 -0
  360. package/dist/lib/xterm-theme.d.ts +7 -5
  361. package/dist/machines.js +9 -5
  362. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  363. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  364. package/dist/mcp-connection-status.d.ts +14 -0
  365. package/dist/model-mark-paths.d.ts +34 -0
  366. package/dist/model-mark-paths.js +16 -0
  367. package/dist/model-mark-paths.js.map +1 -0
  368. package/dist/model-picker-model.d.ts +111 -0
  369. package/dist/model-picker-model.js +25 -0
  370. package/dist/model-picker-model.js.map +1 -0
  371. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  372. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  373. package/dist/model-policy.d.ts +30 -3
  374. package/dist/model-policy.js +14 -1
  375. package/dist/native-previews.d.ts +28 -0
  376. package/dist/native-previews.js +82 -0
  377. package/dist/native-previews.js.map +1 -0
  378. package/dist/new-session-draft.d.ts +7 -0
  379. package/dist/new-session-draft.js +639 -0
  380. package/dist/new-session-draft.js.map +1 -0
  381. package/dist/notification-text.d.ts +27 -0
  382. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  383. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  384. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  385. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  386. package/dist/older-history.d.ts +3 -2
  387. package/dist/organization-model.d.ts +32 -0
  388. package/dist/organization-model.js +65 -0
  389. package/dist/organization-model.js.map +1 -0
  390. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  391. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  392. package/dist/plugin-details.d.ts +14 -0
  393. package/dist/plugin-discovery.d.ts +25 -0
  394. package/dist/preview-loading-paint.d.ts +20 -0
  395. package/dist/provider.d.ts +25 -2
  396. package/dist/queue-presentation-model.d.ts +72 -0
  397. package/dist/queue-presentation-model.js +38 -0
  398. package/dist/queue-presentation-model.js.map +1 -0
  399. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  400. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  401. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  402. package/dist/realtime/embedded-voice.d.ts +1 -0
  403. package/dist/realtime/realtime-control.d.ts +4 -65
  404. package/dist/realtime/session-realtime.d.ts +78 -0
  405. package/dist/realtime.js +25 -1294
  406. package/dist/realtime.js.map +1 -1
  407. package/dist/sandbox-files-O27IPOZW.js +21 -0
  408. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  409. package/dist/sandbox-label-model.d.ts +30 -0
  410. package/dist/sandbox-label-model.js +20 -0
  411. package/dist/sandbox-label-model.js.map +1 -0
  412. package/dist/secret-reference-label.d.ts +14 -0
  413. package/dist/secrets-ui.d.ts +57 -0
  414. package/dist/session-agents-model.d.ts +10 -0
  415. package/dist/session-agents-model.js +25 -0
  416. package/dist/session-agents-model.js.map +1 -0
  417. package/dist/session-attention-model.d.ts +8 -0
  418. package/dist/session-attention-model.js +47 -0
  419. package/dist/session-attention-model.js.map +1 -0
  420. package/dist/session-auth-recommendation.d.ts +5 -0
  421. package/dist/session-capability-policy.d.ts +31 -0
  422. package/dist/session-feedback-model.d.ts +20 -0
  423. package/dist/session-feedback-model.js +56 -0
  424. package/dist/session-feedback-model.js.map +1 -0
  425. package/dist/session-list-model.d.ts +138 -0
  426. package/dist/session-list-model.js +274 -0
  427. package/dist/session-list-model.js.map +1 -0
  428. package/dist/session-realtime-7DJOIHQW.js +21 -0
  429. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  430. package/dist/session-realtime.d.ts +7 -0
  431. package/dist/session-realtime.js +19 -0
  432. package/dist/session-realtime.js.map +1 -0
  433. package/dist/session-status-model.d.ts +36 -0
  434. package/dist/session-ui.d.ts +39 -1
  435. package/dist/session-ui.js +125 -12
  436. package/dist/session-ui.js.map +1 -1
  437. package/dist/session.d.ts +10 -2
  438. package/dist/session.js +37 -20
  439. package/dist/site-snapshot.d.ts +14 -0
  440. package/dist/sites-ui.d.ts +24 -0
  441. package/dist/sites.d.ts +3 -0
  442. package/dist/sites.js +14 -0
  443. package/dist/sites.js.map +1 -0
  444. package/dist/skill-discovery.d.ts +47 -0
  445. package/dist/terminal.d.ts +8 -0
  446. package/dist/terminal.js +32 -0
  447. package/dist/terminal.js.map +1 -0
  448. package/dist/testing/session-scenarios.d.ts +10 -0
  449. package/dist/testing/session-scenarios.js +367 -0
  450. package/dist/testing/session-scenarios.js.map +1 -0
  451. package/dist/timeline/activity-rail.d.ts +11 -2
  452. package/dist/timeline/agent-identity.d.ts +30 -0
  453. package/dist/timeline/agent-row.d.ts +31 -0
  454. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  455. package/dist/timeline/compaction-copy.d.ts +46 -0
  456. package/dist/timeline/entrance.d.ts +13 -1
  457. package/dist/timeline/focus-sequence.d.ts +9 -0
  458. package/dist/timeline/genie-copy.d.ts +3 -0
  459. package/dist/timeline/genie-loading.d.ts +47 -0
  460. package/dist/timeline/index.d.ts +10 -4
  461. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  462. package/dist/timeline/message-sender.d.ts +19 -0
  463. package/dist/timeline/notice-presentation.d.ts +13 -0
  464. package/dist/timeline/parsers.d.ts +11 -0
  465. package/dist/timeline/patch-apply-command.d.ts +18 -0
  466. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  467. package/dist/timeline/platform-activity-row.d.ts +1 -2
  468. package/dist/timeline/presented-image.d.ts +11 -0
  469. package/dist/timeline/projection.d.ts +31 -2
  470. package/dist/timeline/provider-logo.d.ts +15 -0
  471. package/dist/timeline/question-nav-model.d.ts +23 -0
  472. package/dist/timeline/registry.d.ts +12 -1
  473. package/dist/timeline/retained-image.d.ts +18 -0
  474. package/dist/timeline/retained-loaders.d.ts +27 -0
  475. package/dist/timeline/rolling-activity.d.ts +11 -0
  476. package/dist/timeline/screenshot-lightbox.d.ts +39 -2
  477. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  478. package/dist/timeline/shared.d.ts +4 -1
  479. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  480. package/dist/timeline/startup-preference.d.ts +3 -0
  481. package/dist/timeline/startup-timings.d.ts +4 -0
  482. package/dist/timeline/tool-display-name.d.ts +5 -2
  483. package/dist/timeline/tool-presentation.d.ts +172 -0
  484. package/dist/timeline/turn-summary-model.d.ts +95 -0
  485. package/dist/timeline/turn-summary.d.ts +20 -54
  486. package/dist/timeline/types.d.ts +179 -7
  487. package/dist/timeline/work-presentation.d.ts +60 -0
  488. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  489. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  490. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  491. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  492. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  493. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  494. package/dist/timeline-model.d.ts +29 -0
  495. package/dist/timeline-model.js +254 -0
  496. package/dist/timeline-model.js.map +1 -0
  497. package/dist/usage/allowance-copy.d.ts +25 -0
  498. package/dist/usage/session-usage-limit.d.ts +88 -0
  499. package/dist/usage/summary.d.ts +35 -0
  500. package/dist/usage.d.ts +17 -0
  501. package/dist/usage.js +1187 -0
  502. package/dist/usage.js.map +1 -0
  503. package/dist/voice-recording-owner.d.ts +7 -0
  504. package/package.json +105 -5
  505. package/src/accounts.tsx +1072 -0
  506. package/src/approvals.ts +8 -1
  507. package/src/artifacts-spreadsheet.ts +1 -0
  508. package/src/artifacts.ts +44 -0
  509. package/src/assets/README.md +8 -0
  510. package/src/assets/gmail.ico +0 -0
  511. package/src/assets/outlook.ico +0 -0
  512. package/src/capability-catalog-row.tsx +94 -0
  513. package/src/capability-logo-fallback.ts +22 -0
  514. package/src/client.ts +20 -31
  515. package/src/commands/registry.ts +18 -15
  516. package/src/commands/types.ts +2 -0
  517. package/src/components/anthropic-mark.tsx +10 -0
  518. package/src/components/approval-surface.tsx +401 -138
  519. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  520. package/src/components/artifacts/artifact-sandbox.tsx +189 -0
  521. package/src/components/artifacts/artifact-surface.tsx +40 -20
  522. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  523. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  524. package/src/components/artifacts/document-editor.tsx +141 -16
  525. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  526. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  527. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  528. package/src/components/artifacts/editable-document.tsx +37 -36
  529. package/src/components/artifacts/editable-presentation.tsx +36 -18
  530. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  531. package/src/components/artifacts/index.ts +45 -0
  532. package/src/components/artifacts/inline-html-document.ts +24 -0
  533. package/src/components/artifacts/latest-task-runner.ts +49 -0
  534. package/src/components/artifacts/presentation-editor.tsx +323 -67
  535. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  536. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  537. package/src/components/artifacts/site-view.tsx +121 -0
  538. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  539. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  540. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  541. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  542. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  543. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  544. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  545. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  546. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  547. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  548. package/src/components/browser-select-control.tsx +312 -0
  549. package/src/components/browser-viewer.tsx +778 -318
  550. package/src/components/chat-composer.tsx +131 -85
  551. package/src/components/child-session-link.tsx +36 -0
  552. package/src/components/claude-mark.tsx +11 -0
  553. package/src/components/code-editor.tsx +13 -16
  554. package/src/components/composer-transcription-control.tsx +128 -30
  555. package/src/components/composer.tsx +426 -175
  556. package/src/components/computer-viewer.tsx +880 -253
  557. package/src/components/copy-button.tsx +13 -5
  558. package/src/components/desktop-viewer.tsx +1 -1
  559. package/src/components/enrollment-consent.tsx +1 -1
  560. package/src/components/enrollment-device-flow.tsx +1 -1
  561. package/src/components/file-browser.tsx +43 -34
  562. package/src/components/fleet-tile.tsx +9 -18
  563. package/src/components/generated-video-player.tsx +4 -2
  564. package/src/components/grok-mark.tsx +34 -0
  565. package/src/components/human-input-form.tsx +590 -283
  566. package/src/components/human-input-surface.tsx +21 -6
  567. package/src/components/interaction-intervention-banner.tsx +2 -2
  568. package/src/components/linkified-text.tsx +79 -0
  569. package/src/components/machine-card.tsx +35 -78
  570. package/src/components/machine-dock-bar.tsx +1 -1
  571. package/src/components/machine-input-display.ts +197 -3
  572. package/src/components/machines/agent-status-icon.tsx +31 -0
  573. package/src/components/machines/machine-detail.tsx +200 -31
  574. package/src/components/machines/machine-operation-policy.tsx +1 -1
  575. package/src/components/machines/machine-status.ts +241 -0
  576. package/src/components/machines-dashboard.tsx +2 -17
  577. package/src/components/markdown-table-layout.ts +143 -0
  578. package/src/components/markdown.tsx +466 -129
  579. package/src/components/message-timeline.tsx +2601 -734
  580. package/src/components/model-mark.tsx +102 -0
  581. package/src/components/model-picker.tsx +15 -4
  582. package/src/components/model-policy-picker-menu.tsx +371 -0
  583. package/src/components/model-policy-picker.tsx +256 -412
  584. package/src/components/new-conversation.tsx +221 -0
  585. package/src/components/open-geni-chat.tsx +309 -0
  586. package/src/components/open-geni-links.tsx +179 -0
  587. package/src/components/openrouter-mark.tsx +13 -0
  588. package/src/components/opper-mark.tsx +18 -0
  589. package/src/components/pierre-diff.tsx +41 -16
  590. package/src/components/pierre-file.tsx +35 -10
  591. package/src/components/preview-loading.tsx +109 -0
  592. package/src/components/provider-recovery-notice.tsx +49 -0
  593. package/src/components/queue-item-content.ts +14 -0
  594. package/src/components/queue-surface-implementation.tsx +51 -356
  595. package/src/components/queue-surface-state.tsx +3 -1
  596. package/src/components/rehype-secret-refs.ts +98 -0
  597. package/src/components/remark-soft-line-breaks.ts +166 -0
  598. package/src/components/sandbox-files.tsx +133 -17
  599. package/src/components/sandbox-terminal.tsx +84 -13
  600. package/src/components/sandbox-workspace.tsx +157 -51
  601. package/src/components/secret-question-field.tsx +324 -0
  602. package/src/components/secret-ref-chip.tsx +185 -0
  603. package/src/components/session-capability-frame.tsx +197 -0
  604. package/src/components/session-chrome.tsx +842 -251
  605. package/src/components/session-commands-panel.tsx +126 -0
  606. package/src/components/session-commands.tsx +18 -0
  607. package/src/components/session-connection-request.tsx +97 -0
  608. package/src/components/session-conversation.tsx +876 -0
  609. package/src/components/session-list.tsx +257 -0
  610. package/src/components/session-mcp-capability-card.tsx +680 -0
  611. package/src/components/session-proxy-scope.tsx +153 -0
  612. package/src/components/session-status.tsx +26 -17
  613. package/src/components/session-usage-limit-notice.tsx +174 -0
  614. package/src/components/timeline-anchor.tsx +119 -0
  615. package/src/components/timeline-annotation-chrome.tsx +196 -0
  616. package/src/components/timeline-annotation-layout.ts +268 -0
  617. package/src/components/timeline-annotation-markers.tsx +185 -0
  618. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  619. package/src/components/timeline-annotation-selection.tsx +106 -54
  620. package/src/components/timeline-annotation-shared.ts +245 -0
  621. package/src/components/timeline-annotations-dialog.tsx +185 -128
  622. package/src/components/timeline-annotations.tsx +189 -45
  623. package/src/components/timeline-reading-progress.ts +80 -0
  624. package/src/components/timeline-search.tsx +168 -0
  625. package/src/components/timeline-settlement.ts +60 -0
  626. package/src/components/tip-follow.ts +52 -0
  627. package/src/components/tool-action-review.tsx +650 -0
  628. package/src/components/tool-review-history.tsx +88 -0
  629. package/src/components/tooltip.tsx +38 -5
  630. package/src/components/usage-limit-notice.tsx +179 -0
  631. package/src/components/usage-member-list.tsx +792 -0
  632. package/src/components/usage-meter.tsx +382 -0
  633. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  634. package/src/components/user-message-body.tsx +27 -2
  635. package/src/components/workspace-dock.tsx +18 -1
  636. package/src/composer-messages.ts +150 -0
  637. package/src/composer-voice-events.ts +12 -0
  638. package/src/composer.ts +6 -1
  639. package/src/connect-account-identity.tsx +34 -0
  640. package/src/connect-accounts.tsx +233 -0
  641. package/src/connect-chooser.tsx +336 -0
  642. package/src/connect-panel.tsx +99 -0
  643. package/src/connect-setup.tsx +355 -0
  644. package/src/connect.ts +60 -0
  645. package/src/connection-assets.d.ts +4 -0
  646. package/src/connection-catalog.tsx +162 -0
  647. package/src/connection-discovery.tsx +238 -0
  648. package/src/connection-installed.tsx +51 -0
  649. package/src/connection-logo.tsx +37 -0
  650. package/src/connection-service-logo.tsx +55 -0
  651. package/src/connection-service-presentation.ts +46 -0
  652. package/src/connection-skeleton.tsx +16 -0
  653. package/src/connection-type-picker.tsx +36 -0
  654. package/src/conversation-timeline.ts +92 -0
  655. package/src/desktop.ts +24 -0
  656. package/src/device-authorization.tsx +98 -0
  657. package/src/diffs.ts +16 -0
  658. package/src/discovery-cache.ts +42 -0
  659. package/src/editor.ts +13 -0
  660. package/src/embedded-session-client.ts +104 -0
  661. package/src/file-node-visibility.ts +66 -0
  662. package/src/hooks/internal.ts +3 -2
  663. package/src/hooks/latest-question.ts +164 -0
  664. package/src/hooks/shared-machines-list.ts +34 -1
  665. package/src/hooks/shared-query.ts +721 -0
  666. package/src/hooks/use-attached-browsers.ts +1 -1
  667. package/src/hooks/use-auth-runs.ts +0 -27
  668. package/src/hooks/use-available-models.ts +21 -15
  669. package/src/hooks/use-browser-frame-stream.ts +19 -2
  670. package/src/hooks/use-browser-session.ts +680 -205
  671. package/src/hooks/use-browser-sessions.ts +32 -1
  672. package/src/hooks/use-client-config-flags.ts +118 -0
  673. package/src/hooks/use-codex-accounts.ts +247 -47
  674. package/src/hooks/use-composer.ts +340 -49
  675. package/src/hooks/use-computer-frame-stream.ts +25 -7
  676. package/src/hooks/use-computer-input-posture.ts +94 -0
  677. package/src/hooks/use-computer-session.ts +409 -95
  678. package/src/hooks/use-connect.ts +23 -0
  679. package/src/hooks/use-desktop-stream.ts +19 -28
  680. package/src/hooks/use-file-attachments.ts +118 -10
  681. package/src/hooks/use-goal.ts +107 -13
  682. package/src/hooks/use-human-input.ts +31 -4
  683. package/src/hooks/use-last-started-turn-policy.ts +46 -14
  684. package/src/hooks/use-machines.ts +4 -0
  685. package/src/hooks/use-new-conversation.ts +374 -0
  686. package/src/hooks/use-new-session-draft.ts +813 -0
  687. package/src/hooks/use-realtime-voice-models.ts +46 -0
  688. package/src/hooks/use-sandbox-files.ts +68 -20
  689. package/src/hooks/use-session-background-commands.ts +22 -11
  690. package/src/hooks/use-session-capabilities.ts +3 -2
  691. package/src/hooks/use-session-conversation.ts +150 -0
  692. package/src/hooks/use-session-events.ts +703 -382
  693. package/src/hooks/use-session-lineage.ts +20 -16
  694. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  695. package/src/hooks/use-session-model-account.ts +174 -0
  696. package/src/hooks/use-session.ts +53 -21
  697. package/src/hooks/use-slash-commands.ts +6 -11
  698. package/src/hooks/use-supergrok-accounts.ts +22 -8
  699. package/src/hooks/use-terminal-stream.ts +153 -27
  700. package/src/hooks/use-transcription.ts +6 -0
  701. package/src/hooks/use-turn-queue.ts +2 -1
  702. package/src/hooks/use-usage.ts +100 -0
  703. package/src/hooks/use-vaults.ts +153 -0
  704. package/src/hooks/use-video-artifact-playback.ts +1 -1
  705. package/src/hooks/use-voice-input.ts +127 -19
  706. package/src/hooks/use-workspace-capture.ts +3 -2
  707. package/src/hooks/use-workspace-edit.ts +23 -5
  708. package/src/hooks/use-workspace-sessions.ts +97 -32
  709. package/src/human-input-model.ts +359 -0
  710. package/src/human-input.ts +12 -1
  711. package/src/identity-link-accounts.tsx +148 -0
  712. package/src/identity-link-consent.tsx +192 -0
  713. package/src/index.ts +273 -16
  714. package/src/interaction.ts +1 -0
  715. package/src/lib/clipboard.ts +29 -0
  716. package/src/lib/error-message.ts +37 -0
  717. package/src/lib/format.ts +213 -16
  718. package/src/lib/host-theme.ts +524 -0
  719. package/src/lib/interaction-errors.ts +15 -0
  720. package/src/lib/menu-styles.ts +44 -0
  721. package/src/lib/notify-observer.ts +15 -0
  722. package/src/lib/pierre-diffs-loader.ts +53 -0
  723. package/src/lib/provider-recovery.ts +240 -0
  724. package/src/lib/terminal-input-readiness.ts +51 -0
  725. package/src/lib/transient-retry.ts +99 -0
  726. package/src/lib/workbench-peers.ts +62 -0
  727. package/src/lib/xterm-theme.ts +23 -21
  728. package/src/mcp-connection-status.ts +35 -0
  729. package/src/model-mark-paths.ts +53 -0
  730. package/src/model-picker-model.ts +330 -0
  731. package/src/model-policy.ts +299 -74
  732. package/src/native-previews.ts +100 -0
  733. package/src/new-session-draft.ts +22 -0
  734. package/src/notification-text.ts +81 -0
  735. package/src/older-history.ts +22 -4
  736. package/src/organization-model.ts +118 -0
  737. package/src/plugin-details.tsx +185 -0
  738. package/src/plugin-discovery.tsx +196 -0
  739. package/src/preview-loading-paint.ts +68 -0
  740. package/src/provider.tsx +74 -15
  741. package/src/queue-presentation-model.ts +464 -0
  742. package/src/realtime/dropdown-menu.tsx +19 -12
  743. package/src/realtime/embedded-new-voice.tsx +1 -0
  744. package/src/realtime/embedded-voice.tsx +3 -0
  745. package/src/realtime/realtime-control.tsx +138 -501
  746. package/src/realtime/session-realtime.ts +566 -0
  747. package/src/sandbox-label-model.ts +53 -0
  748. package/src/secret-reference-label.ts +43 -0
  749. package/src/secrets-ui.tsx +59 -0
  750. package/src/session-agents-model.ts +33 -0
  751. package/src/session-attention-model.ts +62 -0
  752. package/src/session-auth-recommendation.ts +48 -0
  753. package/src/session-capability-policy.ts +196 -0
  754. package/src/session-context.ts +3 -4
  755. package/src/session-feedback-model.ts +95 -0
  756. package/src/session-list-model.ts +434 -0
  757. package/src/session-realtime.ts +18 -0
  758. package/src/session-status-model.ts +99 -0
  759. package/src/session-ui.ts +98 -1
  760. package/src/session.ts +22 -1
  761. package/src/site-snapshot.ts +74 -0
  762. package/src/sites-ui.tsx +348 -0
  763. package/src/sites.ts +3 -0
  764. package/src/skill-discovery.tsx +208 -0
  765. package/src/terminal.ts +26 -0
  766. package/src/testing/session-scenarios.ts +404 -0
  767. package/src/timeline/activity-rail.tsx +242 -101
  768. package/src/timeline/agent-identity.tsx +84 -0
  769. package/src/timeline/agent-row.tsx +231 -0
  770. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  771. package/src/timeline/compaction-copy.ts +115 -0
  772. package/src/timeline/entrance.tsx +28 -3
  773. package/src/timeline/fleet-decision-projection.ts +2 -1
  774. package/src/timeline/fleet-decision-row.tsx +1 -0
  775. package/src/timeline/focus-sequence.ts +44 -0
  776. package/src/timeline/genie-copy.ts +19 -0
  777. package/src/timeline/genie-loading.tsx +143 -0
  778. package/src/timeline/index.ts +30 -1
  779. package/src/timeline/knowledge-receipt.tsx +100 -0
  780. package/src/timeline/message-sender.tsx +71 -0
  781. package/src/timeline/notice-presentation.ts +48 -0
  782. package/src/timeline/parsers.ts +42 -2
  783. package/src/timeline/patch-apply-command.tsx +135 -0
  784. package/src/timeline/platform-activity-presentation.ts +166 -0
  785. package/src/timeline/platform-activity-row.tsx +15 -90
  786. package/src/timeline/presented-image.ts +63 -0
  787. package/src/timeline/projection.ts +1743 -76
  788. package/src/timeline/provider-logo.tsx +53 -0
  789. package/src/timeline/question-nav-model.ts +28 -0
  790. package/src/timeline/registry.ts +26 -4
  791. package/src/timeline/retained-image.ts +97 -0
  792. package/src/timeline/retained-loaders.ts +91 -0
  793. package/src/timeline/rolling-activity.tsx +80 -0
  794. package/src/timeline/screenshot-lightbox.tsx +319 -32
  795. package/src/timeline/session-usage-limit-row.tsx +42 -0
  796. package/src/timeline/shared.tsx +42 -15
  797. package/src/timeline/startup-dispatch-details.tsx +36 -0
  798. package/src/timeline/startup-preference.ts +33 -0
  799. package/src/timeline/startup-timings.tsx +145 -0
  800. package/src/timeline/tool-display-name.ts +19 -7
  801. package/src/timeline/tool-presentation.ts +1316 -0
  802. package/src/timeline/tool-renderers.tsx +835 -1138
  803. package/src/timeline/turn-summary-model.ts +343 -0
  804. package/src/timeline/turn-summary.tsx +272 -365
  805. package/src/timeline/types.ts +189 -6
  806. package/src/timeline/work-presentation.ts +189 -0
  807. package/src/timeline-model.ts +143 -0
  808. package/src/usage/allowance-copy.ts +64 -0
  809. package/src/usage/session-usage-limit.ts +266 -0
  810. package/src/usage/summary.ts +93 -0
  811. package/src/usage.ts +70 -0
  812. package/src/voice-recording-owner.ts +22 -0
  813. package/styles/compiled.css +2303 -745
  814. package/styles/connect.css +290 -0
  815. package/styles/connect.d.ts +1 -0
  816. package/styles/effective-tokens.css +1 -0
  817. package/styles/index.css +278 -9
  818. package/styles/responsive.css +99 -7
  819. package/styles/session-capability.css +44 -0
  820. package/styles/tokens.css +136 -66
  821. package/dist/browser-viewer-GXUICIAG.js +0 -14
  822. package/dist/chunk-4MDLEHXL.js.map +0 -1
  823. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  824. package/dist/chunk-6H6S5V4Z.js +0 -9571
  825. package/dist/chunk-6H6S5V4Z.js.map +0 -1
  826. package/dist/chunk-ATQJEWCA.js +0 -2263
  827. package/dist/chunk-ATQJEWCA.js.map +0 -1
  828. package/dist/chunk-FK6VG4LL.js +0 -90
  829. package/dist/chunk-FK6VG4LL.js.map +0 -1
  830. package/dist/chunk-H5YGYNXS.js.map +0 -1
  831. package/dist/chunk-HUIKIDM5.js.map +0 -1
  832. package/dist/chunk-ICA6R6TW.js.map +0 -1
  833. package/dist/chunk-JVYQRRC4.js.map +0 -1
  834. package/dist/chunk-KCGXPP5V.js.map +0 -1
  835. package/dist/chunk-KZ73RL76.js.map +0 -1
  836. package/dist/chunk-LAKLF4PA.js +0 -141
  837. package/dist/chunk-LAKLF4PA.js.map +0 -1
  838. package/dist/chunk-MXJGO7LE.js.map +0 -1
  839. package/dist/chunk-NEXLLTP4.js.map +0 -1
  840. package/dist/chunk-PEI6RANI.js.map +0 -1
  841. package/dist/chunk-QGBJ6GHG.js.map +0 -1
  842. package/dist/chunk-T7VAYG2I.js.map +0 -1
  843. package/dist/chunk-W6NFJXSA.js +0 -454
  844. package/dist/chunk-W6NFJXSA.js.map +0 -1
  845. package/dist/chunk-WSK7G5LE.js +0 -170
  846. package/dist/chunk-WSK7G5LE.js.map +0 -1
  847. package/dist/chunk-X4A66EWZ.js +0 -223
  848. package/dist/chunk-X4A66EWZ.js.map +0 -1
  849. package/dist/chunk-X4JAFD5R.js.map +0 -1
  850. package/dist/chunk-XXWH2JLC.js.map +0 -1
  851. package/dist/chunk-ZUT5QSQB.js.map +0 -1
  852. package/dist/computer-viewer-ZOP4Q7A7.js +0 -16
  853. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  854. package/dist/hooks/use-environments.d.ts +0 -41
  855. package/dist/hooks/use-packs.d.ts +0 -32
  856. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  857. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  858. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  859. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  860. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  861. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  862. package/src/hooks/use-environments.ts +0 -182
  863. package/src/hooks/use-packs.ts +0 -157
  864. /package/dist/{browser-viewer-GXUICIAG.js.map → browser-viewer-M7BIVFTW.js.map} +0 -0
  865. /package/dist/{computer-viewer-ZOP4Q7A7.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @opengeni/react
2
2
 
3
- React hooks and styled components for OpenGeni, built on
3
+ React hooks and styled components for Opengeni, built on
4
4
  [`@opengeni/sdk`](../sdk): live session streaming, a chat composer, a message
5
5
  timeline that renders streaming deltas / tool calls / spawned-worker status,
6
6
  session status badges, and fleet tiles for workspace overviews. Two opt-in
@@ -19,11 +19,308 @@ island for back-compat, deprecated per #144.)
19
19
 
20
20
  Design-system-first: every visual decision routes through CSS-variable tokens
21
21
  (`styles/tokens.css`) — color, typography, radius, shadow, motion. Dark mode is
22
- the first-class default; light is an opt-in via `data-og-theme="light"` on any
23
- ancestor. Components are styled with Tailwind v4 utilities mapped onto the
22
+ the first-class token default; light is an opt-in via `data-og-theme="light"` on
23
+ any ancestor. The embedded chat roots (`OpenGeniChat`, `SessionConversation`)
24
+ resolve light or dark from the host page instead; see
25
+ [Conversation UI](#conversation-ui). Components are styled with Tailwind v4 utilities mapped onto the
24
26
  tokens, Radix primitives for behavior, and Motion for state-communicating
25
27
  animation. Override the tokens to rebrand everything.
26
28
 
29
+ ## Embedded connections and Sites
30
+
31
+ For a child chat's capability selection, `prepareSessionCapabilityAccess` reads
32
+ an ancestor-to-child access plan without writing. Show the parent chats whose
33
+ `request` is non-null and obtain an explicit confirmation before calling
34
+ `applySessionCapabilityAccess`. The plan preserves existing choices, applies
35
+ version-fenced updates root first, and grants no authority: each ordinary API
36
+ request still authorizes its caller. Invalidate the review on actor/workspace
37
+ changes. A partial failure may leave approved parent changes saved; prepare a
38
+ new plan for retry instead of rolling them back. Existing
39
+ `attachSessionCapability` remains a single-chat operation and never changes
40
+ parents implicitly.
41
+
42
+ Optional `@opengeni/react/connect` exports `useConnect`, `ConnectChooser`,
43
+ `ConnectSetup`, `ConnectAccounts`, and the composed `ConnectPanel`. Inject one
44
+ `@opengeni/connect` controller per authenticated actor/workspace and dispose it
45
+ when that scope changes. The controller uses your authenticated backend proxy;
46
+ never place an organization key in browser props. Import
47
+ `@opengeni/react/connect.css` for opt-in, scoped styles without Tailwind.
48
+ `DeviceAuthorization` also accepts an optional `render` callback for host presentation;
49
+ it receives shared copy state, the copy action, and the validated verification URL.
50
+ Omitting it preserves the default embedded presentation.
51
+
52
+ `CapabilityCatalogRow` gives connections, skills, and plugins one consistent
53
+ icon/name/description button with a decorative plus/check and visible exception
54
+ states. Supply `onOpen` and an explicit `status`; the host owns setup and
55
+ installation. `ConnectionCatalog` accepts the same states through each option's
56
+ `state`. Older callers that omit `state` keep their visible status labels, so
57
+ provider warnings are not hidden during migration.
58
+
59
+ `PluginDiscovery` accepts `defaultProvider="openai"` or `"anthropic"` to choose
60
+ the initial registry. Omitting it starts with All. Users can still switch among
61
+ All, OpenAI, and Anthropic; changing the search preserves their selection. The
62
+ Opengeni Plugins page starts with OpenAI.
63
+
64
+ ```tsx
65
+ import { ConnectPanel } from "@opengeni/react/connect";
66
+ import "@opengeni/react/connect.css";
67
+
68
+ <ConnectPanel
69
+ controller={controller}
70
+ returnUrl={hostSelectedReturnUrl}
71
+ onAuthorize={hostAuthorizeFromClick}
72
+ />;
73
+ ```
74
+
75
+ The host owns synchronous popup/full-redirect navigation and pending-attempt
76
+ recovery. Backend state, not a popup message or URL query, proves completion.
77
+ Operation installation uses explicit selection; OAuth success alone is not
78
+ installation. Account disconnect requires an observed version and confirmation,
79
+ revokes local Opengeni access only, and never silently retries an unknown outcome.
80
+ Provider readiness is deployment-dependent; use the server catalog rather than
81
+ assuming every OAuth application or operator-managed provider is configured.
82
+
83
+ Optional `@opengeni/react/sites` exports `SiteList`, `SiteDetail`, and `SiteClient`.
84
+ Pass the public SDK client through your host proxy. `onOpen` owns list
85
+ navigation. Authoring buttons and prompts belong to the host and use the ordinary
86
+ session SDK; they are not part of the Site component API. `SiteDetail` reuses `PublishedHtmlArtifactFrame`, accepts
87
+ an optional authenticated/filtered tool bridge, and removes the frame after
88
+ read-authority refresh failure. Loaded Sites revalidate every 15 seconds;
89
+ downloaded HTML cannot be recalled and every tool call still needs live authority.
90
+
91
+ `canPublish` is only a presentation hint. Version-checked rollback/archive/restore
92
+ remain subject to backend `artifacts:publish` permission. Sites stay workspace
93
+ shared, even if a source session is private. See
94
+ [`examples/embedded-product`](../../examples/embedded-product/README.md) for the
95
+ runnable loopback host reference. Native route reuse and full visual acceptance
96
+ are not implied by these optional package surfaces.
97
+ ## Conversation UI
98
+
99
+ For an account-aware header, `useLastStartedTurnPolicy(sessionId, { events,
100
+ includeServingModel: true })` overlays the latest lease-backed serving receipt
101
+ only when it belongs to the last started turn. This requires the optional
102
+ `getSessionModelAccount` client method. Without the option, the hook continues
103
+ to return the accepted turn policy. Neither mode changes the composer's
104
+ preferred model. `useSessionModelAccount` reads authorized accounts and choices;
105
+ pass `provider` so Automatic resets only that provider's choice. Its optional
106
+ `choice.serving` is the last committed placement, not a queued next-turn choice.
107
+ The timeline renders neutral account-switch events without exposing account
108
+ identity or duplicating provider compatibility events.
109
+
110
+ `OpenGeniChat` and `SessionConversation` are the default product integration.
111
+ Back them with `createSessionProxyHandler` from `@opengeni/sdk`, mounted on your
112
+ server, and pass its mount as `baseUrl`. No provider, client, or workspace id
113
+ is needed: the component creates the browser client and uses the workspace the
114
+ proxy resolved for the signed-in user (from the proxy's client config).
115
+
116
+ ```tsx
117
+ import "@opengeni/react/compiled.css";
118
+
119
+ <OpenGeniChat baseUrl="/api/opengeni" />;
120
+ // or one conversation: <SessionConversation baseUrl="/api/opengeni" sessionId={sessionId} />
121
+ ```
122
+
123
+ Bearer-token apps pass `headers` (a function runs per request) or a custom
124
+ `fetch`; a `client` passed with `baseUrl` replaces the one the component
125
+ creates:
126
+
127
+ ```tsx
128
+ <OpenGeniChat baseUrl="/api/opengeni" headers={() => ({ Authorization: `Bearer ${getToken()}` })} />
129
+ ```
130
+
131
+ The provider form keeps working, for example for several components sharing one
132
+ client or the headless hooks:
133
+
134
+ ```tsx
135
+ <OpenGeniProvider client={new OpenGeniClient({ baseUrl: "/api/opengeni" })} workspaceId={workspaceId}>
136
+ <SessionConversation sessionId={sessionId} />
137
+ </OpenGeniProvider>
138
+ ```
139
+
140
+ Compose `MessageTimeline` and `ChatComposer` with the session hooks only when
141
+ the product needs a materially different interaction model. These components do
142
+ not consume the text-only `@opengeni/sdk/chat` fallback protocol.
143
+
144
+ `OpenGeniChat` adds the user's chat list to the conversation: a sidebar when
145
+ the component is wide and a drawer behind a menu button when narrow (measured on
146
+ its own container, so it works inside panels), a new-chat composer that creates
147
+ the session from its first message, and inline rename and archive. It is
148
+ composed from `SessionList` and `SessionConversation`, which you can also mount
149
+ separately. Pass `conversationProps` for message rendering and tool renderers,
150
+ `createSession` to create chats through your own endpoint, or `sessionId` /
151
+ `onSessionChange` to control the selection (for example from the URL).
152
+
153
+ Live voice is opt-in, because a call spends your credits and asks the browser
154
+ for the microphone. Turn it on with `realtimeVoice={true}` (via `OpenGeniChat`'s
155
+ `conversationProps` too) or `createSessionProxyHandler({ realtimeVoice: true })`.
156
+ The composer then shows a voice button when the workspace offers an available
157
+ voice model (for example hosted GPT Live with credits): the user talks, the
158
+ voice model answers and hands work to the agent in the same chat, and the
159
+ transcript lands in the timeline. It stays hidden when no model is available,
160
+ when the proxy sets `realtimeVoice: false`, or when you pass
161
+ `realtimeVoice={false}`. The voice code loads lazily on first display.
162
+
163
+ The working indicator before the first reply says "Thinking…". Pass
164
+ `genieLoading` (`phrases`, `messages`, `orb`, or a whole `render`) to use your
165
+ own copy or visual. File attachments follow the proxy: it reports them off when
166
+ `files: false`, and for anonymous visitors (`visitor: true` from `resolve`)
167
+ unless it sets `visitorUploads: true`.
168
+
169
+ `SessionConversation` and `OpenGeniChat` are built to look native inside
170
+ someone else's product with zero styling:
171
+
172
+ - **Theme follows the host**, not the OS: an enclosing `data-og-theme`, then
173
+ `class="dark"`/`data-theme` (and similar) on `<html>`/`<body>`, the host's
174
+ `color-scheme`, then the luminance of the background the chat sits on. Pass
175
+ `theme="light" | "dark"` to force one.
176
+ - **Surfaces blend into the host** (`surface="host"`, default): backgrounds and
177
+ cards are opaque mixes of the host background, so a navy app gets navy cards.
178
+ Host-customized `--og-color-*` tokens are kept; `surface="theme"` uses the
179
+ token surfaces as they are.
180
+ - **Run control is Stop, not Pause**: a Stop control appears only while a
181
+ response runs, and the next message continues a stopped conversation. Opt
182
+ into the console's workstream Pause with `composerProps={{ runControl: "pause" }}`
183
+ (`"none"` hides both).
184
+ - **No model picker by default**: end users rarely choose models. Pass
185
+ `modelPicker`, or report `modelSelection: true` from the proxy
186
+ (`createSessionProxyHandler({ modelSelection: true })`); `modelSelection: false`
187
+ also fixes the policy server-side.
188
+
189
+ Attachments appear when the deployment enables uploads (`attachments={false}`
190
+ opts out), the microphone appears when it reports voice input available
191
+ (`voiceInput={false}` opts out), generated images, video, published files and
192
+ screenshots display through the conversation's session scope, actions a
193
+ session proxy reports unavailable (`sessionCreation`, `archive`, `artifacts`)
194
+ are hidden, the session goal shows with Pause/Resume/Clear, sub-agent cards
195
+ open the child through `onOpenSession` (`OpenGeniChat` opens it in place),
196
+ pending tool approvals render Approve/Reject, a yes/no question
197
+ renders as two buttons, a failed load offers Try again, and `toolRegistry`
198
+ customizes tool rendering.
199
+
200
+ The root keeps all existing exports, including workbench components, but never
201
+ imports their optional peers. Conversation-only Next.js/Vite hosts do not need
202
+ terminal, desktop, editor, or diff packages. Hosts mounting those surfaces opt
203
+ in through the [per-surface setup entries](#optional-peer-dependencies).
204
+
205
+ Highlighted diffs use the optional `@pierre/diffs` peer only after an explicit
206
+ opt-in, so a host without it still builds with any bundler (Turbopack resolves
207
+ every reachable `import()`). Hosts that install it call `enablePierreDiffs()`
208
+ once; call it from the lazily loaded route that renders diffs to keep the peer
209
+ out of your initial bundle. Views already on screen upgrade when it registers:
210
+
211
+ ```ts
212
+ import { enablePierreDiffs } from "@opengeni/react/diffs";
213
+ enablePierreDiffs();
214
+ ```
215
+
216
+ Without it, diffs and file views render as plain text.
217
+
218
+ `OpenGeniProvider` never blocks or reloads the host page when Opengeni deploys
219
+ a new API contract revision. The stock Opengeni console opts into that
220
+ stale-tab protection with `reloadOnApiContractChange`; embedded products
221
+ should leave it off.
222
+
223
+ Subscription account lists and their usage readings (`useCodexAccounts`,
224
+ `useSuperGrokAccounts`) are shared per `client` object: readers mounted at the
225
+ same time share one request and one result, and account changes made through
226
+ these hooks re-read every mounted list (also when the component that made the
227
+ change has already unmounted). By default nothing is kept after the last reader
228
+ unmounts, so a host that reuses one `client` for different people never shows
229
+ one person's accounts to the next, also when it re-keys its tree for the next
230
+ person in a single render: the new reader and its children never render the
231
+ previous rows, and a read still in flight for the previous person is
232
+ discarded. (A reader joining one already on screen shows its rows before the
233
+ browser paints, after one extra render.) Set `retainReadsAcrossMounts` on
234
+ `OpenGeniProvider` to keep them across navigation instead: returning to a page
235
+ renders the last accounts at once and re-reads them in the background once
236
+ they are older than 10 seconds. Failed reads are never kept, and a
237
+ 401/403/404 drops what was kept. Retained reads are dropped when `client`
238
+ changes or the provider unmounts.
239
+
240
+ > **Host action item:** only set `retainReadsAcrossMounts` when every signed-in
241
+ > person gets their own `client` object (create a new client on sign-in,
242
+ > sign-out and account switch), as the stock Opengeni console does. With a
243
+ > shared client, leave it off.
244
+
245
+ ### Exact conversation search navigation
246
+
247
+ `useSessionEvents().initialHistoryReady` becomes true when a history window has
248
+ loaded successfully, including an empty tail. It stays true through later stream
249
+ errors, history navigation, and tip reloads, and resets for a new session/replay
250
+ identity. Use it rather than inferring initial success from `initialLoading` or
251
+ the combined `error`. A failed first load stays unready until recovery;
252
+ `jumpToLatest()` clears its stale error and retries. Full replay has no history
253
+ snapshot-completion watermark, so SSE alone does not set this flag.
254
+
255
+ `useSessionEvents(sessionId).jumpToSequence(sequence)` replaces the current
256
+ window with at most two bounded cursor reads around an exact durable event.
257
+ It resolves `true` only when that event is retained, `false` for a missing or
258
+ superseded target, and rejects current request errors. `loadingTarget` exposes
259
+ the pending state. New targets supersede older targets/pages; session/client
260
+ changes fence stale results. Search enters history mode; use the existing
261
+ `loadOlder`, `loadNewer`, and `jumpToLatest` controls to navigate onward. It does
262
+ not download the intervening session history.
263
+ Pass `jumpToSequence(sequence, { signal })` to cancel one navigation: an
264
+ aborted signal fences the pending jump before its fetched window is applied
265
+ (the underlying reads may still complete), resolves `false`, and settles
266
+ `loadingTarget` without disturbing any newer navigation that superseded it.
267
+
268
+ Pass the selected hit to `MessageTimeline` independently of loading:
269
+
270
+ ```tsx
271
+ const history = useSessionEvents(sessionId);
272
+ const [target, setTarget] = useState<TimelineSearchTarget | null>(null);
273
+
274
+ function selectHit(hit: { sequence: number; eventId: string }, query: string, occurrence = 0) {
275
+ setTarget({ ...hit, query, occurrence });
276
+ void history.jumpToSequence(hit.sequence);
277
+ }
278
+
279
+ <MessageTimeline events={history.events} items={history.timeline} searchTarget={target} />;
280
+ ```
281
+
282
+ The host owns search results, error handling, next/previous controls and query
283
+ state. `TimelineSearchTarget` is exported from the root and `session-ui` entry:
284
+ `{ sequence: number; eventId?: string; query: string; occurrence?: number; offset?: number }`.
285
+ Matching is literal, case-insensitive, non-overlapping; `occurrence` is zero-based
286
+ within the message, defaulting to zero. When the backend all-occurrence search
287
+ returns `messageMatchOffset`, pass it as `offset`: the zero-based UTF-16 position
288
+ of the match in the original message text. An explicit `offset` takes precedence
289
+ over `occurrence` and is validated against the query, so a stale offset simply
290
+ produces no highlight. `buildTimeline` supplies `sourceEvents`
291
+ identities so completed assistant events remain addressable when the renderer
292
+ keeps a first-delta ID. Hosts supplying their own items should preserve those
293
+ identities (or the canonical `annotationSource`).
294
+
295
+ The active message's group and long-user disclosure open persistently. Setting
296
+ `searchTarget={null}` removes the active highlight without collapsing content or
297
+ restoring a former scroll position. The package mounts its complete bounded
298
+ window. The default Markdown renderer shows a labeled, bounded **message source**
299
+ excerpt for the active match, including Markdown syntax and link destinations;
300
+ closing find removes the highlight but retains that excerpt and its layout.
301
+ An explicit **Show formatted message** action restores the full body; this can
302
+ expand a huge message, so it is never done automatically on closing Find.
303
+ Raw UTF-16 offsets are never applied
304
+ to rendered Markdown text. Custom hosts can use
305
+ `<Markdown searchTarget={searchTarget}>{text}</Markdown>` for the same behavior.
306
+ A custom virtualized renderer receives
307
+ `renderMessageText(text, item, { searchTarget })` and must materialize the exact
308
+ occurrence when that context is non-null. Existing two-argument renderers remain
309
+ compatible. If previous occurrences are omitted from the virtualized DOM, wrap
310
+ the materialized match in an element with `data-og-search-occurrence` (zero-based
311
+ index), `data-og-search-sequence` and `data-og-search-query`, each set from the
312
+ target; when the target carries an `offset`, set `data-og-search-offset` to it
313
+ alongside `data-og-search-occurrence` (which can be zero). This lets navigation
314
+ identify that exact occurrence without recounting an incomplete DOM. Keep the
315
+ materialized window when the context clears to
316
+ preserve position. Navigation waits for the mounted text and highlights the active
317
+ DOM range using the CSS Custom Highlight API, without rewriting React-owned
318
+ text. Explicit source-offset targets require this marker: matching characters
319
+ at the same rendered offset are not proof of source identity. A custom renderer
320
+ that omits source text or puts it in an opaque iframe must reveal that text
321
+ itself. Existing renderers without this mapping remain render-compatible but
322
+ cannot provide exact source-offset navigation.
323
+
27
324
  ## Editable Office artifacts
28
325
 
29
326
  The optional artifact workbench is isolated from the ordinary session and
@@ -76,6 +373,29 @@ import { EditablePresentationArtifactSurface } from "@opengeni/react/artifacts/p
76
373
  <EditablePresentationArtifactSurface session={presentationSession} title="Launch deck" />;
77
374
  ```
78
375
 
376
+ The spreadsheet surface supports typing, formulas, rectangular paste, clear,
377
+ and durable row/column resizing. Drag a header boundary for immediate visual
378
+ feedback and one command on release. Focus a boundary and use arrows to resize
379
+ (Shift for 1 px), Home to reset, or Escape to cancel. Pending saves do not block
380
+ typing; the sync indicator remains pending until server acknowledgement. Failed
381
+ independent edits stay visible, and retry cannot overwrite newer overlapping
382
+ edits. The same component is used in the dock and full-page artifact view;
383
+ dimensions and values remain authoritative in the SDK Worker.
384
+ The console supplies an XLSX Download action in both dock and full-page views.
385
+ Custom hosts can supply `download(signal): Promise<Blob>` on the spreadsheet
386
+ surface, or `downloadSpreadsheet(opened, signal): Promise<Blob>` on
387
+ `EditableArtifactView`. Use the authenticated artifact SDK to pin the saved native
388
+ head, materialize XLSX, poll its job, and download its bytes; never return the
389
+ original imported file. Forward the abort signal through every request. The
390
+ control waits for live sync without pending edits, shows progress and retryable
391
+ errors, and cancels on teardown or revoked access. Omit the callback when the host
392
+ does not support export; other modalities do not gain an unsupported download.
393
+ Double-click a sheet tab or focus it and press F2 to rename it. Enter/Save submits
394
+ the canonical `sheet.rename` command; Escape/Cancel discards an unsent name.
395
+ Validation and failed submissions keep the name editor open. Pending cell edits
396
+ show submitted input until the Worker projection catches up; pending formulas
397
+ show their source, not an invented result.
398
+
79
399
  The durable document surface composes bounded summary, body, section, and
80
400
  review queries at one native revision. Text edits become UTF-16-correct minimal
81
401
  `paragraph.edit` commands; formatting becomes `paragraph.format`. Empty
@@ -97,7 +417,7 @@ or permissive fallback.
97
417
 
98
418
  `DocumentProjectionEditor`, `PresentationProjectionEditor`, and
99
419
  `SpreadsheetProjectionGrid` expose the same host-owned projection/async-command
100
- boundary without requiring the OpenGeni sync session. Pending, failure, retry,
420
+ boundary without requiring the Opengeni sync session. Pending, failure, retry,
101
421
  read-only, focus, and reconciliation behavior stays inside the components.
102
422
 
103
423
  Projection editors use browser-safe structural views and do not load
@@ -135,6 +455,21 @@ can therefore implement only the methods used by each hook. A shared event feed
135
455
  also avoids requiring a client-owned event stream at runtime. Workspace-level
136
456
  Resume is an optional authority.
137
457
 
458
+ Use `createEmbeddedSessionClient(base, options)` to bind that narrow surface
459
+ from a full SDK client or host proxy. Delegated methods preserve their SDK
460
+ receiver, `options.overrides.submitComposerDraft` can route atomic submission
461
+ through a host-authenticated endpoint, and `mapComposerDraft` can project every
462
+ read/save/submit draft before React adopts it. Construction fails immediately
463
+ when a required method is missing, and submit returns the host/native
464
+ `SubmitComposerDraftResponse` unchanged apart from an explicitly configured
465
+ draft projection.
466
+
467
+ The styled file surfaces accept a presentation-only node predicate:
468
+ `FileBrowser.isNodeVisible`, `SandboxFiles.isNodeVisible`, and
469
+ `SandboxWorkspace.isFileNodeVisible`. Hidden parents never expose orphaned
470
+ children, hidden selections/reveal requests are ignored, and omitting the prop
471
+ preserves the complete authoritative tree. This is not an authorization seam.
472
+
138
473
  The styled root surface ships with ready-to-use CSS. Import it once; the host
139
474
  does not need Tailwind:
140
475
 
@@ -154,7 +489,7 @@ derived defaults use scoped effective values so changing a base accent, radius,
154
489
  motion, or surface token updates its dependents at runtime.
155
490
 
156
491
  The original Tailwind v4 bridge remains available for hosts that intentionally
157
- want OpenGeni utilities compiled into their own Tailwind entry:
492
+ want Opengeni utilities compiled into their own Tailwind entry:
158
493
 
159
494
  ```css
160
495
  @import "tailwindcss";
@@ -295,7 +630,7 @@ export function App() {
295
630
 
296
631
  ## Realtime composer controls (`@opengeni/react/realtime`)
297
632
 
298
- The realtime subpath is the exact OpenGeni composer experience: model catalog
633
+ The realtime subpath is the exact Opengeni composer experience: model catalog
299
634
  and selection, split-button motion, start/stop/retry states, microphone and
300
635
  audio mute controls, diagnostics, recovery, and the same copy, ARIA, classes,
301
636
  and styling used by the web console. It is deliberately separate from the root
@@ -361,7 +696,7 @@ The reference consumer is `demo/realtime.html`. Run `bun run demo` from
361
696
  `packages/react`, then open `http://localhost:3100/realtime.html?mode=mock` for
362
697
  deterministic selection/start/mute/stop/reconnect/error testing. Use
363
698
  `?mode=live&workspaceId=…&sessionId=…` against the web server's same-origin
364
- `/demo-api` proxy for a real local OpenGeni environment. Configure
699
+ `/demo-api` proxy for a real local Opengeni environment. Configure
365
700
  `OPENGENI_DEMO_API_URL` and, only on the server, optional demo API/access
366
701
  credentials; the browser receives neither credential. Prefer the deployment's
367
702
  normal browser authentication. If the proxy needs a server credential, create a
@@ -386,11 +721,46 @@ through published package APIs only.
386
721
  ## Browser and computer surfaces (`@opengeni/react/interaction`)
387
722
 
388
723
  The interaction subpath renders the same browser-native and semantic computer
389
- surfaces used by the OpenGeni web app. It consumes only the public SDK client:
724
+ surfaces used by the Opengeni web app. It consumes only the public SDK client:
390
725
  workspace discovery, peer switching, tabs/windows, live frames, human input,
391
726
  identity versions, interventions, diagnostics, reconnect, and lifecycle state do
392
727
  not require app-private controller glue.
393
728
 
729
+ Managed browser actions keep the foreground tab in place. Target-local Chromium
730
+ focus emulation keeps animation callbacks running without an open preview;
731
+ explicit activation brings a tab forward. The override ends when its controller
732
+ detaches. Native **App controls** also work in the background where supported.
733
+ Physical desktop mouse/keyboard input shares the foreground seat; **Bring to front**
734
+ makes that change explicit.
735
+ Computer frames fit the dock while preserving their proportions. Resizing or
736
+ reopening the dock refits the visible image without changing capture resolution
737
+ or the coordinates sent to the computer.
738
+ Desktop opens a whole screen by default. Multiple screens use a compact screen
739
+ selector; app controls and window views are available from **Advanced**. Explicit
740
+ view choices survive refreshes while the target remains available.
741
+
742
+ Desktop IME candidates and their selection keys stay local; only committed text is sent.
743
+
744
+ A managed browser's attachment authority error keeps a same-browser **Reconnect**
745
+ action available. It obtains a fresh server-authorized attachment without creating
746
+ a replacement browser or replaying input. The fresh Connected Chrome instruction
747
+ is reserved for the selected extension-attached browser's generation loss; a
748
+ different lost browser in the workspace cannot change that recovery path.
749
+
750
+ The browser viewer negotiates bounded typing batches from the active controller's
751
+ short-lived attachment. Supporting helpers recheck the original controller,
752
+ target, document and frame fence before every action; old helpers retain one
753
+ request per action. Only queued text actions share a request (at most 16), with
754
+ each text/input event preserved. Keys, pointer input and clipboard operations
755
+ remain ordering barriers. A failed or uncertain action discards the queued suffix
756
+ without replay.
757
+ IME candidate-selection keys stay local to the viewer; only committed text is
758
+ sent to the remote page. A later ordinary Enter remains a remote key action.
759
+ Live image props use opaque byte buffers so React development timing diagnostics
760
+ cannot expand and retain every screenshot byte. Normal timing diagnostics remain enabled.
761
+ Queued inputs retain only immutable frame fences, not screenshot bytes or prior
762
+ render callbacks. Replacing the selected viewer invalidates its queued suffix.
763
+
394
764
  ```tsx
395
765
  import { OpenGeniProvider } from "@opengeni/react";
396
766
  import { BrowserViewer, ComputerViewer } from "@opengeni/react/interaction";
@@ -416,6 +786,33 @@ returned ComputerSession must be the exact placement/window the browser uses.
416
786
  `onOpenComputer` then changes the host layout to that resource—it must not open a
417
787
  lookalike desktop. Closing either viewer never ends its durable resource.
418
788
 
789
+ `ComputerViewer` disables input when its control service is unavailable, even if
790
+ frames keep arriving. Reconnect refreshes the selected desktop's controls and
791
+ frames. App accessibility inspection failures leave independent live input
792
+ available; `useComputerSession().controlError` reports service loss separately
793
+ from the hook's general `error`.
794
+
795
+ If the chat's latest browser was lost or failed, the viewer names it and explains
796
+ why it is unavailable instead of showing the ordinary empty state. It offers the
797
+ existing new-browser controls without reopening the lost controller or selecting
798
+ another chat's browser. Explicitly closed browsers still use the empty state;
799
+ older failures do not replace a newer closed browser. This loss notice also takes
800
+ precedence over `renderEmpty`. Preview the deadline-loss case with
801
+ `browser.html?mode=mock&lost=1` (add `width=360&theme=light` for a narrow light dock).
802
+
803
+ Native dropdown popups may not appear in page frames. With a controller that
804
+ advertises focused input observations, clicking one opens its choices beside
805
+ the click. Ordinary clicks use a bounded focus probe instead of a full page
806
+ snapshot; only a focused native dropdown (or a child-frame focus hint) requests
807
+ semantic options. Current controllers show no permanent **Choose option** button
808
+ over the page; older controllers retain that explicit fallback. **Alt+Down** opens
809
+ the focused dropdown and reads its options on either controller generation.
810
+ Selection uses the normal browser action API. The viewer retains that
811
+ observation's target/document/frame fence. Private, oversized, or ambiguous
812
+ choices remain unavailable; the page's keyboard controls still work. This
813
+ fallback requires a controller with focused native-select metadata support and
814
+ does not rewrite the page or capture the desktop.
815
+
419
816
  The provider opens one shared workspace interaction-revision stream and every
420
817
  catalog refreshes only when its revision advances; hidden or disconnected pages
421
818
  fall back to bounded polling and reconcile from the retained cursor. Hosts that
@@ -428,6 +825,18 @@ same-origin `/demo-api` proxy and the exact published SDK/React entrypoints.
428
825
 
429
826
  ## Composer customization (`@opengeni/react/composer`)
430
827
 
828
+ `SessionChrome` accepts `onComposerFocus` for queue editing. Connect it to
829
+ `controller.focusInput` from `useChatComposerController`, or focus a custom
830
+ input through its ref. Chrome calls it after a successful checkout and
831
+ `composer.applyDraft`, including confirmed draft replacement; failed checkout
832
+ and pending/cancelled replacement do not request focus. The host retains
833
+ ownership of the input and no DOM selector or global focus event is needed.
834
+
835
+ When sharing `useSessionEvents().events` with `useGoal`, the hook still fetches
836
+ the authoritative goal on mount and target changes, even when the supplied log
837
+ already contains goal events. The shared log drives subsequent invalidations
838
+ without opening another event stream. A 404 remains a normal goal-less state.
839
+
431
840
  Use `ChatComposer` for the standard layout and its `controlsStart`, `header`,
432
841
  and `messages` props for small additions. For a different layout, import the
433
842
  headless controller and compound primitives as a namespace. The controller is
@@ -506,7 +915,8 @@ state remains application-owned; durable draft and session state remain in
506
915
 
507
916
  - `useSessionEvents(sessionId)` — loads a compact, bounded tail window by
508
917
  default, then live-streams on the SDK's exactly-once/ordered event delivery.
509
- Initial replay is capped at three 5000-row raw pages and `loadOlder` at two;
918
+ Initial replay reads one 1000-row raw page, with at most one extra page to
919
+ recover a dense turn's boundary; `loadOlder` is capped at two such pages;
510
920
  timeline group density is only an early stop. It returns the raw windowed
511
921
  `events`, projected `timeline`, latest `sessionStatus`, connection state, and
512
922
  older-history controls (`hasOlder`, `loadingOlder`, `loadOlder`). Pass
@@ -519,13 +929,32 @@ state remains application-owned; durable draft and session state remain in
519
929
  callback return type. Custom loaders can use `createOlderHistoryLoadReceipt`
520
930
  and call `markCommitted` immediately before publishing their accepted older
521
931
  window.
932
+ - Browser retention limits are exported as `SESSION_EVENT_BROWSER_MAX_BYTES`
933
+ and `SESSION_EVENT_BROWSER_MAX_COUNT`; they do not change fetch page sizes.
934
+ The live working set is at most 16 MiB or 20,000 events. One event larger than
935
+ the byte target stays complete in a window of its own.
936
+ Live appends reuse the retained window's byte total, measuring only incoming
937
+ and evicted events. History still pages when either retention limit is reached.
938
+ - Newer history uses `hasNewer`, `loadingNewer`, and `loadNewer`. A failed
939
+ `loadNewer()` preserves the retained events and cursors, exposes the original
940
+ failure through `error`, and still rejects for the caller to handle. Pass
941
+ `onLoadNewer={loadNewer}` (or return its promise from your wrapper) to
942
+ `MessageTimeline`: it catches the request failure, shows the error and an
943
+ explicit **Retry later activity** action, and does not automatically retry
944
+ the failed boundary. A successful retry, jump to the start/latest window,
945
+ or session change clears that failure. Loading older rows alone does not
946
+ resolve a failed newer read. Late failures from a previous session are ignored.
947
+ A host that discards the promise must handle its own rejected request.
522
948
  - `useComposer(sessionId, { sendExtras, effectiveControl })` — revisioned private
523
949
  draft, Send, Steer, and workstream Pause/Resume state. `send()` appends in
524
950
  visible queue order (including while paused); `steer()` puts the new direction
525
951
  directly in chat and supersedes the current direction. Resume is always an
526
952
  explicit control action and never an implicit side effect of Send. Drafts
527
953
  autosave with optimistic concurrency, survive failed sends, and reuse one
528
- `clientEventId` across retries so the server dedupes. `composer.policy` and
954
+ `clientEventId` across retries so the server dedupes. Draft reads retry transient
955
+ failures, including request timeouts, with backoff. Successful refreshes clear
956
+ draft-read errors without dismissing Send, Steer, or control errors; a draft
957
+ sync timeout does not mean the agent turn has stopped. `composer.policy` and
529
958
  `setModel` / `setReasoningEffort` / `setLatencyMode` expose the exact policy
530
959
  owned by that actor/session draft; policy is `null` until hydration completes.
531
960
  `sendExtras` (object or function evaluated at send time) is only for
@@ -557,16 +986,24 @@ state remains application-owned; durable draft and session state remain in
557
986
  plus the `defaultModel` to preselect (from the client config) for a picker.
558
987
  - `useCodexAccounts()` — connected Codex (ChatGPT) accounts, the active/next-run
559
988
  pointer, and per-session account pinning for multi-account subscriptions.
989
+ `refreshUsage({ maxAgeMs })` reuses live usage readings only when every
990
+ listed account was read within `maxAgeMs`; concurrent refreshes share one
991
+ provider read. `liveUsageUpdatedAt` is the time of the oldest account
992
+ reading. See `retainReadsAcrossMounts` above for keeping the list and
993
+ readings across navigation.
560
994
  - `useSlashCommands(...)` — the slash-command palette state (registry + parsing +
561
995
  handlers) behind `CommandPalette`.
562
996
  - `useWorkspaceSessions()` / `useScheduledTasks()` — workspace lists for
563
- fleet/manager views (optional polling).
564
- - `useVariableSets()` — workspace variable sets with metadata-only generic
565
- reads and create/update/remove/set/delete operations. Dedicated permissioned
566
- exact-value reveal is part of the held React/UI train rather than an
567
- implicit field on ordinary reads.
568
- - `usePacks()` — capability packs + installations with
569
- register/enable/remove and `installationFor(packId)`.
997
+ fleet/manager views (optional polling). `useWorkspaceSessions({ projection:
998
+ "summary" })` returns compact list entries; omit the option for full sessions.
999
+ Scripted clients can omit the summary method and the hook projects full pages
1000
+ locally while retaining cancellation and causal read revisions.
1001
+ - `useVaults()` / `useVault()` / `useVaultItems()` / `useVaultItem()` /
1002
+ `useVaultFieldVersions()` / `useSessionSecrets()` — vaults, items, field
1003
+ history and a session's vault policy, metadata only. `useVaultsApi()` returns
1004
+ the SDK's `client.vaults(workspaceId)` routes for writes and the one audited
1005
+ `revealField` call; keep revealed values in component state, never in a
1006
+ cache. Variable Sets and `useVariableSets()` were removed in 2.0.0.
570
1007
  - `useWorkspaces()` — the caller's workspaces with create/update (client-only;
571
1008
  not bound to the provider's workspace).
572
1009
  - `useBillingUsage({ accountId?, workspaceId? })` — credit balance + recent
@@ -614,22 +1051,44 @@ intentional changes should regenerate those snapshots and review the diff.
614
1051
  - `MessageTimeline` — the session timeline with stick-to-bottom scrolling, a
615
1052
  "jump to latest" affordance, streaming caret, collapsible activity clusters,
616
1053
  and worker cards (wire `onOpenSession` to drill into a worker). Pass
617
- `renderMessageText` to plug a markdown renderer. Pass
1054
+ `renderMessageText` to plug a markdown renderer. The default renderer shows a
1055
+ single newline in a message as a line break, like other chat apps; a custom
1056
+ renderer gets the same result with `<Markdown softLineBreaks>{text}</Markdown>`
1057
+ (off by default for non-chat Markdown). Pass
618
1058
  `loadRetainedArtifact` to render permanent generated-image receipts; a loader
619
1059
  may return verified bytes or a short-lived signed URL. The stock web app uses
620
1060
  the URL path to avoid copying multi-megabyte images into JavaScript memory.
1061
+ `createWorkspaceRetainedArtifactLoader`, `createSessionRetainedScreenshotLoader`,
1062
+ and `createWorkspaceRetainedVideoLoader` bind the SDK reads to a workspace
1063
+ (and session); `SessionConversation` uses them by default.
621
1064
  - `UserMessageBody` — the shared lossless rendered-height disclosure for
622
1065
  already-sent user text. Use it inside a custom `renderMessageText` user branch
623
1066
  so attachments and voice identity remain outside the clipped Markdown region.
1067
+ Pass `disclosureLabels={{ showMore: "Afficher davantage", showLess: "Réduire" }}`
1068
+ to localize a direct instance. For the default timeline, pass the same object
1069
+ as `MessageTimeline.userMessageDisclosureLabels` or
1070
+ `SessionConversation.userMessageDisclosureLabels`; custom `UserMessageBody`
1071
+ renderers inside that timeline inherit these labels too. Each direct label
1072
+ overrides its timeline label independently, then falls back to `Show more`
1073
+ or `Show less`. Changing labels does not reset a message's expanded state.
1074
+ `UserMessageDisclosureLabels` is exported from both `@opengeni/react` and
1075
+ `@opengeni/react/session-ui`.
624
1076
  - `SessionStatus` / `StatusDot` — status badges; live states breathe.
625
1077
  - `FleetTile` — one session in a fleet grid: title, status, model, recency.
626
1078
  - `ModelPicker` — a compact model dropdown for a composer slot, grouping the
627
1079
  host-exposed models by provider.
628
- - `ModelPolicyPicker` — the full model policy control used by the OpenGeni web
1080
+ - `ModelPolicyPicker` — the full model policy control used by the Opengeni web
629
1081
  app: provider/billing rails, model availability, reasoning effort, and
630
1082
  runnable latency modes such as Fast. It accepts either `ClientModel[]` or
631
1083
  catalog-backed `PickerModelRow[]`, and supports host-supplied labels.
632
1084
  - `Markdown` — the timeline's markdown renderer (GFM), also usable standalone.
1085
+ Top-level assistant tables in `MessageTimeline` can expand beyond the prose
1086
+ column into the actual conversation panel's available space. Small tables,
1087
+ paragraphs, user bubbles, and nested or standalone Markdown keep their normal
1088
+ width; oversized tables retain table-only horizontal scrolling. No host prop
1089
+ or viewport-wide layout override is required.
1090
+ Remeasurement during host rerenders or tail streaming does not temporarily
1091
+ resize the live table or displace an unpinned history reader.
633
1092
  With `onSandboxFile`, a valid `sandbox:<path>[:line]` application link becomes
634
1093
  an in-session Open action. The callback receives the decoded path unchanged;
635
1094
  the optional line is positive and 1-based. Invalid sandbox references render
@@ -680,6 +1139,97 @@ remaining built-ins in supplied order. Duplicate IDs keep their first
680
1139
  definition; remove a built-in before adding a custom facet with the same ID.
681
1140
  `replace` is type-exclusive with `add` and `remove`.
682
1141
 
1142
+ `turnSummary={{ rolling: true }}` selects the readable per-turn presentation:
1143
+ startup shows the preparation orb outside any disclosure, then hands over to
1144
+ Working without resetting the startup-inclusive elapsed clock. While work is
1145
+ live, assistant progress messages stay fully formatted and visible,
1146
+ followed by one Working or Waiting disclosure with the rolling latest step.
1147
+ When the turn finishes, earlier assistant messages and tools share the Worked
1148
+ disclosure; the final response remains visible. Expanding reveals that turn's
1149
+ earlier prose and activity in chronological order, not a fold of multiple turns.
1150
+ An already expanded or actively read view is preserved through settlement.
1151
+ Routine machine inputs get one compact reason per resumed turn. Normal tip-follow
1152
+ continues through long answers, and manual scrolling never auto-repins on new work.
1153
+ Expanded outer work headers stay reachable at the top of the timeline until
1154
+ their own details end; nested headers never stick. The contextual navigation
1155
+ pill stays below the sticky-header strip and avoids interactive controls. If
1156
+ no horizontal slot fits beside a toolbar, only the pill moves below it; the
1157
+ timeline's size and scroll position do not change.
1158
+
1159
+ The single **Back to your message** button returns to the loaded user prompt
1160
+ associated with the response or work being read: the latest prompt preceding
1161
+ the viewport midpoint. It appears only when that prompt's start is more than
1162
+ 24 px above the viewport and its entire body and attachments are out of view.
1163
+ Clicking synchronously scrolls and focuses that exact
1164
+ mounted prompt near the top and leaves tip-follow. Later messages and queued
1165
+ prompts do not change the destination while the reader remains in older work.
1166
+ An older bounded window uses its own loaded context; a window with no associated
1167
+ prompt shows no action. Navigation never replaces the history window or looks up
1168
+ the globally newest message. There are no previous/next arrows.
1169
+
1170
+ `SessionConversation` includes this behavior automatically. Custom timelines
1171
+ need no prompt-navigation callback:
1172
+
1173
+ ```tsx
1174
+ const events = useSessionEvents(sessionId);
1175
+ <MessageTimeline
1176
+ events={events.events}
1177
+ items={events.timeline}
1178
+ turnSummary={{ rolling: true }}
1179
+ hasNewer={events.hasNewer}
1180
+ onJumpToLatest={events.jumpToLatest}
1181
+ />;
1182
+ ```
1183
+
1184
+ `onJumpToLatest` retains its separate live-bottom behavior. The deprecated
1185
+ `MessageTimeline.onJumpToLatestQuestion` prop remains source-compatible but is
1186
+ not invoked by contextual navigation.
1187
+
1188
+ ### Optional global newest-message lookup
1189
+
1190
+ The public `useSessionEvents().jumpToLatestQuestion()` hook remains available for
1191
+ hosts that deliberately build a **separate** global lookup action. It is not wired
1192
+ to `MessageTimeline` or the first-party conversation's contextual button.
1193
+ The hook checks the authoritative queue and normally uses one filtered forensic
1194
+ lookup plus, if needed, two bounded context reads. It pages past legacy worker
1195
+ completions and withdrawn/cancelled-before-start prompts, never substituting an
1196
+ arbitrary question from a loaded old page. Queued/legacy admission uses filtered
1197
+ lifecycle evidence to locate its real turn start. A distant prompt is retained as
1198
+ one projection-only witness in `events.timeline`; `events.events` remains the
1199
+ bounded contiguous raw window, so pass `items` as above.
1200
+ The optional resolver loads on its first invocation, not when opening a session.
1201
+ Identity and navigation guards also cover that module-loading delay.
1202
+
1203
+ Custom hosts can provide their own queue destination when invoking this hook:
1204
+
1205
+ ```tsx
1206
+ const navigateToNewest = () => events.jumpToLatestQuestion({
1207
+ onQueuedQuestion: async (turn, navigation) => {
1208
+ await queue.refresh();
1209
+ if (!navigation.isCurrent()) return;
1210
+ // Check the host's latest queue/error state before applying its focus request.
1211
+ setQueueFocusTarget((previous) => ({
1212
+ turnId: turn.id,
1213
+ requestId: (previous?.requestId ?? 0) + 1,
1214
+ }));
1215
+ },
1216
+ });
1217
+ // Pass queueFocusTarget to SessionChrome; each new request opens/focuses once.
1218
+ ```
1219
+
1220
+ A queue destination returns `null`, not an invisible transcript sequence. Without
1221
+ `onQueuedQuestion`, a pending prompt rejects with `LatestQuestionQueuedError`;
1222
+ the custom host can show guidance. Transitional queue state can be retried.
1223
+ Check `navigation.isCurrent()` after awaits and immediately before queue UI effects:
1224
+ an explicit history jump can supersede a queued lookup without changing the session.
1225
+ The shared projection predicate supplies execution evidence for older queued turns
1226
+ without `turn.started`, including tools, agent/sandbox activity, startup, recovery,
1227
+ and capacity events. Compact cursor coverage skips coalesced delta runs.
1228
+ `groupTimeline(items)` retains classic
1229
+ grouping; `{ readableTurns: true }` selects the new projection. The deprecated
1230
+ `foldExchanges` option aliases readable turns, not the removed cross-turn fold. See
1231
+ [`docs/design/genie-loading.md`](../../docs/design/genie-loading.md).
1232
+
683
1233
  ## Sandbox surfacing
684
1234
 
685
1235
  An opt-in workbench that surfaces a session's live sandbox — files, terminal,
@@ -707,6 +1257,16 @@ capability document so every surface degrades to a reason instead of crashing.
707
1257
  These surfaces pull in [optional peer dependencies](#optional-peer-dependencies)
708
1258
  — install only the ones for surfaces you actually mount.
709
1259
 
1260
+ `SandboxWorkspace` keeps capture-backed file browsing passive, but an explicit
1261
+ live-file open acquires a viewer. Failed opens show the connection error and a
1262
+ retry that renegotiates the viewer instead of leaving a waking spinner running.
1263
+ When composing `SandboxFiles` directly, pass `workspaceError` alongside
1264
+ `liveWorkspaceReady` and supply an `onWakeWorkspace` callback that can retry a
1265
+ failed negotiation. Complete PNG, JPEG, GIF, and WebP reads render as read-only
1266
+ image previews; truncated reads and other binary formats remain non-editable
1267
+ notices. Image previews use the existing bounded file-read path and do not
1268
+ publish or retain additional files.
1269
+
710
1270
  ## Connected Machines (`@opengeni/react/machines`)
711
1271
 
712
1272
  Bring-your-own-compute UI: the Machines dashboard, per-machine metrics, the
@@ -752,11 +1312,62 @@ function Fleet({ sessionId }: { sessionId: string }) {
752
1312
  See the [Connected Machines guide](../../docs/connected-machines.md) for the
753
1313
  end-to-end embedder story (create-on-machine, discover, swap, enroll, revoke).
754
1314
 
1315
+ ## Usage allowances (`@opengeni/react/usage`)
1316
+
1317
+ Show people where they stand against a workspace or member usage allowance.
1318
+ A separate subpath, so hosts that don't meter usage never load it.
1319
+
1320
+ - `useUsage({ workspaceId? })` — the signed-in person's own `/usage/me`
1321
+ (through `getMyUsage` or any client with `requestJson`) plus a summary of
1322
+ which limit binds first. `refreshKey` re-reads when work settles.
1323
+ - `UsageMeter` — "38% left · Resets Nov 1". Shares only; pass `formatAmount`
1324
+ for money, credits or plan multiples. `density="compact"` for menus,
1325
+ `"hero"` to lead a page.
1326
+ - `UsageLimitNotice` — the calm composer line: nothing while comfortable, a
1327
+ dismissible heads-up near the limit, then who can raise it and when it
1328
+ resets. `labels` rewords it; `action` adds your own "Upgrade" button.
1329
+ - `UsageMemberList` — the admin roster with a share-of-budget slider,
1330
+ optional fixed amounts, and a visible note when shares add up to more than
1331
+ the pool. Save rules through your backend in `onChangeRule`.
1332
+
1333
+ ```tsx
1334
+ import { UsageLimitNotice, UsageMeter } from "@opengeni/react/usage";
1335
+
1336
+ <UsageMeter workspaceId={workspaceId} />
1337
+ <SessionConversation
1338
+ sessionId={sessionId}
1339
+ composerProps={{ header: <UsageLimitNotice workspaceId={workspaceId} /> }}
1340
+ allowanceExhaustedLabels={{ memberRemedy: "Ask your team admin for more." }}
1341
+ />
1342
+ ```
1343
+
1344
+ The conversation's "usage limit reached" row is customized on
1345
+ `MessageTimeline`/`SessionConversation` with `allowanceExhaustedLabels` or
1346
+ replaced with `renderAllowanceExhausted`. See
1347
+ [usage allowances](../../docs/usage-allowances.md#react-components-and-the-console).
1348
+
1349
+ ## Terminal startup input
1350
+
1351
+ `SandboxTerminal` captures bounded early typing while attaching. Supported stock
1352
+ sandbox images negotiate explicit Bash Readline readiness; banners and first
1353
+ output do not release queued commands. Silent prompts work too. If a startup
1354
+ profile asks for input or disables line editing, **Use manual input** clears
1355
+ buffered typing before enabling unguaranteed input. Old images/running ttyd
1356
+ daemons retain labelled **legacy input** behavior; wait for their shell startup
1357
+ before typing. Relay PTYs retain their existing OPEN_ACK behavior.
1358
+
1359
+ Custom consumers of `useTerminalStream` can inspect `inputReadiness` and expose
1360
+ `useLegacyInput()` for `waiting` states. That action discards queued typing; it
1361
+ is not an acknowledgement of shell readiness. A new React package alone cannot
1362
+ upgrade an old sandbox image. See the [native readiness contract](../../agent/native/terminal-ready/README.md)
1363
+ for compatibility, startup limits and coordinated release requirements.
1364
+
755
1365
  ## Optional peer dependencies
756
1366
 
757
- The chat/timeline surface has none. The sandbox workspace and diff surfaces pull
758
- their heavy libraries from **optional** `peerDependencies`, so you install only
759
- what the surfaces you mount need:
1367
+ The chat/timeline surface needs only the required React/React DOM peers. All
1368
+ existing root exports remain available without optional workbench peers, even
1369
+ when a bundler resolves every reachable dynamic import. Install and enable
1370
+ only the surfaces you mount, once in their client route or bootstrap:
760
1371
 
761
1372
  - Terminal (`SandboxTerminal`): `@xterm/xterm`, `@xterm/addon-fit`,
762
1373
  `@xterm/addon-web-links`.
@@ -766,6 +1377,37 @@ what the surfaces you mount need:
766
1377
  language packs you need (`css`, `html`, `javascript`, `json`, `markdown`,
767
1378
  `python`).
768
1379
 
1380
+ ```ts
1381
+ import { enableSandboxTerminal } from "@opengeni/react/terminal";
1382
+ import { enableDesktopViewer } from "@opengeni/react/desktop";
1383
+ import { enableCodeEditor } from "@opengeni/react/editor";
1384
+
1385
+ enableSandboxTerminal();
1386
+ enableDesktopViewer();
1387
+ enableCodeEditor({
1388
+ javascript: async () =>
1389
+ (await import("@codemirror/lang-javascript")).javascript({ jsx: true, typescript: true }),
1390
+ });
1391
+ ```
1392
+
1393
+ Omit imports and calls for surfaces you do not use. These entries also re-export
1394
+ their components; root component imports continue to work after setup. The
1395
+ libraries load on mount, not during setup or SSR. Import the setup from a lazy
1396
+ route to keep its peer chunks outside the initial conversation graph.
1397
+
1398
+ For optional terminal WebGL acceleration, install `@xterm/addon-webgl` and call
1399
+ `enableSandboxTerminal({ webgl: () => import("@xterm/addon-webgl") })`. Without
1400
+ it, or if it fails, the terminal uses its DOM renderer. Only supply editor
1401
+ grammar loaders for packages you installed; absent/failed grammars use plain
1402
+ CodeMirror. Without editor setup, the existing textarea fallback remains usable.
1403
+ Without terminal/VNC setup, those surfaces show a setup error; relay-frame
1404
+ desktops and a custom `rfbFactory` need no noVNC setup.
1405
+
1406
+ Custom hosts may supply `registerSandboxTerminal`, `registerCodeEditor`, or
1407
+ `registerDesktopViewer` loaders from the root instead. Mounted fallbacks retry
1408
+ when registration changes. Do not hide peer imports behind runtime bare strings
1409
+ or `@vite-ignore`: browsers cannot resolve those without an import map.
1410
+
769
1411
  ## Demo harness
770
1412
 
771
1413
  `bun run demo` (from this package) serves a harness that drives the real hooks
@@ -774,3 +1416,123 @@ with streaming, tool calls, and a worker spawn, plus fleet and scheduled-task
774
1416
  views and a dark/light toggle. `realtime.html` is the public-package reference
775
1417
  consumer described above, with deterministic mock and same-origin live modes.
776
1418
  `bun run demo:build` is part of the repo gate.
1419
+
1420
+ ### Model selection
1421
+
1422
+ `ModelPolicyPicker` opens a flat, searchable list grouped by payment source, with
1423
+ the selected model checked in its provider group. Choosing a model applies it and closes the popover.
1424
+ Thinking and supported speed controls remain in a fixed footer instead of a
1425
+ nested page. Model changes preserve supported reasoning effort and latency;
1426
+ unsupported effort falls back to the new model's default, and unsupported speed
1427
+ returns to Standard. Thinking uses inline radio choices and is hidden when the
1428
+ model has no adjustable reasoning levels. Availability and Codex-only session restrictions still disable choices.
1429
+
1430
+ Use `allowModelOptions={false}` for policies that save only a model identity,
1431
+ such as a fallback order. This hides effort and speed controls without changing
1432
+ the catalog, payment-source labels, or model eligibility.
1433
+
1434
+ The trigger renders immediately; the searchable popover loads when opened. Hosts
1435
+ can translate its search, current-selection, empty-result, attachment-warning, and
1436
+ thinking labels through `messages`, and override payment descriptions through
1437
+ `messages.billingHints`.
1438
+
1439
+ The stock deployment-provided group is labeled **Models**, with a generic model
1440
+ icon. It can contain both credit-backed and free models; the **Free** badge
1441
+ depends on the model's explicit cost, not its group. Genuine external-provider
1442
+ and subscription identities retain their own labels and marks.
1443
+
1444
+ Hosts can rebrand the full picker without replacing its interaction logic:
1445
+
1446
+ ```tsx
1447
+ <ModelPolicyPicker
1448
+ {...pickerProps}
1449
+ groupPresentation={{
1450
+ opengeni_credits: {
1451
+ label: "Acme Assist",
1452
+ icon: <AcmeMark aria-hidden="true" />,
1453
+ description: "Provided by your workspace",
1454
+ },
1455
+ codex_subscription: { description: null },
1456
+ }}
1457
+ />
1458
+ ```
1459
+
1460
+ `groupPresentation` is a partial map keyed by `PickerBillingClass`. Labels apply
1461
+ to group headings, search, and trigger-icon accessibility. Icons apply to both
1462
+ the menu and trigger; supply decorative, non-interactive content (SVG or image)
1463
+ that fits the existing 14px slot. Explicit `null` hides an icon or description;
1464
+ omitted fields retain defaults. Descriptions override `messages.billingHints`,
1465
+ can also be shown for the deployment-provided group, and are searchable. Existing
1466
+ `rows[].billingClassLabel` remains the fallback when no label override is supplied.
1467
+ This is presentation only: model IDs, billing, ordering, availability and callbacks
1468
+ are unchanged. The type `ModelPolicyPickerGroupPresentation` is exported from
1469
+ both `@opengeni/react` and `@opengeni/react/composer`. The native `ModelPicker`
1470
+ is a separate control; this API targets the full `ModelPolicyPicker` shown above.
1471
+
1472
+ The complete conversation uses this same neutral picker. Customize its appearance
1473
+ without replacing composer controls through `SessionConversation.modelPickerProps`,
1474
+ or through `OpenGeniChat.conversationProps`:
1475
+
1476
+ ```tsx
1477
+ <OpenGeniChat
1478
+ client={client}
1479
+ workspaceId={workspaceId}
1480
+ conversationProps={{
1481
+ modelPickerProps: {
1482
+ groupPresentation: {
1483
+ opengeni_credits: { label: "Acme Assist", icon: <AcmeMark aria-hidden="true" /> },
1484
+ },
1485
+ messages: { label: "Choose a model" },
1486
+ },
1487
+ }}
1488
+ />
1489
+ ```
1490
+
1491
+ `modelPickerProps` accepts only `groupPresentation` and `messages`; it does not
1492
+ enable a hidden picker or change policy, model availability or callbacks. Keep
1493
+ model-picker visibility controlled by `modelPicker` and the client configuration.
1494
+
1495
+ For a rendered example, open the composer-responsive demo with `?branding=host`.
1496
+
1497
+ Models always show their clean name and maker logo: picker rows carry
1498
+ `modelDisplayName(model)` (`claude-opus-4-8` and
1499
+ `organization-claude-subscription/claude-opus-5-5` read `Claude Opus 4.8` and
1500
+ `Claude Opus 5.5`) and a `ModelMark`. Organization- and workspace-connected API
1501
+ keys share one "API keys" group, and identical copies of one model in a
1502
+ connection group show once. Render a model anywhere else with
1503
+ `<ModelName model={id} />`, or `modelDisplayName` / `modelVendor` from
1504
+ `@opengeni/react` or `@opengeni/sdk/model-display`. The trigger keeps a host's
1505
+ explicit group icon; otherwise API-key models show the maker's logo.
1506
+
1507
+ Subscription descriptions appear once per provider group. Free models carry a
1508
+ Free badge. Pass `hasImageAttachments` for the current draft to show an image
1509
+ compatibility warning only when the selected model cannot view those images.
1510
+
1511
+ `MessageTimeline.renderMessageActions(item)` places host-owned controls beside
1512
+ Copy and the timestamp for user messages and completed assistant messages.
1513
+ The host owns feedback, fork authorization, and mutations; streaming assistant
1514
+ messages omit this slot. Use the `group/copy` hover/focus state and preserve
1515
+ visible touch targets when styling actions.
1516
+
1517
+ ### Portable action reviews
1518
+
1519
+ `ApprovalSurface` accepts `loadReview(approval)` and `onViewDetails(review, path)`;
1520
+ load the versioned facts with `client.getToolActionReview`. It shows one selected
1521
+ action, counts and bounded fields instead of raw argument JSON. Keep
1522
+ `selectedApprovalId` and `onSelectedApprovalChange` in the host if a full-page
1523
+ detail route unmounts the surface, so returning cannot silently select a different
1524
+ action. The native `onApprove` / `onReject` identity is unchanged and duplicate
1525
+ submission is fenced until authoritative events remove the request.
1526
+
1527
+ Render `ToolActionReviewDetails` on the host's normal page with
1528
+ `client.getToolReviewDetails`, passing the review's `actionDigest`, path and offset.
1529
+ Details are immutable, authenticated, paginated, and redact protected values.
1530
+ Restore focus to the original `data-review-path` button on return. No web-app
1531
+ imports, iframe, second confirmation, or nested scrolling pane is required.
1532
+ The standalone fallback retains bounded details for older SDK approvals.
1533
+
1534
+ Wrap `MessageTimeline` in `ToolReviewHistoryProvider` with its visible events,
1535
+ authenticated `load(approvalId)` callback and `onViewDetails` to keep recorded
1536
+ reviews readable inside the corresponding tool activity. Historical receipts
1537
+ never render decision buttons. The same semantic tokens support light/dark
1538
+ embeds; `demo/approval-review.html` is the synthetic state gallery.