@opengeni/react 3.3.2 → 3.4.1-canary.38960406141001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (855) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +2 -0
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/approvals.d.ts +2 -1
  5. package/dist/artifacts-document.js +5 -3
  6. package/dist/artifacts-presentation.js +5 -3
  7. package/dist/artifacts-spreadsheet.d.ts +1 -1
  8. package/dist/artifacts-spreadsheet.js +5 -3
  9. package/dist/artifacts.d.ts +5 -1
  10. package/dist/artifacts.js +536 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-4EUKJXUO.js +14 -0
  16. package/dist/chunk-2DDJ6YH6.js +41 -0
  17. package/dist/chunk-2DDJ6YH6.js.map +1 -0
  18. package/dist/chunk-2HVLQ26H.js +183 -0
  19. package/dist/chunk-2HVLQ26H.js.map +1 -0
  20. package/dist/{chunk-XYRDDSXF.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-JAQ5K7W6.js → chunk-2SFFYIH3.js} +1178 -166
  23. package/dist/chunk-2SFFYIH3.js.map +1 -0
  24. package/dist/chunk-3PVDYTTB.js +24 -0
  25. package/dist/chunk-3PVDYTTB.js.map +1 -0
  26. package/dist/chunk-3RJKUVCA.js +14068 -0
  27. package/dist/chunk-3RJKUVCA.js.map +1 -0
  28. package/dist/chunk-3UZCWK46.js +298 -0
  29. package/dist/chunk-3UZCWK46.js.map +1 -0
  30. package/dist/chunk-47CKUXTW.js +293 -0
  31. package/dist/chunk-47CKUXTW.js.map +1 -0
  32. package/dist/chunk-4QYP6QUI.js +109 -0
  33. package/dist/chunk-4QYP6QUI.js.map +1 -0
  34. package/dist/chunk-5EY26VZ7.js +1053 -0
  35. package/dist/chunk-5EY26VZ7.js.map +1 -0
  36. package/dist/chunk-5I4VRWBB.js +56 -0
  37. package/dist/chunk-5I4VRWBB.js.map +1 -0
  38. package/dist/chunk-5WOR7UCL.js +191 -0
  39. package/dist/chunk-5WOR7UCL.js.map +1 -0
  40. package/dist/chunk-5YJLGOM5.js +51 -0
  41. package/dist/chunk-5YJLGOM5.js.map +1 -0
  42. package/dist/chunk-6JFN3OWG.js +386 -0
  43. package/dist/chunk-6JFN3OWG.js.map +1 -0
  44. package/dist/chunk-7QJT5O4S.js +35 -0
  45. package/dist/chunk-7QJT5O4S.js.map +1 -0
  46. package/dist/chunk-A55KV72M.js +402 -0
  47. package/dist/chunk-A55KV72M.js.map +1 -0
  48. package/dist/chunk-ADWCLI4G.js +2028 -0
  49. package/dist/chunk-ADWCLI4G.js.map +1 -0
  50. package/dist/chunk-B27E3V37.js +29 -0
  51. package/dist/chunk-B27E3V37.js.map +1 -0
  52. package/dist/chunk-B7TC2A33.js +83 -0
  53. package/dist/chunk-B7TC2A33.js.map +1 -0
  54. package/dist/chunk-BLL56F7R.js +385 -0
  55. package/dist/chunk-BLL56F7R.js.map +1 -0
  56. package/dist/chunk-BOFEQC6K.js +162 -0
  57. package/dist/chunk-BOFEQC6K.js.map +1 -0
  58. package/dist/chunk-CM7LVUKC.js +35 -0
  59. package/dist/chunk-CM7LVUKC.js.map +1 -0
  60. package/dist/chunk-CORUP6JB.js +122 -0
  61. package/dist/chunk-CORUP6JB.js.map +1 -0
  62. package/dist/chunk-CSX5FFKZ.js +35 -0
  63. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  64. package/dist/chunk-EGVHJKGJ.js +3125 -0
  65. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  66. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  67. package/dist/chunk-G76LSA76.js.map +1 -0
  68. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  69. package/dist/chunk-GQMRL52F.js.map +1 -0
  70. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  71. package/dist/chunk-GUUXOISA.js.map +1 -0
  72. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  73. package/dist/chunk-I7X2P4FU.js.map +1 -0
  74. package/dist/chunk-IGFZFLI2.js +1390 -0
  75. package/dist/chunk-IGFZFLI2.js.map +1 -0
  76. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  77. package/dist/chunk-IMSUVYQB.js.map +1 -0
  78. package/dist/chunk-IOYHDEP3.js +38 -0
  79. package/dist/chunk-IOYHDEP3.js.map +1 -0
  80. package/dist/chunk-IZV5FTJC.js +55 -0
  81. package/dist/chunk-IZV5FTJC.js.map +1 -0
  82. package/dist/chunk-KF33GTWN.js +343 -0
  83. package/dist/chunk-KF33GTWN.js.map +1 -0
  84. package/dist/chunk-KSGQ5ODA.js +457 -0
  85. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  86. package/dist/{chunk-ZPBTI3TE.js → chunk-KZC6QRNR.js} +1513 -697
  87. package/dist/chunk-KZC6QRNR.js.map +1 -0
  88. package/dist/chunk-LJUMYUBO.js +218 -0
  89. package/dist/chunk-LJUMYUBO.js.map +1 -0
  90. package/dist/chunk-LSW2OJVV.js +380 -0
  91. package/dist/chunk-LSW2OJVV.js.map +1 -0
  92. package/dist/chunk-M357MHH3.js +2 -0
  93. package/dist/chunk-M357MHH3.js.map +1 -0
  94. package/dist/chunk-MK2TQO4Y.js +24 -0
  95. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  96. package/dist/chunk-N7S72EXK.js +25 -0
  97. package/dist/chunk-N7S72EXK.js.map +1 -0
  98. package/dist/{chunk-YVCHAQZY.js → chunk-NKMYZFHA.js} +616 -621
  99. package/dist/chunk-NKMYZFHA.js.map +1 -0
  100. package/dist/chunk-NX4ADH73.js +14 -0
  101. package/dist/chunk-NX4ADH73.js.map +1 -0
  102. package/dist/chunk-O7F6UJO4.js +71 -0
  103. package/dist/chunk-O7F6UJO4.js.map +1 -0
  104. package/dist/chunk-OYQQJL3J.js +16 -0
  105. package/dist/chunk-OYQQJL3J.js.map +1 -0
  106. package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
  107. package/dist/chunk-P4BNUO57.js.map +1 -0
  108. package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
  109. package/dist/chunk-PEHTX3V7.js.map +1 -0
  110. package/dist/chunk-PMV53IMM.js +26 -0
  111. package/dist/chunk-PMV53IMM.js.map +1 -0
  112. package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
  113. package/dist/chunk-PYEOPA4M.js.map +1 -0
  114. package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
  115. package/dist/chunk-QHUE7E4N.js.map +1 -0
  116. package/dist/chunk-QV3DJVRZ.js +11 -0
  117. package/dist/chunk-QV3DJVRZ.js.map +1 -0
  118. package/dist/chunk-R5SBNG7S.js +810 -0
  119. package/dist/chunk-R5SBNG7S.js.map +1 -0
  120. package/dist/chunk-RI42H5IU.js +326 -0
  121. package/dist/chunk-RI42H5IU.js.map +1 -0
  122. package/dist/chunk-S2QH6EZ5.js +211 -0
  123. package/dist/chunk-S2QH6EZ5.js.map +1 -0
  124. package/dist/chunk-SHLZMAJN.js +304 -0
  125. package/dist/chunk-SHLZMAJN.js.map +1 -0
  126. package/dist/chunk-TGXK4BAZ.js +293 -0
  127. package/dist/chunk-TGXK4BAZ.js.map +1 -0
  128. package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
  129. package/dist/chunk-TNEZNMSN.js.map +1 -0
  130. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  131. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  132. package/dist/chunk-UNJPZGNK.js +63 -0
  133. package/dist/chunk-UNJPZGNK.js.map +1 -0
  134. package/dist/{chunk-IOLVN74D.js → chunk-V5ZUJT2T.js} +175 -42
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-WBJY57A3.js +402 -0
  137. package/dist/chunk-WBJY57A3.js.map +1 -0
  138. package/dist/chunk-WIUKB3LD.js +1911 -0
  139. package/dist/chunk-WIUKB3LD.js.map +1 -0
  140. package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
  141. package/dist/chunk-WNN7NO2N.js.map +1 -0
  142. package/dist/{chunk-3AGBGTRT.js → chunk-X5UVUIMF.js} +1712 -1174
  143. package/dist/chunk-X5UVUIMF.js.map +1 -0
  144. package/dist/chunk-XDA5QJE7.js +402 -0
  145. package/dist/chunk-XDA5QJE7.js.map +1 -0
  146. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  147. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  148. package/dist/chunk-XHF7OYAN.js +1150 -0
  149. package/dist/chunk-XHF7OYAN.js.map +1 -0
  150. package/dist/chunk-YSRBFJMQ.js +43 -0
  151. package/dist/chunk-YSRBFJMQ.js.map +1 -0
  152. package/dist/chunk-ZOZAPAUO.js +174 -0
  153. package/dist/chunk-ZOZAPAUO.js.map +1 -0
  154. package/dist/chunk-ZQV5W7YC.js +809 -0
  155. package/dist/chunk-ZQV5W7YC.js.map +1 -0
  156. package/dist/chunk-ZUWF4NF7.js +13 -0
  157. package/dist/chunk-ZUWF4NF7.js.map +1 -0
  158. package/dist/client.d.ts +16 -7
  159. package/dist/clipboard.js +3 -1
  160. package/dist/commands/types.d.ts +2 -0
  161. package/dist/components/anthropic-mark.d.ts +3 -0
  162. package/dist/components/approval-surface.d.ts +19 -6
  163. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  164. package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
  165. package/dist/components/artifacts/artifact-surface.d.ts +4 -2
  166. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  167. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  168. package/dist/components/artifacts/document-editor.d.ts +4 -2
  169. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  170. package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
  171. package/dist/components/artifacts/editable-document.d.ts +1 -1
  172. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  173. package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
  174. package/dist/components/artifacts/index.d.ts +9 -2
  175. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  176. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  177. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  178. package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
  179. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  180. package/dist/components/artifacts/site-view.d.ts +26 -0
  181. package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
  182. package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
  183. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  184. package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
  185. package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
  186. package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
  187. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  188. package/dist/components/browser-select-control.d.ts +16 -0
  189. package/dist/components/browser-viewer.d.ts +11 -2
  190. package/dist/components/chat-composer.d.ts +21 -3
  191. package/dist/components/child-session-link.d.ts +9 -0
  192. package/dist/components/claude-mark.d.ts +3 -0
  193. package/dist/components/code-editor.d.ts +1 -4
  194. package/dist/components/composer-transcription-control.d.ts +7 -0
  195. package/dist/components/composer.d.ts +34 -67
  196. package/dist/components/computer-viewer.d.ts +1 -1
  197. package/dist/components/copy-button.d.ts +3 -1
  198. package/dist/components/desktop-viewer.d.ts +1 -1
  199. package/dist/components/grok-mark.d.ts +26 -0
  200. package/dist/components/human-input-form.d.ts +28 -32
  201. package/dist/components/human-input-surface.d.ts +7 -2
  202. package/dist/components/linkified-text.d.ts +18 -0
  203. package/dist/components/machine-input-display.d.ts +22 -1
  204. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  205. package/dist/components/machines/machine-detail.d.ts +7 -1
  206. package/dist/components/machines/machine-status.d.ts +48 -0
  207. package/dist/components/markdown-table-layout.d.ts +18 -0
  208. package/dist/components/markdown.d.ts +37 -4
  209. package/dist/components/message-timeline.d.ts +86 -7
  210. package/dist/components/model-mark.d.ts +29 -0
  211. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  212. package/dist/components/model-policy-picker.d.ts +35 -28
  213. package/dist/components/new-conversation.d.ts +32 -0
  214. package/dist/components/open-geni-chat.d.ts +73 -0
  215. package/dist/components/open-geni-links.d.ts +68 -0
  216. package/dist/components/openrouter-mark.d.ts +6 -0
  217. package/dist/components/opper-mark.d.ts +7 -0
  218. package/dist/components/preview-loading.d.ts +2 -0
  219. package/dist/components/provider-recovery-notice.d.ts +16 -0
  220. package/dist/components/queue-item-content.d.ts +9 -0
  221. package/dist/components/rehype-secret-refs.d.ts +23 -0
  222. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  223. package/dist/components/sandbox-files.d.ts +3 -1
  224. package/dist/components/sandbox-workspace.d.ts +18 -0
  225. package/dist/components/secret-question-field.d.ts +31 -0
  226. package/dist/components/secret-ref-chip.d.ts +35 -0
  227. package/dist/components/session-capability-frame.d.ts +37 -0
  228. package/dist/components/session-chrome.d.ts +57 -8
  229. package/dist/components/session-commands-panel.d.ts +6 -0
  230. package/dist/components/session-commands.d.ts +6 -0
  231. package/dist/components/session-connection-request.d.ts +8 -0
  232. package/dist/components/session-conversation.d.ts +157 -0
  233. package/dist/components/session-list.d.ts +39 -0
  234. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  235. package/dist/components/session-proxy-scope.d.ts +35 -0
  236. package/dist/components/session-status.d.ts +4 -1
  237. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  238. package/dist/components/timeline-anchor.d.ts +24 -0
  239. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  240. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  241. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  242. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  243. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  244. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  245. package/dist/components/timeline-annotations.d.ts +13 -3
  246. package/dist/components/timeline-reading-progress.d.ts +11 -0
  247. package/dist/components/timeline-search.d.ts +34 -0
  248. package/dist/components/timeline-settlement.d.ts +16 -0
  249. package/dist/components/tool-action-review.d.ts +47 -0
  250. package/dist/components/tool-review-history.d.ts +25 -0
  251. package/dist/components/usage-limit-notice.d.ts +49 -0
  252. package/dist/components/usage-member-list.d.ts +91 -0
  253. package/dist/components/usage-meter.d.ts +73 -0
  254. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  255. package/dist/components/user-message-body.d.ts +10 -1
  256. package/dist/composer-messages.d.ts +74 -0
  257. package/dist/composer-messages.js +9 -0
  258. package/dist/composer-messages.js.map +1 -0
  259. package/dist/composer-voice-events.d.ts +8 -0
  260. package/dist/composer.d.ts +5 -4
  261. package/dist/composer.js +26 -13
  262. package/dist/computer-viewer-GMLDXPON.js +20 -0
  263. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  264. package/dist/connect-account-identity.d.ts +8 -0
  265. package/dist/connect-accounts.d.ts +15 -0
  266. package/dist/connect-chooser.d.ts +18 -0
  267. package/dist/connect-panel.d.ts +18 -0
  268. package/dist/connect-setup.d.ts +18 -0
  269. package/dist/connect.d.ts +21 -0
  270. package/dist/connect.js +2149 -0
  271. package/dist/connect.js.map +1 -0
  272. package/dist/connection-catalog.d.ts +38 -0
  273. package/dist/connection-discovery.d.ts +12 -0
  274. package/dist/connection-installed.d.ts +17 -0
  275. package/dist/connection-logo.d.ts +9 -0
  276. package/dist/connection-service-logo.d.ts +8 -0
  277. package/dist/connection-service-presentation.d.ts +13 -0
  278. package/dist/connection-skeleton.d.ts +5 -0
  279. package/dist/connection-type-picker.d.ts +6 -0
  280. package/dist/conversation-timeline.d.ts +5 -0
  281. package/dist/desktop.d.ts +7 -0
  282. package/dist/desktop.js +27 -0
  283. package/dist/desktop.js.map +1 -0
  284. package/dist/device-authorization.d.ts +23 -0
  285. package/dist/diffs.d.ts +8 -0
  286. package/dist/diffs.js +15 -0
  287. package/dist/diffs.js.map +1 -0
  288. package/dist/discovery-cache.d.ts +5 -0
  289. package/dist/editor.d.ts +7 -0
  290. package/dist/editor.js +22 -0
  291. package/dist/editor.js.map +1 -0
  292. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  293. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  294. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  295. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  296. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  297. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  298. package/dist/hooks/latest-question.d.ts +25 -0
  299. package/dist/hooks/shared-machines-list.d.ts +4 -0
  300. package/dist/hooks/shared-query.d.ts +113 -0
  301. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  302. package/dist/hooks/use-auth-runs.d.ts +1 -4
  303. package/dist/hooks/use-available-models.d.ts +1 -1
  304. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  305. package/dist/hooks/use-browser-session.d.ts +12 -1
  306. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  307. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  308. package/dist/hooks/use-composer.d.ts +24 -2
  309. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  310. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  311. package/dist/hooks/use-computer-session.d.ts +4 -0
  312. package/dist/hooks/use-connect.d.ts +23 -0
  313. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  314. package/dist/hooks/use-file-attachments.d.ts +12 -0
  315. package/dist/hooks/use-goal.d.ts +2 -1
  316. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  317. package/dist/hooks/use-new-conversation.d.ts +56 -0
  318. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  319. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  320. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  321. package/dist/hooks/use-session-conversation.d.ts +49 -0
  322. package/dist/hooks/use-session-events.d.ts +26 -5
  323. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  324. package/dist/hooks/use-session-model-account.d.ts +48 -0
  325. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  326. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  327. package/dist/hooks/use-usage.d.ts +40 -0
  328. package/dist/hooks/use-vaults.d.ts +53 -0
  329. package/dist/hooks/use-voice-input.d.ts +8 -1
  330. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  331. package/dist/hooks/use-workspace-sessions.d.ts +24 -5
  332. package/dist/human-input-model.d.ts +122 -0
  333. package/dist/identity-link-accounts.d.ts +11 -0
  334. package/dist/identity-link-consent.d.ts +18 -0
  335. package/dist/index.d.ts +82 -20
  336. package/dist/index.js +2340 -6603
  337. package/dist/index.js.map +1 -1
  338. package/dist/interaction.d.ts +1 -1
  339. package/dist/interaction.js +14 -24
  340. package/dist/interaction.js.map +1 -1
  341. package/dist/latest-question-R77KWSUP.js +118 -0
  342. package/dist/latest-question-R77KWSUP.js.map +1 -0
  343. package/dist/lib/clipboard.d.ts +7 -0
  344. package/dist/lib/error-message.d.ts +7 -0
  345. package/dist/lib/format.d.ts +58 -4
  346. package/dist/lib/host-theme.d.ts +77 -0
  347. package/dist/lib/interaction-errors.d.ts +3 -0
  348. package/dist/lib/menu-styles.d.ts +22 -0
  349. package/dist/lib/notify-observer.d.ts +2 -0
  350. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  351. package/dist/lib/provider-recovery.d.ts +55 -0
  352. package/dist/lib/scrollbars.d.ts +11 -0
  353. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  354. package/dist/lib/transient-retry.d.ts +25 -0
  355. package/dist/lib/workbench-peers.d.ts +36 -0
  356. package/dist/lib/xterm-theme.d.ts +7 -5
  357. package/dist/machines.js +9 -5
  358. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  359. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  360. package/dist/mcp-connection-status.d.ts +14 -0
  361. package/dist/model-mark-paths.d.ts +34 -0
  362. package/dist/model-mark-paths.js +16 -0
  363. package/dist/model-mark-paths.js.map +1 -0
  364. package/dist/model-picker-model.d.ts +111 -0
  365. package/dist/model-picker-model.js +25 -0
  366. package/dist/model-picker-model.js.map +1 -0
  367. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  368. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  369. package/dist/model-policy.d.ts +30 -3
  370. package/dist/model-policy.js +14 -1
  371. package/dist/native-previews.d.ts +28 -0
  372. package/dist/native-previews.js +82 -0
  373. package/dist/native-previews.js.map +1 -0
  374. package/dist/new-session-draft.d.ts +7 -0
  375. package/dist/new-session-draft.js +639 -0
  376. package/dist/new-session-draft.js.map +1 -0
  377. package/dist/notification-text.d.ts +27 -0
  378. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  379. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  380. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  381. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  382. package/dist/older-history.d.ts +3 -2
  383. package/dist/organization-model.d.ts +32 -0
  384. package/dist/organization-model.js +65 -0
  385. package/dist/organization-model.js.map +1 -0
  386. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  387. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  388. package/dist/plugin-details.d.ts +14 -0
  389. package/dist/plugin-discovery.d.ts +25 -0
  390. package/dist/preview-loading-paint.d.ts +20 -0
  391. package/dist/provider.d.ts +25 -2
  392. package/dist/queue-presentation-model.d.ts +72 -0
  393. package/dist/queue-presentation-model.js +38 -0
  394. package/dist/queue-presentation-model.js.map +1 -0
  395. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  396. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  397. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  398. package/dist/realtime/embedded-voice.d.ts +1 -0
  399. package/dist/realtime/realtime-control.d.ts +4 -65
  400. package/dist/realtime/session-realtime.d.ts +78 -0
  401. package/dist/realtime.js +25 -1333
  402. package/dist/realtime.js.map +1 -1
  403. package/dist/sandbox-files-O27IPOZW.js +21 -0
  404. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  405. package/dist/sandbox-label-model.d.ts +30 -0
  406. package/dist/sandbox-label-model.js +20 -0
  407. package/dist/sandbox-label-model.js.map +1 -0
  408. package/dist/scrollbars.d.ts +1 -0
  409. package/dist/scrollbars.js +10 -0
  410. package/dist/scrollbars.js.map +1 -0
  411. package/dist/secret-reference-label.d.ts +14 -0
  412. package/dist/secrets-ui.d.ts +57 -0
  413. package/dist/session-agents-model.d.ts +10 -0
  414. package/dist/session-agents-model.js +25 -0
  415. package/dist/session-agents-model.js.map +1 -0
  416. package/dist/session-attention-model.d.ts +8 -0
  417. package/dist/session-attention-model.js +47 -0
  418. package/dist/session-attention-model.js.map +1 -0
  419. package/dist/session-auth-recommendation.d.ts +5 -0
  420. package/dist/session-capability-policy.d.ts +31 -0
  421. package/dist/session-feedback-model.d.ts +20 -0
  422. package/dist/session-feedback-model.js +56 -0
  423. package/dist/session-feedback-model.js.map +1 -0
  424. package/dist/session-list-model.d.ts +138 -0
  425. package/dist/session-list-model.js +274 -0
  426. package/dist/session-list-model.js.map +1 -0
  427. package/dist/session-realtime-7DJOIHQW.js +21 -0
  428. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  429. package/dist/session-realtime.d.ts +7 -0
  430. package/dist/session-realtime.js +19 -0
  431. package/dist/session-realtime.js.map +1 -0
  432. package/dist/session-status-model.d.ts +36 -0
  433. package/dist/session-ui.d.ts +39 -1
  434. package/dist/session-ui.js +126 -12
  435. package/dist/session-ui.js.map +1 -1
  436. package/dist/session.d.ts +8 -2
  437. package/dist/session.js +35 -20
  438. package/dist/site-snapshot.d.ts +14 -0
  439. package/dist/sites-ui.d.ts +24 -0
  440. package/dist/sites.d.ts +3 -0
  441. package/dist/sites.js +14 -0
  442. package/dist/sites.js.map +1 -0
  443. package/dist/skill-discovery.d.ts +47 -0
  444. package/dist/terminal.d.ts +8 -0
  445. package/dist/terminal.js +32 -0
  446. package/dist/terminal.js.map +1 -0
  447. package/dist/testing/session-scenarios.d.ts +10 -0
  448. package/dist/testing/session-scenarios.js +367 -0
  449. package/dist/testing/session-scenarios.js.map +1 -0
  450. package/dist/timeline/activity-rail.d.ts +11 -2
  451. package/dist/timeline/agent-identity.d.ts +30 -0
  452. package/dist/timeline/agent-row.d.ts +31 -0
  453. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  454. package/dist/timeline/compaction-copy.d.ts +46 -0
  455. package/dist/timeline/focus-sequence.d.ts +9 -0
  456. package/dist/timeline/genie-copy.d.ts +3 -0
  457. package/dist/timeline/genie-loading.d.ts +47 -0
  458. package/dist/timeline/index.d.ts +10 -5
  459. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  460. package/dist/timeline/message-sender.d.ts +19 -0
  461. package/dist/timeline/notice-presentation.d.ts +13 -0
  462. package/dist/timeline/parsers.d.ts +11 -0
  463. package/dist/timeline/patch-apply-command.d.ts +18 -0
  464. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  465. package/dist/timeline/platform-activity-row.d.ts +1 -2
  466. package/dist/timeline/presented-image.d.ts +11 -0
  467. package/dist/timeline/projection.d.ts +31 -2
  468. package/dist/timeline/provider-logo.d.ts +15 -0
  469. package/dist/timeline/question-nav-model.d.ts +23 -0
  470. package/dist/timeline/registry.d.ts +12 -1
  471. package/dist/timeline/retained-image.d.ts +18 -0
  472. package/dist/timeline/retained-loaders.d.ts +27 -0
  473. package/dist/timeline/rolling-activity.d.ts +11 -0
  474. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  475. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  476. package/dist/timeline/shared.d.ts +4 -1
  477. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  478. package/dist/timeline/startup-preference.d.ts +3 -0
  479. package/dist/timeline/startup-timings.d.ts +4 -0
  480. package/dist/timeline/tool-display-name.d.ts +5 -2
  481. package/dist/timeline/tool-presentation.d.ts +172 -0
  482. package/dist/timeline/turn-summary-model.d.ts +95 -0
  483. package/dist/timeline/turn-summary.d.ts +20 -54
  484. package/dist/timeline/types.d.ts +179 -7
  485. package/dist/timeline/work-presentation.d.ts +60 -0
  486. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  487. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  488. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  489. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  490. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  491. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  492. package/dist/timeline-model.d.ts +29 -0
  493. package/dist/timeline-model.js +254 -0
  494. package/dist/timeline-model.js.map +1 -0
  495. package/dist/usage/allowance-copy.d.ts +25 -0
  496. package/dist/usage/session-usage-limit.d.ts +88 -0
  497. package/dist/usage/summary.d.ts +35 -0
  498. package/dist/usage.d.ts +17 -0
  499. package/dist/usage.js +1187 -0
  500. package/dist/usage.js.map +1 -0
  501. package/dist/voice-recording-owner.d.ts +7 -0
  502. package/package.json +106 -7
  503. package/src/approvals.ts +8 -1
  504. package/src/artifacts-spreadsheet.ts +1 -0
  505. package/src/artifacts.ts +44 -0
  506. package/src/assets/README.md +8 -0
  507. package/src/assets/gmail.ico +0 -0
  508. package/src/assets/outlook.ico +0 -0
  509. package/src/capability-catalog-row.tsx +94 -0
  510. package/src/capability-logo-fallback.ts +22 -0
  511. package/src/client.ts +20 -31
  512. package/src/commands/registry.ts +18 -15
  513. package/src/commands/types.ts +2 -0
  514. package/src/components/anthropic-mark.tsx +10 -0
  515. package/src/components/approval-surface.tsx +401 -138
  516. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  517. package/src/components/artifacts/artifact-sandbox.tsx +193 -0
  518. package/src/components/artifacts/artifact-surface.tsx +40 -20
  519. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  520. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  521. package/src/components/artifacts/document-editor.tsx +141 -16
  522. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  523. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  524. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  525. package/src/components/artifacts/editable-document.tsx +37 -36
  526. package/src/components/artifacts/editable-presentation.tsx +36 -18
  527. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  528. package/src/components/artifacts/index.ts +45 -0
  529. package/src/components/artifacts/inline-html-document.ts +24 -0
  530. package/src/components/artifacts/latest-task-runner.ts +49 -0
  531. package/src/components/artifacts/presentation-editor.tsx +323 -67
  532. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  533. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  534. package/src/components/artifacts/site-view.tsx +121 -0
  535. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  536. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  537. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  538. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  539. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  540. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  541. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  542. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  543. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  544. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  545. package/src/components/browser-select-control.tsx +312 -0
  546. package/src/components/browser-viewer.tsx +778 -318
  547. package/src/components/chat-composer.tsx +47 -5
  548. package/src/components/child-session-link.tsx +36 -0
  549. package/src/components/claude-mark.tsx +11 -0
  550. package/src/components/code-editor.tsx +13 -16
  551. package/src/components/composer-transcription-control.tsx +128 -30
  552. package/src/components/composer.tsx +404 -195
  553. package/src/components/computer-viewer.tsx +880 -253
  554. package/src/components/copy-button.tsx +13 -5
  555. package/src/components/desktop-viewer.tsx +1 -1
  556. package/src/components/enrollment-consent.tsx +1 -1
  557. package/src/components/enrollment-device-flow.tsx +1 -1
  558. package/src/components/file-browser.tsx +10 -14
  559. package/src/components/fleet-tile.tsx +5 -3
  560. package/src/components/generated-video-player.tsx +4 -2
  561. package/src/components/grok-mark.tsx +34 -0
  562. package/src/components/human-input-form.tsx +590 -283
  563. package/src/components/human-input-surface.tsx +11 -0
  564. package/src/components/interaction-intervention-banner.tsx +2 -2
  565. package/src/components/linkified-text.tsx +79 -0
  566. package/src/components/machine-card.tsx +35 -78
  567. package/src/components/machine-dock-bar.tsx +1 -1
  568. package/src/components/machine-input-display.ts +197 -3
  569. package/src/components/machines/agent-status-icon.tsx +31 -0
  570. package/src/components/machines/machine-detail.tsx +200 -31
  571. package/src/components/machines/machine-operation-policy.tsx +1 -1
  572. package/src/components/machines/machine-status.ts +241 -0
  573. package/src/components/machines-dashboard.tsx +2 -17
  574. package/src/components/markdown-table-layout.ts +143 -0
  575. package/src/components/markdown.tsx +466 -129
  576. package/src/components/message-timeline.tsx +2370 -667
  577. package/src/components/model-mark.tsx +102 -0
  578. package/src/components/model-picker.tsx +15 -4
  579. package/src/components/model-policy-picker-menu.tsx +371 -0
  580. package/src/components/model-policy-picker.tsx +252 -429
  581. package/src/components/new-conversation.tsx +221 -0
  582. package/src/components/open-geni-chat.tsx +309 -0
  583. package/src/components/open-geni-links.tsx +179 -0
  584. package/src/components/openrouter-mark.tsx +13 -0
  585. package/src/components/opper-mark.tsx +18 -0
  586. package/src/components/pierre-diff.tsx +41 -16
  587. package/src/components/pierre-file.tsx +35 -10
  588. package/src/components/preview-loading.tsx +109 -0
  589. package/src/components/provider-recovery-notice.tsx +49 -0
  590. package/src/components/queue-item-content.ts +14 -0
  591. package/src/components/queue-surface-implementation.tsx +51 -356
  592. package/src/components/queue-surface-state.tsx +3 -1
  593. package/src/components/rehype-secret-refs.ts +98 -0
  594. package/src/components/remark-soft-line-breaks.ts +166 -0
  595. package/src/components/sandbox-files.tsx +91 -15
  596. package/src/components/sandbox-terminal.tsx +84 -13
  597. package/src/components/sandbox-workspace.tsx +147 -51
  598. package/src/components/secret-question-field.tsx +324 -0
  599. package/src/components/secret-ref-chip.tsx +185 -0
  600. package/src/components/session-capability-frame.tsx +197 -0
  601. package/src/components/session-chrome.tsx +842 -251
  602. package/src/components/session-commands-panel.tsx +126 -0
  603. package/src/components/session-commands.tsx +18 -0
  604. package/src/components/session-connection-request.tsx +97 -0
  605. package/src/components/session-conversation.tsx +876 -0
  606. package/src/components/session-list.tsx +257 -0
  607. package/src/components/session-mcp-capability-card.tsx +680 -0
  608. package/src/components/session-proxy-scope.tsx +153 -0
  609. package/src/components/session-status.tsx +26 -17
  610. package/src/components/session-usage-limit-notice.tsx +174 -0
  611. package/src/components/timeline-anchor.tsx +119 -0
  612. package/src/components/timeline-annotation-chrome.tsx +196 -0
  613. package/src/components/timeline-annotation-layout.ts +268 -0
  614. package/src/components/timeline-annotation-markers.tsx +185 -0
  615. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  616. package/src/components/timeline-annotation-selection.tsx +106 -54
  617. package/src/components/timeline-annotation-shared.ts +245 -0
  618. package/src/components/timeline-annotations-dialog.tsx +185 -128
  619. package/src/components/timeline-annotations.tsx +189 -45
  620. package/src/components/timeline-reading-progress.ts +80 -0
  621. package/src/components/timeline-search.tsx +168 -0
  622. package/src/components/timeline-settlement.ts +60 -0
  623. package/src/components/tool-action-review.tsx +650 -0
  624. package/src/components/tool-review-history.tsx +88 -0
  625. package/src/components/usage-limit-notice.tsx +179 -0
  626. package/src/components/usage-member-list.tsx +792 -0
  627. package/src/components/usage-meter.tsx +382 -0
  628. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  629. package/src/components/user-message-body.tsx +27 -2
  630. package/src/components/workspace-dock.tsx +18 -1
  631. package/src/composer-messages.ts +150 -0
  632. package/src/composer-voice-events.ts +12 -0
  633. package/src/composer.ts +6 -1
  634. package/src/connect-account-identity.tsx +34 -0
  635. package/src/connect-accounts.tsx +233 -0
  636. package/src/connect-chooser.tsx +336 -0
  637. package/src/connect-panel.tsx +99 -0
  638. package/src/connect-setup.tsx +355 -0
  639. package/src/connect.ts +60 -0
  640. package/src/connection-assets.d.ts +4 -0
  641. package/src/connection-catalog.tsx +162 -0
  642. package/src/connection-discovery.tsx +238 -0
  643. package/src/connection-installed.tsx +51 -0
  644. package/src/connection-logo.tsx +37 -0
  645. package/src/connection-service-logo.tsx +55 -0
  646. package/src/connection-service-presentation.ts +46 -0
  647. package/src/connection-skeleton.tsx +16 -0
  648. package/src/connection-type-picker.tsx +36 -0
  649. package/src/conversation-timeline.ts +92 -0
  650. package/src/desktop.ts +24 -0
  651. package/src/device-authorization.tsx +98 -0
  652. package/src/diffs.ts +16 -0
  653. package/src/discovery-cache.ts +42 -0
  654. package/src/editor.ts +13 -0
  655. package/src/hooks/internal.ts +3 -2
  656. package/src/hooks/latest-question.ts +164 -0
  657. package/src/hooks/shared-machines-list.ts +34 -1
  658. package/src/hooks/shared-query.ts +721 -0
  659. package/src/hooks/use-attached-browsers.ts +1 -1
  660. package/src/hooks/use-auth-runs.ts +0 -27
  661. package/src/hooks/use-available-models.ts +2 -2
  662. package/src/hooks/use-browser-frame-stream.ts +19 -2
  663. package/src/hooks/use-browser-session.ts +680 -205
  664. package/src/hooks/use-browser-sessions.ts +32 -1
  665. package/src/hooks/use-client-config-flags.ts +118 -0
  666. package/src/hooks/use-codex-accounts.ts +247 -47
  667. package/src/hooks/use-composer.ts +227 -44
  668. package/src/hooks/use-computer-frame-stream.ts +25 -7
  669. package/src/hooks/use-computer-input-posture.ts +94 -0
  670. package/src/hooks/use-computer-session.ts +409 -95
  671. package/src/hooks/use-connect.ts +23 -0
  672. package/src/hooks/use-desktop-stream.ts +19 -28
  673. package/src/hooks/use-file-attachments.ts +80 -4
  674. package/src/hooks/use-goal.ts +79 -9
  675. package/src/hooks/use-last-started-turn-policy.ts +37 -11
  676. package/src/hooks/use-machines.ts +4 -0
  677. package/src/hooks/use-new-conversation.ts +374 -0
  678. package/src/hooks/use-new-session-draft.ts +813 -0
  679. package/src/hooks/use-realtime-voice-models.ts +46 -0
  680. package/src/hooks/use-sandbox-files.ts +68 -20
  681. package/src/hooks/use-session-background-commands.ts +22 -11
  682. package/src/hooks/use-session-capabilities.ts +3 -2
  683. package/src/hooks/use-session-conversation.ts +150 -0
  684. package/src/hooks/use-session-events.ts +531 -335
  685. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  686. package/src/hooks/use-session-model-account.ts +174 -0
  687. package/src/hooks/use-session.ts +30 -2
  688. package/src/hooks/use-slash-commands.ts +6 -11
  689. package/src/hooks/use-supergrok-accounts.ts +22 -8
  690. package/src/hooks/use-terminal-stream.ts +153 -27
  691. package/src/hooks/use-transcription.ts +6 -0
  692. package/src/hooks/use-turn-queue.ts +2 -1
  693. package/src/hooks/use-usage.ts +100 -0
  694. package/src/hooks/use-vaults.ts +153 -0
  695. package/src/hooks/use-video-artifact-playback.ts +1 -1
  696. package/src/hooks/use-voice-input.ts +127 -19
  697. package/src/hooks/use-workspace-capture.ts +3 -2
  698. package/src/hooks/use-workspace-edit.ts +23 -5
  699. package/src/hooks/use-workspace-sessions.ts +74 -7
  700. package/src/human-input-model.ts +359 -0
  701. package/src/identity-link-accounts.tsx +148 -0
  702. package/src/identity-link-consent.tsx +192 -0
  703. package/src/index.ts +262 -16
  704. package/src/interaction.ts +1 -0
  705. package/src/lib/clipboard.ts +29 -0
  706. package/src/lib/error-message.ts +37 -0
  707. package/src/lib/format.ts +205 -10
  708. package/src/lib/host-theme.ts +529 -0
  709. package/src/lib/interaction-errors.ts +15 -0
  710. package/src/lib/menu-styles.ts +44 -0
  711. package/src/lib/notify-observer.ts +15 -0
  712. package/src/lib/pierre-diffs-loader.ts +53 -0
  713. package/src/lib/provider-recovery.ts +243 -0
  714. package/src/lib/scrollbars.ts +30 -0
  715. package/src/lib/terminal-input-readiness.ts +51 -0
  716. package/src/lib/transient-retry.ts +99 -0
  717. package/src/lib/workbench-peers.ts +62 -0
  718. package/src/lib/xterm-theme.ts +23 -21
  719. package/src/mcp-connection-status.ts +35 -0
  720. package/src/model-mark-paths.ts +53 -0
  721. package/src/model-picker-model.ts +330 -0
  722. package/src/model-policy.ts +299 -74
  723. package/src/native-previews.ts +100 -0
  724. package/src/new-session-draft.ts +22 -0
  725. package/src/notification-text.ts +81 -0
  726. package/src/older-history.ts +22 -4
  727. package/src/organization-model.ts +118 -0
  728. package/src/plugin-details.tsx +185 -0
  729. package/src/plugin-discovery.tsx +196 -0
  730. package/src/preview-loading-paint.ts +68 -0
  731. package/src/provider.tsx +74 -15
  732. package/src/queue-presentation-model.ts +464 -0
  733. package/src/realtime/dropdown-menu.tsx +19 -12
  734. package/src/realtime/embedded-new-voice.tsx +1 -0
  735. package/src/realtime/embedded-voice.tsx +3 -0
  736. package/src/realtime/realtime-control.tsx +138 -550
  737. package/src/realtime/session-realtime.ts +566 -0
  738. package/src/sandbox-label-model.ts +53 -0
  739. package/src/scrollbars.ts +3 -0
  740. package/src/secret-reference-label.ts +43 -0
  741. package/src/secrets-ui.tsx +59 -0
  742. package/src/session-agents-model.ts +33 -0
  743. package/src/session-attention-model.ts +62 -0
  744. package/src/session-auth-recommendation.ts +48 -0
  745. package/src/session-capability-policy.ts +196 -0
  746. package/src/session-context.ts +3 -4
  747. package/src/session-feedback-model.ts +95 -0
  748. package/src/session-list-model.ts +434 -0
  749. package/src/session-realtime.ts +18 -0
  750. package/src/session-status-model.ts +99 -0
  751. package/src/session-ui.ts +98 -1
  752. package/src/session.ts +17 -1
  753. package/src/site-snapshot.ts +74 -0
  754. package/src/sites-ui.tsx +348 -0
  755. package/src/sites.ts +3 -0
  756. package/src/skill-discovery.tsx +208 -0
  757. package/src/terminal.ts +26 -0
  758. package/src/testing/session-scenarios.ts +404 -0
  759. package/src/timeline/activity-rail.tsx +242 -101
  760. package/src/timeline/agent-identity.tsx +84 -0
  761. package/src/timeline/agent-row.tsx +231 -0
  762. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  763. package/src/timeline/compaction-copy.ts +115 -0
  764. package/src/timeline/fleet-decision-projection.ts +2 -1
  765. package/src/timeline/fleet-decision-row.tsx +1 -0
  766. package/src/timeline/focus-sequence.ts +44 -0
  767. package/src/timeline/genie-copy.ts +19 -0
  768. package/src/timeline/genie-loading.tsx +143 -0
  769. package/src/timeline/index.ts +30 -2
  770. package/src/timeline/knowledge-receipt.tsx +100 -0
  771. package/src/timeline/message-sender.tsx +71 -0
  772. package/src/timeline/notice-presentation.ts +48 -0
  773. package/src/timeline/parsers.ts +42 -2
  774. package/src/timeline/patch-apply-command.tsx +135 -0
  775. package/src/timeline/platform-activity-presentation.ts +166 -0
  776. package/src/timeline/platform-activity-row.tsx +15 -90
  777. package/src/timeline/presented-image.ts +63 -0
  778. package/src/timeline/projection.ts +1742 -76
  779. package/src/timeline/provider-logo.tsx +53 -0
  780. package/src/timeline/question-nav-model.ts +28 -0
  781. package/src/timeline/registry.ts +26 -4
  782. package/src/timeline/retained-image.ts +97 -0
  783. package/src/timeline/retained-loaders.ts +91 -0
  784. package/src/timeline/rolling-activity.tsx +80 -0
  785. package/src/timeline/screenshot-lightbox.tsx +228 -5
  786. package/src/timeline/session-usage-limit-row.tsx +42 -0
  787. package/src/timeline/shared.tsx +42 -15
  788. package/src/timeline/startup-dispatch-details.tsx +36 -0
  789. package/src/timeline/startup-preference.ts +33 -0
  790. package/src/timeline/startup-timings.tsx +145 -0
  791. package/src/timeline/tool-display-name.ts +19 -7
  792. package/src/timeline/tool-presentation.ts +1316 -0
  793. package/src/timeline/tool-renderers.tsx +835 -1138
  794. package/src/timeline/turn-summary-model.ts +343 -0
  795. package/src/timeline/turn-summary.tsx +272 -365
  796. package/src/timeline/types.ts +189 -6
  797. package/src/timeline/work-presentation.ts +189 -0
  798. package/src/timeline-model.ts +143 -0
  799. package/src/usage/allowance-copy.ts +64 -0
  800. package/src/usage/session-usage-limit.ts +266 -0
  801. package/src/usage/summary.ts +93 -0
  802. package/src/usage.ts +70 -0
  803. package/src/voice-recording-owner.ts +22 -0
  804. package/styles/compiled.css +2319 -748
  805. package/styles/connect.css +290 -0
  806. package/styles/connect.d.ts +1 -0
  807. package/styles/effective-tokens.css +1 -0
  808. package/styles/index.css +309 -9
  809. package/styles/responsive.css +99 -7
  810. package/styles/session-capability.css +44 -0
  811. package/styles/tokens.css +134 -66
  812. package/dist/browser-viewer-MKKFRRRV.js +0 -14
  813. package/dist/chunk-2DZVYHVO.js +0 -470
  814. package/dist/chunk-2DZVYHVO.js.map +0 -1
  815. package/dist/chunk-3AGBGTRT.js.map +0 -1
  816. package/dist/chunk-4MDLEHXL.js.map +0 -1
  817. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  818. package/dist/chunk-7EAFGICR.js +0 -302
  819. package/dist/chunk-7EAFGICR.js.map +0 -1
  820. package/dist/chunk-ELIYWBZR.js.map +0 -1
  821. package/dist/chunk-H5YGYNXS.js.map +0 -1
  822. package/dist/chunk-HUIKIDM5.js.map +0 -1
  823. package/dist/chunk-ICA6R6TW.js.map +0 -1
  824. package/dist/chunk-IOLVN74D.js.map +0 -1
  825. package/dist/chunk-JAQ5K7W6.js.map +0 -1
  826. package/dist/chunk-JVYQRRC4.js.map +0 -1
  827. package/dist/chunk-KCGXPP5V.js.map +0 -1
  828. package/dist/chunk-KZ73RL76.js.map +0 -1
  829. package/dist/chunk-NEXLLTP4.js.map +0 -1
  830. package/dist/chunk-PEI6RANI.js.map +0 -1
  831. package/dist/chunk-VTOREEXF.js +0 -142
  832. package/dist/chunk-VTOREEXF.js.map +0 -1
  833. package/dist/chunk-WSK7G5LE.js +0 -170
  834. package/dist/chunk-WSK7G5LE.js.map +0 -1
  835. package/dist/chunk-X4A66EWZ.js +0 -223
  836. package/dist/chunk-X4A66EWZ.js.map +0 -1
  837. package/dist/chunk-XYRDDSXF.js.map +0 -1
  838. package/dist/chunk-YG4QEQF5.js +0 -9557
  839. package/dist/chunk-YG4QEQF5.js.map +0 -1
  840. package/dist/chunk-YVCHAQZY.js.map +0 -1
  841. package/dist/chunk-ZPBTI3TE.js.map +0 -1
  842. package/dist/computer-viewer-FWEZISW4.js +0 -16
  843. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  844. package/dist/hooks/use-environments.d.ts +0 -41
  845. package/dist/hooks/use-packs.d.ts +0 -32
  846. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  847. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  848. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  849. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  850. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  851. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  852. package/src/hooks/use-environments.ts +0 -182
  853. package/src/hooks/use-packs.ts +0 -157
  854. /package/dist/{browser-viewer-MKKFRRRV.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  855. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-4EUKJXUO.js.map} +0 -0
