@opengeni/react 3.1.0 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +89 -11
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/approvals.d.ts +2 -1
  5. package/dist/artifacts-document.js +5 -3
  6. package/dist/artifacts-presentation.js +5 -3
  7. package/dist/artifacts-spreadsheet.d.ts +1 -1
  8. package/dist/artifacts-spreadsheet.js +5 -3
  9. package/dist/artifacts.d.ts +5 -1
  10. package/dist/artifacts.js +536 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
  16. package/dist/chunk-2DDJ6YH6.js +41 -0
  17. package/dist/chunk-2DDJ6YH6.js.map +1 -0
  18. package/dist/chunk-2HVLQ26H.js +183 -0
  19. package/dist/chunk-2HVLQ26H.js.map +1 -0
  20. package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
  23. package/dist/chunk-2SFFYIH3.js.map +1 -0
  24. package/dist/chunk-3PVDYTTB.js +24 -0
  25. package/dist/chunk-3PVDYTTB.js.map +1 -0
  26. package/dist/chunk-3UZCWK46.js +298 -0
  27. package/dist/chunk-3UZCWK46.js.map +1 -0
  28. package/dist/chunk-47CKUXTW.js +293 -0
  29. package/dist/chunk-47CKUXTW.js.map +1 -0
  30. package/dist/chunk-4QYP6QUI.js +109 -0
  31. package/dist/chunk-4QYP6QUI.js.map +1 -0
  32. package/dist/chunk-5EY26VZ7.js +1053 -0
  33. package/dist/chunk-5EY26VZ7.js.map +1 -0
  34. package/dist/chunk-5I4VRWBB.js +56 -0
  35. package/dist/chunk-5I4VRWBB.js.map +1 -0
  36. package/dist/chunk-5WOR7UCL.js +191 -0
  37. package/dist/chunk-5WOR7UCL.js.map +1 -0
  38. package/dist/chunk-5YJLGOM5.js +51 -0
  39. package/dist/chunk-5YJLGOM5.js.map +1 -0
  40. package/dist/chunk-6JFN3OWG.js +386 -0
  41. package/dist/chunk-6JFN3OWG.js.map +1 -0
  42. package/dist/chunk-7QJT5O4S.js +35 -0
  43. package/dist/chunk-7QJT5O4S.js.map +1 -0
  44. package/dist/chunk-A55KV72M.js +402 -0
  45. package/dist/chunk-A55KV72M.js.map +1 -0
  46. package/dist/chunk-ADWCLI4G.js +2028 -0
  47. package/dist/chunk-ADWCLI4G.js.map +1 -0
  48. package/dist/chunk-B27E3V37.js +29 -0
  49. package/dist/chunk-B27E3V37.js.map +1 -0
  50. package/dist/chunk-B7TC2A33.js +83 -0
  51. package/dist/chunk-B7TC2A33.js.map +1 -0
  52. package/dist/chunk-BLL56F7R.js +385 -0
  53. package/dist/chunk-BLL56F7R.js.map +1 -0
  54. package/dist/chunk-BOFEQC6K.js +162 -0
  55. package/dist/chunk-BOFEQC6K.js.map +1 -0
  56. package/dist/chunk-CM7LVUKC.js +35 -0
  57. package/dist/chunk-CM7LVUKC.js.map +1 -0
  58. package/dist/chunk-CORUP6JB.js +122 -0
  59. package/dist/chunk-CORUP6JB.js.map +1 -0
  60. package/dist/chunk-CSX5FFKZ.js +35 -0
  61. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  62. package/dist/chunk-EGVHJKGJ.js +3125 -0
  63. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  64. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  65. package/dist/chunk-G76LSA76.js.map +1 -0
  66. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  67. package/dist/chunk-GQMRL52F.js.map +1 -0
  68. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  69. package/dist/chunk-GUUXOISA.js.map +1 -0
  70. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  71. package/dist/chunk-I7X2P4FU.js.map +1 -0
  72. package/dist/chunk-IGFZFLI2.js +1390 -0
  73. package/dist/chunk-IGFZFLI2.js.map +1 -0
  74. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  75. package/dist/chunk-IMSUVYQB.js.map +1 -0
  76. package/dist/chunk-IOYHDEP3.js +38 -0
  77. package/dist/chunk-IOYHDEP3.js.map +1 -0
  78. package/dist/chunk-IZV5FTJC.js +55 -0
  79. package/dist/chunk-IZV5FTJC.js.map +1 -0
  80. package/dist/chunk-KF33GTWN.js +343 -0
  81. package/dist/chunk-KF33GTWN.js.map +1 -0
  82. package/dist/chunk-KSGQ5ODA.js +457 -0
  83. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  84. package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
  85. package/dist/chunk-KZC6QRNR.js.map +1 -0
  86. package/dist/chunk-LJUMYUBO.js +218 -0
  87. package/dist/chunk-LJUMYUBO.js.map +1 -0
  88. package/dist/chunk-LSW2OJVV.js +380 -0
  89. package/dist/chunk-LSW2OJVV.js.map +1 -0
  90. package/dist/chunk-M357MHH3.js +2 -0
  91. package/dist/chunk-M357MHH3.js.map +1 -0
  92. package/dist/chunk-MK2TQO4Y.js +24 -0
  93. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  94. package/dist/chunk-N7S72EXK.js +25 -0
  95. package/dist/chunk-N7S72EXK.js.map +1 -0
  96. package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
  97. package/dist/chunk-NKMYZFHA.js.map +1 -0
  98. package/dist/chunk-NX4ADH73.js +14 -0
  99. package/dist/chunk-NX4ADH73.js.map +1 -0
  100. package/dist/chunk-O7F6UJO4.js +71 -0
  101. package/dist/chunk-O7F6UJO4.js.map +1 -0
  102. package/dist/chunk-OVB5WIG5.js +14064 -0
  103. package/dist/chunk-OVB5WIG5.js.map +1 -0
  104. package/dist/chunk-OYQQJL3J.js +16 -0
  105. package/dist/chunk-OYQQJL3J.js.map +1 -0
  106. package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
  107. package/dist/chunk-P4BNUO57.js.map +1 -0
  108. package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
  109. package/dist/chunk-PEHTX3V7.js.map +1 -0
  110. package/dist/chunk-PMV53IMM.js +26 -0
  111. package/dist/chunk-PMV53IMM.js.map +1 -0
  112. package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
  113. package/dist/chunk-PYEOPA4M.js.map +1 -0
  114. package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
  115. package/dist/chunk-QHUE7E4N.js.map +1 -0
  116. package/dist/chunk-QV3DJVRZ.js +11 -0
  117. package/dist/chunk-QV3DJVRZ.js.map +1 -0
  118. package/dist/chunk-R5SBNG7S.js +810 -0
  119. package/dist/chunk-R5SBNG7S.js.map +1 -0
  120. package/dist/chunk-RI42H5IU.js +326 -0
  121. package/dist/chunk-RI42H5IU.js.map +1 -0
  122. package/dist/chunk-S2QH6EZ5.js +211 -0
  123. package/dist/chunk-S2QH6EZ5.js.map +1 -0
  124. package/dist/chunk-SHLZMAJN.js +304 -0
  125. package/dist/chunk-SHLZMAJN.js.map +1 -0
  126. package/dist/chunk-TGXK4BAZ.js +293 -0
  127. package/dist/chunk-TGXK4BAZ.js.map +1 -0
  128. package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
  129. package/dist/chunk-TNEZNMSN.js.map +1 -0
  130. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  131. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  132. package/dist/chunk-UNJPZGNK.js +63 -0
  133. package/dist/chunk-UNJPZGNK.js.map +1 -0
  134. package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-VIUEOHXY.js +394 -0
  137. package/dist/chunk-VIUEOHXY.js.map +1 -0
  138. package/dist/chunk-WIUKB3LD.js +1911 -0
  139. package/dist/chunk-WIUKB3LD.js.map +1 -0
  140. package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
  141. package/dist/chunk-WNN7NO2N.js.map +1 -0
  142. package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
  143. package/dist/chunk-X5UVUIMF.js.map +1 -0
  144. package/dist/chunk-XDA5QJE7.js +402 -0
  145. package/dist/chunk-XDA5QJE7.js.map +1 -0
  146. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  147. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  148. package/dist/chunk-XHF7OYAN.js +1150 -0
  149. package/dist/chunk-XHF7OYAN.js.map +1 -0
  150. package/dist/chunk-YSRBFJMQ.js +43 -0
  151. package/dist/chunk-YSRBFJMQ.js.map +1 -0
  152. package/dist/chunk-ZOZAPAUO.js +174 -0
  153. package/dist/chunk-ZOZAPAUO.js.map +1 -0
  154. package/dist/chunk-ZQV5W7YC.js +809 -0
  155. package/dist/chunk-ZQV5W7YC.js.map +1 -0
  156. package/dist/chunk-ZUWF4NF7.js +13 -0
  157. package/dist/chunk-ZUWF4NF7.js.map +1 -0
  158. package/dist/client.d.ts +16 -7
  159. package/dist/clipboard.js +3 -1
  160. package/dist/commands/types.d.ts +2 -0
  161. package/dist/components/anthropic-mark.d.ts +3 -0
  162. package/dist/components/approval-surface.d.ts +19 -6
  163. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  164. package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
  165. package/dist/components/artifacts/artifact-surface.d.ts +4 -2
  166. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  167. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  168. package/dist/components/artifacts/document-editor.d.ts +4 -2
  169. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  170. package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
  171. package/dist/components/artifacts/editable-document.d.ts +1 -1
  172. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  173. package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
  174. package/dist/components/artifacts/index.d.ts +9 -2
  175. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  176. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  177. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  178. package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
  179. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  180. package/dist/components/artifacts/site-view.d.ts +26 -0
  181. package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
  182. package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
  183. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  184. package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
  185. package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
  186. package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
  187. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  188. package/dist/components/browser-select-control.d.ts +16 -0
  189. package/dist/components/browser-viewer.d.ts +11 -2
  190. package/dist/components/chat-composer.d.ts +21 -3
  191. package/dist/components/child-session-link.d.ts +9 -0
  192. package/dist/components/claude-mark.d.ts +3 -0
  193. package/dist/components/code-editor.d.ts +1 -4
  194. package/dist/components/composer-transcription-control.d.ts +7 -0
  195. package/dist/components/composer.d.ts +34 -67
  196. package/dist/components/computer-viewer.d.ts +1 -1
  197. package/dist/components/copy-button.d.ts +3 -1
  198. package/dist/components/desktop-viewer.d.ts +1 -1
  199. package/dist/components/fleet-tile.d.ts +2 -2
  200. package/dist/components/grok-mark.d.ts +26 -0
  201. package/dist/components/human-input-form.d.ts +28 -32
  202. package/dist/components/human-input-surface.d.ts +7 -2
  203. package/dist/components/linkified-text.d.ts +18 -0
  204. package/dist/components/machine-input-display.d.ts +22 -1
  205. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  206. package/dist/components/machines/machine-detail.d.ts +7 -1
  207. package/dist/components/machines/machine-status.d.ts +48 -0
  208. package/dist/components/markdown-table-layout.d.ts +18 -0
  209. package/dist/components/markdown.d.ts +37 -4
  210. package/dist/components/message-timeline.d.ts +86 -7
  211. package/dist/components/model-mark.d.ts +29 -0
  212. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  213. package/dist/components/model-policy-picker.d.ts +41 -25
  214. package/dist/components/new-conversation.d.ts +32 -0
  215. package/dist/components/open-geni-chat.d.ts +73 -0
  216. package/dist/components/open-geni-links.d.ts +68 -0
  217. package/dist/components/openrouter-mark.d.ts +6 -0
  218. package/dist/components/opper-mark.d.ts +7 -0
  219. package/dist/components/preview-loading.d.ts +2 -0
  220. package/dist/components/provider-recovery-notice.d.ts +16 -0
  221. package/dist/components/queue-item-content.d.ts +9 -0
  222. package/dist/components/rehype-secret-refs.d.ts +23 -0
  223. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  224. package/dist/components/sandbox-files.d.ts +3 -1
  225. package/dist/components/sandbox-workspace.d.ts +18 -0
  226. package/dist/components/secret-question-field.d.ts +31 -0
  227. package/dist/components/secret-ref-chip.d.ts +35 -0
  228. package/dist/components/session-capability-frame.d.ts +37 -0
  229. package/dist/components/session-chrome.d.ts +57 -8
  230. package/dist/components/session-commands-panel.d.ts +6 -0
  231. package/dist/components/session-commands.d.ts +6 -0
  232. package/dist/components/session-connection-request.d.ts +8 -0
  233. package/dist/components/session-conversation.d.ts +157 -0
  234. package/dist/components/session-list.d.ts +39 -0
  235. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  236. package/dist/components/session-proxy-scope.d.ts +35 -0
  237. package/dist/components/session-status.d.ts +4 -1
  238. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  239. package/dist/components/timeline-anchor.d.ts +24 -0
  240. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  241. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  242. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  243. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  244. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  245. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  246. package/dist/components/timeline-annotations.d.ts +13 -3
  247. package/dist/components/timeline-reading-progress.d.ts +11 -0
  248. package/dist/components/timeline-search.d.ts +34 -0
  249. package/dist/components/timeline-settlement.d.ts +16 -0
  250. package/dist/components/tip-follow.d.ts +16 -0
  251. package/dist/components/tool-action-review.d.ts +47 -0
  252. package/dist/components/tool-review-history.d.ts +25 -0
  253. package/dist/components/usage-limit-notice.d.ts +49 -0
  254. package/dist/components/usage-member-list.d.ts +91 -0
  255. package/dist/components/usage-meter.d.ts +73 -0
  256. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  257. package/dist/components/user-message-body.d.ts +10 -1
  258. package/dist/composer-messages.d.ts +74 -0
  259. package/dist/composer-messages.js +9 -0
  260. package/dist/composer-messages.js.map +1 -0
  261. package/dist/composer-voice-events.d.ts +8 -0
  262. package/dist/composer.d.ts +5 -4
  263. package/dist/composer.js +26 -13
  264. package/dist/computer-viewer-GMLDXPON.js +20 -0
  265. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  266. package/dist/connect-account-identity.d.ts +8 -0
  267. package/dist/connect-accounts.d.ts +15 -0
  268. package/dist/connect-chooser.d.ts +18 -0
  269. package/dist/connect-panel.d.ts +18 -0
  270. package/dist/connect-setup.d.ts +18 -0
  271. package/dist/connect.d.ts +21 -0
  272. package/dist/connect.js +2149 -0
  273. package/dist/connect.js.map +1 -0
  274. package/dist/connection-catalog.d.ts +38 -0
  275. package/dist/connection-discovery.d.ts +12 -0
  276. package/dist/connection-installed.d.ts +17 -0
  277. package/dist/connection-logo.d.ts +9 -0
  278. package/dist/connection-service-logo.d.ts +8 -0
  279. package/dist/connection-service-presentation.d.ts +13 -0
  280. package/dist/connection-skeleton.d.ts +5 -0
  281. package/dist/connection-type-picker.d.ts +6 -0
  282. package/dist/conversation-timeline.d.ts +5 -0
  283. package/dist/desktop.d.ts +7 -0
  284. package/dist/desktop.js +27 -0
  285. package/dist/desktop.js.map +1 -0
  286. package/dist/device-authorization.d.ts +23 -0
  287. package/dist/diffs.d.ts +8 -0
  288. package/dist/diffs.js +15 -0
  289. package/dist/diffs.js.map +1 -0
  290. package/dist/discovery-cache.d.ts +5 -0
  291. package/dist/editor.d.ts +7 -0
  292. package/dist/editor.js +22 -0
  293. package/dist/editor.js.map +1 -0
  294. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  295. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  296. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  297. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  298. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  299. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  300. package/dist/hooks/latest-question.d.ts +25 -0
  301. package/dist/hooks/shared-machines-list.d.ts +4 -0
  302. package/dist/hooks/shared-query.d.ts +113 -0
  303. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  304. package/dist/hooks/use-auth-runs.d.ts +1 -4
  305. package/dist/hooks/use-available-models.d.ts +1 -1
  306. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  307. package/dist/hooks/use-browser-session.d.ts +12 -1
  308. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  309. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  310. package/dist/hooks/use-composer.d.ts +24 -2
  311. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  312. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  313. package/dist/hooks/use-computer-session.d.ts +4 -0
  314. package/dist/hooks/use-connect.d.ts +23 -0
  315. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  316. package/dist/hooks/use-file-attachments.d.ts +12 -0
  317. package/dist/hooks/use-goal.d.ts +2 -1
  318. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  319. package/dist/hooks/use-new-conversation.d.ts +56 -0
  320. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  321. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  322. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  323. package/dist/hooks/use-session-conversation.d.ts +49 -0
  324. package/dist/hooks/use-session-events.d.ts +28 -7
  325. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  326. package/dist/hooks/use-session-model-account.d.ts +48 -0
  327. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  328. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  329. package/dist/hooks/use-usage.d.ts +40 -0
  330. package/dist/hooks/use-vaults.d.ts +53 -0
  331. package/dist/hooks/use-voice-input.d.ts +8 -1
  332. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  333. package/dist/hooks/use-workspace-sessions.d.ts +22 -5
  334. package/dist/human-input-model.d.ts +122 -0
  335. package/dist/identity-link-accounts.d.ts +11 -0
  336. package/dist/identity-link-consent.d.ts +18 -0
  337. package/dist/index.d.ts +82 -20
  338. package/dist/index.js +2350 -6605
  339. package/dist/index.js.map +1 -1
  340. package/dist/interaction.d.ts +1 -1
  341. package/dist/interaction.js +14 -24
  342. package/dist/interaction.js.map +1 -1
  343. package/dist/latest-question-R77KWSUP.js +118 -0
  344. package/dist/latest-question-R77KWSUP.js.map +1 -0
  345. package/dist/lib/clipboard.d.ts +7 -0
  346. package/dist/lib/error-message.d.ts +7 -0
  347. package/dist/lib/format.d.ts +58 -4
  348. package/dist/lib/host-theme.d.ts +77 -0
  349. package/dist/lib/interaction-errors.d.ts +3 -0
  350. package/dist/lib/menu-styles.d.ts +22 -0
  351. package/dist/lib/notify-observer.d.ts +2 -0
  352. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  353. package/dist/lib/provider-recovery.d.ts +55 -0
  354. package/dist/lib/scrollbars.d.ts +11 -0
  355. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  356. package/dist/lib/transient-retry.d.ts +25 -0
  357. package/dist/lib/workbench-peers.d.ts +36 -0
  358. package/dist/lib/xterm-theme.d.ts +7 -5
  359. package/dist/machines.js +9 -5
  360. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  361. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  362. package/dist/mcp-connection-status.d.ts +14 -0
  363. package/dist/model-mark-paths.d.ts +34 -0
  364. package/dist/model-mark-paths.js +16 -0
  365. package/dist/model-mark-paths.js.map +1 -0
  366. package/dist/model-picker-model.d.ts +111 -0
  367. package/dist/model-picker-model.js +25 -0
  368. package/dist/model-picker-model.js.map +1 -0
  369. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  370. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  371. package/dist/model-policy.d.ts +30 -3
  372. package/dist/model-policy.js +14 -1
  373. package/dist/native-previews.d.ts +28 -0
  374. package/dist/native-previews.js +82 -0
  375. package/dist/native-previews.js.map +1 -0
  376. package/dist/new-session-draft.d.ts +7 -0
  377. package/dist/new-session-draft.js +639 -0
  378. package/dist/new-session-draft.js.map +1 -0
  379. package/dist/notification-text.d.ts +27 -0
  380. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  381. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  382. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  383. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  384. package/dist/older-history.d.ts +3 -2
  385. package/dist/organization-model.d.ts +32 -0
  386. package/dist/organization-model.js +65 -0
  387. package/dist/organization-model.js.map +1 -0
  388. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  389. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  390. package/dist/plugin-details.d.ts +14 -0
  391. package/dist/plugin-discovery.d.ts +25 -0
  392. package/dist/preview-loading-paint.d.ts +20 -0
  393. package/dist/provider.d.ts +25 -2
  394. package/dist/queue-presentation-model.d.ts +72 -0
  395. package/dist/queue-presentation-model.js +38 -0
  396. package/dist/queue-presentation-model.js.map +1 -0
  397. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  398. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  399. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  400. package/dist/realtime/embedded-voice.d.ts +1 -0
  401. package/dist/realtime/realtime-control.d.ts +4 -65
  402. package/dist/realtime/session-realtime.d.ts +78 -0
  403. package/dist/realtime.js +25 -1294
  404. package/dist/realtime.js.map +1 -1
  405. package/dist/sandbox-files-O27IPOZW.js +21 -0
  406. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  407. package/dist/sandbox-label-model.d.ts +30 -0
  408. package/dist/sandbox-label-model.js +20 -0
  409. package/dist/sandbox-label-model.js.map +1 -0
  410. package/dist/scrollbars.d.ts +1 -0
  411. package/dist/scrollbars.js +10 -0
  412. package/dist/scrollbars.js.map +1 -0
  413. package/dist/secret-reference-label.d.ts +14 -0
  414. package/dist/secrets-ui.d.ts +57 -0
  415. package/dist/session-agents-model.d.ts +10 -0
  416. package/dist/session-agents-model.js +25 -0
  417. package/dist/session-agents-model.js.map +1 -0
  418. package/dist/session-attention-model.d.ts +8 -0
  419. package/dist/session-attention-model.js +47 -0
  420. package/dist/session-attention-model.js.map +1 -0
  421. package/dist/session-auth-recommendation.d.ts +5 -0
  422. package/dist/session-capability-policy.d.ts +31 -0
  423. package/dist/session-feedback-model.d.ts +20 -0
  424. package/dist/session-feedback-model.js +56 -0
  425. package/dist/session-feedback-model.js.map +1 -0
  426. package/dist/session-list-model.d.ts +138 -0
  427. package/dist/session-list-model.js +274 -0
  428. package/dist/session-list-model.js.map +1 -0
  429. package/dist/session-realtime-7DJOIHQW.js +21 -0
  430. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  431. package/dist/session-realtime.d.ts +7 -0
  432. package/dist/session-realtime.js +19 -0
  433. package/dist/session-realtime.js.map +1 -0
  434. package/dist/session-status-model.d.ts +36 -0
  435. package/dist/session-ui.d.ts +39 -1
  436. package/dist/session-ui.js +126 -12
  437. package/dist/session-ui.js.map +1 -1
  438. package/dist/session.d.ts +8 -2
  439. package/dist/session.js +35 -20
  440. package/dist/site-snapshot.d.ts +14 -0
  441. package/dist/sites-ui.d.ts +24 -0
  442. package/dist/sites.d.ts +3 -0
  443. package/dist/sites.js +14 -0
  444. package/dist/sites.js.map +1 -0
  445. package/dist/skill-discovery.d.ts +47 -0
  446. package/dist/terminal.d.ts +8 -0
  447. package/dist/terminal.js +32 -0
  448. package/dist/terminal.js.map +1 -0
  449. package/dist/testing/session-scenarios.d.ts +10 -0
  450. package/dist/testing/session-scenarios.js +367 -0
  451. package/dist/testing/session-scenarios.js.map +1 -0
  452. package/dist/timeline/activity-rail.d.ts +11 -2
  453. package/dist/timeline/agent-identity.d.ts +30 -0
  454. package/dist/timeline/agent-row.d.ts +31 -0
  455. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  456. package/dist/timeline/compaction-copy.d.ts +46 -0
  457. package/dist/timeline/entrance.d.ts +13 -1
  458. package/dist/timeline/focus-sequence.d.ts +9 -0
  459. package/dist/timeline/genie-copy.d.ts +3 -0
  460. package/dist/timeline/genie-loading.d.ts +47 -0
  461. package/dist/timeline/index.d.ts +10 -5
  462. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  463. package/dist/timeline/message-sender.d.ts +19 -0
  464. package/dist/timeline/notice-presentation.d.ts +13 -0
  465. package/dist/timeline/parsers.d.ts +11 -0
  466. package/dist/timeline/patch-apply-command.d.ts +18 -0
  467. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  468. package/dist/timeline/platform-activity-row.d.ts +1 -2
  469. package/dist/timeline/presented-image.d.ts +11 -0
  470. package/dist/timeline/projection.d.ts +31 -2
  471. package/dist/timeline/provider-logo.d.ts +15 -0
  472. package/dist/timeline/question-nav-model.d.ts +23 -0
  473. package/dist/timeline/registry.d.ts +12 -1
  474. package/dist/timeline/retained-image.d.ts +18 -0
  475. package/dist/timeline/retained-loaders.d.ts +27 -0
  476. package/dist/timeline/rolling-activity.d.ts +11 -0
  477. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  478. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  479. package/dist/timeline/shared.d.ts +4 -1
  480. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  481. package/dist/timeline/startup-preference.d.ts +3 -0
  482. package/dist/timeline/startup-timings.d.ts +4 -0
  483. package/dist/timeline/tool-display-name.d.ts +5 -2
  484. package/dist/timeline/tool-presentation.d.ts +172 -0
  485. package/dist/timeline/turn-summary-model.d.ts +95 -0
  486. package/dist/timeline/turn-summary.d.ts +20 -54
  487. package/dist/timeline/types.d.ts +179 -7
  488. package/dist/timeline/work-presentation.d.ts +60 -0
  489. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  490. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  491. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  492. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  493. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  494. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  495. package/dist/timeline-model.d.ts +29 -0
  496. package/dist/timeline-model.js +254 -0
  497. package/dist/timeline-model.js.map +1 -0
  498. package/dist/usage/allowance-copy.d.ts +25 -0
  499. package/dist/usage/session-usage-limit.d.ts +88 -0
  500. package/dist/usage/summary.d.ts +35 -0
  501. package/dist/usage.d.ts +17 -0
  502. package/dist/usage.js +1187 -0
  503. package/dist/usage.js.map +1 -0
  504. package/dist/voice-recording-owner.d.ts +7 -0
  505. package/package.json +107 -7
  506. package/src/accounts.tsx +116 -14
  507. package/src/approvals.ts +8 -1
  508. package/src/artifacts-spreadsheet.ts +1 -0
  509. package/src/artifacts.ts +44 -0
  510. package/src/assets/README.md +8 -0
  511. package/src/assets/gmail.ico +0 -0
  512. package/src/assets/outlook.ico +0 -0
  513. package/src/capability-catalog-row.tsx +94 -0
  514. package/src/capability-logo-fallback.ts +22 -0
  515. package/src/client.ts +20 -31
  516. package/src/commands/registry.ts +18 -15
  517. package/src/commands/types.ts +2 -0
  518. package/src/components/anthropic-mark.tsx +10 -0
  519. package/src/components/approval-surface.tsx +401 -138
  520. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  521. package/src/components/artifacts/artifact-sandbox.tsx +189 -0
  522. package/src/components/artifacts/artifact-surface.tsx +40 -20
  523. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  524. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  525. package/src/components/artifacts/document-editor.tsx +141 -16
  526. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  527. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  528. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  529. package/src/components/artifacts/editable-document.tsx +37 -36
  530. package/src/components/artifacts/editable-presentation.tsx +36 -18
  531. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  532. package/src/components/artifacts/index.ts +45 -0
  533. package/src/components/artifacts/inline-html-document.ts +24 -0
  534. package/src/components/artifacts/latest-task-runner.ts +49 -0
  535. package/src/components/artifacts/presentation-editor.tsx +323 -67
  536. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  537. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  538. package/src/components/artifacts/site-view.tsx +121 -0
  539. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  540. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  541. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  542. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  543. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  544. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  545. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  546. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  547. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  548. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  549. package/src/components/browser-select-control.tsx +312 -0
  550. package/src/components/browser-viewer.tsx +778 -318
  551. package/src/components/chat-composer.tsx +47 -5
  552. package/src/components/child-session-link.tsx +36 -0
  553. package/src/components/claude-mark.tsx +11 -0
  554. package/src/components/code-editor.tsx +13 -16
  555. package/src/components/composer-transcription-control.tsx +128 -30
  556. package/src/components/composer.tsx +404 -195
  557. package/src/components/computer-viewer.tsx +880 -253
  558. package/src/components/copy-button.tsx +13 -5
  559. package/src/components/desktop-viewer.tsx +1 -1
  560. package/src/components/enrollment-consent.tsx +1 -1
  561. package/src/components/enrollment-device-flow.tsx +1 -1
  562. package/src/components/file-browser.tsx +10 -14
  563. package/src/components/fleet-tile.tsx +9 -18
  564. package/src/components/generated-video-player.tsx +4 -2
  565. package/src/components/grok-mark.tsx +34 -0
  566. package/src/components/human-input-form.tsx +590 -283
  567. package/src/components/human-input-surface.tsx +11 -0
  568. package/src/components/interaction-intervention-banner.tsx +2 -2
  569. package/src/components/linkified-text.tsx +79 -0
  570. package/src/components/machine-card.tsx +35 -78
  571. package/src/components/machine-dock-bar.tsx +1 -1
  572. package/src/components/machine-input-display.ts +197 -3
  573. package/src/components/machines/agent-status-icon.tsx +31 -0
  574. package/src/components/machines/machine-detail.tsx +200 -31
  575. package/src/components/machines/machine-operation-policy.tsx +1 -1
  576. package/src/components/machines/machine-status.ts +241 -0
  577. package/src/components/machines-dashboard.tsx +2 -17
  578. package/src/components/markdown-table-layout.ts +143 -0
  579. package/src/components/markdown.tsx +466 -129
  580. package/src/components/message-timeline.tsx +2567 -728
  581. package/src/components/model-mark.tsx +102 -0
  582. package/src/components/model-picker.tsx +15 -4
  583. package/src/components/model-policy-picker-menu.tsx +371 -0
  584. package/src/components/model-policy-picker.tsx +256 -412
  585. package/src/components/new-conversation.tsx +221 -0
  586. package/src/components/open-geni-chat.tsx +309 -0
  587. package/src/components/open-geni-links.tsx +179 -0
  588. package/src/components/openrouter-mark.tsx +13 -0
  589. package/src/components/opper-mark.tsx +18 -0
  590. package/src/components/pierre-diff.tsx +41 -16
  591. package/src/components/pierre-file.tsx +35 -10
  592. package/src/components/preview-loading.tsx +109 -0
  593. package/src/components/provider-recovery-notice.tsx +49 -0
  594. package/src/components/queue-item-content.ts +14 -0
  595. package/src/components/queue-surface-implementation.tsx +51 -356
  596. package/src/components/queue-surface-state.tsx +3 -1
  597. package/src/components/rehype-secret-refs.ts +98 -0
  598. package/src/components/remark-soft-line-breaks.ts +166 -0
  599. package/src/components/sandbox-files.tsx +91 -15
  600. package/src/components/sandbox-terminal.tsx +84 -13
  601. package/src/components/sandbox-workspace.tsx +147 -51
  602. package/src/components/secret-question-field.tsx +324 -0
  603. package/src/components/secret-ref-chip.tsx +185 -0
  604. package/src/components/session-capability-frame.tsx +197 -0
  605. package/src/components/session-chrome.tsx +842 -251
  606. package/src/components/session-commands-panel.tsx +126 -0
  607. package/src/components/session-commands.tsx +18 -0
  608. package/src/components/session-connection-request.tsx +97 -0
  609. package/src/components/session-conversation.tsx +876 -0
  610. package/src/components/session-list.tsx +257 -0
  611. package/src/components/session-mcp-capability-card.tsx +680 -0
  612. package/src/components/session-proxy-scope.tsx +153 -0
  613. package/src/components/session-status.tsx +26 -17
  614. package/src/components/session-usage-limit-notice.tsx +174 -0
  615. package/src/components/timeline-anchor.tsx +119 -0
  616. package/src/components/timeline-annotation-chrome.tsx +196 -0
  617. package/src/components/timeline-annotation-layout.ts +268 -0
  618. package/src/components/timeline-annotation-markers.tsx +185 -0
  619. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  620. package/src/components/timeline-annotation-selection.tsx +106 -54
  621. package/src/components/timeline-annotation-shared.ts +245 -0
  622. package/src/components/timeline-annotations-dialog.tsx +185 -128
  623. package/src/components/timeline-annotations.tsx +189 -45
  624. package/src/components/timeline-reading-progress.ts +80 -0
  625. package/src/components/timeline-search.tsx +168 -0
  626. package/src/components/timeline-settlement.ts +60 -0
  627. package/src/components/tip-follow.ts +52 -0
  628. package/src/components/tool-action-review.tsx +650 -0
  629. package/src/components/tool-review-history.tsx +88 -0
  630. package/src/components/tooltip.tsx +38 -5
  631. package/src/components/usage-limit-notice.tsx +179 -0
  632. package/src/components/usage-member-list.tsx +792 -0
  633. package/src/components/usage-meter.tsx +382 -0
  634. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  635. package/src/components/user-message-body.tsx +27 -2
  636. package/src/components/workspace-dock.tsx +18 -1
  637. package/src/composer-messages.ts +150 -0
  638. package/src/composer-voice-events.ts +12 -0
  639. package/src/composer.ts +6 -1
  640. package/src/connect-account-identity.tsx +34 -0
  641. package/src/connect-accounts.tsx +233 -0
  642. package/src/connect-chooser.tsx +336 -0
  643. package/src/connect-panel.tsx +99 -0
  644. package/src/connect-setup.tsx +355 -0
  645. package/src/connect.ts +60 -0
  646. package/src/connection-assets.d.ts +4 -0
  647. package/src/connection-catalog.tsx +162 -0
  648. package/src/connection-discovery.tsx +238 -0
  649. package/src/connection-installed.tsx +51 -0
  650. package/src/connection-logo.tsx +37 -0
  651. package/src/connection-service-logo.tsx +55 -0
  652. package/src/connection-service-presentation.ts +46 -0
  653. package/src/connection-skeleton.tsx +16 -0
  654. package/src/connection-type-picker.tsx +36 -0
  655. package/src/conversation-timeline.ts +92 -0
  656. package/src/desktop.ts +24 -0
  657. package/src/device-authorization.tsx +98 -0
  658. package/src/diffs.ts +16 -0
  659. package/src/discovery-cache.ts +42 -0
  660. package/src/editor.ts +13 -0
  661. package/src/hooks/internal.ts +3 -2
  662. package/src/hooks/latest-question.ts +164 -0
  663. package/src/hooks/shared-machines-list.ts +34 -1
  664. package/src/hooks/shared-query.ts +721 -0
  665. package/src/hooks/use-attached-browsers.ts +1 -1
  666. package/src/hooks/use-auth-runs.ts +0 -27
  667. package/src/hooks/use-available-models.ts +21 -15
  668. package/src/hooks/use-browser-frame-stream.ts +19 -2
  669. package/src/hooks/use-browser-session.ts +680 -205
  670. package/src/hooks/use-browser-sessions.ts +32 -1
  671. package/src/hooks/use-client-config-flags.ts +118 -0
  672. package/src/hooks/use-codex-accounts.ts +247 -47
  673. package/src/hooks/use-composer.ts +276 -47
  674. package/src/hooks/use-computer-frame-stream.ts +25 -7
  675. package/src/hooks/use-computer-input-posture.ts +94 -0
  676. package/src/hooks/use-computer-session.ts +409 -95
  677. package/src/hooks/use-connect.ts +23 -0
  678. package/src/hooks/use-desktop-stream.ts +19 -28
  679. package/src/hooks/use-file-attachments.ts +80 -4
  680. package/src/hooks/use-goal.ts +107 -13
  681. package/src/hooks/use-last-started-turn-policy.ts +46 -14
  682. package/src/hooks/use-machines.ts +4 -0
  683. package/src/hooks/use-new-conversation.ts +374 -0
  684. package/src/hooks/use-new-session-draft.ts +813 -0
  685. package/src/hooks/use-realtime-voice-models.ts +46 -0
  686. package/src/hooks/use-sandbox-files.ts +68 -20
  687. package/src/hooks/use-session-background-commands.ts +22 -11
  688. package/src/hooks/use-session-capabilities.ts +3 -2
  689. package/src/hooks/use-session-conversation.ts +150 -0
  690. package/src/hooks/use-session-events.ts +703 -382
  691. package/src/hooks/use-session-lineage.ts +20 -16
  692. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  693. package/src/hooks/use-session-model-account.ts +174 -0
  694. package/src/hooks/use-session.ts +53 -21
  695. package/src/hooks/use-slash-commands.ts +6 -11
  696. package/src/hooks/use-supergrok-accounts.ts +22 -8
  697. package/src/hooks/use-terminal-stream.ts +153 -27
  698. package/src/hooks/use-transcription.ts +6 -0
  699. package/src/hooks/use-turn-queue.ts +2 -1
  700. package/src/hooks/use-usage.ts +100 -0
  701. package/src/hooks/use-vaults.ts +153 -0
  702. package/src/hooks/use-video-artifact-playback.ts +1 -1
  703. package/src/hooks/use-voice-input.ts +127 -19
  704. package/src/hooks/use-workspace-capture.ts +3 -2
  705. package/src/hooks/use-workspace-edit.ts +23 -5
  706. package/src/hooks/use-workspace-sessions.ts +97 -32
  707. package/src/human-input-model.ts +359 -0
  708. package/src/identity-link-accounts.tsx +148 -0
  709. package/src/identity-link-consent.tsx +192 -0
  710. package/src/index.ts +262 -16
  711. package/src/interaction.ts +1 -0
  712. package/src/lib/clipboard.ts +29 -0
  713. package/src/lib/error-message.ts +37 -0
  714. package/src/lib/format.ts +213 -16
  715. package/src/lib/host-theme.ts +529 -0
  716. package/src/lib/interaction-errors.ts +15 -0
  717. package/src/lib/menu-styles.ts +44 -0
  718. package/src/lib/notify-observer.ts +15 -0
  719. package/src/lib/pierre-diffs-loader.ts +53 -0
  720. package/src/lib/provider-recovery.ts +243 -0
  721. package/src/lib/scrollbars.ts +30 -0
  722. package/src/lib/terminal-input-readiness.ts +51 -0
  723. package/src/lib/transient-retry.ts +99 -0
  724. package/src/lib/workbench-peers.ts +62 -0
  725. package/src/lib/xterm-theme.ts +23 -21
  726. package/src/mcp-connection-status.ts +35 -0
  727. package/src/model-mark-paths.ts +53 -0
  728. package/src/model-picker-model.ts +330 -0
  729. package/src/model-policy.ts +299 -74
  730. package/src/native-previews.ts +100 -0
  731. package/src/new-session-draft.ts +22 -0
  732. package/src/notification-text.ts +81 -0
  733. package/src/older-history.ts +22 -4
  734. package/src/organization-model.ts +118 -0
  735. package/src/plugin-details.tsx +185 -0
  736. package/src/plugin-discovery.tsx +196 -0
  737. package/src/preview-loading-paint.ts +68 -0
  738. package/src/provider.tsx +74 -15
  739. package/src/queue-presentation-model.ts +464 -0
  740. package/src/realtime/dropdown-menu.tsx +19 -12
  741. package/src/realtime/embedded-new-voice.tsx +1 -0
  742. package/src/realtime/embedded-voice.tsx +3 -0
  743. package/src/realtime/realtime-control.tsx +138 -501
  744. package/src/realtime/session-realtime.ts +566 -0
  745. package/src/sandbox-label-model.ts +53 -0
  746. package/src/scrollbars.ts +3 -0
  747. package/src/secret-reference-label.ts +43 -0
  748. package/src/secrets-ui.tsx +59 -0
  749. package/src/session-agents-model.ts +33 -0
  750. package/src/session-attention-model.ts +62 -0
  751. package/src/session-auth-recommendation.ts +48 -0
  752. package/src/session-capability-policy.ts +196 -0
  753. package/src/session-context.ts +3 -4
  754. package/src/session-feedback-model.ts +95 -0
  755. package/src/session-list-model.ts +434 -0
  756. package/src/session-realtime.ts +18 -0
  757. package/src/session-status-model.ts +99 -0
  758. package/src/session-ui.ts +98 -1
  759. package/src/session.ts +17 -1
  760. package/src/site-snapshot.ts +74 -0
  761. package/src/sites-ui.tsx +348 -0
  762. package/src/sites.ts +3 -0
  763. package/src/skill-discovery.tsx +208 -0
  764. package/src/terminal.ts +26 -0
  765. package/src/testing/session-scenarios.ts +404 -0
  766. package/src/timeline/activity-rail.tsx +242 -101
  767. package/src/timeline/agent-identity.tsx +84 -0
  768. package/src/timeline/agent-row.tsx +231 -0
  769. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  770. package/src/timeline/compaction-copy.ts +115 -0
  771. package/src/timeline/entrance.tsx +28 -3
  772. package/src/timeline/fleet-decision-projection.ts +2 -1
  773. package/src/timeline/fleet-decision-row.tsx +1 -0
  774. package/src/timeline/focus-sequence.ts +44 -0
  775. package/src/timeline/genie-copy.ts +19 -0
  776. package/src/timeline/genie-loading.tsx +143 -0
  777. package/src/timeline/index.ts +30 -2
  778. package/src/timeline/knowledge-receipt.tsx +100 -0
  779. package/src/timeline/message-sender.tsx +71 -0
  780. package/src/timeline/notice-presentation.ts +48 -0
  781. package/src/timeline/parsers.ts +42 -2
  782. package/src/timeline/patch-apply-command.tsx +135 -0
  783. package/src/timeline/platform-activity-presentation.ts +166 -0
  784. package/src/timeline/platform-activity-row.tsx +15 -90
  785. package/src/timeline/presented-image.ts +63 -0
  786. package/src/timeline/projection.ts +1746 -76
  787. package/src/timeline/provider-logo.tsx +53 -0
  788. package/src/timeline/question-nav-model.ts +28 -0
  789. package/src/timeline/registry.ts +26 -4
  790. package/src/timeline/retained-image.ts +97 -0
  791. package/src/timeline/retained-loaders.ts +91 -0
  792. package/src/timeline/rolling-activity.tsx +80 -0
  793. package/src/timeline/screenshot-lightbox.tsx +228 -5
  794. package/src/timeline/session-usage-limit-row.tsx +42 -0
  795. package/src/timeline/shared.tsx +42 -15
  796. package/src/timeline/startup-dispatch-details.tsx +36 -0
  797. package/src/timeline/startup-preference.ts +33 -0
  798. package/src/timeline/startup-timings.tsx +145 -0
  799. package/src/timeline/tool-display-name.ts +19 -7
  800. package/src/timeline/tool-presentation.ts +1316 -0
  801. package/src/timeline/tool-renderers.tsx +835 -1138
  802. package/src/timeline/turn-summary-model.ts +343 -0
  803. package/src/timeline/turn-summary.tsx +272 -365
  804. package/src/timeline/types.ts +189 -6
  805. package/src/timeline/work-presentation.ts +189 -0
  806. package/src/timeline-model.ts +143 -0
  807. package/src/usage/allowance-copy.ts +64 -0
  808. package/src/usage/session-usage-limit.ts +266 -0
  809. package/src/usage/summary.ts +93 -0
  810. package/src/usage.ts +70 -0
  811. package/src/voice-recording-owner.ts +22 -0
  812. package/styles/compiled.css +2319 -748
  813. package/styles/connect.css +290 -0
  814. package/styles/connect.d.ts +1 -0
  815. package/styles/effective-tokens.css +1 -0
  816. package/styles/index.css +309 -9
  817. package/styles/responsive.css +99 -7
  818. package/styles/session-capability.css +44 -0
  819. package/styles/tokens.css +134 -66
  820. package/dist/browser-viewer-AEFHUYZK.js +0 -14
  821. package/dist/chunk-4MDLEHXL.js.map +0 -1
  822. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  823. package/dist/chunk-D3UIAJKY.js.map +0 -1
  824. package/dist/chunk-ELIYWBZR.js.map +0 -1
  825. package/dist/chunk-H5YGYNXS.js.map +0 -1
  826. package/dist/chunk-HQVCKCLG.js +0 -9458
  827. package/dist/chunk-HQVCKCLG.js.map +0 -1
  828. package/dist/chunk-HUIKIDM5.js.map +0 -1
  829. package/dist/chunk-ICA6R6TW.js.map +0 -1
  830. package/dist/chunk-JVYQRRC4.js.map +0 -1
  831. package/dist/chunk-KCGXPP5V.js.map +0 -1
  832. package/dist/chunk-KZ73RL76.js.map +0 -1
  833. package/dist/chunk-LAKLF4PA.js +0 -141
  834. package/dist/chunk-LAKLF4PA.js.map +0 -1
  835. package/dist/chunk-MZ2G2XBA.js.map +0 -1
  836. package/dist/chunk-NEXLLTP4.js.map +0 -1
  837. package/dist/chunk-OAM4WAAM.js.map +0 -1
  838. package/dist/chunk-PEI6RANI.js.map +0 -1
  839. package/dist/chunk-RGALCTWO.js.map +0 -1
  840. package/dist/chunk-W6NFJXSA.js +0 -454
  841. package/dist/chunk-W6NFJXSA.js.map +0 -1
  842. package/dist/chunk-WSK7G5LE.js +0 -170
  843. package/dist/chunk-WSK7G5LE.js.map +0 -1
  844. package/dist/chunk-X4A66EWZ.js +0 -223
  845. package/dist/chunk-X4A66EWZ.js.map +0 -1
  846. package/dist/chunk-XXWH2JLC.js.map +0 -1
  847. package/dist/chunk-YFKJ7VZH.js +0 -268
  848. package/dist/chunk-YFKJ7VZH.js.map +0 -1
  849. package/dist/chunk-YJFGAFBD.js.map +0 -1
  850. package/dist/computer-viewer-FWEZISW4.js +0 -16
  851. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  852. package/dist/hooks/use-environments.d.ts +0 -41
  853. package/dist/hooks/use-packs.d.ts +0 -32
  854. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  855. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  856. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  857. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  858. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  859. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  860. package/src/hooks/use-environments.ts +0 -182
  861. package/src/hooks/use-packs.ts +0 -157
  862. /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  863. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
