@opengeni/react 0.57.0 → 1.0.2-canary.37191796234001

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 (629) hide show
  1. package/README.md +654 -22
  2. package/dist/accounts.d.ts +64 -0
  3. package/dist/accounts.js +822 -0
  4. package/dist/accounts.js.map +1 -0
  5. package/dist/approvals.d.ts +2 -1
  6. package/dist/artifacts-document.js +3 -2
  7. package/dist/artifacts-presentation.js +3 -2
  8. package/dist/artifacts-spreadsheet.js +2 -2
  9. package/dist/artifacts.d.ts +4 -1
  10. package/dist/artifacts.js +518 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-GTR5XQ7X.js +16 -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-UGBTNB3L.js +11 -0
  16. package/dist/chat-interactive-block-UGBTNB3L.js.map +1 -0
  17. package/dist/{chunk-5UQPNLIO.js → chunk-23J2ZNXT.js} +4117 -3896
  18. package/dist/chunk-23J2ZNXT.js.map +1 -0
  19. package/dist/chunk-447JLCBU.js +209 -0
  20. package/dist/chunk-447JLCBU.js.map +1 -0
  21. package/dist/chunk-4RVYOY4O.js +379 -0
  22. package/dist/chunk-4RVYOY4O.js.map +1 -0
  23. package/dist/chunk-5CVXZA3Y.js +292 -0
  24. package/dist/chunk-5CVXZA3Y.js.map +1 -0
  25. package/dist/chunk-5J4FOW6Q.js +108 -0
  26. package/dist/chunk-5J4FOW6Q.js.map +1 -0
  27. package/dist/chunk-A2PI6UMY.js +41 -0
  28. package/dist/chunk-A2PI6UMY.js.map +1 -0
  29. package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
  30. package/dist/chunk-A4UJB2MM.js.map +1 -0
  31. package/dist/chunk-B3V6TG77.js +41 -0
  32. package/dist/chunk-B3V6TG77.js.map +1 -0
  33. package/dist/chunk-BRM6FVZA.js +302 -0
  34. package/dist/chunk-BRM6FVZA.js.map +1 -0
  35. package/dist/chunk-C5X5AJXK.js +182 -0
  36. package/dist/chunk-C5X5AJXK.js.map +1 -0
  37. package/dist/chunk-CR7U7HAR.js +453 -0
  38. package/dist/chunk-CR7U7HAR.js.map +1 -0
  39. package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
  40. package/dist/chunk-DYWBUX5Q.js.map +1 -0
  41. package/dist/chunk-E3G7SAYZ.js +3124 -0
  42. package/dist/chunk-E3G7SAYZ.js.map +1 -0
  43. package/dist/chunk-ELCE5SXV.js +359 -0
  44. package/dist/chunk-ELCE5SXV.js.map +1 -0
  45. package/dist/chunk-ERGYJIBB.js +21 -0
  46. package/dist/chunk-ERGYJIBB.js.map +1 -0
  47. package/dist/chunk-FFA2OVOV.js +319 -0
  48. package/dist/chunk-FFA2OVOV.js.map +1 -0
  49. package/dist/chunk-FZCP527Y.js +116 -0
  50. package/dist/chunk-FZCP527Y.js.map +1 -0
  51. package/dist/chunk-GIMRELBW.js +14 -0
  52. package/dist/chunk-GIMRELBW.js.map +1 -0
  53. package/dist/{chunk-6KLX2RH5.js → chunk-H2NJQORO.js} +1069 -79
  54. package/dist/chunk-H2NJQORO.js.map +1 -0
  55. package/dist/chunk-I7IWRQLN.js +1608 -0
  56. package/dist/chunk-I7IWRQLN.js.map +1 -0
  57. package/dist/{chunk-HA46CYQK.js → chunk-IQUCRAT7.js} +792 -537
  58. package/dist/chunk-IQUCRAT7.js.map +1 -0
  59. package/dist/chunk-IWIDV7SB.js +1 -0
  60. package/dist/chunk-IWIDV7SB.js.map +1 -0
  61. package/dist/chunk-J2QWVSQY.js +312 -0
  62. package/dist/chunk-J2QWVSQY.js.map +1 -0
  63. package/dist/chunk-JFNEV4LU.js +2733 -0
  64. package/dist/chunk-JFNEV4LU.js.map +1 -0
  65. package/dist/chunk-JT4JW7BC.js +54 -0
  66. package/dist/chunk-JT4JW7BC.js.map +1 -0
  67. package/dist/chunk-K3HQAKQX.js +24 -0
  68. package/dist/chunk-K3HQAKQX.js.map +1 -0
  69. package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
  70. package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
  71. package/dist/chunk-NZUI76EM.js +371 -0
  72. package/dist/chunk-NZUI76EM.js.map +1 -0
  73. package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
  74. package/dist/chunk-PNY3JKBJ.js.map +1 -0
  75. package/dist/{chunk-IGC6A2ZI.js → chunk-Q5QBEZIQ.js} +777 -246
  76. package/dist/chunk-Q5QBEZIQ.js.map +1 -0
  77. package/dist/chunk-RHREZ7BO.js +11 -0
  78. package/dist/chunk-RHREZ7BO.js.map +1 -0
  79. package/dist/chunk-SCOTPE2I.js +589 -0
  80. package/dist/chunk-SCOTPE2I.js.map +1 -0
  81. package/dist/{chunk-B6WPZSTT.js → chunk-SJZDKVW2.js} +1331 -1163
  82. package/dist/chunk-SJZDKVW2.js.map +1 -0
  83. package/dist/chunk-TMJRG4YC.js +12803 -0
  84. package/dist/chunk-TMJRG4YC.js.map +1 -0
  85. package/dist/chunk-TMYGL6X5.js +742 -0
  86. package/dist/chunk-TMYGL6X5.js.map +1 -0
  87. package/dist/chunk-UGLEYEMP.js +33 -0
  88. package/dist/chunk-UGLEYEMP.js.map +1 -0
  89. package/dist/chunk-UK4TINKT.js +27 -0
  90. package/dist/chunk-UK4TINKT.js.map +1 -0
  91. package/dist/chunk-UTRTG6LH.js +220 -0
  92. package/dist/chunk-UTRTG6LH.js.map +1 -0
  93. package/dist/chunk-WEHMPOXK.js +39 -0
  94. package/dist/chunk-WEHMPOXK.js.map +1 -0
  95. package/dist/chunk-WRHIZYZF.js +988 -0
  96. package/dist/chunk-WRHIZYZF.js.map +1 -0
  97. package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
  98. package/dist/chunk-WUISZ3WU.js.map +1 -0
  99. package/dist/chunk-XCHWDJ22.js +107 -0
  100. package/dist/chunk-XCHWDJ22.js.map +1 -0
  101. package/dist/chunk-XOAMRDDK.js +481 -0
  102. package/dist/chunk-XOAMRDDK.js.map +1 -0
  103. package/dist/chunk-XUW2UWQM.js +299 -0
  104. package/dist/chunk-XUW2UWQM.js.map +1 -0
  105. package/dist/{chunk-KCGXPP5V.js → chunk-Y2PRMYLC.js} +11 -6
  106. package/dist/chunk-Y2PRMYLC.js.map +1 -0
  107. package/dist/chunk-YBXQDQFX.js +1772 -0
  108. package/dist/chunk-YBXQDQFX.js.map +1 -0
  109. package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
  110. package/dist/chunk-YQEAA6LT.js.map +1 -0
  111. package/dist/chunk-YV4L3ILF.js +9 -0
  112. package/dist/chunk-YV4L3ILF.js.map +1 -0
  113. package/dist/{chunk-LLOLUHVG.js → chunk-YWFG7ZX7.js} +1358 -2746
  114. package/dist/chunk-YWFG7ZX7.js.map +1 -0
  115. package/dist/chunk-ZYRGEKWS.js +216 -0
  116. package/dist/chunk-ZYRGEKWS.js.map +1 -0
  117. package/dist/client.d.ts +7 -4
  118. package/dist/clipboard.js +1 -0
  119. package/dist/commands/types.d.ts +2 -0
  120. package/dist/components/anthropic-mark.d.ts +3 -0
  121. package/dist/components/approval-surface.d.ts +15 -0
  122. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  123. package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
  124. package/dist/components/artifacts/artifact-surface.d.ts +3 -1
  125. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  126. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  127. package/dist/components/artifacts/document-editor.d.ts +4 -2
  128. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  129. package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
  130. package/dist/components/artifacts/editable-document.d.ts +1 -1
  131. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  132. package/dist/components/artifacts/editable-spreadsheet.d.ts +2 -1
  133. package/dist/components/artifacts/index.d.ts +8 -1
  134. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  135. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  136. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  137. package/dist/components/artifacts/published-html-artifact-frame.d.ts +48 -3
  138. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  139. package/dist/components/artifacts/site-view.d.ts +23 -0
  140. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  141. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  142. package/dist/components/browser-select-control.d.ts +16 -0
  143. package/dist/components/browser-viewer.d.ts +10 -1
  144. package/dist/components/chat-composer.d.ts +21 -3
  145. package/dist/components/child-session-link.d.ts +5 -0
  146. package/dist/components/claude-mark.d.ts +3 -0
  147. package/dist/components/code-editor.d.ts +1 -4
  148. package/dist/components/composer.d.ts +45 -4
  149. package/dist/components/computer-viewer.d.ts +4 -1
  150. package/dist/components/copy-button.d.ts +3 -1
  151. package/dist/components/desktop-viewer.d.ts +1 -1
  152. package/dist/components/enrollment-consent.d.ts +6 -3
  153. package/dist/components/file-browser.d.ts +10 -1
  154. package/dist/components/fleet-tile.d.ts +2 -2
  155. package/dist/components/grok-mark.d.ts +26 -0
  156. package/dist/components/human-input-form.d.ts +21 -2
  157. package/dist/components/human-input-surface.d.ts +6 -3
  158. package/dist/components/machine-card.d.ts +4 -1
  159. package/dist/components/machines/machine-detail.d.ts +4 -1
  160. package/dist/components/machines/machine-operation-policy.d.ts +11 -0
  161. package/dist/components/machines-dashboard.d.ts +3 -1
  162. package/dist/components/markdown-table-layout.d.ts +12 -0
  163. package/dist/components/markdown.d.ts +47 -3
  164. package/dist/components/message-timeline.d.ts +72 -9
  165. package/dist/components/model-mark.d.ts +29 -0
  166. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  167. package/dist/components/model-policy-picker.d.ts +62 -13
  168. package/dist/components/open-geni-chat.d.ts +55 -0
  169. package/dist/components/open-geni-links.d.ts +68 -0
  170. package/dist/components/openrouter-mark.d.ts +6 -0
  171. package/dist/components/pierre-file.d.ts +1 -1
  172. package/dist/components/preview-loading.d.ts +2 -0
  173. package/dist/components/queue-item-content.d.ts +9 -0
  174. package/dist/components/sandbox-files.d.ts +13 -2
  175. package/dist/components/sandbox-workspace.d.ts +43 -3
  176. package/dist/components/session-capability-frame.d.ts +35 -0
  177. package/dist/components/session-chrome.d.ts +66 -8
  178. package/dist/components/session-commands-panel.d.ts +6 -0
  179. package/dist/components/session-commands.d.ts +6 -0
  180. package/dist/components/session-connection-request.d.ts +8 -0
  181. package/dist/components/session-conversation.d.ts +86 -0
  182. package/dist/components/session-list.d.ts +36 -0
  183. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  184. package/dist/components/timeline-anchor.d.ts +24 -0
  185. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  186. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  187. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  188. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  189. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  190. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  191. package/dist/components/timeline-annotations.d.ts +13 -3
  192. package/dist/components/timeline-reading-progress.d.ts +11 -0
  193. package/dist/components/timeline-search.d.ts +34 -0
  194. package/dist/components/timeline-settlement.d.ts +16 -0
  195. package/dist/components/tip-follow.d.ts +16 -0
  196. package/dist/components/usage-limit-notice.d.ts +49 -0
  197. package/dist/components/usage-member-list.d.ts +91 -0
  198. package/dist/components/usage-meter.d.ts +73 -0
  199. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  200. package/dist/components/user-message-body.d.ts +10 -1
  201. package/dist/components/workspace-dock.d.ts +6 -2
  202. package/dist/composer.d.ts +5 -4
  203. package/dist/composer.js +15 -9
  204. package/dist/computer-viewer-ENHVAZ2Q.js +19 -0
  205. package/dist/computer-viewer-ENHVAZ2Q.js.map +1 -0
  206. package/dist/connect-account-identity.d.ts +8 -0
  207. package/dist/connect-accounts.d.ts +15 -0
  208. package/dist/connect-chooser.d.ts +18 -0
  209. package/dist/connect-panel.d.ts +18 -0
  210. package/dist/connect-setup.d.ts +16 -0
  211. package/dist/connect.d.ts +21 -0
  212. package/dist/connect.js +2129 -0
  213. package/dist/connect.js.map +1 -0
  214. package/dist/connection-catalog.d.ts +38 -0
  215. package/dist/connection-discovery.d.ts +12 -0
  216. package/dist/connection-installed.d.ts +17 -0
  217. package/dist/connection-logo.d.ts +9 -0
  218. package/dist/connection-service-logo.d.ts +8 -0
  219. package/dist/connection-service-presentation.d.ts +13 -0
  220. package/dist/connection-skeleton.d.ts +5 -0
  221. package/dist/connection-type-picker.d.ts +6 -0
  222. package/dist/conversation-timeline.d.ts +5 -0
  223. package/dist/desktop.d.ts +7 -0
  224. package/dist/desktop.js +26 -0
  225. package/dist/desktop.js.map +1 -0
  226. package/dist/device-authorization.d.ts +23 -0
  227. package/dist/diffs.d.ts +8 -0
  228. package/dist/diffs.js +14 -0
  229. package/dist/diffs.js.map +1 -0
  230. package/dist/discovery-cache.d.ts +5 -0
  231. package/dist/editor.d.ts +7 -0
  232. package/dist/editor.js +21 -0
  233. package/dist/editor.js.map +1 -0
  234. package/dist/embedded-session-client.d.ts +23 -0
  235. package/dist/file-node-visibility.d.ts +15 -0
  236. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
  237. package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
  238. package/dist/hooks/channel-cache.d.ts +23 -0
  239. package/dist/hooks/latest-question.d.ts +25 -0
  240. package/dist/hooks/shared-machines-list.d.ts +14 -0
  241. package/dist/hooks/use-attached-browsers.d.ts +2 -1
  242. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  243. package/dist/hooks/use-browser-session.d.ts +12 -1
  244. package/dist/hooks/use-channels.d.ts +1 -0
  245. package/dist/hooks/use-codex-accounts.d.ts +25 -7
  246. package/dist/hooks/use-composer.d.ts +45 -9
  247. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  248. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  249. package/dist/hooks/use-computer-session.d.ts +2 -0
  250. package/dist/hooks/use-connect.d.ts +22 -0
  251. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  252. package/dist/hooks/use-file-attachments.d.ts +21 -2
  253. package/dist/hooks/use-machine-chip.d.ts +3 -3
  254. package/dist/hooks/use-machines.d.ts +19 -1
  255. package/dist/hooks/use-sandbox-files.d.ts +5 -1
  256. package/dist/hooks/use-session-background-commands.d.ts +14 -0
  257. package/dist/hooks/use-session-events.d.ts +30 -8
  258. package/dist/hooks/use-session-lineage.d.ts +4 -0
  259. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  260. package/dist/hooks/use-session.d.ts +6 -0
  261. package/dist/hooks/use-turn-queue.d.ts +12 -0
  262. package/dist/hooks/use-usage.d.ts +40 -0
  263. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  264. package/dist/hooks/use-workspace-sessions.d.ts +27 -5
  265. package/dist/human-input.d.ts +3 -1
  266. package/dist/identity-link-accounts.d.ts +11 -0
  267. package/dist/identity-link-consent.d.ts +18 -0
  268. package/dist/index.d.ts +60 -17
  269. package/dist/index.js +2237 -6200
  270. package/dist/index.js.map +1 -1
  271. package/dist/interaction.d.ts +1 -1
  272. package/dist/interaction.js +35 -184
  273. package/dist/interaction.js.map +1 -1
  274. package/dist/latest-question-755OW5DS.js +117 -0
  275. package/dist/latest-question-755OW5DS.js.map +1 -0
  276. package/dist/lib/error-message.d.ts +7 -0
  277. package/dist/lib/format.d.ts +36 -2
  278. package/dist/lib/host-theme.d.ts +70 -0
  279. package/dist/lib/interaction-errors.d.ts +6 -0
  280. package/dist/lib/menu-styles.d.ts +22 -0
  281. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  282. package/dist/lib/workbench-peers.d.ts +36 -0
  283. package/dist/lib/xterm-theme.d.ts +7 -5
  284. package/dist/machines.d.ts +4 -2
  285. package/dist/machines.js +14 -4
  286. package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
  287. package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
  288. package/dist/mcp-connection-status.d.ts +14 -0
  289. package/dist/model-policy-picker-menu-PWRI7R2X.js +14 -0
  290. package/dist/model-policy-picker-menu-PWRI7R2X.js.map +1 -0
  291. package/dist/model-policy.d.ts +19 -3
  292. package/dist/model-policy.js +9 -1
  293. package/dist/older-history.d.ts +30 -0
  294. package/dist/platform-activity-row-627BFZ46.js +182 -0
  295. package/dist/platform-activity-row-627BFZ46.js.map +1 -0
  296. package/dist/plugin-details.d.ts +14 -0
  297. package/dist/plugin-discovery.d.ts +25 -0
  298. package/dist/provider.d.ts +13 -1
  299. package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
  300. package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
  301. package/dist/realtime/realtime-control.d.ts +10 -3
  302. package/dist/realtime.js +229 -83
  303. package/dist/realtime.js.map +1 -1
  304. package/dist/sandbox-files-BBC47SLD.js +20 -0
  305. package/dist/sandbox-files-BBC47SLD.js.map +1 -0
  306. package/dist/session-auth-recommendation.d.ts +5 -0
  307. package/dist/session-capability-policy.d.ts +12 -0
  308. package/dist/session-ui.d.ts +30 -2
  309. package/dist/session-ui.js +85 -7
  310. package/dist/session-ui.js.map +1 -1
  311. package/dist/session.d.ts +8 -2
  312. package/dist/session.js +30 -19
  313. package/dist/sites-ui.d.ts +34 -0
  314. package/dist/sites.d.ts +3 -0
  315. package/dist/sites.js +11 -0
  316. package/dist/sites.js.map +1 -0
  317. package/dist/skill-discovery.d.ts +47 -0
  318. package/dist/terminal.d.ts +8 -0
  319. package/dist/terminal.js +31 -0
  320. package/dist/terminal.js.map +1 -0
  321. package/dist/timeline/activity-rail.d.ts +11 -2
  322. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  323. package/dist/timeline/compaction-copy.d.ts +10 -0
  324. package/dist/timeline/entrance.d.ts +13 -1
  325. package/dist/timeline/genie-loading.d.ts +34 -0
  326. package/dist/timeline/index.d.ts +6 -2
  327. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  328. package/dist/timeline/platform-activity-row.d.ts +14 -0
  329. package/dist/timeline/presented-image.d.ts +6 -0
  330. package/dist/timeline/projection.d.ts +31 -2
  331. package/dist/timeline/registry.d.ts +2 -0
  332. package/dist/timeline/retained-image.d.ts +18 -0
  333. package/dist/timeline/rolling-activity.d.ts +11 -0
  334. package/dist/timeline/screenshot-lightbox.d.ts +16 -1
  335. package/dist/timeline/shared.d.ts +8 -3
  336. package/dist/timeline/startup-preference.d.ts +3 -0
  337. package/dist/timeline/startup-timings.d.ts +4 -0
  338. package/dist/timeline/tool-display-name.d.ts +2 -1
  339. package/dist/timeline/turn-summary.d.ts +32 -3
  340. package/dist/timeline/types.d.ts +141 -7
  341. package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
  342. package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
  343. package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
  344. package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
  345. package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
  346. package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
  347. package/dist/types/machines.d.ts +2 -2
  348. package/dist/usage/allowance-copy.d.ts +25 -0
  349. package/dist/usage/summary.d.ts +35 -0
  350. package/dist/usage.d.ts +13 -0
  351. package/dist/usage.js +1074 -0
  352. package/dist/usage.js.map +1 -0
  353. package/package.json +44 -4
  354. package/src/accounts.tsx +1072 -0
  355. package/src/approvals.ts +8 -1
  356. package/src/artifacts.ts +42 -0
  357. package/src/assets/README.md +8 -0
  358. package/src/assets/gmail.ico +0 -0
  359. package/src/assets/outlook.ico +0 -0
  360. package/src/capability-catalog-row.tsx +94 -0
  361. package/src/capability-logo-fallback.ts +22 -0
  362. package/src/client.ts +22 -13
  363. package/src/commands/registry.ts +18 -15
  364. package/src/commands/types.ts +2 -0
  365. package/src/components/anthropic-mark.tsx +10 -0
  366. package/src/components/approval-surface.tsx +171 -37
  367. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  368. package/src/components/artifacts/artifact-sandbox.tsx +185 -0
  369. package/src/components/artifacts/artifact-surface.tsx +39 -19
  370. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  371. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  372. package/src/components/artifacts/document-editor.tsx +141 -16
  373. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  374. package/src/components/artifacts/editable-artifact-view.tsx +187 -0
  375. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  376. package/src/components/artifacts/editable-document.tsx +37 -36
  377. package/src/components/artifacts/editable-presentation.tsx +36 -18
  378. package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
  379. package/src/components/artifacts/index.ts +44 -0
  380. package/src/components/artifacts/inline-html-document.ts +24 -0
  381. package/src/components/artifacts/latest-task-runner.ts +49 -0
  382. package/src/components/artifacts/presentation-editor.tsx +323 -67
  383. package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
  384. package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
  385. package/src/components/artifacts/site-view.tsx +116 -0
  386. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  387. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  388. package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
  389. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  390. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  391. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  392. package/src/components/browser-select-control.tsx +312 -0
  393. package/src/components/browser-viewer.tsx +1054 -314
  394. package/src/components/chat-composer.tsx +131 -85
  395. package/src/components/child-session-link.tsx +27 -0
  396. package/src/components/claude-mark.tsx +10 -0
  397. package/src/components/code-editor.tsx +13 -16
  398. package/src/components/composer-transcription-control.tsx +7 -5
  399. package/src/components/composer.tsx +376 -49
  400. package/src/components/computer-viewer.tsx +1041 -329
  401. package/src/components/copy-button.tsx +13 -5
  402. package/src/components/desktop-viewer.tsx +1 -1
  403. package/src/components/enrollment-consent.tsx +65 -7
  404. package/src/components/enrollment-device-flow.tsx +1 -1
  405. package/src/components/file-browser.tsx +158 -34
  406. package/src/components/fleet-tile.tsx +8 -16
  407. package/src/components/generated-video-player.tsx +4 -2
  408. package/src/components/grok-mark.tsx +33 -0
  409. package/src/components/human-input-form.tsx +455 -114
  410. package/src/components/human-input-surface.tsx +18 -7
  411. package/src/components/interaction-intervention-banner.tsx +2 -2
  412. package/src/components/machine-card.tsx +119 -4
  413. package/src/components/machine-dock-bar.tsx +1 -1
  414. package/src/components/machine-input-display.ts +23 -2
  415. package/src/components/machines/machine-detail.tsx +52 -2
  416. package/src/components/machines/machine-operation-policy.tsx +179 -0
  417. package/src/components/machines-dashboard.tsx +8 -17
  418. package/src/components/markdown-table-layout.ts +132 -0
  419. package/src/components/markdown.tsx +473 -44
  420. package/src/components/message-timeline.tsx +2498 -663
  421. package/src/components/model-mark.tsx +90 -0
  422. package/src/components/model-picker.tsx +15 -4
  423. package/src/components/model-policy-picker-menu.tsx +424 -0
  424. package/src/components/model-policy-picker.tsx +337 -381
  425. package/src/components/open-geni-chat.tsx +319 -0
  426. package/src/components/open-geni-links.tsx +179 -0
  427. package/src/components/openrouter-mark.tsx +13 -0
  428. package/src/components/pierre-diff.tsx +41 -16
  429. package/src/components/pierre-file.tsx +36 -11
  430. package/src/components/preview-loading.tsx +154 -0
  431. package/src/components/queue-item-content.ts +14 -0
  432. package/src/components/queue-surface-implementation.tsx +132 -42
  433. package/src/components/queue-surface-state.tsx +3 -1
  434. package/src/components/sandbox-files.tsx +267 -35
  435. package/src/components/sandbox-terminal.tsx +48 -11
  436. package/src/components/sandbox-workspace.tsx +337 -135
  437. package/src/components/session-capability-frame.tsx +192 -0
  438. package/src/components/session-chrome.tsx +1027 -328
  439. package/src/components/session-commands-panel.tsx +126 -0
  440. package/src/components/session-commands.tsx +18 -0
  441. package/src/components/session-connection-request.tsx +97 -0
  442. package/src/components/session-conversation.tsx +512 -0
  443. package/src/components/session-list.tsx +250 -0
  444. package/src/components/session-mcp-capability-card.tsx +680 -0
  445. package/src/components/session-status.tsx +1 -1
  446. package/src/components/timeline-anchor.tsx +119 -0
  447. package/src/components/timeline-annotation-chrome.tsx +196 -0
  448. package/src/components/timeline-annotation-layout.ts +268 -0
  449. package/src/components/timeline-annotation-markers.tsx +185 -0
  450. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  451. package/src/components/timeline-annotation-selection.tsx +106 -54
  452. package/src/components/timeline-annotation-shared.ts +245 -0
  453. package/src/components/timeline-annotations-dialog.tsx +185 -128
  454. package/src/components/timeline-annotations.tsx +189 -45
  455. package/src/components/timeline-reading-progress.ts +80 -0
  456. package/src/components/timeline-search.tsx +168 -0
  457. package/src/components/timeline-settlement.ts +60 -0
  458. package/src/components/tip-follow.ts +70 -7
  459. package/src/components/tooltip.tsx +38 -5
  460. package/src/components/usage-limit-notice.tsx +179 -0
  461. package/src/components/usage-member-list.tsx +792 -0
  462. package/src/components/usage-meter.tsx +382 -0
  463. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  464. package/src/components/user-message-body.tsx +194 -49
  465. package/src/components/workspace-dock.tsx +141 -175
  466. package/src/composer.ts +6 -1
  467. package/src/connect-account-identity.tsx +34 -0
  468. package/src/connect-accounts.tsx +233 -0
  469. package/src/connect-chooser.tsx +336 -0
  470. package/src/connect-panel.tsx +99 -0
  471. package/src/connect-setup.tsx +307 -0
  472. package/src/connect.ts +60 -0
  473. package/src/connection-assets.d.ts +4 -0
  474. package/src/connection-catalog.tsx +162 -0
  475. package/src/connection-discovery.tsx +235 -0
  476. package/src/connection-installed.tsx +51 -0
  477. package/src/connection-logo.tsx +37 -0
  478. package/src/connection-service-logo.tsx +55 -0
  479. package/src/connection-service-presentation.ts +46 -0
  480. package/src/connection-skeleton.tsx +16 -0
  481. package/src/connection-type-picker.tsx +36 -0
  482. package/src/conversation-timeline.ts +92 -0
  483. package/src/desktop.ts +24 -0
  484. package/src/device-authorization.tsx +98 -0
  485. package/src/diffs.ts +16 -0
  486. package/src/discovery-cache.ts +42 -0
  487. package/src/editor.ts +13 -0
  488. package/src/embedded-session-client.ts +104 -0
  489. package/src/file-node-visibility.ts +66 -0
  490. package/src/hooks/channel-cache.ts +104 -0
  491. package/src/hooks/internal.ts +3 -2
  492. package/src/hooks/latest-question.ts +164 -0
  493. package/src/hooks/shared-machines-list.ts +239 -0
  494. package/src/hooks/use-attached-browsers.ts +5 -1
  495. package/src/hooks/use-available-models.ts +20 -14
  496. package/src/hooks/use-browser-frame-stream.ts +25 -3
  497. package/src/hooks/use-browser-session.ts +271 -71
  498. package/src/hooks/use-browser-sessions.ts +7 -1
  499. package/src/hooks/use-channels.ts +32 -10
  500. package/src/hooks/use-codex-accounts.ts +78 -21
  501. package/src/hooks/use-composer.ts +1034 -320
  502. package/src/hooks/use-computer-frame-stream.ts +39 -16
  503. package/src/hooks/use-computer-input-posture.ts +94 -0
  504. package/src/hooks/use-computer-session.ts +110 -32
  505. package/src/hooks/use-computer-sessions.ts +8 -1
  506. package/src/hooks/use-connect.ts +23 -0
  507. package/src/hooks/use-desktop-stream.ts +19 -28
  508. package/src/hooks/use-file-attachments.ts +118 -10
  509. package/src/hooks/use-goal.ts +36 -9
  510. package/src/hooks/use-human-input.ts +31 -4
  511. package/src/hooks/use-last-started-turn-policy.ts +15 -13
  512. package/src/hooks/use-machine-chip.ts +23 -6
  513. package/src/hooks/use-machines.ts +104 -6
  514. package/src/hooks/use-sandbox-files.ts +253 -150
  515. package/src/hooks/use-sandbox-git.ts +58 -29
  516. package/src/hooks/use-session-background-commands.ts +67 -0
  517. package/src/hooks/use-session-capabilities.ts +21 -2
  518. package/src/hooks/use-session-events.ts +759 -433
  519. package/src/hooks/use-session-lineage.ts +28 -6
  520. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  521. package/src/hooks/use-session.ts +75 -16
  522. package/src/hooks/use-slash-commands.ts +6 -11
  523. package/src/hooks/use-turn-queue.ts +113 -13
  524. package/src/hooks/use-usage.ts +100 -0
  525. package/src/hooks/use-voice-input.ts +12 -1
  526. package/src/hooks/use-workspace-capture.ts +3 -2
  527. package/src/hooks/use-workspace-edit.ts +23 -5
  528. package/src/hooks/use-workspace-sessions.ts +99 -11
  529. package/src/human-input.ts +12 -1
  530. package/src/identity-link-accounts.tsx +148 -0
  531. package/src/identity-link-consent.tsx +192 -0
  532. package/src/index.ts +157 -12
  533. package/src/interaction.ts +1 -0
  534. package/src/lib/error-message.ts +37 -0
  535. package/src/lib/format.ts +150 -14
  536. package/src/lib/host-theme.ts +511 -0
  537. package/src/lib/interaction-errors.ts +33 -0
  538. package/src/lib/menu-styles.ts +44 -0
  539. package/src/lib/pierre-diffs-loader.ts +53 -0
  540. package/src/lib/workbench-peers.ts +62 -0
  541. package/src/lib/xterm-theme.ts +23 -21
  542. package/src/machines.ts +9 -1
  543. package/src/mcp-connection-status.ts +35 -0
  544. package/src/model-policy.ts +223 -69
  545. package/src/older-history.ts +87 -0
  546. package/src/plugin-details.tsx +185 -0
  547. package/src/plugin-discovery.tsx +196 -0
  548. package/src/provider.tsx +55 -14
  549. package/src/realtime/dropdown-menu.tsx +19 -12
  550. package/src/realtime/realtime-control.tsx +274 -60
  551. package/src/session-auth-recommendation.ts +48 -0
  552. package/src/session-capability-policy.ts +83 -0
  553. package/src/session-context.ts +1 -0
  554. package/src/session-ui.ts +66 -2
  555. package/src/session.ts +18 -1
  556. package/src/sites-ui.tsx +402 -0
  557. package/src/sites.ts +3 -0
  558. package/src/skill-discovery.tsx +208 -0
  559. package/src/terminal.ts +26 -0
  560. package/src/timeline/activity-rail.tsx +171 -80
  561. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  562. package/src/timeline/compaction-copy.ts +42 -0
  563. package/src/timeline/entrance.tsx +28 -3
  564. package/src/timeline/fleet-decision-projection.ts +2 -1
  565. package/src/timeline/fleet-decision-row.tsx +1 -0
  566. package/src/timeline/genie-loading.tsx +136 -0
  567. package/src/timeline/index.ts +11 -0
  568. package/src/timeline/knowledge-receipt.tsx +100 -0
  569. package/src/timeline/parsers.ts +2 -2
  570. package/src/timeline/platform-activity-row.tsx +216 -0
  571. package/src/timeline/presented-image.ts +49 -0
  572. package/src/timeline/projection.ts +1600 -84
  573. package/src/timeline/registry.ts +15 -3
  574. package/src/timeline/retained-image.ts +97 -0
  575. package/src/timeline/rolling-activity.tsx +92 -0
  576. package/src/timeline/screenshot-lightbox.tsx +115 -17
  577. package/src/timeline/shared.tsx +47 -15
  578. package/src/timeline/startup-preference.ts +33 -0
  579. package/src/timeline/startup-timings.tsx +145 -0
  580. package/src/timeline/tool-display-name.ts +8 -6
  581. package/src/timeline/tool-renderers.tsx +497 -128
  582. package/src/timeline/turn-summary.tsx +208 -44
  583. package/src/timeline/types.ts +186 -7
  584. package/src/types/machines.ts +10 -0
  585. package/src/usage/allowance-copy.ts +64 -0
  586. package/src/usage/summary.ts +93 -0
  587. package/src/usage.ts +50 -0
  588. package/styles/compiled.css +2098 -757
  589. package/styles/connect.css +284 -0
  590. package/styles/connect.d.ts +1 -0
  591. package/styles/effective-tokens.css +1 -0
  592. package/styles/index.css +201 -9
  593. package/styles/responsive.css +27 -1
  594. package/styles/session-capability.css +44 -0
  595. package/styles/tokens.css +135 -65
  596. package/dist/chunk-5UQPNLIO.js.map +0 -1
  597. package/dist/chunk-6KLX2RH5.js.map +0 -1
  598. package/dist/chunk-7WCLAEFV.js.map +0 -1
  599. package/dist/chunk-B6WPZSTT.js.map +0 -1
  600. package/dist/chunk-FK6VG4LL.js +0 -90
  601. package/dist/chunk-FK6VG4LL.js.map +0 -1
  602. package/dist/chunk-HA46CYQK.js.map +0 -1
  603. package/dist/chunk-HUIKIDM5.js.map +0 -1
  604. package/dist/chunk-IGC6A2ZI.js.map +0 -1
  605. package/dist/chunk-KCGXPP5V.js.map +0 -1
  606. package/dist/chunk-KZ73RL76.js.map +0 -1
  607. package/dist/chunk-LAKLF4PA.js +0 -141
  608. package/dist/chunk-LAKLF4PA.js.map +0 -1
  609. package/dist/chunk-LLOLUHVG.js.map +0 -1
  610. package/dist/chunk-MKPIAGVL.js +0 -465
  611. package/dist/chunk-MKPIAGVL.js.map +0 -1
  612. package/dist/chunk-PEI6RANI.js.map +0 -1
  613. package/dist/chunk-R3AZOAB5.js.map +0 -1
  614. package/dist/chunk-WSK7G5LE.js +0 -170
  615. package/dist/chunk-WSK7G5LE.js.map +0 -1
  616. package/dist/chunk-XBZWOM2K.js +0 -218
  617. package/dist/chunk-XBZWOM2K.js.map +0 -1
  618. package/dist/chunk-Y7OEDUJ5.js +0 -8810
  619. package/dist/chunk-Y7OEDUJ5.js.map +0 -1
  620. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  621. package/dist/hooks/use-packs.d.ts +0 -32
  622. package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
  623. package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
  624. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  625. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  626. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  627. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  628. package/src/hooks/use-packs.ts +0 -157
  629. /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GTR5XQ7X.js.map} +0 -0
