@opengeni/react 0.57.0 → 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 +654 -22
  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 +10 -3
  302. package/dist/realtime.js +229 -83
  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 +274 -60
  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,185 @@
1
+ import type { DraftTimelineAnnotation } from "@opengeni/sdk";
2
+ import { useLayoutEffect, useState, type RefObject } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { cn } from "../lib/cn";
5
+ import {
6
+ annotationBoxIntersects,
7
+ annotationViewportBox,
8
+ layoutAnnotationBadges,
9
+ type AnnotationBadgeAnchor,
10
+ type AnnotationBox,
11
+ } from "./timeline-annotation-layout";
12
+ import {
13
+ annotationDisplayOrdinal,
14
+ annotationHasNote,
15
+ annotatableText,
16
+ buildQuoteRange,
17
+ cssEscapeAttribute,
18
+ matchingQuoteInSource,
19
+ occurrenceOffsets,
20
+ } from "./timeline-annotation-shared";
21
+
22
+ function lastVisibleRect(range: Range): DOMRect | null {
23
+ try {
24
+ const rects = range.getClientRects();
25
+ for (let index = rects.length - 1; index >= 0; index--) {
26
+ const rect = rects.item(index);
27
+ if (rect && (rect.width > 0 || rect.height > 0)) return rect;
28
+ }
29
+ } catch {
30
+ // jsdom ranges may omit client rects.
31
+ }
32
+ try {
33
+ const bounding = range.getBoundingClientRect();
34
+ if (bounding.width > 0 || bounding.height > 0) return bounding;
35
+ } catch {
36
+ // jsdom ranges may omit layout geometry.
37
+ }
38
+ return null;
39
+ }
40
+
41
+ function occurrenceForAnnotation(
42
+ sourceEl: HTMLElement,
43
+ annotation: DraftTimelineAnnotation,
44
+ ): number {
45
+ const { text } = annotatableText(sourceEl);
46
+ const quote = matchingQuoteInSource(text, annotation.quote) ?? annotation.quote;
47
+ const offsets = occurrenceOffsets(text, quote);
48
+ if (offsets.length <= 1) return 0;
49
+ let best = 0;
50
+ let bestDistance = Number.POSITIVE_INFINITY;
51
+ offsets.forEach((offset, index) => {
52
+ const distance = Math.abs(offset - annotation.source.startOffset);
53
+ if (distance < bestDistance) {
54
+ best = index;
55
+ bestDistance = distance;
56
+ }
57
+ });
58
+ return best;
59
+ }
60
+
61
+ function timelineScroller(root: HTMLElement): HTMLElement {
62
+ if (root.matches("[data-og-timeline-scroller]")) return root;
63
+ const nested = root.querySelector("[data-og-timeline-scroller]");
64
+ return nested instanceof HTMLElement ? nested : root;
65
+ }
66
+
67
+ function currentAnnotationViewport(root: HTMLElement): AnnotationBox {
68
+ const scroller = timelineScroller(root);
69
+ const rect = scroller.getBoundingClientRect();
70
+ const scrollerBox = {
71
+ left: rect.left,
72
+ right: rect.right,
73
+ top: rect.top,
74
+ bottom: rect.bottom,
75
+ } satisfies AnnotationBox;
76
+ return annotationViewportBox(window.innerWidth || 1024, window.innerHeight || 768, scrollerBox);
77
+ }
78
+
79
+ function sourceInTimeline(root: HTMLElement, eventId: string): HTMLElement | null {
80
+ const source = root.querySelector(
81
+ `[data-og-annotation-source-key="${cssEscapeAttribute(eventId)}"]`,
82
+ );
83
+ return source instanceof HTMLElement ? source : null;
84
+ }
85
+
86
+ function collectMarkers(
87
+ root: HTMLElement | null,
88
+ annotations: readonly DraftTimelineAnnotation[],
89
+ ): AnnotationBadgeAnchor[] {
90
+ if (!root) return [];
91
+ const viewport = currentAnnotationViewport(root);
92
+ const next: AnnotationBadgeAnchor[] = [];
93
+ for (const [index, annotation] of annotations.entries()) {
94
+ const source = sourceInTimeline(root, annotation.source.eventId);
95
+ if (!source) continue;
96
+ const quote =
97
+ matchingQuoteInSource(annotatableText(source).text, annotation.quote) ?? annotation.quote;
98
+ const range = buildQuoteRange(source, quote, occurrenceForAnnotation(source, annotation));
99
+ if (!range) continue;
100
+ const rect = lastVisibleRect(range);
101
+ if (!rect) continue;
102
+ if (
103
+ !annotationBoxIntersects(
104
+ { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom },
105
+ viewport,
106
+ )
107
+ ) {
108
+ continue;
109
+ }
110
+ next.push({
111
+ id: annotation.id,
112
+ ordinal: annotationDisplayOrdinal(annotation, index),
113
+ left: rect.right,
114
+ top: rect.top,
115
+ incomplete: !annotationHasNote(annotation.note),
116
+ });
117
+ }
118
+ return layoutAnnotationBadges(next, viewport);
119
+ }
120
+
121
+ export function TimelineAnnotationMarkers({
122
+ annotations,
123
+ onSelect,
124
+ rootRef,
125
+ }: {
126
+ annotations: readonly DraftTimelineAnnotation[];
127
+ onSelect?: ((id: string) => void) | undefined;
128
+ rootRef: RefObject<HTMLElement | null>;
129
+ }) {
130
+ const [markers, setMarkers] = useState<AnnotationBadgeAnchor[]>([]);
131
+
132
+ useLayoutEffect(() => {
133
+ const root = rootRef.current;
134
+ if (!root || annotations.length === 0) {
135
+ setMarkers([]);
136
+ return;
137
+ }
138
+ const update = () => setMarkers(collectMarkers(root, annotations));
139
+ update();
140
+ window.addEventListener("resize", update);
141
+ window.addEventListener("scroll", update, true);
142
+ const observer = typeof ResizeObserver === "function" ? new ResizeObserver(update) : null;
143
+ observer?.observe(root);
144
+ for (const annotation of annotations) {
145
+ const source = sourceInTimeline(root, annotation.source.eventId);
146
+ if (source) observer?.observe(source);
147
+ }
148
+ return () => {
149
+ window.removeEventListener("resize", update);
150
+ window.removeEventListener("scroll", update, true);
151
+ observer?.disconnect();
152
+ };
153
+ }, [annotations, rootRef]);
154
+
155
+ if (markers.length === 0 || typeof document === "undefined") return null;
156
+ return createPortal(
157
+ <div className="og-root pointer-events-none fixed inset-0 z-[35]">
158
+ {markers.map((marker) => (
159
+ <button
160
+ key={marker.id}
161
+ type="button"
162
+ data-og-annotation-badge=""
163
+ data-og-annotation-badge-ordinal={marker.ordinal}
164
+ style={{ left: marker.left, top: marker.top, zIndex: marker.ordinal }}
165
+ className={cn(
166
+ "pointer-events-auto absolute flex h-4 min-w-4 -translate-x-1/2 -translate-y-[110%] items-center justify-center rounded-full bg-og-accent px-0.5 text-[10px] font-semibold tabular-nums text-og-accent-fg shadow-sm outline-hidden select-none after:absolute after:-inset-2 after:content-[''] focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:after:-inset-2.5",
167
+ marker.incomplete && "ring-1 ring-og-accent-fg/35",
168
+ )}
169
+ aria-label={`Annotation ${marker.ordinal}`}
170
+ onMouseDown={(event) => event.preventDefault()}
171
+ onClick={(event) => {
172
+ event.preventDefault();
173
+ event.stopPropagation();
174
+ onSelect?.(marker.id);
175
+ }}
176
+ >
177
+ {marker.ordinal}
178
+ </button>
179
+ ))}
180
+ </div>,
181
+ document.body,
182
+ );
183
+ }
184
+
185
+ export default TimelineAnnotationMarkers;
@@ -0,0 +1,9 @@
1
+ import { createContext, useContext, type RefObject } from "react";
2
+
3
+ /** Owning timeline scroller for quote-source navigation. */
4
+ export const TimelineAnnotationSourceRootContext =
5
+ createContext<RefObject<HTMLElement | null> | null>(null);
6
+
7
+ export function useTimelineAnnotationSourceRoot(): RefObject<HTMLElement | null> | null {
8
+ return useContext(TimelineAnnotationSourceRootContext);
9
+ }
@@ -1,7 +1,17 @@
1
1
  import type { DraftTimelineAnnotation } from "@opengeni/sdk";
