@opengeni/react 1.0.1 → 1.0.2-canary.37202341988001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (632) hide show
  1. package/README.md +660 -21
  2. package/dist/accounts.d.ts +64 -0
  3. package/dist/accounts.js +822 -0
  4. package/dist/accounts.js.map +1 -0
  5. package/dist/approvals.d.ts +2 -1
  6. package/dist/artifacts-document.js +3 -2
  7. package/dist/artifacts-presentation.js +3 -2
  8. package/dist/artifacts-spreadsheet.js +2 -2
  9. package/dist/artifacts.d.ts +4 -1
  10. package/dist/artifacts.js +518 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-SHYKQRNX.js +16 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
  16. package/dist/chat-interactive-block-UGBTNB3L.js.map +1 -0
  17. package/dist/chunk-26ZNDDLZ.js +453 -0
  18. package/dist/chunk-26ZNDDLZ.js.map +1 -0
  19. package/dist/chunk-3CTRFMAK.js +359 -0
  20. package/dist/chunk-3CTRFMAK.js.map +1 -0
  21. package/dist/chunk-447JLCBU.js +209 -0
  22. package/dist/chunk-447JLCBU.js.map +1 -0
  23. package/dist/chunk-4RVYOY4O.js +379 -0
  24. package/dist/chunk-4RVYOY4O.js.map +1 -0
  25. package/dist/chunk-5CVXZA3Y.js +292 -0
  26. package/dist/chunk-5CVXZA3Y.js.map +1 -0
  27. package/dist/chunk-5J4FOW6Q.js +108 -0
  28. package/dist/chunk-5J4FOW6Q.js.map +1 -0
  29. package/dist/chunk-742CZ3L3.js +481 -0
  30. package/dist/chunk-742CZ3L3.js.map +1 -0
  31. package/dist/chunk-A2PI6UMY.js +41 -0
  32. package/dist/chunk-A2PI6UMY.js.map +1 -0
  33. package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
  34. package/dist/chunk-A4UJB2MM.js.map +1 -0
  35. package/dist/chunk-B3V6TG77.js +41 -0
  36. package/dist/chunk-B3V6TG77.js.map +1 -0
  37. package/dist/chunk-BRM6FVZA.js +302 -0
  38. package/dist/chunk-BRM6FVZA.js.map +1 -0
  39. package/dist/chunk-C5X5AJXK.js +182 -0
  40. package/dist/chunk-C5X5AJXK.js.map +1 -0
  41. package/dist/{chunk-6KLX2RH5.js → chunk-DO544OSV.js} +1075 -79
  42. package/dist/chunk-DO544OSV.js.map +1 -0
  43. package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
  44. package/dist/chunk-DYWBUX5Q.js.map +1 -0
  45. package/dist/{chunk-HA46CYQK.js → chunk-EESD3PY3.js} +792 -537
  46. package/dist/chunk-EESD3PY3.js.map +1 -0
  47. package/dist/{chunk-5UQPNLIO.js → chunk-EN3YTHKR.js} +4117 -3896
  48. package/dist/chunk-EN3YTHKR.js.map +1 -0
  49. package/dist/chunk-ERGYJIBB.js +21 -0
  50. package/dist/chunk-ERGYJIBB.js.map +1 -0
  51. package/dist/chunk-FZCP527Y.js +116 -0
  52. package/dist/chunk-FZCP527Y.js.map +1 -0
  53. package/dist/chunk-GIMRELBW.js +14 -0
  54. package/dist/chunk-GIMRELBW.js.map +1 -0
  55. package/dist/chunk-GYVRFZDY.js +2733 -0
  56. package/dist/chunk-GYVRFZDY.js.map +1 -0
  57. package/dist/{chunk-LLOLUHVG.js → chunk-HDJWDK7W.js} +1358 -2746
  58. package/dist/chunk-HDJWDK7W.js.map +1 -0
  59. package/dist/chunk-I7IWRQLN.js +1608 -0
  60. package/dist/chunk-I7IWRQLN.js.map +1 -0
  61. package/dist/chunk-IT4BJUGF.js +13055 -0
  62. package/dist/chunk-IT4BJUGF.js.map +1 -0
  63. package/dist/chunk-IWIDV7SB.js +1 -0
  64. package/dist/chunk-IWIDV7SB.js.map +1 -0
  65. package/dist/chunk-J2QWVSQY.js +312 -0
  66. package/dist/chunk-J2QWVSQY.js.map +1 -0
  67. package/dist/chunk-J6DBS4T3.js +371 -0
  68. package/dist/chunk-J6DBS4T3.js.map +1 -0
  69. package/dist/{chunk-B6WPZSTT.js → chunk-JIQYUGVL.js} +1331 -1163
  70. package/dist/chunk-JIQYUGVL.js.map +1 -0
  71. package/dist/chunk-JT4JW7BC.js +54 -0
  72. package/dist/chunk-JT4JW7BC.js.map +1 -0
  73. package/dist/chunk-K3HQAKQX.js +24 -0
  74. package/dist/chunk-K3HQAKQX.js.map +1 -0
  75. package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
  76. package/dist/chunk-PNY3JKBJ.js.map +1 -0
  77. package/dist/chunk-RHREZ7BO.js +11 -0
  78. package/dist/chunk-RHREZ7BO.js.map +1 -0
  79. package/dist/chunk-RLUSC2WA.js +299 -0
  80. package/dist/chunk-RLUSC2WA.js.map +1 -0
  81. package/dist/{chunk-IGC6A2ZI.js → chunk-RSI7XYXL.js} +777 -246
  82. package/dist/chunk-RSI7XYXL.js.map +1 -0
  83. package/dist/chunk-SCOTPE2I.js +589 -0
  84. package/dist/chunk-SCOTPE2I.js.map +1 -0
  85. package/dist/{chunk-C5ZPSSS5.js → chunk-TKOTKRWY.js} +5 -4
  86. package/dist/{chunk-C5ZPSSS5.js.map → chunk-TKOTKRWY.js.map} +1 -1
  87. package/dist/chunk-TMYGL6X5.js +742 -0
  88. package/dist/chunk-TMYGL6X5.js.map +1 -0
  89. package/dist/chunk-UGLEYEMP.js +33 -0
  90. package/dist/chunk-UGLEYEMP.js.map +1 -0
  91. package/dist/chunk-UK4TINKT.js +27 -0
  92. package/dist/chunk-UK4TINKT.js.map +1 -0
  93. package/dist/chunk-UTRTG6LH.js +220 -0
  94. package/dist/chunk-UTRTG6LH.js.map +1 -0
  95. package/dist/chunk-WEHMPOXK.js +39 -0
  96. package/dist/chunk-WEHMPOXK.js.map +1 -0
  97. package/dist/chunk-WGXVEJO5.js +319 -0
  98. package/dist/chunk-WGXVEJO5.js.map +1 -0
  99. package/dist/chunk-WRHIZYZF.js +988 -0
  100. package/dist/chunk-WRHIZYZF.js.map +1 -0
  101. package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
  102. package/dist/chunk-WUISZ3WU.js.map +1 -0
  103. package/dist/chunk-XCHWDJ22.js +107 -0
  104. package/dist/chunk-XCHWDJ22.js.map +1 -0
  105. package/dist/{chunk-KCGXPP5V.js → chunk-Y2PRMYLC.js} +11 -6
  106. package/dist/chunk-Y2PRMYLC.js.map +1 -0
  107. package/dist/chunk-YBXQDQFX.js +1772 -0
  108. package/dist/chunk-YBXQDQFX.js.map +1 -0
  109. package/dist/chunk-YM2DE7BQ.js +3124 -0
  110. package/dist/chunk-YM2DE7BQ.js.map +1 -0
  111. package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
  112. package/dist/chunk-YQEAA6LT.js.map +1 -0
  113. package/dist/chunk-YV4L3ILF.js +9 -0
  114. package/dist/chunk-YV4L3ILF.js.map +1 -0
  115. package/dist/chunk-ZYRGEKWS.js +216 -0
  116. package/dist/chunk-ZYRGEKWS.js.map +1 -0
  117. package/dist/client.d.ts +7 -4
  118. package/dist/clipboard.js +1 -0
  119. package/dist/commands/types.d.ts +2 -0
  120. package/dist/components/anthropic-mark.d.ts +3 -0
  121. package/dist/components/approval-surface.d.ts +15 -0
  122. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  123. package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
  124. package/dist/components/artifacts/artifact-surface.d.ts +3 -1
  125. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  126. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  127. package/dist/components/artifacts/document-editor.d.ts +4 -2
  128. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  129. package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
  130. package/dist/components/artifacts/editable-document.d.ts +1 -1
  131. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  132. package/dist/components/artifacts/editable-spreadsheet.d.ts +2 -1
  133. package/dist/components/artifacts/index.d.ts +8 -1
  134. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  135. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  136. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  137. package/dist/components/artifacts/published-html-artifact-frame.d.ts +48 -3
  138. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  139. package/dist/components/artifacts/site-view.d.ts +23 -0
  140. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  141. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  142. package/dist/components/browser-select-control.d.ts +16 -0
  143. package/dist/components/browser-viewer.d.ts +10 -1
  144. package/dist/components/chat-composer.d.ts +21 -3
  145. package/dist/components/child-session-link.d.ts +5 -0
  146. package/dist/components/claude-mark.d.ts +3 -0
  147. package/dist/components/code-editor.d.ts +1 -4
  148. package/dist/components/composer.d.ts +45 -4
  149. package/dist/components/computer-viewer.d.ts +4 -1
  150. package/dist/components/copy-button.d.ts +3 -1
  151. package/dist/components/desktop-viewer.d.ts +1 -1
  152. package/dist/components/enrollment-consent.d.ts +6 -3
  153. package/dist/components/file-browser.d.ts +10 -1
  154. package/dist/components/fleet-tile.d.ts +2 -2
  155. package/dist/components/grok-mark.d.ts +26 -0
  156. package/dist/components/human-input-form.d.ts +21 -2
  157. package/dist/components/human-input-surface.d.ts +6 -3
  158. package/dist/components/machine-card.d.ts +4 -1
  159. package/dist/components/machines/machine-detail.d.ts +4 -1
  160. package/dist/components/machines/machine-operation-policy.d.ts +11 -0
  161. package/dist/components/machines-dashboard.d.ts +3 -1
  162. package/dist/components/markdown-table-layout.d.ts +12 -0
  163. package/dist/components/markdown.d.ts +47 -3
  164. package/dist/components/message-timeline.d.ts +72 -9
  165. package/dist/components/model-mark.d.ts +29 -0
  166. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  167. package/dist/components/model-policy-picker.d.ts +62 -13
  168. package/dist/components/open-geni-chat.d.ts +58 -0
  169. package/dist/components/open-geni-links.d.ts +68 -0
  170. package/dist/components/openrouter-mark.d.ts +6 -0
  171. package/dist/components/pierre-file.d.ts +1 -1
  172. package/dist/components/preview-loading.d.ts +2 -0
  173. package/dist/components/queue-item-content.d.ts +9 -0
  174. package/dist/components/sandbox-files.d.ts +13 -2
  175. package/dist/components/sandbox-workspace.d.ts +43 -3
  176. package/dist/components/session-capability-frame.d.ts +35 -0
  177. package/dist/components/session-chrome.d.ts +66 -8
  178. package/dist/components/session-commands-panel.d.ts +6 -0
  179. package/dist/components/session-commands.d.ts +6 -0
  180. package/dist/components/session-connection-request.d.ts +8 -0
  181. package/dist/components/session-conversation.d.ts +89 -0
  182. package/dist/components/session-list.d.ts +36 -0
  183. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  184. package/dist/components/session-proxy-scope.d.ts +21 -0
  185. package/dist/components/timeline-anchor.d.ts +24 -0
  186. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  187. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  188. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  189. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  190. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  191. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  192. package/dist/components/timeline-annotations.d.ts +13 -3
  193. package/dist/components/timeline-reading-progress.d.ts +11 -0
  194. package/dist/components/timeline-search.d.ts +34 -0
  195. package/dist/components/timeline-settlement.d.ts +16 -0
  196. package/dist/components/tip-follow.d.ts +16 -0
  197. package/dist/components/usage-limit-notice.d.ts +49 -0
  198. package/dist/components/usage-member-list.d.ts +91 -0
  199. package/dist/components/usage-meter.d.ts +73 -0
  200. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  201. package/dist/components/user-message-body.d.ts +10 -1
  202. package/dist/components/workspace-dock.d.ts +6 -2
  203. package/dist/composer.d.ts +5 -4
  204. package/dist/composer.js +15 -9
  205. package/dist/computer-viewer-6SRGWRUX.js +19 -0
  206. package/dist/computer-viewer-6SRGWRUX.js.map +1 -0
  207. package/dist/connect-account-identity.d.ts +8 -0
  208. package/dist/connect-accounts.d.ts +15 -0
  209. package/dist/connect-chooser.d.ts +18 -0
  210. package/dist/connect-panel.d.ts +18 -0
  211. package/dist/connect-setup.d.ts +16 -0
  212. package/dist/connect.d.ts +21 -0
  213. package/dist/connect.js +2129 -0
  214. package/dist/connect.js.map +1 -0
  215. package/dist/connection-catalog.d.ts +38 -0
  216. package/dist/connection-discovery.d.ts +12 -0
  217. package/dist/connection-installed.d.ts +17 -0
  218. package/dist/connection-logo.d.ts +9 -0
  219. package/dist/connection-service-logo.d.ts +8 -0
  220. package/dist/connection-service-presentation.d.ts +13 -0
  221. package/dist/connection-skeleton.d.ts +5 -0
  222. package/dist/connection-type-picker.d.ts +6 -0
  223. package/dist/conversation-timeline.d.ts +5 -0
  224. package/dist/desktop.d.ts +7 -0
  225. package/dist/desktop.js +26 -0
  226. package/dist/desktop.js.map +1 -0
  227. package/dist/device-authorization.d.ts +23 -0
  228. package/dist/diffs.d.ts +8 -0
  229. package/dist/diffs.js +14 -0
  230. package/dist/diffs.js.map +1 -0
  231. package/dist/discovery-cache.d.ts +5 -0
  232. package/dist/editor.d.ts +7 -0
  233. package/dist/editor.js +21 -0
  234. package/dist/editor.js.map +1 -0
  235. package/dist/embedded-session-client.d.ts +23 -0
  236. package/dist/file-node-visibility.d.ts +15 -0
  237. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
  238. package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
  239. package/dist/hooks/channel-cache.d.ts +23 -0
  240. package/dist/hooks/latest-question.d.ts +25 -0
  241. package/dist/hooks/shared-machines-list.d.ts +14 -0
  242. package/dist/hooks/use-attached-browsers.d.ts +2 -1
  243. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  244. package/dist/hooks/use-browser-session.d.ts +12 -1
  245. package/dist/hooks/use-channels.d.ts +1 -0
  246. package/dist/hooks/use-codex-accounts.d.ts +25 -7
  247. package/dist/hooks/use-composer.d.ts +45 -9
  248. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  249. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  250. package/dist/hooks/use-computer-session.d.ts +2 -0
  251. package/dist/hooks/use-connect.d.ts +22 -0
  252. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  253. package/dist/hooks/use-file-attachments.d.ts +21 -2
  254. package/dist/hooks/use-machine-chip.d.ts +3 -3
  255. package/dist/hooks/use-machines.d.ts +19 -1
  256. package/dist/hooks/use-sandbox-files.d.ts +5 -1
  257. package/dist/hooks/use-session-background-commands.d.ts +14 -0
  258. package/dist/hooks/use-session-events.d.ts +30 -8
  259. package/dist/hooks/use-session-lineage.d.ts +4 -0
  260. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  261. package/dist/hooks/use-session.d.ts +6 -0
  262. package/dist/hooks/use-turn-queue.d.ts +12 -0
  263. package/dist/hooks/use-usage.d.ts +40 -0
  264. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  265. package/dist/hooks/use-workspace-sessions.d.ts +27 -5
  266. package/dist/human-input.d.ts +3 -1
  267. package/dist/identity-link-accounts.d.ts +11 -0
  268. package/dist/identity-link-consent.d.ts +18 -0
  269. package/dist/index.d.ts +60 -17
  270. package/dist/index.js +2238 -6201
  271. package/dist/index.js.map +1 -1
  272. package/dist/interaction.d.ts +1 -1
  273. package/dist/interaction.js +35 -184
  274. package/dist/interaction.js.map +1 -1
  275. package/dist/latest-question-HTRIS4KJ.js +117 -0
  276. package/dist/latest-question-HTRIS4KJ.js.map +1 -0
  277. package/dist/lib/error-message.d.ts +7 -0
  278. package/dist/lib/format.d.ts +36 -2
  279. package/dist/lib/host-theme.d.ts +70 -0
  280. package/dist/lib/interaction-errors.d.ts +6 -0
  281. package/dist/lib/menu-styles.d.ts +22 -0
  282. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  283. package/dist/lib/workbench-peers.d.ts +36 -0
  284. package/dist/lib/xterm-theme.d.ts +7 -5
  285. package/dist/machines.d.ts +4 -2
  286. package/dist/machines.js +14 -4
  287. package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
  288. package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
  289. package/dist/mcp-connection-status.d.ts +14 -0
  290. package/dist/model-policy-picker-menu-M54ISBMN.js +14 -0
  291. package/dist/model-policy-picker-menu-M54ISBMN.js.map +1 -0
  292. package/dist/model-policy.d.ts +19 -3
  293. package/dist/model-policy.js +9 -1
  294. package/dist/older-history.d.ts +30 -0
  295. package/dist/platform-activity-row-627BFZ46.js +182 -0
  296. package/dist/platform-activity-row-627BFZ46.js.map +1 -0
  297. package/dist/plugin-details.d.ts +14 -0
  298. package/dist/plugin-discovery.d.ts +25 -0
  299. package/dist/provider.d.ts +13 -1
  300. package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
  301. package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
  302. package/dist/realtime/realtime-control.d.ts +6 -3
  303. package/dist/realtime.js +133 -74
  304. package/dist/realtime.js.map +1 -1
  305. package/dist/sandbox-files-GORZOUUJ.js +20 -0
  306. package/dist/sandbox-files-GORZOUUJ.js.map +1 -0
  307. package/dist/session-auth-recommendation.d.ts +5 -0
  308. package/dist/session-capability-policy.d.ts +12 -0
  309. package/dist/session-ui.d.ts +30 -2
  310. package/dist/session-ui.js +85 -7
  311. package/dist/session-ui.js.map +1 -1
  312. package/dist/session.d.ts +8 -2
  313. package/dist/session.js +30 -19
  314. package/dist/sites-ui.d.ts +34 -0
  315. package/dist/sites.d.ts +3 -0
  316. package/dist/sites.js +11 -0
  317. package/dist/sites.js.map +1 -0
  318. package/dist/skill-discovery.d.ts +47 -0
  319. package/dist/terminal.d.ts +8 -0
  320. package/dist/terminal.js +31 -0
  321. package/dist/terminal.js.map +1 -0
  322. package/dist/timeline/activity-rail.d.ts +11 -2
  323. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  324. package/dist/timeline/compaction-copy.d.ts +10 -0
  325. package/dist/timeline/entrance.d.ts +13 -1
  326. package/dist/timeline/genie-loading.d.ts +34 -0
  327. package/dist/timeline/index.d.ts +6 -2
  328. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  329. package/dist/timeline/platform-activity-row.d.ts +14 -0
  330. package/dist/timeline/presented-image.d.ts +6 -0
  331. package/dist/timeline/projection.d.ts +31 -2
  332. package/dist/timeline/registry.d.ts +2 -0
  333. package/dist/timeline/retained-image.d.ts +18 -0
  334. package/dist/timeline/rolling-activity.d.ts +11 -0
  335. package/dist/timeline/screenshot-lightbox.d.ts +16 -1
  336. package/dist/timeline/shared.d.ts +8 -3
  337. package/dist/timeline/startup-preference.d.ts +3 -0
  338. package/dist/timeline/startup-timings.d.ts +4 -0
  339. package/dist/timeline/tool-display-name.d.ts +2 -1
  340. package/dist/timeline/turn-summary.d.ts +34 -3
  341. package/dist/timeline/types.d.ts +147 -7
  342. package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
  343. package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
  344. package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
  345. package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
  346. package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
  347. package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
  348. package/dist/types/machines.d.ts +2 -2
  349. package/dist/usage/allowance-copy.d.ts +25 -0
  350. package/dist/usage/summary.d.ts +35 -0
  351. package/dist/usage.d.ts +13 -0
  352. package/dist/usage.js +1074 -0
  353. package/dist/usage.js.map +1 -0
  354. package/package.json +44 -4
  355. package/src/accounts.tsx +1072 -0
  356. package/src/approvals.ts +8 -1
  357. package/src/artifacts.ts +42 -0
  358. package/src/assets/README.md +8 -0
  359. package/src/assets/gmail.ico +0 -0
  360. package/src/assets/outlook.ico +0 -0
  361. package/src/capability-catalog-row.tsx +94 -0
  362. package/src/capability-logo-fallback.ts +22 -0
  363. package/src/client.ts +22 -13
  364. package/src/commands/registry.ts +18 -15
  365. package/src/commands/types.ts +2 -0
  366. package/src/components/anthropic-mark.tsx +10 -0
  367. package/src/components/approval-surface.tsx +171 -37
  368. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  369. package/src/components/artifacts/artifact-sandbox.tsx +185 -0
  370. package/src/components/artifacts/artifact-surface.tsx +39 -19
  371. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  372. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  373. package/src/components/artifacts/document-editor.tsx +141 -16
  374. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  375. package/src/components/artifacts/editable-artifact-view.tsx +187 -0
  376. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  377. package/src/components/artifacts/editable-document.tsx +37 -36
  378. package/src/components/artifacts/editable-presentation.tsx +36 -18
  379. package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
  380. package/src/components/artifacts/index.ts +44 -0
  381. package/src/components/artifacts/inline-html-document.ts +24 -0
  382. package/src/components/artifacts/latest-task-runner.ts +49 -0
  383. package/src/components/artifacts/presentation-editor.tsx +323 -67
  384. package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
  385. package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
  386. package/src/components/artifacts/site-view.tsx +116 -0
  387. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  388. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  389. package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
  390. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  391. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  392. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  393. package/src/components/browser-select-control.tsx +312 -0
  394. package/src/components/browser-viewer.tsx +1054 -314
  395. package/src/components/chat-composer.tsx +131 -85
  396. package/src/components/child-session-link.tsx +27 -0
  397. package/src/components/claude-mark.tsx +10 -0
  398. package/src/components/code-editor.tsx +13 -16
  399. package/src/components/composer-transcription-control.tsx +7 -5
  400. package/src/components/composer.tsx +376 -49
  401. package/src/components/computer-viewer.tsx +1041 -329
  402. package/src/components/copy-button.tsx +13 -5
  403. package/src/components/desktop-viewer.tsx +1 -1
  404. package/src/components/enrollment-consent.tsx +65 -7
  405. package/src/components/enrollment-device-flow.tsx +1 -1
  406. package/src/components/file-browser.tsx +158 -34
  407. package/src/components/fleet-tile.tsx +8 -16
  408. package/src/components/generated-video-player.tsx +4 -2
  409. package/src/components/grok-mark.tsx +33 -0
  410. package/src/components/human-input-form.tsx +455 -114
  411. package/src/components/human-input-surface.tsx +18 -7
  412. package/src/components/interaction-intervention-banner.tsx +2 -2
  413. package/src/components/machine-card.tsx +119 -4
  414. package/src/components/machine-dock-bar.tsx +1 -1
  415. package/src/components/machine-input-display.ts +23 -2
  416. package/src/components/machines/machine-detail.tsx +52 -2
  417. package/src/components/machines/machine-operation-policy.tsx +179 -0
  418. package/src/components/machines-dashboard.tsx +8 -17
  419. package/src/components/markdown-table-layout.ts +132 -0
  420. package/src/components/markdown.tsx +473 -44
  421. package/src/components/message-timeline.tsx +2754 -665
  422. package/src/components/model-mark.tsx +90 -0
  423. package/src/components/model-picker.tsx +15 -4
  424. package/src/components/model-policy-picker-menu.tsx +424 -0
  425. package/src/components/model-policy-picker.tsx +337 -381
  426. package/src/components/open-geni-chat.tsx +338 -0
  427. package/src/components/open-geni-links.tsx +179 -0
  428. package/src/components/openrouter-mark.tsx +13 -0
  429. package/src/components/pierre-diff.tsx +41 -16
  430. package/src/components/pierre-file.tsx +36 -11
  431. package/src/components/preview-loading.tsx +154 -0
  432. package/src/components/queue-item-content.ts +14 -0
  433. package/src/components/queue-surface-implementation.tsx +132 -42
  434. package/src/components/queue-surface-state.tsx +3 -1
  435. package/src/components/sandbox-files.tsx +267 -35
  436. package/src/components/sandbox-terminal.tsx +48 -11
  437. package/src/components/sandbox-workspace.tsx +337 -135
  438. package/src/components/session-capability-frame.tsx +192 -0
  439. package/src/components/session-chrome.tsx +1027 -328
  440. package/src/components/session-commands-panel.tsx +126 -0
  441. package/src/components/session-commands.tsx +18 -0
  442. package/src/components/session-connection-request.tsx +97 -0
  443. package/src/components/session-conversation.tsx +526 -0
  444. package/src/components/session-list.tsx +250 -0
  445. package/src/components/session-mcp-capability-card.tsx +680 -0
  446. package/src/components/session-proxy-scope.tsx +92 -0
  447. package/src/components/session-status.tsx +1 -1
  448. package/src/components/timeline-anchor.tsx +119 -0
  449. package/src/components/timeline-annotation-chrome.tsx +196 -0
  450. package/src/components/timeline-annotation-layout.ts +268 -0
  451. package/src/components/timeline-annotation-markers.tsx +185 -0
  452. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  453. package/src/components/timeline-annotation-selection.tsx +106 -54
  454. package/src/components/timeline-annotation-shared.ts +245 -0
  455. package/src/components/timeline-annotations-dialog.tsx +185 -128
  456. package/src/components/timeline-annotations.tsx +189 -45
  457. package/src/components/timeline-reading-progress.ts +80 -0
  458. package/src/components/timeline-search.tsx +168 -0
  459. package/src/components/timeline-settlement.ts +60 -0
  460. package/src/components/tip-follow.ts +70 -7
  461. package/src/components/tooltip.tsx +38 -5
  462. package/src/components/usage-limit-notice.tsx +179 -0
  463. package/src/components/usage-member-list.tsx +792 -0
  464. package/src/components/usage-meter.tsx +382 -0
  465. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  466. package/src/components/user-message-body.tsx +194 -49
  467. package/src/components/workspace-dock.tsx +141 -175
  468. package/src/composer.ts +6 -1
  469. package/src/connect-account-identity.tsx +34 -0
  470. package/src/connect-accounts.tsx +233 -0
  471. package/src/connect-chooser.tsx +336 -0
  472. package/src/connect-panel.tsx +99 -0
  473. package/src/connect-setup.tsx +307 -0
  474. package/src/connect.ts +60 -0
  475. package/src/connection-assets.d.ts +4 -0
  476. package/src/connection-catalog.tsx +162 -0
  477. package/src/connection-discovery.tsx +235 -0
  478. package/src/connection-installed.tsx +51 -0
  479. package/src/connection-logo.tsx +37 -0
  480. package/src/connection-service-logo.tsx +55 -0
  481. package/src/connection-service-presentation.ts +46 -0
  482. package/src/connection-skeleton.tsx +16 -0
  483. package/src/connection-type-picker.tsx +36 -0
  484. package/src/conversation-timeline.ts +92 -0
  485. package/src/desktop.ts +24 -0
  486. package/src/device-authorization.tsx +98 -0
  487. package/src/diffs.ts +16 -0
  488. package/src/discovery-cache.ts +42 -0
  489. package/src/editor.ts +13 -0
  490. package/src/embedded-session-client.ts +104 -0
  491. package/src/file-node-visibility.ts +66 -0
  492. package/src/hooks/channel-cache.ts +104 -0
  493. package/src/hooks/internal.ts +3 -2
  494. package/src/hooks/latest-question.ts +164 -0
  495. package/src/hooks/shared-machines-list.ts +239 -0
  496. package/src/hooks/use-attached-browsers.ts +5 -1
  497. package/src/hooks/use-available-models.ts +20 -14
  498. package/src/hooks/use-browser-frame-stream.ts +25 -3
  499. package/src/hooks/use-browser-session.ts +271 -71
  500. package/src/hooks/use-browser-sessions.ts +7 -1
  501. package/src/hooks/use-channels.ts +32 -10
  502. package/src/hooks/use-codex-accounts.ts +78 -21
  503. package/src/hooks/use-composer.ts +1034 -320
  504. package/src/hooks/use-computer-frame-stream.ts +39 -16
  505. package/src/hooks/use-computer-input-posture.ts +94 -0
  506. package/src/hooks/use-computer-session.ts +110 -32
  507. package/src/hooks/use-computer-sessions.ts +8 -1
  508. package/src/hooks/use-connect.ts +23 -0
  509. package/src/hooks/use-desktop-stream.ts +19 -28
  510. package/src/hooks/use-file-attachments.ts +118 -10
  511. package/src/hooks/use-goal.ts +36 -9
  512. package/src/hooks/use-human-input.ts +31 -4
  513. package/src/hooks/use-last-started-turn-policy.ts +15 -13
  514. package/src/hooks/use-machine-chip.ts +23 -6
  515. package/src/hooks/use-machines.ts +104 -6
  516. package/src/hooks/use-sandbox-files.ts +253 -150
  517. package/src/hooks/use-sandbox-git.ts +58 -29
  518. package/src/hooks/use-session-background-commands.ts +67 -0
  519. package/src/hooks/use-session-capabilities.ts +21 -2
  520. package/src/hooks/use-session-events.ts +759 -433
  521. package/src/hooks/use-session-lineage.ts +28 -6
  522. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  523. package/src/hooks/use-session.ts +75 -16
  524. package/src/hooks/use-slash-commands.ts +6 -11
  525. package/src/hooks/use-turn-queue.ts +113 -13
  526. package/src/hooks/use-usage.ts +100 -0
  527. package/src/hooks/use-video-artifact-playback.ts +1 -1
  528. package/src/hooks/use-voice-input.ts +12 -1
  529. package/src/hooks/use-workspace-capture.ts +3 -2
  530. package/src/hooks/use-workspace-edit.ts +23 -5
  531. package/src/hooks/use-workspace-sessions.ts +99 -11
  532. package/src/human-input.ts +12 -1
  533. package/src/identity-link-accounts.tsx +148 -0
  534. package/src/identity-link-consent.tsx +192 -0
  535. package/src/index.ts +157 -12
  536. package/src/interaction.ts +1 -0
  537. package/src/lib/error-message.ts +37 -0
  538. package/src/lib/format.ts +150 -14
  539. package/src/lib/host-theme.ts +511 -0
  540. package/src/lib/interaction-errors.ts +33 -0
  541. package/src/lib/menu-styles.ts +44 -0
  542. package/src/lib/pierre-diffs-loader.ts +53 -0
  543. package/src/lib/workbench-peers.ts +62 -0
  544. package/src/lib/xterm-theme.ts +23 -21
  545. package/src/machines.ts +9 -1
  546. package/src/mcp-connection-status.ts +35 -0
  547. package/src/model-policy.ts +223 -69
  548. package/src/older-history.ts +87 -0
  549. package/src/plugin-details.tsx +185 -0
  550. package/src/plugin-discovery.tsx +196 -0
  551. package/src/provider.tsx +55 -14
  552. package/src/realtime/dropdown-menu.tsx +19 -12
  553. package/src/realtime/realtime-control.tsx +133 -46
  554. package/src/session-auth-recommendation.ts +48 -0
  555. package/src/session-capability-policy.ts +83 -0
  556. package/src/session-context.ts +4 -3
  557. package/src/session-ui.ts +66 -2
  558. package/src/session.ts +18 -1
  559. package/src/sites-ui.tsx +402 -0
  560. package/src/sites.ts +3 -0
  561. package/src/skill-discovery.tsx +208 -0
  562. package/src/terminal.ts +26 -0
  563. package/src/timeline/activity-rail.tsx +171 -80
  564. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  565. package/src/timeline/compaction-copy.ts +42 -0
  566. package/src/timeline/entrance.tsx +28 -3
  567. package/src/timeline/fleet-decision-projection.ts +2 -1
  568. package/src/timeline/fleet-decision-row.tsx +1 -0
  569. package/src/timeline/genie-loading.tsx +136 -0
  570. package/src/timeline/index.ts +11 -0
  571. package/src/timeline/knowledge-receipt.tsx +100 -0
  572. package/src/timeline/parsers.ts +2 -2
  573. package/src/timeline/platform-activity-row.tsx +216 -0
  574. package/src/timeline/presented-image.ts +49 -0
  575. package/src/timeline/projection.ts +1609 -84
  576. package/src/timeline/registry.ts +15 -3
  577. package/src/timeline/retained-image.ts +97 -0
  578. package/src/timeline/rolling-activity.tsx +92 -0
  579. package/src/timeline/screenshot-lightbox.tsx +115 -17
  580. package/src/timeline/shared.tsx +47 -15
  581. package/src/timeline/startup-preference.ts +33 -0
  582. package/src/timeline/startup-timings.tsx +145 -0
  583. package/src/timeline/tool-display-name.ts +8 -6
  584. package/src/timeline/tool-renderers.tsx +497 -128
  585. package/src/timeline/turn-summary.tsx +218 -44
  586. package/src/timeline/types.ts +192 -7
  587. package/src/types/machines.ts +10 -0
  588. package/src/usage/allowance-copy.ts +64 -0
  589. package/src/usage/summary.ts +93 -0
  590. package/src/usage.ts +50 -0
  591. package/styles/compiled.css +2098 -757
  592. package/styles/connect.css +284 -0
  593. package/styles/connect.d.ts +1 -0
  594. package/styles/effective-tokens.css +1 -0
  595. package/styles/index.css +201 -9
  596. package/styles/responsive.css +27 -1
  597. package/styles/session-capability.css +44 -0
  598. package/styles/tokens.css +135 -65
  599. package/dist/chunk-5UQPNLIO.js.map +0 -1
  600. package/dist/chunk-6KLX2RH5.js.map +0 -1
  601. package/dist/chunk-7WCLAEFV.js.map +0 -1
  602. package/dist/chunk-B6WPZSTT.js.map +0 -1
  603. package/dist/chunk-FK6VG4LL.js +0 -90
  604. package/dist/chunk-FK6VG4LL.js.map +0 -1
  605. package/dist/chunk-HA46CYQK.js.map +0 -1
  606. package/dist/chunk-HUIKIDM5.js.map +0 -1
  607. package/dist/chunk-IGC6A2ZI.js.map +0 -1
  608. package/dist/chunk-KCGXPP5V.js.map +0 -1
  609. package/dist/chunk-KZ73RL76.js.map +0 -1
  610. package/dist/chunk-LAKLF4PA.js +0 -141
  611. package/dist/chunk-LAKLF4PA.js.map +0 -1
  612. package/dist/chunk-LLOLUHVG.js.map +0 -1
  613. package/dist/chunk-MKPIAGVL.js +0 -465
  614. package/dist/chunk-MKPIAGVL.js.map +0 -1
  615. package/dist/chunk-PEI6RANI.js.map +0 -1
  616. package/dist/chunk-R3AZOAB5.js.map +0 -1
  617. package/dist/chunk-WSK7G5LE.js +0 -170
  618. package/dist/chunk-WSK7G5LE.js.map +0 -1
  619. package/dist/chunk-XBZWOM2K.js +0 -218
  620. package/dist/chunk-XBZWOM2K.js.map +0 -1
  621. package/dist/chunk-Y7OEDUJ5.js +0 -8810
  622. package/dist/chunk-Y7OEDUJ5.js.map +0 -1
  623. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  624. package/dist/hooks/use-packs.d.ts +0 -32
  625. package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
  626. package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
  627. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  628. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  629. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  630. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  631. package/src/hooks/use-packs.ts +0 -157
  632. /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-SHYKQRNX.js.map} +0 -0