@@ -0,0 +1,23 @@
1
+ import type { ConnectController } from "@opengeni/connect";
2
+ import { useMemo, useSyncExternalStore } from "react";
3
+
4
+ /** Internal consumers import the hook directly so setup surfaces stay lazy. */
5
+ export function useConnect(controller: ConnectController) {
6
+ const snapshot = useSyncExternalStore(
7
+ controller.subscribe,
8
+ controller.getSnapshot,
9
+ controller.getSnapshot,
10
+ );
11
+ const actions = useMemo(
12
+ () => ({
13
+ begin: controller.begin.bind(controller),
14
+ recover: controller.recover.bind(controller),
15
+ refresh: controller.refresh.bind(controller),
16
+ waitForAction: controller.waitForAction.bind(controller),
17
+ advance: controller.advance.bind(controller),
18
+ cancel: controller.cancel.bind(controller),
19
+ }),
20
+ [controller],
21
+ );
22
+ return useMemo(() => ({ ...snapshot, ...actions }), [snapshot, actions]);
23
+ }
@@ -6,7 +6,15 @@ import {
6
6
  type DesktopRfbLike,
7
7
  type DesktopStreamCapability,
8
8
  } from "@opengeni/sdk";
9
- import { type RefObject, useCallback, useEffect, useRef, useState } from "react";
9
+ import {
10
+ type RefObject,
11
+ useCallback,
12
+ useEffect,
13
+ useRef,
14
+ useState,
15
+ useSyncExternalStore,
16
+ } from "react";
17
+ import { desktopViewerPeers } from "../lib/workbench-peers";
10
18
  import { type DesktopWebSocketFactory, useRelayFrameStream } from "./use-relay-frame-stream";
