@opengeni/react 1.0.1 → 1.0.2-canary.37191796234001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/README.md +651 -21
  2. package/dist/accounts.d.ts +64 -0
  3. package/dist/accounts.js +822 -0
  4. package/dist/accounts.js.map +1 -0
  5. package/dist/approvals.d.ts +2 -1
  6. package/dist/artifacts-document.js +3 -2
  7. package/dist/artifacts-presentation.js +3 -2
  8. package/dist/artifacts-spreadsheet.js +2 -2
  9. package/dist/artifacts.d.ts +4 -1
  10. package/dist/artifacts.js +518 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-GTR5XQ7X.js +16 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
  16. package/dist/chat-interactive-block-UGBTNB3L.js.map +1 -0
  17. package/dist/{chunk-5UQPNLIO.js → chunk-23J2ZNXT.js} +4117 -3896
  18. package/dist/chunk-23J2ZNXT.js.map +1 -0
  19. package/dist/chunk-447JLCBU.js +209 -0
  20. package/dist/chunk-447JLCBU.js.map +1 -0
  21. package/dist/chunk-4RVYOY4O.js +379 -0
  22. package/dist/chunk-4RVYOY4O.js.map +1 -0
  23. package/dist/chunk-5CVXZA3Y.js +292 -0
  24. package/dist/chunk-5CVXZA3Y.js.map +1 -0
  25. package/dist/chunk-5J4FOW6Q.js +108 -0
  26. package/dist/chunk-5J4FOW6Q.js.map +1 -0
  27. package/dist/chunk-A2PI6UMY.js +41 -0
  28. package/dist/chunk-A2PI6UMY.js.map +1 -0
  29. package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
  30. package/dist/chunk-A4UJB2MM.js.map +1 -0
  31. package/dist/chunk-B3V6TG77.js +41 -0
  32. package/dist/chunk-B3V6TG77.js.map +1 -0
  33. package/dist/chunk-BRM6FVZA.js +302 -0
  34. package/dist/chunk-BRM6FVZA.js.map +1 -0
  35. package/dist/chunk-C5X5AJXK.js +182 -0
  36. package/dist/chunk-C5X5AJXK.js.map +1 -0
  37. package/dist/chunk-CR7U7HAR.js +453 -0
  38. package/dist/chunk-CR7U7HAR.js.map +1 -0
  39. package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
  40. package/dist/chunk-DYWBUX5Q.js.map +1 -0
  41. package/dist/chunk-E3G7SAYZ.js +3124 -0
  42. package/dist/chunk-E3G7SAYZ.js.map +1 -0
  43. package/dist/chunk-ELCE5SXV.js +359 -0
  44. package/dist/chunk-ELCE5SXV.js.map +1 -0
  45. package/dist/chunk-ERGYJIBB.js +21 -0
  46. package/dist/chunk-ERGYJIBB.js.map +1 -0
  47. package/dist/chunk-FFA2OVOV.js +319 -0
  48. package/dist/chunk-FFA2OVOV.js.map +1 -0
  49. package/dist/chunk-FZCP527Y.js +116 -0
  50. package/dist/chunk-FZCP527Y.js.map +1 -0
  51. package/dist/chunk-GIMRELBW.js +14 -0
  52. package/dist/chunk-GIMRELBW.js.map +1 -0
  53. package/dist/{chunk-6KLX2RH5.js → chunk-H2NJQORO.js} +1069 -79
  54. package/dist/chunk-H2NJQORO.js.map +1 -0
  55. package/dist/chunk-I7IWRQLN.js +1608 -0
  56. package/dist/chunk-I7IWRQLN.js.map +1 -0
  57. package/dist/{chunk-HA46CYQK.js → chunk-IQUCRAT7.js} +792 -537
  58. package/dist/chunk-IQUCRAT7.js.map +1 -0
  59. package/dist/chunk-IWIDV7SB.js +1 -0
  60. package/dist/chunk-IWIDV7SB.js.map +1 -0
  61. package/dist/chunk-J2QWVSQY.js +312 -0
  62. package/dist/chunk-J2QWVSQY.js.map +1 -0
  63. package/dist/chunk-JFNEV4LU.js +2733 -0
  64. package/dist/chunk-JFNEV4LU.js.map +1 -0
  65. package/dist/chunk-JT4JW7BC.js +54 -0
  66. package/dist/chunk-JT4JW7BC.js.map +1 -0
  67. package/dist/chunk-K3HQAKQX.js +24 -0
  68. package/dist/chunk-K3HQAKQX.js.map +1 -0
  69. package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
  70. package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
  71. package/dist/chunk-NZUI76EM.js +371 -0
  72. package/dist/chunk-NZUI76EM.js.map +1 -0
  73. package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
  74. package/dist/chunk-PNY3JKBJ.js.map +1 -0
  75. package/dist/{chunk-IGC6A2ZI.js → chunk-Q5QBEZIQ.js} +777 -246
  76. package/dist/chunk-Q5QBEZIQ.js.map +1 -0
  77. package/dist/chunk-RHREZ7BO.js +11 -0
  78. package/dist/chunk-RHREZ7BO.js.map +1 -0
  79. package/dist/chunk-SCOTPE2I.js +589 -0
  80. package/dist/chunk-SCOTPE2I.js.map +1 -0
  81. package/dist/{chunk-B6WPZSTT.js → chunk-SJZDKVW2.js} +1331 -1163
  82. package/dist/chunk-SJZDKVW2.js.map +1 -0
  83. package/dist/chunk-TMJRG4YC.js +12803 -0
  84. package/dist/chunk-TMJRG4YC.js.map +1 -0
  85. package/dist/chunk-TMYGL6X5.js +742 -0
  86. package/dist/chunk-TMYGL6X5.js.map +1 -0
  87. package/dist/chunk-UGLEYEMP.js +33 -0
  88. package/dist/chunk-UGLEYEMP.js.map +1 -0
  89. package/dist/chunk-UK4TINKT.js +27 -0
  90. package/dist/chunk-UK4TINKT.js.map +1 -0
  91. package/dist/chunk-UTRTG6LH.js +220 -0
  92. package/dist/chunk-UTRTG6LH.js.map +1 -0
  93. package/dist/chunk-WEHMPOXK.js +39 -0
  94. package/dist/chunk-WEHMPOXK.js.map +1 -0
  95. package/dist/chunk-WRHIZYZF.js +988 -0
  96. package/dist/chunk-WRHIZYZF.js.map +1 -0
  97. package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
  98. package/dist/chunk-WUISZ3WU.js.map +1 -0
  99. package/dist/chunk-XCHWDJ22.js +107 -0
  100. package/dist/chunk-XCHWDJ22.js.map +1 -0
  101. package/dist/chunk-XOAMRDDK.js +481 -0
  102. package/dist/chunk-XOAMRDDK.js.map +1 -0
  103. package/dist/chunk-XUW2UWQM.js +299 -0
  104. package/dist/chunk-XUW2UWQM.js.map +1 -0
  105. package/dist/{chunk-KCGXPP5V.js → chunk-Y2PRMYLC.js} +11 -6
  106. package/dist/chunk-Y2PRMYLC.js.map +1 -0
  107. package/dist/chunk-YBXQDQFX.js +1772 -0
  108. package/dist/chunk-YBXQDQFX.js.map +1 -0
  109. package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
  110. package/dist/chunk-YQEAA6LT.js.map +1 -0
  111. package/dist/chunk-YV4L3ILF.js +9 -0
  112. package/dist/chunk-YV4L3ILF.js.map +1 -0
  113. package/dist/{chunk-LLOLUHVG.js → chunk-YWFG7ZX7.js} +1358 -2746
  114. package/dist/chunk-YWFG7ZX7.js.map +1 -0
  115. package/dist/chunk-ZYRGEKWS.js +216 -0
  116. package/dist/chunk-ZYRGEKWS.js.map +1 -0
  117. package/dist/client.d.ts +7 -4
  118. package/dist/clipboard.js +1 -0
  119. package/dist/commands/types.d.ts +2 -0
  120. package/dist/components/anthropic-mark.d.ts +3 -0
  121. package/dist/components/approval-surface.d.ts +15 -0
  122. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  123. package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
  124. package/dist/components/artifacts/artifact-surface.d.ts +3 -1
  125. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  126. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  127. package/dist/components/artifacts/document-editor.d.ts +4 -2
  128. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  129. package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
  130. package/dist/components/artifacts/editable-document.d.ts +1 -1
  131. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  132. package/dist/components/artifacts/editable-spreadsheet.d.ts +2 -1
  133. package/dist/components/artifacts/index.d.ts +8 -1
  134. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  135. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  136. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  137. package/dist/components/artifacts/published-html-artifact-frame.d.ts +48 -3
  138. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  139. package/dist/components/artifacts/site-view.d.ts +23 -0
  140. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  141. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  142. package/dist/components/browser-select-control.d.ts +16 -0
  143. package/dist/components/browser-viewer.d.ts +10 -1
  144. package/dist/components/chat-composer.d.ts +21 -3
  145. package/dist/components/child-session-link.d.ts +5 -0
  146. package/dist/components/claude-mark.d.ts +3 -0
  147. package/dist/components/code-editor.d.ts +1 -4
  148. package/dist/components/composer.d.ts +45 -4
  149. package/dist/components/computer-viewer.d.ts +4 -1
  150. package/dist/components/copy-button.d.ts +3 -1
  151. package/dist/components/desktop-viewer.d.ts +1 -1
  152. package/dist/components/enrollment-consent.d.ts +6 -3
  153. package/dist/components/file-browser.d.ts +10 -1
  154. package/dist/components/fleet-tile.d.ts +2 -2
  155. package/dist/components/grok-mark.d.ts +26 -0
  156. package/dist/components/human-input-form.d.ts +21 -2
  157. package/dist/components/human-input-surface.d.ts +6 -3
  158. package/dist/components/machine-card.d.ts +4 -1
  159. package/dist/components/machines/machine-detail.d.ts +4 -1
  160. package/dist/components/machines/machine-operation-policy.d.ts +11 -0
  161. package/dist/components/machines-dashboard.d.ts +3 -1
  162. package/dist/components/markdown-table-layout.d.ts +12 -0
  163. package/dist/components/markdown.d.ts +47 -3
  164. package/dist/components/message-timeline.d.ts +72 -9
  165. package/dist/components/model-mark.d.ts +29 -0
  166. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  167. package/dist/components/model-policy-picker.d.ts +62 -13
  168. package/dist/components/open-geni-chat.d.ts +55 -0
  169. package/dist/components/open-geni-links.d.ts +68 -0
  170. package/dist/components/openrouter-mark.d.ts +6 -0
  171. package/dist/components/pierre-file.d.ts +1 -1
  172. package/dist/components/preview-loading.d.ts +2 -0
  173. package/dist/components/queue-item-content.d.ts +9 -0
  174. package/dist/components/sandbox-files.d.ts +13 -2
  175. package/dist/components/sandbox-workspace.d.ts +43 -3
  176. package/dist/components/session-capability-frame.d.ts +35 -0
  177. package/dist/components/session-chrome.d.ts +66 -8
  178. package/dist/components/session-commands-panel.d.ts +6 -0
  179. package/dist/components/session-commands.d.ts +6 -0
  180. package/dist/components/session-connection-request.d.ts +8 -0
  181. package/dist/components/session-conversation.d.ts +86 -0
  182. package/dist/components/session-list.d.ts +36 -0
  183. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  184. package/dist/components/timeline-anchor.d.ts +24 -0
  185. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  186. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  187. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  188. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  189. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  190. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  191. package/dist/components/timeline-annotations.d.ts +13 -3
  192. package/dist/components/timeline-reading-progress.d.ts +11 -0
  193. package/dist/components/timeline-search.d.ts +34 -0
  194. package/dist/components/timeline-settlement.d.ts +16 -0
  195. package/dist/components/tip-follow.d.ts +16 -0
  196. package/dist/components/usage-limit-notice.d.ts +49 -0
  197. package/dist/components/usage-member-list.d.ts +91 -0
  198. package/dist/components/usage-meter.d.ts +73 -0
  199. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  200. package/dist/components/user-message-body.d.ts +10 -1
  201. package/dist/components/workspace-dock.d.ts +6 -2
  202. package/dist/composer.d.ts +5 -4
  203. package/dist/composer.js +15 -9
  204. package/dist/computer-viewer-ENHVAZ2Q.js +19 -0
  205. package/dist/computer-viewer-ENHVAZ2Q.js.map +1 -0
  206. package/dist/connect-account-identity.d.ts +8 -0
  207. package/dist/connect-accounts.d.ts +15 -0
  208. package/dist/connect-chooser.d.ts +18 -0
  209. package/dist/connect-panel.d.ts +18 -0
  210. package/dist/connect-setup.d.ts +16 -0
  211. package/dist/connect.d.ts +21 -0
  212. package/dist/connect.js +2129 -0
  213. package/dist/connect.js.map +1 -0
  214. package/dist/connection-catalog.d.ts +38 -0
  215. package/dist/connection-discovery.d.ts +12 -0
  216. package/dist/connection-installed.d.ts +17 -0
  217. package/dist/connection-logo.d.ts +9 -0
  218. package/dist/connection-service-logo.d.ts +8 -0
  219. package/dist/connection-service-presentation.d.ts +13 -0
  220. package/dist/connection-skeleton.d.ts +5 -0
  221. package/dist/connection-type-picker.d.ts +6 -0
  222. package/dist/conversation-timeline.d.ts +5 -0
  223. package/dist/desktop.d.ts +7 -0
  224. package/dist/desktop.js +26 -0
  225. package/dist/desktop.js.map +1 -0
  226. package/dist/device-authorization.d.ts +23 -0
  227. package/dist/diffs.d.ts +8 -0
  228. package/dist/diffs.js +14 -0
  229. package/dist/diffs.js.map +1 -0
  230. package/dist/discovery-cache.d.ts +5 -0
  231. package/dist/editor.d.ts +7 -0
  232. package/dist/editor.js +21 -0
  233. package/dist/editor.js.map +1 -0
  234. package/dist/embedded-session-client.d.ts +23 -0
  235. package/dist/file-node-visibility.d.ts +15 -0
  236. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
  237. package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
  238. package/dist/hooks/channel-cache.d.ts +23 -0
  239. package/dist/hooks/latest-question.d.ts +25 -0
  240. package/dist/hooks/shared-machines-list.d.ts +14 -0
  241. package/dist/hooks/use-attached-browsers.d.ts +2 -1
  242. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  243. package/dist/hooks/use-browser-session.d.ts +12 -1
  244. package/dist/hooks/use-channels.d.ts +1 -0
  245. package/dist/hooks/use-codex-accounts.d.ts +25 -7
  246. package/dist/hooks/use-composer.d.ts +45 -9
  247. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  248. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  249. package/dist/hooks/use-computer-session.d.ts +2 -0
  250. package/dist/hooks/use-connect.d.ts +22 -0
  251. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  252. package/dist/hooks/use-file-attachments.d.ts +21 -2
  253. package/dist/hooks/use-machine-chip.d.ts +3 -3
  254. package/dist/hooks/use-machines.d.ts +19 -1
  255. package/dist/hooks/use-sandbox-files.d.ts +5 -1
  256. package/dist/hooks/use-session-background-commands.d.ts +14 -0
  257. package/dist/hooks/use-session-events.d.ts +30 -8
  258. package/dist/hooks/use-session-lineage.d.ts +4 -0
  259. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  260. package/dist/hooks/use-session.d.ts +6 -0
  261. package/dist/hooks/use-turn-queue.d.ts +12 -0
  262. package/dist/hooks/use-usage.d.ts +40 -0
  263. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  264. package/dist/hooks/use-workspace-sessions.d.ts +27 -5
  265. package/dist/human-input.d.ts +3 -1
  266. package/dist/identity-link-accounts.d.ts +11 -0
  267. package/dist/identity-link-consent.d.ts +18 -0
  268. package/dist/index.d.ts +60 -17
  269. package/dist/index.js +2237 -6200
  270. package/dist/index.js.map +1 -1
  271. package/dist/interaction.d.ts +1 -1
  272. package/dist/interaction.js +35 -184
  273. package/dist/interaction.js.map +1 -1
  274. package/dist/latest-question-755OW5DS.js +117 -0
  275. package/dist/latest-question-755OW5DS.js.map +1 -0
  276. package/dist/lib/error-message.d.ts +7 -0
  277. package/dist/lib/format.d.ts +36 -2
  278. package/dist/lib/host-theme.d.ts +70 -0
  279. package/dist/lib/interaction-errors.d.ts +6 -0
  280. package/dist/lib/menu-styles.d.ts +22 -0
  281. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  282. package/dist/lib/workbench-peers.d.ts +36 -0
  283. package/dist/lib/xterm-theme.d.ts +7 -5
  284. package/dist/machines.d.ts +4 -2
  285. package/dist/machines.js +14 -4
  286. package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
  287. package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
  288. package/dist/mcp-connection-status.d.ts +14 -0
  289. package/dist/model-policy-picker-menu-PWRI7R2X.js +14 -0
  290. package/dist/model-policy-picker-menu-PWRI7R2X.js.map +1 -0
  291. package/dist/model-policy.d.ts +19 -3
  292. package/dist/model-policy.js +9 -1
  293. package/dist/older-history.d.ts +30 -0
  294. package/dist/platform-activity-row-627BFZ46.js +182 -0
  295. package/dist/platform-activity-row-627BFZ46.js.map +1 -0
  296. package/dist/plugin-details.d.ts +14 -0
  297. package/dist/plugin-discovery.d.ts +25 -0
  298. package/dist/provider.d.ts +13 -1
  299. package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
  300. package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
  301. package/dist/realtime/realtime-control.d.ts +6 -3
  302. package/dist/realtime.js +133 -74
  303. package/dist/realtime.js.map +1 -1
  304. package/dist/sandbox-files-BBC47SLD.js +20 -0
  305. package/dist/sandbox-files-BBC47SLD.js.map +1 -0
  306. package/dist/session-auth-recommendation.d.ts +5 -0
  307. package/dist/session-capability-policy.d.ts +12 -0
  308. package/dist/session-ui.d.ts +30 -2
  309. package/dist/session-ui.js +85 -7
  310. package/dist/session-ui.js.map +1 -1
  311. package/dist/session.d.ts +8 -2
  312. package/dist/session.js +30 -19
  313. package/dist/sites-ui.d.ts +34 -0
  314. package/dist/sites.d.ts +3 -0
  315. package/dist/sites.js +11 -0
  316. package/dist/sites.js.map +1 -0
  317. package/dist/skill-discovery.d.ts +47 -0
  318. package/dist/terminal.d.ts +8 -0
  319. package/dist/terminal.js +31 -0
  320. package/dist/terminal.js.map +1 -0
  321. package/dist/timeline/activity-rail.d.ts +11 -2
  322. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  323. package/dist/timeline/compaction-copy.d.ts +10 -0
  324. package/dist/timeline/entrance.d.ts +13 -1
  325. package/dist/timeline/genie-loading.d.ts +34 -0
  326. package/dist/timeline/index.d.ts +6 -2
  327. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  328. package/dist/timeline/platform-activity-row.d.ts +14 -0
  329. package/dist/timeline/presented-image.d.ts +6 -0
  330. package/dist/timeline/projection.d.ts +31 -2
  331. package/dist/timeline/registry.d.ts +2 -0
  332. package/dist/timeline/retained-image.d.ts +18 -0
  333. package/dist/timeline/rolling-activity.d.ts +11 -0
  334. package/dist/timeline/screenshot-lightbox.d.ts +16 -1
  335. package/dist/timeline/shared.d.ts +8 -3
  336. package/dist/timeline/startup-preference.d.ts +3 -0
  337. package/dist/timeline/startup-timings.d.ts +4 -0
  338. package/dist/timeline/tool-display-name.d.ts +2 -1
  339. package/dist/timeline/turn-summary.d.ts +32 -3
  340. package/dist/timeline/types.d.ts +141 -7
  341. package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
  342. package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
  343. package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
  344. package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
  345. package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
  346. package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
  347. package/dist/types/machines.d.ts +2 -2
  348. package/dist/usage/allowance-copy.d.ts +25 -0
  349. package/dist/usage/summary.d.ts +35 -0
  350. package/dist/usage.d.ts +13 -0
  351. package/dist/usage.js +1074 -0
  352. package/dist/usage.js.map +1 -0
  353. package/package.json +44 -4
  354. package/src/accounts.tsx +1072 -0
  355. package/src/approvals.ts +8 -1
  356. package/src/artifacts.ts +42 -0
  357. package/src/assets/README.md +8 -0
  358. package/src/assets/gmail.ico +0 -0
  359. package/src/assets/outlook.ico +0 -0
  360. package/src/capability-catalog-row.tsx +94 -0
  361. package/src/capability-logo-fallback.ts +22 -0
  362. package/src/client.ts +22 -13
  363. package/src/commands/registry.ts +18 -15
  364. package/src/commands/types.ts +2 -0
  365. package/src/components/anthropic-mark.tsx +10 -0
  366. package/src/components/approval-surface.tsx +171 -37
  367. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  368. package/src/components/artifacts/artifact-sandbox.tsx +185 -0
  369. package/src/components/artifacts/artifact-surface.tsx +39 -19
  370. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  371. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  372. package/src/components/artifacts/document-editor.tsx +141 -16
  373. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  374. package/src/components/artifacts/editable-artifact-view.tsx +187 -0
  375. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  376. package/src/components/artifacts/editable-document.tsx +37 -36
  377. package/src/components/artifacts/editable-presentation.tsx +36 -18
  378. package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
  379. package/src/components/artifacts/index.ts +44 -0
  380. package/src/components/artifacts/inline-html-document.ts +24 -0
  381. package/src/components/artifacts/latest-task-runner.ts +49 -0
  382. package/src/components/artifacts/presentation-editor.tsx +323 -67
  383. package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
  384. package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
  385. package/src/components/artifacts/site-view.tsx +116 -0
  386. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  387. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  388. package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
  389. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  390. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  391. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  392. package/src/components/browser-select-control.tsx +312 -0
  393. package/src/components/browser-viewer.tsx +1054 -314
  394. package/src/components/chat-composer.tsx +131 -85
  395. package/src/components/child-session-link.tsx +27 -0
  396. package/src/components/claude-mark.tsx +10 -0
  397. package/src/components/code-editor.tsx +13 -16
  398. package/src/components/composer-transcription-control.tsx +7 -5
  399. package/src/components/composer.tsx +376 -49
  400. package/src/components/computer-viewer.tsx +1041 -329
  401. package/src/components/copy-button.tsx +13 -5
  402. package/src/components/desktop-viewer.tsx +1 -1
  403. package/src/components/enrollment-consent.tsx +65 -7
  404. package/src/components/enrollment-device-flow.tsx +1 -1
  405. package/src/components/file-browser.tsx +158 -34
  406. package/src/components/fleet-tile.tsx +8 -16
  407. package/src/components/generated-video-player.tsx +4 -2
  408. package/src/components/grok-mark.tsx +33 -0
  409. package/src/components/human-input-form.tsx +455 -114
  410. package/src/components/human-input-surface.tsx +18 -7
  411. package/src/components/interaction-intervention-banner.tsx +2 -2
  412. package/src/components/machine-card.tsx +119 -4
  413. package/src/components/machine-dock-bar.tsx +1 -1
  414. package/src/components/machine-input-display.ts +23 -2
  415. package/src/components/machines/machine-detail.tsx +52 -2
  416. package/src/components/machines/machine-operation-policy.tsx +179 -0
  417. package/src/components/machines-dashboard.tsx +8 -17
  418. package/src/components/markdown-table-layout.ts +132 -0
  419. package/src/components/markdown.tsx +473 -44
  420. package/src/components/message-timeline.tsx +2498 -663
  421. package/src/components/model-mark.tsx +90 -0
  422. package/src/components/model-picker.tsx +15 -4
  423. package/src/components/model-policy-picker-menu.tsx +424 -0
  424. package/src/components/model-policy-picker.tsx +337 -381
  425. package/src/components/open-geni-chat.tsx +319 -0
  426. package/src/components/open-geni-links.tsx +179 -0
  427. package/src/components/openrouter-mark.tsx +13 -0
  428. package/src/components/pierre-diff.tsx +41 -16
  429. package/src/components/pierre-file.tsx +36 -11
  430. package/src/components/preview-loading.tsx +154 -0
  431. package/src/components/queue-item-content.ts +14 -0
  432. package/src/components/queue-surface-implementation.tsx +132 -42
  433. package/src/components/queue-surface-state.tsx +3 -1
  434. package/src/components/sandbox-files.tsx +267 -35
  435. package/src/components/sandbox-terminal.tsx +48 -11
  436. package/src/components/sandbox-workspace.tsx +337 -135
  437. package/src/components/session-capability-frame.tsx +192 -0
  438. package/src/components/session-chrome.tsx +1027 -328
  439. package/src/components/session-commands-panel.tsx +126 -0
  440. package/src/components/session-commands.tsx +18 -0
  441. package/src/components/session-connection-request.tsx +97 -0
  442. package/src/components/session-conversation.tsx +512 -0
  443. package/src/components/session-list.tsx +250 -0
  444. package/src/components/session-mcp-capability-card.tsx +680 -0
  445. package/src/components/session-status.tsx +1 -1
  446. package/src/components/timeline-anchor.tsx +119 -0
  447. package/src/components/timeline-annotation-chrome.tsx +196 -0
  448. package/src/components/timeline-annotation-layout.ts +268 -0
  449. package/src/components/timeline-annotation-markers.tsx +185 -0
  450. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  451. package/src/components/timeline-annotation-selection.tsx +106 -54
  452. package/src/components/timeline-annotation-shared.ts +245 -0
  453. package/src/components/timeline-annotations-dialog.tsx +185 -128
  454. package/src/components/timeline-annotations.tsx +189 -45
  455. package/src/components/timeline-reading-progress.ts +80 -0
  456. package/src/components/timeline-search.tsx +168 -0
  457. package/src/components/timeline-settlement.ts +60 -0
  458. package/src/components/tip-follow.ts +70 -7
  459. package/src/components/tooltip.tsx +38 -5
  460. package/src/components/usage-limit-notice.tsx +179 -0
  461. package/src/components/usage-member-list.tsx +792 -0
  462. package/src/components/usage-meter.tsx +382 -0
  463. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  464. package/src/components/user-message-body.tsx +194 -49
  465. package/src/components/workspace-dock.tsx +141 -175
  466. package/src/composer.ts +6 -1
  467. package/src/connect-account-identity.tsx +34 -0
  468. package/src/connect-accounts.tsx +233 -0
  469. package/src/connect-chooser.tsx +336 -0
  470. package/src/connect-panel.tsx +99 -0
  471. package/src/connect-setup.tsx +307 -0
  472. package/src/connect.ts +60 -0
  473. package/src/connection-assets.d.ts +4 -0
  474. package/src/connection-catalog.tsx +162 -0
  475. package/src/connection-discovery.tsx +235 -0
  476. package/src/connection-installed.tsx +51 -0
  477. package/src/connection-logo.tsx +37 -0
  478. package/src/connection-service-logo.tsx +55 -0
  479. package/src/connection-service-presentation.ts +46 -0
  480. package/src/connection-skeleton.tsx +16 -0
  481. package/src/connection-type-picker.tsx +36 -0
  482. package/src/conversation-timeline.ts +92 -0
  483. package/src/desktop.ts +24 -0
  484. package/src/device-authorization.tsx +98 -0
  485. package/src/diffs.ts +16 -0
  486. package/src/discovery-cache.ts +42 -0
  487. package/src/editor.ts +13 -0
  488. package/src/embedded-session-client.ts +104 -0
  489. package/src/file-node-visibility.ts +66 -0
  490. package/src/hooks/channel-cache.ts +104 -0
  491. package/src/hooks/internal.ts +3 -2
  492. package/src/hooks/latest-question.ts +164 -0
  493. package/src/hooks/shared-machines-list.ts +239 -0
  494. package/src/hooks/use-attached-browsers.ts +5 -1
  495. package/src/hooks/use-available-models.ts +20 -14
  496. package/src/hooks/use-browser-frame-stream.ts +25 -3
  497. package/src/hooks/use-browser-session.ts +271 -71
  498. package/src/hooks/use-browser-sessions.ts +7 -1
  499. package/src/hooks/use-channels.ts +32 -10
  500. package/src/hooks/use-codex-accounts.ts +78 -21
  501. package/src/hooks/use-composer.ts +1034 -320
  502. package/src/hooks/use-computer-frame-stream.ts +39 -16
  503. package/src/hooks/use-computer-input-posture.ts +94 -0
  504. package/src/hooks/use-computer-session.ts +110 -32
  505. package/src/hooks/use-computer-sessions.ts +8 -1
  506. package/src/hooks/use-connect.ts +23 -0
  507. package/src/hooks/use-desktop-stream.ts +19 -28
  508. package/src/hooks/use-file-attachments.ts +118 -10
  509. package/src/hooks/use-goal.ts +36 -9
  510. package/src/hooks/use-human-input.ts +31 -4
  511. package/src/hooks/use-last-started-turn-policy.ts +15 -13
  512. package/src/hooks/use-machine-chip.ts +23 -6
  513. package/src/hooks/use-machines.ts +104 -6
  514. package/src/hooks/use-sandbox-files.ts +253 -150
  515. package/src/hooks/use-sandbox-git.ts +58 -29
  516. package/src/hooks/use-session-background-commands.ts +67 -0
  517. package/src/hooks/use-session-capabilities.ts +21 -2
  518. package/src/hooks/use-session-events.ts +759 -433
  519. package/src/hooks/use-session-lineage.ts +28 -6
  520. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  521. package/src/hooks/use-session.ts +75 -16
  522. package/src/hooks/use-slash-commands.ts +6 -11
  523. package/src/hooks/use-turn-queue.ts +113 -13
  524. package/src/hooks/use-usage.ts +100 -0
  525. package/src/hooks/use-voice-input.ts +12 -1
  526. package/src/hooks/use-workspace-capture.ts +3 -2
  527. package/src/hooks/use-workspace-edit.ts +23 -5
  528. package/src/hooks/use-workspace-sessions.ts +99 -11
  529. package/src/human-input.ts +12 -1
  530. package/src/identity-link-accounts.tsx +148 -0
  531. package/src/identity-link-consent.tsx +192 -0
  532. package/src/index.ts +157 -12
  533. package/src/interaction.ts +1 -0
  534. package/src/lib/error-message.ts +37 -0
  535. package/src/lib/format.ts +150 -14
  536. package/src/lib/host-theme.ts +511 -0
  537. package/src/lib/interaction-errors.ts +33 -0
  538. package/src/lib/menu-styles.ts +44 -0
  539. package/src/lib/pierre-diffs-loader.ts +53 -0
  540. package/src/lib/workbench-peers.ts +62 -0
  541. package/src/lib/xterm-theme.ts +23 -21
  542. package/src/machines.ts +9 -1
  543. package/src/mcp-connection-status.ts +35 -0
  544. package/src/model-policy.ts +223 -69
  545. package/src/older-history.ts +87 -0
  546. package/src/plugin-details.tsx +185 -0
  547. package/src/plugin-discovery.tsx +196 -0
  548. package/src/provider.tsx +55 -14
  549. package/src/realtime/dropdown-menu.tsx +19 -12
  550. package/src/realtime/realtime-control.tsx +133 -46
  551. package/src/session-auth-recommendation.ts +48 -0
  552. package/src/session-capability-policy.ts +83 -0
  553. package/src/session-context.ts +1 -0
  554. package/src/session-ui.ts +66 -2
  555. package/src/session.ts +18 -1
  556. package/src/sites-ui.tsx +402 -0
  557. package/src/sites.ts +3 -0
  558. package/src/skill-discovery.tsx +208 -0
  559. package/src/terminal.ts +26 -0
  560. package/src/timeline/activity-rail.tsx +171 -80
  561. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  562. package/src/timeline/compaction-copy.ts +42 -0
  563. package/src/timeline/entrance.tsx +28 -3
  564. package/src/timeline/fleet-decision-projection.ts +2 -1
  565. package/src/timeline/fleet-decision-row.tsx +1 -0
  566. package/src/timeline/genie-loading.tsx +136 -0
  567. package/src/timeline/index.ts +11 -0
  568. package/src/timeline/knowledge-receipt.tsx +100 -0
  569. package/src/timeline/parsers.ts +2 -2
  570. package/src/timeline/platform-activity-row.tsx +216 -0
  571. package/src/timeline/presented-image.ts +49 -0
  572. package/src/timeline/projection.ts +1600 -84
  573. package/src/timeline/registry.ts +15 -3
  574. package/src/timeline/retained-image.ts +97 -0
  575. package/src/timeline/rolling-activity.tsx +92 -0
  576. package/src/timeline/screenshot-lightbox.tsx +115 -17
  577. package/src/timeline/shared.tsx +47 -15
  578. package/src/timeline/startup-preference.ts +33 -0
  579. package/src/timeline/startup-timings.tsx +145 -0
  580. package/src/timeline/tool-display-name.ts +8 -6
  581. package/src/timeline/tool-renderers.tsx +497 -128
  582. package/src/timeline/turn-summary.tsx +208 -44
  583. package/src/timeline/types.ts +186 -7
  584. package/src/types/machines.ts +10 -0
  585. package/src/usage/allowance-copy.ts +64 -0
  586. package/src/usage/summary.ts +93 -0
  587. package/src/usage.ts +50 -0
  588. package/styles/compiled.css +2098 -757
  589. package/styles/connect.css +284 -0
  590. package/styles/connect.d.ts +1 -0
  591. package/styles/effective-tokens.css +1 -0
  592. package/styles/index.css +201 -9
  593. package/styles/responsive.css +27 -1
  594. package/styles/session-capability.css +44 -0
  595. package/styles/tokens.css +135 -65
  596. package/dist/chunk-5UQPNLIO.js.map +0 -1
  597. package/dist/chunk-6KLX2RH5.js.map +0 -1
  598. package/dist/chunk-7WCLAEFV.js.map +0 -1
  599. package/dist/chunk-B6WPZSTT.js.map +0 -1
  600. package/dist/chunk-FK6VG4LL.js +0 -90
  601. package/dist/chunk-FK6VG4LL.js.map +0 -1
  602. package/dist/chunk-HA46CYQK.js.map +0 -1
  603. package/dist/chunk-HUIKIDM5.js.map +0 -1
  604. package/dist/chunk-IGC6A2ZI.js.map +0 -1
  605. package/dist/chunk-KCGXPP5V.js.map +0 -1
  606. package/dist/chunk-KZ73RL76.js.map +0 -1
  607. package/dist/chunk-LAKLF4PA.js +0 -141
  608. package/dist/chunk-LAKLF4PA.js.map +0 -1
  609. package/dist/chunk-LLOLUHVG.js.map +0 -1
  610. package/dist/chunk-MKPIAGVL.js +0 -465
  611. package/dist/chunk-MKPIAGVL.js.map +0 -1
  612. package/dist/chunk-PEI6RANI.js.map +0 -1
  613. package/dist/chunk-R3AZOAB5.js.map +0 -1
  614. package/dist/chunk-WSK7G5LE.js +0 -170
  615. package/dist/chunk-WSK7G5LE.js.map +0 -1
  616. package/dist/chunk-XBZWOM2K.js +0 -218
  617. package/dist/chunk-XBZWOM2K.js.map +0 -1
  618. package/dist/chunk-Y7OEDUJ5.js +0 -8810
  619. package/dist/chunk-Y7OEDUJ5.js.map +0 -1
  620. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  621. package/dist/hooks/use-packs.d.ts +0 -32
  622. package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
  623. package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
  624. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  625. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  626. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  627. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  628. package/src/hooks/use-packs.ts +0 -157
  629. /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GTR5XQ7X.js.map} +0 -0
