@opengeni/react 0.46.1 → 0.52.1

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 (341) hide show
  1. package/README.md +158 -14
  2. package/dist/artifacts-document.d.ts +3 -0
  3. package/dist/artifacts-document.js +17 -0
  4. package/dist/artifacts-document.js.map +1 -0
  5. package/dist/artifacts-presentation.d.ts +3 -0
  6. package/dist/artifacts-presentation.js +17 -0
  7. package/dist/artifacts-presentation.js.map +1 -0
  8. package/dist/artifacts-spreadsheet.d.ts +3 -0
  9. package/dist/artifacts-spreadsheet.js +17 -0
  10. package/dist/artifacts-spreadsheet.js.map +1 -0
  11. package/dist/artifacts.d.ts +2 -0
  12. package/dist/artifacts.js +170 -0
  13. package/dist/artifacts.js.map +1 -0
  14. package/dist/chunk-6BBWWOOU.js +82 -0
  15. package/dist/chunk-6BBWWOOU.js.map +1 -0
  16. package/dist/{chunk-HFO4ERGQ.js → chunk-724BW4TW.js} +586 -35
  17. package/dist/chunk-724BW4TW.js.map +1 -0
  18. package/dist/chunk-7I2KB3OK.js +3895 -0
  19. package/dist/chunk-7I2KB3OK.js.map +1 -0
  20. package/dist/chunk-7WCLAEFV.js +2828 -0
  21. package/dist/chunk-7WCLAEFV.js.map +1 -0
  22. package/dist/{chunk-U3CSCMWA.js → chunk-FK6VG4LL.js} +9 -13
  23. package/dist/chunk-FK6VG4LL.js.map +1 -0
  24. package/dist/{chunk-SRFUT2ZU.js → chunk-FWS3KC3Z.js} +120 -64
  25. package/dist/chunk-FWS3KC3Z.js.map +1 -0
  26. package/dist/{chunk-EKZH6IDG.js → chunk-HDBG7XGO.js} +62 -1
  27. package/dist/chunk-HDBG7XGO.js.map +1 -0
  28. package/dist/chunk-HUIKIDM5.js +2148 -0
  29. package/dist/chunk-HUIKIDM5.js.map +1 -0
  30. package/dist/{chunk-LGVMUIRV.js → chunk-JAGDUCZQ.js} +1053 -390
  31. package/dist/chunk-JAGDUCZQ.js.map +1 -0
  32. package/dist/{chunk-LWR4MXSS.js → chunk-JR3QFY6B.js} +420 -35
  33. package/dist/chunk-JR3QFY6B.js.map +1 -0
  34. package/dist/chunk-JVYQRRC4.js +53 -0
  35. package/dist/chunk-JVYQRRC4.js.map +1 -0
  36. package/dist/chunk-KCGXPP5V.js +157 -0
  37. package/dist/chunk-KCGXPP5V.js.map +1 -0
  38. package/dist/{chunk-EB67J347.js → chunk-KZ73RL76.js} +111 -31
  39. package/dist/chunk-KZ73RL76.js.map +1 -0
  40. package/dist/chunk-PEI6RANI.js +3234 -0
  41. package/dist/chunk-PEI6RANI.js.map +1 -0
  42. package/dist/{chunk-3PB7MIT6.js → chunk-ROIRTM37.js} +220 -72
  43. package/dist/chunk-ROIRTM37.js.map +1 -0
  44. package/dist/chunk-VZTQ73XT.js +86 -0
  45. package/dist/chunk-VZTQ73XT.js.map +1 -0
  46. package/dist/{chunk-VCBFUSUZ.js → chunk-WSK7G5LE.js} +72 -4
  47. package/dist/chunk-WSK7G5LE.js.map +1 -0
  48. package/dist/{chunk-FGZUCXZF.js → chunk-WYA65Y3F.js} +16 -16
  49. package/dist/chunk-WYA65Y3F.js.map +1 -0
  50. package/dist/{chunk-6EDV6YFE.js → chunk-X4S56Y2H.js} +147 -35
  51. package/dist/chunk-X4S56Y2H.js.map +1 -0
  52. package/dist/client.d.ts +7 -1
  53. package/dist/clipboard.d.ts +1 -0
  54. package/dist/clipboard.js +7 -0
  55. package/dist/clipboard.js.map +1 -0
  56. package/dist/commands/index.d.ts +3 -3
  57. package/dist/commands/registry.d.ts +1 -1
  58. package/dist/commands/types.d.ts +1 -1
  59. package/dist/components/approval-surface.d.ts +2 -2
  60. package/dist/components/artifacts/artifact-surface.d.ts +18 -0
  61. package/dist/components/artifacts/document-editor.d.ts +172 -0
  62. package/dist/components/artifacts/editable-artifact-ui.d.ts +13 -0
  63. package/dist/components/artifacts/editable-artifact-workbench.d.ts +49 -0
  64. package/dist/components/artifacts/editable-document.d.ts +24 -0
  65. package/dist/components/artifacts/editable-presentation.d.ts +24 -0
  66. package/dist/components/artifacts/editable-spreadsheet.d.ts +32 -0
  67. package/dist/components/artifacts/index.d.ts +8 -0
  68. package/dist/components/artifacts/presentation-editor.d.ts +297 -0
  69. package/dist/components/artifacts/spreadsheet-canvas.d.ts +120 -0
  70. package/dist/components/artifacts/spreadsheet-grid.d.ts +113 -0
  71. package/dist/components/browser-viewer.d.ts +29 -0
  72. package/dist/components/chat-composer.d.ts +13 -8
  73. package/dist/components/code-editor.d.ts +25 -3
  74. package/dist/components/command-palette.d.ts +2 -2
  75. package/dist/components/composer-transcription-control.d.ts +4 -2
  76. package/dist/components/composer.d.ts +29 -15
  77. package/dist/components/computer-viewer.d.ts +23 -0
  78. package/dist/components/copy-button.d.ts +2 -2
  79. package/dist/components/desktop-viewer.d.ts +25 -21
  80. package/dist/components/diff-view.d.ts +1 -1
  81. package/dist/components/enrollment-consent.d.ts +1 -1
  82. package/dist/components/enrollment-device-flow.d.ts +1 -1
  83. package/dist/components/file-browser.d.ts +2 -2
  84. package/dist/components/fleet-tile.d.ts +1 -1
  85. package/dist/components/generated-video-player.d.ts +10 -0
  86. package/dist/components/human-input-form.d.ts +1 -1
  87. package/dist/components/human-input-surface.d.ts +2 -2
  88. package/dist/components/interactive-workbench-viewers.d.ts +2 -0
  89. package/dist/components/machine-card.d.ts +2 -2
  90. package/dist/components/machine-dock-bar.d.ts +3 -3
  91. package/dist/components/machine-health-pill.d.ts +2 -2
  92. package/dist/components/machine-input-display.d.ts +1 -1
  93. package/dist/components/machine-metrics.d.ts +2 -2
  94. package/dist/components/machine-status-pill.d.ts +4 -4
  95. package/dist/components/machines/health.d.ts +1 -1
  96. package/dist/components/machines/machine-detail.d.ts +5 -3
  97. package/dist/components/machines/metric-history-chart.d.ts +1 -1
  98. package/dist/components/machines/metric-sparkline.d.ts +2 -2
  99. package/dist/components/machines/series.d.ts +2 -2
  100. package/dist/components/machines-dashboard.d.ts +5 -5
  101. package/dist/components/markdown.d.ts +1 -1
  102. package/dist/components/message-timeline.d.ts +22 -5
  103. package/dist/components/model-picker.d.ts +2 -2
  104. package/dist/components/model-policy-picker.d.ts +7 -7
  105. package/dist/components/pierre-diff.d.ts +1 -1
  106. package/dist/components/pierre-file.d.ts +1 -1
  107. package/dist/components/queue-draft-policy.d.ts +1 -1
  108. package/dist/components/queue-surface-implementation.d.ts +3 -3
  109. package/dist/components/queue-surface-state.d.ts +4 -4
  110. package/dist/components/queue-surface.d.ts +5 -5
  111. package/dist/components/sandbox-files.d.ts +5 -5
  112. package/dist/components/sandbox-terminal.d.ts +50 -4
  113. package/dist/components/sandbox-workspace.d.ts +30 -10
  114. package/dist/components/session-chrome.d.ts +4 -4
  115. package/dist/components/session-status.d.ts +2 -2
  116. package/dist/components/timeline-annotation-selection.d.ts +9 -0
  117. package/dist/components/timeline-annotations-dialog.d.ts +16 -0
  118. package/dist/components/timeline-annotations.d.ts +13 -0
  119. package/dist/components/tooltip.d.ts +4 -4
  120. package/dist/components/user-message-body.d.ts +2 -2
  121. package/dist/components/workbench-changes.d.ts +2 -2
  122. package/dist/components/workspace-dock.d.ts +3 -1
  123. package/dist/composer.d.ts +11 -11
  124. package/dist/composer.js +7 -7
  125. package/dist/hooks/internal.d.ts +7 -1
  126. package/dist/hooks/use-attached-browsers.d.ts +21 -0
  127. package/dist/hooks/use-available-models.d.ts +2 -2
  128. package/dist/hooks/use-billing-usage.d.ts +1 -1
  129. package/dist/hooks/use-browser-frame-stream.d.ts +28 -0
  130. package/dist/hooks/use-browser-identities.d.ts +26 -0
  131. package/dist/hooks/use-browser-session.d.ts +28 -0
  132. package/dist/hooks/use-browser-sessions.d.ts +32 -0
  133. package/dist/hooks/use-codex-accounts.d.ts +3 -3
  134. package/dist/hooks/use-composer.d.ts +36 -9
  135. package/dist/hooks/use-computer-frame-stream.d.ts +24 -0
  136. package/dist/hooks/use-computer-session.d.ts +28 -0
  137. package/dist/hooks/use-computer-sessions.d.ts +28 -0
  138. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  139. package/dist/hooks/use-environments.d.ts +11 -5
  140. package/dist/hooks/use-file-attachments.d.ts +1 -1
  141. package/dist/hooks/use-goal.d.ts +2 -2
  142. package/dist/hooks/use-human-input.d.ts +2 -2
  143. package/dist/hooks/use-last-started-turn-policy.d.ts +2 -2
  144. package/dist/hooks/use-machine-chip.d.ts +2 -2
  145. package/dist/hooks/use-machines.d.ts +10 -3
  146. package/dist/hooks/use-packs.d.ts +7 -2
  147. package/dist/hooks/use-rigs.d.ts +1 -1
  148. package/dist/hooks/use-sandbox-files.d.ts +25 -4
  149. package/dist/hooks/use-sandbox-git.d.ts +13 -5
  150. package/dist/hooks/use-sandbox-terminal.d.ts +1 -1
  151. package/dist/hooks/use-scheduled-tasks.d.ts +1 -1
  152. package/dist/hooks/use-session-capabilities.d.ts +5 -4
  153. package/dist/hooks/use-session-control.d.ts +1 -1
  154. package/dist/hooks/use-session-events.d.ts +2 -2
  155. package/dist/hooks/use-session-lineage.d.ts +1 -1
  156. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  157. package/dist/hooks/use-session.d.ts +2 -2
  158. package/dist/hooks/use-slash-commands.d.ts +1 -1
  159. package/dist/hooks/use-terminal-stream.d.ts +8 -2
  160. package/dist/hooks/use-transcription.d.ts +2 -2
  161. package/dist/hooks/use-turn-queue.d.ts +2 -2
  162. package/dist/hooks/use-video-artifact-playback.d.ts +9 -0
  163. package/dist/hooks/use-voice-input.d.ts +6 -4
  164. package/dist/hooks/use-workspace-capture.d.ts +1 -1
  165. package/dist/hooks/use-workspace-edit.d.ts +1 -1
  166. package/dist/hooks/use-workspace-sessions.d.ts +1 -1
  167. package/dist/hooks/use-workspaces.d.ts +1 -1
  168. package/dist/index.d.ts +158 -154
  169. package/dist/index.js +1718 -908
  170. package/dist/index.js.map +1 -1
  171. package/dist/interaction.d.ts +23 -0
  172. package/dist/interaction.js +36 -0
  173. package/dist/interaction.js.map +1 -0
  174. package/dist/interactive-workbench-viewers-KHNOHWQE.js +13 -0
  175. package/dist/interactive-workbench-viewers-KHNOHWQE.js.map +1 -0
  176. package/dist/lib/composer-responsive-context.d.ts +9 -0
  177. package/dist/lib/relay-wire.d.ts +4 -0
  178. package/dist/lib/sandbox-liveness.d.ts +9 -0
  179. package/dist/lib/terminal-capability.d.ts +5 -0
  180. package/dist/lib/use-portal-token-style.d.ts +14 -3
  181. package/dist/lib/xterm-theme.d.ts +1 -1
  182. package/dist/machines.d.ts +30 -30
  183. package/dist/machines.js +3 -3
  184. package/dist/provider.d.ts +4 -4
  185. package/dist/{queue-surface-implementation-J4XJFKRW.js → queue-surface-implementation-2KVJTYXH.js} +117 -64
  186. package/dist/queue-surface-implementation-2KVJTYXH.js.map +1 -0
  187. package/dist/realtime/dropdown-menu.d.ts +8 -8
  188. package/dist/realtime/realtime-control.d.ts +15 -6
  189. package/dist/realtime.d.ts +4 -4
  190. package/dist/realtime.js +30 -33
  191. package/dist/realtime.js.map +1 -1
  192. package/dist/session-context.d.ts +19 -1
  193. package/dist/session-ui.d.ts +14 -14
  194. package/dist/session-ui.js +6 -5
  195. package/dist/session.d.ts +28 -28
  196. package/dist/session.js +5 -5
  197. package/dist/timeline/activity-rail.d.ts +6 -3
  198. package/dist/timeline/disclosure-context.d.ts +1 -1
  199. package/dist/timeline/fleet-decision-projection.d.ts +1 -1
  200. package/dist/timeline/fleet-decision-row.d.ts +3 -3
  201. package/dist/timeline/index.d.ts +19 -19
  202. package/dist/timeline/parsers.d.ts +6 -3
  203. package/dist/timeline/projection.d.ts +3 -3
  204. package/dist/timeline/registry.d.ts +10 -1
  205. package/dist/timeline/screenshot-lightbox.d.ts +2 -2
  206. package/dist/timeline/shared.d.ts +21 -10
  207. package/dist/timeline/tool-diff.d.ts +2 -2
  208. package/dist/timeline/tool-renderers.d.ts +1 -1
  209. package/dist/timeline/turn-summary.d.ts +3 -3
  210. package/dist/timeline/types.d.ts +42 -2
  211. package/dist/timeline-annotation-selection-3L7LHGG2.js +187 -0
  212. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +1 -0
  213. package/dist/timeline-annotations-dialog-U7EVLR75.js +196 -0
  214. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +1 -0
  215. package/dist/voice-recording-store.d.ts +8 -2
  216. package/package.json +52 -7
  217. package/src/artifacts-document.ts +31 -0
  218. package/src/artifacts-presentation.ts +36 -0
  219. package/src/artifacts-spreadsheet.ts +21 -0
  220. package/src/artifacts.ts +86 -0
  221. package/src/client.ts +90 -1
  222. package/src/clipboard.ts +2 -0
  223. package/src/components/artifacts/artifact-surface.tsx +93 -0
  224. package/src/components/artifacts/document-editor.tsx +2255 -0
  225. package/src/components/artifacts/editable-artifact-ui.tsx +89 -0
  226. package/src/components/artifacts/editable-artifact-workbench.tsx +203 -0
  227. package/src/components/artifacts/editable-document.tsx +657 -0
  228. package/src/components/artifacts/editable-presentation.tsx +1020 -0
  229. package/src/components/artifacts/editable-spreadsheet.tsx +733 -0
  230. package/src/components/artifacts/index.ts +99 -0
  231. package/src/components/artifacts/presentation-editor.tsx +3148 -0
  232. package/src/components/artifacts/spreadsheet-canvas.ts +799 -0
  233. package/src/components/artifacts/spreadsheet-grid.tsx +2129 -0
  234. package/src/components/browser-viewer.tsx +1592 -0
  235. package/src/components/chat-composer.tsx +25 -2
  236. package/src/components/code-editor.tsx +90 -31
  237. package/src/components/command-palette.tsx +1 -1
  238. package/src/components/composer-transcription-control.tsx +51 -22
  239. package/src/components/composer.tsx +49 -23
  240. package/src/components/computer-viewer.tsx +1139 -0
  241. package/src/components/copy-button.tsx +1 -1
  242. package/src/components/desktop-viewer.tsx +103 -75
  243. package/src/components/file-browser.tsx +39 -17
  244. package/src/components/generated-video-player.tsx +89 -0
  245. package/src/components/human-input-form.tsx +2 -2
  246. package/src/components/interactive-workbench-viewers.ts +2 -0
  247. package/src/components/machine-card.tsx +1 -1
  248. package/src/components/machine-input-display.ts +3 -0
  249. package/src/components/machines/machine-detail.tsx +39 -15
  250. package/src/components/machines-dashboard.tsx +7 -6
  251. package/src/components/message-timeline.tsx +327 -37
  252. package/src/components/model-picker.tsx +2 -2
  253. package/src/components/model-policy-picker.tsx +16 -15
  254. package/src/components/queue-surface-implementation.tsx +135 -75
  255. package/src/components/queue-surface-state.tsx +2 -2
  256. package/src/components/sandbox-files.tsx +142 -62
  257. package/src/components/sandbox-terminal.tsx +119 -35
  258. package/src/components/sandbox-workspace.tsx +394 -228
  259. package/src/components/session-chrome.tsx +67 -27
  260. package/src/components/timeline-annotation-selection.tsx +221 -0
  261. package/src/components/timeline-annotations-dialog.tsx +213 -0
  262. package/src/components/timeline-annotations.tsx +84 -0
  263. package/src/components/tooltip.tsx +13 -16
  264. package/src/components/user-message-body.tsx +1 -1
  265. package/src/components/workbench-changes.tsx +192 -35
  266. package/src/components/workspace-dock.tsx +13 -5
  267. package/src/composer.ts +3 -0
  268. package/src/hooks/internal.ts +132 -38
  269. package/src/hooks/use-attached-browsers.ts +152 -0
  270. package/src/hooks/use-browser-frame-stream.ts +316 -0
  271. package/src/hooks/use-browser-identities.ts +225 -0
  272. package/src/hooks/use-browser-session.ts +476 -0
  273. package/src/hooks/use-browser-sessions.ts +281 -0
  274. package/src/hooks/use-codex-accounts.ts +4 -4
  275. package/src/hooks/use-composer.ts +769 -24
  276. package/src/hooks/use-computer-frame-stream.ts +311 -0
  277. package/src/hooks/use-computer-session.ts +442 -0
  278. package/src/hooks/use-computer-sessions.ts +245 -0
  279. package/src/hooks/use-environments.ts +24 -5
  280. package/src/hooks/use-file-attachments.ts +70 -32
  281. package/src/hooks/use-goal.ts +17 -5
  282. package/src/hooks/use-machine-chip.ts +5 -3
  283. package/src/hooks/use-machines.ts +79 -3
  284. package/src/hooks/use-packs.ts +51 -0
  285. package/src/hooks/use-sandbox-files.ts +382 -88
  286. package/src/hooks/use-sandbox-git.ts +208 -46
  287. package/src/hooks/use-sandbox-terminal.ts +3 -2
  288. package/src/hooks/use-session-capabilities.ts +94 -70
  289. package/src/hooks/use-session-events.ts +18 -4
  290. package/src/hooks/use-terminal-stream.ts +102 -23
  291. package/src/hooks/use-transcription.ts +4 -14
  292. package/src/hooks/use-turn-queue.ts +17 -5
  293. package/src/hooks/use-video-artifact-playback.ts +28 -0
  294. package/src/hooks/use-voice-input.ts +163 -19
  295. package/src/hooks/use-windowed-sections.ts +9 -7
  296. package/src/hooks/use-workspace-edit.ts +2 -1
  297. package/src/index.ts +21 -6
  298. package/src/interaction.ts +71 -0
  299. package/src/lib/composer-responsive-context.ts +15 -0
  300. package/src/lib/relay-wire.ts +4 -0
  301. package/src/lib/sandbox-liveness.ts +11 -0
  302. package/src/lib/terminal-capability.ts +10 -0
  303. package/src/lib/use-portal-token-style.ts +60 -15
  304. package/src/provider.tsx +52 -7
  305. package/src/realtime/dropdown-menu.tsx +15 -19
  306. package/src/realtime/realtime-control.tsx +16 -5
  307. package/src/session-context.ts +90 -0
  308. package/src/timeline/activity-rail.tsx +31 -6
  309. package/src/timeline/index.ts +4 -1
  310. package/src/timeline/parsers.ts +46 -20
  311. package/src/timeline/projection.ts +233 -13
  312. package/src/timeline/registry.ts +19 -0
  313. package/src/timeline/screenshot-lightbox.tsx +30 -9
  314. package/src/timeline/shared.tsx +59 -11
  315. package/src/timeline/tool-renderers.tsx +421 -24
  316. package/src/timeline/turn-summary.tsx +2 -2
  317. package/src/timeline/types.ts +58 -2
  318. package/src/voice-recording-store.ts +15 -0
  319. package/styles/compiled.css +5298 -0
  320. package/styles/compiled.d.ts +2 -0
  321. package/styles/effective-tokens.css +27 -0
  322. package/styles/index.css +18 -0
  323. package/styles/responsive.css +208 -0
  324. package/styles/responsive.d.ts +2 -0
  325. package/styles/tokens.css +50 -17
  326. package/dist/chunk-3PB7MIT6.js.map +0 -1
  327. package/dist/chunk-6EDV6YFE.js.map +0 -1
  328. package/dist/chunk-EB67J347.js.map +0 -1
  329. package/dist/chunk-EKZH6IDG.js.map +0 -1
  330. package/dist/chunk-FGZUCXZF.js.map +0 -1
  331. package/dist/chunk-HFO4ERGQ.js.map +0 -1
  332. package/dist/chunk-JB5725BI.js +0 -48
  333. package/dist/chunk-JB5725BI.js.map +0 -1
  334. package/dist/chunk-LGVMUIRV.js.map +0 -1
  335. package/dist/chunk-LWR4MXSS.js.map +0 -1
  336. package/dist/chunk-SRFUT2ZU.js.map +0 -1
  337. package/dist/chunk-U3CSCMWA.js.map +0 -1
  338. package/dist/chunk-VCBFUSUZ.js.map +0 -1
  339. package/dist/fleet-decision-projection-SLNZMS42.js +0 -241
  340. package/dist/fleet-decision-projection-SLNZMS42.js.map +0 -1
  341. package/dist/queue-surface-implementation-J4XJFKRW.js.map +0 -1