@@ -57,7 +57,12 @@ export type UseComputerFrameStreamResult = {
57
57
  frame: ComputerFrame | null;
58
58
  attachment: Pick<
59
59
  ComputerSessionAttachment,
60
- "computerSessionId" | "controllerGeneration" | "targetId" | "stream" | "expiresAt"
60
+ | "computerSessionId"
61
+ | "controllerGeneration"
62
+ | "targetId"
63
+ | "inputAllowed"
64
+ | "stream"
65
+ | "expiresAt"
61
66
  > | null;
62
67
  error: Error | null;
63
68
  reconnect: () => void;
@@ -159,9 +164,19 @@ export function useComputerFrameStream(
159
164
  pendingFrame = null;
160
165
  };
161
166
 
167
+ const clearRecoveryTimers = () => {
168
+ if (reconnectTimer) clearTimeout(reconnectTimer);
169
+ if (expiryTimer) clearTimeout(expiryTimer);
170
+ reconnectTimer = null;
171
+ expiryTimer = null;
172
+ };
173
+
162
174
  const scheduleReconnect = () => {
163
175
  if (disposed || reconnectTimer) return;
164
- if (failures >= MAX_AUTOMATIC_RECONNECTS_WITHOUT_A_FRAME) return;
176
+ if (failures >= MAX_AUTOMATIC_RECONNECTS_WITHOUT_A_FRAME) {
177
+ clearRecoveryTimers();
178
+ return;
179
+ }
165
180
  const delay = Math.min(5_000, 250 * 2 ** Math.min(failures, 5));
166
181
  failures += 1;
167
182
  setResult((current) => ({ ...current, state: "reconnecting" }));
@@ -177,6 +192,7 @@ export function useComputerFrameStream(
177
192
  setResult((current) => ({ ...current, state: "error", error }));
178
193
  clearSocket();
179
194
  if (reconnectAutomatically) scheduleReconnect();
195
+ else clearRecoveryTimers();
180
196
  };
181
197
 
182
198
  const onOpen = (source: ComputerFrameWebSocket) => {
@@ -211,10 +227,10 @@ export function useComputerFrameStream(
211
227
  const frame = await decodeComputerFrameMessage(bytes);
212
228
  if (disposed || source !== socket) continue;
213
229
  if (frame.computerSessionId !== computerSessionId || frame.targetId !== targetId) {
214
- throw new Error("computer frame belongs to another resource");
230
+ throw new Error("desktop frame belongs to another resource");
215
231
  }
216
232
  if (!controllerGeneration || frame.controllerGeneration !== controllerGeneration) {
217
- throw new Error("computer frame belongs to a stale controller");
233
+ throw new Error("desktop frame belongs to a stale controller");
218
234
  }
219
235
  const key = `${computerSessionId}:${targetId}:${frame.controllerGeneration}:${frame.targetGeneration}`;
220
236
  if (latestRef.current.key === key && frame.sequence <= latestRef.current.sequence)
@@ -246,7 +262,7 @@ export function useComputerFrameStream(
246
262
  if (disposed || source !== socket) return;
247
263
  let frameBytes = bytes;
248
264
  if (activeStream?.kind === "relay") {
249
- if (bytes.length < 1) throw new Error("computer relay returned an empty message");
265
+ if (bytes.length < 1) throw new Error("desktop relay returned an empty message");
250
266
  const tag = bytes[0];
251
267
  const body = bytes.subarray(1);
252
268
  if (tag === RELAY_TAG_OPEN_ACK) {
@@ -255,7 +271,7 @@ export function useComputerFrameStream(
255
271
  activeAttachment = null;
256
272
  activeStream = null;
257
273
  attachmentExpiresAt = 0;
258
- throw new Error(ack.error?.message ?? "computer stream was rejected by the relay");
274
+ throw new Error(ack.error?.message ?? "desktop stream was rejected by the relay");
259
275
  }
260
276
  relayAccepted = true;
261
277
  return;
@@ -269,7 +285,7 @@ export function useComputerFrameStream(
269
285
  attachmentExpiresAt = 0;
270
286
  lastRelaySequence = null;
271
287
  relayAccepted = false;
272
- fail(new Error("Computer frame source ended."), false);
288
+ fail(new Error("Desktop frame source ended."), false);
273
289
  return;
274
290
  }
275
291
  if (tag !== RELAY_TAG_FRAME || !relayAccepted) return;
@@ -290,13 +306,12 @@ export function useComputerFrameStream(
290
306
 
291
307
  const onError = (source: ComputerFrameWebSocket) => {
292
308
  if (source !== socket) return;
293
- fail(new Error("Computer view lost connection."));
309
+ fail(new Error("Desktop view lost connection."));
294
310
  };
295
311
 
296
312
  const onClose = (source: ComputerFrameWebSocket) => {
297
313
  if (disposed || source !== socket) return;
298
- clearSocket();
299
- scheduleReconnect();
314
+ fail(new Error("Desktop view lost connection."));
300
315
  };
301
316
 
302
317
  const connectSocket = () => {
@@ -356,16 +371,19 @@ export function useComputerFrameStream(
356
371
  expiresInSeconds: 120,
357
372
  ...(streamRef.current ? { stream: streamRef.current } : {}),
358
373
  },
359
- { signal: attachmentAbort.signal },
374
+ { signal: attachmentAbort.signal, timeoutMs: 15_000 },
360
375
  );
361
376
  if (disposed) return;
362
377
  if (
363
378
  attachment.computerSessionId !== computerSessionId ||
364
379
  attachment.targetId !== targetId
365
380
  ) {
366
- throw new Error("computer attachment does not match the requested resource");
381
+ throw new Error("desktop attachment does not match the requested resource");
367
382
  }
368
383
  controllerGeneration = attachment.controllerGeneration;
384
+ // A fresh attachment owns a new producer whose sequence can restart.
385
+ // Transport reconnects reuse the attachment and retain their sequence fence.
386
+ latestRef.current = { key: "", sequence: -1 };
369
387
  activeAttachment = attachment;
370
388
  activeStream = attachment.stream;
371
389
  attachmentExpiresAt = Date.parse(attachment.expiresAt);
@@ -378,6 +396,7 @@ export function useComputerFrameStream(
378
396
  computerSessionId: attachment.computerSessionId,
379
397
  controllerGeneration: attachment.controllerGeneration,
380
398
  targetId: attachment.targetId,
399
+ inputAllowed: attachment.inputAllowed,
381
400
  stream: attachment.stream,
382
401
  expiresAt: attachment.expiresAt,
383
402
  },
@@ -397,7 +416,7 @@ export function useComputerFrameStream(
397
416
  connectSocket();
398
417
  } catch (cause) {
399
418
  if (attachmentAbort.signal.aborted || disposed) return;
400
- fail(cause);
419
+ fail(cause, !isPlacementGenerationLossError(cause));
401
420
  }
402
421
  };
403
422
 
@@ -406,8 +425,7 @@ export function useComputerFrameStream(
406
425
  disposed = true;
407
426
  pendingFrame = null;
408
427
  attachmentAbort.abort();
409
- if (reconnectTimer) clearTimeout(reconnectTimer);
410
- if (expiryTimer) clearTimeout(expiryTimer);
428
+ clearRecoveryTimers();
411
429
  clearSocket(true);
412
430
  };
413
431
  }, [client, enabled, nonce, options.computerSessionId, options.targetId, workspaceId]);
@@ -430,5 +448,10 @@ async function messageBytes(value: unknown): Promise<Uint8Array> {
430
448
  if (typeof Blob !== "undefined" && value instanceof Blob) {
431
449
  return new Uint8Array(await value.arrayBuffer());
432
450
  }
433
- throw new Error("computer frame stream returned a non-binary message");
451
+ throw new Error("desktop frame stream returned a non-binary message");
452
+ }
453
+
454
+ function isPlacementGenerationLossError(cause: unknown): boolean {
455
+ const message = cause instanceof Error ? cause.message : String(cause);
456
+ return /placement instance changed|controller authority changed/i.test(message);
434
457
  }
@@ -0,0 +1,94 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import {
3
+ type EmbeddedComputerInteractionClientOverride,
4
+ useEmbeddedComputerInteraction,
5
+ } from "../session-context";
6
+
7
+ type PostureSource = {
8
+ client: ReturnType<typeof useEmbeddedComputerInteraction>["client"];
9
+ key: string;
10
+ };
11
+
12
+ type PostureState = {
13
+ source: PostureSource;
14
+ nonce: number;
15
+ inputAllowed: boolean | null;
16
+ pending: boolean;
17
+ error: Error | null;
18
+ };
19
+
20
+ /** Semantic-only targets need caller authority without opening a pixel stream.
21
+ * A source change synchronously discards the previous posture. */
22
+ export function useComputerInputPosture(
23
+ options: EmbeddedComputerInteractionClientOverride & {
24
+ computerSessionId: string | null;
25
+ controllerGeneration: string | null;
26
+ enabled: boolean;
27
+ },
28
+ ) {
29
+ const { client, workspaceId } = useEmbeddedComputerInteraction(options);
30
+ const { computerSessionId, controllerGeneration, enabled } = options;
31
+ const [nonce, setNonce] = useState(0);
32
+ const [state, setState] = useState<PostureState | null>(null);
33
+ const key = JSON.stringify([workspaceId, computerSessionId, controllerGeneration, enabled]);
34
+ const sourceRef = useRef<PostureSource>({ client, key });
35
+ if (sourceRef.current.client !== client || sourceRef.current.key !== key) {
36
+ sourceRef.current = { client, key };
37
+ }
38
+ const source = sourceRef.current;
39
+ const visible = state?.source === source && state.nonce === nonce ? state : null;
40
+ const refresh = useCallback(() => setNonce((value) => value + 1), []);
41
+
42
+ useEffect(() => {
43
+ if (!enabled || !computerSessionId || !controllerGeneration) return;
44
+ const controller = new AbortController();
45
+ let disposed = false;
46
+ setState({ source, nonce, inputAllowed: null, pending: true, error: null });
47
+ void (async () => {
48
+ try {
49
+ if (!client.getComputerInputPosture) {
50
+ throw new Error("Desktop input availability could not be verified.");
51
+ }
52
+ const posture = await client.getComputerInputPosture(workspaceId, computerSessionId, {
53
+ signal: controller.signal,
54
+ timeoutMs: 15_000,
55
+ });
56
+ if (disposed || sourceRef.current !== source) return;
57
+ if (
58
+ posture.computerSessionId !== computerSessionId ||
59
+ posture.controllerGeneration !== controllerGeneration ||
60
+ typeof posture.inputAllowed !== "boolean"
61
+ ) {
62
+ throw new Error("Desktop input availability belongs to a different controller.");
63
+ }
64
+ setState({
65
+ source,
66
+ nonce,
67
+ inputAllowed: posture.inputAllowed,
68
+ pending: false,
69
+ error: null,
70
+ });
71
+ } catch (cause) {
72
+ if (disposed || controller.signal.aborted || sourceRef.current !== source) return;
73
+ setState({
74
+ source,
75
+ nonce,
76
+ inputAllowed: null,
77
+ pending: false,
78
+ error: cause instanceof Error ? cause : new Error(String(cause)),
79
+ });
80
+ }
81
+ })();
82
+ return () => {
83
+ disposed = true;
84
+ controller.abort();
85
+ };
86
+ }, [client, computerSessionId, controllerGeneration, enabled, nonce, source, workspaceId]);
87
+
88
+ return {
89
+ inputAllowed: visible?.inputAllowed ?? null,
90
+ pending: enabled && (visible?.pending ?? true),
91
+ error: visible?.error ?? null,
92
+ refresh,
93
+ };
94
+ }
@@ -8,6 +8,10 @@ import type {
8
8
  ComputerTarget,
9
9
  } from "@opengeni/sdk/interaction";
10
10
  import { useCallback, useEffect, useRef, useState } from "react";
11
+ import {
12
+ isInteractionControlUnavailable,
13
+ isNonRetryableInteractionError,
14
+ } from "../lib/interaction-errors";
11
15
  import {
12
16
  type EmbeddedComputerInteractionClientOverride,
13
17
  useEmbeddedComputerInteraction,
@@ -28,6 +32,8 @@ export type UseComputerSessionResult = {
28
32
  loading: boolean;
29
33
  mutating: boolean;
30
34
  error: Error | null;
35
+ /** Control service loss, independent of target accessibility inspection and media. */
36
+ controlError: Error | null;
31
37
  refresh: () => Promise<void>;
32
38
  readClipboard: () => Promise<ComputerClipboard>;
33
39
  /** Changes only this viewer's target cursor; it never takes ownership or
@@ -55,6 +61,7 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
55
61
  );
56
62
  const visible =
57
63
  state.computerSessionId === computerSessionId ? state : emptyState(computerSessionId, enabled);
64
+ const refreshBlocked = isNonRetryableInteractionError(visible.error);
58
65
  const selectedTargetIdRef = useRef<string | null>(visible.selectedTargetId);
59
66
  selectedTargetIdRef.current = visible.selectedTargetId;
60
67
  const targetsRef = useRef<{
@@ -103,6 +110,7 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
103
110
  requestRef.current.controller?.abort();
104
111
  const controller = new AbortController();
105
112
  requestRef.current = { id, controller };
113
+ let discoveryCompleted = false;
106
114
  try {
107
115
  const [session, targetResponse] = await Promise.all([
108
116
  client.getComputerSession(workspaceId, computerSessionId, {
@@ -112,9 +120,38 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
112
120
  signal: controller.signal,
113
121
  }),
114
122
  ]);
123
+ discoveryCompleted = true;
115
124
  if (!mountedRef.current || requestRef.current.id !== id) return;
116
125
  const targets = sortComputerTargets(targetResponse.targets);
117
- const selected = chooseTarget(targets, selectedTargetIdRef.current, session.platform);
126
+ const selected = chooseTarget(targets, selectedTargetIdRef.current);
127
+ // Discovery is useful independently of semantic observation. Publish it
128
+ // now so a slow/unresponsive application cannot block the frame stream
129
+ // or prevent the person from choosing a different window or screen.
130
+ const previous = observationRef.current.observation;
131
+ const retainedObservation =
132
+ selected &&
133
+ previous?.target.id === selected.id &&
134
+ previous.target.controllerGeneration === selected.controllerGeneration &&
135
+ previous.target.targetGeneration === selected.targetGeneration
136
+ ? previous
137
+ : null;
138
+ selectedTargetIdRef.current = selected?.id ?? null;
139
+ targetsRef.current = { computerSessionId, targets };
140
+ observationRef.current = { computerSessionId, observation: retainedObservation };
141
+ setState((current) =>
142
+ current.computerSessionId === computerSessionId
143
+ ? {
144
+ ...current,
145
+ session,
146
+ targets,
147
+ selectedTargetId: selected?.id ?? null,
148
+ observation: retainedObservation,
149
+ loading: false,
150
+ error: null,
151
+ controlError: null,
152
+ }
153
+ : current,
154
+ );
118
155
  const observation = selected
119
156
  ? await client.observeComputerTarget(workspaceId, computerSessionId, selected.id, {
120
157
  signal: controller.signal,
@@ -139,12 +176,19 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
139
176
  );
140
177
  } catch (cause) {
141
178
  if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id) return;
179
+ const error = cause instanceof Error ? cause : new Error(String(cause));
142
180
  setState((current) =>
143
181
  current.computerSessionId === computerSessionId
144
182
  ? {
145
183
  ...current,
146
184
  loading: false,
147
- error: cause instanceof Error ? cause : new Error(String(cause)),
185
+ error,
186
+ controlError: isInteractionControlUnavailable(
187
+ error,
188
+ discoveryCompleted ? "observation" : "control",
189
+ )
190
+ ? error
191
+ : current.controlError,
148
192
  }
149
193
  : current,
150
194
  );
@@ -173,15 +217,15 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
173
217
  }, [computerSessionId, enabled, invalidateRefresh, refresh]);
174
218
 
175
219
  useEffect(() => {
176
- if (!enabled || !pageLive || visible.mutating) return;
220
+ if (!enabled || !pageLive || visible.mutating || refreshBlocked) return;
177
221
  const timer = setInterval(() => {
178
222
  if (!requestRef.current.controller) void refresh();
179
223
  }, pollIntervalMs);
180
224
  return () => clearInterval(timer);
181
- }, [enabled, pageLive, pollIntervalMs, refresh, visible.mutating]);
225
+ }, [enabled, pageLive, pollIntervalMs, refresh, refreshBlocked, visible.mutating]);
182
226
 
183
227
  useEffect(() => {
184
- if (!enabled || !computerSessionId || !pageLive) return;
228
+ if (!enabled || !computerSessionId || !pageLive || refreshBlocked) return;
185
229
  let disposed = false;
186
230
  const timer = setInterval(() => {
187
231
  void client.heartbeatComputerSession(workspaceId, computerSessionId).catch(() => {
@@ -192,7 +236,7 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
192
236
  disposed = true;
193
237
  clearInterval(timer);
194
238
  };
195
- }, [client, computerSessionId, enabled, pageLive, refresh, workspaceId]);
239
+ }, [client, computerSessionId, enabled, pageLive, refresh, refreshBlocked, workspaceId]);
196
240
 
197
241
  const runMutation = useCallback(
198
242
  async <T>(scopeComputerSessionId: string, operation: () => Promise<T>): Promise<T> => {
@@ -210,11 +254,23 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
210
254
  : current,
211
255
  );
212
256
  try {
213
- return await operation();
257
+ const result = await operation();
258
+ setState((current) =>
259
+ current.computerSessionId === scopeComputerSessionId
260
+ ? { ...current, controlError: null }
261
+ : current,
262
+ );
263
+ return result;
214
264
  } catch (cause) {
215
265
  const error = cause instanceof Error ? cause : new Error(String(cause));
216
266
  setState((current) =>
217
- current.computerSessionId === scopeComputerSessionId ? { ...current, error } : current,
267
+ current.computerSessionId === scopeComputerSessionId
268
+ ? {
269
+ ...current,
270
+ error,
271
+ controlError: isInteractionControlUnavailable(error) ? error : current.controlError,
272
+ }
273
+ : current,
218
274
  );
219
275
  throw error;
220
276
  } finally {
@@ -234,9 +290,9 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
234
290
 
235
291
  const selectTarget = useCallback(
236
292
  async (targetId: string): Promise<ComputerTarget> => {
237
- if (!computerSessionId) throw new Error("No ComputerSession is selected.");
293
+ if (!computerSessionId) throw new Error("No desktop is selected.");
238
294
  const target = targetsRef.current.targets.find((candidate) => candidate.id === targetId);
239
- if (!target) throw new Error("The selected computer target is no longer available.");
295
+ if (!target) throw new Error("The selected desktop target is no longer available.");
240
296
  invalidateRefresh();
241
297
  selectedTargetIdRef.current = target.id;
242
298
  observationRef.current = { computerSessionId, observation: null };
@@ -269,7 +325,14 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
269
325
  const error = cause instanceof Error ? cause : new Error(String(cause));
270
326
  setState((current) =>
271
327
  current.computerSessionId === computerSessionId && current.selectedTargetId === target.id
272
- ? { ...current, loading: false, error }
328
+ ? {
329
+ ...current,
330
+ loading: false,
331
+ error,
332
+ controlError: isInteractionControlUnavailable(error, "observation")
333
+ ? error
334
+ : current.controlError,
335
+ }
273
336
  : current,
274
337
  );
275
338
  throw error;
@@ -284,9 +347,9 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
284
347
  operationId: string,
285
348
  frame: ComputerFrame | null,
286
349
  ): Promise<ComputerActionReceipt> => {
287
- if (!computerSessionId) throw new Error("No ComputerSession is selected.");
350
+ if (!computerSessionId) throw new Error("No desktop is selected.");
288
351
  if (frame && frame.computerSessionId !== computerSessionId) {
289
- throw new Error("The displayed computer frame belongs to another ComputerSession.");
352
+ throw new Error("The displayed desktop frame belongs to another desktop session.");
290
353
  }
291
354
  const currentObservation =
292
355
  observationRef.current.computerSessionId === computerSessionId
@@ -301,19 +364,27 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
301
364
  ? (targetsRef.current.targets.find((candidate) => candidate.id === frame.targetId) ??
302
365
  (currentObservation?.target.id === frame.targetId ? currentObservation.target : null))
303
366
  : null;
304
- const target = frameTarget ?? focusTarget ?? currentObservation?.target ?? null;
305
- if (!target) throw new Error("The computer target is not ready for input.");
367
+ const inputTarget =
368
+ (action.type === "keyboard" || action.type === "clipboard") &&
369
+ targetsRef.current.computerSessionId === computerSessionId
370
+ ? targetsRef.current.targets.find(
371
+ (candidate) => candidate.id === selectedTargetIdRef.current,
372
+ )
373
+ : null;
374
+ const target =
375
+ frameTarget ?? focusTarget ?? currentObservation?.target ?? inputTarget ?? null;
376
+ if (!target) throw new Error("The desktop target is not ready for input.");
306
377
  if (frame && frame.targetId !== selectedTargetIdRef.current) {
307
- throw new Error("The displayed computer frame is no longer selected.");
378
+ throw new Error("The displayed desktop frame is no longer selected.");
308
379
  }
309
380
  if (action.type === "pointer") {
310
381
  const expectedFrameId = frame?.frameId ?? currentObservation?.frameId ?? null;
311
382
  if (!expectedFrameId || action.frameId !== expectedFrameId) {
312
- throw new Error("Pointer input must reference the exact displayed computer frame.");
383
+ throw new Error("Pointer input must reference the exact displayed desktop frame.");
313
384
  }
314
385
  }
315
386
  if (action.type === "semantic" && !currentObservation) {
316
- throw new Error("The computer accessibility tree is not ready for input.");
387
+ throw new Error("The desktop accessibility tree is not ready for input.");
317
388
  }
318
389
 
319
390
  return await runMutation(computerSessionId, async () => {
@@ -367,8 +438,22 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
367
438
  );
368
439
 
369
440
  const readClipboard = useCallback(async (): Promise<ComputerClipboard> => {
370
- if (!computerSessionId) throw new Error("No ComputerSession is selected.");
371
- return await client.readComputerClipboard(workspaceId, computerSessionId);
441
+ if (!computerSessionId) throw new Error("No desktop is selected.");
442
+ try {
443
+ return await client.readComputerClipboard(workspaceId, computerSessionId);
444
+ } catch (cause) {
445
+ const error = cause instanceof Error ? cause : new Error(String(cause));
446
+ setState((current) =>
447
+ current.computerSessionId === computerSessionId
448
+ ? {
449
+ ...current,
450
+ error,
451
+ controlError: isInteractionControlUnavailable(error) ? error : current.controlError,
452
+ }
453
+ : current,
454
+ );
455
+ throw error;
456
+ }
372
457
  }, [client, computerSessionId, workspaceId]);
373
458
 
374
459
  return {
@@ -380,6 +465,7 @@ export function useComputerSession(options: UseComputerSessionOptions): UseCompu
380
465
  loading: visible.loading,
381
466
  mutating: visible.mutating,
382
467
  error: visible.error,
468
+ controlError: visible.controlError,
383
469
  refresh,
384
470
  readClipboard,
385
471
  selectTarget,
@@ -397,6 +483,7 @@ type ComputerControlState = {
397
483
  loading: boolean;
398
484
  mutating: boolean;
399
485
  error: Error | null;
486
+ controlError: Error | null;
400
487
  };
401
488
 
402
489
  function emptyState(computerSessionId: string | null, loading: boolean): ComputerControlState {
@@ -409,32 +496,23 @@ function emptyState(computerSessionId: string | null, loading: boolean): Compute
409
496
  loading,
410
497
  mutating: false,
411
498
  error: null,
499
+ controlError: null,
412
500
  };
413
501
  }
414
502
 
415
503
  function chooseTarget(
416
504
  targets: readonly ComputerTarget[],
417
505
  preferredId: string | null,
418
- platform: ComputerSession["platform"],
419
506
  ): ComputerTarget | null {
420
507
  const preferred = targets.find((target) => target.id === preferredId);
421
508
  if (preferred) return preferred;
422
- if (platform === "linux") {
423
- return (
424
- targets.find((target) => target.focused && target.kind === "screen") ??
425
- targets.find((target) => target.kind === "screen") ??
426
- targets.find((target) => target.focused && target.kind === "window") ??
427
- targets.find((target) => target.kind === "window") ??
428
- targets[0] ??
429
- null
430
- );
431
- }
432
509
  return (
510
+ targets.find((target) => target.focused && target.kind === "screen") ??
511
+ targets.find((target) => target.kind === "screen") ??
433
512
  targets.find((target) => target.focused && target.kind === "window") ??
434
513
  targets.find((target) => target.kind === "window") ??
435
514
  targets.find((target) => target.focused && target.kind === "app") ??
436
515
  targets.find((target) => target.kind === "app") ??
437
- targets.find((target) => target.kind === "screen") ??
438
516
  targets[0] ??
439
517
  null
440
518
  );
@@ -74,6 +74,7 @@ export function useComputerSessions(
74
74
  requestRef.current = { id, controller };
75
75
  setState((current) => ({
76
76
  ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),
77
+ active: true,
77
78
  loading: foreground,
78
79
  refreshing: !foreground,
79
80
  error: foreground || current.workspaceId !== workspaceId ? null : current.error,
@@ -85,6 +86,7 @@ export function useComputerSessions(
85
86
  if (!mountedRef.current || requestRef.current.id !== id) return;
86
87
  setState({
87
88
  workspaceId,
89
+ active: true,
88
90
  revision: response.revision,
89
91
  sessions: sortComputerSessions(response.sessions),
90
92
  loading: false,
@@ -187,7 +189,10 @@ export function useComputerSessions(
187
189
  revision: visible.revision,
188
190
  sessions: visible.sessions,
189
191
  relevantSessions,
190
- loading: visible.loading,
192
+ // A disabled registry is deliberately empty. When its surface becomes
193
+ // visible again, expose that transition as loading in the same render so
194
+ // consumers cannot mistake the stale empty snapshot for a completed list.
195
+ loading: enabled ? !visible.active || visible.loading : false,
191
196
  refreshing: visible.refreshing,
192
197
  error: visible.error,
193
198
  refresh,
@@ -198,6 +203,7 @@ export function useComputerSessions(
198
203
 
199
204
  type ComputerRegistryState = {
200
205
  workspaceId: string;
206
+ active: boolean;
201
207
  revision: number;
202
208
  sessions: ComputerSession[];
203
209
  loading: boolean;
@@ -208,6 +214,7 @@ type ComputerRegistryState = {
208
214
  function emptyState(workspaceId: string, loading: boolean): ComputerRegistryState {
209
215
  return {
210
216
  workspaceId,
217
+ active: loading,
211
218
  revision: 0,
212
219
  sessions: [],
213
220
  loading,
@@ -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
+ }