@opengeni/react 1.0.1 → 1.0.2-canary.37191796234001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/README.md +651 -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-GTR5XQ7X.js +16 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
  16. package/dist/chat-interactive-block-UGBTNB3L.js.map +1 -0
  17. package/dist/{chunk-5UQPNLIO.js → chunk-23J2ZNXT.js} +4117 -3896
  18. package/dist/chunk-23J2ZNXT.js.map +1 -0
  19. package/dist/chunk-447JLCBU.js +209 -0
  20. package/dist/chunk-447JLCBU.js.map +1 -0
  21. package/dist/chunk-4RVYOY4O.js +379 -0
  22. package/dist/chunk-4RVYOY4O.js.map +1 -0
  23. package/dist/chunk-5CVXZA3Y.js +292 -0
  24. package/dist/chunk-5CVXZA3Y.js.map +1 -0
  25. package/dist/chunk-5J4FOW6Q.js +108 -0
  26. package/dist/chunk-5J4FOW6Q.js.map +1 -0
  27. package/dist/chunk-A2PI6UMY.js +41 -0
  28. package/dist/chunk-A2PI6UMY.js.map +1 -0
  29. package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
  30. package/dist/chunk-A4UJB2MM.js.map +1 -0
  31. package/dist/chunk-B3V6TG77.js +41 -0
  32. package/dist/chunk-B3V6TG77.js.map +1 -0
  33. package/dist/chunk-BRM6FVZA.js +302 -0
  34. package/dist/chunk-BRM6FVZA.js.map +1 -0
  35. package/dist/chunk-C5X5AJXK.js +182 -0
  36. package/dist/chunk-C5X5AJXK.js.map +1 -0
  37. package/dist/chunk-CR7U7HAR.js +453 -0
  38. package/dist/chunk-CR7U7HAR.js.map +1 -0
  39. package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
  40. package/dist/chunk-DYWBUX5Q.js.map +1 -0
  41. package/dist/chunk-E3G7SAYZ.js +3124 -0
  42. package/dist/chunk-E3G7SAYZ.js.map +1 -0
  43. package/dist/chunk-ELCE5SXV.js +359 -0
  44. package/dist/chunk-ELCE5SXV.js.map +1 -0
  45. package/dist/chunk-ERGYJIBB.js +21 -0
  46. package/dist/chunk-ERGYJIBB.js.map +1 -0
  47. package/dist/chunk-FFA2OVOV.js +319 -0
  48. package/dist/chunk-FFA2OVOV.js.map +1 -0
  49. package/dist/chunk-FZCP527Y.js +116 -0
  50. package/dist/chunk-FZCP527Y.js.map +1 -0
  51. package/dist/chunk-GIMRELBW.js +14 -0
  52. package/dist/chunk-GIMRELBW.js.map +1 -0
  53. package/dist/{chunk-6KLX2RH5.js → chunk-H2NJQORO.js} +1069 -79
  54. package/dist/chunk-H2NJQORO.js.map +1 -0
  55. package/dist/chunk-I7IWRQLN.js +1608 -0
  56. package/dist/chunk-I7IWRQLN.js.map +1 -0
  57. package/dist/{chunk-HA46CYQK.js → chunk-IQUCRAT7.js} +792 -537
  58. package/dist/chunk-IQUCRAT7.js.map +1 -0
  59. package/dist/chunk-IWIDV7SB.js +1 -0
  60. package/dist/chunk-IWIDV7SB.js.map +1 -0
  61. package/dist/chunk-J2QWVSQY.js +312 -0
  62. package/dist/chunk-J2QWVSQY.js.map +1 -0
  63. package/dist/chunk-JFNEV4LU.js +2733 -0
  64. package/dist/chunk-JFNEV4LU.js.map +1 -0
  65. package/dist/chunk-JT4JW7BC.js +54 -0
  66. package/dist/chunk-JT4JW7BC.js.map +1 -0
  67. package/dist/chunk-K3HQAKQX.js +24 -0
  68. package/dist/chunk-K3HQAKQX.js.map +1 -0
  69. package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
  70. package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
  71. package/dist/chunk-NZUI76EM.js +371 -0
  72. package/dist/chunk-NZUI76EM.js.map +1 -0
  73. package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
  74. package/dist/chunk-PNY3JKBJ.js.map +1 -0
  75. package/dist/{chunk-IGC6A2ZI.js → chunk-Q5QBEZIQ.js} +777 -246
  76. package/dist/chunk-Q5QBEZIQ.js.map +1 -0
  77. package/dist/chunk-RHREZ7BO.js +11 -0
  78. package/dist/chunk-RHREZ7BO.js.map +1 -0
  79. package/dist/chunk-SCOTPE2I.js +589 -0
  80. package/dist/chunk-SCOTPE2I.js.map +1 -0
  81. package/dist/{chunk-B6WPZSTT.js → chunk-SJZDKVW2.js} +1331 -1163
  82. package/dist/chunk-SJZDKVW2.js.map +1 -0
  83. package/dist/chunk-TMJRG4YC.js +12803 -0
  84. package/dist/chunk-TMJRG4YC.js.map +1 -0
  85. package/dist/chunk-TMYGL6X5.js +742 -0
  86. package/dist/chunk-TMYGL6X5.js.map +1 -0
  87. package/dist/chunk-UGLEYEMP.js +33 -0
  88. package/dist/chunk-UGLEYEMP.js.map +1 -0
  89. package/dist/chunk-UK4TINKT.js +27 -0
  90. package/dist/chunk-UK4TINKT.js.map +1 -0
  91. package/dist/chunk-UTRTG6LH.js +220 -0
  92. package/dist/chunk-UTRTG6LH.js.map +1 -0
  93. package/dist/chunk-WEHMPOXK.js +39 -0
  94. package/dist/chunk-WEHMPOXK.js.map +1 -0
  95. package/dist/chunk-WRHIZYZF.js +988 -0
  96. package/dist/chunk-WRHIZYZF.js.map +1 -0
  97. package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
  98. package/dist/chunk-WUISZ3WU.js.map +1 -0
  99. package/dist/chunk-XCHWDJ22.js +107 -0
  100. package/dist/chunk-XCHWDJ22.js.map +1 -0
  101. package/dist/chunk-XOAMRDDK.js +481 -0
  102. package/dist/chunk-XOAMRDDK.js.map +1 -0
  103. package/dist/chunk-XUW2UWQM.js +299 -0
  104. package/dist/chunk-XUW2UWQM.js.map +1 -0
  105. package/dist/{chunk-KCGXPP5V.js → chunk-Y2PRMYLC.js} +11 -6
  106. package/dist/chunk-Y2PRMYLC.js.map +1 -0
  107. package/dist/chunk-YBXQDQFX.js +1772 -0
  108. package/dist/chunk-YBXQDQFX.js.map +1 -0
  109. package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
  110. package/dist/chunk-YQEAA6LT.js.map +1 -0
  111. package/dist/chunk-YV4L3ILF.js +9 -0
  112. package/dist/chunk-YV4L3ILF.js.map +1 -0
  113. package/dist/{chunk-LLOLUHVG.js → chunk-YWFG7ZX7.js} +1358 -2746
  114. package/dist/chunk-YWFG7ZX7.js.map +1 -0
  115. package/dist/chunk-ZYRGEKWS.js +216 -0
  116. package/dist/chunk-ZYRGEKWS.js.map +1 -0
  117. package/dist/client.d.ts +7 -4
  118. package/dist/clipboard.js +1 -0
  119. package/dist/commands/types.d.ts +2 -0
  120. package/dist/components/anthropic-mark.d.ts +3 -0
  121. package/dist/components/approval-surface.d.ts +15 -0
  122. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  123. package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
  124. package/dist/components/artifacts/artifact-surface.d.ts +3 -1
  125. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  126. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  127. package/dist/components/artifacts/document-editor.d.ts +4 -2
  128. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  129. package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
  130. package/dist/components/artifacts/editable-document.d.ts +1 -1
  131. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  132. package/dist/components/artifacts/editable-spreadsheet.d.ts +2 -1
  133. package/dist/components/artifacts/index.d.ts +8 -1
  134. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  135. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  136. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  137. package/dist/components/artifacts/published-html-artifact-frame.d.ts +48 -3
  138. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  139. package/dist/components/artifacts/site-view.d.ts +23 -0
  140. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  141. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  142. package/dist/components/browser-select-control.d.ts +16 -0
  143. package/dist/components/browser-viewer.d.ts +10 -1
  144. package/dist/components/chat-composer.d.ts +21 -3
  145. package/dist/components/child-session-link.d.ts +5 -0
  146. package/dist/components/claude-mark.d.ts +3 -0
  147. package/dist/components/code-editor.d.ts +1 -4
  148. package/dist/components/composer.d.ts +45 -4
  149. package/dist/components/computer-viewer.d.ts +4 -1
  150. package/dist/components/copy-button.d.ts +3 -1
  151. package/dist/components/desktop-viewer.d.ts +1 -1
  152. package/dist/components/enrollment-consent.d.ts +6 -3
  153. package/dist/components/file-browser.d.ts +10 -1
  154. package/dist/components/fleet-tile.d.ts +2 -2
  155. package/dist/components/grok-mark.d.ts +26 -0
  156. package/dist/components/human-input-form.d.ts +21 -2
  157. package/dist/components/human-input-surface.d.ts +6 -3
  158. package/dist/components/machine-card.d.ts +4 -1
  159. package/dist/components/machines/machine-detail.d.ts +4 -1
  160. package/dist/components/machines/machine-operation-policy.d.ts +11 -0
  161. package/dist/components/machines-dashboard.d.ts +3 -1
  162. package/dist/components/markdown-table-layout.d.ts +12 -0
  163. package/dist/components/markdown.d.ts +47 -3
  164. package/dist/components/message-timeline.d.ts +72 -9
  165. package/dist/components/model-mark.d.ts +29 -0
  166. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  167. package/dist/components/model-policy-picker.d.ts +62 -13
  168. package/dist/components/open-geni-chat.d.ts +55 -0
  169. package/dist/components/open-geni-links.d.ts +68 -0
  170. package/dist/components/openrouter-mark.d.ts +6 -0
  171. package/dist/components/pierre-file.d.ts +1 -1
  172. package/dist/components/preview-loading.d.ts +2 -0
  173. package/dist/components/queue-item-content.d.ts +9 -0
  174. package/dist/components/sandbox-files.d.ts +13 -2
  175. package/dist/components/sandbox-workspace.d.ts +43 -3
  176. package/dist/components/session-capability-frame.d.ts +35 -0
  177. package/dist/components/session-chrome.d.ts +66 -8
  178. package/dist/components/session-commands-panel.d.ts +6 -0
  179. package/dist/components/session-commands.d.ts +6 -0
  180. package/dist/components/session-connection-request.d.ts +8 -0
  181. package/dist/components/session-conversation.d.ts +86 -0
  182. package/dist/components/session-list.d.ts +36 -0
  183. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  184. package/dist/components/timeline-anchor.d.ts +24 -0
  185. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  186. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  187. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  188. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  189. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  190. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  191. package/dist/components/timeline-annotations.d.ts +13 -3
  192. package/dist/components/timeline-reading-progress.d.ts +11 -0
  193. package/dist/components/timeline-search.d.ts +34 -0
  194. package/dist/components/timeline-settlement.d.ts +16 -0
  195. package/dist/components/tip-follow.d.ts +16 -0
  196. package/dist/components/usage-limit-notice.d.ts +49 -0
  197. package/dist/components/usage-member-list.d.ts +91 -0
  198. package/dist/components/usage-meter.d.ts +73 -0
  199. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  200. package/dist/components/user-message-body.d.ts +10 -1
  201. package/dist/components/workspace-dock.d.ts +6 -2
  202. package/dist/composer.d.ts +5 -4
  203. package/dist/composer.js +15 -9
  204. package/dist/computer-viewer-ENHVAZ2Q.js +19 -0
  205. package/dist/computer-viewer-ENHVAZ2Q.js.map +1 -0
  206. package/dist/connect-account-identity.d.ts +8 -0
  207. package/dist/connect-accounts.d.ts +15 -0
  208. package/dist/connect-chooser.d.ts +18 -0
  209. package/dist/connect-panel.d.ts +18 -0
  210. package/dist/connect-setup.d.ts +16 -0
  211. package/dist/connect.d.ts +21 -0
  212. package/dist/connect.js +2129 -0
  213. package/dist/connect.js.map +1 -0
  214. package/dist/connection-catalog.d.ts +38 -0
  215. package/dist/connection-discovery.d.ts +12 -0
  216. package/dist/connection-installed.d.ts +17 -0
  217. package/dist/connection-logo.d.ts +9 -0
  218. package/dist/connection-service-logo.d.ts +8 -0
  219. package/dist/connection-service-presentation.d.ts +13 -0
  220. package/dist/connection-skeleton.d.ts +5 -0
  221. package/dist/connection-type-picker.d.ts +6 -0
  222. package/dist/conversation-timeline.d.ts +5 -0
  223. package/dist/desktop.d.ts +7 -0
  224. package/dist/desktop.js +26 -0
  225. package/dist/desktop.js.map +1 -0
  226. package/dist/device-authorization.d.ts +23 -0
  227. package/dist/diffs.d.ts +8 -0
  228. package/dist/diffs.js +14 -0
  229. package/dist/diffs.js.map +1 -0
  230. package/dist/discovery-cache.d.ts +5 -0
  231. package/dist/editor.d.ts +7 -0
  232. package/dist/editor.js +21 -0
  233. package/dist/editor.js.map +1 -0
  234. package/dist/embedded-session-client.d.ts +23 -0
  235. package/dist/file-node-visibility.d.ts +15 -0
  236. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
  237. package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
  238. package/dist/hooks/channel-cache.d.ts +23 -0
  239. package/dist/hooks/latest-question.d.ts +25 -0
  240. package/dist/hooks/shared-machines-list.d.ts +14 -0
  241. package/dist/hooks/use-attached-browsers.d.ts +2 -1
  242. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  243. package/dist/hooks/use-browser-session.d.ts +12 -1
  244. package/dist/hooks/use-channels.d.ts +1 -0
  245. package/dist/hooks/use-codex-accounts.d.ts +25 -7
  246. package/dist/hooks/use-composer.d.ts +45 -9
  247. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  248. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  249. package/dist/hooks/use-computer-session.d.ts +2 -0
  250. package/dist/hooks/use-connect.d.ts +22 -0
  251. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  252. package/dist/hooks/use-file-attachments.d.ts +21 -2
  253. package/dist/hooks/use-machine-chip.d.ts +3 -3
  254. package/dist/hooks/use-machines.d.ts +19 -1
  255. package/dist/hooks/use-sandbox-files.d.ts +5 -1
  256. package/dist/hooks/use-session-background-commands.d.ts +14 -0
  257. package/dist/hooks/use-session-events.d.ts +30 -8
  258. package/dist/hooks/use-session-lineage.d.ts +4 -0
  259. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  260. package/dist/hooks/use-session.d.ts +6 -0
  261. package/dist/hooks/use-turn-queue.d.ts +12 -0
  262. package/dist/hooks/use-usage.d.ts +40 -0
  263. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  264. package/dist/hooks/use-workspace-sessions.d.ts +27 -5
  265. package/dist/human-input.d.ts +3 -1
  266. package/dist/identity-link-accounts.d.ts +11 -0
  267. package/dist/identity-link-consent.d.ts +18 -0
  268. package/dist/index.d.ts +60 -17
  269. package/dist/index.js +2237 -6200
  270. package/dist/index.js.map +1 -1
  271. package/dist/interaction.d.ts +1 -1
  272. package/dist/interaction.js +35 -184
  273. package/dist/interaction.js.map +1 -1
  274. package/dist/latest-question-755OW5DS.js +117 -0
  275. package/dist/latest-question-755OW5DS.js.map +1 -0
  276. package/dist/lib/error-message.d.ts +7 -0
  277. package/dist/lib/format.d.ts +36 -2
  278. package/dist/lib/host-theme.d.ts +70 -0
  279. package/dist/lib/interaction-errors.d.ts +6 -0
  280. package/dist/lib/menu-styles.d.ts +22 -0
  281. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  282. package/dist/lib/workbench-peers.d.ts +36 -0
  283. package/dist/lib/xterm-theme.d.ts +7 -5
  284. package/dist/machines.d.ts +4 -2
  285. package/dist/machines.js +14 -4
  286. package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
  287. package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
  288. package/dist/mcp-connection-status.d.ts +14 -0
  289. package/dist/model-policy-picker-menu-PWRI7R2X.js +14 -0
  290. package/dist/model-policy-picker-menu-PWRI7R2X.js.map +1 -0
  291. package/dist/model-policy.d.ts +19 -3
  292. package/dist/model-policy.js +9 -1
  293. package/dist/older-history.d.ts +30 -0
  294. package/dist/platform-activity-row-627BFZ46.js +182 -0
  295. package/dist/platform-activity-row-627BFZ46.js.map +1 -0
  296. package/dist/plugin-details.d.ts +14 -0
  297. package/dist/plugin-discovery.d.ts +25 -0
  298. package/dist/provider.d.ts +13 -1
  299. package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
  300. package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
  301. package/dist/realtime/realtime-control.d.ts +6 -3
  302. package/dist/realtime.js +133 -74
  303. package/dist/realtime.js.map +1 -1
  304. package/dist/sandbox-files-BBC47SLD.js +20 -0
  305. package/dist/sandbox-files-BBC47SLD.js.map +1 -0
  306. package/dist/session-auth-recommendation.d.ts +5 -0
  307. package/dist/session-capability-policy.d.ts +12 -0
  308. package/dist/session-ui.d.ts +30 -2
  309. package/dist/session-ui.js +85 -7
  310. package/dist/session-ui.js.map +1 -1
  311. package/dist/session.d.ts +8 -2
  312. package/dist/session.js +30 -19
  313. package/dist/sites-ui.d.ts +34 -0
  314. package/dist/sites.d.ts +3 -0
  315. package/dist/sites.js +11 -0
  316. package/dist/sites.js.map +1 -0
  317. package/dist/skill-discovery.d.ts +47 -0
  318. package/dist/terminal.d.ts +8 -0
  319. package/dist/terminal.js +31 -0
  320. package/dist/terminal.js.map +1 -0
  321. package/dist/timeline/activity-rail.d.ts +11 -2
  322. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  323. package/dist/timeline/compaction-copy.d.ts +10 -0
  324. package/dist/timeline/entrance.d.ts +13 -1
  325. package/dist/timeline/genie-loading.d.ts +34 -0
  326. package/dist/timeline/index.d.ts +6 -2
  327. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  328. package/dist/timeline/platform-activity-row.d.ts +14 -0
  329. package/dist/timeline/presented-image.d.ts +6 -0
  330. package/dist/timeline/projection.d.ts +31 -2
  331. package/dist/timeline/registry.d.ts +2 -0
  332. package/dist/timeline/retained-image.d.ts +18 -0
  333. package/dist/timeline/rolling-activity.d.ts +11 -0
  334. package/dist/timeline/screenshot-lightbox.d.ts +16 -1
  335. package/dist/timeline/shared.d.ts +8 -3
  336. package/dist/timeline/startup-preference.d.ts +3 -0
  337. package/dist/timeline/startup-timings.d.ts +4 -0
  338. package/dist/timeline/tool-display-name.d.ts +2 -1
  339. package/dist/timeline/turn-summary.d.ts +32 -3
  340. package/dist/timeline/types.d.ts +141 -7
  341. package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
  342. package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
  343. package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
  344. package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
  345. package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
  346. package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
  347. package/dist/types/machines.d.ts +2 -2
  348. package/dist/usage/allowance-copy.d.ts +25 -0
  349. package/dist/usage/summary.d.ts +35 -0
  350. package/dist/usage.d.ts +13 -0
  351. package/dist/usage.js +1074 -0
  352. package/dist/usage.js.map +1 -0
  353. package/package.json +44 -4
  354. package/src/accounts.tsx +1072 -0
  355. package/src/approvals.ts +8 -1
  356. package/src/artifacts.ts +42 -0
  357. package/src/assets/README.md +8 -0
  358. package/src/assets/gmail.ico +0 -0
  359. package/src/assets/outlook.ico +0 -0
  360. package/src/capability-catalog-row.tsx +94 -0
  361. package/src/capability-logo-fallback.ts +22 -0
  362. package/src/client.ts +22 -13
  363. package/src/commands/registry.ts +18 -15
  364. package/src/commands/types.ts +2 -0
  365. package/src/components/anthropic-mark.tsx +10 -0
  366. package/src/components/approval-surface.tsx +171 -37
  367. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  368. package/src/components/artifacts/artifact-sandbox.tsx +185 -0
  369. package/src/components/artifacts/artifact-surface.tsx +39 -19
  370. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  371. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  372. package/src/components/artifacts/document-editor.tsx +141 -16
  373. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  374. package/src/components/artifacts/editable-artifact-view.tsx +187 -0
  375. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  376. package/src/components/artifacts/editable-document.tsx +37 -36
  377. package/src/components/artifacts/editable-presentation.tsx +36 -18
  378. package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
  379. package/src/components/artifacts/index.ts +44 -0
  380. package/src/components/artifacts/inline-html-document.ts +24 -0
  381. package/src/components/artifacts/latest-task-runner.ts +49 -0
  382. package/src/components/artifacts/presentation-editor.tsx +323 -67
  383. package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
  384. package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
  385. package/src/components/artifacts/site-view.tsx +116 -0
  386. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  387. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  388. package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
  389. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  390. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  391. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  392. package/src/components/browser-select-control.tsx +312 -0
  393. package/src/components/browser-viewer.tsx +1054 -314
  394. package/src/components/chat-composer.tsx +131 -85
  395. package/src/components/child-session-link.tsx +27 -0
  396. package/src/components/claude-mark.tsx +10 -0
  397. package/src/components/code-editor.tsx +13 -16
  398. package/src/components/composer-transcription-control.tsx +7 -5
  399. package/src/components/composer.tsx +376 -49
  400. package/src/components/computer-viewer.tsx +1041 -329
  401. package/src/components/copy-button.tsx +13 -5
  402. package/src/components/desktop-viewer.tsx +1 -1
  403. package/src/components/enrollment-consent.tsx +65 -7
  404. package/src/components/enrollment-device-flow.tsx +1 -1
  405. package/src/components/file-browser.tsx +158 -34
  406. package/src/components/fleet-tile.tsx +8 -16
  407. package/src/components/generated-video-player.tsx +4 -2
  408. package/src/components/grok-mark.tsx +33 -0
  409. package/src/components/human-input-form.tsx +455 -114
  410. package/src/components/human-input-surface.tsx +18 -7
  411. package/src/components/interaction-intervention-banner.tsx +2 -2
  412. package/src/components/machine-card.tsx +119 -4
  413. package/src/components/machine-dock-bar.tsx +1 -1
  414. package/src/components/machine-input-display.ts +23 -2
  415. package/src/components/machines/machine-detail.tsx +52 -2
  416. package/src/components/machines/machine-operation-policy.tsx +179 -0
  417. package/src/components/machines-dashboard.tsx +8 -17
  418. package/src/components/markdown-table-layout.ts +132 -0
  419. package/src/components/markdown.tsx +473 -44
  420. package/src/components/message-timeline.tsx +2498 -663
  421. package/src/components/model-mark.tsx +90 -0
  422. package/src/components/model-picker.tsx +15 -4
  423. package/src/components/model-policy-picker-menu.tsx +424 -0
  424. package/src/components/model-policy-picker.tsx +337 -381
  425. package/src/components/open-geni-chat.tsx +319 -0
  426. package/src/components/open-geni-links.tsx +179 -0
  427. package/src/components/openrouter-mark.tsx +13 -0
  428. package/src/components/pierre-diff.tsx +41 -16
  429. package/src/components/pierre-file.tsx +36 -11
  430. package/src/components/preview-loading.tsx +154 -0
  431. package/src/components/queue-item-content.ts +14 -0
  432. package/src/components/queue-surface-implementation.tsx +132 -42
  433. package/src/components/queue-surface-state.tsx +3 -1
  434. package/src/components/sandbox-files.tsx +267 -35
  435. package/src/components/sandbox-terminal.tsx +48 -11
  436. package/src/components/sandbox-workspace.tsx +337 -135
  437. package/src/components/session-capability-frame.tsx +192 -0
  438. package/src/components/session-chrome.tsx +1027 -328
  439. package/src/components/session-commands-panel.tsx +126 -0
  440. package/src/components/session-commands.tsx +18 -0
  441. package/src/components/session-connection-request.tsx +97 -0
  442. package/src/components/session-conversation.tsx +512 -0
  443. package/src/components/session-list.tsx +250 -0
  444. package/src/components/session-mcp-capability-card.tsx +680 -0
  445. package/src/components/session-status.tsx +1 -1
  446. package/src/components/timeline-anchor.tsx +119 -0
  447. package/src/components/timeline-annotation-chrome.tsx +196 -0
  448. package/src/components/timeline-annotation-layout.ts +268 -0
  449. package/src/components/timeline-annotation-markers.tsx +185 -0
  450. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  451. package/src/components/timeline-annotation-selection.tsx +106 -54
  452. package/src/components/timeline-annotation-shared.ts +245 -0
  453. package/src/components/timeline-annotations-dialog.tsx +185 -128
  454. package/src/components/timeline-annotations.tsx +189 -45
  455. package/src/components/timeline-reading-progress.ts +80 -0
  456. package/src/components/timeline-search.tsx +168 -0
  457. package/src/components/timeline-settlement.ts +60 -0
  458. package/src/components/tip-follow.ts +70 -7
  459. package/src/components/tooltip.tsx +38 -5
  460. package/src/components/usage-limit-notice.tsx +179 -0
  461. package/src/components/usage-member-list.tsx +792 -0
  462. package/src/components/usage-meter.tsx +382 -0
  463. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  464. package/src/components/user-message-body.tsx +194 -49
  465. package/src/components/workspace-dock.tsx +141 -175
  466. package/src/composer.ts +6 -1
  467. package/src/connect-account-identity.tsx +34 -0
  468. package/src/connect-accounts.tsx +233 -0
  469. package/src/connect-chooser.tsx +336 -0
  470. package/src/connect-panel.tsx +99 -0
  471. package/src/connect-setup.tsx +307 -0
  472. package/src/connect.ts +60 -0
  473. package/src/connection-assets.d.ts +4 -0
  474. package/src/connection-catalog.tsx +162 -0
  475. package/src/connection-discovery.tsx +235 -0
  476. package/src/connection-installed.tsx +51 -0
  477. package/src/connection-logo.tsx +37 -0
  478. package/src/connection-service-logo.tsx +55 -0
  479. package/src/connection-service-presentation.ts +46 -0
  480. package/src/connection-skeleton.tsx +16 -0
  481. package/src/connection-type-picker.tsx +36 -0
  482. package/src/conversation-timeline.ts +92 -0
  483. package/src/desktop.ts +24 -0
  484. package/src/device-authorization.tsx +98 -0
  485. package/src/diffs.ts +16 -0
  486. package/src/discovery-cache.ts +42 -0
  487. package/src/editor.ts +13 -0
  488. package/src/embedded-session-client.ts +104 -0
  489. package/src/file-node-visibility.ts +66 -0
  490. package/src/hooks/channel-cache.ts +104 -0
  491. package/src/hooks/internal.ts +3 -2
  492. package/src/hooks/latest-question.ts +164 -0
  493. package/src/hooks/shared-machines-list.ts +239 -0
  494. package/src/hooks/use-attached-browsers.ts +5 -1
  495. package/src/hooks/use-available-models.ts +20 -14
  496. package/src/hooks/use-browser-frame-stream.ts +25 -3
  497. package/src/hooks/use-browser-session.ts +271 -71
  498. package/src/hooks/use-browser-sessions.ts +7 -1
  499. package/src/hooks/use-channels.ts +32 -10
  500. package/src/hooks/use-codex-accounts.ts +78 -21
  501. package/src/hooks/use-composer.ts +1034 -320
  502. package/src/hooks/use-computer-frame-stream.ts +39 -16
  503. package/src/hooks/use-computer-input-posture.ts +94 -0
  504. package/src/hooks/use-computer-session.ts +110 -32
  505. package/src/hooks/use-computer-sessions.ts +8 -1
  506. package/src/hooks/use-connect.ts +23 -0
  507. package/src/hooks/use-desktop-stream.ts +19 -28
  508. package/src/hooks/use-file-attachments.ts +118 -10
  509. package/src/hooks/use-goal.ts +36 -9
  510. package/src/hooks/use-human-input.ts +31 -4
  511. package/src/hooks/use-last-started-turn-policy.ts +15 -13
  512. package/src/hooks/use-machine-chip.ts +23 -6
  513. package/src/hooks/use-machines.ts +104 -6
  514. package/src/hooks/use-sandbox-files.ts +253 -150
  515. package/src/hooks/use-sandbox-git.ts +58 -29
  516. package/src/hooks/use-session-background-commands.ts +67 -0
  517. package/src/hooks/use-session-capabilities.ts +21 -2
  518. package/src/hooks/use-session-events.ts +759 -433
  519. package/src/hooks/use-session-lineage.ts +28 -6
  520. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  521. package/src/hooks/use-session.ts +75 -16
  522. package/src/hooks/use-slash-commands.ts +6 -11
  523. package/src/hooks/use-turn-queue.ts +113 -13
  524. package/src/hooks/use-usage.ts +100 -0
  525. package/src/hooks/use-voice-input.ts +12 -1
  526. package/src/hooks/use-workspace-capture.ts +3 -2
  527. package/src/hooks/use-workspace-edit.ts +23 -5
  528. package/src/hooks/use-workspace-sessions.ts +99 -11
  529. package/src/human-input.ts +12 -1
  530. package/src/identity-link-accounts.tsx +148 -0
  531. package/src/identity-link-consent.tsx +192 -0
  532. package/src/index.ts +157 -12
  533. package/src/interaction.ts +1 -0
  534. package/src/lib/error-message.ts +37 -0
  535. package/src/lib/format.ts +150 -14
  536. package/src/lib/host-theme.ts +511 -0
  537. package/src/lib/interaction-errors.ts +33 -0
  538. package/src/lib/menu-styles.ts +44 -0
  539. package/src/lib/pierre-diffs-loader.ts +53 -0
  540. package/src/lib/workbench-peers.ts +62 -0
  541. package/src/lib/xterm-theme.ts +23 -21
  542. package/src/machines.ts +9 -1
  543. package/src/mcp-connection-status.ts +35 -0
  544. package/src/model-policy.ts +223 -69
  545. package/src/older-history.ts +87 -0
  546. package/src/plugin-details.tsx +185 -0
  547. package/src/plugin-discovery.tsx +196 -0
  548. package/src/provider.tsx +55 -14
  549. package/src/realtime/dropdown-menu.tsx +19 -12
  550. package/src/realtime/realtime-control.tsx +133 -46
  551. package/src/session-auth-recommendation.ts +48 -0
  552. package/src/session-capability-policy.ts +83 -0
  553. package/src/session-context.ts +1 -0
  554. package/src/session-ui.ts +66 -2
  555. package/src/session.ts +18 -1
  556. package/src/sites-ui.tsx +402 -0
  557. package/src/sites.ts +3 -0
  558. package/src/skill-discovery.tsx +208 -0
  559. package/src/terminal.ts +26 -0
  560. package/src/timeline/activity-rail.tsx +171 -80
  561. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  562. package/src/timeline/compaction-copy.ts +42 -0
  563. package/src/timeline/entrance.tsx +28 -3
  564. package/src/timeline/fleet-decision-projection.ts +2 -1
  565. package/src/timeline/fleet-decision-row.tsx +1 -0
  566. package/src/timeline/genie-loading.tsx +136 -0
  567. package/src/timeline/index.ts +11 -0
  568. package/src/timeline/knowledge-receipt.tsx +100 -0
  569. package/src/timeline/parsers.ts +2 -2
  570. package/src/timeline/platform-activity-row.tsx +216 -0
  571. package/src/timeline/presented-image.ts +49 -0
  572. package/src/timeline/projection.ts +1600 -84
  573. package/src/timeline/registry.ts +15 -3
  574. package/src/timeline/retained-image.ts +97 -0
  575. package/src/timeline/rolling-activity.tsx +92 -0
  576. package/src/timeline/screenshot-lightbox.tsx +115 -17
  577. package/src/timeline/shared.tsx +47 -15
  578. package/src/timeline/startup-preference.ts +33 -0
  579. package/src/timeline/startup-timings.tsx +145 -0
  580. package/src/timeline/tool-display-name.ts +8 -6
  581. package/src/timeline/tool-renderers.tsx +497 -128
  582. package/src/timeline/turn-summary.tsx +208 -44
  583. package/src/timeline/types.ts +186 -7
  584. package/src/types/machines.ts +10 -0
  585. package/src/usage/allowance-copy.ts +64 -0
  586. package/src/usage/summary.ts +93 -0
  587. package/src/usage.ts +50 -0
  588. package/styles/compiled.css +2098 -757
  589. package/styles/connect.css +284 -0
  590. package/styles/connect.d.ts +1 -0
  591. package/styles/effective-tokens.css +1 -0
  592. package/styles/index.css +201 -9
  593. package/styles/responsive.css +27 -1
  594. package/styles/session-capability.css +44 -0
  595. package/styles/tokens.css +135 -65
  596. package/dist/chunk-5UQPNLIO.js.map +0 -1
  597. package/dist/chunk-6KLX2RH5.js.map +0 -1
  598. package/dist/chunk-7WCLAEFV.js.map +0 -1
  599. package/dist/chunk-B6WPZSTT.js.map +0 -1
  600. package/dist/chunk-FK6VG4LL.js +0 -90
  601. package/dist/chunk-FK6VG4LL.js.map +0 -1
  602. package/dist/chunk-HA46CYQK.js.map +0 -1
  603. package/dist/chunk-HUIKIDM5.js.map +0 -1
  604. package/dist/chunk-IGC6A2ZI.js.map +0 -1
  605. package/dist/chunk-KCGXPP5V.js.map +0 -1
  606. package/dist/chunk-KZ73RL76.js.map +0 -1
  607. package/dist/chunk-LAKLF4PA.js +0 -141
  608. package/dist/chunk-LAKLF4PA.js.map +0 -1
  609. package/dist/chunk-LLOLUHVG.js.map +0 -1
  610. package/dist/chunk-MKPIAGVL.js +0 -465
  611. package/dist/chunk-MKPIAGVL.js.map +0 -1
  612. package/dist/chunk-PEI6RANI.js.map +0 -1
  613. package/dist/chunk-R3AZOAB5.js.map +0 -1
  614. package/dist/chunk-WSK7G5LE.js +0 -170
  615. package/dist/chunk-WSK7G5LE.js.map +0 -1
  616. package/dist/chunk-XBZWOM2K.js +0 -218
  617. package/dist/chunk-XBZWOM2K.js.map +0 -1
  618. package/dist/chunk-Y7OEDUJ5.js +0 -8810
  619. package/dist/chunk-Y7OEDUJ5.js.map +0 -1
  620. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  621. package/dist/hooks/use-packs.d.ts +0 -32
  622. package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
  623. package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
  624. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  625. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  626. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  627. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  628. package/src/hooks/use-packs.ts +0 -157
  629. /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GTR5XQ7X.js.map} +0 -0