@@ -1,15 +1,16 @@
1
+ import {
2
+ formatBytes,
3
+ formatRelativeTime
4
+ } from "./chunk-LAKLF4PA.js";
1
5
  import {
2
6
  useMutationRunner,
7
+ usePageLiveActivity,
3
8
  usePolledValue
4
- } from "./chunk-EB67J347.js";
9
+ } from "./chunk-KZ73RL76.js";
5
10
  import {
6
11
  OpenGeniContext,
7
12
  useOpenGeni
8
- } from "./chunk-EKZH6IDG.js";
9
- import {
10
- formatBytes,
11
- formatRelativeTime
12
- } from "./chunk-LAKLF4PA.js";
13
+ } from "./chunk-HDBG7XGO.js";
13
14
  import {
14
15
  cn
15
16
  } from "./chunk-22KP6LR5.js";
@@ -533,7 +534,7 @@ function MachineCard({
533
534
  className: cn(
534
535
  "og-root group relative flex flex-col gap-3 overflow-hidden rounded-og-lg border border-og-border",
535
536
  "bg-og-surface-1 p-4 shadow-og-sm transition-colors",
536
- openable && "cursor-pointer hover:border-og-border-strong focus-visible:border-og-accent/60 focus-visible:outline-none",
537
+ openable && "cursor-pointer hover:border-og-border-strong focus-visible:border-og-accent/60 focus-visible:outline-hidden",
537
538
  machine.active && "border-og-accent/40",
538
539
  className
539
540
  ),
@@ -886,7 +887,14 @@ function MetricHistoryChart({
886
887
  }
887
888
 
888
889
  // src/components/machines/machine-detail.tsx
889
- import { ArrowLeftIcon, CpuIcon as CpuIcon2, LaptopIcon as LaptopIcon2, RadioIcon, ServerIcon as ServerIcon2 } from "lucide-react";
890
+ import {
891
+ ArrowLeftIcon,
892
+ CpuIcon as CpuIcon2,
893
+ LaptopIcon as LaptopIcon2,
894
+ RadioIcon,
895
+ ServerIcon as ServerIcon2,
896
+ Trash2Icon
897
+ } from "lucide-react";
890
898
 
891
899
  // src/components/machines/series.ts
892
900
  var METRIC_WINDOWS = ["15m", "1h", "6h", "24h"];
@@ -985,6 +993,7 @@ function MachineDetail({
985
993
  onWindowChange,
986
994
  loadingSeries,
987
995
  onBack,
996
+ onRemove,
988
997
  now = Date.now(),
989
998
  className
990
999
  }) {
@@ -1015,20 +1024,36 @@ function MachineDetail({
1015
1024
  machine.arch
1016
1025
  ] })
1017
1026
  ] }),