2
+ import { QuoteIcon } from "lucide-react";
2
3
  import { useEffect, useRef, useState, type RefObject } from "react";
3
4
  import { createPortal } from "react-dom";
5
+ import { usePortalTokenStyle } from "../lib/use-portal-token-style";
4
6
  import type { TimelineAnnotationSourceDescriptor } from "../timeline";
7
+ import {
8
+ clipRangeToSource,
9
+ matchingQuoteInSource,
10
+ occurrenceOffsets,
11
+ quoteOccurrenceIndex,
12
+ truncateAnnotationQuote,
13
+ visibleClientRect,
14
+ } from "./timeline-annotation-shared";
5
15
 
6
16
  type SelectionCandidate = {
7
17
  annotation: DraftTimelineAnnotation;
@@ -10,10 +20,11 @@ type SelectionCandidate = {
10
20
  keyboard: boolean;
11
21
  };
12
22
 
13
- const INTERACTIVE_SELECTOR =
14
- 'a,button,input,textarea,select,summary,[role="button"],[contenteditable="true"],[tabindex]:not([tabindex="-1"])';
23
+ const CONTROL_SELECTOR = "button,input,textarea,select,summary,[contenteditable='true']";
15
24
  const SOURCE_CONTEXT_BYTES = 160;
16
25
  const MAX_QUOTE_BYTES = 16 * 1024;
26
+ const POPOVER_WIDTH = 280;
27
+ const POPOVER_HEIGHT = 64;
17
28
 
18
29
  function utf8Prefix(value: string, maxBytes: number): string {
19
30
  let output = "";
@@ -49,33 +60,21 @@ function containingSource(node: Node | null): HTMLElement | null {
49
60
  return source instanceof HTMLElement ? source : null;
50
61
  }
51
62
 
52
- function isInteractiveSelection(node: Node | null, boundary: HTMLElement): boolean {
53
- const element = selectionElement(node);
54
- const interactive = element?.closest(INTERACTIVE_SELECTOR);
55
- return interactive instanceof Element && boundary.contains(interactive);
56
- }
57
-
58
- function occurrenceOffsets(text: string, quote: string): number[] {
59
- const offsets: number[] = [];
60
- let cursor = 0;
61
- while (cursor <= text.length - quote.length) {
62
- const offset = text.indexOf(quote, cursor);
63
- if (offset < 0) break;
64
- offsets.push(offset);
65
- cursor = offset + 1;
66
- }
67
- return offsets;
63
+ function resolveSourceBoundary(range: Range, root: HTMLElement): HTMLElement | null {
64
+ const start = containingSource(range.startContainer);
65
+ const end = containingSource(range.endContainer);
66
+ if (start && end && start !== end) return null;
67
+ const boundary = start ?? end;
68
+ if (!boundary || !root.contains(boundary)) return null;
69
+ return boundary;
68
70
  }
69
71
 
70
- function selectedOccurrence(boundary: HTMLElement, range: Range, quote: string): number {
71
- try {
72
- const prefix = range.cloneRange();
73
- prefix.selectNodeContents(boundary);
74
- prefix.setEnd(range.startContainer, range.startOffset);
75
- return occurrenceOffsets(prefix.toString(), quote).length;
76
- } catch {
77
- return 0;
78
- }
72
+ function isWhollyInsideControl(range: Range, boundary: HTMLElement): boolean {
73
+ const start = selectionElement(range.startContainer)?.closest(CONTROL_SELECTOR);
74
+ const end = selectionElement(range.endContainer)?.closest(CONTROL_SELECTOR);
75
+ return (
76
+ start instanceof Element && start === end && boundary.contains(start) && start !== boundary
77
+ );
79
78
  }
80
79
 
81
80
  function annotationId(): string {
@@ -85,6 +84,18 @@ function annotationId(): string {
85
84
  return `annotation-${Date.now()}-${Math.random().toString(16).slice(2)}`;
86
85
  }
87
86
 
87
+ function clamp(value: number, min: number, max: number): number {
88
+ return Math.min(Math.max(value, min), max);
89
+ }
90
+
91
+ function popoverPosition(rect: DOMRect): { left: number; top: number } {
92
+ const half = POPOVER_WIDTH / 2;
93
+ const left = clamp(rect.left + rect.width / 2, 12 + half, window.innerWidth - 12 - half);
94
+ const preferBelow = rect.bottom + 8 + POPOVER_HEIGHT <= window.innerHeight - 12;
95
+ const top = preferBelow ? rect.bottom + 8 : Math.max(12, rect.top - POPOVER_HEIGHT - 8);
96
+ return { left, top };
97
+ }
98
+
88
99
  function buildCandidate(
89
100
  root: HTMLElement,
90
101
  sources: ReadonlyMap<string, TimelineAnnotationSourceDescriptor>,
@@ -93,18 +104,15 @@ function buildCandidate(
93
104
  const selection = document.getSelection();
94
105
  if (!selection || selection.rangeCount !== 1 || selection.isCollapsed) return null;
95
106
  const range = selection.getRangeAt(0);
96
- const startBoundary = containingSource(range.startContainer);
97
- const endBoundary = containingSource(range.endContainer);
98
- if (!startBoundary || startBoundary !== endBoundary || !root.contains(startBoundary)) return null;
99
- if (
100
- isInteractiveSelection(range.startContainer, startBoundary) ||
101
- isInteractiveSelection(range.endContainer, startBoundary)
102
- ) {
103
- return null;
104
- }
107
+ const startBoundary = resolveSourceBoundary(range, root);
108
+ if (!startBoundary) return null;
109
+ if (isWhollyInsideControl(range, startBoundary)) return null;
110
+ const clipped = clipRangeToSource(range, startBoundary);
111
+ if (!clipped) return null;
105
112
  const sourceKey = startBoundary.dataset.ogAnnotationSourceKey;
106
113
  const source = sourceKey ? sources.get(sourceKey) : undefined;
107
- const quote = selection.toString();
114
+ const rawQuote = clipped.toString();
115
+ const quote = (source ? matchingQuoteInSource(source.text, rawQuote) : null) ?? rawQuote;
108
116
  if (
109
117
  !source ||
110
118
  quote.trim().length === 0 ||
@@ -114,11 +122,12 @@ function buildCandidate(
114
122
  }
115
123
  const sourceOffsets = occurrenceOffsets(source.text, quote);
116
124
  if (sourceOffsets.length === 0) return null;
117
- const occurrence = selectedOccurrence(startBoundary, range, quote);
125
+ const occurrence = quoteOccurrenceIndex(startBoundary, clipped, quote);
118
126
  const startOffset = sourceOffsets[Math.min(occurrence, sourceOffsets.length - 1)]!;
119
127
  const endOffset = startOffset + quote.length;
120
- const rect = range.getBoundingClientRect();
121
- if (rect.width === 0 && rect.height === 0) return null;
128
+ const rect = visibleClientRect(range) ?? visibleClientRect(clipped);
129
+ if (!rect) return null;
130
+ const position = popoverPosition(rect);
122
131
  return {
123
132
  annotation: {
124
133
  id: annotationId(),
@@ -137,8 +146,8 @@ function buildCandidate(
137
146
  ...(source.label ? { label: source.label } : {}),
138
147
  },
139
148
  },
140
- left: Math.min(Math.max(12, rect.left + rect.width / 2), window.innerWidth - 12),
141
- top: rect.bottom + 48 <= window.innerHeight ? rect.bottom + 8 : Math.max(12, rect.top - 40),
149
+ left: position.left,
150
+ top: position.top,
142
151
  keyboard,
143
152
  };
144
153
  }
@@ -154,6 +163,9 @@ export function TimelineAnnotationSelection({
154
163
  }) {
155
164
  const [candidate, setCandidate] = useState<SelectionCandidate | null>(null);
156
165
  const buttonRef = useRef<HTMLButtonElement | null>(null);
166
+ const initialSelectionObservedRef = useRef(false);
167
+ const pointerOriginRef = useRef<"unset" | "inside" | "outside">("unset");
168
+ const portalStyle = usePortalTokenStyle(rootRef.current);
157
169
 
158
170
  useEffect(() => {
159
171
  const root = rootRef.current;
@@ -164,7 +176,26 @@ export function TimelineAnnotationSelection({
164
176
  const update = (keyboard: boolean) => {
165
177
  setCandidate(buildCandidate(root, sources, keyboard));
166
178
  };
167
- const onPointerUp = () => window.setTimeout(() => update(false), 0);
179
+ // A user may finish selecting text before this lazy component arrives.
180
+ // Reconcile once; later prop changes must not revive dismissed selections.
181
+ if (!initialSelectionObservedRef.current) {
182
+ initialSelectionObservedRef.current = true;
183
+ update(false);
184
+ }
185
+ const onRootPointerUp = (event: PointerEvent) => {
186
+ if (event.target instanceof Node && buttonRef.current?.contains(event.target)) return;
187
+ // Tests may fire only pointerup on the source. A real click that started
188
+ // outside the timeline must not resurrect leftover selection.
189
+ if (pointerOriginRef.current === "outside") return;
190
+ window.setTimeout(() => update(false), 0);
191
+ };
192
+ const onDocumentPointerUp = (event: PointerEvent) => {
193
+ if (event.target instanceof Node && buttonRef.current?.contains(event.target)) return;
194
+ const startedInRoot = pointerOriginRef.current === "inside";
195
+ pointerOriginRef.current = "unset";
196
+ if (!startedInRoot) return;
197
+ window.setTimeout(() => update(false), 0);
198
+ };
168
199
  const onKeyUp = (event: KeyboardEvent) => {
169
200
  if (event.key === "Escape") {
170
201
  setCandidate(null);
@@ -173,46 +204,67 @@ export function TimelineAnnotationSelection({
173
204
  window.setTimeout(() => update(true), 0);
174
205
  };
175
206
  const onPointerDown = (event: PointerEvent) => {
176
- if (
177
- candidate &&
178
- !(event.target instanceof Node && buttonRef.current?.contains(event.target))
179
- ) {
180
- setCandidate(null);
207
+ if (event.target instanceof Node && buttonRef.current?.contains(event.target)) {
208
+ event.preventDefault();
209
+ return;
181
210
  }
211
+ pointerOriginRef.current =
212
+ event.target instanceof Node && root.contains(event.target) ? "inside" : "outside";
213
+ setCandidate(null);
182
214
  };
183
215
  const onDocumentKeyDown = (event: KeyboardEvent) => {
184
216
  if (event.key === "Escape") setCandidate(null);
185
217
  };
186
- root.addEventListener("pointerup", onPointerUp);
218
+ const onSelectionChange = () => {
219
+ if (buttonRef.current && document.activeElement === buttonRef.current) return;
220
+ const selection = document.getSelection();
221
+ if (!selection || selection.isCollapsed) setCandidate(null);
222
+ };
223
+ root.addEventListener("pointerup", onRootPointerUp);
187
224
  root.addEventListener("keyup", onKeyUp);
225
+ document.addEventListener("pointerup", onDocumentPointerUp);
188
226
  document.addEventListener("pointerdown", onPointerDown);
189
227
  document.addEventListener("keydown", onDocumentKeyDown);
228
+ document.addEventListener("selectionchange", onSelectionChange);
190
229
  return () => {
191
- root.removeEventListener("pointerup", onPointerUp);
230
+ root.removeEventListener("pointerup", onRootPointerUp);
192
231
  root.removeEventListener("keyup", onKeyUp);
232
+ document.removeEventListener("pointerup", onDocumentPointerUp);
193
233
  document.removeEventListener("pointerdown", onPointerDown);
194
234
  document.removeEventListener("keydown", onDocumentKeyDown);
235
+ document.removeEventListener("selectionchange", onSelectionChange);
195
236
  };
196
- }, [candidate, onAnnotate, rootRef, sources]);
237
+ }, [onAnnotate, rootRef, sources]);
197
238
 
198
239
  useEffect(() => {
199
240
  if (candidate?.keyboard) buttonRef.current?.focus();
200
241
  }, [candidate]);
201
242
 
202
243
  if (!candidate || !onAnnotate || typeof document === "undefined") return null;
244
+ const preview = truncateAnnotationQuote(candidate.annotation.quote, 72);
203
245
  return createPortal(
204
246
  <button
205
247
  ref={buttonRef}
206
248
  type="button"
207
- style={{ left: candidate.left, top: candidate.top }}
208
- className="og-root fixed z-[80] -translate-x-1/2 rounded-full border border-og-border bg-og-surface-1 px-3 py-1.5 text-og-sm font-medium text-og-fg shadow-lg outline-hidden transition hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-[44px]"
249
+ data-og-annotation-popover=""
250
+ style={{ left: candidate.left, top: candidate.top, ...portalStyle }}
251
+ className="og-root fixed z-[80] flex max-w-[min(18rem,calc(100vw-1.5rem))] -translate-x-1/2 items-start gap-2 rounded-2xl border border-og-border bg-og-surface-1 px-3 py-2 text-og-sm font-medium text-og-fg shadow-xl outline-hidden transition hover:border-og-accent/40 hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-[44px]"
252
+ aria-label={`Add a note about “${preview}”`}
253
+ title={candidate.annotation.quote}
254
+ onPointerDown={(event) => event.preventDefault()}
209
255
  onClick={() => {
210
256
  onAnnotate(candidate.annotation);
211
257
  document.getSelection()?.removeAllRanges();
212
258
  setCandidate(null);
213
259
  }}
214
260
  >
215
- Annotate
261
+ <QuoteIcon className="mt-0.5 size-3.5 shrink-0 text-og-accent" aria-hidden="true" />
262
+ <span className="min-w-0 text-left">
263
+ <span className="block leading-5">Add note</span>
264
+ <span className="mt-0.5 block truncate text-og-xs font-normal text-og-fg-muted">
265
+ {preview}
266
+ </span>
267
+ </span>
216
268
  </button>,
217
269
  document.body,
218
270
  );