@opengeni/react 1.0.1 → 1.0.2-canary.37202341988001

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 (632) hide show
  1. package/README.md +660 -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-SHYKQRNX.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-26ZNDDLZ.js +453 -0
  18. package/dist/chunk-26ZNDDLZ.js.map +1 -0
  19. package/dist/chunk-3CTRFMAK.js +359 -0
  20. package/dist/chunk-3CTRFMAK.js.map +1 -0
  21. package/dist/chunk-447JLCBU.js +209 -0
  22. package/dist/chunk-447JLCBU.js.map +1 -0
  23. package/dist/chunk-4RVYOY4O.js +379 -0
  24. package/dist/chunk-4RVYOY4O.js.map +1 -0
  25. package/dist/chunk-5CVXZA3Y.js +292 -0
  26. package/dist/chunk-5CVXZA3Y.js.map +1 -0
  27. package/dist/chunk-5J4FOW6Q.js +108 -0
  28. package/dist/chunk-5J4FOW6Q.js.map +1 -0
  29. package/dist/chunk-742CZ3L3.js +481 -0
  30. package/dist/chunk-742CZ3L3.js.map +1 -0
  31. package/dist/chunk-A2PI6UMY.js +41 -0
  32. package/dist/chunk-A2PI6UMY.js.map +1 -0
  33. package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
  34. package/dist/chunk-A4UJB2MM.js.map +1 -0
  35. package/dist/chunk-B3V6TG77.js +41 -0
  36. package/dist/chunk-B3V6TG77.js.map +1 -0
  37. package/dist/chunk-BRM6FVZA.js +302 -0
  38. package/dist/chunk-BRM6FVZA.js.map +1 -0
  39. package/dist/chunk-C5X5AJXK.js +182 -0
  40. package/dist/chunk-C5X5AJXK.js.map +1 -0
  41. package/dist/{chunk-6KLX2RH5.js → chunk-DO544OSV.js} +1075 -79
  42. package/dist/chunk-DO544OSV.js.map +1 -0
  43. package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
  44. package/dist/chunk-DYWBUX5Q.js.map +1 -0
  45. package/dist/{chunk-HA46CYQK.js → chunk-EESD3PY3.js} +792 -537
  46. package/dist/chunk-EESD3PY3.js.map +1 -0
  47. package/dist/{chunk-5UQPNLIO.js → chunk-EN3YTHKR.js} +4117 -3896
  48. package/dist/chunk-EN3YTHKR.js.map +1 -0
  49. package/dist/chunk-ERGYJIBB.js +21 -0
  50. package/dist/chunk-ERGYJIBB.js.map +1 -0
  51. package/dist/chunk-FZCP527Y.js +116 -0
  52. package/dist/chunk-FZCP527Y.js.map +1 -0
  53. package/dist/chunk-GIMRELBW.js +14 -0
  54. package/dist/chunk-GIMRELBW.js.map +1 -0
  55. package/dist/chunk-GYVRFZDY.js +2733 -0
  56. package/dist/chunk-GYVRFZDY.js.map +1 -0
  57. package/dist/{chunk-LLOLUHVG.js → chunk-HDJWDK7W.js} +1358 -2746
  58. package/dist/chunk-HDJWDK7W.js.map +1 -0
  59. package/dist/chunk-I7IWRQLN.js +1608 -0
  60. package/dist/chunk-I7IWRQLN.js.map +1 -0
  61. package/dist/chunk-IT4BJUGF.js +13055 -0
  62. package/dist/chunk-IT4BJUGF.js.map +1 -0
  63. package/dist/chunk-IWIDV7SB.js +1 -0
  64. package/dist/chunk-IWIDV7SB.js.map +1 -0
  65. package/dist/chunk-J2QWVSQY.js +312 -0
  66. package/dist/chunk-J2QWVSQY.js.map +1 -0
  67. package/dist/chunk-J6DBS4T3.js +371 -0
  68. package/dist/chunk-J6DBS4T3.js.map +1 -0
  69. package/dist/{chunk-B6WPZSTT.js → chunk-JIQYUGVL.js} +1331 -1163
  70. package/dist/chunk-JIQYUGVL.js.map +1 -0
  71. package/dist/chunk-JT4JW7BC.js +54 -0
  72. package/dist/chunk-JT4JW7BC.js.map +1 -0
  73. package/dist/chunk-K3HQAKQX.js +24 -0
  74. package/dist/chunk-K3HQAKQX.js.map +1 -0
  75. package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
  76. package/dist/chunk-PNY3JKBJ.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-RLUSC2WA.js +299 -0
  80. package/dist/chunk-RLUSC2WA.js.map +1 -0
  81. package/dist/{chunk-IGC6A2ZI.js → chunk-RSI7XYXL.js} +777 -246
  82. package/dist/chunk-RSI7XYXL.js.map +1 -0
  83. package/dist/chunk-SCOTPE2I.js +589 -0
  84. package/dist/chunk-SCOTPE2I.js.map +1 -0
  85. package/dist/{chunk-C5ZPSSS5.js → chunk-TKOTKRWY.js} +5 -4
  86. package/dist/{chunk-C5ZPSSS5.js.map → chunk-TKOTKRWY.js.map} +1 -1
  87. package/dist/chunk-TMYGL6X5.js +742 -0
  88. package/dist/chunk-TMYGL6X5.js.map +1 -0
  89. package/dist/chunk-UGLEYEMP.js +33 -0
  90. package/dist/chunk-UGLEYEMP.js.map +1 -0
  91. package/dist/chunk-UK4TINKT.js +27 -0
  92. package/dist/chunk-UK4TINKT.js.map +1 -0
  93. package/dist/chunk-UTRTG6LH.js +220 -0
  94. package/dist/chunk-UTRTG6LH.js.map +1 -0
  95. package/dist/chunk-WEHMPOXK.js +39 -0
  96. package/dist/chunk-WEHMPOXK.js.map +1 -0
  97. package/dist/chunk-WGXVEJO5.js +319 -0
  98. package/dist/chunk-WGXVEJO5.js.map +1 -0
  99. package/dist/chunk-WRHIZYZF.js +988 -0
  100. package/dist/chunk-WRHIZYZF.js.map +1 -0
  101. package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
  102. package/dist/chunk-WUISZ3WU.js.map +1 -0
  103. package/dist/chunk-XCHWDJ22.js +107 -0
  104. package/dist/chunk-XCHWDJ22.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-YM2DE7BQ.js +3124 -0
  110. package/dist/chunk-YM2DE7BQ.js.map +1 -0
  111. package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
  112. package/dist/chunk-YQEAA6LT.js.map +1 -0
  113. package/dist/chunk-YV4L3ILF.js +9 -0
  114. package/dist/chunk-YV4L3ILF.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 +58 -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 +89 -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/session-proxy-scope.d.ts +21 -0
  185. package/dist/components/timeline-anchor.d.ts +24 -0
  186. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  187. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  188. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  189. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  190. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  191. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  192. package/dist/components/timeline-annotations.d.ts +13 -3
  193. package/dist/components/timeline-reading-progress.d.ts +11 -0
  194. package/dist/components/timeline-search.d.ts +34 -0
  195. package/dist/components/timeline-settlement.d.ts +16 -0
  196. package/dist/components/tip-follow.d.ts +16 -0
  197. package/dist/components/usage-limit-notice.d.ts +49 -0
  198. package/dist/components/usage-member-list.d.ts +91 -0
  199. package/dist/components/usage-meter.d.ts +73 -0
  200. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  201. package/dist/components/user-message-body.d.ts +10 -1
  202. package/dist/components/workspace-dock.d.ts +6 -2
  203. package/dist/composer.d.ts +5 -4
  204. package/dist/composer.js +15 -9
  205. package/dist/computer-viewer-6SRGWRUX.js +19 -0
  206. package/dist/computer-viewer-6SRGWRUX.js.map +1 -0
  207. package/dist/connect-account-identity.d.ts +8 -0
  208. package/dist/connect-accounts.d.ts +15 -0
  209. package/dist/connect-chooser.d.ts +18 -0
  210. package/dist/connect-panel.d.ts +18 -0
  211. package/dist/connect-setup.d.ts +16 -0
  212. package/dist/connect.d.ts +21 -0
  213. package/dist/connect.js +2129 -0
  214. package/dist/connect.js.map +1 -0
  215. package/dist/connection-catalog.d.ts +38 -0
  216. package/dist/connection-discovery.d.ts +12 -0
  217. package/dist/connection-installed.d.ts +17 -0
  218. package/dist/connection-logo.d.ts +9 -0
  219. package/dist/connection-service-logo.d.ts +8 -0
  220. package/dist/connection-service-presentation.d.ts +13 -0
  221. package/dist/connection-skeleton.d.ts +5 -0
  222. package/dist/connection-type-picker.d.ts +6 -0
  223. package/dist/conversation-timeline.d.ts +5 -0
  224. package/dist/desktop.d.ts +7 -0
  225. package/dist/desktop.js +26 -0
  226. package/dist/desktop.js.map +1 -0
  227. package/dist/device-authorization.d.ts +23 -0
  228. package/dist/diffs.d.ts +8 -0
  229. package/dist/diffs.js +14 -0
  230. package/dist/diffs.js.map +1 -0
  231. package/dist/discovery-cache.d.ts +5 -0
  232. package/dist/editor.d.ts +7 -0
  233. package/dist/editor.js +21 -0
  234. package/dist/editor.js.map +1 -0
  235. package/dist/embedded-session-client.d.ts +23 -0
  236. package/dist/file-node-visibility.d.ts +15 -0
  237. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
  238. package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
  239. package/dist/hooks/channel-cache.d.ts +23 -0
  240. package/dist/hooks/latest-question.d.ts +25 -0
  241. package/dist/hooks/shared-machines-list.d.ts +14 -0
  242. package/dist/hooks/use-attached-browsers.d.ts +2 -1
  243. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  244. package/dist/hooks/use-browser-session.d.ts +12 -1
  245. package/dist/hooks/use-channels.d.ts +1 -0
  246. package/dist/hooks/use-codex-accounts.d.ts +25 -7
  247. package/dist/hooks/use-composer.d.ts +45 -9
  248. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  249. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  250. package/dist/hooks/use-computer-session.d.ts +2 -0
  251. package/dist/hooks/use-connect.d.ts +22 -0
  252. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  253. package/dist/hooks/use-file-attachments.d.ts +21 -2
  254. package/dist/hooks/use-machine-chip.d.ts +3 -3
  255. package/dist/hooks/use-machines.d.ts +19 -1
  256. package/dist/hooks/use-sandbox-files.d.ts +5 -1
  257. package/dist/hooks/use-session-background-commands.d.ts +14 -0
  258. package/dist/hooks/use-session-events.d.ts +30 -8
  259. package/dist/hooks/use-session-lineage.d.ts +4 -0
  260. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  261. package/dist/hooks/use-session.d.ts +6 -0
  262. package/dist/hooks/use-turn-queue.d.ts +12 -0
  263. package/dist/hooks/use-usage.d.ts +40 -0
  264. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  265. package/dist/hooks/use-workspace-sessions.d.ts +27 -5
  266. package/dist/human-input.d.ts +3 -1
  267. package/dist/identity-link-accounts.d.ts +11 -0
  268. package/dist/identity-link-consent.d.ts +18 -0
  269. package/dist/index.d.ts +60 -17
  270. package/dist/index.js +2238 -6201
  271. package/dist/index.js.map +1 -1
  272. package/dist/interaction.d.ts +1 -1
  273. package/dist/interaction.js +35 -184
  274. package/dist/interaction.js.map +1 -1
  275. package/dist/latest-question-HTRIS4KJ.js +117 -0
  276. package/dist/latest-question-HTRIS4KJ.js.map +1 -0
  277. package/dist/lib/error-message.d.ts +7 -0
  278. package/dist/lib/format.d.ts +36 -2
  279. package/dist/lib/host-theme.d.ts +70 -0
  280. package/dist/lib/interaction-errors.d.ts +6 -0
  281. package/dist/lib/menu-styles.d.ts +22 -0
  282. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  283. package/dist/lib/workbench-peers.d.ts +36 -0
  284. package/dist/lib/xterm-theme.d.ts +7 -5
  285. package/dist/machines.d.ts +4 -2
  286. package/dist/machines.js +14 -4
  287. package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
  288. package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
  289. package/dist/mcp-connection-status.d.ts +14 -0
  290. package/dist/model-policy-picker-menu-M54ISBMN.js +14 -0
  291. package/dist/model-policy-picker-menu-M54ISBMN.js.map +1 -0
  292. package/dist/model-policy.d.ts +19 -3
  293. package/dist/model-policy.js +9 -1
  294. package/dist/older-history.d.ts +30 -0
  295. package/dist/platform-activity-row-627BFZ46.js +182 -0
  296. package/dist/platform-activity-row-627BFZ46.js.map +1 -0
  297. package/dist/plugin-details.d.ts +14 -0
  298. package/dist/plugin-discovery.d.ts +25 -0
  299. package/dist/provider.d.ts +13 -1
  300. package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
  301. package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
  302. package/dist/realtime/realtime-control.d.ts +6 -3
  303. package/dist/realtime.js +133 -74
  304. package/dist/realtime.js.map +1 -1
  305. package/dist/sandbox-files-GORZOUUJ.js +20 -0
  306. package/dist/sandbox-files-GORZOUUJ.js.map +1 -0
  307. package/dist/session-auth-recommendation.d.ts +5 -0
  308. package/dist/session-capability-policy.d.ts +12 -0
  309. package/dist/session-ui.d.ts +30 -2
  310. package/dist/session-ui.js +85 -7
  311. package/dist/session-ui.js.map +1 -1
  312. package/dist/session.d.ts +8 -2
  313. package/dist/session.js +30 -19
  314. package/dist/sites-ui.d.ts +34 -0
  315. package/dist/sites.d.ts +3 -0
  316. package/dist/sites.js +11 -0
  317. package/dist/sites.js.map +1 -0
  318. package/dist/skill-discovery.d.ts +47 -0
  319. package/dist/terminal.d.ts +8 -0
  320. package/dist/terminal.js +31 -0
  321. package/dist/terminal.js.map +1 -0
  322. package/dist/timeline/activity-rail.d.ts +11 -2
  323. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  324. package/dist/timeline/compaction-copy.d.ts +10 -0
  325. package/dist/timeline/entrance.d.ts +13 -1
  326. package/dist/timeline/genie-loading.d.ts +34 -0
  327. package/dist/timeline/index.d.ts +6 -2
  328. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  329. package/dist/timeline/platform-activity-row.d.ts +14 -0
  330. package/dist/timeline/presented-image.d.ts +6 -0
  331. package/dist/timeline/projection.d.ts +31 -2
  332. package/dist/timeline/registry.d.ts +2 -0
  333. package/dist/timeline/retained-image.d.ts +18 -0
  334. package/dist/timeline/rolling-activity.d.ts +11 -0
  335. package/dist/timeline/screenshot-lightbox.d.ts +16 -1
  336. package/dist/timeline/shared.d.ts +8 -3
  337. package/dist/timeline/startup-preference.d.ts +3 -0
  338. package/dist/timeline/startup-timings.d.ts +4 -0
  339. package/dist/timeline/tool-display-name.d.ts +2 -1
  340. package/dist/timeline/turn-summary.d.ts +34 -3
  341. package/dist/timeline/types.d.ts +147 -7
  342. package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
  343. package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
  344. package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
  345. package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
  346. package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
  347. package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
  348. package/dist/types/machines.d.ts +2 -2
  349. package/dist/usage/allowance-copy.d.ts +25 -0
  350. package/dist/usage/summary.d.ts +35 -0
  351. package/dist/usage.d.ts +13 -0
  352. package/dist/usage.js +1074 -0
  353. package/dist/usage.js.map +1 -0
  354. package/package.json +44 -4
  355. package/src/accounts.tsx +1072 -0
  356. package/src/approvals.ts +8 -1
  357. package/src/artifacts.ts +42 -0
  358. package/src/assets/README.md +8 -0
  359. package/src/assets/gmail.ico +0 -0
  360. package/src/assets/outlook.ico +0 -0
  361. package/src/capability-catalog-row.tsx +94 -0
  362. package/src/capability-logo-fallback.ts +22 -0
  363. package/src/client.ts +22 -13
  364. package/src/commands/registry.ts +18 -15
  365. package/src/commands/types.ts +2 -0
  366. package/src/components/anthropic-mark.tsx +10 -0
  367. package/src/components/approval-surface.tsx +171 -37
  368. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  369. package/src/components/artifacts/artifact-sandbox.tsx +185 -0
  370. package/src/components/artifacts/artifact-surface.tsx +39 -19
  371. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  372. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  373. package/src/components/artifacts/document-editor.tsx +141 -16
  374. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  375. package/src/components/artifacts/editable-artifact-view.tsx +187 -0
  376. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  377. package/src/components/artifacts/editable-document.tsx +37 -36
  378. package/src/components/artifacts/editable-presentation.tsx +36 -18
  379. package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
  380. package/src/components/artifacts/index.ts +44 -0
  381. package/src/components/artifacts/inline-html-document.ts +24 -0
  382. package/src/components/artifacts/latest-task-runner.ts +49 -0
  383. package/src/components/artifacts/presentation-editor.tsx +323 -67
  384. package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
  385. package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
  386. package/src/components/artifacts/site-view.tsx +116 -0
  387. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  388. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  389. package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
  390. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  391. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  392. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  393. package/src/components/browser-select-control.tsx +312 -0
  394. package/src/components/browser-viewer.tsx +1054 -314
  395. package/src/components/chat-composer.tsx +131 -85
  396. package/src/components/child-session-link.tsx +27 -0
  397. package/src/components/claude-mark.tsx +10 -0
  398. package/src/components/code-editor.tsx +13 -16
  399. package/src/components/composer-transcription-control.tsx +7 -5
  400. package/src/components/composer.tsx +376 -49
  401. package/src/components/computer-viewer.tsx +1041 -329
  402. package/src/components/copy-button.tsx +13 -5
  403. package/src/components/desktop-viewer.tsx +1 -1
  404. package/src/components/enrollment-consent.tsx +65 -7
  405. package/src/components/enrollment-device-flow.tsx +1 -1
  406. package/src/components/file-browser.tsx +158 -34
  407. package/src/components/fleet-tile.tsx +8 -16
  408. package/src/components/generated-video-player.tsx +4 -2
  409. package/src/components/grok-mark.tsx +33 -0
  410. package/src/components/human-input-form.tsx +455 -114
  411. package/src/components/human-input-surface.tsx +18 -7
  412. package/src/components/interaction-intervention-banner.tsx +2 -2
  413. package/src/components/machine-card.tsx +119 -4
  414. package/src/components/machine-dock-bar.tsx +1 -1
  415. package/src/components/machine-input-display.ts +23 -2
  416. package/src/components/machines/machine-detail.tsx +52 -2
  417. package/src/components/machines/machine-operation-policy.tsx +179 -0
  418. package/src/components/machines-dashboard.tsx +8 -17
  419. package/src/components/markdown-table-layout.ts +132 -0
  420. package/src/components/markdown.tsx +473 -44
  421. package/src/components/message-timeline.tsx +2754 -665
  422. package/src/components/model-mark.tsx +90 -0
  423. package/src/components/model-picker.tsx +15 -4
  424. package/src/components/model-policy-picker-menu.tsx +424 -0
  425. package/src/components/model-policy-picker.tsx +337 -381
  426. package/src/components/open-geni-chat.tsx +338 -0
  427. package/src/components/open-geni-links.tsx +179 -0
  428. package/src/components/openrouter-mark.tsx +13 -0
  429. package/src/components/pierre-diff.tsx +41 -16
  430. package/src/components/pierre-file.tsx +36 -11
  431. package/src/components/preview-loading.tsx +154 -0
  432. package/src/components/queue-item-content.ts +14 -0
  433. package/src/components/queue-surface-implementation.tsx +132 -42
  434. package/src/components/queue-surface-state.tsx +3 -1
  435. package/src/components/sandbox-files.tsx +267 -35
  436. package/src/components/sandbox-terminal.tsx +48 -11
  437. package/src/components/sandbox-workspace.tsx +337 -135
  438. package/src/components/session-capability-frame.tsx +192 -0
  439. package/src/components/session-chrome.tsx +1027 -328
  440. package/src/components/session-commands-panel.tsx +126 -0
  441. package/src/components/session-commands.tsx +18 -0
  442. package/src/components/session-connection-request.tsx +97 -0
  443. package/src/components/session-conversation.tsx +526 -0
  444. package/src/components/session-list.tsx +250 -0
  445. package/src/components/session-mcp-capability-card.tsx +680 -0
  446. package/src/components/session-proxy-scope.tsx +92 -0
  447. package/src/components/session-status.tsx +1 -1
  448. package/src/components/timeline-anchor.tsx +119 -0
  449. package/src/components/timeline-annotation-chrome.tsx +196 -0
  450. package/src/components/timeline-annotation-layout.ts +268 -0
  451. package/src/components/timeline-annotation-markers.tsx +185 -0
  452. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  453. package/src/components/timeline-annotation-selection.tsx +106 -54
  454. package/src/components/timeline-annotation-shared.ts +245 -0
  455. package/src/components/timeline-annotations-dialog.tsx +185 -128
  456. package/src/components/timeline-annotations.tsx +189 -45
  457. package/src/components/timeline-reading-progress.ts +80 -0
  458. package/src/components/timeline-search.tsx +168 -0
  459. package/src/components/timeline-settlement.ts +60 -0
  460. package/src/components/tip-follow.ts +70 -7
  461. package/src/components/tooltip.tsx +38 -5
  462. package/src/components/usage-limit-notice.tsx +179 -0
  463. package/src/components/usage-member-list.tsx +792 -0
  464. package/src/components/usage-meter.tsx +382 -0
  465. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  466. package/src/components/user-message-body.tsx +194 -49
  467. package/src/components/workspace-dock.tsx +141 -175
  468. package/src/composer.ts +6 -1
  469. package/src/connect-account-identity.tsx +34 -0
  470. package/src/connect-accounts.tsx +233 -0
  471. package/src/connect-chooser.tsx +336 -0
  472. package/src/connect-panel.tsx +99 -0
  473. package/src/connect-setup.tsx +307 -0
  474. package/src/connect.ts +60 -0
  475. package/src/connection-assets.d.ts +4 -0
  476. package/src/connection-catalog.tsx +162 -0
  477. package/src/connection-discovery.tsx +235 -0
  478. package/src/connection-installed.tsx +51 -0
  479. package/src/connection-logo.tsx +37 -0
  480. package/src/connection-service-logo.tsx +55 -0
  481. package/src/connection-service-presentation.ts +46 -0
  482. package/src/connection-skeleton.tsx +16 -0
  483. package/src/connection-type-picker.tsx +36 -0
  484. package/src/conversation-timeline.ts +92 -0
  485. package/src/desktop.ts +24 -0
  486. package/src/device-authorization.tsx +98 -0
  487. package/src/diffs.ts +16 -0
  488. package/src/discovery-cache.ts +42 -0
  489. package/src/editor.ts +13 -0
  490. package/src/embedded-session-client.ts +104 -0
  491. package/src/file-node-visibility.ts +66 -0
  492. package/src/hooks/channel-cache.ts +104 -0
  493. package/src/hooks/internal.ts +3 -2
  494. package/src/hooks/latest-question.ts +164 -0
  495. package/src/hooks/shared-machines-list.ts +239 -0
  496. package/src/hooks/use-attached-browsers.ts +5 -1
  497. package/src/hooks/use-available-models.ts +20 -14
  498. package/src/hooks/use-browser-frame-stream.ts +25 -3
  499. package/src/hooks/use-browser-session.ts +271 -71
  500. package/src/hooks/use-browser-sessions.ts +7 -1
  501. package/src/hooks/use-channels.ts +32 -10
  502. package/src/hooks/use-codex-accounts.ts +78 -21
  503. package/src/hooks/use-composer.ts +1034 -320
  504. package/src/hooks/use-computer-frame-stream.ts +39 -16
  505. package/src/hooks/use-computer-input-posture.ts +94 -0
  506. package/src/hooks/use-computer-session.ts +110 -32
  507. package/src/hooks/use-computer-sessions.ts +8 -1
  508. package/src/hooks/use-connect.ts +23 -0
  509. package/src/hooks/use-desktop-stream.ts +19 -28
  510. package/src/hooks/use-file-attachments.ts +118 -10
  511. package/src/hooks/use-goal.ts +36 -9
  512. package/src/hooks/use-human-input.ts +31 -4
  513. package/src/hooks/use-last-started-turn-policy.ts +15 -13
  514. package/src/hooks/use-machine-chip.ts +23 -6
  515. package/src/hooks/use-machines.ts +104 -6
  516. package/src/hooks/use-sandbox-files.ts +253 -150
  517. package/src/hooks/use-sandbox-git.ts +58 -29
  518. package/src/hooks/use-session-background-commands.ts +67 -0
  519. package/src/hooks/use-session-capabilities.ts +21 -2
  520. package/src/hooks/use-session-events.ts +759 -433
  521. package/src/hooks/use-session-lineage.ts +28 -6
  522. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  523. package/src/hooks/use-session.ts +75 -16
  524. package/src/hooks/use-slash-commands.ts +6 -11
  525. package/src/hooks/use-turn-queue.ts +113 -13
  526. package/src/hooks/use-usage.ts +100 -0
  527. package/src/hooks/use-video-artifact-playback.ts +1 -1
  528. package/src/hooks/use-voice-input.ts +12 -1
  529. package/src/hooks/use-workspace-capture.ts +3 -2
  530. package/src/hooks/use-workspace-edit.ts +23 -5
  531. package/src/hooks/use-workspace-sessions.ts +99 -11
  532. package/src/human-input.ts +12 -1
  533. package/src/identity-link-accounts.tsx +148 -0
  534. package/src/identity-link-consent.tsx +192 -0
  535. package/src/index.ts +157 -12
  536. package/src/interaction.ts +1 -0
  537. package/src/lib/error-message.ts +37 -0
  538. package/src/lib/format.ts +150 -14
  539. package/src/lib/host-theme.ts +511 -0
  540. package/src/lib/interaction-errors.ts +33 -0
  541. package/src/lib/menu-styles.ts +44 -0
  542. package/src/lib/pierre-diffs-loader.ts +53 -0
  543. package/src/lib/workbench-peers.ts +62 -0
  544. package/src/lib/xterm-theme.ts +23 -21
  545. package/src/machines.ts +9 -1
  546. package/src/mcp-connection-status.ts +35 -0
  547. package/src/model-policy.ts +223 -69
  548. package/src/older-history.ts +87 -0
  549. package/src/plugin-details.tsx +185 -0
  550. package/src/plugin-discovery.tsx +196 -0
  551. package/src/provider.tsx +55 -14
  552. package/src/realtime/dropdown-menu.tsx +19 -12
  553. package/src/realtime/realtime-control.tsx +133 -46
  554. package/src/session-auth-recommendation.ts +48 -0
  555. package/src/session-capability-policy.ts +83 -0
  556. package/src/session-context.ts +4 -3
  557. package/src/session-ui.ts +66 -2
  558. package/src/session.ts +18 -1
  559. package/src/sites-ui.tsx +402 -0
  560. package/src/sites.ts +3 -0
  561. package/src/skill-discovery.tsx +208 -0
  562. package/src/terminal.ts +26 -0
  563. package/src/timeline/activity-rail.tsx +171 -80
  564. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  565. package/src/timeline/compaction-copy.ts +42 -0
  566. package/src/timeline/entrance.tsx +28 -3
  567. package/src/timeline/fleet-decision-projection.ts +2 -1
  568. package/src/timeline/fleet-decision-row.tsx +1 -0
  569. package/src/timeline/genie-loading.tsx +136 -0
  570. package/src/timeline/index.ts +11 -0
  571. package/src/timeline/knowledge-receipt.tsx +100 -0
  572. package/src/timeline/parsers.ts +2 -2
  573. package/src/timeline/platform-activity-row.tsx +216 -0
  574. package/src/timeline/presented-image.ts +49 -0
  575. package/src/timeline/projection.ts +1609 -84
  576. package/src/timeline/registry.ts +15 -3
  577. package/src/timeline/retained-image.ts +97 -0
  578. package/src/timeline/rolling-activity.tsx +92 -0
  579. package/src/timeline/screenshot-lightbox.tsx +115 -17
  580. package/src/timeline/shared.tsx +47 -15
  581. package/src/timeline/startup-preference.ts +33 -0
  582. package/src/timeline/startup-timings.tsx +145 -0
  583. package/src/timeline/tool-display-name.ts +8 -6
  584. package/src/timeline/tool-renderers.tsx +497 -128
  585. package/src/timeline/turn-summary.tsx +218 -44
  586. package/src/timeline/types.ts +192 -7
  587. package/src/types/machines.ts +10 -0
  588. package/src/usage/allowance-copy.ts +64 -0
  589. package/src/usage/summary.ts +93 -0
  590. package/src/usage.ts +50 -0
  591. package/styles/compiled.css +2098 -757
  592. package/styles/connect.css +284 -0
  593. package/styles/connect.d.ts +1 -0
  594. package/styles/effective-tokens.css +1 -0
  595. package/styles/index.css +201 -9
  596. package/styles/responsive.css +27 -1
  597. package/styles/session-capability.css +44 -0
  598. package/styles/tokens.css +135 -65
  599. package/dist/chunk-5UQPNLIO.js.map +0 -1
  600. package/dist/chunk-6KLX2RH5.js.map +0 -1
  601. package/dist/chunk-7WCLAEFV.js.map +0 -1
  602. package/dist/chunk-B6WPZSTT.js.map +0 -1
  603. package/dist/chunk-FK6VG4LL.js +0 -90
  604. package/dist/chunk-FK6VG4LL.js.map +0 -1
  605. package/dist/chunk-HA46CYQK.js.map +0 -1
  606. package/dist/chunk-HUIKIDM5.js.map +0 -1
  607. package/dist/chunk-IGC6A2ZI.js.map +0 -1
  608. package/dist/chunk-KCGXPP5V.js.map +0 -1
  609. package/dist/chunk-KZ73RL76.js.map +0 -1
  610. package/dist/chunk-LAKLF4PA.js +0 -141
  611. package/dist/chunk-LAKLF4PA.js.map +0 -1
  612. package/dist/chunk-LLOLUHVG.js.map +0 -1
  613. package/dist/chunk-MKPIAGVL.js +0 -465
  614. package/dist/chunk-MKPIAGVL.js.map +0 -1
  615. package/dist/chunk-PEI6RANI.js.map +0 -1
  616. package/dist/chunk-R3AZOAB5.js.map +0 -1
  617. package/dist/chunk-WSK7G5LE.js +0 -170
  618. package/dist/chunk-WSK7G5LE.js.map +0 -1
  619. package/dist/chunk-XBZWOM2K.js +0 -218
  620. package/dist/chunk-XBZWOM2K.js.map +0 -1
  621. package/dist/chunk-Y7OEDUJ5.js +0 -8810
  622. package/dist/chunk-Y7OEDUJ5.js.map +0 -1
  623. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  624. package/dist/hooks/use-packs.d.ts +0 -32
  625. package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
  626. package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
  627. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  628. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  629. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  630. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  631. package/src/hooks/use-packs.ts +0 -157
  632. /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-SHYKQRNX.js.map} +0 -0
