@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,319 @@
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
+
15
+ export type OpenGeniChatLabels = SessionListLabels & {
16
+ openChats: string;
17
+ closeChats: string;
18
+ newChatPlaceholder: string;
19
+ /** Heading above the new-chat composer; empty hides it. */
20
+ newChatTitle: string;
21
+ send: string;
22
+ newChatUnavailable: string;
23
+ };
24
+
25
+ const DEFAULT_LABELS: Omit<OpenGeniChatLabels, keyof SessionListLabels> = {
26
+ openChats: "Open chats",
27
+ closeChats: "Close chats",
28
+ newChatPlaceholder: "Ask anything…",
29
+ newChatTitle: "How can I help?",
30
+ send: "Send",
31
+ newChatUnavailable: "New chats are not enabled for this product.",
32
+ };
33
+
34
+ export type OpenGeniChatProps = ClientOverride & {
35
+ /** Controlled selection. `null` shows the new-chat composer. */
36
+ sessionId?: string | null | undefined;
37
+ /** Initial selection when uncontrolled. Defaults to a new chat. */
38
+ defaultSessionId?: string | null | undefined;
39
+ onSessionChange?: ((sessionId: string | null) => void) | undefined;
40
+ /**
41
+ * Create a chat from its first message. Defaults to `client.createSession`
42
+ * with `{ initialMessage, idempotencyKey }`, which `createSessionProxyHandler`
43
+ * accepts when the server supplies a `createSession` hook. Return the new id.
44
+ */
45
+ createSession?: ((initialMessage: string, idempotencyKey: string) => Promise<string>) | undefined;
46
+ /** Hide the "New chat" entry point. */
47
+ newChat?: boolean | undefined;
48
+ /** Forwarded to the conversation (message rendering, tool renderers, composer...). */
49
+ conversationProps?: Omit<SessionConversationProps, "sessionId" | "client" | "workspaceId">;
50
+ /** Forwarded to the list (rename/archive toggles, page size). */
51
+ listProps?: Pick<SessionListProps, "rename" | "archive" | "pageSize"> | undefined;
52
+ labels?: Partial<OpenGeniChatLabels> | undefined;
53
+ className?: string | undefined;
54
+ /** Defaults to filling the host. */
55
+ height?: CSSProperties["height"];
56
+ /**
57
+ * Light or dark. Defaults to `auto`: follow the host page (an enclosing
58
+ * `data-og-theme`, `class="dark"`/`data-theme` on <html> or <body>, the
59
+ * host's `color-scheme`, then its background), not the OS setting alone.
60
+ */
61
+ theme?: HostThemePreference | undefined;
62
+ /**
63
+ * `host` (default) derives backgrounds and cards from the host background so
64
+ * the chat blends in; `theme` uses the `--og-color-*` surface tokens as they
65
+ * are. Customized surface tokens are always kept.
66
+ */
67
+ surface?: HostSurfacePreference | undefined;
68
+ };
69
+
70
+ type CreateClient = Partial<Pick<OpenGeniClient, "createSession">>;
71
+
72
+ /**
73
+ * A complete chat experience: the user's chat list plus the conversation.
74
+ * The list is a sidebar when the component is wide and a drawer when narrow
75
+ * (container-based, so it adapts inside panels as well as full pages).
76
+ */
77
+ export function OpenGeniChat({
78
+ client,
79
+ workspaceId,
80
+ sessionId: controlledSessionId,
81
+ defaultSessionId = null,
82
+ onSessionChange,
83
+ createSession,
84
+ newChat = true,
85
+ conversationProps,
86
+ listProps,
87
+ labels: labelOverrides,
88
+ className,
89
+ height = "100%",
90
+ theme,
91
+ surface,
92
+ }: OpenGeniChatProps) {
93
+ const labels = { ...DEFAULT_LABELS, ...labelOverrides } as OpenGeniChatLabels;
94
+ const scope = { client, workspaceId };
95
+ const context = useOpenGeni(scope);
96
+ const [uncontrolled, setUncontrolled] = useState<string | null>(defaultSessionId);
97
+ const selected = controlledSessionId !== undefined ? controlledSessionId : uncontrolled;
98
+ const [drawerOpen, setDrawerOpen] = useState(false);
99
+ const [listRevision, setListRevision] = useState(0);
100
+ const root = useRef<HTMLDivElement>(null);
101
+ const hostTheme = useHostTheme(root, { theme, surface });
102
+
103
+ const select = useCallback(
104
+ (next: string | null) => {
105
+ if (controlledSessionId === undefined) setUncontrolled(next);
106
+ onSessionChange?.(next);
107
+ setDrawerOpen(false);
108
+ },
109
+ [controlledSessionId, onSessionChange],
110
+ );
111
+
112
+ const create = useCallback(
113
+ async (initialMessage: string, idempotencyKey: string): Promise<string> => {
114
+ if (createSession) return await createSession(initialMessage, idempotencyKey);
115
+ const creator = (context.client as unknown as CreateClient).createSession;
116
+ if (typeof creator !== "function") throw new Error(labels.newChatUnavailable);
117
+ const created = await creator.call(context.client, context.workspaceId, {
118
+ initialMessage,
119
+ idempotencyKey,
120
+ } as Parameters<NonNullable<CreateClient["createSession"]>>[1]);
121
+ return created.id;
122
+ },
123
+ [context.client, context.workspaceId, createSession, labels.newChatUnavailable],
124
+ );
125
+
126
+ const list = (
127
+ <SessionList
128
+ {...scope}
129
+ {...listProps}
130
+ labels={labels}
131
+ selectedSessionId={selected}
132
+ onSelect={select}
133
+ onNewChat={newChat ? () => select(null) : undefined}
134
+ onArchived={(archivedId) => {
135
+ if (archivedId === selected) select(null);
136
+ }}
137
+ refreshKey={listRevision}
138
+ className="h-full"
139
+ />
140
+ );
141
+
142
+ return (
143
+ <div
144
+ ref={root}
145
+ className={cn(
146
+ "og-root og-chat relative flex min-h-0 min-w-0 bg-og-bg text-og-base text-og-fg",
147
+ className,
148
+ )}
149
+ style={{ ...hostTheme.style, height }}
150
+ data-og-theme={hostTheme.attribute}
151
+ data-og-host-theme=""
152
+ data-og-chat=""
153
+ >
154
+ <aside
155
+ className="og-chat-sidebar min-h-0 w-64 shrink-0 flex-col border-r border-og-border"
156
+ data-og-chat-sidebar=""
157
+ >
158
+ {list}
159
+ </aside>
160
+ {drawerOpen ? (
161
+ <div className="og-chat-drawer absolute inset-0 z-30 flex" data-og-chat-drawer="">
162
+ <div className="flex h-full w-[min(20rem,85%)] flex-col border-r border-og-border bg-og-bg shadow-og-lg">
163
+ <div className="flex justify-end p-1">
164
+ <button
165
+ type="button"
166
+ aria-label={labels.closeChats}
167
+ onClick={() => setDrawerOpen(false)}
168
+ className="rounded p-1.5 text-og-fg-muted hover:bg-og-surface-2"
169
+ >
170
+ <XIcon className="size-4" aria-hidden />
171
+ </button>
172
+ </div>
173
+ <div className="min-h-0 flex-1">{list}</div>
174
+ </div>
175
+ <button
176
+ type="button"
177
+ aria-label={labels.closeChats}
178
+ className="flex-1 bg-black/25"
179
+ onClick={() => setDrawerOpen(false)}
180
+ />
181
+ </div>
182
+ ) : null}
183
+ <main className="flex min-h-0 min-w-0 flex-1 flex-col">
184
+ <div className="og-chat-menu flex items-center gap-2 px-2 py-1">
185
+ <button
186
+ type="button"
187
+ aria-label={labels.openChats}
188
+ aria-expanded={drawerOpen}
189
+ onClick={() => setDrawerOpen(true)}
190
+ className="rounded p-1.5 text-og-fg-muted hover:bg-og-surface-2"
191
+ data-og-chat-menu=""
192
+ >
193
+ <MenuIcon className="size-4" aria-hidden />
194
+ </button>
195
+ <span className="text-og-sm font-semibold text-og-fg-muted">{labels.heading}</span>
196
+ </div>
197
+ <div className="og-chat-main min-h-0 flex-1 px-3 pb-3 pt-1">
198
+ {selected ? (
199
+ <SessionConversation
200
+ {...conversationProps}
201
+ {...scope}
202
+ sessionId={selected}
203
+ height="100%"
204
+ />
205
+ ) : (
206
+ <NewChat
207
+ labels={labels}
208
+ create={create}
209
+ onCreated={(id) => {
210
+ setListRevision((revision) => revision + 1);
211
+ select(id);
212
+ }}
213
+ />
214
+ )}
215
+ </div>
216
+ </main>
217
+ </div>
218
+ );
219
+ }
220
+
221
+ function NewChat({
222
+ labels,
223
+ create,
224
+ onCreated,
225
+ }: {
226
+ labels: OpenGeniChatLabels;
227
+ create: (initialMessage: string, idempotencyKey: string) => Promise<string>;
228
+ onCreated: (sessionId: string) => void;
229
+ }) {
230
+ const [text, setText] = useState("");
231
+ const [sending, setSending] = useState(false);
232
+ const [error, setError] = useState<{ cause: unknown } | null>(null);
233
+ const formatError = useErrorMessage();
234
+ // One key per draft, so a retried send returns the same chat.
235
+ const idempotencyKey = useRef(crypto.randomUUID());
236
+
237
+ const submit = async (event: FormEvent) => {
238
+ event.preventDefault();
239
+ const initialMessage = text.trim();
240
+ if (!initialMessage || sending) return;
241
+ setSending(true);
242
+ setError(null);
243
+ try {
244
+ const id = await create(initialMessage, idempotencyKey.current);
245
+ idempotencyKey.current = crypto.randomUUID();
246
+ setText("");
247
+ onCreated(id);
248
+ } catch (cause) {
249
+ setError({ cause });
250
+ } finally {
251
+ setSending(false);
252
+ }
253
+ };
254
+
255
+ return (
256
+ <form
257
+ onSubmit={(event) => void submit(event)}
258
+ className="mx-auto box-border flex h-full w-full max-w-3xl flex-col gap-4 p-3"
259
+ data-og-new-chat-composer=""
260
+ >
261
+ {/* Sits a little above center, relative to the panel rather than the page. */}
262
+ <div aria-hidden className="min-h-0 flex-[2]" />
263
+ {labels.newChatTitle ? (
264
+ <p className="text-center text-og-md font-medium text-og-fg">{labels.newChatTitle}</p>
265
+ ) : null}
266
+ <div
267
+ className={cn(
268
+ "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",
269
+ "transition-[border-color,box-shadow] duration-200 ease-og-out",
270
+ "focus-within:border-og-accent/50 focus-within:shadow-og-glow",
271
+ )}
272
+ >
273
+ <textarea
274
+ value={text}
275
+ onChange={(event) => setText(event.target.value)}
276
+ onKeyDown={(event) => {
277
+ if (event.key === "Enter" && !event.shiftKey && !event.nativeEvent.isComposing) {
278
+ event.preventDefault();
279
+ event.currentTarget.form?.requestSubmit();
280
+ }
281
+ }}
282
+ placeholder={labels.newChatPlaceholder}
283
+ aria-label={labels.newChatPlaceholder}
284
+ rows={2}
285
+ disabled={sending}
286
+ 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"
287
+ />
288
+ <button
289
+ type="submit"
290
+ aria-label={labels.send}
291
+ disabled={sending || !text.trim()}
292
+ className={cn(
293
+ "inline-flex size-8 shrink-0 items-center justify-center rounded-og-md pointer-coarse:size-11",
294
+ "border border-og-primary-border bg-og-primary text-og-primary-fg",
295
+ "transition-[background-color,transform,opacity] duration-150 ease-og-spring",
296
+ "hover:bg-og-primary-hover active:scale-95 disabled:cursor-not-allowed disabled:opacity-50",
297
+ )}
298
+ >
299
+ {sending ? (
300
+ <LoaderCircleIcon className="size-4 animate-og-spin" aria-hidden />
301
+ ) : (
302
+ <ArrowUpIcon className="size-4" aria-hidden />
303
+ )}
304
+ </button>
305
+ </div>
306
+ {error ? (
307
+ <p role="alert" className="text-center text-og-sm text-og-status-failed">
308
+ {formatError(
309
+ error.cause,
310
+ error.cause instanceof Error && error.cause.message === labels.newChatUnavailable
311
+ ? labels.newChatUnavailable
312
+ : undefined,
313
+ )}
314
+ </p>
315
+ ) : null}
316
+ <div aria-hidden className="min-h-0 flex-[3]" />
317
+ </form>
318
+ );
319
+ }
@@ -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
  );