@@ -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,7 +85,19 @@ 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]);
86
99
  const loadAbort = useRef<AbortController | null>(null);
100
+ const scheduleRefreshRef = useRef<() => void>(() => undefined);
87
101
 
88
102
  const retireLoads = useCallback(() => {
89
103
  generation.current += 1;
@@ -96,14 +110,20 @@ export function useGoal(
96
110
  return;
97
111
  }
98
112
  const ticket = ++generation.current;
113
+ pendingRefreshRef.current = "none";
99
114
  loadAbort.current?.abort();
100
115
  const controller = new AbortController();
101
116
  loadAbort.current = controller;
102
117
  try {
103
- const fetched = await client.getGoal(workspaceId, sessionId, {
104
- signal: controller.signal,
105
- });
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 });
106
125
  if (ticket === generation.current) {
126
+ goalAbsentRef.current = fetched === null;
107
127
  setGoal(fetched);
108
128
  setError(null);
109
129
  setLoading(false);
@@ -114,21 +134,44 @@ export function useGoal(
114
134
  }
115
135
  if (cause instanceof OpenGeniApiError && cause.status === 404) {
116
136
  // No goal is a normal state, not an error.
137
+ goalAbsentRef.current = true;
117
138
  setGoal(null);
118
139
  setError(null);
119
140
  } else {
120
- setError(cause instanceof Error ? cause : new Error(String(cause)));
141
+ setError(normalizeError(cause));
121
142
  }
122
143
  setLoading(false);
123
144
  } finally {
124
145
  if (loadAbort.current === controller) loadAbort.current = null;
125
146
  }
147
+ if (ticket !== generation.current || pendingRefreshRef.current === "none") {
148
+ return;
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();
126
167
  }, [client, workspaceId, sessionId]);