11
19
 
12
20
  export type UseDesktopStreamOptions = {
@@ -17,7 +25,7 @@ export type UseDesktopStreamOptions = {
17
25
  /** Read-only by default (v1 ruling H). interactive only when cap.mode allows. */
18
26
  interactive?: boolean | undefined;
19
27
  scaleViewport?: boolean | undefined;
20
- /** Custom RFB factory (tests / a WebRTC swap). Defaults to a lazy @novnc/novnc. */
28
+ /** Custom RFB factory. Otherwise call enableDesktopViewer() on the desktop subpath. */
21
29
  rfbFactory?: DesktopRfbFactory | undefined;
22
30
  /** Additional WebSocket protocols for an authenticated placement proxy. */
23
31
  webSocketProtocols?: string[] | undefined;
@@ -35,29 +43,6 @@ export type UseDesktopStreamResult = {
35
43
  sendKey?: ((keysym: number, code: string, down?: boolean) => boolean) | undefined;
36
44
  };
37
45
 
38
- /** Lazy-load @novnc/novnc's RFB as the default factory. Imported inside the
39
- * connect effect so SSR / non-desktop bundles never pull the DOM-only lib.
40
- * @novnc/novnc ships no types and a single `export default class RFB`. The
41
- * specifier is STATIC (`import("@novnc/novnc")`) so Vite can pre-bundle and
42
- * resolve it — a runtime-string indirection with `@vite-ignore` (the previous
43
- * approach) hands the browser a bare specifier and throws
44
- * "Failed to resolve module specifier '@novnc/novnc'". The dynamic form keeps
45
- * it out of the SSR / non-desktop critical path while staying resolvable. */
46
- async function defaultRfbFactory(): Promise<DesktopRfbFactory> {
47
- const mod = (await import("@novnc/novnc")) as unknown as {
48
- default: new (
49
- t: HTMLElement,
50
- u: string,
51
- o: {
52
- credentials?: { password?: string | undefined } | undefined;
53
- wsProtocols?: string[] | undefined;
54
- },
55
- ) => DesktopRfbLike;
56
- };
57
- const RFB = mod.default;
58
- return (target, url, opts) => new RFB(target, url, opts);
59
- }
60
-
61
46
  /**
62
47
  * Drive the noVNC RFB lifecycle from a `DesktopStreamCapability`, using the
63
48
  * SDK's `desktop.ts` reducer + `desktopSocketUrl`. SSR-safe: the RFB import and
@@ -87,6 +72,12 @@ export function useDesktopStream(options: UseDesktopStreamOptions): UseDesktopSt
87
72
  webSocketProtocols,
88
73
  webSocketFactory,
89
74
  } = options;
75
+ const peerRevision = useSyncExternalStore(
76
+ desktopViewerPeers.subscribe,
77
+ desktopViewerPeers.revision,
78
+ desktopViewerPeers.revision,
79
+ );
80
+ const factoryRevision = rfbFactory ? 0 : peerRevision;
90
81
 
91
82
  // The self-hosted PNG-frame path. Always invoked (rules of hooks); dormant
92
83
  // unless `transport === "relay-frames"`, in which case it owns the surface.
@@ -188,7 +179,7 @@ export function useDesktopStream(options: UseDesktopStreamOptions): UseDesktopSt
188
179
 
189
180
  void (async () => {
190
181
  try {
191
- const factory = rfbFactoryRef.current ?? (await defaultRfbFactory());
182
+ const factory = rfbFactoryRef.current ?? (await desktopViewerPeers.load());
192
183
  if (disposed) return;
193
184
  const socketUrl = desktopSocketUrl({ url });
194
185
  setBoth(nextDesktopState(stateRef.current, { type: "negotiated" }));
@@ -232,11 +223,11 @@ export function useDesktopStream(options: UseDesktopStreamOptions): UseDesktopSt
232
223
  };
233
224
  // ONLY a real transport change reconnects: a fresh url (rotation), a new
234
225
  // credential (RFB password OR bearer subprotocol), the transport flipping,
235
- // or an explicit manual reconnect
226
+ // a newly registered default peer loader, or an explicit manual reconnect
236
227
  // (`nonce`). `interactive`/`scaleViewport`/`mode`/`rfbFactory` are read via
237
228
  // refs and applied live below — they must never re-open the socket.
238
229
  // eslint-disable-next-line react-hooks/exhaustive-deps
239
- }, [url, token, transport, webSocketProtocolsKey, nonce]);
230
+ }, [url, token, transport, webSocketProtocolsKey, nonce, factoryRevision]);
240
231
 
241
232
  // Apply take-control / return-control to the OPEN connection in place. noVNC
242
233
  // honours `viewOnly` live, so flipping it neither blinks the surface nor drops
@@ -4,6 +4,7 @@ import {
4
4
  useEmbeddedFileAttachments,
5
5
  type EmbeddedFileAttachmentClientOverride,
6
6
  } from "../session-context";
7
+ import { useErrorMessage } from "../lib/error-message";
7
8
 
8
9
  export type UseFileAttachmentsOptions = EmbeddedFileAttachmentClientOverride & {
9
10
  /**
@@ -13,6 +14,8 @@ export type UseFileAttachmentsOptions = EmbeddedFileAttachmentClientOverride & {
13
14
  * UseFileAttachmentsResult.addFiles} (the explicit picker / drop path)
14
15
  * bypasses it.
15
16
  */
17
+ /** Retain original uploads in the chat owner’s personal scope when private. */
18
+ scope?: "workspace" | "personal";
16
19
  pasteFilter?: ((file: File) => boolean) | undefined;
17
20
  };
18
21
 
@@ -26,7 +29,11 @@ export type FileAttachment = {
26
29
  file?: FileAsset | undefined;
27
30
  /** Object-URL for an inline preview; minted for `image/*` files only. */
28
31
  previewUrl?: string | undefined;
32
+ /** Stable SDK failure code for UI behavior that must not parse error copy. */
33
+ errorCode?: "secure_context_required" | undefined;
29
34
  error?: string | undefined;
35
+ /** Original diagnostic failure; presentation copy is kept separately in `error`. */
36
+ errorCause?: unknown;
30
37
  };
31
38
 
32
39
  export type UseFileAttachmentsResult = {
@@ -50,6 +57,12 @@ export type UseFileAttachmentsResult = {
50
57
  addFromPaste: (event: { clipboardData: DataTransfer | null }) => void;
51
58
  /** Restore already-ready server assets without recreating browser-local bytes. */
52
59
  restoreReadyFiles: (files: Iterable<FileAsset>) => void;
60
+ /**
61
+ * Resolve a ready image's short-lived server preview URL on demand. Optional
62
+ * for upload-only embedded clients; local object-URL previews remain usable
63
+ * without it.
64
+ */
65
+ loadPreview?: ((id: string, signal?: AbortSignal) => Promise<string | undefined>) | undefined;
53
66
  /**
54
67
  * Re-run the upload for a `failed` attachment, in place (same id, same
55
68
  * source file). No-op for an id that isn't a known failed upload.
@@ -76,6 +89,27 @@ export type UseFileAttachmentsResult = {
76
89
 
77
90
  const isImage = (file: File): boolean => file.type.startsWith("image/");
78
91
 
92
+ let fallbackAttachmentId = 0;
93
+
94
+ function createAttachmentId(): string {
95
+ const cryptoSource = globalThis.crypto;
96
+ if (typeof cryptoSource?.randomUUID === "function") return cryptoSource.randomUUID();
97
+ fallbackAttachmentId += 1;
98
+ // This id is only a browser-local React key and retry lookup, never durable
99
+ // authority. Keep attachment tracking usable when HTTP withholds randomUUID
100
+ // or Web Crypto is unavailable so the SDK's typed failure reaches the card.
101
+ return `attachment:${Date.now().toString(36)}:${fallbackAttachmentId.toString(36)}`;
102
+ }
103
+
104
+ function secureContextRequiredErrorCode(error: unknown): "secure_context_required" | undefined {
105
+ return typeof error === "object" &&
106
+ error !== null &&
107
+ "code" in error &&
108
+ error.code === "secure_context_required"
109
+ ? error.code
110
+ : undefined;
111
+ }
112
+
79
113
  /**
80
114
  * Upload-and-track state for files attached to the next message. Owns the
81
115
  * full client-side upload layer: a per-file `uploading | ready | failed`
@@ -89,8 +123,11 @@ export function useFileAttachments(
89
123
  options: UseFileAttachmentsOptions = {},
90
124
  ): UseFileAttachmentsResult {
91
125
  const { client, workspaceId } = useEmbeddedFileAttachments(options);
126
+ const formatError = useErrorMessage();
92
127
  const pasteFilter = options.pasteFilter ?? isImage;
93
128
  const [attachments, setAttachments] = useState<FileAttachment[]>([]);
129
+ const attachmentsRef = useRef(attachments);
130
+ attachmentsRef.current = attachments;
94
131
  // Keep the source File per attachment id so a failed upload can be retried
95
132
  // in place. Cleared on remove/clear so it never outlives its attachment.
96
133
  const sources = useRef<Map<string, File>>(new Map());
@@ -181,6 +218,7 @@ export function useFileAttachments(
181
218
  filename: file.name || "file",
182
219
  contentType: file.type || "application/octet-stream",
183
220
  data: file,
221
+ ...(options.scope ? { scope: options.scope } : {}),
184
222
  })
185
223
  .then((asset) => {
186
224
  if (scopeGeneration.current !== generation) return;
@@ -198,7 +236,9 @@ export function useFileAttachments(
198
236
  name: asset.filename,
199
237
  contentType: asset.contentType,
200
238
  sizeBytes: asset.sizeBytes,
239
+ errorCode: undefined,
201
240
  error: undefined,
241
+ errorCause: undefined,
202
242
  }
203
243
  : attachment,
204
244
  ),
@@ -212,20 +252,22 @@ export function useFileAttachments(
212
252
  ? {
213
253
  ...attachment,
214
254
  status: "failed",
215
- error: error instanceof Error ? error.message : String(error),
255
+ errorCode: secureContextRequiredErrorCode(error),
256
+ error: formatError(error),
257
+ errorCause: error,
216
258
  }
217
259
  : attachment,
218
260
  ),
219
261
  );
220
262
  });
221
263
  },
222
- [client, workspaceId],
264
+ [client, workspaceId, options.scope, formatError],
223
265
  );
224
266
 
225
267
  const addFiles = useCallback(
226
268
  (files: Iterable<File>) => {
227
269
  for (const file of files) {
228
- const id = crypto.randomUUID();
270
+ const id = createAttachmentId();
229
271
  sources.current.set(id, file);
230
272
  const previewUrl = isImage(file) ? URL.createObjectURL(file) : undefined;
231
273
  if (previewUrl) previewUrls.current.set(id, previewUrl);
@@ -255,7 +297,13 @@ export function useFileAttachments(
255
297
  setAttachments((current) =>
256
298
  current.map((attachment) =>
257
299
  attachment.id === id
258
- ? { ...attachment, status: "uploading", error: undefined }
300
+ ? {
301
+ ...attachment,
302
+ status: "uploading",
303
+ errorCode: undefined,
304
+ error: undefined,
305
+ errorCause: undefined,
306
+ }
259
307
  : attachment,
260
308
  ),
261
309
  );
@@ -305,7 +353,9 @@ export function useFileAttachments(
305
353
  sizeBytes: file.sizeBytes,
306
354
  status: "ready",
307
355
  file,
356
+ errorCode: undefined,
308
357
  error: undefined,
358
+ errorCause: undefined,
309
359
  }
310
360
  : {
311
361
  id: `restored:${file.id}`,
@@ -327,6 +377,31 @@ export function useFileAttachments(
327
377
  [workspaceId],
328
378
  );
329
379
 
380
+ const loadPreview = useCallback(
381
+ async (id: string, signal?: AbortSignal): Promise<string | undefined> => {
382
+ const generation = scopeGeneration.current;
383
+ const attachment = attachmentsRef.current.find((candidate) => candidate.id === id);
384
+ const createDownloadUrl = client.createFileDownloadUrl;
385
+ if (
386
+ !attachment ||
387
+ attachment.status !== "ready" ||
388
+ !attachment.file ||
389
+ !attachment.contentType.startsWith("image/") ||
390
+ typeof createDownloadUrl !== "function" ||
391
+ signal?.aborted
392
+ ) {
393
+ return undefined;
394
+ }
395
+ const fileId = attachment.file.id;
396
+ const signed = await createDownloadUrl.call(client, workspaceId, fileId, { signal });
397
+ if (scopeGeneration.current !== generation || signal?.aborted) return undefined;
398
+ const current = attachmentsRef.current.find((candidate) => candidate.id === id);
399
+ if (current?.status !== "ready" || current.file?.id !== fileId) return undefined;
400
+ return signed.url;
401
+ },
402
+ [client, workspaceId],
403
+ );
404
+
330
405
  const remove = useCallback(
331
406
  (id: string) => {
332
407
  sources.current.delete(id);
@@ -368,6 +443,7 @@ export function useFileAttachments(
368
443
  addFiles,
369
444
  addFromPaste,
370
445
  restoreReadyFiles,
446
+ ...(typeof client.createFileDownloadUrl === "function" ? { loadPreview } : {}),
371
447
  retry,
372
448
  retainPreview,
373
449
  remove,
@@ -1,6 +1,7 @@
1
1
  import { OpenGeniApiError, type SessionEvent, type SessionGoal } from "@opengeni/sdk";
2
- import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
3
3
  import { useEmbeddedGoal, type EmbeddedGoalClientOverride } from "../session-context";
4
+ import { normalizeError } from "../lib/error-message";
4
5
  import {
5
6
  useDebouncedCallback,
6
7
  useMutationRunner,
@@ -64,7 +65,8 @@ export type UseGoalResult = {
64
65
  /**
65
66
  * The session's goal: state, the autonomy counters (`autoContinuations`,
66
67
  * `noProgressStreak`), and pause/resume control. A goal-less session yields
67
- * `goal: null` (the 404 is absorbed). Live-updates on goal, turn, session,
68
+ * `goal: null`: read through `findGoal` as a successful null when the client
69
+ * has it, otherwise from an absorbed 404. Live-updates on goal, turn, session,
68
70
  * control, and system-update events — pass `options.events` from
69
71
  * `useSessionEvents` to reuse its stream.
70
72
  */
@@ -83,15 +85,45 @@ export function useGoal(
83
85
  const { run, mutating, mutationError, clearMutationError } = useMutationRunner();
84
86
  const generation = useRef(0);
85
87
  const targetKeyRef = useRef<string | null>(null);
88
+ // True after the server answered that no goal exists. Only a goal event can
89
+ // create a goal, so turn/session traffic must not refetch while none exists.
90
+ const goalAbsentRef = useRef(false);
91
+ // Refresh events not yet covered by a read: "goal" when any was a goal.*
92
+ // event. Events that arrive while a read is in flight are decided when it
93
+ // settles, so the stream's opening burst never re-reads a goal-less session.
94
+ const pendingRefreshRef = useRef<"none" | "refresh" | "goal">("none");
95
+ const sharedEventsRef = useRef(sharedEvents);
96
+ useLayoutEffect(() => {
97
+ sharedEventsRef.current = sharedEvents;
98
+ }, [sharedEvents]);
99
+ const loadAbort = useRef<AbortController | null>(null);
100
+ const scheduleRefreshRef = useRef<() => void>(() => undefined);
101
+
102
+ const retireLoads = useCallback(() => {
103
+ generation.current += 1;
104
+ loadAbort.current?.abort();
105
+ loadAbort.current = null;
106
+ }, []);
86
107
 
87
108
  const load = useCallback(async (): Promise<void> => {
88
109
  if (!sessionId) {
89
110
  return;
90
111
  }
91
112
  const ticket = ++generation.current;
113
+ pendingRefreshRef.current = "none";
114
+ loadAbort.current?.abort();
115
+ const controller = new AbortController();
116
+ loadAbort.current = controller;
92
117
  try {
93
- const fetched = await client.getGoal(workspaceId, sessionId);
118
+ // findGoal reads a goal-less session as a successful null, so no failed
119
+ // request reaches the browser console. Custom clients without it keep
120
+ // getGoal, whose 404 is absorbed below (as it is from older servers).
121
+ const fetched =
122
+ typeof client.findGoal === "function"
123
+ ? await client.findGoal(workspaceId, sessionId, { signal: controller.signal })
124
+ : await client.getGoal(workspaceId, sessionId, { signal: controller.signal });
94
125
  if (ticket === generation.current) {
126
+ goalAbsentRef.current = fetched === null;
95
127
  setGoal(fetched);
96
128
  setError(null);
97
129
  setLoading(false);
@@ -102,30 +134,58 @@ export function useGoal(
102
134
  }
103
135
  if (cause instanceof OpenGeniApiError && cause.status === 404) {
104
136
  // No goal is a normal state, not an error.
137
+ goalAbsentRef.current = true;
105
138
  setGoal(null);
106
139
  setError(null);
107
140
  } else {
108
- setError(cause instanceof Error ? cause : new Error(String(cause)));
141
+ setError(normalizeError(cause));
109
142
  }
110
143
  setLoading(false);
144
+ } finally {
145
+ if (loadAbort.current === controller) loadAbort.current = null;
146
+ }
147
+ if (ticket !== generation.current || pendingRefreshRef.current === "none") {
148
+ return;
111
149
  }
150
+ // Events arrived during this read. A shared feed's first batch reports only
151
+ // its latest match, so a goal.* event behind newer turn traffic is visible
152
+ // only in the log: re-read when its latest goal event is not a clear.
153
+ if (goalAbsentRef.current && pendingRefreshRef.current === "refresh") {
154
+ const events = sharedEventsRef.current ?? [];
155
+ let latestGoalEvent: SessionEvent | undefined;
156
+ for (let index = events.length - 1; index >= 0 && !latestGoalEvent; index -= 1) {
157
+ const event = events[index];
158
+ if (event && isGoalEvent(event)) latestGoalEvent = event;
159
+ }
160
+ if (!latestGoalEvent || latestGoalEvent.type === "goal.cleared") {
161
+ pendingRefreshRef.current = "none";
162
+ return;
163
+ }
164
+ pendingRefreshRef.current = "goal";
165
+ }
166
+ scheduleRefreshRef.current();
112
167
  }, [client, workspaceId, sessionId]);
113
168
 
114
169
  useEffect(() => {
115
170
  const targetKey = `${workspaceId} ${sessionId ?? ""}`;
116
171
  if (targetKeyRef.current !== targetKey) {
117
172
  targetKeyRef.current = targetKey;
173
+ goalAbsentRef.current = false;
174
+ pendingRefreshRef.current = "none";
118
175
  setGoal(null);
119
176
  setError(null);
120
177
  }
121
178
  if (!enabled || !pageLive) {
179
+ retireLoads();
122
180
  setLoading(false);
123
181
  return;
124
182
  }
125
183
  if (sharedFeed) {
126
- setLoading(false);
184
+ // A shared log supplies invalidations, not the authoritative goal snapshot.
185
+ setLoading(true);
186
+ void load();
127
187
  return () => {
128
- generation.current += 1;
188
+ retireLoads();
129
189
  };
130
190
  }
131
191
  setLoading(true);
@@ -133,7 +193,7 @@ export function useGoal(
133
193
  if (pollIntervalMs === undefined || pollIntervalMs <= 0) {
134
194
  void load();
135
195
  return () => {
136
- generation.current += 1;
196
+ retireLoads();
137
197
  };
138
198
  }
139
199
  let cancelled = false;
@@ -149,12 +209,46 @@ export function useGoal(
149
209
  return () => {
150
210
  cancelled = true;
151
211
  if (timer !== null) clearTimeout(timer);
152
- generation.current += 1;
212
+ retireLoads();
153
213
  };
154
- }, [load, enabled, pageLive, workspaceId, sessionId, options.pollIntervalMs, sharedFeed]);
214
+ }, [
215
+ load,
216
+ enabled,
217
+ pageLive,
218
+ workspaceId,
219
+ sessionId,
220
+ options.pollIntervalMs,
221
+ retireLoads,
222
+ sharedFeed,
223
+ ]);
155
224
 
156
- const scheduleRefresh = useDebouncedCallback(() => void load());
157
- useSessionEventTrigger(client, workspaceId, sessionId, isGoalRefreshEvent, scheduleRefresh, {
225
+ const scheduleRefresh = useDebouncedCallback(() => {
226
+ const pending = pendingRefreshRef.current;
227
+ // An in-flight read settles pending events itself.
228
+ if (pending === "none" || loadAbort.current !== null) return;
229
+ if (pending === "refresh" && goalAbsentRef.current) {
230
+ pendingRefreshRef.current = "none";
231
+ return;
232
+ }
233
+ void load();
234
+ });
235
+ useLayoutEffect(() => {
236
+ scheduleRefreshRef.current = scheduleRefresh;
237
+ }, [scheduleRefresh]);
238
+ const isRefreshEvent = useCallback(
239
+ (event: SessionEvent) =>
240
+ goalAbsentRef.current ? isGoalEvent(event) : isGoalRefreshEvent(event),
241
+ [],
242
+ );
243
+ const onRefreshEvent = useCallback(
244
+ (event: SessionEvent) => {
245
+ if (isGoalEvent(event)) pendingRefreshRef.current = "goal";
246
+ else if (pendingRefreshRef.current === "none") pendingRefreshRef.current = "refresh";
247
+ scheduleRefresh();
248
+ },
249
+ [scheduleRefresh],
250
+ );
251
+ useSessionEventTrigger(client, workspaceId, sessionId, isRefreshEvent, onRefreshEvent, {
158
252
  enabled,
159
253
  ...(sharedEvents !== undefined ? { events: sharedEvents } : {}),
160
254
  });
@@ -203,11 +297,11 @@ export function useGoal(
203
297
  return true as const;
204
298
  });
205
299
  if (ok) {
206
- generation.current += 1;
300
+ retireLoads();
207
301
  setGoal(null);
208
302
  setError(null);
209
303
  }
210
- }, [client, workspaceId, sessionId, run]);
304
+ }, [client, workspaceId, sessionId, run, retireLoads]);
211
305
 
212
306
  return {
213
307
  goal,
@@ -1,4 +1,10 @@
1
- import type { LatencyMode, ReasoningEffort, SessionEvent, SessionTurn } from "@opengeni/sdk";
1
+ import type {
2
+ LatencyMode,
3
+ ReasoningEffort,
4
+ SessionEvent,
5
+ SessionTurn,
6
+ SessionModelAccountChoiceResponse,
7
+ } from "@opengeni/sdk";
2
8
  import { useCallback, useEffect } from "react";
3
9
  import { useOpenGeni, type ClientOverride } from "../session-context";
4
10
  import { usePolledValue, useSessionEventTrigger, type SessionEventFeedOptions } from "./internal";
@@ -18,6 +24,8 @@ export type LastStartedTurnPolicy = {
18
24
  export type UseLastStartedTurnPolicyOptions = ClientOverride &
19
25
  SessionEventFeedOptions & {
20
26
  pollIntervalMs?: number | undefined;
27
+ /** Project the last lease-backed serving model without changing the accepted policy. */
28
+ includeServingModel?: boolean | undefined;
21
29
  };
22
30
 
23
31
  export type UseLastStartedTurnPolicyResult = {
@@ -38,6 +46,20 @@ function policyFromTurn(turn: SessionTurn | null | undefined): LastStartedTurnPo
38
46
  };
39
47
  }
40
48
 
49
+ /** Never project an earlier turn's selection onto newly admitted work. */
50
+ export function withServingModel(
51
+ policy: LastStartedTurnPolicy | null,
52
+ serving: SessionModelAccountChoiceResponse["serving"],
53
+ ): LastStartedTurnPolicy | null {
54
+ if (!policy || !serving || serving.turnId !== policy.turnId) return policy;
55
+ return {
56
+ turnId: policy.turnId,
57
+ model: serving.modelId,
58
+ reasoningEffort: serving.reasoningEffort,
59
+ latencyMode: serving.latencyMode,
60
+ };
61
+ }
62
+
41
63
  /**
42
64
  * Model·effort·latency of the newest admitted turn (`turn.started`). This is
43
65
  * historical runtime truth for the session header — not the composer next-turn
@@ -47,25 +69,30 @@ export function useLastStartedTurnPolicy(
47
69
  sessionId: string | null | undefined,
48
70
  options: UseLastStartedTurnPolicyOptions = {},
49
71
  ): UseLastStartedTurnPolicyResult {
50
- const { client, workspaceId, workspaceControlEvent, registerSessionReconciler } =
51
- useOpenGeni(options);
72
+ const { client, workspaceId, registerSessionReconciler } = useOpenGeni(options);
52
73
  const enabled = (options.enabled ?? true) && Boolean(sessionId);
74
+ const includeServingModel = options.includeServingModel === true;
53
75
 
54
- const load = useCallback(async (): Promise<LastStartedTurnPolicy | null> => {
55
- if (!sessionId) return null;
56
- const turns = await client.listTurns(workspaceId, sessionId, { latestStarted: true });
57
- return policyFromTurn(turns[0]);
58
- }, [client, workspaceId, sessionId]);
76
+ const load = useCallback(
77
+ async (signal?: AbortSignal): Promise<LastStartedTurnPolicy | null> => {
78
+ if (!sessionId) return null;
79
+ const turns = await client.listTurns(workspaceId, sessionId, {
80
+ latestStarted: true,
81
+ signal,
82
+ });
83
+ const policy = policyFromTurn(turns[0]);
84
+ if (!includeServingModel || !policy || !client.getSessionModelAccount) return policy;
85
+ const choice = await client.getSessionModelAccount(workspaceId, sessionId);
86
+ return withServingModel(policy, choice.serving);
87
+ },
88
+ [client, workspaceId, sessionId, includeServingModel],
89
+ );
59
90
 
60
91
  const { data, loading, error, refresh } = usePolledValue(load, {
61
92
  pollIntervalMs: options.pollIntervalMs,
62
93
  enabled,
63
94
  });
64
95
 
65
- useEffect(() => {
66
- if (enabled && workspaceControlEvent) void refresh();
67
- }, [enabled, refresh, workspaceControlEvent]);
68
-
69
96
  useEffect(() => {
70
97
  if (!sessionId || !enabled) return;
71
98
  return registerSessionReconciler(sessionId, "last-started-turn-policy", refresh);
@@ -73,12 +100,17 @@ export function useLastStartedTurnPolicy(
73
100
 
74
101
  // Shared-feed only: the session header lives outside the route event log and
75
102
  // must not open a second SSE. Without `events`, rely on the initial fetch +
76
- // optional poll / workspace-control / reconciler.
103
+ // optional poll / reconciler. Pause/resume controls do not change the last
104
+ // admitted turn; its own turn.started event supplies that invalidation.
77
105
  useSessionEventTrigger(
78
106
  client,
79
107
  workspaceId,
80
108
  sessionId,
81
- isLastStartedTurnPolicyEvent,
109
+ (event) =>
110
+ isLastStartedTurnPolicyEvent(event) ||
111
+ (includeServingModel &&
112
+ (event.type === "subscription.account.selected" ||
113
+ event.type === "subscription.account.switched")),
82
114
  () => void refresh(),
83
115
  {
84
116
  events: options.events,
@@ -158,6 +158,10 @@ function swapFailureMessage(result: SwapActiveSandboxResponse): string {
158
158
  return "The selected machine is offline.";
159
159
  case "concurrent_swap":
160
160
  return "The session route changed concurrently. Refresh and try again.";
161
+ case "personal_machine_permission_required":
162
+ return "The machine's owner has not allowed this chat to use it.";
163
+ case "personal_machine_not_permitted":
164
+ return "Only the machine's owner can use it in this chat.";
161
165
  default:
162
166
  return "The session stayed on its current sandbox.";
163
167
  }