@@ -0,0 +1,245 @@
1
+ import type { TimelineAnnotationSource } from "@opengeni/sdk";
2
+
3
+ export const ANNOTATION_CHROME_SELECTOR =
4
+ "[data-og-annotation-chrome], [data-og-annotation-badge], [data-og-annotation-popover]";
5
+
6
+ export function annotationHasNote(note: string): boolean {
7
+ return note.trim().length > 0;
8
+ }
9
+
10
+ export function annotationDisplayOrdinal(
11
+ annotation: { readonly id?: string; readonly ordinal?: number | undefined },
12
+ index: number,
13
+ ): number {
14
+ return typeof annotation.ordinal === "number" ? annotation.ordinal : index + 1;
15
+ }
16
+
17
+ export function sourceKindLabel(kind: TimelineAnnotationSource["kind"]): string {
18
+ switch (kind) {
19
+ case "user_message":
20
+ return "Your message";
21
+ case "assistant_message":
22
+ return "Assistant";
23
+ case "tool_output":
24
+ return "Tool output";
25
+ }
26
+ }
27
+
28
+ export function annotationSourceLabel(source: TimelineAnnotationSource): string {
29
+ return source.label?.trim() || sourceKindLabel(source.kind);
30
+ }
31
+
32
+ export function truncateAnnotationQuote(quote: string, maxChars = 160): string {
33
+ const normalized = quote.replace(/\s+/g, " ").trim();
34
+ if (normalized.length <= maxChars) return normalized;
35
+ return `${normalized.slice(0, Math.max(0, maxChars - 1)).trimEnd()}…`;
36
+ }
37
+
38
+ export function cssEscapeAttribute(value: string): string {
39
+ if (typeof CSS !== "undefined" && typeof CSS.escape === "function") return CSS.escape(value);
40
+ return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
41
+ }
42
+
43
+ export function isAnnotationChromeNode(node: Node | null): boolean {
44
+ const element = node instanceof Element ? node : node?.parentElement;
45
+ return Boolean(element?.closest(ANNOTATION_CHROME_SELECTOR));
46
+ }
47
+
48
+ export function occurrenceOffsets(text: string, quote: string): number[] {
49
+ if (!quote) return [];
50
+ const offsets: number[] = [];
51
+ let cursor = 0;
52
+ while (cursor <= text.length - quote.length) {
53
+ const offset = text.indexOf(quote, cursor);
54
+ if (offset < 0) break;
55
+ offsets.push(offset);
56
+ cursor = offset + 1;
57
+ }
58
+ return offsets;
59
+ }
60
+
61
+ function uniqueNonEmpty(values: string[]): string[] {
62
+ const seen = new Set<string>();
63
+ const out: string[] = [];
64
+ for (const value of values) {
65
+ if (!value || seen.has(value)) continue;
66
+ seen.add(value);
67
+ out.push(value);
68
+ }
69
+ return out;
70
+ }
71
+
72
+ export function matchingQuoteInSource(sourceText: string, quote: string): string | null {
73
+ for (const candidate of uniqueNonEmpty([quote, quote.trim()])) {
74
+ if (sourceText.includes(candidate)) return candidate;
75
+ }
76
+ const trimmed = quote.trim();
77
+ for (let length = trimmed.length; length >= 8; length--) {
78
+ const slice = trimmed.slice(0, length);
79
+ if (sourceText.includes(slice)) return slice;
80
+ }
81
+ for (let start = 1; start <= trimmed.length - 8; start++) {
82
+ const slice = trimmed.slice(start);
83
+ if (sourceText.includes(slice)) return slice;
84
+ }
85
+ return null;
86
+ }
87
+
88
+ type AnnotatableSpan = {
89
+ node: Text;
90
+ start: number;
91
+ length: number;
92
+ };
93
+
94
+ export function annotatableText(root: HTMLElement): { text: string; spans: AnnotatableSpan[] } {
95
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
96
+ acceptNode(node) {
97
+ if (!(node instanceof Text) || node.data.length === 0) return NodeFilter.FILTER_REJECT;
98
+ if (isAnnotationChromeNode(node)) return NodeFilter.FILTER_REJECT;
99
+ return NodeFilter.FILTER_ACCEPT;
100
+ },
101
+ });
102
+ const spans: AnnotatableSpan[] = [];
103
+ let text = "";
104
+ let current: Node | null;
105
+ while ((current = walker.nextNode())) {
106
+ if (!(current instanceof Text)) continue;
107
+ spans.push({ node: current, start: text.length, length: current.data.length });
108
+ text += current.data;
109
+ }
110
+ return { text, spans };
111
+ }
112
+
113
+ function pointAt(
114
+ spans: AnnotatableSpan[],
115
+ offset: number,
116
+ stickEnd: boolean,
117
+ ): { node: Text; offset: number } | null {
118
+ if (spans.length === 0) return null;
119
+ for (let index = 0; index < spans.length; index++) {
120
+ const span = spans[index]!;
121
+ const local = offset - span.start;
122
+ if (local < 0) continue;
123
+ if (
124
+ local < span.length ||
125
+ (local === span.length && (stickEnd || index === spans.length - 1))
126
+ ) {
127
+ return { node: span.node, offset: local };
128
+ }
129
+ }
130
+ const last = spans[spans.length - 1]!;
131
+ return { node: last.node, offset: last.length };
132
+ }
133
+
134
+ export function rangeFromOffsets(
135
+ spans: AnnotatableSpan[],
136
+ startOffset: number,
137
+ endOffset: number,
138
+ ): Range | null {
139
+ const start = pointAt(spans, startOffset, false);
140
+ const end = pointAt(spans, endOffset, true);
141
+ if (!start || !end) return null;
142
+ const range = document.createRange();
143
+ range.setStart(start.node, start.offset);
144
+ range.setEnd(end.node, end.offset);
145
+ return range.collapsed ? null : range;
146
+ }
147
+
148
+ export function buildQuoteRange(
149
+ sourceEl: HTMLElement,
150
+ quote: string,
151
+ occurrenceIndex = 0,
152
+ ): Range | null {
153
+ if (!quote) return null;
154
+ const { text, spans } = annotatableText(sourceEl);
155
+ const offsets = occurrenceOffsets(text, quote);
156
+ if (offsets.length === 0) return null;
157
+ const start = offsets[Math.min(Math.max(0, occurrenceIndex), offsets.length - 1)]!;
158
+ return rangeFromOffsets(spans, start, start + quote.length);
159
+ }
160
+
161
+ export function quoteOccurrenceIndex(sourceEl: HTMLElement, range: Range, quote: string): number {
162
+ try {
163
+ const prefix = range.cloneRange();
164
+ prefix.selectNodeContents(sourceEl);
165
+ prefix.setEnd(range.startContainer, range.startOffset);
166
+ return occurrenceOffsets(prefix.toString(), quote).length;
167
+ } catch {
168
+ return 0;
169
+ }
170
+ }
171
+
172
+ export function clipRangeToSource(range: Range, sourceEl: HTMLElement): Range | null {
173
+ const startOk =
174
+ sourceEl.contains(range.startContainer) && !isAnnotationChromeNode(range.startContainer);
175
+ const endOk =
176
+ sourceEl.contains(range.endContainer) && !isAnnotationChromeNode(range.endContainer);
177
+ if (!startOk && !endOk) return null;
178
+ const { spans } = annotatableText(sourceEl);
179
+ if (spans.length === 0) return null;
180
+ const next = range.cloneRange();
181
+ const first = spans[0]!;
182
+ const last = spans[spans.length - 1]!;
183
+ if (!startOk) next.setStart(first.node, 0);
184
+ if (!endOk) next.setEnd(last.node, last.node.data.length);
185
+ return next.collapsed ? null : next;
186
+ }
187
+
188
+ export function visibleClientRect(range: Range): DOMRect | null {
189
+ try {
190
+ const bounding = range.getBoundingClientRect();
191
+ if (bounding.width > 0 || bounding.height > 0) return bounding;
192
+ } catch {
193
+ // jsdom ranges may omit layout geometry.
194
+ }
195
+ try {
196
+ const rects = range.getClientRects();
197
+ for (let index = 0; index < rects.length; index++) {
198
+ const rect = rects.item(index);
199
+ if (rect && (rect.width > 0 || rect.height > 0)) return rect;
200
+ }
201
+ } catch {
202
+ // jsdom ranges may omit client rects.
203
+ }
204
+ return null;
205
+ }
206
+
207
+ export function resolveAnnotationRevealRoot(from: Element | null | undefined): HTMLElement | null {
208
+ const conversation = from?.closest("[data-og-conversation]");
209
+ if (conversation instanceof HTMLElement) {
210
+ const nested = conversation.querySelector("[data-og-timeline-scroller]");
211
+ return nested instanceof HTMLElement ? nested : conversation;
212
+ }
213
+ const scroller = from?.closest("[data-og-timeline-scroller]");
214
+ return scroller instanceof HTMLElement ? scroller : null;
215
+ }
216
+
217
+ export function revealLoadedAnnotationSource(
218
+ source: TimelineAnnotationSource,
219
+ root?: ParentNode | null,
220
+ ): boolean {
221
+ if (typeof document === "undefined") return false;
222
+ // An explicit null root means the caller already scoped the search and found
223
+ // no owning timeline. Do not fall back to `document`, or a second mounted
224
+ // timeline with the same event id would steal the reveal.
225
+ if (root === null) return false;
226
+ const element = (root ?? document).querySelector(
227
+ `[data-og-annotation-source-key="${cssEscapeAttribute(source.eventId)}"]`,
228
+ );
229
+ if (!(element instanceof HTMLElement)) return false;
230
+ element.scrollIntoView({ block: "center", behavior: "smooth" });
231
+ element.animate?.(
232
+ [
233
+ {
234
+ boxShadow: "inset 0 0 0 2px color-mix(in oklch, var(--og-color-accent) 70%, transparent)",
235
+ backgroundColor: "color-mix(in oklch, var(--og-color-accent) 14%, transparent)",
236
+ },
237
+ {
238
+ boxShadow: "inset 0 0 0 2px transparent",
239
+ backgroundColor: "transparent",
240
+ },
241
+ ],
242
+ { duration: 1400, easing: "ease-out" },
243
+ );
244
+ return true;
245
+ }
@@ -1,40 +1,28 @@
1
1
  import type { TimelineAnnotationSource } from "@opengeni/sdk";