@@ -1,15 +1,114 @@
1
- import type {
2
- DraftTimelineAnnotation,
3
- TimelineAnnotation,
4
- TimelineAnnotationSource,
5
- } from "@opengeni/sdk";
6
- import { Suspense, lazy, useRef, useState } from "react";
1
+ import type { TimelineAnnotationSource } from "@opengeni/sdk";
2
+ import { QuoteIcon, XIcon } from "lucide-react";
3
+ import {
4
+ Suspense,
5
+ lazy,
6
+ useEffect,
7
+ useLayoutEffect,
8
+ useRef,
9
+ useState,
10
+ type ReactNode,
11
+ type RefObject,
12
+ } from "react";
7
13
  import { cn } from "../lib/cn";
14
+ import {
15
+ AnnotationAccentRow,
16
+ AnnotationNotePreview,
17
+ AnnotationQuoteSourceButton,
18
+ type TimelineAnnotationLike,
19
+ } from "./timeline-annotation-chrome";
20
+ import { ANNOTATION_CARD_STACK_SCROLL_AT } from "./timeline-annotation-layout";
21
+ import {
22
+ TimelineAnnotationSourceRootContext,
23
+ useTimelineAnnotationSourceRoot,
24
+ } from "./timeline-annotation-reveal-context";
25
+ import {
26
+ annotationDisplayOrdinal,
27
+ annotationHasNote,
28
+ resolveAnnotationRevealRoot,
29
+ } from "./timeline-annotation-shared";
8
30
 