@@ -13,7 +13,7 @@ import type { ToolCallItem } from "./types";
13
13
  Resolution order (most → least specific):
14
14
  1. exact match on `raw.type` (e.g. "apply_patch_call", "computer_call")
15
15
  2. exact match on the tool `name` (e.g. "exec_command", "web_search_call")
16
- 3. leaf match after MCP `__` prefix (e.g. opengeni__environment_set_variable)
16
+ 3. allowed leaf match after MCP `__` prefix (e.g. opengeni__environment_set_variable)
17
17
  4. the registry's generic fallback
18
18
 
19
19
  A consumer extends the defaults without forking by passing overrides to
@@ -48,7 +48,13 @@ export type ToolRenderer = ComponentType<ToolRendererProps>;
48
48
  /** A registry entry: which key it matches and the component that renders it. */
49
49
  export type ToolRegistryEntry =
50
50
  | { match: "rawType"; type: string; render: ToolRenderer }
51
- | { match: "name"; name: string; render: ToolRenderer };
51
+ | {
52
+ match: "name";
53
+ name: string;
54
+ render: ToolRenderer;
55
+ /** Disable untrusted `<server>__${name}` leaf matching for identity-sensitive renderers. */
56
+ matchPrefixedLeaf?: boolean | undefined;
57
+ };
52
58
 
