@opengeni/react 1.0.1 → 1.0.2-canary.37202341988001

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 (632) hide show
  1. package/README.md +660 -21
  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-SHYKQRNX.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-26ZNDDLZ.js +453 -0
  18. package/dist/chunk-26ZNDDLZ.js.map +1 -0
  19. package/dist/chunk-3CTRFMAK.js +359 -0
  20. package/dist/chunk-3CTRFMAK.js.map +1 -0
  21. package/dist/chunk-447JLCBU.js +209 -0
  22. package/dist/chunk-447JLCBU.js.map +1 -0
  23. package/dist/chunk-4RVYOY4O.js +379 -0
  24. package/dist/chunk-4RVYOY4O.js.map +1 -0
  25. package/dist/chunk-5CVXZA3Y.js +292 -0
  26. package/dist/chunk-5CVXZA3Y.js.map +1 -0
  27. package/dist/chunk-5J4FOW6Q.js +108 -0
  28. package/dist/chunk-5J4FOW6Q.js.map +1 -0
  29. package/dist/chunk-742CZ3L3.js +481 -0
  30. package/dist/chunk-742CZ3L3.js.map +1 -0
  31. package/dist/chunk-A2PI6UMY.js +41 -0
  32. package/dist/chunk-A2PI6UMY.js.map +1 -0
  33. package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
  34. package/dist/chunk-A4UJB2MM.js.map +1 -0
  35. package/dist/chunk-B3V6TG77.js +41 -0
  36. package/dist/chunk-B3V6TG77.js.map +1 -0
  37. package/dist/chunk-BRM6FVZA.js +302 -0
  38. package/dist/chunk-BRM6FVZA.js.map +1 -0
  39. package/dist/chunk-C5X5AJXK.js +182 -0
  40. package/dist/chunk-C5X5AJXK.js.map +1 -0
  41. package/dist/{chunk-6KLX2RH5.js → chunk-DO544OSV.js} +1075 -79
  42. package/dist/chunk-DO544OSV.js.map +1 -0
  43. package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
  44. package/dist/chunk-DYWBUX5Q.js.map +1 -0
  45. package/dist/{chunk-HA46CYQK.js → chunk-EESD3PY3.js} +792 -537
  46. package/dist/chunk-EESD3PY3.js.map +1 -0
  47. package/dist/{chunk-5UQPNLIO.js → chunk-EN3YTHKR.js} +4117 -3896
  48. package/dist/chunk-EN3YTHKR.js.map +1 -0
  49. package/dist/chunk-ERGYJIBB.js +21 -0
  50. package/dist/chunk-ERGYJIBB.js.map +1 -0
  51. package/dist/chunk-FZCP527Y.js +116 -0
  52. package/dist/chunk-FZCP527Y.js.map +1 -0
  53. package/dist/chunk-GIMRELBW.js +14 -0
  54. package/dist/chunk-GIMRELBW.js.map +1 -0
  55. package/dist/chunk-GYVRFZDY.js +2733 -0
  56. package/dist/chunk-GYVRFZDY.js.map +1 -0
  57. package/dist/{chunk-LLOLUHVG.js → chunk-HDJWDK7W.js} +1358 -2746
  58. package/dist/chunk-HDJWDK7W.js.map +1 -0
  59. package/dist/chunk-I7IWRQLN.js +1608 -0
  60. package/dist/chunk-I7IWRQLN.js.map +1 -0
  61. package/dist/chunk-IT4BJUGF.js +13055 -0
  62. package/dist/chunk-IT4BJUGF.js.map +1 -0
  63. package/dist/chunk-IWIDV7SB.js +1 -0
  64. package/dist/chunk-IWIDV7SB.js.map +1 -0
  65. package/dist/chunk-J2QWVSQY.js +312 -0
  66. package/dist/chunk-J2QWVSQY.js.map +1 -0
  67. package/dist/chunk-J6DBS4T3.js +371 -0
  68. package/dist/chunk-J6DBS4T3.js.map +1 -0
  69. package/dist/{chunk-B6WPZSTT.js → chunk-JIQYUGVL.js} +1331 -1163
  70. package/dist/chunk-JIQYUGVL.js.map +1 -0
  71. package/dist/chunk-JT4JW7BC.js +54 -0
  72. package/dist/chunk-JT4JW7BC.js.map +1 -0
  73. package/dist/chunk-K3HQAKQX.js +24 -0
  74. package/dist/chunk-K3HQAKQX.js.map +1 -0
  75. package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
  76. package/dist/chunk-PNY3JKBJ.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-RLUSC2WA.js +299 -0
  80. package/dist/chunk-RLUSC2WA.js.map +1 -0
  81. package/dist/{chunk-IGC6A2ZI.js → chunk-RSI7XYXL.js} +777 -246
  82. package/dist/chunk-RSI7XYXL.js.map +1 -0
  83. package/dist/chunk-SCOTPE2I.js +589 -0
  84. package/dist/chunk-SCOTPE2I.js.map +1 -0
  85. package/dist/{chunk-C5ZPSSS5.js → chunk-TKOTKRWY.js} +5 -4
  86. package/dist/{chunk-C5ZPSSS5.js.map → chunk-TKOTKRWY.js.map} +1 -1
  87. package/dist/chunk-TMYGL6X5.js +742 -0
  88. package/dist/chunk-TMYGL6X5.js.map +1 -0
  89. package/dist/chunk-UGLEYEMP.js +33 -0
  90. package/dist/chunk-UGLEYEMP.js.map +1 -0
  91. package/dist/chunk-UK4TINKT.js +27 -0
  92. package/dist/chunk-UK4TINKT.js.map +1 -0
  93. package/dist/chunk-UTRTG6LH.js +220 -0
  94. package/dist/chunk-UTRTG6LH.js.map +1 -0
  95. package/dist/chunk-WEHMPOXK.js +39 -0
  96. package/dist/chunk-WEHMPOXK.js.map +1 -0
  97. package/dist/chunk-WGXVEJO5.js +319 -0
  98. package/dist/chunk-WGXVEJO5.js.map +1 -0
  99. package/dist/chunk-WRHIZYZF.js +988 -0
  100. package/dist/chunk-WRHIZYZF.js.map +1 -0
  101. package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
  102. package/dist/chunk-WUISZ3WU.js.map +1 -0
  103. package/dist/chunk-XCHWDJ22.js +107 -0
  104. package/dist/chunk-XCHWDJ22.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-YM2DE7BQ.js +3124 -0
  110. package/dist/chunk-YM2DE7BQ.js.map +1 -0
  111. package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
  112. package/dist/chunk-YQEAA6LT.js.map +1 -0
  113. package/dist/chunk-YV4L3ILF.js +9 -0
  114. package/dist/chunk-YV4L3ILF.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 +58 -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 +89 -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/session-proxy-scope.d.ts +21 -0
  185. package/dist/components/timeline-anchor.d.ts +24 -0
  186. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  187. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  188. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  189. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  190. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  191. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  192. package/dist/components/timeline-annotations.d.ts +13 -3
  193. package/dist/components/timeline-reading-progress.d.ts +11 -0
  194. package/dist/components/timeline-search.d.ts +34 -0
  195. package/dist/components/timeline-settlement.d.ts +16 -0
  196. package/dist/components/tip-follow.d.ts +16 -0
  197. package/dist/components/usage-limit-notice.d.ts +49 -0
  198. package/dist/components/usage-member-list.d.ts +91 -0
  199. package/dist/components/usage-meter.d.ts +73 -0
  200. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  201. package/dist/components/user-message-body.d.ts +10 -1
  202. package/dist/components/workspace-dock.d.ts +6 -2
  203. package/dist/composer.d.ts +5 -4
  204. package/dist/composer.js +15 -9
  205. package/dist/computer-viewer-6SRGWRUX.js +19 -0
  206. package/dist/computer-viewer-6SRGWRUX.js.map +1 -0
  207. package/dist/connect-account-identity.d.ts +8 -0
  208. package/dist/connect-accounts.d.ts +15 -0
  209. package/dist/connect-chooser.d.ts +18 -0
  210. package/dist/connect-panel.d.ts +18 -0
  211. package/dist/connect-setup.d.ts +16 -0
  212. package/dist/connect.d.ts +21 -0
  213. package/dist/connect.js +2129 -0
  214. package/dist/connect.js.map +1 -0
  215. package/dist/connection-catalog.d.ts +38 -0
  216. package/dist/connection-discovery.d.ts +12 -0
  217. package/dist/connection-installed.d.ts +17 -0
  218. package/dist/connection-logo.d.ts +9 -0
  219. package/dist/connection-service-logo.d.ts +8 -0
  220. package/dist/connection-service-presentation.d.ts +13 -0
  221. package/dist/connection-skeleton.d.ts +5 -0
  222. package/dist/connection-type-picker.d.ts +6 -0
  223. package/dist/conversation-timeline.d.ts +5 -0
  224. package/dist/desktop.d.ts +7 -0
  225. package/dist/desktop.js +26 -0
  226. package/dist/desktop.js.map +1 -0
  227. package/dist/device-authorization.d.ts +23 -0
  228. package/dist/diffs.d.ts +8 -0
  229. package/dist/diffs.js +14 -0
  230. package/dist/diffs.js.map +1 -0
  231. package/dist/discovery-cache.d.ts +5 -0
  232. package/dist/editor.d.ts +7 -0
  233. package/dist/editor.js +21 -0
  234. package/dist/editor.js.map +1 -0
  235. package/dist/embedded-session-client.d.ts +23 -0
  236. package/dist/file-node-visibility.d.ts +15 -0
  237. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
  238. package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
  239. package/dist/hooks/channel-cache.d.ts +23 -0
  240. package/dist/hooks/latest-question.d.ts +25 -0
  241. package/dist/hooks/shared-machines-list.d.ts +14 -0
  242. package/dist/hooks/use-attached-browsers.d.ts +2 -1
  243. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  244. package/dist/hooks/use-browser-session.d.ts +12 -1
  245. package/dist/hooks/use-channels.d.ts +1 -0
  246. package/dist/hooks/use-codex-accounts.d.ts +25 -7
  247. package/dist/hooks/use-composer.d.ts +45 -9
  248. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  249. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  250. package/dist/hooks/use-computer-session.d.ts +2 -0
  251. package/dist/hooks/use-connect.d.ts +22 -0
  252. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  253. package/dist/hooks/use-file-attachments.d.ts +21 -2
  254. package/dist/hooks/use-machine-chip.d.ts +3 -3
  255. package/dist/hooks/use-machines.d.ts +19 -1
  256. package/dist/hooks/use-sandbox-files.d.ts +5 -1
  257. package/dist/hooks/use-session-background-commands.d.ts +14 -0
  258. package/dist/hooks/use-session-events.d.ts +30 -8
  259. package/dist/hooks/use-session-lineage.d.ts +4 -0
  260. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  261. package/dist/hooks/use-session.d.ts +6 -0
  262. package/dist/hooks/use-turn-queue.d.ts +12 -0
  263. package/dist/hooks/use-usage.d.ts +40 -0
  264. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  265. package/dist/hooks/use-workspace-sessions.d.ts +27 -5
  266. package/dist/human-input.d.ts +3 -1
  267. package/dist/identity-link-accounts.d.ts +11 -0
  268. package/dist/identity-link-consent.d.ts +18 -0
  269. package/dist/index.d.ts +60 -17
  270. package/dist/index.js +2238 -6201
  271. package/dist/index.js.map +1 -1
  272. package/dist/interaction.d.ts +1 -1
  273. package/dist/interaction.js +35 -184
  274. package/dist/interaction.js.map +1 -1
  275. package/dist/latest-question-HTRIS4KJ.js +117 -0
  276. package/dist/latest-question-HTRIS4KJ.js.map +1 -0
  277. package/dist/lib/error-message.d.ts +7 -0
  278. package/dist/lib/format.d.ts +36 -2
  279. package/dist/lib/host-theme.d.ts +70 -0
  280. package/dist/lib/interaction-errors.d.ts +6 -0
  281. package/dist/lib/menu-styles.d.ts +22 -0
  282. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  283. package/dist/lib/workbench-peers.d.ts +36 -0
  284. package/dist/lib/xterm-theme.d.ts +7 -5
  285. package/dist/machines.d.ts +4 -2
  286. package/dist/machines.js +14 -4
  287. package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
  288. package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
  289. package/dist/mcp-connection-status.d.ts +14 -0
  290. package/dist/model-policy-picker-menu-M54ISBMN.js +14 -0
  291. package/dist/model-policy-picker-menu-M54ISBMN.js.map +1 -0
  292. package/dist/model-policy.d.ts +19 -3
  293. package/dist/model-policy.js +9 -1
  294. package/dist/older-history.d.ts +30 -0
  295. package/dist/platform-activity-row-627BFZ46.js +182 -0
  296. package/dist/platform-activity-row-627BFZ46.js.map +1 -0
  297. package/dist/plugin-details.d.ts +14 -0
  298. package/dist/plugin-discovery.d.ts +25 -0
  299. package/dist/provider.d.ts +13 -1
  300. package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
  301. package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
  302. package/dist/realtime/realtime-control.d.ts +6 -3
  303. package/dist/realtime.js +133 -74
  304. package/dist/realtime.js.map +1 -1
  305. package/dist/sandbox-files-GORZOUUJ.js +20 -0
  306. package/dist/sandbox-files-GORZOUUJ.js.map +1 -0
  307. package/dist/session-auth-recommendation.d.ts +5 -0
  308. package/dist/session-capability-policy.d.ts +12 -0
  309. package/dist/session-ui.d.ts +30 -2
  310. package/dist/session-ui.js +85 -7
  311. package/dist/session-ui.js.map +1 -1
  312. package/dist/session.d.ts +8 -2
  313. package/dist/session.js +30 -19
  314. package/dist/sites-ui.d.ts +34 -0
  315. package/dist/sites.d.ts +3 -0
  316. package/dist/sites.js +11 -0
  317. package/dist/sites.js.map +1 -0
  318. package/dist/skill-discovery.d.ts +47 -0
  319. package/dist/terminal.d.ts +8 -0
  320. package/dist/terminal.js +31 -0
  321. package/dist/terminal.js.map +1 -0
  322. package/dist/timeline/activity-rail.d.ts +11 -2
  323. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  324. package/dist/timeline/compaction-copy.d.ts +10 -0
  325. package/dist/timeline/entrance.d.ts +13 -1
  326. package/dist/timeline/genie-loading.d.ts +34 -0
  327. package/dist/timeline/index.d.ts +6 -2
  328. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  329. package/dist/timeline/platform-activity-row.d.ts +14 -0
  330. package/dist/timeline/presented-image.d.ts +6 -0
  331. package/dist/timeline/projection.d.ts +31 -2
  332. package/dist/timeline/registry.d.ts +2 -0
  333. package/dist/timeline/retained-image.d.ts +18 -0
  334. package/dist/timeline/rolling-activity.d.ts +11 -0
  335. package/dist/timeline/screenshot-lightbox.d.ts +16 -1
  336. package/dist/timeline/shared.d.ts +8 -3
  337. package/dist/timeline/startup-preference.d.ts +3 -0
  338. package/dist/timeline/startup-timings.d.ts +4 -0
  339. package/dist/timeline/tool-display-name.d.ts +2 -1
  340. package/dist/timeline/turn-summary.d.ts +34 -3
  341. package/dist/timeline/types.d.ts +147 -7
  342. package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
  343. package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
  344. package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
  345. package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
  346. package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
  347. package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
  348. package/dist/types/machines.d.ts +2 -2
  349. package/dist/usage/allowance-copy.d.ts +25 -0
  350. package/dist/usage/summary.d.ts +35 -0
  351. package/dist/usage.d.ts +13 -0
  352. package/dist/usage.js +1074 -0
  353. package/dist/usage.js.map +1 -0
  354. package/package.json +44 -4
  355. package/src/accounts.tsx +1072 -0
  356. package/src/approvals.ts +8 -1
  357. package/src/artifacts.ts +42 -0
  358. package/src/assets/README.md +8 -0
  359. package/src/assets/gmail.ico +0 -0
  360. package/src/assets/outlook.ico +0 -0
  361. package/src/capability-catalog-row.tsx +94 -0
  362. package/src/capability-logo-fallback.ts +22 -0
  363. package/src/client.ts +22 -13
  364. package/src/commands/registry.ts +18 -15
  365. package/src/commands/types.ts +2 -0
  366. package/src/components/anthropic-mark.tsx +10 -0
  367. package/src/components/approval-surface.tsx +171 -37
  368. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  369. package/src/components/artifacts/artifact-sandbox.tsx +185 -0
  370. package/src/components/artifacts/artifact-surface.tsx +39 -19
  371. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  372. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  373. package/src/components/artifacts/document-editor.tsx +141 -16
  374. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  375. package/src/components/artifacts/editable-artifact-view.tsx +187 -0
  376. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  377. package/src/components/artifacts/editable-document.tsx +37 -36
  378. package/src/components/artifacts/editable-presentation.tsx +36 -18
  379. package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
  380. package/src/components/artifacts/index.ts +44 -0
  381. package/src/components/artifacts/inline-html-document.ts +24 -0
  382. package/src/components/artifacts/latest-task-runner.ts +49 -0
  383. package/src/components/artifacts/presentation-editor.tsx +323 -67
  384. package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
  385. package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
  386. package/src/components/artifacts/site-view.tsx +116 -0
  387. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  388. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  389. package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
  390. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  391. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  392. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  393. package/src/components/browser-select-control.tsx +312 -0
  394. package/src/components/browser-viewer.tsx +1054 -314
  395. package/src/components/chat-composer.tsx +131 -85
  396. package/src/components/child-session-link.tsx +27 -0
  397. package/src/components/claude-mark.tsx +10 -0
  398. package/src/components/code-editor.tsx +13 -16
  399. package/src/components/composer-transcription-control.tsx +7 -5
  400. package/src/components/composer.tsx +376 -49
  401. package/src/components/computer-viewer.tsx +1041 -329
  402. package/src/components/copy-button.tsx +13 -5
  403. package/src/components/desktop-viewer.tsx +1 -1
  404. package/src/components/enrollment-consent.tsx +65 -7
  405. package/src/components/enrollment-device-flow.tsx +1 -1
  406. package/src/components/file-browser.tsx +158 -34
  407. package/src/components/fleet-tile.tsx +8 -16
  408. package/src/components/generated-video-player.tsx +4 -2
  409. package/src/components/grok-mark.tsx +33 -0
  410. package/src/components/human-input-form.tsx +455 -114
  411. package/src/components/human-input-surface.tsx +18 -7
  412. package/src/components/interaction-intervention-banner.tsx +2 -2
  413. package/src/components/machine-card.tsx +119 -4
  414. package/src/components/machine-dock-bar.tsx +1 -1
  415. package/src/components/machine-input-display.ts +23 -2
  416. package/src/components/machines/machine-detail.tsx +52 -2
  417. package/src/components/machines/machine-operation-policy.tsx +179 -0
  418. package/src/components/machines-dashboard.tsx +8 -17
  419. package/src/components/markdown-table-layout.ts +132 -0
  420. package/src/components/markdown.tsx +473 -44
  421. package/src/components/message-timeline.tsx +2754 -665
  422. package/src/components/model-mark.tsx +90 -0
  423. package/src/components/model-picker.tsx +15 -4
  424. package/src/components/model-policy-picker-menu.tsx +424 -0
  425. package/src/components/model-policy-picker.tsx +337 -381
  426. package/src/components/open-geni-chat.tsx +338 -0
  427. package/src/components/open-geni-links.tsx +179 -0
  428. package/src/components/openrouter-mark.tsx +13 -0
  429. package/src/components/pierre-diff.tsx +41 -16
  430. package/src/components/pierre-file.tsx +36 -11
  431. package/src/components/preview-loading.tsx +154 -0
  432. package/src/components/queue-item-content.ts +14 -0
  433. package/src/components/queue-surface-implementation.tsx +132 -42
  434. package/src/components/queue-surface-state.tsx +3 -1
  435. package/src/components/sandbox-files.tsx +267 -35
  436. package/src/components/sandbox-terminal.tsx +48 -11
  437. package/src/components/sandbox-workspace.tsx +337 -135
  438. package/src/components/session-capability-frame.tsx +192 -0
  439. package/src/components/session-chrome.tsx +1027 -328
  440. package/src/components/session-commands-panel.tsx +126 -0
  441. package/src/components/session-commands.tsx +18 -0
  442. package/src/components/session-connection-request.tsx +97 -0
  443. package/src/components/session-conversation.tsx +526 -0
  444. package/src/components/session-list.tsx +250 -0
  445. package/src/components/session-mcp-capability-card.tsx +680 -0
  446. package/src/components/session-proxy-scope.tsx +92 -0
  447. package/src/components/session-status.tsx +1 -1
  448. package/src/components/timeline-anchor.tsx +119 -0
  449. package/src/components/timeline-annotation-chrome.tsx +196 -0
  450. package/src/components/timeline-annotation-layout.ts +268 -0
  451. package/src/components/timeline-annotation-markers.tsx +185 -0
  452. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  453. package/src/components/timeline-annotation-selection.tsx +106 -54
  454. package/src/components/timeline-annotation-shared.ts +245 -0
  455. package/src/components/timeline-annotations-dialog.tsx +185 -128
  456. package/src/components/timeline-annotations.tsx +189 -45
  457. package/src/components/timeline-reading-progress.ts +80 -0
  458. package/src/components/timeline-search.tsx +168 -0
  459. package/src/components/timeline-settlement.ts +60 -0
  460. package/src/components/tip-follow.ts +70 -7
  461. package/src/components/tooltip.tsx +38 -5
  462. package/src/components/usage-limit-notice.tsx +179 -0
  463. package/src/components/usage-member-list.tsx +792 -0
  464. package/src/components/usage-meter.tsx +382 -0
  465. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  466. package/src/components/user-message-body.tsx +194 -49
  467. package/src/components/workspace-dock.tsx +141 -175
  468. package/src/composer.ts +6 -1
  469. package/src/connect-account-identity.tsx +34 -0
  470. package/src/connect-accounts.tsx +233 -0
  471. package/src/connect-chooser.tsx +336 -0
  472. package/src/connect-panel.tsx +99 -0
  473. package/src/connect-setup.tsx +307 -0
  474. package/src/connect.ts +60 -0
  475. package/src/connection-assets.d.ts +4 -0
  476. package/src/connection-catalog.tsx +162 -0
  477. package/src/connection-discovery.tsx +235 -0
  478. package/src/connection-installed.tsx +51 -0
  479. package/src/connection-logo.tsx +37 -0
  480. package/src/connection-service-logo.tsx +55 -0
  481. package/src/connection-service-presentation.ts +46 -0
  482. package/src/connection-skeleton.tsx +16 -0
  483. package/src/connection-type-picker.tsx +36 -0
  484. package/src/conversation-timeline.ts +92 -0
  485. package/src/desktop.ts +24 -0
  486. package/src/device-authorization.tsx +98 -0
  487. package/src/diffs.ts +16 -0
  488. package/src/discovery-cache.ts +42 -0
  489. package/src/editor.ts +13 -0
  490. package/src/embedded-session-client.ts +104 -0
  491. package/src/file-node-visibility.ts +66 -0
  492. package/src/hooks/channel-cache.ts +104 -0
  493. package/src/hooks/internal.ts +3 -2
  494. package/src/hooks/latest-question.ts +164 -0
  495. package/src/hooks/shared-machines-list.ts +239 -0
  496. package/src/hooks/use-attached-browsers.ts +5 -1
  497. package/src/hooks/use-available-models.ts +20 -14
  498. package/src/hooks/use-browser-frame-stream.ts +25 -3
  499. package/src/hooks/use-browser-session.ts +271 -71
  500. package/src/hooks/use-browser-sessions.ts +7 -1
  501. package/src/hooks/use-channels.ts +32 -10
  502. package/src/hooks/use-codex-accounts.ts +78 -21
  503. package/src/hooks/use-composer.ts +1034 -320
  504. package/src/hooks/use-computer-frame-stream.ts +39 -16
  505. package/src/hooks/use-computer-input-posture.ts +94 -0
  506. package/src/hooks/use-computer-session.ts +110 -32
  507. package/src/hooks/use-computer-sessions.ts +8 -1
  508. package/src/hooks/use-connect.ts +23 -0
  509. package/src/hooks/use-desktop-stream.ts +19 -28
  510. package/src/hooks/use-file-attachments.ts +118 -10
  511. package/src/hooks/use-goal.ts +36 -9
  512. package/src/hooks/use-human-input.ts +31 -4
  513. package/src/hooks/use-last-started-turn-policy.ts +15 -13
  514. package/src/hooks/use-machine-chip.ts +23 -6
  515. package/src/hooks/use-machines.ts +104 -6
  516. package/src/hooks/use-sandbox-files.ts +253 -150
  517. package/src/hooks/use-sandbox-git.ts +58 -29
  518. package/src/hooks/use-session-background-commands.ts +67 -0
  519. package/src/hooks/use-session-capabilities.ts +21 -2
  520. package/src/hooks/use-session-events.ts +759 -433
  521. package/src/hooks/use-session-lineage.ts +28 -6
  522. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  523. package/src/hooks/use-session.ts +75 -16
  524. package/src/hooks/use-slash-commands.ts +6 -11
  525. package/src/hooks/use-turn-queue.ts +113 -13
  526. package/src/hooks/use-usage.ts +100 -0
  527. package/src/hooks/use-video-artifact-playback.ts +1 -1
  528. package/src/hooks/use-voice-input.ts +12 -1
  529. package/src/hooks/use-workspace-capture.ts +3 -2
  530. package/src/hooks/use-workspace-edit.ts +23 -5
  531. package/src/hooks/use-workspace-sessions.ts +99 -11
  532. package/src/human-input.ts +12 -1
  533. package/src/identity-link-accounts.tsx +148 -0
  534. package/src/identity-link-consent.tsx +192 -0
  535. package/src/index.ts +157 -12
  536. package/src/interaction.ts +1 -0
  537. package/src/lib/error-message.ts +37 -0
  538. package/src/lib/format.ts +150 -14
  539. package/src/lib/host-theme.ts +511 -0
  540. package/src/lib/interaction-errors.ts +33 -0
  541. package/src/lib/menu-styles.ts +44 -0
  542. package/src/lib/pierre-diffs-loader.ts +53 -0
  543. package/src/lib/workbench-peers.ts +62 -0
  544. package/src/lib/xterm-theme.ts +23 -21
  545. package/src/machines.ts +9 -1
  546. package/src/mcp-connection-status.ts +35 -0
  547. package/src/model-policy.ts +223 -69
  548. package/src/older-history.ts +87 -0
  549. package/src/plugin-details.tsx +185 -0
  550. package/src/plugin-discovery.tsx +196 -0
  551. package/src/provider.tsx +55 -14
  552. package/src/realtime/dropdown-menu.tsx +19 -12
  553. package/src/realtime/realtime-control.tsx +133 -46
  554. package/src/session-auth-recommendation.ts +48 -0
  555. package/src/session-capability-policy.ts +83 -0
  556. package/src/session-context.ts +4 -3
  557. package/src/session-ui.ts +66 -2
  558. package/src/session.ts +18 -1
  559. package/src/sites-ui.tsx +402 -0
  560. package/src/sites.ts +3 -0
  561. package/src/skill-discovery.tsx +208 -0
  562. package/src/terminal.ts +26 -0
  563. package/src/timeline/activity-rail.tsx +171 -80
  564. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  565. package/src/timeline/compaction-copy.ts +42 -0
  566. package/src/timeline/entrance.tsx +28 -3
  567. package/src/timeline/fleet-decision-projection.ts +2 -1
  568. package/src/timeline/fleet-decision-row.tsx +1 -0
  569. package/src/timeline/genie-loading.tsx +136 -0
  570. package/src/timeline/index.ts +11 -0
  571. package/src/timeline/knowledge-receipt.tsx +100 -0
  572. package/src/timeline/parsers.ts +2 -2
  573. package/src/timeline/platform-activity-row.tsx +216 -0
  574. package/src/timeline/presented-image.ts +49 -0
  575. package/src/timeline/projection.ts +1609 -84
  576. package/src/timeline/registry.ts +15 -3
  577. package/src/timeline/retained-image.ts +97 -0
  578. package/src/timeline/rolling-activity.tsx +92 -0
  579. package/src/timeline/screenshot-lightbox.tsx +115 -17
  580. package/src/timeline/shared.tsx +47 -15
  581. package/src/timeline/startup-preference.ts +33 -0
  582. package/src/timeline/startup-timings.tsx +145 -0
  583. package/src/timeline/tool-display-name.ts +8 -6
  584. package/src/timeline/tool-renderers.tsx +497 -128
  585. package/src/timeline/turn-summary.tsx +218 -44
  586. package/src/timeline/types.ts +192 -7
  587. package/src/types/machines.ts +10 -0
  588. package/src/usage/allowance-copy.ts +64 -0
  589. package/src/usage/summary.ts +93 -0
  590. package/src/usage.ts +50 -0
  591. package/styles/compiled.css +2098 -757
  592. package/styles/connect.css +284 -0
  593. package/styles/connect.d.ts +1 -0
  594. package/styles/effective-tokens.css +1 -0
  595. package/styles/index.css +201 -9
  596. package/styles/responsive.css +27 -1
  597. package/styles/session-capability.css +44 -0
  598. package/styles/tokens.css +135 -65
  599. package/dist/chunk-5UQPNLIO.js.map +0 -1
  600. package/dist/chunk-6KLX2RH5.js.map +0 -1
  601. package/dist/chunk-7WCLAEFV.js.map +0 -1
  602. package/dist/chunk-B6WPZSTT.js.map +0 -1
  603. package/dist/chunk-FK6VG4LL.js +0 -90
  604. package/dist/chunk-FK6VG4LL.js.map +0 -1
  605. package/dist/chunk-HA46CYQK.js.map +0 -1
  606. package/dist/chunk-HUIKIDM5.js.map +0 -1
  607. package/dist/chunk-IGC6A2ZI.js.map +0 -1
  608. package/dist/chunk-KCGXPP5V.js.map +0 -1
  609. package/dist/chunk-KZ73RL76.js.map +0 -1
  610. package/dist/chunk-LAKLF4PA.js +0 -141
  611. package/dist/chunk-LAKLF4PA.js.map +0 -1
  612. package/dist/chunk-LLOLUHVG.js.map +0 -1
  613. package/dist/chunk-MKPIAGVL.js +0 -465
  614. package/dist/chunk-MKPIAGVL.js.map +0 -1
  615. package/dist/chunk-PEI6RANI.js.map +0 -1
  616. package/dist/chunk-R3AZOAB5.js.map +0 -1
  617. package/dist/chunk-WSK7G5LE.js +0 -170
  618. package/dist/chunk-WSK7G5LE.js.map +0 -1
  619. package/dist/chunk-XBZWOM2K.js +0 -218
  620. package/dist/chunk-XBZWOM2K.js.map +0 -1
  621. package/dist/chunk-Y7OEDUJ5.js +0 -8810
  622. package/dist/chunk-Y7OEDUJ5.js.map +0 -1
  623. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  624. package/dist/hooks/use-packs.d.ts +0 -32
  625. package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
  626. package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
  627. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  628. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  629. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  630. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  631. package/src/hooks/use-packs.ts +0 -157
  632. /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-SHYKQRNX.js.map} +0 -0