@@ -0,0 +1,338 @@
1
+ import type { OpenGeniClient } from "@opengeni/sdk";
2
+ import { ArrowUpIcon, LoaderCircleIcon, MenuIcon, XIcon } from "lucide-react";
3
+ import { useCallback, useRef, useState, type CSSProperties, type FormEvent } from "react";
4
+ import { cn } from "../lib/cn";
5
+ import { useErrorMessage } from "../lib/error-message";
6
+ import {
7
+ useHostTheme,
8
+ type HostSurfacePreference,
9
+ type HostThemePreference,
10
+ } from "../lib/host-theme";
11
+ import { useOpenGeni, type ClientOverride } from "../session-context";
12
+ import { SessionConversation, type SessionConversationProps } from "./session-conversation";
13
+ import { SessionList, type SessionListLabels, type SessionListProps } from "./session-list";
14
+ import { SessionProxyScope, type SessionProxyBaseUrl } from "./session-proxy-scope";
15
+
16
+ export type OpenGeniChatLabels = SessionListLabels & {
17
+ openChats: string;
18
+ closeChats: string;
19
+ newChatPlaceholder: string;
20
+ /** Heading above the new-chat composer; empty hides it. */
21
+ newChatTitle: string;
22
+ send: string;
23
+ newChatUnavailable: string;
24
+ };
25
+
26
+ const DEFAULT_LABELS: Omit<OpenGeniChatLabels, keyof SessionListLabels> = {
27
+ openChats: "Open chats",
28
+ closeChats: "Close chats",
29
+ newChatPlaceholder: "Ask anything…",
30
+ newChatTitle: "How can I help?",
31
+ send: "Send",
32
+ newChatUnavailable: "New chats are not enabled for this product.",
33
+ };
34
+
35
+ export type OpenGeniChatProps = ClientOverride &
36
+ SessionProxyBaseUrl & {
37
+ /** Controlled selection. `null` shows the new-chat composer. */
38
+ sessionId?: string | null | undefined;
39
+ /** Initial selection when uncontrolled. Defaults to a new chat. */
40
+ defaultSessionId?: string | null | undefined;
41
+ onSessionChange?: ((sessionId: string | null) => void) | undefined;
42
+ /**
43
+ * Create a chat from its first message. Defaults to `client.createSession`
44
+ * with `{ initialMessage, idempotencyKey }`, which `createSessionProxyHandler`
45
+ * accepts when the server supplies a `createSession` hook. Return the new id.
46
+ */
47
+ createSession?:
48
+ | ((initialMessage: string, idempotencyKey: string) => Promise<string>)
49
+ | undefined;
50
+ /** Hide the "New chat" entry point. */
51
+ newChat?: boolean | undefined;
52
+ /** Forwarded to the conversation (message rendering, tool renderers, composer...). */
53
+ conversationProps?: Omit<
54
+ SessionConversationProps,
55
+ "sessionId" | "client" | "workspaceId" | "baseUrl"
56
+ >;
57
+ /** Forwarded to the list (rename/archive toggles, page size). */
58
+ listProps?: Pick<SessionListProps, "rename" | "archive" | "pageSize"> | undefined;
59
+ labels?: Partial<OpenGeniChatLabels> | undefined;
60
+ className?: string | undefined;
61
+ /** Defaults to filling the host. */
62
+ height?: CSSProperties["height"];
63
+ /**
64
+ * Light or dark. Defaults to `auto`: follow the host page (an enclosing
65
+ * `data-og-theme`, `class="dark"`/`data-theme` on <html> or <body>, the
66
+ * host's `color-scheme`, then its background), not the OS setting alone.
67
+ */
68
+ theme?: HostThemePreference | undefined;
69
+ /**
70
+ * `host` (default) derives backgrounds and cards from the host background so
71
+ * the chat blends in; `theme` uses the `--og-color-*` surface tokens as they
72
+ * are. Customized surface tokens are always kept.
73
+ */
74
+ surface?: HostSurfacePreference | undefined;
75
+ };
76
+
77
+ type CreateClient = Partial<Pick<OpenGeniClient, "createSession">>;
78
+
79
+ /**
80
+ * A complete chat experience: the user's chat list plus the conversation.
81
+ * The list is a sidebar when the component is wide and a drawer when narrow
82
+ * (container-based, so it adapts inside panels as well as full pages).
83
+ * `<OpenGeniChat baseUrl="/api/opengeni" />` needs no provider: it talks to
84
+ * your session proxy and uses the workspace the proxy resolves.
85
+ */
86
+ export function OpenGeniChat({ baseUrl, ...props }: OpenGeniChatProps) {
87
+ if (baseUrl === undefined) return <Chat {...props} />;
88
+ const { client: _client, workspaceId, ...rest } = props;
89
+ return (
90
+ <SessionProxyScope baseUrl={baseUrl} workspaceId={workspaceId}>
91
+ <Chat {...rest} />
92
+ </SessionProxyScope>
93
+ );
94
+ }
95
+
96
+ function Chat({
97
+ client,
98
+ workspaceId,
99
+ sessionId: controlledSessionId,
100
+ defaultSessionId = null,
101
+ onSessionChange,
102
+ createSession,
103
+ newChat = true,
104
+ conversationProps,
105
+ listProps,
106
+ labels: labelOverrides,
107
+ className,
108
+ height = "100%",
109
+ theme,
110
+ surface,
111
+ }: Omit<OpenGeniChatProps, "baseUrl">) {
112
+ const labels = { ...DEFAULT_LABELS, ...labelOverrides } as OpenGeniChatLabels;
113
+ const scope = { client, workspaceId };
114
+ const context = useOpenGeni(scope);
115
+ const [uncontrolled, setUncontrolled] = useState<string | null>(defaultSessionId);
116
+ const selected = controlledSessionId !== undefined ? controlledSessionId : uncontrolled;
117
+ const [drawerOpen, setDrawerOpen] = useState(false);
118
+ const [listRevision, setListRevision] = useState(0);
119
+ const root = useRef<HTMLDivElement>(null);
120
+ const hostTheme = useHostTheme(root, { theme, surface });
121
+
122
+ const select = useCallback(
123
+ (next: string | null) => {
124
+ if (controlledSessionId === undefined) setUncontrolled(next);
125
+ onSessionChange?.(next);
126
+ setDrawerOpen(false);
127
+ },
128
+ [controlledSessionId, onSessionChange],
129
+ );
130
+
131
+ const create = useCallback(
132
+ async (initialMessage: string, idempotencyKey: string): Promise<string> => {
133
+ if (createSession) return await createSession(initialMessage, idempotencyKey);
134
+ const creator = (context.client as unknown as CreateClient).createSession;
135
+ if (typeof creator !== "function") throw new Error(labels.newChatUnavailable);
136
+ const created = await creator.call(context.client, context.workspaceId, {
137
+ initialMessage,
138
+ idempotencyKey,
139
+ } as Parameters<NonNullable<CreateClient["createSession"]>>[1]);
140
+ return created.id;
141
+ },
142
+ [context.client, context.workspaceId, createSession, labels.newChatUnavailable],
143
+ );
144
+
145
+ const list = (
146
+ <SessionList
147
+ {...scope}
148
+ {...listProps}
149
+ labels={labels}
150
+ selectedSessionId={selected}
151
+ onSelect={select}
152
+ onNewChat={newChat ? () => select(null) : undefined}
153
+ onArchived={(archivedId) => {
154
+ if (archivedId === selected) select(null);
155
+ }}
156
+ refreshKey={listRevision}
157
+ className="h-full"
158
+ />
159
+ );
160
+
161
+ return (
162
+ <div
163
+ ref={root}
164
+ className={cn(
165
+ "og-root og-chat relative flex min-h-0 min-w-0 bg-og-bg text-og-base text-og-fg",
166
+ className,
167
+ )}
168
+ style={{ ...hostTheme.style, height }}
169
+ data-og-theme={hostTheme.attribute}
170
+ data-og-host-theme=""
171
+ data-og-chat=""
172
+ >
173
+ <aside
174
+ className="og-chat-sidebar min-h-0 w-64 shrink-0 flex-col border-r border-og-border"
175
+ data-og-chat-sidebar=""
176
+ >
177
+ {list}
178
+ </aside>
179
+ {drawerOpen ? (
180
+ <div className="og-chat-drawer absolute inset-0 z-30 flex" data-og-chat-drawer="">
181
+ <div className="flex h-full w-[min(20rem,85%)] flex-col border-r border-og-border bg-og-bg shadow-og-lg">
182
+ <div className="flex justify-end p-1">
183
+ <button
184
+ type="button"
185
+ aria-label={labels.closeChats}
186
+ onClick={() => setDrawerOpen(false)}
187
+ className="rounded p-1.5 text-og-fg-muted hover:bg-og-surface-2"
188
+ >
189
+ <XIcon className="size-4" aria-hidden />
190
+ </button>
191
+ </div>
192
+ <div className="min-h-0 flex-1">{list}</div>
193
+ </div>
194
+ <button
195
+ type="button"
196
+ aria-label={labels.closeChats}
197
+ className="flex-1 bg-black/25"
198
+ onClick={() => setDrawerOpen(false)}
199
+ />
200
+ </div>
201
+ ) : null}
202
+ <main className="flex min-h-0 min-w-0 flex-1 flex-col">
203
+ <div className="og-chat-menu flex items-center gap-2 px-2 py-1">
204
+ <button
205
+ type="button"
206
+ aria-label={labels.openChats}
207
+ aria-expanded={drawerOpen}
208
+ onClick={() => setDrawerOpen(true)}
209
+ className="rounded p-1.5 text-og-fg-muted hover:bg-og-surface-2"
210
+ data-og-chat-menu=""
211
+ >
212
+ <MenuIcon className="size-4" aria-hidden />
213
+ </button>
214
+ <span className="text-og-sm font-semibold text-og-fg-muted">{labels.heading}</span>
215
+ </div>
216
+ <div className="og-chat-main min-h-0 flex-1 px-3 pb-3 pt-1">
217
+ {selected ? (
218
+ <SessionConversation
219
+ {...conversationProps}
220
+ {...scope}
221
+ sessionId={selected}
222
+ height="100%"
223
+ />
224
+ ) : (
225
+ <NewChat
226
+ labels={labels}
227
+ create={create}
228
+ onCreated={(id) => {
229
+ setListRevision((revision) => revision + 1);
230
+ select(id);
231
+ }}
232
+ />
233
+ )}
234
+ </div>
235
+ </main>
236
+ </div>
237
+ );
238
+ }
239
+
240
+ function NewChat({
241
+ labels,
242
+ create,
243
+ onCreated,
244
+ }: {
245
+ labels: OpenGeniChatLabels;
246
+ create: (initialMessage: string, idempotencyKey: string) => Promise<string>;
247
+ onCreated: (sessionId: string) => void;
248
+ }) {
249
+ const [text, setText] = useState("");
250
+ const [sending, setSending] = useState(false);
251
+ const [error, setError] = useState<{ cause: unknown } | null>(null);
252
+ const formatError = useErrorMessage();
253
+ // One key per draft, so a retried send returns the same chat.
254
+ const idempotencyKey = useRef(crypto.randomUUID());
255
+
256
+ const submit = async (event: FormEvent) => {
257
+ event.preventDefault();
258
+ const initialMessage = text.trim();
259
+ if (!initialMessage || sending) return;
260
+ setSending(true);
261
+ setError(null);
262
+ try {
263
+ const id = await create(initialMessage, idempotencyKey.current);
264
+ idempotencyKey.current = crypto.randomUUID();
265
+ setText("");
266
+ onCreated(id);
267
+ } catch (cause) {
268
+ setError({ cause });
269
+ } finally {
270
+ setSending(false);
271
+ }
272
+ };
273
+
274
+ return (
275
+ <form
276
+ onSubmit={(event) => void submit(event)}
277
+ className="mx-auto box-border flex h-full w-full max-w-3xl flex-col gap-4 p-3"
278
+ data-og-new-chat-composer=""
279
+ >
280
+ {/* Sits a little above center, relative to the panel rather than the page. */}
281
+ <div aria-hidden className="min-h-0 flex-[2]" />
282
+ {labels.newChatTitle ? (
283
+ <p className="text-center text-og-md font-medium text-og-fg">{labels.newChatTitle}</p>
284
+ ) : null}
285
+ <div
286
+ className={cn(
287
+ "flex items-end gap-2 rounded-og-lg border border-og-border/90 bg-og-surface-1 p-2 pl-3.5 shadow-og-sm",
288
+ "transition-[border-color,box-shadow] duration-200 ease-og-out",
289
+ "focus-within:border-og-accent/50 focus-within:shadow-og-glow",
290
+ )}
291
+ >
292
+ <textarea
293
+ value={text}
294
+ onChange={(event) => setText(event.target.value)}
295
+ onKeyDown={(event) => {
296
+ if (event.key === "Enter" && !event.shiftKey && !event.nativeEvent.isComposing) {
297
+ event.preventDefault();
298
+ event.currentTarget.form?.requestSubmit();
299
+ }
300
+ }}
301
+ placeholder={labels.newChatPlaceholder}
302
+ aria-label={labels.newChatPlaceholder}
303
+ rows={2}
304
+ disabled={sending}
305
+ className="min-h-12 flex-1 resize-none bg-transparent py-1 text-og-composer text-og-fg outline-hidden placeholder:text-og-fg-subtle md:text-og-composer-wide"
306
+ />
307
+ <button
308
+ type="submit"
309
+ aria-label={labels.send}
310
+ disabled={sending || !text.trim()}
311
+ className={cn(
312
+ "inline-flex size-8 shrink-0 items-center justify-center rounded-og-md pointer-coarse:size-11",
313
+ "border border-og-primary-border bg-og-primary text-og-primary-fg",
314
+ "transition-[background-color,transform,opacity] duration-150 ease-og-spring",
315
+ "hover:bg-og-primary-hover active:scale-95 disabled:cursor-not-allowed disabled:opacity-50",
316
+ )}
317
+ >
318
+ {sending ? (
319
+ <LoaderCircleIcon className="size-4 animate-og-spin" aria-hidden />
320
+ ) : (
321
+ <ArrowUpIcon className="size-4" aria-hidden />
322
+ )}
323
+ </button>
324
+ </div>
325
+ {error ? (
326
+ <p role="alert" className="text-center text-og-sm text-og-status-failed">
327
+ {formatError(
328
+ error.cause,
329
+ error.cause instanceof Error && error.cause.message === labels.newChatUnavailable
330
+ ? labels.newChatUnavailable
331
+ : undefined,
332
+ )}
333
+ </p>
334
+ ) : null}
335
+ <div aria-hidden className="min-h-0 flex-[3]" />
336
+ </form>
337
+ );
338
+ }
@@ -0,0 +1,179 @@
1
+ import type { OpenGeniClient, OpenGeniLinkTarget } from "@opengeni/sdk";
2
+ import { createContext, useContext, useMemo, type ReactNode } from "react";
3
+
4
+ export type { OpenGeniLinkTarget };
5
+
6
+ /**
7
+ * How the host opens one OpenGeni object an agent linked in chat Markdown.
8
+ *
9
+ * - `{ href }` renders a real link (new tab) — use it for a host page URL.
10
+ * - `{ open }` renders a button that runs the action (download, open a panel,
11
+ * client-side navigation) with loading and retry states.
12
+ * - `null` / `undefined` means "not handled here": the next resolver is asked,
13
+ * and when none handles it the text renders as an unavailable reference —
14
+ * never as a navigation that would 404 inside the host.
15
+ */
16
+ export type OpenGeniLinkResolution =
17
+ | { href: string; open?: undefined }
18
+ | { open: () => void | Promise<void>; href?: undefined };
19
+
20
+ export type OpenGeniLinkResolver = (
21
+ target: OpenGeniLinkTarget,
22
+ ) => OpenGeniLinkResolution | null | undefined;
23
+
24
+ const OpenGeniLinkContext = createContext<OpenGeniLinkResolver | null>(null);
25
+
26
+ /** First resolver that handles a target wins. */
27
+ export function chainLinkResolvers(
28
+ ...resolvers: ReadonlyArray<OpenGeniLinkResolver | null | undefined>
29
+ ): OpenGeniLinkResolver | null {
30
+ const active = resolvers.filter((resolver): resolver is OpenGeniLinkResolver =>
31
+ Boolean(resolver),
32
+ );
33
+ if (active.length === 0) return null;
34
+ if (active.length === 1) return active[0]!;
35
+ return (target) => {
36
+ for (const resolver of active) {
37
+ const resolution = resolver(target);
38
+ if (resolution) return resolution;
39
+ }
40
+ return null;
41
+ };
42
+ }
43
+
44
+ /**
45
+ * Resolve OpenGeni object links (`artifact:`, `sandbox:`, editable artifacts,
46
+ * Sites) for every {@link Markdown} body below. An inner provider is asked
47
+ * before an outer one, so a host can override a single kind and keep defaults.
48
+ */
49
+ export function OpenGeniLinkProvider({
50
+ resolveLink,
51
+ children,
52
+ }: {
53
+ resolveLink: OpenGeniLinkResolver | null | undefined;
54
+ children: ReactNode;
55
+ }) {
56
+ const parent = useContext(OpenGeniLinkContext);
57
+ const value = useMemo(() => chainLinkResolvers(resolveLink, parent), [resolveLink, parent]);
58
+ return <OpenGeniLinkContext.Provider value={value}>{children}</OpenGeniLinkContext.Provider>;
59
+ }
60
+
61
+ /** The effective resolver from the nearest {@link OpenGeniLinkProvider}. */
62
+ export function useOpenGeniLinkResolver(): OpenGeniLinkResolver | null {
63
+ return useContext(OpenGeniLinkContext);
64
+ }
65
+
66
+ // Every sandbox read the proxy forwards is bounded by the API's own maximum.
67
+ const SANDBOX_DOWNLOAD_MAX_BYTES = 25 * 1024 * 1024;
68
+
69
+ type SessionLinkClient = Partial<Pick<OpenGeniClient, "createFileDownloadUrl" | "fsRead">>;
70
+
71
+ function saveBlob(blob: Blob, filename: string): void {
72
+ const url = URL.createObjectURL(blob);
73
+ const link = document.createElement("a");
74
+ link.href = url;
75
+ link.download = filename;
76
+ link.rel = "noopener";
77
+ document.body.append(link);
78
+ link.click();
79
+ link.remove();
80
+ setTimeout(() => URL.revokeObjectURL(url), 60_000);
81
+ }
82
+
83
+ function openUrl(url: string): void {
84
+ // A signed download URL is attachment-disposition; an anchor click keeps the
85
+ // page and survives popup blockers after the awaited URL request.
86
+ const link = document.createElement("a");
87
+ link.href = url;
88
+ link.rel = "noopener noreferrer";
89
+ link.target = "_blank";
90
+ document.body.append(link);
91
+ link.click();
92
+ link.remove();
93
+ }
94
+
95
+ function base64Bytes(content: string): Uint8Array<ArrayBuffer> {
96
+ const binary = atob(content);
97
+ const bytes = new Uint8Array(binary.length);
98
+ for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
99
+ return bytes;
100
+ }
101
+
102
+ /**
103
+ * Default resolver for a session conversation that talks to OpenGeni through
104
+ * the normal SDK client (for example behind `createSessionProxyHandler`):
105
+ *
106
+ * - `artifact:<file>` downloads the retained file through a short-lived URL.
107
+ * - `sandbox:<path>` downloads when enabled by the host proxy capability.
108
+ *
109
+ * Editable artifacts and Sites have no default: they need a host surface
110
+ * (see `@opengeni/react/artifacts/*` and `@opengeni/react/sites`), so they stay
111
+ * unavailable until the host resolves them.
112
+ */
113
+ export function sessionLinkResolver(input: {
114
+ client: SessionLinkClient;
115
+ workspaceId: string;
116
+ sessionId: string;
117
+ sandboxFiles?: boolean;
118
+ }): OpenGeniLinkResolver {
119
+ const { client, workspaceId, sessionId } = input;
120
+ return (target) => {
121
+ if (target.kind === "file") {
122
+ if (target.workspaceId !== null && target.workspaceId !== workspaceId) return null;
123
+ if (typeof client.createFileDownloadUrl !== "function") return null;
124
+ return {
125
+ open: async () => {
126
+ const { url } = await client.createFileDownloadUrl!(workspaceId, target.fileId, {
127
+ sessionId,
128
+ });
129
+ openUrl(url);
130
+ },
131
+ };
132
+ }
133
+ if (target.kind === "sandbox-file") {
134
+ if (input.sandboxFiles === false) return null;
135
+ if (typeof client.fsRead !== "function") return null;
136
+ return {
137
+ open: async () => {
138
+ const file = await client.fsRead!(workspaceId, sessionId, {
139
+ path: target.path,
140
+ encoding: "base64",
141
+ maxBytes: SANDBOX_DOWNLOAD_MAX_BYTES,
142
+ });
143
+ if (file.truncated) throw new Error("File is too large to download here.");
144
+ const name = file.path.split(/[\\/]/u).at(-1) || "download";
145
+ const bytes =
146
+ file.encoding === "base64"
147
+ ? base64Bytes(file.content)
148
+ : new TextEncoder().encode(file.content);
149
+ saveBlob(new Blob([bytes], { type: "application/octet-stream" }), name);
150
+ },
151
+ };
152
+ }
153
+ return null;
154
+ };
155
+ }
156
+
157
+ /** An editable artifact or Site to open in a host-mounted viewer. */
158
+ export type OpenGeniViewerTarget = Readonly<{
159
+ kind: "editable-artifact" | "site";
160
+ artifactId: string;
161
+ /** The link text the agent wrote, until the viewer loads the real title. */
162
+ title?: string | undefined;
163
+ }>;
164
+
165
+ /**
166
+ * "Open in host viewer": resolve agent links to editable artifacts and Sites
167
+ * in this workspace to `open(target)`, for example to mount
168
+ * `SessionArtifactViewer` beside the conversation. Other targets fall through.
169
+ */
170
+ export function viewerLinkResolver(input: {
171
+ workspaceId: string;
172
+ open: (target: OpenGeniViewerTarget) => void;
173
+ }): OpenGeniLinkResolver {
174
+ return (target) => {
175
+ if (target.kind !== "editable-artifact" && target.kind !== "site") return null;
176
+ if (target.workspaceId !== input.workspaceId) return null;
177
+ return { open: () => input.open({ kind: target.kind, artifactId: target.artifactId }) };
178
+ };
179
+ }
@@ -0,0 +1,13 @@
1
+ import type { SVGProps } from "react";
2
+
3
+ /**
4
+ * Simple Icons, CC0; https://github.com/simple-icons/simple-icons
5
+ * Source: https://raw.githubusercontent.com/simple-icons/simple-icons/develop/icons/openrouter.svg
6
+ */
7
+ export function OpenRouterMark(props: SVGProps<SVGSVGElement>) {
8
+ return (
9
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" {...props}>
10
+ <path d="M16.778 1.844v1.919q-.569-.026-1.138-.032-.708-.008-1.415.037c-1.93.126-4.023.728-6.149 2.237-2.911 2.066-2.731 1.95-4.14 2.75-.396.223-1.342.574-2.185.798-.841.225-1.753.333-1.751.333v4.229s.768.108 1.61.333c.842.224 1.789.575 2.185.799 1.41.798 1.228.683 4.14 2.75 2.126 1.509 4.22 2.11 6.148 2.236.88.058 1.716.041 2.555.005v1.918l7.222-4.168-7.222-4.17v2.176c-.86.038-1.611.065-2.278.021-1.364-.09-2.417-.357-3.979-1.465-2.244-1.593-2.866-2.027-3.68-2.508.889-.518 1.449-.906 3.822-2.59 1.56-1.109 2.614-1.377 3.978-1.466.667-.044 1.418-.017 2.278.02v2.176L24 6.014Z" />
11
+ </svg>
12
+ );
13
+ }
@@ -7,9 +7,15 @@ import {
7
7
  Suspense,
8
8
  useEffect,
9
9
  useState,
10
+ useSyncExternalStore,
10
11
  } from "react";