1018
- /* @__PURE__ */ jsx7("div", { className: "flex shrink-0 items-center gap-0.5 rounded-og-md border border-og-border bg-og-surface-1 p-0.5", children: METRIC_WINDOWS.map((w) => /* @__PURE__ */ jsx7(
1019
- "button",
1020
- {
1021
- type: "button",
1022
- onClick: () => onWindowChange(w),
1023
- "data-active": w === window2,
1024
- className: cn(
1025
- "rounded-og-sm px-2 py-1 font-og-mono text-og-xs transition-colors",
1026
- w === window2 ? "bg-og-surface-3 text-og-fg shadow-og-sm" : "text-og-fg-subtle hover:text-og-fg-muted"
1027
- ),
1028
- children: w
1029
- },
1030
- w
1031
- )) })
1027
+ /* @__PURE__ */ jsxs7("div", { className: "flex shrink-0 items-center gap-2", children: [
1028
+ onRemove && machine.enrollmentId && !machine.isSessionGroup ? /* @__PURE__ */ jsxs7(
1029
+ "button",
1030
+ {
1031
+ type: "button",
1032
+ "data-remove-machine": true,
1033
+ "aria-label": `Remove machine ${machine.name}`,
1034
+ onClick: () => onRemove(machine),
1035
+ className: "inline-flex min-h-9 items-center gap-1.5 rounded-og-sm border border-og-status-failed/40 px-2.5 py-1 font-medium text-og-xs text-og-status-failed transition-colors hover:bg-og-status-failed/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-og-status-failed/50 pointer-coarse:min-h-11",
1036
+ children: [
1037
+ /* @__PURE__ */ jsx7(Trash2Icon, { className: "size-3.5", "aria-hidden": true }),
1038
+ /* @__PURE__ */ jsx7("span", { className: "hidden sm:inline", children: "Remove machine" })
1039
+ ]
1040
+ }
1041
+ ) : null,
1042
+ /* @__PURE__ */ jsx7("div", { className: "flex items-center gap-0.5 rounded-og-md border border-og-border bg-og-surface-1 p-0.5", children: METRIC_WINDOWS.map((w) => /* @__PURE__ */ jsx7(
1043
+ "button",
1044
+ {
1045
+ type: "button",
1046
+ onClick: () => onWindowChange(w),
1047
+ "data-active": w === window2,
1048
+ className: cn(
1049
+ "rounded-og-sm px-2 py-1 font-og-mono text-og-xs transition-colors",
1050
+ w === window2 ? "bg-og-surface-3 text-og-fg shadow-og-sm" : "text-og-fg-subtle hover:text-og-fg-muted"
1051
+ ),
1052
+ children: w
1053
+ },
1054
+ w
1055
+ )) })
1056
+ ] })
1032
1057
  ] }),
