@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
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Await-compatible older-history result with a causal commit receipt.
3
+ *
4
+ * `committed` flips synchronously before the accepted older window is exposed
5
+ * to React. Returning this exact object preserves the receipt directly;
6
+ * synchronous wrappers that discard it remain supported through receipt
7
+ * capture, while replacing it asynchronously with a plain promise does not.
8
+ */
9
+ export type OlderHistoryLoadReceipt = Promise<boolean> & {
10
+ readonly committed: boolean;
11
+ readonly tailPreserved?: boolean;
12
+ };
13
+
14
+ /**
15
+ * Source-compatible public callback accepted by MessageTimeline.
16
+ *
17
+ * The callback historically returned `void`, which permits consumers to
18
+ * return any synchronous value or promise. Receipt-aware loaders opt into the
19
+ * stronger runtime contract by returning (or synchronously creating through a
20
+ * wrapper) an {@link OlderHistoryLoadReceipt}.
21
+ */
22
+ export type OlderHistoryLoader = () => unknown;
23
+
24
+ type MutableOlderHistoryLoadReceipt = Promise<boolean> & {
25
+ committed: boolean;
26
+ tailPreserved: boolean;
27
+ };
28
+
29
+ type OlderHistoryReceiptCapture = (receipt: OlderHistoryLoadReceipt) => void;
30
+
31
+ let activeReceiptCapture: OlderHistoryReceiptCapture | undefined;
32
+ let preserveTailForAutomaticLoad = false;
33
+
34
+ /** Bind a receipt before a synchronous forwarding stack can publish state. */
35
+ export function invokeOlderHistoryLoaderWithReceiptCapture(
36
+ load: OlderHistoryLoader,
37
+ capture: OlderHistoryReceiptCapture,
38
+ preserveTail = false,
39
+ ): unknown {
40
+ const previousCapture = activeReceiptCapture;
41
+ const previousPreserveTail = preserveTailForAutomaticLoad;
42
+ activeReceiptCapture = capture;
43
+ preserveTailForAutomaticLoad = preserveTail;
44
+ try {
45
+ return load();
46
+ } finally {
47
+ activeReceiptCapture = previousCapture;
48
+ preserveTailForAutomaticLoad = previousPreserveTail;
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Build an await-compatible older-history receipt for custom timeline hosts.
54
+ * Call `markCommitted` immediately before publishing an accepted older window.
55
+ */
56
+ export function createOlderHistoryLoadReceipt(
57
+ load: (
58
+ markCommitted: () => void,
59
+ preserveTail: boolean,
60
+ markTailPreserved: () => void,
61
+ ) => boolean | Promise<boolean>,
62
+ ): OlderHistoryLoadReceipt {
63
+ let resolveResult!: (value: boolean | PromiseLike<boolean>) => void;
64
+ let rejectResult!: (reason?: unknown) => void;
65
+ const result = new Promise<boolean>((resolve, reject) => {
66
+ resolveResult = resolve;
67
+ rejectResult = reject;
68
+ }) as MutableOlderHistoryLoadReceipt;
69
+ result.committed = false;
70
+ result.tailPreserved = false;
71
+ activeReceiptCapture?.(result);
72
+ try {
73
+ const loaded = load(
74
+ () => {
75
+ result.committed = true;
76
+ },
77
+ preserveTailForAutomaticLoad,
78
+ () => {
79
+ result.tailPreserved = true;
80
+ },
81
+ );
82
+ Promise.resolve(loaded).then(resolveResult, rejectResult);
83
+ } catch (error) {
84
+ rejectResult(error);
85
+ }
86
+ return result;
87
+ }
@@ -0,0 +1,185 @@
1
+ import { useState } from "react";
2
+ import { pluginMcpUnavailableReason, type PluginDiscoveryItem } from "@opengeni/sdk";
3
+ import { BoxesIcon } from "lucide-react";
4
+ import { Markdown } from "./components/markdown";
5
+ import { ConnectionLogo } from "./connection-logo";
6
+
7
+ const componentLabels: Record<string, string> = {
8
+ skills: "Skills",
9
+ mcp: "MCP connections",
10
+ apps: "Hosted apps",
11
+ hooks: "Hooks",
12
+ agents: "Agents",
13
+ commands: "Commands",
14
+ lsp: "Language servers",
15
+ };
16
+
17
+ const EMPTY_CONNECTIONS: Record<string, boolean> = {};
18
+
19
+ /** Embeddable plugin overview. Hosts own the dialog and installation actions. */
20
+ export function PluginDetails({
21
+ item,
22
+ onInstall,
23
+ busy = false,
24
+ installed = false,
25
+ error,
26
+ connections = EMPTY_CONNECTIONS,
27
+ onConnect,
28
+ }: {
29
+ item: PluginDiscoveryItem;
30
+ onInstall?: () => void;
31
+ busy?: boolean;
32
+ installed?: boolean;
33
+ error?: string | null;
34
+ connections?: Record<string, boolean>;
35
+ onConnect?: (server: { name: string; endpoint: string | null }) => void;
36
+ }) {
37
+ const supported = (server: NonNullable<PluginDiscoveryItem["mcpServers"]>[number]) =>
38
+ pluginMcpUnavailableReason(server) === null;
39
+ const contentsUnknown = item.skills == null || item.mcpServers == null;
40
+ const installableCount =
41
+ (item.skills?.length ?? 0) + (item.mcpServers?.filter(supported).length ?? 0);
42
+ const exceedsInstallLimit = installableCount > 64;
43
+ const installable = !contentsUnknown && installableCount > 0 && !exceedsInstallLimit;
44
+ const [expanded, setExpanded] = useState(false);
45
+ const description = item.longDescription || item.description;
46
+ const lengthy = description.length > 700;
47
+ const registryLabel =
48
+ item.provider === "openai"
49
+ ? "OpenAI plugin registry"
50
+ : item.provider === "anthropic"
51
+ ? "Anthropic plugin registry"
52
+ : "Custom source";
53
+ return (
54
+ <article className="og-plugin-details">
55
+ <header className="og-plugin-details-header">
56
+ <ConnectionLogo
57
+ src={item.logoUrl}
58
+ name={item.displayName}
59
+ fallback={<BoxesIcon aria-hidden="true" />}
60
+ />
61
+ <div>
62
+ <h2>{item.displayName.replace(/-/g, " ")}</h2>
63
+ {item.author?.name ? <p>By {item.author.name}</p> : null}
64
+ </div>
65
+ </header>
66
+ <div className="og-plugin-details-meta">
67
+ <span>{registryLabel}</span>
68
+ {item.category ? <span>{item.category}</span> : null}
69
+ {item.version ? <span>v{item.version}</span> : null}
70
+ </div>
71
+ <section className="og-plugin-details-members">
72
+ <h3>
73
+ Skills <span>{item.skills?.length ?? "—"}</span>
74
+ </h3>
75
+ {item.skills?.length ? (
76
+ <ul>
77
+ {item.skills.map((skill) => (
78
+ <li key={skill.sourceUrl}>
79
+ <a href={skill.sourceUrl} target="_blank" rel="noopener noreferrer">
80
+ <strong>{skill.name}</strong>
81
+ <span aria-hidden="true">↗</span>
82
+ </a>
83
+ </li>
84
+ ))}
85
+ </ul>
86
+ ) : (
87
+ <p>
88
+ {item.skills
89
+ ? "No bundled skills."
90
+ : "Contents haven’t been indexed for this repository."}
91
+ </p>
92
+ )}
93
+ <h3>
94
+ MCP servers <span>{item.mcpServers?.length ?? "—"}</span>
95
+ </h3>
96
+ {item.mcpServers?.length ? (
97
+ <ul>
98
+ {item.mcpServers.map((server) => {
99
+ const connected = Boolean(server.endpoint && connections[server.endpoint]);
100
+ // Existing connections remain manageable regardless of the source manifest's setup requirements.
101
+ const unavailableReason = connected ? null : pluginMcpUnavailableReason(server);
102
+ return (
103
+ <li
104
+ key={server.name}
105
+ className={unavailableReason ? "og-plugin-member-disabled" : undefined}
106
+ >
107
+ <div className="og-plugin-server-heading">
108
+ <strong>{server.name}</strong>
109
+ {!unavailableReason && onConnect ? (
110
+ <button type="button" disabled={busy} onClick={() => onConnect(server)}>
111
+ {connected ? "Manage" : "Connect"}
112
+ </button>
113
+ ) : null}
114
+ </div>
115
+ <small>
116
+ {connected ? "Connected · " : ""}
117
+ {unavailableReason ?? server.endpoint}
118
+ </small>
119
+ </li>
120
+ );
121
+ })}
122
+ </ul>
123
+ ) : (
124
+ <p>
125
+ {item.mcpServers ? "No bundled MCP servers." : "Server details haven’t been indexed."}
126
+ </p>
127
+ )}
128
+ {item.components?.some((component) => !["skills", "mcp"].includes(component)) ? (
129
+ <div className="og-plugin-details-other">
130
+ Not installed here:{" "}
131
+ {item.components
132
+ .filter((component) => !["skills", "mcp"].includes(component))
133
+ .map((component) => componentLabels[component] ?? component)
134
+ .join(", ")}
135
+ </div>
136
+ ) : null}
137
+ </section>
138
+ <section className="og-plugin-details-overview" aria-label="Overview">
139
+ <div className={lengthy && !expanded ? "og-plugin-details-excerpt" : undefined}>
140
+ <Markdown>{description}</Markdown>
141
+ </div>
142
+ {lengthy ? (
143
+ <button
144
+ type="button"
145
+ className="og-plugin-details-more"
146
+ aria-expanded={expanded}
147
+ onClick={() => setExpanded((value) => !value)}
148
+ >
149
+ {expanded ? "Show less" : "Read more"}
150
+ </button>
151
+ ) : null}
152
+ </section>
153
+ <footer>
154
+ {item.sourceUrl ? (
155
+ <a href={item.sourceUrl} target="_blank" rel="noopener noreferrer">
156
+ View repository <span aria-hidden="true">↗</span>
157
+ </a>
158
+ ) : null}
159
+ {onInstall ? (
160
+ <button
161
+ className="og-plugin-install"
162
+ type="button"
163
+ disabled={!installable || busy || installed}
164
+ onClick={onInstall}
165
+ >
166
+ {installed ? "Installed" : busy ? "Installing…" : "Install plugin"}
167
+ </button>
168
+ ) : null}
169
+ {error ? <p role="alert">{error}</p> : null}
170
+ {exceedsInstallLimit ? (
171
+ <p>This plugin exceeds the current 64-component installation limit.</p>
172
+ ) : contentsUnknown ? (
173
+ <p>
174
+ Plugin contents are unavailable. Installation is disabled until the repository can be
175
+ inspected.
176
+ </p>
177
+ ) : !installable ? (
178
+ <p>No installable skills or remote MCP servers.</p>
179
+ ) : (
180
+ <p>Installs skills and adds connection references. Connect each server separately.</p>
181
+ )}
182
+ </footer>
183
+ </article>
184
+ );
185
+ }
@@ -0,0 +1,196 @@
1
+ import { createDiscoveryCache } from "./discovery-cache";
2
+ import { useEffect, useRef, useState, type ReactNode } from "react";
3
+ import type { PluginDiscoveryItem, PluginDiscoveryPage } from "@opengeni/sdk";
4
+ import { BoxesIcon } from "lucide-react";
5
+ import { CapabilityCatalogRow } from "./capability-catalog-row";
6
+ import { ConnectionLogo } from "./connection-logo";
7
+
8
+ const discoveryCache = createDiscoveryCache<PluginDiscoveryPage>();
9
+ const spacedName = (name: string) => name.replace(/-/g, " ");
10
+ const EMPTY_INSTALLED_IDS: ReadonlySet<string> = new Set();
11
+
12
+ export type PluginDiscoveryProps = {
13
+ client: {
14
+ discoverPlugins(
15
+ workspaceId: string,
16
+ options?: { query?: string; provider?: string; offset?: number },
17
+ ): Promise<PluginDiscoveryPage>;
18
+ };
19
+ workspaceId: string;
20
+ query: string;
21
+ /** Initially selected registry. Users can still switch registries or browse all. */
22
+ defaultProvider?: "" | "openai" | "anthropic";
23
+ /** Discovery identities already installed in the current workspace. */
24
+ installedIds?: ReadonlySet<string>;
25
+ resultLimit?: number;
26
+ onShowMore?: () => void;
27
+ onOpen: (item: PluginDiscoveryItem) => void;
28
+ /** Display name for a registry slug. Defaults to the slug with dashes as spaces. */
29
+ formatName?: (name: string) => string;
30
+ /** The row tile. Defaults to the plugin logo with a glyph fallback. */
31
+ renderIcon?: (item: PluginDiscoveryItem) => ReactNode;
32
+ };
33
+ export function PluginDiscovery(props: PluginDiscoveryProps) {
34
+ const [provider, setProvider] = useState(props.defaultProvider ?? "");
35
+ return (
36
+ <section
37
+ className={`og-plugin-discovery ${props.resultLimit ? "og-catalog-overview" : ""}`}
38
+ aria-label="Discover plugins"
39
+ >
40
+ <header>
41
+ <h3>{props.resultLimit ? "Plugins" : "Browse plugins"}</h3>
42
+ {!props.resultLimit ? (
43
+ <div className="og-plugin-filters" role="group" aria-label="Plugin registry">
44
+ {(
45
+ [
46
+ { value: "", label: "All" },
47
+ { value: "openai", label: "OpenAI plugin registry" },
48
+ { value: "anthropic", label: "Anthropic plugin registry" },
49
+ ] as const
50
+ ).map((option) => (
51
+ <button
52
+ key={option.value}
53
+ type="button"
54
+ aria-pressed={provider === option.value}
55
+ onClick={() => setProvider(option.value)}
56
+ >
57
+ {option.label}
58
+ </button>
59
+ ))}
60
+ </div>
61
+ ) : null}
62
+ </header>
63
+ <Results
64
+ key={`${props.workspaceId}:${props.query}:${provider}`}
65
+ {...props}
66
+ provider={provider}
67
+ />
68
+ </section>
69
+ );
70
+ }
71
+ function Results({
72
+ client,
73
+ workspaceId,
74
+ query,
75
+ provider,
76
+ installedIds = EMPTY_INSTALLED_IDS,
77
+ onOpen,
78
+ resultLimit,
79
+ onShowMore,
80
+ formatName = spacedName,
81
+ renderIcon,
82
+ }: PluginDiscoveryProps & { provider: string }) {
83
+ const initial = discoveryCache.peek(client, JSON.stringify([workspaceId, query, provider, 0]));
84
+ const [items, setItems] = useState<PluginDiscoveryItem[]>(initial?.items ?? []);
85
+ const [offset, setOffset] = useState(0);
86
+ const [next, setNext] = useState<number | null>(initial?.nextOffset ?? null);
87
+ const [total, setTotal] = useState(initial?.total ?? 0);
88
+ const [loading, setLoading] = useState(!initial);
89
+ const [error, setError] = useState(false);
90
+ const [retry, setRetry] = useState(0);
91
+ const sentinel = useRef<HTMLDivElement>(null);
92
+ useEffect(() => {
93
+ let active = true;
94
+ const cacheKey = JSON.stringify([workspaceId, query, provider, offset]);
95
+ const cached = discoveryCache.peek(client, cacheKey);
96
+ setLoading(!cached);
97
+ setError(false);
98
+ const timer = setTimeout(
99
+ () => {
100
+ void discoveryCache
101
+ .read(client, cacheKey, () =>
102
+ client.discoverPlugins(workspaceId, { query, provider, offset }),
103
+ )
104
+ .then(
105
+ (page) => {
106
+ if (!active) return;
107
+ setItems((previous) => (offset ? [...previous, ...page.items] : page.items));
108
+ setTotal(page.total);
109
+ setNext(page.nextOffset);
110
+ setLoading(false);
111
+ },
112
+ () => {
113
+ if (active) {
114
+ setError(true);
115
+ setLoading(false);
116
+ }
117
+ },
118
+ );
119
+ },
120
+ cached || offset ? 0 : 200,
121
+ );
122
+ return () => {
123
+ active = false;
124
+ clearTimeout(timer);
125
+ };
126
+ }, [client, workspaceId, query, provider, offset, retry]);
127
+ useEffect(() => {
128
+ if (resultLimit || loading || error || next === null || !sentinel.current) return;
129
+ const observer = new IntersectionObserver(
130
+ (entries) => {
131
+ if (entries.some((entry) => entry.isIntersecting)) setOffset(next);
132
+ },
133
+ { rootMargin: "200px" },
134
+ );
135
+ observer.observe(sentinel.current);
136
+ return () => observer.disconnect();
137
+ }, [loading, error, next, resultLimit]);
138
+ return (
139
+ <>
140
+ {!loading && !error ? (
141
+ <p role="status">
142
+ {total
143
+ ? "Bundles of skills and connections"
144
+ : query.trim()
145
+ ? `No matches for “${query.trim()}”.`
146
+ : "No plugins in this registry."}
147
+ </p>
148
+ ) : null}
149
+ <div className="og-plugin-discovery-grid">
150
+ {items.slice(0, resultLimit).map((item) => (
151
+ <CapabilityCatalogRow
152
+ key={item.id}
153
+ data-plugin-id={item.id}
154
+ name={formatName(item.displayName)}
155
+ description={item.description}
156
+ status={installedIds.has(item.id) ? "added" : "available"}
157
+ statusLabel={installedIds.has(item.id) ? "Installed" : "Available to install"}
158
+ onOpen={() => onOpen(item)}
159
+ icon={
160
+ renderIcon ? (
161
+ renderIcon(item)
162
+ ) : (
163
+ <ConnectionLogo
164
+ src={item.logoUrl}
165
+ name={item.displayName}
166
+ fallback={<BoxesIcon aria-hidden="true" />}
167
+ />
168
+ )
169
+ }
170
+ />
171
+ ))}
172
+ </div>
173
+ {loading ? <p role="status">Loading plugins…</p> : null}
174
+ {error ? (
175
+ <p role="alert">
176
+ Couldn’t load plugins.{" "}
177
+ <button type="button" onClick={() => setRetry((value) => value + 1)}>
178
+ Retry
179
+ </button>
180
+ </p>
181
+ ) : null}
182
+ {resultLimit && !loading && !error && total > resultLimit ? (
183
+ <button className="og-catalog-more" type="button" onClick={onShowMore}>
184
+ View all plugins
185
+ </button>
186
+ ) : null}
187
+ <div ref={sentinel}>
188
+ {!resultLimit && next !== null && !loading && !error ? (
189
+ <button className="og-plugin-more" type="button" onClick={() => setOffset(next)}>
190
+ Show more plugins
191
+ </button>
192
+ ) : null}
193
+ </div>
194
+ </>
195
+ );
196
+ }
package/src/provider.tsx CHANGED
@@ -9,6 +9,9 @@ import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } fro
9
9
  import type { SessionClientLike } from "./client";
10
10
  import { usePageLiveActivity } from "./hooks/internal";
11
11
  import { OpenGeniContext } from "./session-context";
12
+ import { ErrorMessageContext, type ErrorMessageFormatter } from "./lib/error-message";
13
+
14
+ export type { ErrorMessageFormatter } from "./lib/error-message";
12
15
 
13
16
  export { useOpenGeni, useOpenGeniClient } from "./session-context";
14
17
  export type { ClientOverride, OpenGeniContextValue } from "./session-context";
@@ -19,6 +22,16 @@ export type OpenGeniProviderProps = {
19
22
  workspaceId: string;
20
23
  onWorkspaceControlEvent?: ((event: WorkspaceControlEvent) => void) | undefined;
21
24
  onWorkspaceInteractionEvent?: ((event: WorkspaceInteractionRevisionEvent) => void) | undefined;
25
+ /**
26
+ * Stale-tab protection for the stock OpenGeni web app: when the server's API
27
+ * contract revision differs from this bundle's, cover the page and reload it
28
+ * once. Off by default, because an embedded product's page must never be
29
+ * blocked or reloaded when OpenGeni deploys; there a mismatch is ignored and
30
+ * the SDK's tolerant-reader compatibility applies.
31
+ */
32
+ reloadOnApiContractChange?: boolean | undefined;
33
+ /** Host-owned error copy. Receives the original diagnostic error and neutral default copy. */
34
+ formatError?: ErrorMessageFormatter | undefined;
22
35
  children?: ReactNode;
23
36
  };
24
37
 
@@ -31,6 +44,8 @@ export function OpenGeniProvider({
31
44
  workspaceId,
32
45
  onWorkspaceControlEvent,
33
46
  onWorkspaceInteractionEvent,
47
+ reloadOnApiContractChange = false,
48
+ formatError,
34
49
  children,
35
50
  }: OpenGeniProviderProps) {
36
51
  const [workspaceControlEvent, setWorkspaceControlEvent] = useState<WorkspaceControlEvent | null>(
@@ -59,10 +74,11 @@ export function OpenGeniProvider({
59
74
  callbackRef.current = onWorkspaceControlEvent;
60
75
  interactionCallbackRef.current = onWorkspaceInteractionEvent;
61
76
 
77
+ const strictContract = reloadOnApiContractChange;
62
78
  const verifyApiContract = useCallback(async (): Promise<void> => {
63
79
  try {
64
80
  const config = await client.getClientConfig();
65
- if (config.apiContractRevision !== OPENGENI_API_CONTRACT_REVISION) {
81
+ if (strictContract && config.apiContractRevision !== OPENGENI_API_CONTRACT_REVISION) {
66
82
  throw new OpenGeniApiContractMismatchError(
67
83
  OPENGENI_API_CONTRACT_REVISION,
68
84
  String(config.apiContractRevision || "(missing)"),
@@ -70,12 +86,14 @@ export function OpenGeniProvider({
70
86
  }
71
87
  } catch (error) {
72
88
  if (error instanceof OpenGeniApiContractMismatchError) {
89
+ // Embedded hosts: a revision difference is not a reason to block or reload the page.
90
+ if (!strictContract) return;
73
91
  setContractMismatch(error);
74
92
  reloadForContractMismatchOnce(error);
75
93
  }
76
94
  throw error;
77
95
  }
78
- }, [client]);
96
+ }, [client, strictContract]);
79
97
 
80
98
  const registerSessionReconciler = useMemo(
81
99
  () =>
@@ -175,7 +193,7 @@ export function OpenGeniProvider({
175
193
  }
176
194
  }
177
195
  } catch (error) {
178
- if (error instanceof OpenGeniApiContractMismatchError) {
196
+ if (strictContract && error instanceof OpenGeniApiContractMismatchError) {
179
197
  setContractMismatch(error);
180
198
  reloadForContractMismatchOnce(error);
181
199
  }
@@ -186,7 +204,14 @@ export function OpenGeniProvider({
186
204
  }
187
205
  })();
188
206
  return () => controller.abort();
189
- }, [client, pageLive, supportsWorkspaceLiveStream, verifyApiContract, workspaceId]);
207
+ }, [
208
+ client,
209
+ pageLive,
210
+ strictContract,
211
+ supportsWorkspaceLiveStream,
212
+ verifyApiContract,
213
+ workspaceId,
214
+ ]);
190
215
 
191
216
  useEffect(() => {
192
217
  if (supportsWorkspaceLiveStream) return;
@@ -222,7 +247,7 @@ export function OpenGeniProvider({
222
247
  callbackRef.current?.(event);
223
248
  }
224
249
  } catch (error) {
225
- if (error instanceof OpenGeniApiContractMismatchError) {
250
+ if (strictContract && error instanceof OpenGeniApiContractMismatchError) {
226
251
  setContractMismatch(error);
227
252
  reloadForContractMismatchOnce(error);
228
253
  }
@@ -230,7 +255,14 @@ export function OpenGeniProvider({
230
255
  }
231
256
  })();
232
257
  return () => controller.abort();
233
- }, [client, pageLive, supportsWorkspaceLiveStream, verifyApiContract, workspaceId]);
258
+ }, [
259
+ client,
260
+ pageLive,
261
+ strictContract,
262
+ supportsWorkspaceLiveStream,
263
+ verifyApiContract,
264
+ workspaceId,
265
+ ]);
234
266
 
235
267
  useEffect(() => {
236
268
  if (supportsWorkspaceLiveStream) return;
@@ -265,7 +297,7 @@ export function OpenGeniProvider({
265
297
  interactionCallbackRef.current?.(event);
266
298
  }
267
299
  } catch (error) {
268
- if (error instanceof OpenGeniApiContractMismatchError) {
300
+ if (strictContract && error instanceof OpenGeniApiContractMismatchError) {
269
301
  setContractMismatch(error);
270
302
  reloadForContractMismatchOnce(error);
271
303
  }
@@ -273,7 +305,14 @@ export function OpenGeniProvider({
273
305
  }
274
306
  })();
275
307
  return () => controller.abort();
276
- }, [client, pageLive, supportsWorkspaceLiveStream, verifyApiContract, workspaceId]);
308
+ }, [
309
+ client,
310
+ pageLive,
311
+ strictContract,
312
+ supportsWorkspaceLiveStream,
313
+ verifyApiContract,
314
+ workspaceId,
315
+ ]);
277
316
 
278
317
  const value = useMemo(
279
318
  () => ({
@@ -298,10 +337,12 @@ export function OpenGeniProvider({
298
337
  ],
299
338
  );
300
339
  return (
301
- <OpenGeniContext.Provider value={value}>
302
- {children}
303
- {contractMismatch ? <ApiContractMismatchScreen mismatch={contractMismatch} /> : null}
304
- </OpenGeniContext.Provider>
340
+ <ErrorMessageContext.Provider value={formatError}>
341
+ <OpenGeniContext.Provider value={value}>
342
+ {children}
343
+ {contractMismatch ? <ApiContractMismatchScreen mismatch={contractMismatch} /> : null}
344
+ </OpenGeniContext.Provider>
345
+ </ErrorMessageContext.Provider>
305
346
  );
306
347
  }
307
348
 
@@ -329,7 +370,7 @@ function ApiContractMismatchScreen({ mismatch }: { mismatch: OpenGeniApiContract
329
370
  data-opengeni-api-contract-mismatch
330
371
  >
331
372
  <div className="w-full max-w-md rounded-xl border border-og-border bg-og-surface p-6 shadow-2xl">
332
- <p className="text-og-menu font-semibold text-og-fg">OpenGeni updated</p>
373
+ <p className="text-og-menu font-semibold text-og-fg">Opengeni updated</p>
333
374
  <p className="mt-2 text-og-menu leading-6 text-og-muted">
334
375
  This tab cannot safely continue with the new server version. Reload it before sending or
335
376
  controlling work.
@@ -339,7 +380,7 @@ function ApiContractMismatchScreen({ mismatch }: { mismatch: OpenGeniApiContract
339
380
  </p>
340
381
  <button
341
382
  type="button"
342
- className="mt-5 inline-flex h-9 items-center rounded-md bg-og-fg px-3 text-og-menu font-medium text-og-bg"
383
+ className="mt-5 inline-flex h-9 items-center rounded-md border border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover px-3 text-og-menu font-medium"
343
384
  onClick={() => window.location.reload()}
344
385
  >
345
386
  Reload now