2
+ import { XIcon } from "lucide-react";
2
3
  import { useEffect, useLayoutEffect, useRef, useState, type RefObject } from "react";
3
4
  import { createPortal } from "react-dom";
4
- import type { TimelineAnnotationLike } from "./timeline-annotations";
5
+ import { usePortalTokenStyle } from "../lib/use-portal-token-style";
6
+ import {
7
+ AnnotationAccentRow,
8
+ AnnotationNoteField,
9
+ AnnotationNotePreview,
10
+ AnnotationQuoteSourceButton,
11
+ type TimelineAnnotationLike,
12
+ } from "./timeline-annotation-chrome";
13
+ import {
14
+ ANNOTATION_REVIEW_DIALOG_WIDTH_PX,
15
+ clampAnnotationDialogPlacement,
16
+ scrollAnnotationRowIntoList,
17
+ } from "./timeline-annotation-layout";
18
+ import { annotationDisplayOrdinal, cssEscapeAttribute } from "./timeline-annotation-shared";
5
19
 
6
- function cssEscapeAttribute(value: string): string {
7
- if (typeof CSS !== "undefined" && typeof CSS.escape === "function") return CSS.escape(value);
8
- return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
9
- }
10
-
11
- function revealLoadedSource(source: TimelineAnnotationSource): boolean {
12
- if (typeof document === "undefined") return false;
13
- const element = document.querySelector(
14
- `[data-og-annotation-source-key="${cssEscapeAttribute(source.eventId)}"]`,
15
- );
16
- if (!(element instanceof HTMLElement)) return false;
17
- element.scrollIntoView({ block: "center", behavior: "smooth" });
18
- element.animate?.(
19
- [
20
- { outline: "2px solid color-mix(in srgb, currentColor 55%, transparent)" },
21
- { outline: "2px solid transparent" },
22
- ],
23
- { duration: 1600, easing: "ease-out" },
24
- );
25
- return true;
26
- }
27
-
28
- function sourceLabel(annotation: TimelineAnnotationLike): string {
29
- if (annotation.source.label) return annotation.source.label;
30
- switch (annotation.source.kind) {
31
- case "user_message":
32
- return "User message";
33
- case "assistant_message":
34
- return "Assistant message";
35
- case "tool_output":
36
- return "Tool output";
37
- }
20
+ function focusableElements(root: HTMLElement): HTMLElement[] {
21
+ return [
22
+ ...root.querySelectorAll<HTMLElement>(
23
+ 'button:not([disabled]),textarea:not([disabled]),input:not([disabled]),[href],[tabindex]:not([tabindex="-1"])',
24
+ ),
25
+ ].filter((element) => element.tabIndex >= 0 && !element.closest("[inert]"));
38
26
  }
39
27
 
40
28
  export function TimelineAnnotationsDialog({
@@ -48,6 +36,7 @@ export function TimelineAnnotationsDialog({
48
36
  triggerRef,
49
37
  countLabel,
50
38
  onDismiss,
39
+ onCommit,
51
40
  }: {
52
41
  annotations: readonly TimelineAnnotationLike[];
53
42
  editable: boolean;
@@ -59,33 +48,104 @@ export function TimelineAnnotationsDialog({
59
48
  triggerRef: RefObject<HTMLButtonElement | null>;
60
49
  countLabel: string;
61
50
  onDismiss: (restoreFocus: boolean) => void;
51
+ onCommit: () => void;
62
52
  }) {
63
53
  const [unavailableId, setUnavailableId] = useState<string | null>(null);
64
- const [position, setPosition] = useState({ left: 12, top: 12, above: false });
54
+ const [position, setPosition] = useState({ left: 12, top: 12, maxHeight: 0 });
65
55
  const panelRef = useRef<HTMLDivElement | null>(null);
56
+ const headerRef = useRef<HTMLDivElement | null>(null);
57
+ const listRef = useRef<HTMLDivElement | null>(null);
66
58
  const noteRefs = useRef(new Map<string, HTMLTextAreaElement>());
59
+ const focusedAnnotationIdRef = useRef<string | null>(null);
60
+ const portalStyle = usePortalTokenStyle(triggerRef.current);
61
+ const revealNote = (id: string) => {
62
+ const row = listRef.current?.querySelector<HTMLElement>(
63
+ `[data-og-annotation-id="${cssEscapeAttribute(id)}"]`,
64
+ );
65
+ scrollAnnotationRowIntoList(listRef.current, row);
66
+ noteRefs.current.get(id)?.focus();
67
+ };
67
68
 
68
- useLayoutEffect(() => {
69
- if (!focusAnnotationId) return;
70
- const note = noteRefs.current.get(focusAnnotationId);
71
- note?.focus();
72
- if (note && document.activeElement === note) onFocusConsumed?.();
73
- }, [focusAnnotationId, onFocusConsumed]);
69
+ const commitNotes = (fromId: string) => {
70
+ const incomplete = annotations.filter((annotation) => {
71
+ const live = noteRefs.current.get(annotation.id);
72
+ return (live?.value ?? annotation.note).trim().length === 0;
73
+ });
74
+ if (incomplete.length === 0) {
75
+ onCommit();
76
+ return;
77
+ }
78
+ const fromIndex = annotations.findIndex((annotation) => annotation.id === fromId);
79
+ const next =
80
+ incomplete.find(
81
+ (item) => annotations.findIndex((annotation) => annotation.id === item.id) > fromIndex,
82
+ ) ?? incomplete[0]!;
83
+ revealNote(next.id);
84
+ };
74
85
 
75
- useEffect(() => {
86
+ useLayoutEffect(() => {
76
87
  const updatePosition = () => {
77
88
  const rect = triggerRef.current?.getBoundingClientRect();
78
89
  if (!rect) return;
79
- const panelWidth = Math.min(400, window.innerWidth - 24);
80
- const left = Math.min(
81
- Math.max(12, rect.left),
82
- Math.max(12, window.innerWidth - panelWidth - 12),
90
+ const contentHeight =
91
+ (headerRef.current?.offsetHeight ?? 44) + (listRef.current?.scrollHeight ?? 200);
92
+ setPosition(
93
+ clampAnnotationDialogPlacement({
94
+ triggerLeft: rect.left,
95
+ triggerTop: rect.top,
96
+ triggerBottom: rect.bottom,
97
+ contentHeight,
98
+ viewportWidth: window.innerWidth,
99
+ viewportHeight: window.innerHeight,
100
+ panelWidth: ANNOTATION_REVIEW_DIALOG_WIDTH_PX,
101
+ }),
83
102
  );
84
- const above = rect.top > Math.min(360, window.innerHeight * 0.55);
85
- setPosition({ left, top: above ? rect.top - 8 : rect.bottom + 8, above });
86
103
  };
104
+ updatePosition();
105
+ window.addEventListener("resize", updatePosition);
106
+ window.addEventListener("scroll", updatePosition, true);
107
+ return () => {
108
+ window.removeEventListener("resize", updatePosition);
109
+ window.removeEventListener("scroll", updatePosition, true);
110
+ };
111
+ }, [annotations, triggerRef]);
112
+
113
+ useLayoutEffect(() => {
114
+ if (!focusAnnotationId) {
115
+ focusedAnnotationIdRef.current = null;
116
+ return;
117
+ }
118
+ // A consumed request must not reclaim focus or scroll on layout/callback updates.
119
+ if (focusedAnnotationIdRef.current === focusAnnotationId) return;
120
+ focusedAnnotationIdRef.current = null;
121
+ if (position.maxHeight <= 0) return;
122
+ revealNote(focusAnnotationId);
123
+ const note = noteRefs.current.get(focusAnnotationId);
124
+ if (note && document.activeElement === note) {
125
+ focusedAnnotationIdRef.current = focusAnnotationId;
126
+ onFocusConsumed?.();
127
+ }
128
+ }, [focusAnnotationId, onFocusConsumed, annotations.length, position.maxHeight]);
129
+
130
+ useEffect(() => {
87
131
  const onKeyDown = (event: KeyboardEvent) => {
88
- if (event.key === "Escape") onDismiss(true);
132
+ if (event.key === "Escape") {
133
+ event.stopPropagation();
134
+ onDismiss(true);
135
+ return;
136
+ }
137
+ if (event.key !== "Tab" || !panelRef.current) return;
138
+ const focusable = focusableElements(panelRef.current);
139
+ if (focusable.length === 0) return;
140
+ const first = focusable[0]!;
141
+ const last = focusable[focusable.length - 1]!;
142
+ if (event.shiftKey && document.activeElement === first) {
143
+ event.preventDefault();
144
+ last.focus();
145
+ } else if (!event.shiftKey && document.activeElement === last) {
146
+ event.preventDefault();
147
+ first.focus();
148
+ }
89
149
  };
90
150
  const onPointerDown = (event: PointerEvent) => {
91
151
  if (!(event.target instanceof Node)) return;
@@ -94,9 +154,6 @@ export function TimelineAnnotationsDialog({
94
154
  }
95
155
  onDismiss(false);
96
156
  };
97
- updatePosition();
98
- window.addEventListener("resize", updatePosition);
99
- window.addEventListener("scroll", updatePosition, true);
100
157
  document.addEventListener("keydown", onKeyDown);
101
158
  document.addEventListener("pointerdown", onPointerDown);
102
159
  if (!focusAnnotationId) {
@@ -105,8 +162,6 @@ export function TimelineAnnotationsDialog({
105
162
  }, 0);
106
163
  }
107
164
  return () => {
108
- window.removeEventListener("resize", updatePosition);
109
- window.removeEventListener("scroll", updatePosition, true);
110
165
  document.removeEventListener("keydown", onKeyDown);
111
166
  document.removeEventListener("pointerdown", onPointerDown);
112
167
  };
@@ -118,92 +173,94 @@ export function TimelineAnnotationsDialog({
118
173
  ref={panelRef}
119
174
  role="dialog"
120
175
  tabIndex={-1}
176
+ data-og-annotation-review=""
121
177
  style={{
122
178
  left: position.left,
123
179
  top: position.top,
124
- transform: position.above ? "translateY(-100%)" : undefined,
180
+ maxHeight: position.maxHeight,
181
+ ...portalStyle,
125
182
  }}
126
- className="og-root fixed z-[75] box-border max-h-[min(32rem,70vh)] w-[min(25rem,calc(100vw-1.5rem))] overflow-y-auto rounded-og-lg border border-og-border bg-og-surface-1 p-3 text-og-fg shadow-xl outline-hidden"
127
- aria-label={editable ? "Review timeline annotations" : "Timeline annotations"}
183
+ className="og-root fixed z-[75] box-border flex w-[min(25rem,calc(100vw-1.5rem))] flex-col overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1 text-og-fg shadow-xl outline-hidden"
184
+ aria-label={editable ? "Edit quoted notes" : "Quoted notes"}
128
185
  >
129
- <div className="mb-2 flex items-center justify-between gap-3">
130
- <div>
131
- <p className="text-og-sm font-semibold">{countLabel}</p>
132
- <p className="text-og-xs text-og-fg-subtle">
133
- {editable ? "Add a note for each quoted source." : "Sent with this message."}
134
- </p>
135
- </div>
186
+ <div
187
+ ref={headerRef}
188
+ data-og-annotation-review-header=""
189
+ className="flex shrink-0 items-start justify-between gap-3 px-3 pt-3 pb-2"
190
+ >
191
+ <p className="min-w-0 pt-0.5 text-og-sm font-medium text-og-fg-muted">{countLabel}</p>
136
192
  <button
137
193
  type="button"
138
- className="rounded-md border-0 bg-transparent px-2 py-1 text-og-xs text-og-fg outline-hidden hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-[44px]"
194
+ className="inline-flex size-8 shrink-0 items-center justify-center rounded-md border-0 bg-transparent text-og-fg-muted outline-hidden hover:bg-og-surface-2 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:size-11"
195
+ aria-label="Close"
139
196
  onClick={() => onDismiss(true)}
140
197
  >
141
- Close
198
+ <XIcon className="size-3.5" aria-hidden="true" />
142
199
  </button>
143
200
  </div>
144
- <div className="grid gap-2.5">
145
- {annotations.map((annotation, index) => (
146
- <section
147
- key={annotation.id}
148
- className="rounded-og-md border border-og-border bg-og-surface-2/60 p-2.5"
149
- aria-label={`Annotation ${index + 1}`}
150
- >
151
- <div className="flex items-center justify-between gap-2">
152
- <button
153
- type="button"
154
- className="truncate rounded border-0 bg-transparent text-left text-og-xs font-medium text-og-fg-muted underline-offset-2 outline-hidden hover:text-og-fg hover:underline focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-[44px]"
155
- onClick={() => {
156
- const revealed =
157
- onRevealSource?.(annotation.source) ?? revealLoadedSource(annotation.source);
158
- setUnavailableId(revealed ? null : annotation.id);
159
- }}
160
- >
161
- {sourceLabel(annotation)} · view source
162
- </button>
163
- {editable && onRemove ? (
164
- <button
165
- type="button"
166
- className="shrink-0 rounded border-0 bg-transparent p-1 text-og-fg-subtle outline-hidden hover:bg-og-surface-1 hover:text-og-status-failed focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:size-[44px]"
167
- aria-label={`Remove annotation ${index + 1}`}
168
- onClick={() => onRemove(annotation.id)}
169
- >
170
- <span aria-hidden="true" className="text-og-md leading-none">
171
- ×
172
- </span>
173
- </button>
174
- ) : null}
175
- </div>
176
- {unavailableId === annotation.id ? (
177
- <p role="status" className="mt-1 text-og-xs text-og-status-waiting">
178
- Source is outside the loaded timeline window.
179
- </p>
180
- ) : null}
181
- <blockquote className="mt-2 max-h-28 overflow-auto whitespace-pre-wrap border-l-2 border-og-border pl-2 text-og-sm leading-5 text-og-fg-muted">
182
- {annotation.quote}
183
- </blockquote>
184
- {editable && onUpdate ? (
185
- <label className="mt-2 block text-og-xs font-medium text-og-fg-muted">
186
- Note
187
- <textarea
188
- ref={(node) => {
189
- if (node) noteRefs.current.set(annotation.id, node);
190
- else noteRefs.current.delete(annotation.id);
191
- }}
192
- value={annotation.note}
193
- rows={2}
194
- maxLength={2048}
195
- placeholder="What should the agent do with this?"
196
- className="mt-1 w-full resize-y rounded-og-sm border border-og-border bg-og-surface-1 px-2.5 py-2 text-og-sm leading-5 text-og-fg outline-hidden placeholder:text-og-fg-subtle focus:border-og-accent focus:ring-1 focus:ring-og-accent"
197
- onInput={(event) => onUpdate(annotation.id, event.currentTarget.value)}
198
- />
199
- </label>
200
- ) : annotation.note ? (
201
- <p className="mt-2 whitespace-pre-wrap text-og-sm leading-5 text-og-fg">
202
- {annotation.note}
203
- </p>
204
- ) : null}
205
- </section>
206
- ))}
201
+ <div
202
+ ref={listRef}
203
+ data-og-annotation-review-list=""
204
+ className="grid min-h-0 flex-1 gap-2.5 overflow-x-hidden overflow-y-auto overscroll-contain px-3 pb-3"
205
+ >
206
+ {annotations.map((annotation, index) => {
207
+ const ordinal = annotationDisplayOrdinal(annotation, index);
208
+ return (
209
+ <section
210
+ key={annotation.id}
211
+ data-og-annotation-id={annotation.id}
212
+ aria-label={`Annotation ${ordinal}`}
213
+ >
214
+ <AnnotationAccentRow>
215
+ <div className="flex items-start gap-1">
216
+ <div className="min-w-0 flex-1">
217
+ <p className="mb-0.5 text-og-xs font-medium tabular-nums text-og-fg-subtle">
218
+ Annotation {ordinal}
219
+ </p>
220
+ <AnnotationQuoteSourceButton
221
+ annotation={annotation}
222
+ lines={2}
223
+ onRevealSource={onRevealSource}
224
+ onUnavailable={setUnavailableId}
225
+ />
226
+ </div>
227
+ {editable && onRemove ? (
228
+ <button
229
+ type="button"
230
+ className="inline-flex size-7 shrink-0 items-center justify-center rounded-md border-0 bg-transparent text-og-fg-subtle outline-hidden hover:bg-og-surface-1 hover:text-og-status-failed focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:size-11"
231
+ aria-label={`Remove annotation ${ordinal}`}
232
+ onClick={() => onRemove(annotation.id)}
233
+ >
234
+ <XIcon className="size-3.5" aria-hidden="true" />
235
+ </button>
236
+ ) : null}
237
+ </div>
238
+ {unavailableId === annotation.id ? (
239
+ <p role="status" className="text-og-xs text-og-status-waiting">
240
+ Source is outside the loaded timeline window.
241
+ </p>
242
+ ) : null}
243
+ {editable && onUpdate ? (
244
+ <AnnotationNoteField
245
+ annotation={annotation}
246
+ inputRef={(node) => {
247
+ if (node) noteRefs.current.set(annotation.id, node);
248
+ else noteRefs.current.delete(annotation.id);
249
+ }}
250
+ onUpdate={onUpdate}
251
+ onCommit={() => commitNotes(annotation.id)}
252
+ />
253
+ ) : (
254
+ <AnnotationNotePreview
255
+ note={annotation.note}
256
+ annotationId={annotation.id}
257
+ ordinal={ordinal}
258
+ />
259
+ )}
260
+ </AnnotationAccentRow>
261
+ </section>
262
+ );
263
+ })}
207
264
  </div>
208
265
  </div>,
209
266
  document.body,