9
- export type TimelineAnnotationLike = DraftTimelineAnnotation | TimelineAnnotation;
31
+ export type { TimelineAnnotationLike } from "./timeline-annotation-chrome";
10
32
 
11
33
  const TimelineAnnotationsDialog = lazy(() => import("./timeline-annotations-dialog"));
12
34
 
35
+ function AnnotationSourceRootBridge({
36
+ triggerRef,
37
+ children,
38
+ }: {
39
+ triggerRef: RefObject<HTMLElement | null>;
40
+ children: ReactNode;
41
+ }) {
42
+ const inheritedRoot = useTimelineAnnotationSourceRoot();
43
+ const conversationRootRef = useRef<HTMLElement | null>(null);
44
+ if (!inheritedRoot) {
45
+ conversationRootRef.current = resolveAnnotationRevealRoot(triggerRef.current);
46
+ }
47
+ useLayoutEffect(() => {
48
+ if (inheritedRoot) return;
49
+ conversationRootRef.current = resolveAnnotationRevealRoot(triggerRef.current);
50
+ });
51
+ if (inheritedRoot) return children;
52
+ return (
53
+ <TimelineAnnotationSourceRootContext.Provider value={conversationRootRef}>
54
+ {children}
55
+ </TimelineAnnotationSourceRootContext.Provider>
56
+ );
57
+ }
58
+
59
+ export function TimelineAnnotationCards({
60
+ annotations,
61
+ onRevealSource,
62
+ className,
63
+ }: {
64
+ annotations: readonly TimelineAnnotationLike[];
65
+ onRevealSource?: ((source: TimelineAnnotationSource) => boolean) | undefined;
66
+ className?: string | undefined;
67
+ }) {
68
+ const [unavailableId, setUnavailableId] = useState<string | null>(null);
69
+ if (annotations.length === 0) return null;
70
+ return (
71
+ <div
72
+ data-og-annotation-cards=""
73
+ className={cn(
74
+ "grid gap-2",
75
+ annotations.length >= ANNOTATION_CARD_STACK_SCROLL_AT &&
76
+ "max-h-[min(28rem,55vh)] overflow-x-hidden overflow-y-auto overscroll-contain pr-1",
77
+ className,
78
+ )}
79
+ >
80
+ {annotations.map((annotation, index) => {
81
+ const ordinal = annotationDisplayOrdinal(annotation, index);
82
+ return (
83
+ <section key={annotation.id} aria-label={`Annotation ${ordinal}`}>
84
+ <AnnotationAccentRow>
85
+ <p className="mb-0.5 text-og-xs font-medium tabular-nums text-og-fg-subtle">
86
+ Annotation {ordinal}
87
+ </p>
88
+ <AnnotationQuoteSourceButton
89
+ annotation={annotation}
90
+ lines={2}
91
+ onRevealSource={onRevealSource}
92
+ onUnavailable={setUnavailableId}
93
+ />
94
+ {unavailableId === annotation.id ? (
95
+ <p role="status" className="text-og-xs text-og-status-waiting">
96
+ Source is outside the loaded timeline window.
97
+ </p>
98
+ ) : null}
99
+ <AnnotationNotePreview
100
+ note={annotation.note}
101
+ annotationId={annotation.id}
102
+ ordinal={ordinal}
103
+ />
104
+ </AnnotationAccentRow>
105
+ </section>
106
+ );
107
+ })}
108
+ </div>
109
+ );
110
+ }
111
+
13
112
  export function TimelineAnnotationsChip({
14
113
  annotations,
15
114
  editable = false,
@@ -19,6 +118,8 @@ export function TimelineAnnotationsChip({
19
118
  onRemove,
20
119
  onRevealSource,
21
120
  className,
121
+ compact = false,
122
+ onCommit,
22
123
  }: {
23
124
  annotations: readonly TimelineAnnotationLike[];
24
125
  editable?: boolean | undefined;
@@ -26,58 +127,101 @@ export function TimelineAnnotationsChip({
26
127
  onFocusConsumed?: (() => void) | undefined;
27
128
  onUpdate?: ((id: string, note: string) => void) | undefined;
28
129
  onRemove?: ((id: string) => void) | undefined;
130
+ /** Return focus to the owning input after all notes are completed with Enter. */
131
+ onCommit?: (() => void) | undefined;
29
132
  onRevealSource?: ((source: TimelineAnnotationSource) => boolean) | undefined;
30
133
  className?: string | undefined;
134
+ /** Dense trigger for single-line rows such as the compact queue dock. */
135
+ compact?: boolean | undefined;
31
136
  }) {
32
- const [open, setOpen] = useState(false);
33
- const triggerRef = useRef<HTMLButtonElement | null>(null);
34
-
35
- if (annotations.length === 0) return null;
36
137
  const focusRequested = Boolean(
37
138
  focusAnnotationId && annotations.some((item) => item.id === focusAnnotationId),
38
139
  );
39
- const visible = open || focusRequested;
140
+ const [open, setOpen] = useState(focusRequested);
141
+ const triggerRef = useRef<HTMLButtonElement | null>(null);
142
+ const openedFocusId = useRef<string | null>(focusRequested ? (focusAnnotationId ?? null) : null);
143
+
144
+ useEffect(() => {
145
+ if (!focusRequested || !focusAnnotationId) {
146
+ if (!focusRequested) openedFocusId.current = null;
147
+ return;
148
+ }
149
+ if (openedFocusId.current === focusAnnotationId) return;
150
+ openedFocusId.current = focusAnnotationId;
151
+ setOpen(true);
152
+ }, [focusAnnotationId, focusRequested]);
153
+
154
+ if (annotations.length === 0) return null;
40
155
  const countLabel = `${annotations.length} ${annotations.length === 1 ? "annotation" : "annotations"}`;
156
+ const incomplete = annotations.some((annotation) => !annotationHasNote(annotation.note));
157
+ const canClear = Boolean(editable && onRemove);
158
+
159
+ const dismiss = (restoreFocus: boolean) => {
160
+ setOpen(false);
161
+ onFocusConsumed?.();
162
+ if (restoreFocus) triggerRef.current?.focus();
163
+ };
41
164
 
42
165
  return (
43
- <>
44
- <button
45
- ref={triggerRef}
46
- type="button"
166
+ <span className={cn("inline-flex max-w-full items-center", className)}>
167
+ <span
47
168
  className={cn(
48
- "inline-flex min-h-8 items-center gap-1.5 rounded-full border border-og-border bg-og-surface-1 px-2.5 py-1 text-og-sm font-medium text-og-fg-muted outline-hidden transition hover:bg-og-surface-2 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-[44px]",
49
- className,
169
+ "inline-flex max-w-full items-center rounded-full border bg-og-surface-1 text-og-fg-muted",
170
+ incomplete ? "border-og-accent/45 bg-og-accent-soft/50" : "border-og-border",
50
171
  )}
51
- aria-label={`Review ${countLabel}`}
52
- aria-haspopup="dialog"
53
- aria-expanded={visible}
54
- onClick={() => setOpen((current) => !current)}
55
172
  >
56
- {countLabel}
57
- </button>
58
- {visible ? (
59
- <Suspense fallback={null}>
60
- <TimelineAnnotationsDialog
61
- annotations={annotations}
62
- editable={editable}
63
- focusAnnotationId={focusAnnotationId}
64
- onFocusConsumed={() => {
65
- setOpen(true);
66
- onFocusConsumed?.();
67
- }}
68
- onUpdate={onUpdate}
69
- onRemove={onRemove}
70
- onRevealSource={onRevealSource}
71
- triggerRef={triggerRef}
72
- countLabel={countLabel}
73
- onDismiss={(restoreFocus) => {
74
- setOpen(false);
75
- if (restoreFocus) triggerRef.current?.focus();
173
+ <button
174
+ ref={triggerRef}
175
+ type="button"
176
+ className={cn(
177
+ "inline-flex min-w-0 max-w-full items-center gap-1.5 rounded-full border-0 bg-transparent font-medium outline-hidden transition hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-[44px]",
178
+ compact ? "min-h-6 py-0.5 text-og-xs" : "min-h-8 py-1 text-og-sm",
179
+ canClear ? "pr-1 pl-2.5" : "px-2.5",
180
+ )}
181
+ aria-label={`Review ${countLabel}`}
182
+ aria-haspopup="dialog"
183
+ aria-expanded={open}
184
+ onClick={() => setOpen((current) => !current)}
185
+ >
186
+ <QuoteIcon className="size-3.5 shrink-0 text-og-accent" aria-hidden="true" />
187
+ <span className="min-w-0 truncate">{countLabel}</span>
188
+ </button>
189
+ {canClear ? (
190
+ <button
191
+ type="button"
192
+ className="inline-flex size-7 shrink-0 items-center justify-center rounded-full border-0 bg-transparent text-og-fg-subtle outline-hidden hover:text-og-status-failed focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:size-11"
193
+ aria-label="Remove all annotations"
194
+ onClick={() => {
195
+ for (const annotation of annotations) onRemove?.(annotation.id);
76
196
  }}
77
- />
78
- </Suspense>
197
+ >
198
+ <XIcon className="size-3.5" aria-hidden="true" />
199
+ </button>
200
+ ) : null}
201
+ </span>
202
+ {open ? (
203
+ <AnnotationSourceRootBridge triggerRef={triggerRef}>
204
+ <Suspense fallback={null}>
205
+ <TimelineAnnotationsDialog
206
+ annotations={annotations}
207
+ editable={editable}
208
+ focusAnnotationId={focusAnnotationId}
209
+ onFocusConsumed={onFocusConsumed}
210
+ onUpdate={onUpdate}
211
+ onRemove={onRemove}
212
+ onRevealSource={onRevealSource}
213
+ triggerRef={triggerRef}
214
+ countLabel={countLabel}
215
+ onDismiss={dismiss}
216
+ onCommit={() => {
217
+ dismiss(!onCommit);
218
+ onCommit?.();
219
+ }}
220
+ />
221
+ </Suspense>
222
+ </AnnotationSourceRootBridge>
79
223
  ) : null}
80
- </>
224
+ </span>
81
225
  );
82
226
  }
83
227
 
@@ -0,0 +1,80 @@
1
+ import { useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
2
+ import type { TimelineGroup } from "../timeline/types";
3
+ import { timelineHasReader } from "./timeline-anchor";
4
+
5
+ /**
6
+ * Settlement may compact history, but cannot remove prose beneath a reader.
7
+ * Keep only progress that was already primary on the preceding commit; loading
8
+ * settled history never expands it. An explicit work toggle or tip return ends
9
+ * the protection. Keeping the original sibling keys also preserves selection.
10
+ */
11
+ export function useReadingProgress(
12
+ projected: TimelineGroup[],
13
+ pinned: boolean,
14
+ scroller: HTMLElement | null,
15
+ ) {
16
+ const following = pinned && !timelineHasReader(scroller);
17
+ const previous = useRef<TimelineGroup[]>([]);
18
+ const [released, setReleased] = useState<ReadonlySet<string>>(() => new Set());
19
+ const groups = useMemo(() => {
20
+ if (following) return projected;
21
+ const key = (group: TimelineGroup) => (group.kind === "item" ? group.item.id : group.id);
22
+ const visible = new Set(previous.current.map(key));
23
+ const retained = new Map<string, TimelineGroup>();
24
+ const compact = projected.map((group): TimelineGroup => {
25
+ if (group.kind !== "activity" || !group.work?.endedAt || released.has(group.id)) {
26
+ return group;
27
+ }
28
+ const progress = group.work.details.filter(
29
+ (child) =>
30
+ child.kind === "item" &&
31
+ child.item.kind === "agent-message" &&
32
+ visible.has(child.item.id),
33
+ );
34
+ if (!progress.length) return group;
35
+ for (const child of progress) retained.set(key(child), child);
36
+ return {
37
+ ...group,
38
+ work: {
39
+ ...group.work,
40
+ details: group.work.details.filter((child) => !retained.has(key(child))),
41
+ },
42
+ };
43
+ });
44
+ if (!retained.size) return compact;
45
+ // Keep prose before the same retained sibling, including attention rows.
46
+ // Merely hoisting it before Work would still move its DOM across those rows
47
+ // and invalidate a browser selection despite retaining React keys.
48
+ const current = new Set(compact.map(key));
49
+ const before = new Map<string | null, TimelineGroup[]>();
50
+ let next: string | null = null;
51
+ for (let index = previous.current.length - 1; index >= 0; index--) {
52
+ const id = key(previous.current[index]!);
53
+ const child = retained.get(id);
54
+ if (child) before.set(next, [child, ...(before.get(next) ?? [])]);
55
+ else if (current.has(id)) next = id;
56
+ }
57
+ return [
58
+ ...compact.flatMap((group) => [...(before.get(key(group)) ?? []), group]),
59
+ ...(before.get(null) ?? []),
60
+ ];
61
+ }, [projected, following, released]);
62
+ useLayoutEffect(() => {
63
+ previous.current = groups;
64
+ if (following && released.size) setReleased(new Set());
65
+ }, [groups, following, released]);
66
+ const release = useCallback(
67
+ (id: string | null) => {
68
+ if (
69
+ !id ||
70
+ !projected.some(
71
+ (group) => group.kind === "activity" && group.id === id && group.work?.endedAt,
72
+ )
73
+ )
74
+ return;
75
+ setReleased((current) => (current.has(id) ? current : new Set([...current, id])));
76
+ },
77
+ [projected],
78
+ );
79
+ return { groups, release };
80
+ }
@@ -0,0 +1,168 @@
1
+ import { createContext, useContext, useLayoutEffect, useRef, type RefObject } from "react";
2
+ import type { TimelineItem } from "../timeline/types";
3
+ import { annotatableText, rangeFromOffsets, visibleClientRect } from "./timeline-annotation-shared";
4
+
5
+ export type TimelineSearchTarget = {
6
+ sequence: number;
7
+ eventId?: string | undefined;
8
+ /** Literal, case-insensitive text. No regex interpretation. */
9
+ query: string;
10
+ /** Zero-based occurrence within the source message. Defaults to zero. */
11
+ occurrence?: number | undefined;
12
+ /**
13
+ * Zero-based UTF-16 offset of the match in the original message text, as
14
+ * reported by backend all-occurrence search (messageMatchOffset). When set
15
+ * it takes precedence over `occurrence` and is validated against `query`,
16
+ * so a stale offset degrades to no highlight rather than a wrong one.
17
+ */
18
+ offset?: number | undefined;
19
+ };
20
+
21
+ /** Scoped to the target's group; disclosure expansion persists after closing find. */
22
+ export const TimelineSearchRevealContext = createContext<string | null>(null);
23
+ export const useTimelineSearchReveal = () => useContext(TimelineSearchRevealContext);
24
+
25
+ export function isTimelineSearchTarget(item: TimelineItem, target: TimelineSearchTarget): boolean {
26
+ const sources =
27
+ item.sourceEvents ??
28
+ ("annotationSource" in item && item.annotationSource ? [item.annotationSource] : []);
29
+ return sources.some(
30
+ (source) =>
31
+ source.sequence === target.sequence && (!target.eventId || source.eventId === target.eventId),
32
+ );
33
+ }
34
+
35
+ /** Scan without allocating an offset array proportional to a huge message. */
36
+ export function literalSearchOffset(text: string, query: string, occurrence = 0): number {
37
+ if (!query || !Number.isSafeInteger(occurrence) || occurrence < 0) return -1;
38
+ // Regex escaping preserves UTF-16 offsets even for case folds whose lowercase
39
+ // string representation changes length (for example dotted capital I).
40
+ const pattern = new RegExp(query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "giu");
41
+ let match: RegExpExecArray | null;
42
+ let index = 0;
43
+ while ((match = pattern.exec(text))) {
44
+ if (index++ === occurrence) return match.index;
45
+ }
46
+ return -1;
47
+ }
48
+
49
+ /**
50
+ * Validate a caller-supplied UTF-16 offset against the text and query. The
51
+ * sticky flag pins the match to exactly `offset`; like literalSearchOffset,
52
+ * regex escaping keeps offsets in UTF-16 units even for length-changing case
53
+ * folds. Returns -1 when the offset is stale or the text no longer matches.
54
+ */
55
+ export function matchAtOffset(text: string, query: string, offset: number): number {
56
+ if (!query || !Number.isSafeInteger(offset) || offset < 0 || offset > text.length) return -1;
57
+ const pattern = new RegExp(query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "iyu");
58
+ pattern.lastIndex = offset;
59
+ // Unicode regex engines may rewind a lastIndex inside a surrogate pair.
60
+ return pattern.exec(text)?.index === offset ? offset : -1;
61
+ }
62
+
63
+ /** Resolve a target to a UTF-16 offset: explicit offset wins, else the ordinal scan. */
64
+ export function searchMatchOffset(text: string, target: TimelineSearchTarget): number {
65
+ if (target.offset != null) return matchAtOffset(text, target.query, target.offset);
66
+ return literalSearchOffset(text, target.query, target.occurrence);
67
+ }
68
+
69
+ type HighlightRegistry = { set(name: string, value: unknown): void; delete(name: string): void };
70
+ let nextHighlightId = 0;
71
+
72
+ /** Range highlighting does not mutate React-owned text or its layout. */
73
+ export function useTimelineSearchNavigation(
74
+ root: RefObject<HTMLDivElement | null>,
75
+ itemId: string | undefined,
76
+ target: TimelineSearchTarget | null | undefined,
77
+ releasePin: () => void,
78
+ revision: unknown,
79
+ ) {
80
+ const highlightName = useRef("");
81
+ if (!highlightName.current) highlightName.current = `og-search-${++nextHighlightId}`;
82
+ const key = target
83
+ ? JSON.stringify([
84
+ itemId,
85
+ target.sequence,
86
+ target.eventId,
87
+ target.query,
88
+ target.occurrence ?? 0,
89
+ target.offset ?? null,
90
+ ])
91
+ : null;
92
+ const navigated = useRef<string | null>(null);
93
+ useLayoutEffect(() => {
94
+ if (!key) navigated.current = null;
95
+ if (!key || !target || !itemId || !root.current) return;
96
+ releasePin();
97
+ const scroller = root.current;
98
+ const registry = (
99
+ globalThis.CSS as (typeof CSS & { highlights?: HighlightRegistry }) | undefined
100
+ )?.highlights;
101
+ const HighlightClass = (
102
+ globalThis as unknown as { Highlight?: new (...ranges: Range[]) => unknown }
103
+ ).Highlight;
104
+ const style = document.createElement("style");
105
+ style.textContent = `::highlight(${highlightName.current}) { background: var(--og-color-accent-deep); color: var(--og-color-accent-fg); }`;
106
+ scroller.append(style);
107
+ let frame = 0;
108
+ const update = () => {
109
+ const source = [...scroller.querySelectorAll<HTMLElement>("[data-og-search-item]")].find(
110
+ (element) => element.dataset.ogSearchItem === itemId,
111
+ );
112
+ if (!source) return;
113
+ // A virtualized renderer can explicitly identify the selected occurrence
114
+ // when earlier occurrences are not mounted. Never accept a stale marker
115
+ // belonging to a different sequence, occurrence, or query.
116
+ const materialized = [
117
+ ...source.querySelectorAll<HTMLElement>("[data-og-search-occurrence]"),
118
+ ].find(
119
+ (element) =>
120
+ element.dataset.ogSearchSequence === String(target.sequence) &&
121
+ element.dataset.ogSearchQuery === target.query &&
122
+ (target.offset != null
123
+ ? element.dataset.ogSearchOffset === String(target.offset)
124
+ : element.dataset.ogSearchOccurrence === String(target.occurrence ?? 0)),
125
+ );
126
+ const { text, spans } = annotatableText(materialized ?? source);
127
+ // Inside a materialized chunk the match starts at the chunk start.
128
+ // Raw source offsets must NEVER be interpreted as rendered DOM offsets:
129
+ // even matching characters can identify a different repeated occurrence.
130
+ const offset = materialized
131
+ ? matchAtOffset(text, target.query, 0)
132
+ : target.offset != null
133
+ ? -1
134
+ : searchMatchOffset(text, target);
135
+ const range =
136
+ offset < 0 ? null : rangeFromOffsets(spans, offset, offset + target.query.length);
137
+ if (range && registry && HighlightClass)
138
+ registry.set(highlightName.current, new HighlightClass(range));
139
+ else registry?.delete(highlightName.current);
140
+ const rect = range ? visibleClientRect(range) : null;
141
+ // A custom renderer may mount the message body later (or materialize a
142
+ // virtualized chunk in response to renderMessageText's search context).
143
+ // Finding its empty shell is not proof that the occurrence was revealed.
144
+ if (navigated.current === key || !range || !rect) return;
145
+ const box = rect;
146
+ if (!box.height && !box.width) return;
147
+ scroller.scrollTop +=
148
+ box.top - scroller.getBoundingClientRect().top - scroller.clientHeight / 2;
149
+ navigated.current = key;
150
+ };
151
+ const schedule = () => {
152
+ cancelAnimationFrame(frame);
153
+ frame = requestAnimationFrame(update);
154
+ };
155
+ const observer = new MutationObserver(schedule);
156
+ observer.observe(scroller, { childList: true, subtree: true, characterData: true });
157
+ const resize = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(schedule);
158
+ resize?.observe(scroller);
159
+ schedule();
160
+ return () => {
161
+ observer.disconnect();
162
+ resize?.disconnect();
163
+ cancelAnimationFrame(frame);
164
+ registry?.delete(highlightName.current);
165
+ style.remove();
166
+ };
167
+ }, [key, root, itemId, target, releasePin, revision]);
168
+ }
@@ -0,0 +1,60 @@
1
+ import type { TimelineGroup } from "../timeline/types";
2
+ import { timelineHasReader } from "./timeline-anchor";
3
+
4
+ export type TimelineSettlement = { element: HTMLElement; top: number };
5
+
6
+ /** Capture only a retained answer at a real live→settled boundary, never history load. */
7
+ export function captureTimelineSettlement(
8
+ scroller: HTMLElement,
9
+ groups: readonly { key: string; group: TimelineGroup }[],
10
+ ): TimelineSettlement | null {
11
+ // Selectionchange can arrive after this commit. Inspect ownership directly
12
+ // as well as the caller's pin latch so that race cannot move selected text.
13
+ if (timelineHasReader(scroller)) return null;
14
+ const live = Array.from(
15
+ scroller.querySelectorAll(
16
+ '[data-og-exchange-status="working"], [data-og-exchange-status="waiting"]',
17
+ ),
18
+ );
19
+ // At the live tip the newest retained answer owns the transition. An older
20
+ // waiting/incomplete row must not mask it, including batched settlements.
21
+ for (const status of live.reverse()) {
22
+ const row = status.closest<HTMLElement>("[data-og-group-key]");
23
+ const index = groups.findIndex(({ key }) => key === row?.dataset.ogGroupKey);
24
+ const work = groups[index]?.group;
25
+ const answer = groups[index + 1];
26
+ if (
27
+ work?.kind !== "activity" ||
28
+ !work.work?.endedAt ||
29
+ answer?.group.kind !== "item" ||
30
+ answer.group.item.kind !== "agent-message"
31
+ )
32
+ continue;
33
+ const element = Array.from(scroller.querySelectorAll<HTMLElement>("[data-og-group-key]")).find(
34
+ (node) => node.dataset.ogGroupKey === answer.key,
35
+ );
36
+ if (element) return { element, top: element.getBoundingClientRect().top };
37
+ }
38
+ return null;
39
+ }
40
+
41
+ /**
42
+ * Folding earlier prose can clamp scrollTop before paint. Keep the retained
43
+ * answer visually continuous after the normal scroll authority has run. This
44
+ * is one local position transition, not a new scroll writer or a presence tree.
45
+ */
46
+ export function animateTimelineSettlement(snapshot: TimelineSettlement): Animation | null {
47
+ const { element, top } = snapshot;
48
+ if (!element.isConnected || typeof element.animate !== "function") return null;
49
+ const delta = top - element.getBoundingClientRect().top;
50
+ if (Math.abs(delta) < 1) return null;
51
+ return element.animate(
52
+ [{ transform: `translateY(${delta}px)` }, { transform: "translateY(0)" }],
53
+ {
54
+ id: "og-timeline-settlement",
55
+ // Match the existing activity-rail collapse; reduced motion is gated by the caller.
56
+ duration: 320,
57
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
58
+ },
59
+ );
60
+ }