@@ -1,5 +1,6 @@
1
1
  import type { SessionHumanInputRequest, SubmitHumanInputResponseRequest } from "@opengeni/sdk";
2
2
  import { useEffect, useMemo, useRef } from "react";
3
+ import { isActionableHumanInputRequest } from "../human-input";
3
4
  import { cn } from "../lib/cn";
4
5
  import {
5
6
  HumanInputForm,
@@ -8,6 +9,7 @@ import {
8
9
  } from "./human-input-form";
9
10
 
10
11
  export type HumanInputSurfaceProps = {
12
+ loadSkillReview?: HumanInputFormProps["loadSkillReview"];
11
13
  requests: SessionHumanInputRequest[];
12
14
  onSubmit: (requestId: string, response: SubmitHumanInputResponseRequest) => void | Promise<void>;
13
15
  respondingRequestId?: string | null | undefined;
@@ -16,32 +18,39 @@ export type HumanInputSurfaceProps = {
16
18
  className?: string | undefined;
17
19
  /** Forwarded to the active form. Defaults true. */
18
20
  autoFocus?: boolean | undefined;
21
+ /** Forwarded to the active form: yes/no decisions as two buttons. */
22
+ decisionButtons?: boolean | undefined;
19
23
  };
20
24
 
21
25
  /**
22
26
  * One decision shell for pending structured human-input requests. Parallel
23
- * freezes are shown one at a time (oldest first) as “N of M”; Continue/Skip
27
+ * freezes are shown one at a time (oldest first) as “N of M”; Send answers/Skip
24
28
  * settles the active request and the next remaining set advances automatically
25
29
  * when the authoritative pending list updates.
26
30
  */
27
31
  export function HumanInputSurface({
28
32
  requests,
29
33
  onSubmit,
34
+ loadSkillReview,
30
35
  respondingRequestId = null,
31
36
  error,
32
37
  messages,
33
38
  className,
34
39
  autoFocus = true,
40
+ decisionButtons,
35
41
  }: HumanInputSurfaceProps) {
36
42
  const batchTotalRef = useRef(0);
37
43
 
38
44
  const ordered = useMemo(() => {
39
- return [...requests].sort((a, b) => {
40
- const aAt = a.createdAt ? Date.parse(a.createdAt) : 0;
41
- const bAt = b.createdAt ? Date.parse(b.createdAt) : 0;
42
- if (aAt !== bAt) return aAt - bAt;
43
- return a.id.localeCompare(b.id);
44
- });
45
+ const now = Date.now();
46
+ return requests
47
+ .filter((request) => isActionableHumanInputRequest(request, now))
48
+ .sort((a, b) => {
49
+ const aAt = a.createdAt ? Date.parse(a.createdAt) : 0;
50
+ const bAt = b.createdAt ? Date.parse(b.createdAt) : 0;
51
+ if (aAt !== bAt) return aAt - bAt;
52
+ return a.id.localeCompare(b.id);
53
+ });
45
54
  }, [requests]);
46
55
 
47
56
  useEffect(() => {
@@ -64,10 +73,12 @@ export function HumanInputSurface({
64
73
 
65
74
  const formProps: HumanInputFormProps = {
66
75
  request: active,
76
+ loadSkillReview,
67
77
  submitting: respondingRequestId !== null,
68
78
  error: error ?? null,
69
79
  progressLabel,
70
80
  autoFocus,
81
+ decisionButtons,
71
82
  ...(messages ? { messages } : {}),
72
83
  onSubmit: (response) => onSubmit(active.id, response),
73
84
  };
@@ -50,7 +50,7 @@ export function InteractionInterventionBanner({
50
50
  type="button"
51
51
  onClick={() => onOpen(intervention)}
52
52
  disabled={mutating}
53
- className="h-7 shrink-0 rounded-og-sm border border-og-border bg-og-surface-1 px-2.5 text-og-control font-medium text-og-fg transition hover:bg-og-surface-2 disabled:opacity-50"
53
+ className="h-7 shrink-0 rounded-og-sm border border-og-primary-border bg-og-primary px-2.5 text-og-control font-medium text-og-primary-fg transition hover:bg-og-primary-hover disabled:opacity-50"
54
54
  >
55
55
  Open
56
56
  </button>
@@ -59,7 +59,7 @@ export function InteractionInterventionBanner({
59
59
  type="button"
60
60
  onClick={() => onResolve(intervention, "completed")}
61
61
  disabled={mutating}
62
- className="inline-flex h-7 shrink-0 items-center gap-1 rounded-og-sm bg-og-accent px-2.5 text-og-control font-medium text-og-accent-fg transition hover:brightness-105 disabled:opacity-50"
62
+ className="inline-flex h-7 shrink-0 items-center gap-1 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-2.5 text-og-control font-medium transition hover:bg-og-primary-hover disabled:opacity-50"
63
63
  >
64
64
  {mutating ? (
65
65
  <LoaderCircleIcon className="size-3 animate-spin" />
@@ -1,9 +1,13 @@
1
1
  import {
2
+ AlertTriangleIcon,
2
3
  ArrowRightIcon,
3
4
  CpuIcon,
5
+ CircleCheckIcon,
6
+ DownloadIcon,
4
7
  LaptopIcon,
5
8
  MonitorIcon,
6
9
  MonitorOffIcon,
10
+ LoaderCircleIcon,
7
11
  ServerIcon,
8
12
  UsersIcon,
9
13
  } from "lucide-react";
@@ -20,6 +24,9 @@ export type MachineCardProps = {
20
24
  onAttach?: ((machine: MachineView) => void) | undefined;
21
25
  /** Whether an attach/swap is currently in flight (disables the affordance). */
22
26
  attaching?: boolean | undefined;
27
+ /** Start/retry the exact signed Connected Machine agent update. */
28
+ onUpdateAgent?: ((machine: MachineView) => void) | undefined;
29
+ updatingAgent?: boolean | undefined;
23
30
  /** Short recent history (e.g. 15m) — drives the card's CPU trend + preview. */
24
31
  series?: MetricSample[] | undefined;
25
32
  /** Open the full per-machine telemetry detail. Makes the whole card actionable. */
@@ -29,10 +36,12 @@ export type MachineCardProps = {
29
36
  };
30
37
 
31
38
  function KindIcon({ machine }: { machine: MachineView }) {
32
- if (machine.isSessionGroup)
39
+ if (machine.kind === "local" || machine.kind === "selfhosted")
40
+ return <LaptopIcon className="size-4 text-og-fg-subtle" aria-hidden />;
41
+ if (machine.kind === "docker" || machine.isSessionGroup)
33
42
  return <ServerIcon className="size-4 text-og-fg-subtle" aria-hidden />;
34
43
  if (machine.kind === "modal") return <CpuIcon className="size-4 text-og-fg-subtle" aria-hidden />;
35
- return <LaptopIcon className="size-4 text-og-fg-subtle" aria-hidden />;
44
+ return <ServerIcon className="size-4 text-og-fg-subtle" aria-hidden />;
36
45
  }
37
46
 
38
47
  /**
@@ -45,6 +54,8 @@ export function MachineCard({
45
54
  machine,
46
55
  onAttach,
47
56
  attaching,
57
+ onUpdateAgent,
58
+ updatingAgent,
48
59
  series,
49
60
  onOpenDetail,
50
61
  now,
@@ -59,6 +70,44 @@ export function MachineCard({
59
70
  : null;
60
71
  const cpuPts = (series ?? []).map((s) => ({ t: new Date(s.sampledAt).getTime(), v: s.cpuPct }));
61
72
  const openable = Boolean(onOpenDetail);
73
+ const runtime = machine.runtime;
74
+ const updateRunning = runtime?.versionState === "updating";
75
+ const dispatchConfirmationStalled =
76
+ runtime?.update?.status === "requested" &&
77
+ clockNow - new Date(runtime.update.updatedAt).getTime() >= 30_000;
78
+ const canUpdate =
79
+ Boolean(machine.enrollmentId && onUpdateAgent) &&
80
+ !offline &&
81
+ !runtime?.updateBlockedReason &&
82
+ (runtime?.versionState === "outdated" ||
83
+ runtime?.versionState === "update_failed" ||
84
+ dispatchConfirmationStalled);
85
+ const updateLabel = (() => {
86
+ const update = runtime?.update;
87
+ if (!update) return null;
88
+ switch (update.status) {
89
+ case "requested":
90
+ return dispatchConfirmationStalled ? "Agent confirmation delayed" : "Confirming with agent";
91
+ case "accepted":
92
+ return "Update accepted";
93
+ case "waiting_for_idle":
94
+ return "Waiting for current work";
95
+ case "downloading":
96
+ case "verifying":
97
+ case "applying":
98
+ return `${update.status}…`;
99
+ case "restarting":
100
+ return "Restarting agent";
101
+ case "succeeded":
102
+ return `Updated · v${update.targetVersion}`;
103
+ case "failed": {
104
+ const detail = update.errorCode?.replaceAll("_", " ");
105
+ return update.rolledBack
106
+ ? `Update rolled back safely${detail ? ` · ${detail}` : ""}`
107
+ : `Update failed${detail ? ` · ${detail}` : ""}`;
108
+ }
109
+ }
110
+ })();
62
111
 
63
112
  return (
64
113
  <div
@@ -108,10 +157,12 @@ export function MachineCard({
108
157
  ) : null}
109
158
  </div>
110
159
  <div className="mt-0.5 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-og-xs text-og-fg-subtle">
111
- <span className="capitalize">
112
- {machine.isSessionGroup ? "session sandbox" : machine.kind}
160
+ <span data-machine-scope={machine.scope} className="capitalize">
161
+ {machine.scope === "user" ? "personal" : machine.scope}
113
162
  </span>
114
163
  <span aria-hidden>·</span>
164
+ <span className="capitalize">{machine.kind}</span>
165
+ <span aria-hidden>·</span>
115
166
  <span className="font-og-mono">
116
167
  {machine.os}/{machine.arch}
117
168
  </span>
@@ -146,6 +197,70 @@ export function MachineCard({
146
197
  </p>
147
198
  ) : null}
148
199
 
200
+ {machine.connectionAuthority.duplicateRunnerDeniedCount > 0 ? (
201
+ <p
202
+ data-runner-conflict
203
+ className="flex items-center gap-1.5 rounded-og-md border border-og-status-failed/30 bg-og-status-failed/5 px-2.5 py-1.5 text-og-xs text-og-status-failed"
204
+ >
205
+ <AlertTriangleIcon className="size-3.5 shrink-0" aria-hidden />
206
+ Competing agent process blocked. Open diagnostics for details.
207
+ </p>
208
+ ) : null}
209
+
210
+ {runtime ? (
211
+ <div
212
+ data-agent-runtime
213
+ className="flex items-center justify-between gap-3 rounded-og-md border border-og-border/70 bg-og-surface-2/35 px-2.5 py-2 text-og-xs"
214
+ >
215
+ <div className="min-w-0">
216
+ <div className="flex items-center gap-1.5 text-og-fg-muted">
217
+ {runtime.versionState === "current" ? (
218
+ <CircleCheckIcon className="size-3.5 text-og-status-idle" aria-hidden />
219
+ ) : updateRunning ? (
220
+ <LoaderCircleIcon className="size-3.5 animate-og-spin text-og-accent" aria-hidden />
221
+ ) : (
222
+ <DownloadIcon className="size-3.5" aria-hidden />
223
+ )}
224
+ <span className="truncate">
225
+ Agent{" "}
226
+ {runtime.installedVersion ? `v${runtime.installedVersion}` : "version unknown"}
227
+ </span>
228
+ </div>
229
+ <p className="mt-0.5 truncate text-og-fg-subtle">
230
+ {updateLabel ??
231
+ (runtime.versionState === "current"
232
+ ? `Current · ${runtime.updateChannel ?? "channel unknown"}`
233
+ : runtime.desiredVersion
234
+ ? `Promoted v${runtime.desiredVersion}`
235
+ : "No promoted version configured")}
236
+ </p>
237
+ {runtime.updateBlockedReason ? (
238
+ <p className="mt-1 text-og-fg-muted">{runtime.updateBlockedReason}</p>
239
+ ) : null}
240
+ </div>
241
+ {canUpdate ? (
242
+ <button
243
+ type="button"
244
+ data-update-agent
245
+ disabled={updatingAgent}
246
+ onClick={(event) => {
247
+ event.stopPropagation();
248
+ onUpdateAgent?.(machine);
249
+ }}
250
+ className="shrink-0 rounded-og-sm border border-og-border px-2 py-1 font-medium text-og-fg-muted transition-colors hover:border-og-border-strong hover:text-og-fg disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:min-h-11"
251
+ >
252
+ {updatingAgent
253
+ ? "Starting…"
254
+ : dispatchConfirmationStalled
255
+ ? "Retry delivery"
256
+ : runtime.versionState === "update_failed"
257
+ ? "Retry"
258
+ : "Update"}
259
+ </button>
260
+ ) : null}
261
+ </div>
262
+ ) : null}
263
+
149
264
  <MachineMetrics metrics={machine.metrics} />
150
265
 
151
266
  {/* CPU trend — previews the history and invites opening the detail. */}
@@ -23,7 +23,7 @@ export type MachineDockBarProps = {
23
23
  * chrome (the dock-parity contract: selfhosted == Modal for the surfaces).
24
24
  */
25
25
  export function MachineDockBar({ name, kind, state, className }: MachineDockBarProps) {
26
- const Icon = kind === "selfhosted" ? LaptopIcon : CpuIcon;
26
+ const Icon = kind === "selfhosted" || kind === "local" ? LaptopIcon : CpuIcon;
27
27
  const stateBadge = MACHINE_STATE_BADGE_META[state];
28
28
  return (
29
29
  <div
@@ -3,10 +3,17 @@ import type { MachineInputMember } from "../timeline/types";
3
3
  export const MACHINE_INPUT_META: Record<MachineInputMember["kind"], string> = {
4
4
  scheduled_occurrence: "Scheduled update",
5
5
  goal_continuation: "Goal continued",
6
+ background_command_result: "Command result received",
7
+ session_wait_timeout: "Wait ended",
6
8
  agent_message: "Agent update",
7
9
  agent_steer_instruction: "Agent direction",
8
- child_terminal_result: "Agent finished",
10
+ child_terminal_result: "Agent result received",
9
11
  media_generation_result: "Video update",
12
+ child_requires_action: "Agent needs input",
13
+ child_requires_action_resolved: "Agent unblocked",
14
+ child_paused: "Agent paused",
15
+ child_waiting_capacity: "Agent waiting for capacity",
16
+ child_progress: "Agent progress",
10
17
  };
11
18
 
12
19
  /**
@@ -23,8 +30,12 @@ export function machineInputBatchLabel(members: readonly MachineInputMember[]):
23
30
  const kind = members[0]!.kind;
24
31
  const n = members.length;
25
32
  switch (kind) {
33
+ case "background_command_result":
34
+ return n === 1 ? "Command result received" : `${n} command results received`;
35
+ case "session_wait_timeout":
36
+ return n === 1 ? "Wait ended" : `${n} waits ended`;
26
37
  case "child_terminal_result":
27
- return n === 1 ? "Agent finished" : `${n} agents finished`;
38
+ return n === 1 ? "Agent result received" : `${n} agent results received`;
28
39
  case "goal_continuation":
29
40
  return n === 1 ? "Goal continued" : `${n} goal continuations`;
30
41
  case "scheduled_occurrence":
@@ -35,6 +46,16 @@ export function machineInputBatchLabel(members: readonly MachineInputMember[]):
35
46
  return n === 1 ? "Agent direction" : `${n} agent directions`;
36
47
  case "media_generation_result":
37
48
  return n === 1 ? "Video ready" : `${n} video updates`;
49
+ case "child_requires_action":
50
+ return n === 1 ? "Agent needs input" : `${n} agents need input`;
51
+ case "child_requires_action_resolved":
52
+ return n === 1 ? "Agent unblocked" : `${n} agents unblocked`;
53
+ case "child_paused":
54
+ return n === 1 ? "Agent paused" : `${n} agents paused`;
55
+ case "child_waiting_capacity":
56
+ return n === 1 ? "Agent waiting for capacity" : `${n} agents waiting for capacity`;
57
+ case "child_progress":
58
+ return n === 1 ? "Agent progress" : `${n} agent progress notes`;
38
59
  }
39
60
  }
40
61
  const parts = [...counts.entries()].map(([kind, count]) => {
@@ -7,6 +7,7 @@
7
7
  // `og-*` token system — no new visual language, just the missing depth.
8
8
  // ----------------------------------------------------------------------------
9
9
  import {
10
+ AlertTriangleIcon,
10
11
  ArrowLeftIcon,
11
12
  CpuIcon,
12
13
  LaptopIcon,
@@ -21,6 +22,8 @@ import { deriveHealth, HEALTH_TOKEN, healthPulses } from "./health";
21
22
  import { MetricHistoryChart } from "./metric-history-chart";
22
23
  import { MetricSparkline } from "./metric-sparkline";
23
24
  import { METRICS, METRIC_WINDOWS, pointsFor, WINDOW_LABEL, type MetricWindow } from "./series";
25
+ import { MachineOperationPolicyEditor } from "./machine-operation-policy";
26
+ import type { UpdateMachineOperationPolicyRequest } from "@opengeni/sdk";
24
27
 
25
28
  export type MachineDetailProps = {
26
29
  machine: MachineView;
@@ -32,14 +35,21 @@ export type MachineDetailProps = {
32
35
  onBack?: (() => void) | undefined;
33
36
  /** Open the workspace-admin removal confirmation for a self-hosted machine. */
34
37
  onRemove?: ((machine: MachineView) => void) | undefined;
38
+ onUpdateOperationPolicy?:
39
+ | ((machine: MachineView, request: UpdateMachineOperationPolicyRequest) => Promise<unknown>)
40
+ | undefined;
41
+ updatingOperationPolicy?: boolean | undefined;
35
42
  now?: number | undefined;
36
43
  className?: string | undefined;
37
44
  };
38
45
 
39
46
  function KindIcon({ kind, session }: { kind: string; session: boolean }) {
40
- if (session) return <ServerIcon className="size-4 text-og-fg-subtle" aria-hidden />;
47
+ if (kind === "local" || kind === "selfhosted")
48
+ return <LaptopIcon className="size-4 text-og-fg-subtle" aria-hidden />;
49
+ if (kind === "docker" || session)
50
+ return <ServerIcon className="size-4 text-og-fg-subtle" aria-hidden />;
41
51
  if (kind === "modal") return <CpuIcon className="size-4 text-og-fg-subtle" aria-hidden />;
42
- return <LaptopIcon className="size-4 text-og-fg-subtle" aria-hidden />;
52
+ return <ServerIcon className="size-4 text-og-fg-subtle" aria-hidden />;
43
53
  }
44
54
 
45
55
  export function MachineDetail({
@@ -50,6 +60,8 @@ export function MachineDetail({
50
60
  loadingSeries,
51
61
  onBack,
52
62
  onRemove,
63
+ onUpdateOperationPolicy,
64
+ updatingOperationPolicy,
53
65
  now = Date.now(),
54
66
  className,
55
67
  }: MachineDetailProps) {
@@ -57,6 +69,10 @@ export function MachineDetail({
57
69
  const tone = HEALTH_TOKEN[health.level];
58
70
  const latest = machine.metrics;
59
71
  const sampledAgo = latest ? formatRelativeTime(latest.sampledAt, new Date(now)) : null;
72
+ const authority = machine.connectionAuthority;
73
+ const duplicateDeniedAgo = authority.duplicateRunnerDeniedAt
74
+ ? formatRelativeTime(authority.duplicateRunnerDeniedAt, new Date(now))
75
+ : null;
60
76
 
61
77
  // Only render metrics that have a value (GPU is dropped on headless boxes).
62
78
  const visible = METRICS.filter((m) => !(m.key === "gpu" && latest?.gpuUtilPct == null));
@@ -206,8 +222,42 @@ export function MachineDetail({
206
222
  })}
207
223
  </div>
208
224
  )}
225
+
226
+ {authority.state !== "not_applicable" ? (
227
+ <div
228
+ data-connection-authority={authority.state}
229
+ className="flex flex-wrap items-center justify-between gap-2 rounded-og-md border border-og-border bg-og-surface-1/75 px-3 py-2 text-og-xs"
230
+ >
231
+ <span className="text-og-fg-muted">
232
+ Runner {authority.state.replace("_", " ")} · generation {authority.generation}
233
+ {authority.supersededCount > 0
234
+ ? ` · ${authority.supersededCount} earlier ${authority.supersededCount === 1 ? "runner" : "runners"} fenced`
235
+ : ""}
236
+ </span>
237
+ {authority.duplicateRunnerDeniedCount > 0 ? (
238
+ <span className="inline-flex items-center gap-1.5 text-og-status-failed">
239
+ <AlertTriangleIcon className="size-3.5" aria-hidden />
240
+ Blocked {authority.duplicateRunnerDeniedCount} competing runner
241
+ {authority.duplicateRunnerDeniedCount === 1 ? "" : "s"}
242
+ {duplicateDeniedAgo
243
+ ? ` · ${duplicateDeniedAgo === "now" ? "now" : `${duplicateDeniedAgo} ago`}`
244
+ : ""}
245
+ </span>
246
+ ) : null}
247
+ </div>
248
+ ) : null}
209
249
  </div>
210
250
 
251
+ {onUpdateOperationPolicy && machine.enrollmentId && machine.operationPolicy ? (
252
+ <MachineOperationPolicyEditor
253
+ policy={machine.operationPolicy}
254
+ memorySupported={machine.runtime?.capabilities.operationResourcePolicy === true}
255
+ cpuSupported={machine.runtime?.capabilities.operationCpuQuota === true}
256
+ saving={updatingOperationPolicy}
257
+ onSave={(request) => onUpdateOperationPolicy(machine, request)}
258
+ />
259
+ ) : null}
260
+
211
261
  {/* ── history charts ──────────────────────────────────────────────── */}
212
262
  <div className="grid grid-cols-1 gap-3 lg:grid-cols-2">
213
263
  {visible.map((m) => {
@@ -0,0 +1,179 @@
1
+ import { AlertTriangleIcon, Loader2Icon } from "lucide-react";
2
+ import { useEffect, useState, type FormEvent } from "react";
3
+ import type { MachineOperationPolicy, UpdateMachineOperationPolicyRequest } from "@opengeni/sdk";
4
+
5
+ export type MachineOperationPolicyEditorProps = {
6
+ policy: MachineOperationPolicy;
7
+ memorySupported: boolean;
8
+ cpuSupported: boolean;
9
+ saving?: boolean | undefined;
10
+ onSave: (request: UpdateMachineOperationPolicyRequest) => Promise<unknown> | unknown;
11
+ };
12
+
13
+ function fieldValue(value: number | null): string {
14
+ return value === null ? "" : String(value);
15
+ }
16
+
17
+ function parseByteCount(label: string, value: string): number | null {
18
+ const trimmed = value.trim();
19
+ if (!trimmed) return null;
20
+ if (!/^\d+$/.test(trimmed)) {
21
+ throw new Error(`${label} must be a whole number of bytes or blank`);
22
+ }
23
+ const parsed = Number(trimmed);
24
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
25
+ throw new Error(`${label} must be a positive safe-integer byte count or blank`);
26
+ }
27
+ return parsed;
28
+ }
29
+
30
+ function parseCpuMillicores(value: string): number | null {
31
+ const trimmed = value.trim();
32
+ if (!trimmed) return null;
33
+ if (!/^\d+$/.test(trimmed)) {
34
+ throw new Error("CPU maximum must be a whole number of millicores or blank");
35
+ }
36
+ const parsed = Number(trimmed);
37
+ if (!Number.isSafeInteger(parsed) || parsed <= 0 || parsed > 0xffff_ffff) {
38
+ throw new Error("CPU maximum must be between 1 and 4294967295 millicores or blank");
39
+ }
40
+ return parsed;
41
+ }
42
+
43
+ /** Exact editor for the optional per-enrollment command resource policy. Blank
44
+ * values remain genuinely unrestricted; CPU is a period-independent ratio. */
45
+ export function MachineOperationPolicyEditor({
46
+ policy,
47
+ memorySupported,
48
+ cpuSupported,
49
+ saving = false,
50
+ onSave,
51
+ }: MachineOperationPolicyEditorProps) {
52
+ const [memoryMaxBytes, setMemoryMaxBytes] = useState(fieldValue(policy.memoryMaxBytes));
53
+ const [memoryHighBytes, setMemoryHighBytes] = useState(fieldValue(policy.memoryHighBytes));
54
+ const [cpuMaxMillicores, setCpuMaxMillicores] = useState(fieldValue(policy.cpuMaxMillicores));
55
+ const [validationError, setValidationError] = useState<string | null>(null);
56
+
57
+ useEffect(() => {
58
+ setMemoryMaxBytes(fieldValue(policy.memoryMaxBytes));
59
+ setMemoryHighBytes(fieldValue(policy.memoryHighBytes));
60
+ setCpuMaxMillicores(fieldValue(policy.cpuMaxMillicores));
61
+ setValidationError(null);
62
+ }, [policy.memoryMaxBytes, policy.memoryHighBytes, policy.cpuMaxMillicores, policy.revision]);
63
+
64
+ const submit = async (event: FormEvent<HTMLFormElement>) => {
65
+ event.preventDefault();
66
+ try {
67
+ const max = parseByteCount("Hard ceiling", memoryMaxBytes);
68
+ const high = parseByteCount("Reclaim threshold", memoryHighBytes);
69
+ if (max !== null && high !== null && high > max) {
70
+ throw new Error("Reclaim threshold cannot exceed the hard ceiling");
71
+ }
72
+ const cpuMax = parseCpuMillicores(cpuMaxMillicores);
73
+ setValidationError(null);
74
+ await onSave({
75
+ memoryMaxBytes: max,
76
+ memoryHighBytes: high,
77
+ cpuMaxMillicores: cpuMax,
78
+ expectedRevision: policy.revision,
79
+ });
80
+ } catch (error) {
81
+ setValidationError(error instanceof Error ? error.message : String(error));
82
+ }
83
+ };
84
+
85
+ const configured =
86
+ policy.memoryMaxBytes !== null ||
87
+ policy.memoryHighBytes !== null ||
88
+ policy.cpuMaxMillicores !== null;
89
+ const memoryConfigured = policy.memoryMaxBytes !== null || policy.memoryHighBytes !== null;
90
+ const unsupportedMemory = memoryConfigured && !memorySupported;
91
+ const unsupportedCpu = policy.cpuMaxMillicores !== null && (!memorySupported || !cpuSupported);
92
+
93
+ return (
94
+ <section
95
+ data-machine-operation-policy
96
+ className="rounded-og-lg border border-og-border bg-og-surface-1 p-4 shadow-og-sm"
97
+ >
98
+ <div className="flex flex-col gap-1">
99
+ <h2 className="text-og-sm font-semibold text-og-fg">Per-command resource policy</h2>
100
+ <p className="text-og-xs leading-relaxed text-og-fg-muted">
101
+ Optional limits applied separately to each newly admitted exec and Git command. Running
102
+ commands keep their admitted policy. Blank means unrestricted. The runner or host may
103
+ apply a stricter explicit policy; browser, computer-use, and terminal capabilities remain
104
+ unchanged.
105
+ </p>
106
+ </div>
107
+
108
+ {configured && (unsupportedMemory || unsupportedCpu) ? (
109
+ <div className="mt-3 flex gap-2 rounded-og-md border border-og-status-failed/40 bg-og-status-failed/5 p-3 text-og-xs text-og-status-failed">
110
+ <AlertTriangleIcon className="mt-0.5 size-3.5 shrink-0" aria-hidden />
111
+ <span>
112
+ {unsupportedCpu
113
+ ? "This runner cannot enforce the configured CPU limit."
114
+ : "This runner cannot enforce the configured memory limit."}{" "}
115
+ Command execution fails closed until the current runner, OS, and service configuration
116
+ can enforce it, or the unsupported limit is cleared. You can still save limits now for
117
+ later enforcement.
118
+ </span>
119
+ </div>
120
+ ) : null}
121
+
122
+ <form className="mt-4 grid gap-3 sm:grid-cols-2" onSubmit={submit}>
123
+ <label className="flex flex-col gap-1.5 text-og-xs text-og-fg-muted">
124
+ Hard ceiling (bytes)
125
+ <input
126
+ inputMode="numeric"
127
+ pattern="[0-9]*"
128
+ value={memoryMaxBytes}
129
+ onChange={(event) => setMemoryMaxBytes(event.target.value)}
130
+ placeholder="Unlimited"
131
+ disabled={saving}
132
+ className="min-h-9 rounded-og-sm border border-og-border bg-og-bg px-2.5 font-og-mono text-og-sm text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/50 disabled:opacity-60"
133
+ />
134
+ </label>
135
+ <label className="flex flex-col gap-1.5 text-og-xs text-og-fg-muted">
136
+ Reclaim threshold (bytes)
137
+ <input
138
+ inputMode="numeric"
139
+ pattern="[0-9]*"
140
+ value={memoryHighBytes}
141
+ onChange={(event) => setMemoryHighBytes(event.target.value)}
142
+ placeholder="Unlimited"
143
+ disabled={saving}
144
+ className="min-h-9 rounded-og-sm border border-og-border bg-og-bg px-2.5 font-og-mono text-og-sm text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/50 disabled:opacity-60"
145
+ />
146
+ </label>
147
+ <label className="flex flex-col gap-1.5 text-og-xs text-og-fg-muted">
148
+ CPU maximum (millicores)
149
+ <input
150
+ inputMode="numeric"
151
+ pattern="[0-9]*"
152
+ value={cpuMaxMillicores}
153
+ onChange={(event) => setCpuMaxMillicores(event.target.value)}
154
+ placeholder="Unlimited"
155
+ disabled={saving}
156
+ className="min-h-9 rounded-og-sm border border-og-border bg-og-bg px-2.5 font-og-mono text-og-sm text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/50 disabled:opacity-60"
157
+ />
158
+ <span>1000 millicores = one CPU core. Blank is unlimited.</span>
159
+ </label>
160
+ <div className="flex min-h-9 items-center justify-between gap-3 sm:col-span-2">
161
+ <span
162
+ role={validationError ? "alert" : undefined}
163
+ className="text-og-xs text-og-status-failed"
164
+ >
165
+ {validationError}
166
+ </span>
167
+ <button
168
+ type="submit"
169
+ disabled={saving}
170
+ className="inline-flex min-h-9 items-center gap-1.5 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-3 py-1.5 text-og-xs font-medium transition-colors hover:bg-og-primary-hover disabled:cursor-not-allowed disabled:opacity-60"
171
+ >
172
+ {saving ? <Loader2Icon className="size-3.5 animate-spin" aria-hidden /> : null}
173
+ Save policy
174
+ </button>
175
+ </div>
176
+ </form>
177
+ </section>
178
+ );
179
+ }