@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
@@ -1,24 +1,50 @@
1
1
  import {
2
2
  Children,
3
+ createContext,
4
+ useContext,
3
5
  isValidElement,
4
6
  memo,
5
7
  useEffect,
8
+ useMemo,
6
9
  useReducer,
7
10
  useRef,
8
11
  useState,
9
12
  type ComponentPropsWithoutRef,
10
13
  type ReactNode,
11
14
  } from "react";
12
- import ReactMarkdown, { type Components } from "react-markdown";
15
+ import ReactMarkdown, {
16
+ defaultUrlTransform,
17
+ type Components,
18
+ type ExtraProps,
19
+ type UrlTransform,
20
+ } from "react-markdown";
13
21
  import remarkGfm from "remark-gfm";
22
+ import { PanelsTopLeftIcon } from "lucide-react";
23
+ import { ActivityDisclosure } from "../timeline/shared";
14
24
  import { cn } from "../lib/cn";
15
25
  import { tableElementToTsv } from "../lib/clipboard";
16
26
  import { prefersReducedMotion } from "../lib/motion";
17
27
  import { MOTION_INSPECT_SCALE } from "../lib/motion-inspect";
18
28
  import { CopyButton } from "./copy-button";
29
+ import { PreviewLoading } from "./preview-loading";
30
+ import type { observeMarkdownTableLayout } from "./markdown-table-layout";
19
31
  import { softenStreamingMarkdown } from "./soften-streaming-markdown";
20
32
  import { createStreamReveal, rehypeStreamReveal, type StreamReveal } from "./stream-reveal";
21
33
  import { TooltipProvider } from "./tooltip";
34
+ import { searchMatchOffset, type TimelineSearchTarget } from "./timeline-search";
35
+ import {
36
+ parseOpenGeniLink,
37
+ parseSandboxLink,
38
+ parseRetainedFileReference,
39
+ isReservedOpenGeniLink,
40
+ openGeniLinkScheme,
41
+ type OpenGeniLinkTarget,
42
+ } from "@opengeni/sdk";
43
+ import {
44
+ chainLinkResolvers,
45
+ useOpenGeniLinkResolver,
46
+ type OpenGeniLinkResolver,
47
+ } from "./open-geni-links";
22
48
 
23
49
  /**
24
50
  * The default renderer for chat message bodies in {@link MessageTimeline}.
@@ -34,7 +60,25 @@ import { TooltipProvider } from "./tooltip";
34
60
  * the tokens land. Consumers who want a different renderer can still pass
35
61
  * `renderMessageText` to `MessageTimeline` to override this entirely.
36
62
  */
63
+ export type MarkdownInteractiveBlock = { kind: "html" | "site"; content: string };
64
+ const InteractiveContext = createContext<{
65
+ source: string;
66
+ streaming?: boolean | undefined;
67
+ render?: (block: MarkdownInteractiveBlock) => ReactNode;
68
+ renderImage?: (image: { src: string; alt: string }) => ReactNode;
69
+ suppressImages?: boolean;
70
+ }>({ source: "" });
71
+
37
72
  export type MarkdownProps = {
73
+ /** Resolve a retained-file reference to the host's authenticated artifact page. */
74
+ artifactHref?: ((artifactId: string) => string) | undefined;
75
+ /** Reveals a bounded source excerpt; closing Find retains it until explicit restore. */
76
+ searchTarget?: TimelineSearchTarget | null | undefined;
77
+ renderImage?: ((image: { src: string; alt: string }) => ReactNode) | undefined;
78
+ /** Show alt text without loading image URLs (e.g. in search previews). */
79
+ suppressImages?: boolean | undefined;
80
+ /** Host opt-in for assistant-authored interactive fences. */
81
+ renderInteractiveBlock?: ((block: MarkdownInteractiveBlock) => ReactNode) | undefined;
38
82
  children: string;
39
83
  className?: string | undefined;
40
84
  /**
@@ -46,11 +90,29 @@ export type MarkdownProps = {
46
90
  * transition — that blinked the whole document).
47
91
  */
48
92
  streaming?: boolean | undefined;
93
+ /**
94
+ * Open a session-local file link in the host's Files surface. The path is the
95
+ * exact decoded `sandbox:` payload; `line`, when present, is 1-based.
96
+ */
97
+ onSandboxFile?: ((path: string, line?: number) => void | Promise<void>) | undefined;
98
+ /**
99
+ * Resolve OpenGeni object links (`artifact:`, `sandbox:`, editable
100
+ * artifacts, Sites) to a host URL or action. Asked before any
101
+ * {@link OpenGeniLinkProvider} above this body; `artifactHref` and
102
+ * `onSandboxFile` still win for their own kinds.
103
+ */
104
+ resolveLink?: OpenGeniLinkResolver | undefined;
105
+ };
106
+
107
+ /** Exact target path plus optional 1-based line from a markdown href. */
108
+ export type SandboxFileLocation = {
109
+ path: string;
110
+ line: number | null;
49
111
  };