1033
1058
  /* @__PURE__ */ jsxs7(
1034
1059
  "div",
@@ -1144,7 +1169,7 @@ function EmptyState({ onEnroll }) {
1144
1169
  /* @__PURE__ */ jsx8("span", { className: "flex size-10 items-center justify-center rounded-full bg-og-surface-2 text-og-fg-subtle", children: /* @__PURE__ */ jsx8(LaptopIcon3, { className: "size-5", "aria-hidden": true }) }),
1145
1170
  /* @__PURE__ */ jsxs8("div", { className: "space-y-1", children: [
1146
1171
  /* @__PURE__ */ jsx8("p", { className: "text-og-base font-medium text-og-fg", children: "No machines yet" }),
1147
- /* @__PURE__ */ jsx8("p", { className: "max-w-xs text-og-sm text-og-fg-muted", children: "Enroll your own computer to run the agent on it \u2014 your files, your terminal, your desktop." })
1172
+ /* @__PURE__ */ jsx8("p", { className: "max-w-xs text-og-sm text-og-fg-muted", children: "Connect your own computer to run the agent on it \u2014 your files, your terminal, your desktop." })
1148
1173
  ] }),
1149
1174
  onEnroll ? /* @__PURE__ */ jsxs8(
1150
1175
  "button",
@@ -1155,7 +1180,7 @@ function EmptyState({ onEnroll }) {
1155
1180
  className: "inline-flex items-center gap-1.5 rounded-og-sm bg-og-accent px-3 py-1.5 text-og-sm font-medium text-og-accent-fg transition-colors hover:bg-og-accent-strong pointer-coarse:min-h-11",
1156
1181
  children: [
1157
1182
  /* @__PURE__ */ jsx8(PlusIcon, { className: "size-3.5", "aria-hidden": true }),
1158
- "Enroll a machine"
1183
+ "Connect a machine"
1159
1184
  ]
1160
1185
  }
1161
1186
  ) : null
@@ -1195,7 +1220,7 @@ function Header({
1195
1220
  className: "inline-flex items-center gap-1.5 rounded-og-sm border border-og-border px-2.5 py-1 text-og-sm font-medium text-og-fg-muted transition-colors hover:border-og-border-strong hover:text-og-fg pointer-coarse:min-h-11",
1196
1221
  children: [
1197
1222
  /* @__PURE__ */ jsx8(PlusIcon, { className: "size-3.5", "aria-hidden": true }),
1198
- "Enroll machine"
1223
+ "Connect a machine"
1199
1224
  ]
1200
1225
  }
1201
1226
  ) : null
@@ -1724,6 +1749,9 @@ function OpenGeniProvider({
1724
1749
  );
1725
1750
  const callbackRef = useRef2(onWorkspaceControlEvent);
1726
1751
  const reconcilersRef = useRef2(/* @__PURE__ */ new Map());
1752
+ const reconcileInFlightRef = useRef2(/* @__PURE__ */ new Map());
1753
+ const workspaceControlSequencesRef = useRef2(/* @__PURE__ */ new Map());
1754
+ const pageLive = usePageLiveActivity();
1727
1755
  callbackRef.current = onWorkspaceControlEvent;
1728
1756
  const verifyApiContract = useCallback(async () => {
1729
1757
  try {
@@ -1756,28 +1784,54 @@ function OpenGeniProvider({
1756
1784
  []
1757
1785
  );
1758
1786
  const reconcileSession = useMemo(
1759
- () => async (sessionId) => {
1760
- await verifyApiContract();
1761
- const callbacks = [...reconcilersRef.current.get(sessionId)?.values() ?? []];
1762
- await Promise.all(callbacks.map((reconcile) => reconcile()));
1787
+ () => (sessionId) => {
1788
+ const existing = reconcileInFlightRef.current.get(sessionId);
1789
+ if (existing) return existing;
1790
+ const promise = (async () => {
1791
+ await withTimeout(verifyApiContract(), 1e4, "API contract reconciliation");
1792
+ const callbacks = [...reconcilersRef.current.get(sessionId)?.values() ?? []];
1793
+ await withTimeout(
1794
+ Promise.all(callbacks.map((reconcile) => reconcile())).then(() => void 0),
1795
+ 15e3,
1796
+ "session reconciliation"
1797
+ );
1798
+ })().finally(() => {
1799
+ if (reconcileInFlightRef.current.get(sessionId) === promise) {
1800
+ reconcileInFlightRef.current.delete(sessionId);
1801
+ }
1802
+ });
1803
+ reconcileInFlightRef.current.set(sessionId, promise);
1804
+ return promise;
1763
1805
  },
1764
1806
  [verifyApiContract]
1765
1807
  );
1766
1808
  useEffect(() => {
1809
+ if (!pageLive) {
1810
+ setWorkspaceControlConnectionState("idle");
1811
+ return;
1812
+ }
1767
1813
  const controller = new AbortController();
1768
- setWorkspaceControlEvent(null);
1769
1814
  setWorkspaceControlConnectionState("connecting");
1770
1815
  void (async () => {
1771
1816
  try {
1772
1817
  await verifyApiContract();
1773
1818
  const workspace = await client.getWorkspace(workspaceId);
1819
+ const resumeAfter = Math.max(
1820
+ workspaceControlSequencesRef.current.get(workspaceId) ?? 0,
1821
+ workspace.inferenceControl.revision
1822
+ );
1823
+ workspaceControlSequencesRef.current.set(workspaceId, resumeAfter);
1774
1824
  const stream = client.streamWorkspaceControlEvents(workspaceId, {
1775
- after: workspace.inferenceControl.revision,
1825
+ after: resumeAfter,
1776
1826
  signal: controller.signal,
1777
1827
  onStateChange: setWorkspaceControlConnectionState
1778
1828
  });
1779
1829
  for await (const event of stream) {
1780
1830
  if (controller.signal.aborted) return;
1831
+ workspaceControlSequencesRef.current.set(
1832
+ workspaceId,
1833
+ Math.max(workspaceControlSequencesRef.current.get(workspaceId) ?? 0, event.sequence)
1834
+ );
1781
1835
  setWorkspaceControlEvent(
1782
1836
  (current) => !current || event.sequence > current.sequence ? event : current
1783
1837
  );
@@ -1792,7 +1846,7 @@ function OpenGeniProvider({
1792
1846
  }
1793
1847
  })();
1794
1848
  return () => controller.abort();
1795
- }, [client, verifyApiContract, workspaceId]);
1849
+ }, [client, pageLive, verifyApiContract, workspaceId]);
1796
1850
  const value = useMemo(
1797
1851
  () => ({
1798
1852
  client,
@@ -1816,6 +1870,20 @@ function OpenGeniProvider({
1816
1870
  contractMismatch ? /* @__PURE__ */ jsx12(ApiContractMismatchScreen, { mismatch: contractMismatch }) : null
1817
1871
  ] });
1818
1872
  }
1873
+ function withTimeout(promise, timeoutMs, label) {
1874
+ let timer;
1875
+ return Promise.race([
1876
+ promise,
1877
+ new Promise((_resolve, reject) => {
1878
+ timer = setTimeout(
1879
+ () => reject(new Error(`${label} timed out after ${timeoutMs}ms`)),
1880
+ timeoutMs
1881
+ );
1882
+ })
1883
+ ]).finally(() => {
1884
+ if (timer !== void 0) clearTimeout(timer);
1885
+ });
1886
+ }
1819
1887
  function ApiContractMismatchScreen({ mismatch }) {
1820
1888
  return /* @__PURE__ */ jsx12(
1821
1889
  "div",
@@ -1856,6 +1924,23 @@ function reloadForContractMismatchOnce(mismatch) {
1856
1924
 
1857
1925
  // src/hooks/use-machines.ts
1858
1926
  var EMPTY = { activeSandboxId: null, activeEpoch: 0, machines: [] };
1927
+ function swapFailureMessage(result) {
1928
+ if (result.reason?.trim()) return result.reason;
1929
+ switch (result.code) {
1930
+ case "recovery_in_progress":
1931
+ return "The managed sandbox is still recovering. Try again shortly.";
1932
+ case "recovery_degraded":
1933
+ return "The managed sandbox recovery is degraded and needs attention.";
1934
+ case "recovery_unrecoverable":
1935
+ return "The managed sandbox could not be recovered.";
1936
+ case "offline_enrollment":
1937
+ return "The selected machine is offline.";
1938
+ case "concurrent_swap":
1939
+ return "The session route changed concurrently. Refresh and try again.";
1940
+ default:
1941
+ return "The session stayed on its current sandbox.";
1942
+ }
1943
+ }
1859
1944
  function useMachines(options = {}) {
1860
1945
  const { client, workspaceId } = useOpenGeni(options);
1861
1946
  const machinesClient = options.machinesClient ?? client;
@@ -1884,8 +1969,11 @@ function useMachines(options = {}) {
1884
1969
  const { run, mutating, mutationError, clearMutationError } = useMutationRunner(identityKey);
1885
1970
  const [attachState, setAttachState] = useState4(() => ({ identity: identityKey, sandboxId: null }));
1886
1971
  const attachingSandboxId = attachState.identity === identityKey ? attachState.sandboxId : null;
1972
+ const [removeState, setRemoveState] = useState4(() => ({ identity: identityKey, enrollmentId: null }));
1973
+ const removingEnrollmentId = removeState.identity === identityKey ? removeState.enrollmentId : null;
1887
1974
  const data = loadedData ?? EMPTY;
1888
1975
  const canAttach = sessionId !== void 0 && (typeof machinesClient.attachMachine === "function" || typeof machinesClient.swapActiveSandbox === "function");
1976
+ const canRemove = typeof machinesClient.removeEnrollment === "function";
1889
1977
  const attach = useCallback2(
1890
1978
  async (sandboxId) => {
1891
1979
  if (sessionId === void 0) return false;
@@ -1894,7 +1982,10 @@ function useMachines(options = {}) {
1894
1982
  const ownedIdentity = identityKey;
1895
1983
  setAttachState({ identity: ownedIdentity, sandboxId });
1896
1984
  const result = await run(async () => {
1897
- await runSwap();
1985
+ const response = await runSwap();
1986
+ if (response && typeof response === "object" && "swapped" in response && response.swapped === false) {
1987
+ throw new Error(swapFailureMessage(response));
1988
+ }
1898
1989
  return true;
1899
1990
  });
1900
1991
  if (identityRef.current === ownedIdentity) {
@@ -1912,6 +2003,24 @@ function useMachines(options = {}) {
1912
2003
  },
1913
2004
  [machinesClient, workspaceId]
1914
2005
  );
2006
+ const remove = useCallback2(
2007
+ async (enrollmentId, request = {}) => {
2008
+ if (!machinesClient.removeEnrollment) return null;
2009
+ const ownedIdentity = identityKey;
2010
+ setRemoveState({ identity: ownedIdentity, enrollmentId });
2011
+ const result = await run(
2012
+ () => machinesClient.removeEnrollment(workspaceId, enrollmentId, request)
2013
+ );
2014
+ if (identityRef.current === ownedIdentity) {
2015
+ setRemoveState({ identity: ownedIdentity, enrollmentId: null });
2016
+ if (result?.outcome === "removed" || result?.outcome === "already_removed") {
2017
+ await refresh();
2018
+ }
2019
+ }
2020
+ return result;
2021
+ },
2022
+ [machinesClient, workspaceId, identityKey, run, refresh]
2023
+ );
1915
2024
  return {
1916
2025
  machines: data.machines,
1917
2026
  activeSandboxId: data.activeSandboxId,
@@ -1922,8 +2031,11 @@ function useMachines(options = {}) {
1922
2031
  attach,
1923
2032
  canAttach,
1924
2033
  fetchSeries,
1925
- attaching: mutating,
2034
+ attaching: mutating && attachingSandboxId !== null,
1926
2035
  attachingSandboxId,
2036
+ remove,
2037
+ canRemove,
2038
+ removingEnrollmentId,
1927
2039
  mutationError,
1928
2040
  clearMutationError
1929
2041
  };
@@ -1957,4 +2069,4 @@ export {
1957
2069
  OpenGeniProvider,
1958
2070
  useMachines
1959
2071
  };
1960
- //# sourceMappingURL=chunk-6EDV6YFE.js.map
2072
+ //# sourceMappingURL=chunk-X4S56Y2H.js.map