11
12
  import { cn } from "../lib/cn";
12
13
  import { gitFileDiffToPatch } from "../lib/git-patch";
14
+ import {
15
+ loadPierreDiffs,
16
+ pierreDiffsRevision,
17
+ subscribePierreDiffs,
18
+ } from "../lib/pierre-diffs-loader";
13
19
 
14
20
  /** Pierre `PatchDiff` props subset we drive. */
15
21
  type PatchDiffComponent = ComponentType<{
@@ -50,10 +56,10 @@ export type PierreDiffProps = {
50
56
 
51
57
  // Lazy-load `@pierre/diffs/react` so Shiki + the worker pool stay off the
52
58
  // critical path (and out of an SSR bundle) until a diff is actually shown. The
53
- // dynamic specifier is static so the bundler can resolve + chunk it. If the
54
- // optional peer is absent the import rejects and we render `fallback`.
59
+ // peer is loaded only through the host-registered loader (see
60
+ // `enablePierreDiffs`); without one the load rejects and we render `fallback`.
55
61
  const LazyPatchDiff = lazy(async () => {
56
- const mod = (await import("@pierre/diffs/react")) as unknown as {
62
+ const mod = (await loadPierreDiffs()) as {
57
63
  PatchDiff: PatchDiffComponent;
58
64
  };
59
65
  return { default: mod.PatchDiff };
@@ -78,6 +84,7 @@ export function PierreDiff({
78
84
  className,
79
85
  }: PierreDiffProps) {
80
86
  const [failed, setFailed] = useState(false);
87
+ const [ready, setReady] = useState(false);
81
88
  const [forcedColors, setForcedColors] = useState(false);
82
89
 
83
90
  // Pierre's rich renderer distinguishes additions/deletions primarily through
@@ -95,16 +102,29 @@ export function PierreDiff({
95
102
 
96
103
  // Probe the import once so a hard failure (peer missing) shows `fallback`
97
104
  // rather than a Suspense boundary that never resolves. Skipped when `plain`.
105
+ const loaderRevision = useSyncExternalStore(
106
+ subscribePierreDiffs,
107
+ pierreDiffsRevision,
108
+ pierreDiffsRevision,
109
+ );
98
110
  useEffect(() => {
99
111
  if (plain) return;
100
112
  let cancelled = false;
101
- void import("@pierre/diffs/react").catch(() => {
102
- if (!cancelled) setFailed(true);
103
- });
113
+ setFailed(false);
114
+ // Mount the lazy renderer only after the peer loaded, so a missing peer
115
+ // never poisons React.lazy's cached result for the rest of the page.
116
+ loadPierreDiffs().then(
117
+ () => {
118
+ if (!cancelled) setReady(true);
119
+ },
120
+ () => {
121
+ if (!cancelled) setFailed(true);
122
+ },
123
+ );
104
124
  return () => {
105
125
  cancelled = true;
106
126
  };
107
- }, [plain]);
127
+ }, [plain, loaderRevision]);
108
128
 
109
129
  if (plain || failed || forcedColors) {
110
130
  // `plain` opts out of highlighting; `failed` = `@pierre/diffs` not installed.
@@ -147,6 +167,9 @@ export function PierreDiff({
147
167
  "--diffs-light-bg": "var(--og-color-bg)",
148
168
  "--diffs-bg-buffer-override": "var(--og-color-surface-1)",
149
169
  "--diffs-bg-separator-override": "var(--og-color-surface-1)",
170
+ // Pierre's default (fg mixed 65% into bg) falls under 4.5:1 on the lifted
171
+ // graphite separator; quiet meta text keeps AA on every diff surface.
172
+ "--diffs-fg-number-override": "var(--og-color-fg-subtle)",
150
173
  "--diffs-addition-color-override": "var(--og-color-status-idle)",
151
174
  "--diffs-deletion-color-override": "var(--og-color-status-failed)",
152
175
  "--diffs-fg-number-addition-override": "var(--og-color-status-idle)",
@@ -168,15 +191,17 @@ export function PierreDiff({
168
191
  return (
169
192
  <div className={cn("min-w-0", className)} data-opengeni-pierre-diff style={pierreVars}>
170
193
  <Suspense fallback={loading ?? <DiffSkeleton />}>
171
- {diff.map((file) => (
172
- <div key={file.path} className="mb-2">
173
- <LazyPatchDiff
174
- patch={gitFileDiffToPatch(file)}
175
- options={options}
176
- {...(disableWorkerPool !== undefined ? { disableWorkerPool } : {})}
177
- />
178
- </div>
179
- ))}
194
+ {ready
195
+ ? diff.map((file) => (
196
+ <div key={file.path} className="mb-2">
197
+ <LazyPatchDiff
198
+ patch={gitFileDiffToPatch(file)}
199
+ options={options}
200
+ {...(disableWorkerPool !== undefined ? { disableWorkerPool } : {})}
201
+ />
202
+ </div>
203
+ ))
204
+ : (loading ?? <DiffSkeleton />)}
180
205
  </Suspense>
181
206
  </div>
182
207
  );