127
168
 
128
169
  useEffect(() => {
129
170
  const targetKey = `${workspaceId} ${sessionId ?? ""}`;
130
171
  if (targetKeyRef.current !== targetKey) {
131
172
  targetKeyRef.current = targetKey;
173
+ goalAbsentRef.current = false;
174
+ pendingRefreshRef.current = "none";
132
175
  setGoal(null);
133
176
  setError(null);
134
177
  }
@@ -138,7 +181,9 @@ export function useGoal(
138
181
  return;
139
182
  }
140
183
  if (sharedFeed) {
141
- setLoading(false);
184
+ // A shared log supplies invalidations, not the authoritative goal snapshot.
185
+ setLoading(true);
186
+ void load();
142
187
  return () => {
143
188
  retireLoads();
144
189
  };
@@ -177,8 +222,33 @@ export function useGoal(
177
222
  sharedFeed,
178
223
  ]);
179
224
 
180
- const scheduleRefresh = useDebouncedCallback(() => void load());
181
- 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, {
182
252
  enabled,
183
253
  ...(sharedEvents !== undefined ? { events: sharedEvents } : {}),
184
254
  });
@@ -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,9 +69,9 @@ 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
76
  const load = useCallback(
55
77
  async (signal?: AbortSignal): Promise<LastStartedTurnPolicy | null> => {
@@ -58,9 +80,12 @@ export function useLastStartedTurnPolicy(
58
80
  latestStarted: true,
59
81
  signal,
60
82
  });
61
- return policyFromTurn(turns[0]);
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);
62
87
  },
