@opengeni/react 3.3.2 → 3.4.0

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