53
59
  export type ToolRegistry = {
54
60
  /** Resolve the renderer for a call (never null — falls back to generic). */
@@ -92,6 +98,7 @@ export function createToolRegistry(
92
98
 
93
99
  const byRawType = new Map<string, ToolRenderer>();
94
100
  const byName = new Map<string, ToolRenderer>();
101
+ const byPrefixedLeaf = new Map<string, ToolRenderer>();
95
102
  for (const entry of entries) {
96
103
  if (entry.match === "rawType") {
97
104
  if (!byRawType.has(entry.type)) {
@@ -100,6 +107,11 @@ export function createToolRegistry(
100
107
  } else if (!byName.has(entry.name)) {
101
108
  byName.set(entry.name, entry.render);
102
109
  }
110
+ if (entry.match === "name" && entry.matchPrefixedLeaf !== false) {
111
+ if (!byPrefixedLeaf.has(entry.name)) {
112
+ byPrefixedLeaf.set(entry.name, entry.render);
113
+ }
114
+ }
103
115
  }
104
116
 
105
117
  const resolve = (item: ToolCallItem): ToolRenderer => {
@@ -116,7 +128,7 @@ export function createToolRegistry(
116
128
  }
117
129
  const leaf = mcpToolLeaf(item.name);
118
130
  if (leaf !== item.name) {
119
- const byLeaf = byName.get(leaf);
131
+ const byLeaf = byPrefixedLeaf.get(leaf);
120
132
  if (byLeaf) {
121
133
  return byLeaf;
122
134
  }
@@ -0,0 +1,97 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import type { RetainedArtifactReference } from "@opengeni/sdk";
3
+ import type { ToolRendererProps } from "./registry";
4
+ type RetainedImageState =
5
+ | { kind: "loading" }
6
+ | { kind: "ready"; url: string }
7
+ | { kind: "unavailable"; label: string }
8
+ | { kind: "error"; message: string };
9
+
10
+ export { isRetainedImageContentType } from "./presented-image";
11
+
12
+ export function useRetainedImageObjectUrl(
13
+ artifact: RetainedArtifactReference,
14
+ load: ToolRendererProps["loadRetainedArtifact"],
15
+ ): RetainedImageState & { retry: () => void } {
16
+ const [state, setState] = useState<RetainedImageState>({ kind: "loading" });
17
+ const [retrievalAttempt, setRetrievalAttempt] = useState(0);
18
+ // Retry only the immutable retained artifact; never issue a new capture or
19
+ // rewrite the tool receipt/model history to repair a human preview.
20
+ const retry = useCallback(() => setRetrievalAttempt((attempt) => attempt + 1), []);
21
+ // Function outputs are commonly serialized JSON. Parsing them creates a new
22
+ // object on every render, so depend on the immutable wire value rather than
23
+ // object identity; otherwise the loader can refetch after its own setState.
24
+ const artifactValue = retainedArtifactValue(artifact);
25
+ const stableArtifactRef = useRef({ value: artifactValue, artifact });
26
+ if (stableArtifactRef.current.value !== artifactValue) {
27
+ stableArtifactRef.current = { value: artifactValue, artifact };
28
+ }
29
+ const stableArtifact = stableArtifactRef.current.artifact;
30
+ useEffect(() => {
31
+ if (!load) {
32
+ setState({ kind: "unavailable", label: "retrieval is not configured" });
33
+ return;
34
+ }
35
+ const controller = new AbortController();
36
+ let objectUrl: string | null = null;
37
+ setState({ kind: "loading" });
38
+ void load(stableArtifact, controller.signal)
39
+ .then((source) => {
40
+ if (controller.signal.aborted) return;
41
+ if (!source) {
42
+ setState({ kind: "unavailable", label: "bytes are unavailable" });
43
+ return;
44
+ }
45
+ if (!(source instanceof Uint8Array)) {
46
+ if (!source.url.trim()) {
47
+ setState({ kind: "unavailable", label: "URL is unavailable" });
48
+ return;
49
+ }
50
+ setState({ kind: "ready", url: source.url });
51
+ return;
52
+ }
53
+ objectUrl = URL.createObjectURL(
54
+ new Blob([source as unknown as BlobPart], { type: stableArtifact.contentType }),
55
+ );
56
+ setState({ kind: "ready", url: objectUrl });
57
+ })
58
+ .catch((error: unknown) => {
59
+ if (controller.signal.aborted) return;
60
+ const status =
61
+ error && typeof error === "object" && "status" in error
62
+ ? Number((error as { status?: unknown }).status)
63
+ : null;
64
+ setState(
65
+ status === 404
66
+ ? { kind: "unavailable", label: "deleted" }
67
+ : status === 410
68
+ ? { kind: "unavailable", label: "expired or unavailable" }
69
+ : { kind: "error", message: "retrieval failed" },
70
+ );
71
+ });
72
+ return () => {
73
+ controller.abort();
74
+ if (objectUrl) URL.revokeObjectURL(objectUrl);
75
+ };
76
+ }, [stableArtifact, load, retrievalAttempt]);
77
+ return { ...state, retry };
78
+ }
79
+
80
+ function retainedArtifactValue(artifact: RetainedArtifactReference): string {
81
+ return [
82
+ artifact.artifactId,
83
+ artifact.kind,
84
+ artifact.contentType,
85
+ artifact.originalBytes,
86
+ artifact.sha256,
87
+ artifact.retainedAt,
88
+ artifact.dimensions?.width ?? "",
89
+ artifact.dimensions?.height ?? "",
90
+ artifact.retention.policy,
91
+ artifact.retention.expiresAt ?? "",
92
+ artifact.retrieval.method,
93
+ artifact.retrieval.path,
94
+ artifact.retrieval.acceptRanges,
95
+ artifact.retrieval.maxRangeBytes,
96
+ ].join("\0");
97
+ }
@@ -0,0 +1,92 @@
1
+ import { renderActivity } from "./activity-rail";
2
+ import { AnimatePresence, motion, useReducedMotion } from "motion/react";
3
+ import { WrenchIcon } from "lucide-react";
4
+ import { Suspense, useEffect, useState } from "react";
5
+ import { CompactActivityContext } from "./shared";
6
+ import { defaultToolRegistry } from "./tool-renderers";
7
+ import type { ToolRegistry } from "./registry";
8
+ import { toolDisplayName } from "./tool-display-name";
9
+ import type { ActivityItem } from "./types";
10
+
11
+ /** One stable viewport; updates replace its content without moving the conversation. */
12
+ export function RollingActivity({
13
+ items,
14
+ toolRegistry = defaultToolRegistry,
15
+ previousItem,
16
+ showCount = true,
17
+ }: {
18
+ items: ActivityItem[];
19
+ /** The standalone item visible immediately before this reel mounted. */
20
+ previousItem?: ActivityItem | undefined;
21
+ toolRegistry?: ToolRegistry;
22
+ /** Show "+N earlier"; off when an enclosing status line already counts steps. */
23
+ showCount?: boolean;
24
+ }) {
25
+ const reduced = useReducedMotion();
26
+ const [mounted, setMounted] = useState(false);
27
+ useEffect(() => setMounted(true), []);
28
+ // Progress notes have their own line in the status row; the reel shows steps.
29
+ const work = items.filter(
30
+ (item) => item.kind !== "startup-phase" && item.kind !== "agent-message",
31
+ );
32
+ const active = work.filter((item) =>
33
+ item.kind === "reasoning" ? item.streaming : "status" in item && item.status === "running",
34
+ );
35
+ // Advance with the event order; finishing a parallel tool must not replay an older one.
36
+ const item =
37
+ !mounted && previousItem && previousItem.kind !== "agent-message" ? previousItem : work.at(-1);
38
+ if (!item) return null;
39
+ const earlierCount = Math.max(
40
+ 0,
41
+ work.findIndex((entry) => entry.id === item.id),
42
+ );
43
+ const fallback = (
44
+ <span className="og-rolling-label">
45
+ <WrenchIcon className="size-3.5" />
46
+ <span>
47
+ {item.kind === "tool-call" ? toolDisplayName(item.name, item.display) : "Working"}
48
+ </span>
49
+ </span>
50
+ );
51
+ return (
52
+ <span
53
+ className="og-rolling-status"
54
+ data-running={active.some((entry) => entry.id === item.id) ? "true" : undefined}
55
+ >
56
+ <span className="sr-only">
57
+ {item.kind === "tool-call"
58
+ ? toolDisplayName(item.name, item.display)
59
+ : item.kind === "reasoning"
60
+ ? "Thinking"
61
+ : "Working"}
62
+ </span>
63
+ <span className="og-rolling-window" aria-hidden="true">
64
+ <AnimatePresence initial={false} mode="sync">
65
+ <motion.span
66
+ key={item.id}
67
+ className="og-rolling-face"
68
+ initial={{
69
+ opacity: 0,
70
+ y: reduced ? 0 : 24,
71
+ }}
72
+ animate={{ opacity: 1, y: 0 }}
73
+ exit={{
74
+ opacity: 0,
75
+ y: reduced ? 0 : -24,
76
+ }}
77
+ transition={{ duration: reduced ? 0 : 0.4, ease: [0.22, 1, 0.36, 1] }}
78
+ >
79
+ <CompactActivityContext.Provider value={true}>
80
+ <Suspense fallback={fallback}>
81
+ {renderActivity(item, toolRegistry, undefined, undefined, undefined, undefined)}
82
+ </Suspense>
83
+ </CompactActivityContext.Provider>
84
+ </motion.span>
85
+ </AnimatePresence>
86
+ </span>
87
+ {showCount && earlierCount > 0 ? (
88
+ <span className="og-rolling-count">{`+${earlierCount} earlier`}</span>
89
+ ) : null}
90
+ </span>
91
+ );
92
+ }
@@ -1,6 +1,14 @@
1
- import { XIcon } from "lucide-react";
1
+ import { DownloadIcon, XIcon } from "lucide-react";
2
2
  import { AnimatePresence, motion } from "motion/react";
3
- import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from "react";
3
+ import {
4
+ createContext,
5
+ useCallback,
6
+ useContext,
7
+ useEffect,
8
+ useMemo,
9
+ useState,
10
+ type ReactNode,
11
+ } from "react";
4
12
  import { Dialog } from "radix-ui";
5
13
  import { cn } from "../lib/cn";
6
14
  import { usePortalTokenStyle } from "../lib/use-portal-token-style";
@@ -19,7 +27,20 @@ import { usePortalTokenStyle } from "../lib/use-portal-token-style";
19
27
  -------------------------------------------------------------------------- */
20
28
 
21
29
  type LightboxController = {
22
- open: (src: string, caption?: string, source?: HTMLElement | null, label?: string) => void;
30
+ open: (
31
+ src: string,
32
+ caption?: string,
33
+ source?: HTMLElement | null,
34
+ label?: string,
35
+ downloadFilename?: string,
36
+ controlLabels?: LightboxControlLabels,
37
+ releaseSource?: () => void,
38
+ ) => void;
39
+ };
40
+
41
+ export type LightboxControlLabels = {
42
+ download?: string | undefined;
43
+ close?: string | undefined;
23
44
  };
24
45
 
25
46
  const LightboxContext = createContext<LightboxController | null>(null);
@@ -40,6 +61,23 @@ export function useLightboxOptional(): LightboxController | null {
40
61
 
41
62
  const NOOP: LightboxController = { open: () => {} };
42
63
 
64
+ /** @internal Owns one optional retained lightbox source and releases it exactly once. */
65
+ export function createLightboxSourceOwner() {
66
+ let releaseCurrent: (() => void) | null = null;
67
+ return {
68
+ replace(release?: (() => void) | undefined) {
69
+ const previous = releaseCurrent;
70
+ releaseCurrent = release ?? null;
71
+ previous?.();
72
+ },
73
+ release() {
74
+ const release = releaseCurrent;
75
+ releaseCurrent = null;
76
+ release?.();
77
+ },
78
+ };
79
+ }
80
+
43
81
  /**
44
82
  * The app-level screenshot lightbox. Render once near the timeline; renderers
45
83
  * call `useLightbox().open(src)`.
@@ -63,22 +101,47 @@ function LightboxRoot({ children }: { children: ReactNode }) {
63
101
  src: string;
64
102
  caption?: string;
65
103
  label: string;
104
+ downloadFilename?: string;
105
+ controlLabels?: LightboxControlLabels;
66
106
  } | null>(null);
67
107
  const [tokenSource, setTokenSource] = useState<HTMLElement | null>(null);
108
+ const sourceOwner = useMemo(() => createLightboxSourceOwner(), []);
68
109
  const portalStyle = usePortalTokenStyle(tokenSource);
69
110
 
111
+ const releaseCurrentSource = useCallback(() => {
112
+ sourceOwner.release();
113
+ }, [sourceOwner]);
114
+
115
+ useEffect(() => releaseCurrentSource, [releaseCurrentSource]);
116
+
70
117
  const open = useCallback(
71
- (src: string, caption?: string, source?: HTMLElement | null, label = "Screenshot") => {
118
+ (
119
+ src: string,
120
+ caption?: string,
121
+ source?: HTMLElement | null,
122
+ label = "Screenshot",
123
+ downloadFilename?: string,
124
+ controlLabels?: LightboxControlLabels,
125
+ releaseSource?: () => void,
126
+ ) => {
127
+ sourceOwner.replace(releaseSource);
72
128
  setTokenSource(source ?? null);
73
- setState(caption ? { src, caption, label } : { src, label });
129
+ setState({
130
+ src,
131
+ label,
132
+ ...(caption ? { caption } : {}),
133
+ ...(downloadFilename ? { downloadFilename } : {}),
134
+ ...(controlLabels ? { controlLabels } : {}),
135
+ });
74
136
  },
75
- [],
137
+ [sourceOwner],
76
138
  );
77
139
 
78
140
  const close = useCallback(() => {
141
+ releaseCurrentSource();
79
142
  setState(null);
80
143
  setTokenSource(null);
81
- }, []);
144
+ }, [releaseCurrentSource]);
82
145
 
83
146
  const controller = useMemo<LightboxController>(() => ({ open }), [open]);
84
147
 
@@ -141,16 +204,11 @@ function LightboxRoot({ children }: { children: ReactNode }) {
141
204
  alt={state.caption ?? state.label}
142
205
  className="min-h-0 max-h-[82vh] w-auto max-w-full rounded-og-md border border-white/10 object-contain shadow-og-lg"
143
206
  />
144
- <Dialog.Close
145
- className={cn(
146
- "absolute -right-3 -top-3 inline-flex size-9 items-center justify-center rounded-full",
147
- "border border-white/15 bg-black/60 text-white/70 backdrop-blur",
148
- "transition-colors hover:border-white/30 hover:text-white",
149
- )}
150
- aria-label="Close"
151
- >
152
- <XIcon className="size-4" />
153
- </Dialog.Close>
207
+ <ScreenshotLightboxControls
208
+ src={state.src}
209
+ downloadFilename={state.downloadFilename}
210
+ controlLabels={state.controlLabels}
211
+ />
154
212
  </div>
155
213
  {state.caption ? (
156
214
  <figcaption className="max-w-2xl text-center font-og-mono text-og-xs text-white/55">
@@ -171,3 +229,43 @@ function LightboxRoot({ children }: { children: ReactNode }) {
171
229
  </LightboxContext.Provider>
172
230
  );
173
231
  }
232
+
233
+ /** @internal Exact controls rendered by an open screenshot lightbox. */
234
+ export function ScreenshotLightboxControls({
235
+ src,
236
+ downloadFilename,
237
+ controlLabels,
238
+ }: {
239
+ src: string;
240
+ downloadFilename?: string | undefined;
241
+ controlLabels?: LightboxControlLabels | undefined;
242
+ }) {
243
+ return (
244
+ <div className="absolute -right-3 -top-3 flex items-center gap-2">
245
+ {downloadFilename ? (
246
+ <a
247
+ href={src}
248
+ download={downloadFilename}
249
+ className={cn(
250
+ "inline-flex size-9 items-center justify-center rounded-full",
251
+ "border border-white/15 bg-black/60 text-white/70 backdrop-blur",
252
+ "transition-colors hover:border-white/30 hover:text-white",
253
+ )}
254
+ aria-label={controlLabels?.download ?? `Download ${downloadFilename}`}
255
+ >
256
+ <DownloadIcon className="size-4" />
257
+ </a>
258
+ ) : null}
259
+ <Dialog.Close
260
+ className={cn(
261
+ "inline-flex size-9 items-center justify-center rounded-full",
262
+ "border border-white/15 bg-black/60 text-white/70 backdrop-blur",
263
+ "transition-colors hover:border-white/30 hover:text-white",
264
+ )}
265
+ aria-label={controlLabels?.close ?? "Close"}
266
+ >
267
+ <XIcon className="size-4" />
268
+ </Dialog.Close>
269
+ </div>
270
+ );
271
+ }
@@ -1,5 +1,6 @@
1
1
  import { CameraIcon, CameraOffIcon, ChevronRightIcon } from "lucide-react";
2
- import { createContext, useContext, useState, type ReactNode } from "react";
2
+ import { createContext, useContext, useEffect, useState, type ReactNode } from "react";
3
+ import { useTimelineSearchReveal } from "../components/timeline-search";
3
4
  import { cn } from "../lib/cn";
4
5
  import { stringifyPayload } from "../lib/format";
5
6
  import { useForcedDefaultOpen } from "./disclosure-context";
@@ -55,6 +56,8 @@ export function ToolCallTruncationProvider({
55
56
  }
56
57
 
57
58
  export type ActivityDisclosureProps = {
59
+ /** Override the rolling preview; null keeps rapidly streaming details out of the header. */
60
+ compactPreview?: ReactNode;
58
61
  icon: ReactNode;
59
62
  /** Icon tint. Defaults to the muted foreground; renderers pass accent/failed. */
60
63
  iconTone?: "accent" | "failed" | "running" | "muted" | undefined;
@@ -116,6 +119,8 @@ const ICON_TONE: Record<NonNullable<ActivityDisclosureProps["iconTone"]>, string
116
119
  * inline media, and at most one right-gutter settle chip. Compact by default;
117
120
  * the body mounts only when expanded.
118
121
  */
122
+ export const CompactActivityContext = createContext(false);
123
+
119
124
  export function ActivityDisclosure({
120
125
  icon,
121
126
  iconTone: iconToneProp = "muted",
@@ -123,6 +128,7 @@ export function ActivityDisclosure({
123
128
  titleMono,
124
129
  running,
125
130
  preview,
131
+ compactPreview,
126
132
  media,
127
133
  chip: chipProp,
128
134
  failed,
@@ -149,7 +155,26 @@ export function ActivityDisclosure({
149
155
  // absent in normal app usage, where the row starts collapsed.
150
156
  const forcedDefaultOpen = useForcedDefaultOpen();
151
157
  const [open, setOpen] = useState(defaultOpen ?? forcedDefaultOpen ?? false);
158
+ const searchReveal = useTimelineSearchReveal();
159
+ useEffect(() => {
160
+ if (searchReveal) setOpen(true);
161
+ }, [searchReveal]);
152
162
  const truncation = useContext(ToolCallTruncationContext);
163
+ const compact = useContext(CompactActivityContext);
164
+ if (compact)
165
+ return (
166
+ <span className="og-rolling-label">
167
+ <span className={cn("shrink-0", ICON_TONE[iconTone])}>{icon}</span>
168
+ <span className="og-command-reel">
169
+ <span className="og-reel-title">{title}</span>
170
+ {(compactPreview === undefined ? preview : compactPreview) ? (
171
+ <span className="og-reel-preview text-og-fg-subtle">
172
+ {compactPreview === undefined ? preview : compactPreview}
173
+ </span>
174
+ ) : null}
175
+ </span>
176
+ </span>
177
+ );
153
178
  const hasBody = expandable && (children != null || truncation != null);
154
179
 
155
180
  // The preview is detail-on-demand: it is suppressed once the row is open so a
@@ -189,20 +214,21 @@ export function ActivityDisclosure({
189
214
  <span className="size-3.5 shrink-0" />
190
215
  )}
191
216
  <span className={cn("shrink-0", ICON_TONE[iconTone])}>{icon}</span>
192
- <span
193
- className={cn(
194
- "min-w-0 shrink truncate text-og-base font-medium",
195
- titleMono && "font-og-mono text-og-sm font-normal",
196
- running && "og-shimmer-text",
217
+ <span className={cn("og-command-reel", running && "og-command-reel-running")}>
218
+ <span
219
+ className={cn(
220
+ "min-w-0 shrink truncate text-og-base font-medium",
221
+ titleMono && "font-og-mono text-og-sm font-normal",
222
+ )}
223
+ >
224
+ {title}
225
+ </span>
226
+ {previewVisible && !media ? (
227
+ <span className="min-w-0 flex-1 truncate text-og-sm text-og-fg-subtle">{preview}</span>
228
+ ) : (
229
+ <span className="flex-1" />
197
230
  )}
198
- >
199
- {title}
200
231
  </span>
201
- {previewVisible && !media ? (
202
- <span className="min-w-0 flex-1 truncate text-og-sm text-og-fg-subtle">{preview}</span>
203
- ) : (
204
- <span className="flex-1" />
205
- )}
206
232
  {/* The right gutter carries at most ONE signal: the media thumbnail, else a
207
233
  terse settle chip (hidden once expanded — the body owns the detail). */}
208
234
  {media && !open ? (
@@ -509,12 +535,14 @@ export function Thumbnail({
509
535
  alt = "screenshot",
510
536
  expandLabel = "Expand screenshot",
511
537
  lightboxLabel = "Screenshot",
538
+ downloadFilename,
512
539
  }: {
513
540
  src: string;
514
541
  caption?: string | undefined;
515
542
  alt?: string;
516
543
  expandLabel?: string | undefined;
517
544
  lightboxLabel?: string | undefined;
545
+ downloadFilename?: string | undefined;
518
546
  }) {
519
547
  const lightbox = useLightboxOptional();
520
548
  const [failed, setFailed] = useState(false);
@@ -542,7 +570,7 @@ export function Thumbnail({
542
570
  type="button"
543
571
  onClick={(event) => {
544
572
  event.stopPropagation();
545
- lightbox.open(src, caption, event.currentTarget, lightboxLabel);
573
+ lightbox.open(src, caption, event.currentTarget, lightboxLabel, downloadFilename);
546
574
  }}
547
575
  onKeyDown={(event) => {
548
576
  if (event.key === "Enter" || event.key === " ") {
@@ -573,12 +601,14 @@ export function ScreenshotFigure({
573
601
  alt = "screenshot",
574
602
  expandLabel = "Expand screenshot",
575
603
  lightboxLabel = "Screenshot",
604
+ downloadFilename,
576
605
  }: {
577
606
  src: string;
578
607
  caption?: string | undefined;
579
608
  alt?: string;
580
609
  expandLabel?: string | undefined;
581
610
  lightboxLabel?: string | undefined;
611
+ downloadFilename?: string | undefined;
582
612
  }) {
583
613
  const lightbox = useLightboxOptional();
584
614
  const [failed, setFailed] = useState(false);
@@ -602,7 +632,9 @@ export function ScreenshotFigure({
602
632
  ) : lightbox ? (
603
633
  <button
604
634
  type="button"
605
- onClick={(event) => lightbox.open(src, caption, event.currentTarget, lightboxLabel)}
635
+ onClick={(event) =>
636
+ lightbox.open(src, caption, event.currentTarget, lightboxLabel, downloadFilename)
637
+ }
606
638
  className={surface}
607
639
  aria-label={expandLabel}
608
640
  >
@@ -0,0 +1,33 @@
1
+ import { useSyncExternalStore } from "react";
2
+
3
+ const KEY = "opengeni:startup-details:v1";
4
+ const EVENT = "opengeni:startup-details-changed";
5
+ let fallback = false;
6
+ function snapshot() {
7
+ try {
8
+ return window.localStorage.getItem(KEY) === "true";
9
+ } catch {
10
+ return fallback;
11
+ }
12
+ }
13
+ function subscribe(listener: () => void) {
14
+ window.addEventListener(EVENT, listener);
15
+ window.addEventListener("storage", listener);
16
+ return () => {
17
+ window.removeEventListener(EVENT, listener);
18
+ window.removeEventListener("storage", listener);
19
+ };
20
+ }
21
+ export function setStartupDetails(value: boolean) {
22
+ fallback = value;
23
+ try {
24
+ window.localStorage.setItem(KEY, String(value));
25
+ } catch {
26
+ /* Private storage is optional. */
27
+ }
28
+ window.dispatchEvent(new Event(EVENT));
29
+ }
30
+ /** Presentation preference only. Startup evidence is always retained. */
31
+ export function useStartupDetails() {
32
+ return useSyncExternalStore(subscribe, snapshot, () => false);
33
+ }