50
112
 
51
113
  /* --- element renderers (themed to og-* tokens) ------------------------------ */
52
114
 
53
- const components: Components = {
115
+ const baseComponents: Components = {
54
116
  h1: ({ children, ...props }) => (
55
117
  <h1
56
118
  className="mt-5 mb-2.5 text-xl font-semibold tracking-tight text-og-fg first:mt-0"
@@ -74,7 +136,7 @@ const components: Components = {
74
136
  ),
75
137
  h4: ({ children, ...props }) => (
76
138
  <h4
77
- className="mt-4 mb-1.5 text-og-sm font-semibold uppercase tracking-[0.04em] text-og-fg-muted first:mt-0"
139
+ className="mt-4 mb-1.5 text-og-sm font-semibold uppercase tracking-[0.04em] text-og-fg first:mt-0"
78
140
  {...props}
79
141
  >
80
142
  {children}
@@ -95,16 +157,6 @@ const components: Components = {
95
157
  {children}
96
158
  </em>
97
159
  ),
98
- a: ({ children, ...props }) => (
99
- <a
100
- className="break-words font-medium text-og-accent-strong underline-offset-2 hover:underline"
101
- target="_blank"
102
- rel="noreferrer noopener"
103
- {...props}
104
- >
105
- {children}
106
- </a>
107
- ),
108
160
  ul: ({ children, ...props }) => (
109
161
  <ul
110
162
  className="my-2.5 ml-5 flex list-disc flex-col gap-1 marker:text-og-fg-subtle first:mt-0 last:mb-0"
@@ -157,14 +209,14 @@ const components: Components = {
157
209
  // the `pre` renderer), so a `code` reaching here is treated as inline.
158
210
  code: ({ children, className: _className, ...props }) => (
159
211
  <code
160
- className="rounded-og-xs bg-og-surface-1 px-1 py-0.5 font-og-mono text-og-sm text-og-fg"
212
+ className="rounded-og-xs bg-og-surface-2 px-1 py-0.5 font-og-mono text-og-sm text-og-fg"
161
213
  {...props}
162
214
  >
163
215
  {children}
164
216
  </code>
165
217
  ),
166
218
  // Fenced code — quiet mono block (no card / no nested vertical scroll).
167
- pre: ({ children }) => <MarkdownCodeBlock>{children}</MarkdownCodeBlock>,
219
+ pre: InteractiveCodeBlock,
168
220
  // Tables stay unboxed (hairline rules); hover reveals a TSV copy control.
169
221
  table: ({ children, ...props }) => <MarkdownTable {...props}>{children}</MarkdownTable>,
170
222
  thead: ({ children, ...props }) => <thead {...props}>{children}</thead>,
@@ -184,15 +236,227 @@ const components: Components = {
184
236
  {children}
185
237
  </td>
186
238
  ),
187
- img: ({ alt, ...props }) => (
188
- <img
189
- alt={alt ?? ""}
190
- className="my-3 max-w-full rounded-og-md border border-og-border"
191
- {...props}
192
- />
193
- ),
239
+ img: MarkdownImage,
240
+ };
241
+
242
+ const MARKDOWN_LINK_CLASS =
243
+ "break-words font-medium text-og-accent-strong underline-offset-2 hover:underline";
244
+
245
+ // Keep renderer component types stable: rebuilding them remounts paragraphs,
246
+ // destroys native selections, and resets embedded media on host updates.
247
+ const MarkdownLinkContext = createContext<
248
+ Pick<MarkdownProps, "onSandboxFile" | "artifactHref" | "resolveLink">
249
+ >({});
250
+
251
+ const UNAVAILABLE_LABEL: Record<Exclude<OpenGeniLinkTarget["kind"], "sandbox-file">, string> = {
252
+ file: "This file needs a workspace-aware host to open",
253
+ "editable-artifact": "This artifact needs a workspace-aware host to open",
254
+ site: "This Site needs a workspace-aware host to open",
255
+ };
256
+
257
+ function linkActionTitle(target: OpenGeniLinkTarget): string {
258
+ if (target.kind === "sandbox-file") {
259
+ return target.line !== null
260
+ ? `Open ${target.path} at line ${target.line}`
261
+ : `Open ${target.path}`;
262
+ }
263
+ return target.kind === "file"
264
+ ? "Open file"
265
+ : target.kind === "site"
266
+ ? "Open Site"
267
+ : "Open artifact";
268
+ }
269
+
270
+ const markdownComponents: Components = {
271
+ ...baseComponents,
272
+ p: ({ children, node, ...props }) => {
273
+ const containsArtifact = node?.children.some(
274
+ (child) =>
275
+ child.type === "element" &&
276
+ child.tagName === "img" &&
277
+ typeof child.properties.src === "string" &&
278
+ retainedImageId(child.properties.src),
279
+ );
280
+ const Tag = containsArtifact ? "div" : "p";
281
+ return (
282
+ <Tag className="my-2.5 leading-7 first:mt-0 last:mb-0" {...props}>
283
+ {children}
284
+ </Tag>
285
+ );
286
+ },
287
+ a: ({ children, href, ...props }) => {
288
+ const { onSandboxFile, artifactHref, resolveLink } = useContext(MarkdownLinkContext);
289
+ const inherited = useOpenGeniLinkResolver();
290
+ const target = parseOpenGeniLink(href);
291
+ if (target) {
292
+ // Explicit per-kind props keep their historical precedence.
293
+ if (target.kind === "file" && target.workspaceId === null && artifactHref) {
294
+ const destination = defaultUrlTransform(artifactHref(target.fileId));
295
+ if (destination) {
296
+ return (
297
+ <a
298
+ className={MARKDOWN_LINK_CLASS}
299
+ href={destination}
300
+ target="_blank"
301
+ rel="noreferrer noopener"
302
+ >
303
+ {children}
304
+ </a>
305
+ );
306
+ }
307
+ }
308
+ const resolution =
309
+ target.kind === "sandbox-file" && onSandboxFile
310
+ ? { open: () => onSandboxFile(target.path, target.line ?? undefined) }
311
+ : chainLinkResolvers(resolveLink, inherited)?.(target);
312
+ const destination = resolution?.href ? defaultUrlTransform(resolution.href) : "";
313
+ if (destination) {
314
+ return (
315
+ <a
316
+ className={MARKDOWN_LINK_CLASS}
317
+ href={destination}
318
+ target="_blank"
319
+ rel="noreferrer noopener"
320
+ >
321
+ {children}
322
+ </a>
323
+ );
324
+ }
325
+ if (resolution?.open) {
326
+ return (
327
+ <ActionMarkdownLink title={linkActionTitle(target)} onOpen={resolution.open}>
328
+ {children}
329
+ </ActionMarkdownLink>
330
+ );
331
+ }
332
+ if (target.kind === "sandbox-file") {
333
+ return (
334
+ <span
335
+ className="break-words font-medium text-og-fg-subtle underline decoration-dotted underline-offset-2"
336
+ aria-disabled="true"
337
+ title="This sandbox file requires a session-aware handler"
338
+ >
339
+ {children}
340
+ </span>
341
+ );
342
+ }
343
+ // Never navigate: a console path resolves against the host origin and 404s.
344
+ return (
345
+ <span title={UNAVAILABLE_LABEL[target.kind]} data-og-link-unavailable={target.kind}>
346
+ {children} (artifact unavailable)
347
+ </span>
348
+ );
349
+ }
350
+ if (isReservedOpenGeniLink(href) || !href) {
351
+ return (
352
+ <span
353
+ className="break-words text-og-fg-subtle"
354
+ aria-disabled="true"
355
+ title={
356
+ isSandboxHref(href)
357
+ ? "This sandbox file reference is invalid"
358
+ : "This link is unavailable"
359
+ }
360
+ >
361
+ {children} (link unavailable)
362
+ </span>
363
+ );
364
+ }
365
+ return (
366
+ <a
367
+ className={MARKDOWN_LINK_CLASS}
368
+ target="_blank"
369
+ rel="noreferrer noopener"
370
+ href={href}
371
+ {...props}
372
+ >
373
+ {children}
374
+ </a>
375
+ );
376
+ },
194
377
  };
195
378
 
379
+ function ActionMarkdownLink({
380
+ title,
381
+ onOpen,
382
+ children,
383
+ }: {
384
+ title: string;
385
+ onOpen: () => void | Promise<void>;
386
+ children: ReactNode;
387
+ }) {
388
+ const [state, setState] = useState<"idle" | "loading" | "error">("idle");
389
+ return (
390
+ <button
391
+ type="button"
392
+ className={cn(
393
+ MARKDOWN_LINK_CLASS,
394
+ "inline-flex min-h-7 cursor-pointer items-center aria-disabled:cursor-wait aria-disabled:opacity-70 pointer-coarse:min-h-11",
395
+ )}
396
+ // Not `disabled`: disabling the focused control drops focus to the page,
397
+ // so a host viewer could not return focus to the link that opened it.
398
+ aria-disabled={state === "loading" || undefined}
399
+ aria-busy={state === "loading"}
400
+ title={state === "error" ? "Couldn't open this file. Select to retry." : title}
401
+ onClick={() => {
402
+ if (state === "loading") return;
403
+ setState("loading");
404
+ void Promise.resolve()
405
+ .then(onOpen)
406
+ .then(
407
+ () => setState("idle"),
408
+ () => setState("error"),
409
+ );
410
+ }}
411
+ >
412
+ {children}
413
+ {state === "loading" ? " (opening…)" : state === "error" ? " (retry)" : null}
414
+ </button>
415
+ );
416
+ }
417
+
418
+ function isSandboxHref(href: string | undefined): boolean {
419
+ return openGeniLinkScheme(href) === "sandbox";
420
+ }
421
+
422
+ /**
423
+ * Parse an OpenGeni `sandbox:` application href (plus the historical bare
424
+ * `/workspace/...` form). The decoded path is intentionally opaque here:
425
+ * target selection, path policy, and filesystem authority belong to the
426
+ * session-aware host and its FileSystem boundary.
427
+ */
428
+ export function sandboxFileLocationFromHref(href: string | undefined): SandboxFileLocation | null {
429
+ return parseSandboxLink(href);
430
+ }
431
+
432
+ /** Return the exact decoded path for a supported sandbox-link href. */
433
+ export function sandboxFilePathFromHref(href: string | undefined): string | null {
434
+ return sandboxFileLocationFromHref(href)?.path ?? null;
435
+ }
436
+
437
+ export function retainedImageId(src: string): string | null {
438
+ return parseRetainedFileReference(src);
439
+ }
440
+ function MarkdownImage({ src, alt }: ComponentPropsWithoutRef<"img">) {
441
+ const { renderImage, suppressImages } = useContext(InteractiveContext);
442
+ if (suppressImages)
443
+ return <span data-og-image-placeholder="">{alt || "Image"} (preview unavailable)</span>;
444
+ if (!src) return <span>{alt ?? "Image unavailable"}</span>;
445
+ if (retainedImageId(src))
446
+ return renderImage ? (
447
+ <>{renderImage({ src, alt: alt ?? "" })}</>
448
+ ) : (
449
+ <span>{alt || "Image"} (preview unavailable)</span>
450
+ );
451
+ return <img src={src} alt={alt ?? ""} loading="lazy" className="my-3 max-w-full rounded-og-md" />;
452
+ }
453
+
454
+ const markdownUrlTransform: UrlTransform = (url, key, node) =>
455
+ (key === "href" && node.tagName === "a" && isReservedOpenGeniLink(url)) ||
456
+ (key === "src" && node.tagName === "img" && retainedImageId(url))
457
+ ? url
458
+ : defaultUrlTransform(url);
459
+
196
460
  /** How long after the stream ends the reveal pipeline stays for trailing animations. */
197
461
  /** Trailing ink window after stream end — keep ≥ {@link INK_FADE_MS}. */
198
462
  const REVEAL_LINGER_MS = 480 * MOTION_INSPECT_SCALE;
@@ -229,6 +493,58 @@ function fenceLanguage(children: ReactNode): string | null {
229
493
  return found;
230
494
  }
231
495
 
496
+ function InteractiveCodeBlock({ children, node }: ComponentPropsWithoutRef<"pre"> & ExtraProps) {
497
+ const { source, render, streaming } = useContext(InteractiveContext);
498
+ const language = fenceLanguage(children);
499
+ if (render && (language === "opengeni-html" || language === "opengeni-site")) {
500
+ const start = node?.position?.start.offset;
501
+ const end = node?.position?.end.offset;
502
+ const original =
503
+ start !== undefined && end !== undefined && end <= source.length
504
+ ? source.slice(start, end)
505
+ : "";
506
+ const lines = original.trimEnd().split("\n");
507
+ const opening = lines[0]?.match(/^ {0,3}([\x60]{3,}|~{3,})/);
508
+
509
+ const closing = lines
510
+ .at(-1)
511
+ ?.replace(/^\s*(?:>\s*)+/, "")
512
+ .trim();
513
+ const complete =
514
+ opening &&
515
+ lines.length > 1 &&
516
+ closing &&
517
+ closing.length >= opening[1]!.length &&
518
+ [...closing].every((c) => c === opening[1]![0]);
519
+ if (!complete) {
520
+ return (
521
+ <div role="status" aria-live="polite" aria-busy={streaming === true} className="my-3">
522
+ {streaming ? (
523
+ <PreviewLoading />
524
+ ) : (
525
+ <ActivityDisclosure
526
+ icon={<PanelsTopLeftIcon aria-hidden className="size-3.5" />}
527
+ title="Preview incomplete"
528
+ running={false}
529
+ expandable={false}
530
+ preview="Generation stopped before the preview was ready."
531
+ />
532
+ )}
533
+ </div>
534
+ );
535
+ }
536
+ return (
537
+ <>
538
+ {render({
539
+ kind: language === "opengeni-html" ? "html" : "site",
540
+ content: nodeText(children).replace(/\n$/, ""),
541
+ })}
542
+ </>
543
+ );
544
+ }
545
+ return <MarkdownCodeBlock>{children}</MarkdownCodeBlock>;
546
+ }
547
+
232
548
  function MarkdownCodeBlock({ children }: { children?: ReactNode }) {
233
549
  const code = nodeText(children).replace(/\n$/, "");
234
550
  const language = fenceLanguage(children);
@@ -259,9 +575,34 @@ function MarkdownCodeBlock({ children }: { children?: ReactNode }) {
259
575
  }
260
576
 
261
577
  function MarkdownTable({ children, className, ...props }: ComponentPropsWithoutRef<"table">) {
262
- const tableRef = useRef<HTMLTableElement | null>(null);
578
+ const wrapperRef = useRef<HTMLDivElement>(null);
579
+ const tableRef = useRef<HTMLTableElement>(null);
580
+ const layoutRef = useRef<ReturnType<typeof observeMarkdownTableLayout>>(undefined);
581
+ useEffect(() => {
582
+ const wrapper = wrapperRef.current;
583
+ const table = tableRef.current;
584
+ if (!wrapper?.closest("[data-og-wide-table-message]") || !table) return;
585
+ let disposed = false;
586
+ // Ordinary tables remain usable even if this optional layout chunk fails.
587
+ void import("./markdown-table-layout")
588
+ .then(({ observeMarkdownTableLayout }) => {
589
+ if (!disposed) layoutRef.current = observeMarkdownTableLayout(wrapper, table);
590
+ })
591
+ .catch(() => {});
592
+ return () => {
593
+ disposed = true;
594
+ layoutRef.current?.disconnect();
595
+ layoutRef.current = undefined;
596
+ };
597
+ }, []);
598
+ // ReactMarkdown recreates table children even when only later prose changes.
599
+ // Remeasure genuine content changes without collapsing the expanded wrapper
600
+ // between cleanup and the asynchronous observer-module import on each update.
601
+ useEffect(() => {
602
+ layoutRef.current?.measure();
603
+ }, [children]);
263
604
  return (
264
- <div className="group/copy relative mt-3 max-w-full first:mt-0">
605
+ <div ref={wrapperRef} className="group/copy relative mt-3 max-w-full first:mt-0">
265
606
  <div className="pointer-events-none absolute top-0 right-0 z-10">
266
607
  <div className="pointer-events-auto">
267
608
  <CopyButton
@@ -284,7 +625,17 @@ function MarkdownTable({ children, className, ...props }: ComponentPropsWithoutR
284
625
  );
285
626
  }
286
627
 
287
- function MarkdownImpl({ children, className, streaming = false }: MarkdownProps) {
628
+ function MarkdownImpl({
629
+ children,
630
+ artifactHref,
631
+ className,
632
+ streaming = false,
633
+ onSandboxFile,
634
+ renderInteractiveBlock,
635
+ renderImage,
636
+ resolveLink,
637
+ suppressImages,
638
+ }: MarkdownProps) {
288
639
  // Tip-ink engine for THIS body: created on the first streaming render, kept
289
640
  // through a short linger after the stream ends (so the last age window can
290
641
  // finish), then dropped so settled bodies pay zero cost. Observing during
@@ -373,30 +724,108 @@ function MarkdownImpl({ children, className, streaming = false }: MarkdownProps)
373
724
  // fences don't snap to final GFM one commit before the crystallize morph.
374
725
  // Reveal identity still tracks the true source (`children`).
375
726
  const parseText = streaming || revealActive ? softenStreamingMarkdown(children) : children;
727
+ const linkContext = useMemo(
728
+ () => ({ onSandboxFile, artifactHref, resolveLink }),
729
+ [onSandboxFile, artifactHref, resolveLink],
730
+ );
731
+
732
+ const interactiveContext = useMemo(
733
+ () => ({
734
+ source: children,
735
+ streaming,
736
+ ...(renderInteractiveBlock ? { render: renderInteractiveBlock } : {}),
737
+ ...(renderImage ? { renderImage } : {}),
738
+ ...(suppressImages ? { suppressImages } : {}),
739
+ }),
740
+ [children, streaming, renderInteractiveBlock, renderImage, suppressImages],
741
+ );
376
742
 
377
743
  // `min-w-0` lets the prose shrink inside flex parents (message bubbles) so
378
744
  // long links and code blocks wrap/scroll instead of forcing overflow.
379
745
  return (
380
- <TooltipProvider delayDuration={400}>
381
- <div
382
- ref={bodyRef}
383
- className={cn(
384
- "og-markdown-body min-w-0 break-words",
385
- settling && "og-markdown-settle",
386
- className,
387
- )}
388
- >
389
- <ReactMarkdown
390
- remarkPlugins={[remarkGfm]}
391
- rehypePlugins={rehypePlugins}
392
- components={components}
393
- >
394
- {parseText}
395
- </ReactMarkdown>
396
- </div>
397
- </TooltipProvider>
746
+ <MarkdownLinkContext.Provider value={linkContext}>
747
+ <InteractiveContext.Provider value={interactiveContext}>
748
+ <TooltipProvider delayDuration={400}>
749
+ <div
750
+ ref={bodyRef}
751
+ className={cn(
752
+ "og-markdown-body min-w-0 break-words",
753
+ settling && "og-markdown-settle",
754
+ className,
755
+ )}
756
+ >
757
+ <ReactMarkdown
758
+ remarkPlugins={[remarkGfm]}
759
+ rehypePlugins={rehypePlugins}
760
+ components={markdownComponents}
761
+ urlTransform={markdownUrlTransform}
762
+ >
763
+ {parseText}
764
+ </ReactMarkdown>
765
+ </div>
766
+ </TooltipProvider>
767
+ </InteractiveContext.Provider>
768
+ </MarkdownLinkContext.Provider>
398
769
  );
399
770
  }
400
771
 
401
772
  /** Memoized so streaming re-renders of the parent don't re-parse settled bodies. */
402
- export const Markdown = memo(MarkdownImpl);
773
+ export const Markdown = memo(function SearchableMarkdown(props: MarkdownProps) {
774
+ const [retained, setRetained] = useState<{ text: string; target: TimelineSearchTarget } | null>(
775
+ null,
776
+ );
777
+ if (
778
+ props.searchTarget &&
779
+ (retained?.target !== props.searchTarget || retained.text !== props.children)
780
+ ) {
781
+ setRetained({ text: props.children, target: props.searchTarget });
782
+ }
783
+ // Closing Find only removes the highlight. Retain the source window so a huge
784
+ // formatted message cannot replace it and unexpectedly move the reading point.
785
+ const target = props.searchTarget ?? (retained?.text === props.children ? retained.target : null);
786
+ if (!target) return <MarkdownImpl {...props} />;
787
+ const offset = searchMatchOffset(props.children, target);
788
+ if (offset < 0)
789
+ return props.searchTarget ? (
790
+ <div role="status">This match is no longer in the message source.</div>
791
+ ) : (
792
+ <MarkdownImpl {...props} />
793
+ );
794
+ // Bound mounted text even for multi-megabyte messages. Do not split a UTF-16 pair
795
+ // at excerpt edges; the selected range itself is validated against the source.
796
+ let start = Math.max(0, offset - 240);
797
+ let end = Math.min(props.children.length, offset + target.query.length + 240);
798
+ if (start > 0 && /[\uDC00-\uDFFF]/.test(props.children[start]!)) start--;
799
+ if (end < props.children.length && /[\uDC00-\uDFFF]/.test(props.children[end]!)) end++;
800
+ const MatchTag = props.searchTarget ? "mark" : "span";
801
+ return (
802
+ <div className={cn("og-markdown-body min-w-0 break-words", props.className)}>
803
+ <div data-og-annotation-chrome="" className="text-xs opacity-70">
804
+ Match in message source · Excerpt stays in place when Find closes
805
+ <button
806
+ type="button"
807
+ disabled={!!props.searchTarget}
808
+ title={props.searchTarget ? "Close Find to show the formatted message" : undefined}
809
+ className="ml-2 inline-flex min-h-7 items-center rounded-og-sm px-1.5 text-og-xs font-medium text-og-fg-muted outline-hidden hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/45 pointer-coarse:min-h-11 disabled:opacity-50"
810
+ onClick={() => setRetained(null)}
811
+ >
812
+ Show formatted message
813
+ </button>
814
+ </div>
815
+ <div style={{ whiteSpace: "pre-wrap", overflowWrap: "anywhere" }}>
816
+ {start > 0 ? "…" : ""}
817
+ {props.children.slice(start, offset)}
818
+ <MatchTag
819
+ data-og-search-occurrence={target.occurrence ?? 0}
820
+ data-og-search-sequence={target.sequence}
821
+ data-og-search-query={target.query}
822
+ data-og-search-offset={offset}
823
+ >
824
+ {props.children.slice(offset, offset + target.query.length)}
825
+ </MatchTag>
826
+ {props.children.slice(offset + target.query.length, end)}
827
+ {end < props.children.length ? "…" : ""}
828
+ </div>
829
+ </div>
830
+ );
831
+ });