63
- [client, workspaceId, sessionId],
88
+ [client, workspaceId, sessionId, includeServingModel],
64
89
  );
65
90
 
66
91
  const { data, loading, error, refresh } = usePolledValue(load, {
@@ -68,10 +93,6 @@ export function useLastStartedTurnPolicy(
68
93
  enabled,
69
94
  });
70
95
 
71
- useEffect(() => {
72
- if (enabled && workspaceControlEvent) void refresh();
73
- }, [enabled, refresh, workspaceControlEvent]);
74
-
75
96
  useEffect(() => {
76
97
  if (!sessionId || !enabled) return;
77
98
  return registerSessionReconciler(sessionId, "last-started-turn-policy", refresh);
@@ -79,12 +100,17 @@ export function useLastStartedTurnPolicy(
79
100
 
80
101
  // Shared-feed only: the session header lives outside the route event log and
81
102
  // must not open a second SSE. Without `events`, rely on the initial fetch +
82
- // 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.
83
105
  useSessionEventTrigger(
84
106
  client,
85
107
  workspaceId,
86
108
  sessionId,
87
- isLastStartedTurnPolicyEvent,
109
+ (event) =>
110
+ isLastStartedTurnPolicyEvent(event) ||
111
+ (includeServingModel &&
112
+ (event.type === "subscription.account.selected" ||
113
+ event.type === "subscription.account.switched")),
88
114
  () => void refresh(),
89
115
  {
90
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
  }