@opengeni/react 3.1.0 → 3.1.3-canary.38890816741001

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 (863) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +89 -11
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/approvals.d.ts +2 -1
  5. package/dist/artifacts-document.js +5 -3
  6. package/dist/artifacts-presentation.js +5 -3
  7. package/dist/artifacts-spreadsheet.d.ts +1 -1
  8. package/dist/artifacts-spreadsheet.js +5 -3
  9. package/dist/artifacts.d.ts +5 -1
  10. package/dist/artifacts.js +536 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-ZWR6MWJ7.js +19 -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-BO2IWXVK.js +14 -0
  16. package/dist/chunk-2DDJ6YH6.js +41 -0
  17. package/dist/chunk-2DDJ6YH6.js.map +1 -0
  18. package/dist/chunk-2HVLQ26H.js +183 -0
  19. package/dist/chunk-2HVLQ26H.js.map +1 -0
  20. package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
  23. package/dist/chunk-2SFFYIH3.js.map +1 -0
  24. package/dist/chunk-3PVDYTTB.js +24 -0
  25. package/dist/chunk-3PVDYTTB.js.map +1 -0
  26. package/dist/chunk-3UZCWK46.js +298 -0
  27. package/dist/chunk-3UZCWK46.js.map +1 -0
  28. package/dist/chunk-47CKUXTW.js +293 -0
  29. package/dist/chunk-47CKUXTW.js.map +1 -0
  30. package/dist/chunk-4QYP6QUI.js +109 -0
  31. package/dist/chunk-4QYP6QUI.js.map +1 -0
  32. package/dist/chunk-5EY26VZ7.js +1053 -0
  33. package/dist/chunk-5EY26VZ7.js.map +1 -0
  34. package/dist/chunk-5I4VRWBB.js +56 -0
  35. package/dist/chunk-5I4VRWBB.js.map +1 -0
  36. package/dist/chunk-5WOR7UCL.js +191 -0
  37. package/dist/chunk-5WOR7UCL.js.map +1 -0
  38. package/dist/chunk-5YJLGOM5.js +51 -0
  39. package/dist/chunk-5YJLGOM5.js.map +1 -0
  40. package/dist/chunk-6JFN3OWG.js +386 -0
  41. package/dist/chunk-6JFN3OWG.js.map +1 -0
  42. package/dist/chunk-7QJT5O4S.js +35 -0
  43. package/dist/chunk-7QJT5O4S.js.map +1 -0
  44. package/dist/chunk-A55KV72M.js +402 -0
  45. package/dist/chunk-A55KV72M.js.map +1 -0
  46. package/dist/chunk-ADWCLI4G.js +2028 -0
  47. package/dist/chunk-ADWCLI4G.js.map +1 -0
  48. package/dist/chunk-B27E3V37.js +29 -0
  49. package/dist/chunk-B27E3V37.js.map +1 -0
  50. package/dist/chunk-B7TC2A33.js +83 -0
  51. package/dist/chunk-B7TC2A33.js.map +1 -0
  52. package/dist/chunk-BLL56F7R.js +385 -0
  53. package/dist/chunk-BLL56F7R.js.map +1 -0
  54. package/dist/chunk-BOFEQC6K.js +162 -0
  55. package/dist/chunk-BOFEQC6K.js.map +1 -0
  56. package/dist/chunk-CM7LVUKC.js +35 -0
  57. package/dist/chunk-CM7LVUKC.js.map +1 -0
  58. package/dist/chunk-CORUP6JB.js +122 -0
  59. package/dist/chunk-CORUP6JB.js.map +1 -0
  60. package/dist/chunk-CSX5FFKZ.js +35 -0
  61. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  62. package/dist/chunk-EGVHJKGJ.js +3125 -0
  63. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  64. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  65. package/dist/chunk-G76LSA76.js.map +1 -0
  66. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  67. package/dist/chunk-GQMRL52F.js.map +1 -0
  68. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  69. package/dist/chunk-GUUXOISA.js.map +1 -0
  70. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  71. package/dist/chunk-I7X2P4FU.js.map +1 -0
  72. package/dist/chunk-IGFZFLI2.js +1390 -0
  73. package/dist/chunk-IGFZFLI2.js.map +1 -0
  74. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  75. package/dist/chunk-IMSUVYQB.js.map +1 -0
  76. package/dist/chunk-IOYHDEP3.js +38 -0
  77. package/dist/chunk-IOYHDEP3.js.map +1 -0
  78. package/dist/chunk-IZV5FTJC.js +55 -0
  79. package/dist/chunk-IZV5FTJC.js.map +1 -0
  80. package/dist/chunk-KF33GTWN.js +343 -0
  81. package/dist/chunk-KF33GTWN.js.map +1 -0
  82. package/dist/chunk-KSGQ5ODA.js +457 -0
  83. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  84. package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
  85. package/dist/chunk-KZC6QRNR.js.map +1 -0
  86. package/dist/chunk-LJUMYUBO.js +218 -0
  87. package/dist/chunk-LJUMYUBO.js.map +1 -0
  88. package/dist/chunk-LSW2OJVV.js +380 -0
  89. package/dist/chunk-LSW2OJVV.js.map +1 -0
  90. package/dist/chunk-M357MHH3.js +2 -0
  91. package/dist/chunk-M357MHH3.js.map +1 -0
  92. package/dist/chunk-MK2TQO4Y.js +24 -0
  93. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  94. package/dist/chunk-N7S72EXK.js +25 -0
  95. package/dist/chunk-N7S72EXK.js.map +1 -0
  96. package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
  97. package/dist/chunk-NKMYZFHA.js.map +1 -0
  98. package/dist/chunk-NX4ADH73.js +14 -0
  99. package/dist/chunk-NX4ADH73.js.map +1 -0
  100. package/dist/chunk-O7F6UJO4.js +71 -0
  101. package/dist/chunk-O7F6UJO4.js.map +1 -0
  102. package/dist/chunk-OVB5WIG5.js +14064 -0
  103. package/dist/chunk-OVB5WIG5.js.map +1 -0
  104. package/dist/chunk-OYQQJL3J.js +16 -0
  105. package/dist/chunk-OYQQJL3J.js.map +1 -0
  106. package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
  107. package/dist/chunk-P4BNUO57.js.map +1 -0
  108. package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
  109. package/dist/chunk-PEHTX3V7.js.map +1 -0
  110. package/dist/chunk-PMV53IMM.js +26 -0
  111. package/dist/chunk-PMV53IMM.js.map +1 -0
  112. package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
  113. package/dist/chunk-PYEOPA4M.js.map +1 -0
  114. package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
  115. package/dist/chunk-QHUE7E4N.js.map +1 -0
  116. package/dist/chunk-QV3DJVRZ.js +11 -0
  117. package/dist/chunk-QV3DJVRZ.js.map +1 -0
  118. package/dist/chunk-R5SBNG7S.js +810 -0
  119. package/dist/chunk-R5SBNG7S.js.map +1 -0
  120. package/dist/chunk-RI42H5IU.js +326 -0
  121. package/dist/chunk-RI42H5IU.js.map +1 -0
  122. package/dist/chunk-S2QH6EZ5.js +211 -0
  123. package/dist/chunk-S2QH6EZ5.js.map +1 -0
  124. package/dist/chunk-SHLZMAJN.js +304 -0
  125. package/dist/chunk-SHLZMAJN.js.map +1 -0
  126. package/dist/chunk-TGXK4BAZ.js +293 -0
  127. package/dist/chunk-TGXK4BAZ.js.map +1 -0
  128. package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
  129. package/dist/chunk-TNEZNMSN.js.map +1 -0
  130. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  131. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  132. package/dist/chunk-UNJPZGNK.js +63 -0
  133. package/dist/chunk-UNJPZGNK.js.map +1 -0
  134. package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-VIUEOHXY.js +394 -0
  137. package/dist/chunk-VIUEOHXY.js.map +1 -0
  138. package/dist/chunk-WIUKB3LD.js +1911 -0
  139. package/dist/chunk-WIUKB3LD.js.map +1 -0
  140. package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
  141. package/dist/chunk-WNN7NO2N.js.map +1 -0
  142. package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
  143. package/dist/chunk-X5UVUIMF.js.map +1 -0
  144. package/dist/chunk-XDA5QJE7.js +402 -0
  145. package/dist/chunk-XDA5QJE7.js.map +1 -0
  146. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  147. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  148. package/dist/chunk-XHF7OYAN.js +1150 -0
  149. package/dist/chunk-XHF7OYAN.js.map +1 -0
  150. package/dist/chunk-YSRBFJMQ.js +43 -0
  151. package/dist/chunk-YSRBFJMQ.js.map +1 -0
  152. package/dist/chunk-ZOZAPAUO.js +174 -0
  153. package/dist/chunk-ZOZAPAUO.js.map +1 -0
  154. package/dist/chunk-ZQV5W7YC.js +809 -0
  155. package/dist/chunk-ZQV5W7YC.js.map +1 -0
  156. package/dist/chunk-ZUWF4NF7.js +13 -0
  157. package/dist/chunk-ZUWF4NF7.js.map +1 -0
  158. package/dist/client.d.ts +16 -7
  159. package/dist/clipboard.js +3 -1
  160. package/dist/commands/types.d.ts +2 -0
  161. package/dist/components/anthropic-mark.d.ts +3 -0
  162. package/dist/components/approval-surface.d.ts +19 -6
  163. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  164. package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
  165. package/dist/components/artifacts/artifact-surface.d.ts +4 -2
  166. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  167. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  168. package/dist/components/artifacts/document-editor.d.ts +4 -2
  169. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  170. package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
  171. package/dist/components/artifacts/editable-document.d.ts +1 -1
  172. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  173. package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
  174. package/dist/components/artifacts/index.d.ts +9 -2
  175. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  176. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  177. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  178. package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
  179. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  180. package/dist/components/artifacts/site-view.d.ts +26 -0
  181. package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
  182. package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
  183. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  184. package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
  185. package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
  186. package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
  187. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  188. package/dist/components/browser-select-control.d.ts +16 -0
  189. package/dist/components/browser-viewer.d.ts +11 -2
  190. package/dist/components/chat-composer.d.ts +21 -3
  191. package/dist/components/child-session-link.d.ts +9 -0
  192. package/dist/components/claude-mark.d.ts +3 -0
  193. package/dist/components/code-editor.d.ts +1 -4
  194. package/dist/components/composer-transcription-control.d.ts +7 -0
  195. package/dist/components/composer.d.ts +34 -67
  196. package/dist/components/computer-viewer.d.ts +1 -1
  197. package/dist/components/copy-button.d.ts +3 -1
  198. package/dist/components/desktop-viewer.d.ts +1 -1
  199. package/dist/components/fleet-tile.d.ts +2 -2
  200. package/dist/components/grok-mark.d.ts +26 -0
  201. package/dist/components/human-input-form.d.ts +28 -32
  202. package/dist/components/human-input-surface.d.ts +7 -2
  203. package/dist/components/linkified-text.d.ts +18 -0
  204. package/dist/components/machine-input-display.d.ts +22 -1
  205. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  206. package/dist/components/machines/machine-detail.d.ts +7 -1
  207. package/dist/components/machines/machine-status.d.ts +48 -0
  208. package/dist/components/markdown-table-layout.d.ts +18 -0
  209. package/dist/components/markdown.d.ts +37 -4
  210. package/dist/components/message-timeline.d.ts +86 -7
  211. package/dist/components/model-mark.d.ts +29 -0
  212. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  213. package/dist/components/model-policy-picker.d.ts +41 -25
  214. package/dist/components/new-conversation.d.ts +32 -0
  215. package/dist/components/open-geni-chat.d.ts +73 -0
  216. package/dist/components/open-geni-links.d.ts +68 -0
  217. package/dist/components/openrouter-mark.d.ts +6 -0
  218. package/dist/components/opper-mark.d.ts +7 -0
  219. package/dist/components/preview-loading.d.ts +2 -0
  220. package/dist/components/provider-recovery-notice.d.ts +16 -0
  221. package/dist/components/queue-item-content.d.ts +9 -0
  222. package/dist/components/rehype-secret-refs.d.ts +23 -0
  223. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  224. package/dist/components/sandbox-files.d.ts +3 -1
  225. package/dist/components/sandbox-workspace.d.ts +18 -0
  226. package/dist/components/secret-question-field.d.ts +31 -0
  227. package/dist/components/secret-ref-chip.d.ts +35 -0
  228. package/dist/components/session-capability-frame.d.ts +37 -0
  229. package/dist/components/session-chrome.d.ts +57 -8
  230. package/dist/components/session-commands-panel.d.ts +6 -0
  231. package/dist/components/session-commands.d.ts +6 -0
  232. package/dist/components/session-connection-request.d.ts +8 -0
  233. package/dist/components/session-conversation.d.ts +157 -0
  234. package/dist/components/session-list.d.ts +39 -0
  235. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  236. package/dist/components/session-proxy-scope.d.ts +35 -0
  237. package/dist/components/session-status.d.ts +4 -1
  238. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  239. package/dist/components/timeline-anchor.d.ts +24 -0
  240. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  241. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  242. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  243. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  244. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  245. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  246. package/dist/components/timeline-annotations.d.ts +13 -3
  247. package/dist/components/timeline-reading-progress.d.ts +11 -0
  248. package/dist/components/timeline-search.d.ts +34 -0
  249. package/dist/components/timeline-settlement.d.ts +16 -0
  250. package/dist/components/tip-follow.d.ts +16 -0
  251. package/dist/components/tool-action-review.d.ts +47 -0
  252. package/dist/components/tool-review-history.d.ts +25 -0
  253. package/dist/components/usage-limit-notice.d.ts +49 -0
  254. package/dist/components/usage-member-list.d.ts +91 -0
  255. package/dist/components/usage-meter.d.ts +73 -0
  256. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  257. package/dist/components/user-message-body.d.ts +10 -1
  258. package/dist/composer-messages.d.ts +74 -0
  259. package/dist/composer-messages.js +9 -0
  260. package/dist/composer-messages.js.map +1 -0
  261. package/dist/composer-voice-events.d.ts +8 -0
  262. package/dist/composer.d.ts +5 -4
  263. package/dist/composer.js +26 -13
  264. package/dist/computer-viewer-GMLDXPON.js +20 -0
  265. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  266. package/dist/connect-account-identity.d.ts +8 -0
  267. package/dist/connect-accounts.d.ts +15 -0
  268. package/dist/connect-chooser.d.ts +18 -0
  269. package/dist/connect-panel.d.ts +18 -0
  270. package/dist/connect-setup.d.ts +18 -0
  271. package/dist/connect.d.ts +21 -0
  272. package/dist/connect.js +2149 -0
  273. package/dist/connect.js.map +1 -0
  274. package/dist/connection-catalog.d.ts +38 -0
  275. package/dist/connection-discovery.d.ts +12 -0
  276. package/dist/connection-installed.d.ts +17 -0
  277. package/dist/connection-logo.d.ts +9 -0
  278. package/dist/connection-service-logo.d.ts +8 -0
  279. package/dist/connection-service-presentation.d.ts +13 -0
  280. package/dist/connection-skeleton.d.ts +5 -0
  281. package/dist/connection-type-picker.d.ts +6 -0
  282. package/dist/conversation-timeline.d.ts +5 -0
  283. package/dist/desktop.d.ts +7 -0
  284. package/dist/desktop.js +27 -0
  285. package/dist/desktop.js.map +1 -0
  286. package/dist/device-authorization.d.ts +23 -0
  287. package/dist/diffs.d.ts +8 -0
  288. package/dist/diffs.js +15 -0
  289. package/dist/diffs.js.map +1 -0
  290. package/dist/discovery-cache.d.ts +5 -0
  291. package/dist/editor.d.ts +7 -0
  292. package/dist/editor.js +22 -0
  293. package/dist/editor.js.map +1 -0
  294. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  295. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  296. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  297. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  298. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  299. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  300. package/dist/hooks/latest-question.d.ts +25 -0
  301. package/dist/hooks/shared-machines-list.d.ts +4 -0
  302. package/dist/hooks/shared-query.d.ts +113 -0
  303. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  304. package/dist/hooks/use-auth-runs.d.ts +1 -4
  305. package/dist/hooks/use-available-models.d.ts +1 -1
  306. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  307. package/dist/hooks/use-browser-session.d.ts +12 -1
  308. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  309. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  310. package/dist/hooks/use-composer.d.ts +24 -2
  311. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  312. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  313. package/dist/hooks/use-computer-session.d.ts +4 -0
  314. package/dist/hooks/use-connect.d.ts +23 -0
  315. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  316. package/dist/hooks/use-file-attachments.d.ts +12 -0
  317. package/dist/hooks/use-goal.d.ts +2 -1
  318. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  319. package/dist/hooks/use-new-conversation.d.ts +56 -0
  320. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  321. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  322. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  323. package/dist/hooks/use-session-conversation.d.ts +49 -0
  324. package/dist/hooks/use-session-events.d.ts +28 -7
  325. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  326. package/dist/hooks/use-session-model-account.d.ts +48 -0
  327. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  328. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  329. package/dist/hooks/use-usage.d.ts +40 -0
  330. package/dist/hooks/use-vaults.d.ts +53 -0
  331. package/dist/hooks/use-voice-input.d.ts +8 -1
  332. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  333. package/dist/hooks/use-workspace-sessions.d.ts +22 -5
  334. package/dist/human-input-model.d.ts +122 -0
  335. package/dist/identity-link-accounts.d.ts +11 -0
  336. package/dist/identity-link-consent.d.ts +18 -0
  337. package/dist/index.d.ts +82 -20
  338. package/dist/index.js +2350 -6605
  339. package/dist/index.js.map +1 -1
  340. package/dist/interaction.d.ts +1 -1
  341. package/dist/interaction.js +14 -24
  342. package/dist/interaction.js.map +1 -1
  343. package/dist/latest-question-R77KWSUP.js +118 -0
  344. package/dist/latest-question-R77KWSUP.js.map +1 -0
  345. package/dist/lib/clipboard.d.ts +7 -0
  346. package/dist/lib/error-message.d.ts +7 -0
  347. package/dist/lib/format.d.ts +58 -4
  348. package/dist/lib/host-theme.d.ts +77 -0
  349. package/dist/lib/interaction-errors.d.ts +3 -0
  350. package/dist/lib/menu-styles.d.ts +22 -0
  351. package/dist/lib/notify-observer.d.ts +2 -0
  352. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  353. package/dist/lib/provider-recovery.d.ts +55 -0
  354. package/dist/lib/scrollbars.d.ts +11 -0
  355. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  356. package/dist/lib/transient-retry.d.ts +25 -0
  357. package/dist/lib/workbench-peers.d.ts +36 -0
  358. package/dist/lib/xterm-theme.d.ts +7 -5
  359. package/dist/machines.js +9 -5
  360. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  361. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  362. package/dist/mcp-connection-status.d.ts +14 -0
  363. package/dist/model-mark-paths.d.ts +34 -0
  364. package/dist/model-mark-paths.js +16 -0
  365. package/dist/model-mark-paths.js.map +1 -0
  366. package/dist/model-picker-model.d.ts +111 -0
  367. package/dist/model-picker-model.js +25 -0
  368. package/dist/model-picker-model.js.map +1 -0
  369. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  370. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  371. package/dist/model-policy.d.ts +30 -3
  372. package/dist/model-policy.js +14 -1
  373. package/dist/native-previews.d.ts +28 -0
  374. package/dist/native-previews.js +82 -0
  375. package/dist/native-previews.js.map +1 -0
  376. package/dist/new-session-draft.d.ts +7 -0
  377. package/dist/new-session-draft.js +639 -0
  378. package/dist/new-session-draft.js.map +1 -0
  379. package/dist/notification-text.d.ts +27 -0
  380. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  381. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  382. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  383. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  384. package/dist/older-history.d.ts +3 -2
  385. package/dist/organization-model.d.ts +32 -0
  386. package/dist/organization-model.js +65 -0
  387. package/dist/organization-model.js.map +1 -0
  388. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  389. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  390. package/dist/plugin-details.d.ts +14 -0
  391. package/dist/plugin-discovery.d.ts +25 -0
  392. package/dist/preview-loading-paint.d.ts +20 -0
  393. package/dist/provider.d.ts +25 -2
  394. package/dist/queue-presentation-model.d.ts +72 -0
  395. package/dist/queue-presentation-model.js +38 -0
  396. package/dist/queue-presentation-model.js.map +1 -0
  397. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  398. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  399. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  400. package/dist/realtime/embedded-voice.d.ts +1 -0
  401. package/dist/realtime/realtime-control.d.ts +4 -65
  402. package/dist/realtime/session-realtime.d.ts +78 -0
  403. package/dist/realtime.js +25 -1294
  404. package/dist/realtime.js.map +1 -1
  405. package/dist/sandbox-files-O27IPOZW.js +21 -0
  406. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  407. package/dist/sandbox-label-model.d.ts +30 -0
  408. package/dist/sandbox-label-model.js +20 -0
  409. package/dist/sandbox-label-model.js.map +1 -0
  410. package/dist/scrollbars.d.ts +1 -0
  411. package/dist/scrollbars.js +10 -0
  412. package/dist/scrollbars.js.map +1 -0
  413. package/dist/secret-reference-label.d.ts +14 -0
  414. package/dist/secrets-ui.d.ts +57 -0
  415. package/dist/session-agents-model.d.ts +10 -0
  416. package/dist/session-agents-model.js +25 -0
  417. package/dist/session-agents-model.js.map +1 -0
  418. package/dist/session-attention-model.d.ts +8 -0
  419. package/dist/session-attention-model.js +47 -0
  420. package/dist/session-attention-model.js.map +1 -0
  421. package/dist/session-auth-recommendation.d.ts +5 -0
  422. package/dist/session-capability-policy.d.ts +31 -0
  423. package/dist/session-feedback-model.d.ts +20 -0
  424. package/dist/session-feedback-model.js +56 -0
  425. package/dist/session-feedback-model.js.map +1 -0
  426. package/dist/session-list-model.d.ts +138 -0
  427. package/dist/session-list-model.js +274 -0
  428. package/dist/session-list-model.js.map +1 -0
  429. package/dist/session-realtime-7DJOIHQW.js +21 -0
  430. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  431. package/dist/session-realtime.d.ts +7 -0
  432. package/dist/session-realtime.js +19 -0
  433. package/dist/session-realtime.js.map +1 -0
  434. package/dist/session-status-model.d.ts +36 -0
  435. package/dist/session-ui.d.ts +39 -1
  436. package/dist/session-ui.js +126 -12
  437. package/dist/session-ui.js.map +1 -1
  438. package/dist/session.d.ts +8 -2
  439. package/dist/session.js +35 -20
  440. package/dist/site-snapshot.d.ts +14 -0
  441. package/dist/sites-ui.d.ts +24 -0
  442. package/dist/sites.d.ts +3 -0
  443. package/dist/sites.js +14 -0
  444. package/dist/sites.js.map +1 -0
  445. package/dist/skill-discovery.d.ts +47 -0
  446. package/dist/terminal.d.ts +8 -0
  447. package/dist/terminal.js +32 -0
  448. package/dist/terminal.js.map +1 -0
  449. package/dist/testing/session-scenarios.d.ts +10 -0
  450. package/dist/testing/session-scenarios.js +367 -0
  451. package/dist/testing/session-scenarios.js.map +1 -0
  452. package/dist/timeline/activity-rail.d.ts +11 -2
  453. package/dist/timeline/agent-identity.d.ts +30 -0
  454. package/dist/timeline/agent-row.d.ts +31 -0
  455. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  456. package/dist/timeline/compaction-copy.d.ts +46 -0
  457. package/dist/timeline/entrance.d.ts +13 -1
  458. package/dist/timeline/focus-sequence.d.ts +9 -0
  459. package/dist/timeline/genie-copy.d.ts +3 -0
  460. package/dist/timeline/genie-loading.d.ts +47 -0
  461. package/dist/timeline/index.d.ts +10 -5
  462. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  463. package/dist/timeline/message-sender.d.ts +19 -0
  464. package/dist/timeline/notice-presentation.d.ts +13 -0
  465. package/dist/timeline/parsers.d.ts +11 -0
  466. package/dist/timeline/patch-apply-command.d.ts +18 -0
  467. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  468. package/dist/timeline/platform-activity-row.d.ts +1 -2
  469. package/dist/timeline/presented-image.d.ts +11 -0
  470. package/dist/timeline/projection.d.ts +31 -2
  471. package/dist/timeline/provider-logo.d.ts +15 -0
  472. package/dist/timeline/question-nav-model.d.ts +23 -0
  473. package/dist/timeline/registry.d.ts +12 -1
  474. package/dist/timeline/retained-image.d.ts +18 -0
  475. package/dist/timeline/retained-loaders.d.ts +27 -0
  476. package/dist/timeline/rolling-activity.d.ts +11 -0
  477. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  478. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  479. package/dist/timeline/shared.d.ts +4 -1
  480. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  481. package/dist/timeline/startup-preference.d.ts +3 -0
  482. package/dist/timeline/startup-timings.d.ts +4 -0
  483. package/dist/timeline/tool-display-name.d.ts +5 -2
  484. package/dist/timeline/tool-presentation.d.ts +172 -0
  485. package/dist/timeline/turn-summary-model.d.ts +95 -0
  486. package/dist/timeline/turn-summary.d.ts +20 -54
  487. package/dist/timeline/types.d.ts +179 -7
  488. package/dist/timeline/work-presentation.d.ts +60 -0
  489. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  490. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  491. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  492. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  493. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  494. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  495. package/dist/timeline-model.d.ts +29 -0
  496. package/dist/timeline-model.js +254 -0
  497. package/dist/timeline-model.js.map +1 -0
  498. package/dist/usage/allowance-copy.d.ts +25 -0
  499. package/dist/usage/session-usage-limit.d.ts +88 -0
  500. package/dist/usage/summary.d.ts +35 -0
  501. package/dist/usage.d.ts +17 -0
  502. package/dist/usage.js +1187 -0
  503. package/dist/usage.js.map +1 -0
  504. package/dist/voice-recording-owner.d.ts +7 -0
  505. package/package.json +107 -7
  506. package/src/accounts.tsx +116 -14
  507. package/src/approvals.ts +8 -1
  508. package/src/artifacts-spreadsheet.ts +1 -0
  509. package/src/artifacts.ts +44 -0
  510. package/src/assets/README.md +8 -0
  511. package/src/assets/gmail.ico +0 -0
  512. package/src/assets/outlook.ico +0 -0
  513. package/src/capability-catalog-row.tsx +94 -0
  514. package/src/capability-logo-fallback.ts +22 -0
  515. package/src/client.ts +20 -31
  516. package/src/commands/registry.ts +18 -15
  517. package/src/commands/types.ts +2 -0
  518. package/src/components/anthropic-mark.tsx +10 -0
  519. package/src/components/approval-surface.tsx +401 -138
  520. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  521. package/src/components/artifacts/artifact-sandbox.tsx +189 -0
  522. package/src/components/artifacts/artifact-surface.tsx +40 -20
  523. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  524. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  525. package/src/components/artifacts/document-editor.tsx +141 -16
  526. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  527. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  528. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  529. package/src/components/artifacts/editable-document.tsx +37 -36
  530. package/src/components/artifacts/editable-presentation.tsx +36 -18
  531. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  532. package/src/components/artifacts/index.ts +45 -0
  533. package/src/components/artifacts/inline-html-document.ts +24 -0
  534. package/src/components/artifacts/latest-task-runner.ts +49 -0
  535. package/src/components/artifacts/presentation-editor.tsx +323 -67
  536. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  537. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  538. package/src/components/artifacts/site-view.tsx +121 -0
  539. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  540. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  541. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  542. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  543. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  544. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  545. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  546. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  547. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  548. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  549. package/src/components/browser-select-control.tsx +312 -0
  550. package/src/components/browser-viewer.tsx +778 -318
  551. package/src/components/chat-composer.tsx +47 -5
  552. package/src/components/child-session-link.tsx +36 -0
  553. package/src/components/claude-mark.tsx +11 -0
  554. package/src/components/code-editor.tsx +13 -16
  555. package/src/components/composer-transcription-control.tsx +128 -30
  556. package/src/components/composer.tsx +404 -195
  557. package/src/components/computer-viewer.tsx +880 -253
  558. package/src/components/copy-button.tsx +13 -5
  559. package/src/components/desktop-viewer.tsx +1 -1
  560. package/src/components/enrollment-consent.tsx +1 -1
  561. package/src/components/enrollment-device-flow.tsx +1 -1
  562. package/src/components/file-browser.tsx +10 -14
  563. package/src/components/fleet-tile.tsx +9 -18
  564. package/src/components/generated-video-player.tsx +4 -2
  565. package/src/components/grok-mark.tsx +34 -0
  566. package/src/components/human-input-form.tsx +590 -283
  567. package/src/components/human-input-surface.tsx +11 -0
  568. package/src/components/interaction-intervention-banner.tsx +2 -2
  569. package/src/components/linkified-text.tsx +79 -0
  570. package/src/components/machine-card.tsx +35 -78
  571. package/src/components/machine-dock-bar.tsx +1 -1
  572. package/src/components/machine-input-display.ts +197 -3
  573. package/src/components/machines/agent-status-icon.tsx +31 -0
  574. package/src/components/machines/machine-detail.tsx +200 -31
  575. package/src/components/machines/machine-operation-policy.tsx +1 -1
  576. package/src/components/machines/machine-status.ts +241 -0
  577. package/src/components/machines-dashboard.tsx +2 -17
  578. package/src/components/markdown-table-layout.ts +143 -0
  579. package/src/components/markdown.tsx +466 -129
  580. package/src/components/message-timeline.tsx +2567 -728
  581. package/src/components/model-mark.tsx +102 -0
  582. package/src/components/model-picker.tsx +15 -4
  583. package/src/components/model-policy-picker-menu.tsx +371 -0
  584. package/src/components/model-policy-picker.tsx +256 -412
  585. package/src/components/new-conversation.tsx +221 -0
  586. package/src/components/open-geni-chat.tsx +309 -0
  587. package/src/components/open-geni-links.tsx +179 -0
  588. package/src/components/openrouter-mark.tsx +13 -0
  589. package/src/components/opper-mark.tsx +18 -0
  590. package/src/components/pierre-diff.tsx +41 -16
  591. package/src/components/pierre-file.tsx +35 -10
  592. package/src/components/preview-loading.tsx +109 -0
  593. package/src/components/provider-recovery-notice.tsx +49 -0
  594. package/src/components/queue-item-content.ts +14 -0
  595. package/src/components/queue-surface-implementation.tsx +51 -356
  596. package/src/components/queue-surface-state.tsx +3 -1
  597. package/src/components/rehype-secret-refs.ts +98 -0
  598. package/src/components/remark-soft-line-breaks.ts +166 -0
  599. package/src/components/sandbox-files.tsx +91 -15
  600. package/src/components/sandbox-terminal.tsx +84 -13
  601. package/src/components/sandbox-workspace.tsx +147 -51
  602. package/src/components/secret-question-field.tsx +324 -0
  603. package/src/components/secret-ref-chip.tsx +185 -0
  604. package/src/components/session-capability-frame.tsx +197 -0
  605. package/src/components/session-chrome.tsx +842 -251
  606. package/src/components/session-commands-panel.tsx +126 -0
  607. package/src/components/session-commands.tsx +18 -0
  608. package/src/components/session-connection-request.tsx +97 -0
  609. package/src/components/session-conversation.tsx +876 -0
  610. package/src/components/session-list.tsx +257 -0
  611. package/src/components/session-mcp-capability-card.tsx +680 -0
  612. package/src/components/session-proxy-scope.tsx +153 -0
  613. package/src/components/session-status.tsx +26 -17
  614. package/src/components/session-usage-limit-notice.tsx +174 -0
  615. package/src/components/timeline-anchor.tsx +119 -0
  616. package/src/components/timeline-annotation-chrome.tsx +196 -0
  617. package/src/components/timeline-annotation-layout.ts +268 -0
  618. package/src/components/timeline-annotation-markers.tsx +185 -0
  619. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  620. package/src/components/timeline-annotation-selection.tsx +106 -54
  621. package/src/components/timeline-annotation-shared.ts +245 -0
  622. package/src/components/timeline-annotations-dialog.tsx +185 -128
  623. package/src/components/timeline-annotations.tsx +189 -45
  624. package/src/components/timeline-reading-progress.ts +80 -0
  625. package/src/components/timeline-search.tsx +168 -0
  626. package/src/components/timeline-settlement.ts +60 -0
  627. package/src/components/tip-follow.ts +52 -0
  628. package/src/components/tool-action-review.tsx +650 -0
  629. package/src/components/tool-review-history.tsx +88 -0
  630. package/src/components/tooltip.tsx +38 -5
  631. package/src/components/usage-limit-notice.tsx +179 -0
  632. package/src/components/usage-member-list.tsx +792 -0
  633. package/src/components/usage-meter.tsx +382 -0
  634. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  635. package/src/components/user-message-body.tsx +27 -2
  636. package/src/components/workspace-dock.tsx +18 -1
  637. package/src/composer-messages.ts +150 -0
  638. package/src/composer-voice-events.ts +12 -0
  639. package/src/composer.ts +6 -1
  640. package/src/connect-account-identity.tsx +34 -0
  641. package/src/connect-accounts.tsx +233 -0
  642. package/src/connect-chooser.tsx +336 -0
  643. package/src/connect-panel.tsx +99 -0
  644. package/src/connect-setup.tsx +355 -0
  645. package/src/connect.ts +60 -0
  646. package/src/connection-assets.d.ts +4 -0
  647. package/src/connection-catalog.tsx +162 -0
  648. package/src/connection-discovery.tsx +238 -0
  649. package/src/connection-installed.tsx +51 -0
  650. package/src/connection-logo.tsx +37 -0
  651. package/src/connection-service-logo.tsx +55 -0
  652. package/src/connection-service-presentation.ts +46 -0
  653. package/src/connection-skeleton.tsx +16 -0
  654. package/src/connection-type-picker.tsx +36 -0
  655. package/src/conversation-timeline.ts +92 -0
  656. package/src/desktop.ts +24 -0
  657. package/src/device-authorization.tsx +98 -0
  658. package/src/diffs.ts +16 -0
  659. package/src/discovery-cache.ts +42 -0
  660. package/src/editor.ts +13 -0
  661. package/src/hooks/internal.ts +3 -2
  662. package/src/hooks/latest-question.ts +164 -0
  663. package/src/hooks/shared-machines-list.ts +34 -1
  664. package/src/hooks/shared-query.ts +721 -0
  665. package/src/hooks/use-attached-browsers.ts +1 -1
  666. package/src/hooks/use-auth-runs.ts +0 -27
  667. package/src/hooks/use-available-models.ts +21 -15
  668. package/src/hooks/use-browser-frame-stream.ts +19 -2
  669. package/src/hooks/use-browser-session.ts +680 -205
  670. package/src/hooks/use-browser-sessions.ts +32 -1
  671. package/src/hooks/use-client-config-flags.ts +118 -0
  672. package/src/hooks/use-codex-accounts.ts +247 -47
  673. package/src/hooks/use-composer.ts +276 -47
  674. package/src/hooks/use-computer-frame-stream.ts +25 -7
  675. package/src/hooks/use-computer-input-posture.ts +94 -0
  676. package/src/hooks/use-computer-session.ts +409 -95
  677. package/src/hooks/use-connect.ts +23 -0
  678. package/src/hooks/use-desktop-stream.ts +19 -28
  679. package/src/hooks/use-file-attachments.ts +80 -4
  680. package/src/hooks/use-goal.ts +107 -13
  681. package/src/hooks/use-last-started-turn-policy.ts +46 -14
  682. package/src/hooks/use-machines.ts +4 -0
  683. package/src/hooks/use-new-conversation.ts +374 -0
  684. package/src/hooks/use-new-session-draft.ts +813 -0
  685. package/src/hooks/use-realtime-voice-models.ts +46 -0
  686. package/src/hooks/use-sandbox-files.ts +68 -20
  687. package/src/hooks/use-session-background-commands.ts +22 -11
  688. package/src/hooks/use-session-capabilities.ts +3 -2
  689. package/src/hooks/use-session-conversation.ts +150 -0
  690. package/src/hooks/use-session-events.ts +703 -382
  691. package/src/hooks/use-session-lineage.ts +20 -16
  692. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  693. package/src/hooks/use-session-model-account.ts +174 -0
  694. package/src/hooks/use-session.ts +53 -21
  695. package/src/hooks/use-slash-commands.ts +6 -11
  696. package/src/hooks/use-supergrok-accounts.ts +22 -8
  697. package/src/hooks/use-terminal-stream.ts +153 -27
  698. package/src/hooks/use-transcription.ts +6 -0
  699. package/src/hooks/use-turn-queue.ts +2 -1
  700. package/src/hooks/use-usage.ts +100 -0
  701. package/src/hooks/use-vaults.ts +153 -0
  702. package/src/hooks/use-video-artifact-playback.ts +1 -1
  703. package/src/hooks/use-voice-input.ts +127 -19
  704. package/src/hooks/use-workspace-capture.ts +3 -2
  705. package/src/hooks/use-workspace-edit.ts +23 -5
  706. package/src/hooks/use-workspace-sessions.ts +97 -32
  707. package/src/human-input-model.ts +359 -0
  708. package/src/identity-link-accounts.tsx +148 -0
  709. package/src/identity-link-consent.tsx +192 -0
  710. package/src/index.ts +262 -16
  711. package/src/interaction.ts +1 -0
  712. package/src/lib/clipboard.ts +29 -0
  713. package/src/lib/error-message.ts +37 -0
  714. package/src/lib/format.ts +213 -16
  715. package/src/lib/host-theme.ts +529 -0
  716. package/src/lib/interaction-errors.ts +15 -0
  717. package/src/lib/menu-styles.ts +44 -0
  718. package/src/lib/notify-observer.ts +15 -0
  719. package/src/lib/pierre-diffs-loader.ts +53 -0
  720. package/src/lib/provider-recovery.ts +243 -0
  721. package/src/lib/scrollbars.ts +30 -0
  722. package/src/lib/terminal-input-readiness.ts +51 -0
  723. package/src/lib/transient-retry.ts +99 -0
  724. package/src/lib/workbench-peers.ts +62 -0
  725. package/src/lib/xterm-theme.ts +23 -21
  726. package/src/mcp-connection-status.ts +35 -0
  727. package/src/model-mark-paths.ts +53 -0
  728. package/src/model-picker-model.ts +330 -0
  729. package/src/model-policy.ts +299 -74
  730. package/src/native-previews.ts +100 -0
  731. package/src/new-session-draft.ts +22 -0
  732. package/src/notification-text.ts +81 -0
  733. package/src/older-history.ts +22 -4
  734. package/src/organization-model.ts +118 -0
  735. package/src/plugin-details.tsx +185 -0
  736. package/src/plugin-discovery.tsx +196 -0
  737. package/src/preview-loading-paint.ts +68 -0
  738. package/src/provider.tsx +74 -15
  739. package/src/queue-presentation-model.ts +464 -0
  740. package/src/realtime/dropdown-menu.tsx +19 -12
  741. package/src/realtime/embedded-new-voice.tsx +1 -0
  742. package/src/realtime/embedded-voice.tsx +3 -0
  743. package/src/realtime/realtime-control.tsx +138 -501
  744. package/src/realtime/session-realtime.ts +566 -0
  745. package/src/sandbox-label-model.ts +53 -0
  746. package/src/scrollbars.ts +3 -0
  747. package/src/secret-reference-label.ts +43 -0
  748. package/src/secrets-ui.tsx +59 -0
  749. package/src/session-agents-model.ts +33 -0
  750. package/src/session-attention-model.ts +62 -0
  751. package/src/session-auth-recommendation.ts +48 -0
  752. package/src/session-capability-policy.ts +196 -0
  753. package/src/session-context.ts +3 -4
  754. package/src/session-feedback-model.ts +95 -0
  755. package/src/session-list-model.ts +434 -0
  756. package/src/session-realtime.ts +18 -0
  757. package/src/session-status-model.ts +99 -0
  758. package/src/session-ui.ts +98 -1
  759. package/src/session.ts +17 -1
  760. package/src/site-snapshot.ts +74 -0
  761. package/src/sites-ui.tsx +348 -0
  762. package/src/sites.ts +3 -0
  763. package/src/skill-discovery.tsx +208 -0
  764. package/src/terminal.ts +26 -0
  765. package/src/testing/session-scenarios.ts +404 -0
  766. package/src/timeline/activity-rail.tsx +242 -101
  767. package/src/timeline/agent-identity.tsx +84 -0
  768. package/src/timeline/agent-row.tsx +231 -0
  769. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  770. package/src/timeline/compaction-copy.ts +115 -0
  771. package/src/timeline/entrance.tsx +28 -3
  772. package/src/timeline/fleet-decision-projection.ts +2 -1
  773. package/src/timeline/fleet-decision-row.tsx +1 -0
  774. package/src/timeline/focus-sequence.ts +44 -0
  775. package/src/timeline/genie-copy.ts +19 -0
  776. package/src/timeline/genie-loading.tsx +143 -0
  777. package/src/timeline/index.ts +30 -2
  778. package/src/timeline/knowledge-receipt.tsx +100 -0
  779. package/src/timeline/message-sender.tsx +71 -0
  780. package/src/timeline/notice-presentation.ts +48 -0
  781. package/src/timeline/parsers.ts +42 -2
  782. package/src/timeline/patch-apply-command.tsx +135 -0
  783. package/src/timeline/platform-activity-presentation.ts +166 -0
  784. package/src/timeline/platform-activity-row.tsx +15 -90
  785. package/src/timeline/presented-image.ts +63 -0
  786. package/src/timeline/projection.ts +1746 -76
  787. package/src/timeline/provider-logo.tsx +53 -0
  788. package/src/timeline/question-nav-model.ts +28 -0
  789. package/src/timeline/registry.ts +26 -4
  790. package/src/timeline/retained-image.ts +97 -0
  791. package/src/timeline/retained-loaders.ts +91 -0
  792. package/src/timeline/rolling-activity.tsx +80 -0
  793. package/src/timeline/screenshot-lightbox.tsx +228 -5
  794. package/src/timeline/session-usage-limit-row.tsx +42 -0
  795. package/src/timeline/shared.tsx +42 -15
  796. package/src/timeline/startup-dispatch-details.tsx +36 -0
  797. package/src/timeline/startup-preference.ts +33 -0
  798. package/src/timeline/startup-timings.tsx +145 -0
  799. package/src/timeline/tool-display-name.ts +19 -7
  800. package/src/timeline/tool-presentation.ts +1316 -0
  801. package/src/timeline/tool-renderers.tsx +835 -1138
  802. package/src/timeline/turn-summary-model.ts +343 -0
  803. package/src/timeline/turn-summary.tsx +272 -365
  804. package/src/timeline/types.ts +189 -6
  805. package/src/timeline/work-presentation.ts +189 -0
  806. package/src/timeline-model.ts +143 -0
  807. package/src/usage/allowance-copy.ts +64 -0
  808. package/src/usage/session-usage-limit.ts +266 -0
  809. package/src/usage/summary.ts +93 -0
  810. package/src/usage.ts +70 -0
  811. package/src/voice-recording-owner.ts +22 -0
  812. package/styles/compiled.css +2319 -748
  813. package/styles/connect.css +290 -0
  814. package/styles/connect.d.ts +1 -0
  815. package/styles/effective-tokens.css +1 -0
  816. package/styles/index.css +309 -9
  817. package/styles/responsive.css +99 -7
  818. package/styles/session-capability.css +44 -0
  819. package/styles/tokens.css +134 -66
  820. package/dist/browser-viewer-AEFHUYZK.js +0 -14
  821. package/dist/chunk-4MDLEHXL.js.map +0 -1
  822. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  823. package/dist/chunk-D3UIAJKY.js.map +0 -1
  824. package/dist/chunk-ELIYWBZR.js.map +0 -1
  825. package/dist/chunk-H5YGYNXS.js.map +0 -1
  826. package/dist/chunk-HQVCKCLG.js +0 -9458
  827. package/dist/chunk-HQVCKCLG.js.map +0 -1
  828. package/dist/chunk-HUIKIDM5.js.map +0 -1
  829. package/dist/chunk-ICA6R6TW.js.map +0 -1
  830. package/dist/chunk-JVYQRRC4.js.map +0 -1
  831. package/dist/chunk-KCGXPP5V.js.map +0 -1
  832. package/dist/chunk-KZ73RL76.js.map +0 -1
  833. package/dist/chunk-LAKLF4PA.js +0 -141
  834. package/dist/chunk-LAKLF4PA.js.map +0 -1
  835. package/dist/chunk-MZ2G2XBA.js.map +0 -1
  836. package/dist/chunk-NEXLLTP4.js.map +0 -1
  837. package/dist/chunk-OAM4WAAM.js.map +0 -1
  838. package/dist/chunk-PEI6RANI.js.map +0 -1
  839. package/dist/chunk-RGALCTWO.js.map +0 -1
  840. package/dist/chunk-W6NFJXSA.js +0 -454
  841. package/dist/chunk-W6NFJXSA.js.map +0 -1
  842. package/dist/chunk-WSK7G5LE.js +0 -170
  843. package/dist/chunk-WSK7G5LE.js.map +0 -1
  844. package/dist/chunk-X4A66EWZ.js +0 -223
  845. package/dist/chunk-X4A66EWZ.js.map +0 -1
  846. package/dist/chunk-XXWH2JLC.js.map +0 -1
  847. package/dist/chunk-YFKJ7VZH.js +0 -268
  848. package/dist/chunk-YFKJ7VZH.js.map +0 -1
  849. package/dist/chunk-YJFGAFBD.js.map +0 -1
  850. package/dist/computer-viewer-FWEZISW4.js +0 -16
  851. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  852. package/dist/hooks/use-environments.d.ts +0 -41
  853. package/dist/hooks/use-packs.d.ts +0 -32
  854. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  855. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  856. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  857. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  858. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  859. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  860. package/src/hooks/use-environments.ts +0 -182
  861. package/src/hooks/use-packs.ts +0 -157
  862. /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  863. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
@@ -1,5 +1,7 @@
1
1
  import {
2
2
  Children,
3
+ createContext,
4
+ useContext,
3
5
  isValidElement,
4
6
  memo,
5
7
  useEffect,
@@ -13,17 +15,40 @@ import {
13
15
  import ReactMarkdown, {
14
16
  defaultUrlTransform,
15
17
  type Components,
18
+ type ExtraProps,
16
19
  type UrlTransform,
17
20
  } from "react-markdown";
18
21
  import remarkGfm from "remark-gfm";
22
+ import { PanelsTopLeftIcon } from "lucide-react";
23
+ import { ActivityDisclosure } from "../timeline/shared";
19
24
  import { cn } from "../lib/cn";
20
25
  import { tableElementToTsv } from "../lib/clipboard";
21
26
  import { prefersReducedMotion } from "../lib/motion";
22
27
  import { MOTION_INSPECT_SCALE } from "../lib/motion-inspect";
23
28
  import { CopyButton } from "./copy-button";
29
+ import { PreviewLoading } from "./preview-loading";
30
+ import type { observeMarkdownTableLayout } from "./markdown-table-layout";
31
+ import { remarkSoftLineBreaks } from "./remark-soft-line-breaks";
32
+ import { rehypeSecretRefs } from "./rehype-secret-refs";
33
+ import { mayContainSecretReference, SecretRefChip } from "./secret-ref-chip";
34
+ import { useSecretsUi } from "../secrets-ui";
24
35
  import { softenStreamingMarkdown } from "./soften-streaming-markdown";
25
36
  import { createStreamReveal, rehypeStreamReveal, type StreamReveal } from "./stream-reveal";
26
37
  import { TooltipProvider } from "./tooltip";
38
+ import { searchMatchOffset, type TimelineSearchTarget } from "./timeline-search";
39
+ import {
40
+ parseOpenGeniLink,
41
+ parseSandboxLink,
42
+ parseRetainedFileReference,
43
+ isReservedOpenGeniLink,
44
+ openGeniLinkScheme,
45
+ type OpenGeniLinkTarget,
46
+ } from "@opengeni/sdk";
47
+ import {
48
+ chainLinkResolvers,
49
+ useOpenGeniLinkResolver,
50
+ type OpenGeniLinkResolver,
51
+ } from "./open-geni-links";
27
52
 
28
53
  /**
29
54
  * The default renderer for chat message bodies in {@link MessageTimeline}.
@@ -39,9 +64,35 @@ import { TooltipProvider } from "./tooltip";
39
64
  * the tokens land. Consumers who want a different renderer can still pass
40
65
  * `renderMessageText` to `MessageTimeline` to override this entirely.
41
66
  */
67
+ export type MarkdownInteractiveBlock = { kind: "html" | "site"; content: string };
68
+ const InteractiveContext = createContext<{
69
+ source: string;
70
+ streaming?: boolean | undefined;
71
+ render?: (block: MarkdownInteractiveBlock) => ReactNode;
72
+ renderImage?: (image: { src: string; alt: string }) => ReactNode;
73
+ suppressImages?: boolean;
74
+ }>({ source: "" });
75
+
42
76
  export type MarkdownProps = {
77
+ /** Resolve a retained-file reference to the host's authenticated artifact page. */
78
+ artifactHref?: ((artifactId: string) => string) | undefined;
79
+ /** Reveals a bounded source excerpt; closing Find retains it until explicit restore. */
80
+ searchTarget?: TimelineSearchTarget | null | undefined;
81
+ renderImage?: ((image: { src: string; alt: string }) => ReactNode) | undefined;
82
+ /** Show alt text without loading image URLs (e.g. in search previews). */
83
+ suppressImages?: boolean | undefined;
84
+ /** Host opt-in for assistant-authored interactive fences. */
85
+ renderInteractiveBlock?: ((block: MarkdownInteractiveBlock) => ReactNode) | undefined;
43
86
  children: string;
44
87
  className?: string | undefined;
88
+ /**
89
+ * Render a single newline inside prose as a line break (`<br>`), the way chat
90
+ * apps show messages; CommonMark otherwise folds it into a space. Chat message
91
+ * bodies enable this. Leave it off for documents and other authored Markdown.
92
+ * Code (fenced and inline), lists, tables, and blank-line paragraphs are
93
+ * unaffected either way.
94
+ */
95
+ softLineBreaks?: boolean | undefined;
45
96
  /**
46
97
  * While true, newly arrived source fades in through tip ink (`.og-stream-ink`):
47
98
  * an age window over each append batch — fast streams keep a large soft band,
@@ -56,6 +107,13 @@ export type MarkdownProps = {
56
107
  * exact decoded `sandbox:` payload; `line`, when present, is 1-based.
57
108
  */
58
109
  onSandboxFile?: ((path: string, line?: number) => void | Promise<void>) | undefined;
110
+ /**
111
+ * Resolve Opengeni object links (`artifact:`, `sandbox:`, editable
112
+ * artifacts, Sites) to a host URL or action. Asked before any
113
+ * {@link OpenGeniLinkProvider} above this body; `artifactHref` and
114
+ * `onSandboxFile` still win for their own kinds.
115
+ */
116
+ resolveLink?: OpenGeniLinkResolver | undefined;
59
117
  };
60
118
 
61
119
  /** Exact target path plus optional 1-based line from a markdown href. */
@@ -90,7 +148,7 @@ const baseComponents: Components = {
90
148
  ),
91
149
  h4: ({ children, ...props }) => (
92
150
  <h4
93
- className="mt-4 mb-1.5 text-og-sm font-semibold uppercase tracking-[0.04em] text-og-fg-muted first:mt-0"
151
+ className="mt-4 mb-1.5 text-og-sm font-semibold uppercase tracking-[0.04em] text-og-fg first:mt-0"
94
152
  {...props}
95
153
  >
96
154
  {children}
@@ -163,14 +221,14 @@ const baseComponents: Components = {
163
221
  // the `pre` renderer), so a `code` reaching here is treated as inline.
164
222
  code: ({ children, className: _className, ...props }) => (
165
223
  <code
166
- className="rounded-og-xs bg-og-surface-1 px-1 py-0.5 font-og-mono text-og-sm text-og-fg"
224
+ className="rounded-og-xs bg-og-surface-2 px-1 py-0.5 font-og-mono text-og-sm text-og-fg"
167
225
  {...props}
168
226
  >
169
227
  {children}
170
228
  </code>
171
229
  ),
172
230
  // Fenced code — quiet mono block (no card / no nested vertical scroll).
173
- pre: ({ children }) => <MarkdownCodeBlock>{children}</MarkdownCodeBlock>,
231
+ pre: InteractiveCodeBlock,
174
232
  // Tables stay unboxed (hairline rules); hover reveals a TSV copy control.
175
233
  table: ({ children, ...props }) => <MarkdownTable {...props}>{children}</MarkdownTable>,
176
234
  thead: ({ children, ...props }) => <thead {...props}>{children}</thead>,
@@ -184,111 +242,201 @@ const baseComponents: Components = {
184
242
  ),
185
243
  td: ({ children, ...props }) => (
186
244
  <td
187
- className="border-b border-og-border/70 px-0 py-1.5 pr-4 align-top text-og-fg-muted [tr:last-child>&]:border-b-0"
245
+ className="border-b border-og-border/70 px-0 py-1.5 pr-4 align-top text-og-fg-muted"
188
246
  {...props}
189
247
  >
190
248
  {children}
191
249
  </td>
192
250
  ),
193
- img: ({ alt, src, ...props }) =>
194
- src ? (
195
- <img
196
- alt={alt ?? ""}
197
- src={src}
198
- className="my-3 max-w-full rounded-og-md border border-og-border"
199
- {...props}
200
- />
201
- ) : alt ? (
202
- <span className="text-og-fg-subtle" aria-disabled="true">
203
- {alt}
204
- </span>
205
- ) : null,
251
+ img: MarkdownImage,
206
252
  };
207
253
 
208
- const MARKDOWN_LINK_CLASS =
209
- "break-words font-medium text-og-accent-strong underline-offset-2 hover:underline";
254
+ const MARKDOWN_LINK_CLASS = "break-words font-medium og-link";
255
+
256
+ // Keep renderer component types stable: rebuilding them remounts paragraphs,
257
+ // destroys native selections, and resets embedded media on host updates.
258
+ const MarkdownLinkContext = createContext<
259
+ Pick<MarkdownProps, "onSandboxFile" | "artifactHref" | "resolveLink">
260
+ >({});
261
+
262
+ const UNAVAILABLE_LABEL: Record<Exclude<OpenGeniLinkTarget["kind"], "sandbox-file">, string> = {
263
+ file: "This file needs a workspace-aware host to open",
264
+ "editable-artifact": "This artifact needs a workspace-aware host to open",
265
+ site: "This Site needs a workspace-aware host to open",
266
+ };
210
267
 
211
- function markdownComponents(onSandboxFile: MarkdownProps["onSandboxFile"]): Components {
212
- return {
213
- ...baseComponents,
214
- a: ({ children, href, ...props }) => {
215
- const location = sandboxFileLocationFromHref(href);
216
- if (location !== null) {
268
+ function linkActionTitle(target: OpenGeniLinkTarget): string {
269
+ if (target.kind === "sandbox-file") {
270
+ return target.line !== null
271
+ ? `Open ${target.path} at line ${target.line}`
272
+ : `Open ${target.path}`;
273
+ }
274
+ return target.kind === "file"
275
+ ? "Open file"
276
+ : target.kind === "site"
277
+ ? "Open Site"
278
+ : "Open artifact";
279
+ }
280
+
281
+ /** A `rehypeSecretRefs` placeholder becomes a chip; every other span passes through. */
282
+ function MarkdownSpan({
283
+ node: _node,
284
+ children,
285
+ ...props
286
+ }: ComponentPropsWithoutRef<"span"> & ExtraProps) {
287
+ const raw = (props as Record<string, unknown>)["data-og-secret-ref"];
288
+ if (typeof raw === "string") return <MarkdownSecretRef raw={raw}>{children}</MarkdownSecretRef>;
289
+ return <span {...props}>{children}</span>;
290
+ }
291
+
292
+ function MarkdownSecretRef({ raw, children }: { raw: string; children?: ReactNode }) {
293
+ const ui = useSecretsUi();
294
+ const token = ui?.tokenize(raw).find((candidate) => candidate.type === "reference");
295
+ if (!token || token.type !== "reference") return <>{children}</>;
296
+ return <SecretRefChip reference={token.reference} />;
297
+ }
298
+
299
+ const markdownComponents: Components = {
300
+ ...baseComponents,
301
+ span: MarkdownSpan,
302
+ p: ({ children, node, ...props }) => {
303
+ const containsArtifact = node?.children.some(
304
+ (child) =>
305
+ child.type === "element" &&
306
+ child.tagName === "img" &&
307
+ typeof child.properties.src === "string" &&
308
+ retainedImageId(child.properties.src),
309
+ );
310
+ const Tag = containsArtifact ? "div" : "p";
311
+ return (
312
+ <Tag className="my-2.5 leading-7 first:mt-0 last:mb-0" {...props}>
313
+ {children}
314
+ </Tag>
315
+ );
316
+ },
317
+ a: ({ children, href, ...props }) => {
318
+ const { onSandboxFile, artifactHref, resolveLink } = useContext(MarkdownLinkContext);
319
+ const inherited = useOpenGeniLinkResolver();
320
+ const target = parseOpenGeniLink(href);
321
+ if (target) {
322
+ // Explicit per-kind props keep their historical precedence.
323
+ if (target.kind === "file" && target.workspaceId === null && artifactHref) {
324
+ const destination = defaultUrlTransform(artifactHref(target.fileId));
325
+ if (destination) {
326
+ return (
327
+ <a
328
+ className={MARKDOWN_LINK_CLASS}
329
+ href={destination}
330
+ target="_blank"
331
+ rel="noreferrer noopener"
332
+ >
333
+ {children}
334
+ </a>
335
+ );
336
+ }
337
+ }
338
+ const resolution =
339
+ target.kind === "sandbox-file" && onSandboxFile
340
+ ? { open: () => onSandboxFile(target.path, target.line ?? undefined) }
341
+ : chainLinkResolvers(resolveLink, inherited)?.(target);
342
+ const destination = resolution?.href ? defaultUrlTransform(resolution.href) : "";
343
+ if (destination) {
344
+ return (
345
+ <a
346
+ className={MARKDOWN_LINK_CLASS}
347
+ href={destination}
348
+ target="_blank"
349
+ rel="noreferrer noopener"
350
+ >
351
+ {children}
352
+ </a>
353
+ );
354
+ }
355
+ if (resolution?.open) {
217
356
  return (
218
- <SandboxMarkdownLink location={location} onSandboxFile={onSandboxFile}>
357
+ <ActionMarkdownLink title={linkActionTitle(target)} onOpen={resolution.open}>
219
358
  {children}
220
- </SandboxMarkdownLink>
359
+ </ActionMarkdownLink>
221
360
  );
222
361
  }
223
- if (isSandboxHref(href) || !href) {
362
+ if (target.kind === "sandbox-file") {
224
363
  return (
225
364
  <span
226
365
  className="break-words font-medium text-og-fg-subtle underline decoration-dotted underline-offset-2"
227
366
  aria-disabled="true"
228
- title={
229
- isSandboxHref(href)
230
- ? "This sandbox file reference is invalid"
231
- : "This link is unavailable"
232
- }
367
+ title="This sandbox file requires a session-aware handler"
233
368
  >
234
369
  {children}
235
370
  </span>
236
371
  );
237
372
  }
373
+ // Never navigate: a console path resolves against the host origin and 404s.
238
374
  return (
239
- <a
240
- className={MARKDOWN_LINK_CLASS}
241
- target="_blank"
242
- rel="noreferrer noopener"
243
- href={href}
244
- {...props}
375
+ <span title={UNAVAILABLE_LABEL[target.kind]} data-og-link-unavailable={target.kind}>
376
+ {children} (artifact unavailable)
377
+ </span>
378
+ );
379
+ }
380
+ if (isReservedOpenGeniLink(href) || !href) {
381
+ return (
382
+ <span
383
+ className="break-words text-og-fg-subtle"
384
+ aria-disabled="true"
385
+ title={
386
+ isSandboxHref(href)
387
+ ? "This sandbox file reference is invalid"
388
+ : "This link is unavailable"
389
+ }
245
390
  >
246
- {children}
247
- </a>
391
+ {children} (link unavailable)
392
+ </span>
248
393
  );
249
- },
250
- };
251
- }
394
+ }
395
+ return (
396
+ <a
397
+ className={MARKDOWN_LINK_CLASS}
398
+ target="_blank"
399
+ rel="noreferrer noopener"
400
+ href={href}
401
+ {...props}
402
+ >
403
+ {children}
404
+ </a>
405
+ );
406
+ },
407
+ };
252
408
 
253
- function SandboxMarkdownLink({
254
- location,
255
- onSandboxFile,
409
+ function ActionMarkdownLink({
410
+ title,
411
+ onOpen,
256
412
  children,
257
413
  }: {
258
- location: SandboxFileLocation;
259
- onSandboxFile: MarkdownProps["onSandboxFile"];
414
+ title: string;
415
+ onOpen: () => void | Promise<void>;
260
416
  children: ReactNode;
261
417
  }) {
262
418
  const [state, setState] = useState<"idle" | "loading" | "error">("idle");
263
- const { path, line } = location;
264
- if (!onSandboxFile) {
265
- return (
266
- <span
267
- className="break-words font-medium text-og-fg-subtle underline decoration-dotted underline-offset-2"
268
- aria-disabled="true"
269
- title="This sandbox file requires a session-aware handler"
270
- >
271
- {children}
272
- </span>
273
- );
274
- }
275
- const idleTitle = line !== null ? `Open ${path} at line ${line}` : `Open ${path}`;
276
419
  return (
277
420
  <button
278
421
  type="button"
279
422
  className={cn(
280
423
  MARKDOWN_LINK_CLASS,
281
- "inline-flex min-h-7 cursor-pointer items-center disabled:cursor-wait disabled:opacity-70 pointer-coarse:min-h-11",
424
+ "inline-flex min-h-7 cursor-pointer items-center aria-disabled:cursor-wait aria-disabled:opacity-70 pointer-coarse:min-h-11",
282
425
  )}
283
- disabled={state === "loading"}
426
+ // Not `disabled`: disabling the focused control drops focus to the page,
427
+ // so a host viewer could not return focus to the link that opened it.
428
+ aria-disabled={state === "loading" || undefined}
284
429
  aria-busy={state === "loading"}
285
- title={state === "error" ? "Couldn't open this file. Select to retry." : idleTitle}
430
+ title={state === "error" ? "Couldn't open this file. Select to retry." : title}
286
431
  onClick={() => {
432
+ if (state === "loading") return;
287
433
  setState("loading");
288
- void Promise.resolve(onSandboxFile(path, line ?? undefined)).then(
289
- () => setState("idle"),
290
- () => setState("error"),
291
- );
434
+ void Promise.resolve()
435
+ .then(onOpen)
436
+ .then(
437
+ () => setState("idle"),
438
+ () => setState("error"),
439
+ );
292
440
  }}
293
441
  >
294
442
  {children}
@@ -297,44 +445,18 @@ function SandboxMarkdownLink({
297
445
  );
298
446
  }
299
447
 
300
- const SANDBOX_SCHEME = "sandbox:";
301
- const LEGACY_WORKSPACE_PREFIX = "/workspace/";
302
- const TRAILING_LINE = /:([0-9]+)$/u;
303
- const TRAILING_INVALID_LINE = /:-(?:[0-9]+)$|:[0-9]+-[0-9]+$/u;
304
- const CONTROL_CHARACTER = /[\u0000-\u001f\u007f]/u;
305
-
306
448
  function isSandboxHref(href: string | undefined): boolean {
307
- return href?.startsWith(SANDBOX_SCHEME) ?? false;
449
+ return openGeniLinkScheme(href) === "sandbox";
308
450
  }
309
451
 
310
452
  /**
311
- * Parse an OpenGeni `sandbox:` application href (plus the historical bare
453
+ * Parse an Opengeni `sandbox:` application href (plus the historical bare
312
454
  * `/workspace/...` form). The decoded path is intentionally opaque here:
313
455
  * target selection, path policy, and filesystem authority belong to the
314
456
  * session-aware host and its FileSystem boundary.
315
457
  */
316
458
  export function sandboxFileLocationFromHref(href: string | undefined): SandboxFileLocation | null {
317
- if (!href) return null;
318
- const encodedLocation = isSandboxHref(href)
319
- ? href.slice(SANDBOX_SCHEME.length)
320
- : href.startsWith(LEGACY_WORKSPACE_PREFIX)
321
- ? href
322
- : null;
323
- if (!encodedLocation || encodedLocation.includes("?") || encodedLocation.includes("#")) {
324
- return null;
325
- }
326
- if (TRAILING_INVALID_LINE.test(encodedLocation)) return null;
327
- const lineMatch = TRAILING_LINE.exec(encodedLocation);
328
- const encodedPath = lineMatch ? encodedLocation.slice(0, -lineMatch[0].length) : encodedLocation;
329
- const line = lineMatch?.[1] ? Number(lineMatch[1]) : null;
330
- if (line !== null && (!Number.isSafeInteger(line) || line < 1)) return null;
331
- if (!encodedPath) return null;
332
- try {
333
- const path = decodeURIComponent(encodedPath);
334
- return path && !CONTROL_CHARACTER.test(path) ? { path, line } : null;
335
- } catch {
336
- return null;
337
- }
459
+ return parseSandboxLink(href);
338
460
  }
339
461
 
340
462
  /** Return the exact decoded path for a supported sandbox-link href. */
@@ -342,8 +464,28 @@ export function sandboxFilePathFromHref(href: string | undefined): string | null
342
464
  return sandboxFileLocationFromHref(href)?.path ?? null;
343
465
  }
344
466
 
467
+ export function retainedImageId(src: string): string | null {
468
+ return parseRetainedFileReference(src);
469
+ }
470
+ function MarkdownImage({ src, alt }: ComponentPropsWithoutRef<"img">) {
471
+ const { renderImage, suppressImages } = useContext(InteractiveContext);
472
+ if (suppressImages)
473
+ return <span data-og-image-placeholder="">{alt || "Image"} (preview unavailable)</span>;
474
+ if (!src) return <span>{alt ?? "Image unavailable"}</span>;
475
+ if (retainedImageId(src))
476
+ return renderImage ? (
477
+ <>{renderImage({ src, alt: alt ?? "" })}</>
478
+ ) : (
479
+ <span>{alt || "Image"} (preview unavailable)</span>
480
+ );
481
+ return <img src={src} alt={alt ?? ""} loading="lazy" className="my-3 max-w-full rounded-og-md" />;
482
+ }
483
+
345
484
  const markdownUrlTransform: UrlTransform = (url, key, node) =>
346
- key === "href" && node.tagName === "a" && isSandboxHref(url) ? url : defaultUrlTransform(url);
485
+ (key === "href" && node.tagName === "a" && isReservedOpenGeniLink(url)) ||
486
+ (key === "src" && node.tagName === "img" && retainedImageId(url))
487
+ ? url
488
+ : defaultUrlTransform(url);
347
489
 
348
490
  /** How long after the stream ends the reveal pipeline stays for trailing animations. */
349
491
  /** Trailing ink window after stream end — keep ≥ {@link INK_FADE_MS}. */
@@ -381,6 +523,58 @@ function fenceLanguage(children: ReactNode): string | null {
381
523
  return found;
382
524
  }
383
525
 
526
+ function InteractiveCodeBlock({ children, node }: ComponentPropsWithoutRef<"pre"> & ExtraProps) {
527
+ const { source, render, streaming } = useContext(InteractiveContext);
528
+ const language = fenceLanguage(children);
529
+ if (render && (language === "opengeni-html" || language === "opengeni-site")) {
530
+ const start = node?.position?.start.offset;
531
+ const end = node?.position?.end.offset;
532
+ const original =
533
+ start !== undefined && end !== undefined && end <= source.length
534
+ ? source.slice(start, end)
535
+ : "";
536
+ const lines = original.trimEnd().split("\n");
537
+ const opening = lines[0]?.match(/^ {0,3}([\x60]{3,}|~{3,})/);
538
+
539
+ const closing = lines
540
+ .at(-1)
541
+ ?.replace(/^\s*(?:>\s*)+/, "")
542
+ .trim();
543
+ const complete =
544
+ opening &&
545
+ lines.length > 1 &&
546
+ closing &&
547
+ closing.length >= opening[1]!.length &&
548
+ [...closing].every((c) => c === opening[1]![0]);
549
+ if (!complete) {
550
+ return (
551
+ <div role="status" aria-live="polite" aria-busy={streaming === true} className="my-3">
552
+ {streaming ? (
553
+ <PreviewLoading />
554
+ ) : (
555
+ <ActivityDisclosure
556
+ icon={<PanelsTopLeftIcon aria-hidden className="size-3.5" />}
557
+ title="Preview incomplete"
558
+ running={false}
559
+ expandable={false}
560
+ preview="Generation stopped before the preview was ready."
561
+ />
562
+ )}
563
+ </div>
564
+ );
565
+ }
566
+ return (
567
+ <>
568
+ {render({
569
+ kind: language === "opengeni-html" ? "html" : "site",
570
+ content: nodeText(children).replace(/\n$/, ""),
571
+ })}
572
+ </>
573
+ );
574
+ }
575
+ return <MarkdownCodeBlock>{children}</MarkdownCodeBlock>;
576
+ }
577
+
384
578
  function MarkdownCodeBlock({ children }: { children?: ReactNode }) {
385
579
  const code = nodeText(children).replace(/\n$/, "");
386
580
  const language = fenceLanguage(children);
@@ -411,10 +605,41 @@ function MarkdownCodeBlock({ children }: { children?: ReactNode }) {
411
605
  }
412
606
 
413
607
  function MarkdownTable({ children, className, ...props }: ComponentPropsWithoutRef<"table">) {
414
- const tableRef = useRef<HTMLTableElement | null>(null);
608
+ const wrapperRef = useRef<HTMLDivElement>(null);
609
+ const tableRef = useRef<HTMLTableElement>(null);
610
+ const layoutRef = useRef<ReturnType<typeof observeMarkdownTableLayout>>(undefined);
611
+ useEffect(() => {
612
+ const wrapper = wrapperRef.current;
613
+ const table = tableRef.current;
614
+ if (!wrapper?.closest("[data-og-wide-table-message]") || !table) return;
615
+ let disposed = false;
616
+ // Ordinary tables remain usable even if this optional layout chunk fails.
617
+ void import("./markdown-table-layout")
618
+ .then(({ observeMarkdownTableLayout }) => {
619
+ if (!disposed) layoutRef.current = observeMarkdownTableLayout(wrapper, table);
620
+ })
621
+ .catch(() => {});
622
+ return () => {
623
+ disposed = true;
624
+ layoutRef.current?.disconnect();
625
+ layoutRef.current = undefined;
626
+ };
627
+ }, []);
628
+ // ReactMarkdown recreates table children even when only later prose changes.
629
+ // Remeasure genuine content changes without collapsing the expanded wrapper
630
+ // between cleanup and the asynchronous observer-module import on each update.
631
+ useEffect(() => {
632
+ layoutRef.current?.measure();
633
+ }, [children]);
415
634
  return (
416
- <div className="group/copy relative mt-3 max-w-full first:mt-0">
417
- <div className="pointer-events-none absolute top-0 right-0 z-10">
635
+ // Touch shows the copy action permanently at full touch size, so it sits
636
+ // under the table there instead of covering the right-aligned header.
637
+ <div
638
+ ref={wrapperRef}
639
+ data-og-table=""
640
+ className="group/copy relative mt-3 max-w-full first:mt-0 pointer-coarse:pb-11"
641
+ >
642
+ <div className="pointer-events-none absolute top-0 right-0 z-10 pointer-coarse:top-auto pointer-coarse:bottom-0">
418
643
  <div className="pointer-events-auto">
419
644
  <CopyButton
420
645
  text={() => tableElementToTsv(tableRef.current)}
@@ -426,7 +651,12 @@ function MarkdownTable({ children, className, ...props }: ComponentPropsWithoutR
426
651
  <div className="overflow-x-auto" tabIndex={0}>
427
652
  <table
428
653
  ref={tableRef}
429
- className={cn("w-full min-w-0 border-collapse text-og-base", className)}
654
+ className={cn(
655
+ // Leading `&` only: a trailing one (`tr:last-child>&`) under the scoped
656
+ // selector list needs `:is()`, which bundlers warn about for older targets.
657
+ "w-full min-w-0 border-collapse text-og-base [&_tr:last-child>td]:border-b-0",
658
+ className,
659
+ )}
430
660
  {...props}
431
661
  >
432
662
  {children}
@@ -436,7 +666,26 @@ function MarkdownTable({ children, className, ...props }: ComponentPropsWithoutR
436
666
  );
437
667
  }
438
668
 
439
- function MarkdownImpl({ children, className, streaming = false, onSandboxFile }: MarkdownProps) {
669
+ type RemarkPlugins = NonNullable<Parameters<typeof ReactMarkdown>[0]["remarkPlugins"]>;
670
+ const REMARK_PLUGINS: RemarkPlugins = [remarkGfm];
671
+ // Structural plugin types (see remark-soft-line-breaks.ts) need one cast at the seam.
672
+ const SOFT_LINE_BREAK_REMARK_PLUGINS = [
673
+ remarkGfm,
674
+ remarkSoftLineBreaks,
675
+ ] as unknown as RemarkPlugins;
676
+
677
+ function MarkdownImpl({
678
+ children,
679
+ artifactHref,
680
+ className,
681
+ softLineBreaks = false,
682
+ streaming = false,
683
+ onSandboxFile,
684
+ renderInteractiveBlock,
685
+ renderImage,
686
+ resolveLink,
687
+ suppressImages,
688
+ }: MarkdownProps) {
440
689
  // Tip-ink engine for THIS body: created on the first streaming render, kept
441
690
  // through a short linger after the stream ends (so the last age window can
442
691
  // finish), then dropped so settled bodies pay zero cost. Observing during
@@ -468,11 +717,23 @@ function MarkdownImpl({ children, className, streaming = false, onSandboxFile }:
468
717
  hadRevealRef.current = true;
469
718
  }
470
719
  const revealActive = reveal !== null && (streaming || reveal.hasActive(now));
471
- // The plugin walks the standard hast tree; a structural local type keeps the
472
- // module dependency-free, at the cost of this narrowing cast at the seam.
720
+ const secretsUi = useSecretsUi();
721
+ // Secret references become chip placeholders before the ink split, so a
722
+ // reference is never cut into ink spans. Without a host tokenizer, or when
723
+ // the text names no reference, the pipeline is unchanged.
724
+ const secretRefs =
725
+ secretsUi && mayContainSecretReference(children)
726
+ ? [[rehypeSecretRefs, { tokenize: secretsUi.tokenize }]]
727
+ : [];
728
+ // The plugins walk the standard hast tree; structural local types keep the
729
+ // modules dependency-free, at the cost of this narrowing cast at the seam.
730
+ const rehypePluginList = [
731
+ ...secretRefs,
732
+ ...(revealActive && reveal !== null ? [[rehypeStreamReveal, { reveal, now }]] : []),
733
+ ];
473
734
  const rehypePlugins =
474
- revealActive && reveal !== null
475
- ? ([[rehypeStreamReveal, { reveal, now }]] as unknown as NonNullable<
735
+ rehypePluginList.length > 0
736
+ ? (rehypePluginList as unknown as NonNullable<
476
737
  Parameters<typeof ReactMarkdown>[0]["rehypePlugins"]
477
738
  >)
478
739
  : undefined;
@@ -525,32 +786,108 @@ function MarkdownImpl({ children, className, streaming = false, onSandboxFile }:
525
786
  // fences don't snap to final GFM one commit before the crystallize morph.
526
787
  // Reveal identity still tracks the true source (`children`).
527
788
  const parseText = streaming || revealActive ? softenStreamingMarkdown(children) : children;
528
- const components = useMemo(() => markdownComponents(onSandboxFile), [onSandboxFile]);
789
+ const linkContext = useMemo(
790
+ () => ({ onSandboxFile, artifactHref, resolveLink }),
791
+ [onSandboxFile, artifactHref, resolveLink],
792
+ );
793
+
794
+ const interactiveContext = useMemo(
795
+ () => ({
796
+ source: children,
797
+ streaming,
798
+ ...(renderInteractiveBlock ? { render: renderInteractiveBlock } : {}),
799
+ ...(renderImage ? { renderImage } : {}),
800
+ ...(suppressImages ? { suppressImages } : {}),
801
+ }),
802
+ [children, streaming, renderInteractiveBlock, renderImage, suppressImages],
803
+ );
529
804
 
530
805
  // `min-w-0` lets the prose shrink inside flex parents (message bubbles) so
531
806
  // long links and code blocks wrap/scroll instead of forcing overflow.
532
807
  return (
533
- <TooltipProvider delayDuration={400}>
534
- <div
535
- ref={bodyRef}
536
- className={cn(
537
- "og-markdown-body min-w-0 break-words",
538
- settling && "og-markdown-settle",
539
- className,
540
- )}
541
- >
542
- <ReactMarkdown
543
- remarkPlugins={[remarkGfm]}
544
- rehypePlugins={rehypePlugins}
545
- components={components}
546
- urlTransform={markdownUrlTransform}
547
- >
548
- {parseText}
549
- </ReactMarkdown>
550
- </div>
551
- </TooltipProvider>
808
+ <MarkdownLinkContext.Provider value={linkContext}>
809
+ <InteractiveContext.Provider value={interactiveContext}>
810
+ <TooltipProvider delayDuration={400}>
811
+ <div
812
+ ref={bodyRef}
813
+ className={cn(
814
+ "og-markdown-body min-w-0 break-words",
815
+ settling && "og-markdown-settle",
816
+ className,
817
+ )}
818
+ >
819
+ <ReactMarkdown
820
+ remarkPlugins={softLineBreaks ? SOFT_LINE_BREAK_REMARK_PLUGINS : REMARK_PLUGINS}
821
+ rehypePlugins={rehypePlugins}
822
+ components={markdownComponents}
823
+ urlTransform={markdownUrlTransform}
824
+ >
825
+ {parseText}
826
+ </ReactMarkdown>
827
+ </div>
828
+ </TooltipProvider>
829
+ </InteractiveContext.Provider>
830
+ </MarkdownLinkContext.Provider>
552
831
  );
553
832
  }
554
833
 
555
834
  /** Memoized so streaming re-renders of the parent don't re-parse settled bodies. */
556
- export const Markdown = memo(MarkdownImpl);
835
+ export const Markdown = memo(function SearchableMarkdown(props: MarkdownProps) {
836
+ const [retained, setRetained] = useState<{ text: string; target: TimelineSearchTarget } | null>(
837
+ null,
838
+ );
839
+ if (
840
+ props.searchTarget &&
841
+ (retained?.target !== props.searchTarget || retained.text !== props.children)
842
+ ) {
843
+ setRetained({ text: props.children, target: props.searchTarget });
844
+ }
845
+ // Closing Find only removes the highlight. Retain the source window so a huge
846
+ // formatted message cannot replace it and unexpectedly move the reading point.
847
+ const target = props.searchTarget ?? (retained?.text === props.children ? retained.target : null);
848
+ if (!target) return <MarkdownImpl {...props} />;
849
+ const offset = searchMatchOffset(props.children, target);
850
+ if (offset < 0)
851
+ return props.searchTarget ? (
852
+ <div role="status">This match is no longer in the message source.</div>
853
+ ) : (
854
+ <MarkdownImpl {...props} />
855
+ );
856
+ // Bound mounted text even for multi-megabyte messages. Do not split a UTF-16 pair
857
+ // at excerpt edges; the selected range itself is validated against the source.
858
+ let start = Math.max(0, offset - 240);
859
+ let end = Math.min(props.children.length, offset + target.query.length + 240);
860
+ if (start > 0 && /[\uDC00-\uDFFF]/.test(props.children[start]!)) start--;
861
+ if (end < props.children.length && /[\uDC00-\uDFFF]/.test(props.children[end]!)) end++;
862
+ const MatchTag = props.searchTarget ? "mark" : "span";
863
+ return (
864
+ <div className={cn("og-markdown-body min-w-0 break-words", props.className)}>
865
+ <div data-og-annotation-chrome="" className="text-xs opacity-70">
866
+ Match in message source · Excerpt stays in place when Find closes
867
+ <button
868
+ type="button"
869
+ disabled={!!props.searchTarget}
870
+ title={props.searchTarget ? "Close Find to show the formatted message" : undefined}
871
+ 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"
872
+ onClick={() => setRetained(null)}
873
+ >
874
+ Show formatted message
875
+ </button>
876
+ </div>
877
+ <div style={{ whiteSpace: "pre-wrap", overflowWrap: "anywhere" }}>
878
+ {start > 0 ? "…" : ""}
879
+ {props.children.slice(start, offset)}
880
+ <MatchTag
881
+ data-og-search-occurrence={target.occurrence ?? 0}
882
+ data-og-search-sequence={target.sequence}
883
+ data-og-search-query={target.query}
884
+ data-og-search-offset={offset}
885
+ >
886
+ {props.children.slice(offset, offset + target.query.length)}
887
+ </MatchTag>
888
+ {props.children.slice(offset + target.query.length, end)}
889
+ {end < props.children.length ? "…" : ""}
890
+ </div>
891
+ </div>
892
+ );
893
+ });