@opengeni/react 0.46.1 → 0.52.1

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 (341) hide show
  1. package/README.md +158 -14
  2. package/dist/artifacts-document.d.ts +3 -0
  3. package/dist/artifacts-document.js +17 -0
  4. package/dist/artifacts-document.js.map +1 -0
  5. package/dist/artifacts-presentation.d.ts +3 -0
  6. package/dist/artifacts-presentation.js +17 -0
  7. package/dist/artifacts-presentation.js.map +1 -0
  8. package/dist/artifacts-spreadsheet.d.ts +3 -0
  9. package/dist/artifacts-spreadsheet.js +17 -0
  10. package/dist/artifacts-spreadsheet.js.map +1 -0
  11. package/dist/artifacts.d.ts +2 -0
  12. package/dist/artifacts.js +170 -0
  13. package/dist/artifacts.js.map +1 -0
  14. package/dist/chunk-6BBWWOOU.js +82 -0
  15. package/dist/chunk-6BBWWOOU.js.map +1 -0
  16. package/dist/{chunk-HFO4ERGQ.js → chunk-724BW4TW.js} +586 -35
  17. package/dist/chunk-724BW4TW.js.map +1 -0
  18. package/dist/chunk-7I2KB3OK.js +3895 -0
  19. package/dist/chunk-7I2KB3OK.js.map +1 -0
  20. package/dist/chunk-7WCLAEFV.js +2828 -0
  21. package/dist/chunk-7WCLAEFV.js.map +1 -0
  22. package/dist/{chunk-U3CSCMWA.js → chunk-FK6VG4LL.js} +9 -13
  23. package/dist/chunk-FK6VG4LL.js.map +1 -0
  24. package/dist/{chunk-SRFUT2ZU.js → chunk-FWS3KC3Z.js} +120 -64
  25. package/dist/chunk-FWS3KC3Z.js.map +1 -0
  26. package/dist/{chunk-EKZH6IDG.js → chunk-HDBG7XGO.js} +62 -1
  27. package/dist/chunk-HDBG7XGO.js.map +1 -0
  28. package/dist/chunk-HUIKIDM5.js +2148 -0
  29. package/dist/chunk-HUIKIDM5.js.map +1 -0
  30. package/dist/{chunk-LGVMUIRV.js → chunk-JAGDUCZQ.js} +1053 -390
  31. package/dist/chunk-JAGDUCZQ.js.map +1 -0
  32. package/dist/{chunk-LWR4MXSS.js → chunk-JR3QFY6B.js} +420 -35
  33. package/dist/chunk-JR3QFY6B.js.map +1 -0
  34. package/dist/chunk-JVYQRRC4.js +53 -0
  35. package/dist/chunk-JVYQRRC4.js.map +1 -0
  36. package/dist/chunk-KCGXPP5V.js +157 -0
  37. package/dist/chunk-KCGXPP5V.js.map +1 -0
  38. package/dist/{chunk-EB67J347.js → chunk-KZ73RL76.js} +111 -31
  39. package/dist/chunk-KZ73RL76.js.map +1 -0
  40. package/dist/chunk-PEI6RANI.js +3234 -0
  41. package/dist/chunk-PEI6RANI.js.map +1 -0
  42. package/dist/{chunk-3PB7MIT6.js → chunk-ROIRTM37.js} +220 -72
  43. package/dist/chunk-ROIRTM37.js.map +1 -0
  44. package/dist/chunk-VZTQ73XT.js +86 -0
  45. package/dist/chunk-VZTQ73XT.js.map +1 -0
  46. package/dist/{chunk-VCBFUSUZ.js → chunk-WSK7G5LE.js} +72 -4
  47. package/dist/chunk-WSK7G5LE.js.map +1 -0
  48. package/dist/{chunk-FGZUCXZF.js → chunk-WYA65Y3F.js} +16 -16
  49. package/dist/chunk-WYA65Y3F.js.map +1 -0
  50. package/dist/{chunk-6EDV6YFE.js → chunk-X4S56Y2H.js} +147 -35
  51. package/dist/chunk-X4S56Y2H.js.map +1 -0
  52. package/dist/client.d.ts +7 -1
  53. package/dist/clipboard.d.ts +1 -0
  54. package/dist/clipboard.js +7 -0
  55. package/dist/clipboard.js.map +1 -0
  56. package/dist/commands/index.d.ts +3 -3
  57. package/dist/commands/registry.d.ts +1 -1
  58. package/dist/commands/types.d.ts +1 -1
  59. package/dist/components/approval-surface.d.ts +2 -2
  60. package/dist/components/artifacts/artifact-surface.d.ts +18 -0
  61. package/dist/components/artifacts/document-editor.d.ts +172 -0
  62. package/dist/components/artifacts/editable-artifact-ui.d.ts +13 -0
  63. package/dist/components/artifacts/editable-artifact-workbench.d.ts +49 -0
  64. package/dist/components/artifacts/editable-document.d.ts +24 -0
  65. package/dist/components/artifacts/editable-presentation.d.ts +24 -0
  66. package/dist/components/artifacts/editable-spreadsheet.d.ts +32 -0
  67. package/dist/components/artifacts/index.d.ts +8 -0
  68. package/dist/components/artifacts/presentation-editor.d.ts +297 -0
  69. package/dist/components/artifacts/spreadsheet-canvas.d.ts +120 -0
  70. package/dist/components/artifacts/spreadsheet-grid.d.ts +113 -0
  71. package/dist/components/browser-viewer.d.ts +29 -0
  72. package/dist/components/chat-composer.d.ts +13 -8
  73. package/dist/components/code-editor.d.ts +25 -3
  74. package/dist/components/command-palette.d.ts +2 -2
  75. package/dist/components/composer-transcription-control.d.ts +4 -2
  76. package/dist/components/composer.d.ts +29 -15
  77. package/dist/components/computer-viewer.d.ts +23 -0
  78. package/dist/components/copy-button.d.ts +2 -2
  79. package/dist/components/desktop-viewer.d.ts +25 -21
  80. package/dist/components/diff-view.d.ts +1 -1
  81. package/dist/components/enrollment-consent.d.ts +1 -1
  82. package/dist/components/enrollment-device-flow.d.ts +1 -1
  83. package/dist/components/file-browser.d.ts +2 -2
  84. package/dist/components/fleet-tile.d.ts +1 -1
  85. package/dist/components/generated-video-player.d.ts +10 -0
  86. package/dist/components/human-input-form.d.ts +1 -1
  87. package/dist/components/human-input-surface.d.ts +2 -2
  88. package/dist/components/interactive-workbench-viewers.d.ts +2 -0
  89. package/dist/components/machine-card.d.ts +2 -2
  90. package/dist/components/machine-dock-bar.d.ts +3 -3
  91. package/dist/components/machine-health-pill.d.ts +2 -2
  92. package/dist/components/machine-input-display.d.ts +1 -1
  93. package/dist/components/machine-metrics.d.ts +2 -2
  94. package/dist/components/machine-status-pill.d.ts +4 -4
  95. package/dist/components/machines/health.d.ts +1 -1
  96. package/dist/components/machines/machine-detail.d.ts +5 -3
  97. package/dist/components/machines/metric-history-chart.d.ts +1 -1
  98. package/dist/components/machines/metric-sparkline.d.ts +2 -2
  99. package/dist/components/machines/series.d.ts +2 -2
  100. package/dist/components/machines-dashboard.d.ts +5 -5
  101. package/dist/components/markdown.d.ts +1 -1
  102. package/dist/components/message-timeline.d.ts +22 -5
  103. package/dist/components/model-picker.d.ts +2 -2
  104. package/dist/components/model-policy-picker.d.ts +7 -7
  105. package/dist/components/pierre-diff.d.ts +1 -1
  106. package/dist/components/pierre-file.d.ts +1 -1
  107. package/dist/components/queue-draft-policy.d.ts +1 -1
  108. package/dist/components/queue-surface-implementation.d.ts +3 -3
  109. package/dist/components/queue-surface-state.d.ts +4 -4
  110. package/dist/components/queue-surface.d.ts +5 -5
  111. package/dist/components/sandbox-files.d.ts +5 -5
  112. package/dist/components/sandbox-terminal.d.ts +50 -4
  113. package/dist/components/sandbox-workspace.d.ts +30 -10
  114. package/dist/components/session-chrome.d.ts +4 -4
  115. package/dist/components/session-status.d.ts +2 -2
  116. package/dist/components/timeline-annotation-selection.d.ts +9 -0
  117. package/dist/components/timeline-annotations-dialog.d.ts +16 -0
  118. package/dist/components/timeline-annotations.d.ts +13 -0
  119. package/dist/components/tooltip.d.ts +4 -4
  120. package/dist/components/user-message-body.d.ts +2 -2
  121. package/dist/components/workbench-changes.d.ts +2 -2
  122. package/dist/components/workspace-dock.d.ts +3 -1
  123. package/dist/composer.d.ts +11 -11
  124. package/dist/composer.js +7 -7
  125. package/dist/hooks/internal.d.ts +7 -1
  126. package/dist/hooks/use-attached-browsers.d.ts +21 -0
  127. package/dist/hooks/use-available-models.d.ts +2 -2
  128. package/dist/hooks/use-billing-usage.d.ts +1 -1
  129. package/dist/hooks/use-browser-frame-stream.d.ts +28 -0
  130. package/dist/hooks/use-browser-identities.d.ts +26 -0
  131. package/dist/hooks/use-browser-session.d.ts +28 -0
  132. package/dist/hooks/use-browser-sessions.d.ts +32 -0
  133. package/dist/hooks/use-codex-accounts.d.ts +3 -3
  134. package/dist/hooks/use-composer.d.ts +36 -9
  135. package/dist/hooks/use-computer-frame-stream.d.ts +24 -0
  136. package/dist/hooks/use-computer-session.d.ts +28 -0
  137. package/dist/hooks/use-computer-sessions.d.ts +28 -0
  138. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  139. package/dist/hooks/use-environments.d.ts +11 -5
  140. package/dist/hooks/use-file-attachments.d.ts +1 -1
  141. package/dist/hooks/use-goal.d.ts +2 -2
  142. package/dist/hooks/use-human-input.d.ts +2 -2
  143. package/dist/hooks/use-last-started-turn-policy.d.ts +2 -2
  144. package/dist/hooks/use-machine-chip.d.ts +2 -2
  145. package/dist/hooks/use-machines.d.ts +10 -3
  146. package/dist/hooks/use-packs.d.ts +7 -2
  147. package/dist/hooks/use-rigs.d.ts +1 -1
  148. package/dist/hooks/use-sandbox-files.d.ts +25 -4
  149. package/dist/hooks/use-sandbox-git.d.ts +13 -5
  150. package/dist/hooks/use-sandbox-terminal.d.ts +1 -1
  151. package/dist/hooks/use-scheduled-tasks.d.ts +1 -1
  152. package/dist/hooks/use-session-capabilities.d.ts +5 -4
  153. package/dist/hooks/use-session-control.d.ts +1 -1
  154. package/dist/hooks/use-session-events.d.ts +2 -2
  155. package/dist/hooks/use-session-lineage.d.ts +1 -1
  156. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  157. package/dist/hooks/use-session.d.ts +2 -2
  158. package/dist/hooks/use-slash-commands.d.ts +1 -1
  159. package/dist/hooks/use-terminal-stream.d.ts +8 -2
  160. package/dist/hooks/use-transcription.d.ts +2 -2
  161. package/dist/hooks/use-turn-queue.d.ts +2 -2
  162. package/dist/hooks/use-video-artifact-playback.d.ts +9 -0
  163. package/dist/hooks/use-voice-input.d.ts +6 -4
  164. package/dist/hooks/use-workspace-capture.d.ts +1 -1
  165. package/dist/hooks/use-workspace-edit.d.ts +1 -1
  166. package/dist/hooks/use-workspace-sessions.d.ts +1 -1
  167. package/dist/hooks/use-workspaces.d.ts +1 -1
  168. package/dist/index.d.ts +158 -154
  169. package/dist/index.js +1718 -908
  170. package/dist/index.js.map +1 -1
  171. package/dist/interaction.d.ts +23 -0
  172. package/dist/interaction.js +36 -0
  173. package/dist/interaction.js.map +1 -0
  174. package/dist/interactive-workbench-viewers-KHNOHWQE.js +13 -0
  175. package/dist/interactive-workbench-viewers-KHNOHWQE.js.map +1 -0
  176. package/dist/lib/composer-responsive-context.d.ts +9 -0
  177. package/dist/lib/relay-wire.d.ts +4 -0
  178. package/dist/lib/sandbox-liveness.d.ts +9 -0
  179. package/dist/lib/terminal-capability.d.ts +5 -0
  180. package/dist/lib/use-portal-token-style.d.ts +14 -3
  181. package/dist/lib/xterm-theme.d.ts +1 -1
  182. package/dist/machines.d.ts +30 -30
  183. package/dist/machines.js +3 -3
  184. package/dist/provider.d.ts +4 -4
  185. package/dist/{queue-surface-implementation-J4XJFKRW.js → queue-surface-implementation-2KVJTYXH.js} +117 -64
  186. package/dist/queue-surface-implementation-2KVJTYXH.js.map +1 -0
  187. package/dist/realtime/dropdown-menu.d.ts +8 -8
  188. package/dist/realtime/realtime-control.d.ts +15 -6
  189. package/dist/realtime.d.ts +4 -4
  190. package/dist/realtime.js +30 -33
  191. package/dist/realtime.js.map +1 -1
  192. package/dist/session-context.d.ts +19 -1
  193. package/dist/session-ui.d.ts +14 -14
  194. package/dist/session-ui.js +6 -5
  195. package/dist/session.d.ts +28 -28
  196. package/dist/session.js +5 -5
  197. package/dist/timeline/activity-rail.d.ts +6 -3
  198. package/dist/timeline/disclosure-context.d.ts +1 -1
  199. package/dist/timeline/fleet-decision-projection.d.ts +1 -1
  200. package/dist/timeline/fleet-decision-row.d.ts +3 -3
  201. package/dist/timeline/index.d.ts +19 -19
  202. package/dist/timeline/parsers.d.ts +6 -3
  203. package/dist/timeline/projection.d.ts +3 -3
  204. package/dist/timeline/registry.d.ts +10 -1
  205. package/dist/timeline/screenshot-lightbox.d.ts +2 -2
  206. package/dist/timeline/shared.d.ts +21 -10
  207. package/dist/timeline/tool-diff.d.ts +2 -2
  208. package/dist/timeline/tool-renderers.d.ts +1 -1
  209. package/dist/timeline/turn-summary.d.ts +3 -3
  210. package/dist/timeline/types.d.ts +42 -2
  211. package/dist/timeline-annotation-selection-3L7LHGG2.js +187 -0
  212. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +1 -0
  213. package/dist/timeline-annotations-dialog-U7EVLR75.js +196 -0
  214. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +1 -0
  215. package/dist/voice-recording-store.d.ts +8 -2
  216. package/package.json +52 -7
  217. package/src/artifacts-document.ts +31 -0
  218. package/src/artifacts-presentation.ts +36 -0
  219. package/src/artifacts-spreadsheet.ts +21 -0
  220. package/src/artifacts.ts +86 -0
  221. package/src/client.ts +90 -1
  222. package/src/clipboard.ts +2 -0
  223. package/src/components/artifacts/artifact-surface.tsx +93 -0
  224. package/src/components/artifacts/document-editor.tsx +2255 -0
  225. package/src/components/artifacts/editable-artifact-ui.tsx +89 -0
  226. package/src/components/artifacts/editable-artifact-workbench.tsx +203 -0
  227. package/src/components/artifacts/editable-document.tsx +657 -0
  228. package/src/components/artifacts/editable-presentation.tsx +1020 -0
  229. package/src/components/artifacts/editable-spreadsheet.tsx +733 -0
  230. package/src/components/artifacts/index.ts +99 -0
  231. package/src/components/artifacts/presentation-editor.tsx +3148 -0
  232. package/src/components/artifacts/spreadsheet-canvas.ts +799 -0
  233. package/src/components/artifacts/spreadsheet-grid.tsx +2129 -0
  234. package/src/components/browser-viewer.tsx +1592 -0
  235. package/src/components/chat-composer.tsx +25 -2
  236. package/src/components/code-editor.tsx +90 -31
  237. package/src/components/command-palette.tsx +1 -1
  238. package/src/components/composer-transcription-control.tsx +51 -22
  239. package/src/components/composer.tsx +49 -23
  240. package/src/components/computer-viewer.tsx +1139 -0
  241. package/src/components/copy-button.tsx +1 -1
  242. package/src/components/desktop-viewer.tsx +103 -75
  243. package/src/components/file-browser.tsx +39 -17
  244. package/src/components/generated-video-player.tsx +89 -0
  245. package/src/components/human-input-form.tsx +2 -2
  246. package/src/components/interactive-workbench-viewers.ts +2 -0
  247. package/src/components/machine-card.tsx +1 -1
  248. package/src/components/machine-input-display.ts +3 -0
  249. package/src/components/machines/machine-detail.tsx +39 -15
  250. package/src/components/machines-dashboard.tsx +7 -6
  251. package/src/components/message-timeline.tsx +327 -37
  252. package/src/components/model-picker.tsx +2 -2
  253. package/src/components/model-policy-picker.tsx +16 -15
  254. package/src/components/queue-surface-implementation.tsx +135 -75
  255. package/src/components/queue-surface-state.tsx +2 -2
  256. package/src/components/sandbox-files.tsx +142 -62
  257. package/src/components/sandbox-terminal.tsx +119 -35
  258. package/src/components/sandbox-workspace.tsx +394 -228
  259. package/src/components/session-chrome.tsx +67 -27
  260. package/src/components/timeline-annotation-selection.tsx +221 -0
  261. package/src/components/timeline-annotations-dialog.tsx +213 -0
  262. package/src/components/timeline-annotations.tsx +84 -0
  263. package/src/components/tooltip.tsx +13 -16
  264. package/src/components/user-message-body.tsx +1 -1
  265. package/src/components/workbench-changes.tsx +192 -35
  266. package/src/components/workspace-dock.tsx +13 -5
  267. package/src/composer.ts +3 -0
  268. package/src/hooks/internal.ts +132 -38
  269. package/src/hooks/use-attached-browsers.ts +152 -0
  270. package/src/hooks/use-browser-frame-stream.ts +316 -0
  271. package/src/hooks/use-browser-identities.ts +225 -0
  272. package/src/hooks/use-browser-session.ts +476 -0
  273. package/src/hooks/use-browser-sessions.ts +281 -0
  274. package/src/hooks/use-codex-accounts.ts +4 -4
  275. package/src/hooks/use-composer.ts +769 -24
  276. package/src/hooks/use-computer-frame-stream.ts +311 -0
  277. package/src/hooks/use-computer-session.ts +442 -0
  278. package/src/hooks/use-computer-sessions.ts +245 -0
  279. package/src/hooks/use-environments.ts +24 -5
  280. package/src/hooks/use-file-attachments.ts +70 -32
  281. package/src/hooks/use-goal.ts +17 -5
  282. package/src/hooks/use-machine-chip.ts +5 -3
  283. package/src/hooks/use-machines.ts +79 -3
  284. package/src/hooks/use-packs.ts +51 -0
  285. package/src/hooks/use-sandbox-files.ts +382 -88
  286. package/src/hooks/use-sandbox-git.ts +208 -46
  287. package/src/hooks/use-sandbox-terminal.ts +3 -2
  288. package/src/hooks/use-session-capabilities.ts +94 -70
  289. package/src/hooks/use-session-events.ts +18 -4
  290. package/src/hooks/use-terminal-stream.ts +102 -23
  291. package/src/hooks/use-transcription.ts +4 -14
  292. package/src/hooks/use-turn-queue.ts +17 -5
  293. package/src/hooks/use-video-artifact-playback.ts +28 -0
  294. package/src/hooks/use-voice-input.ts +163 -19
  295. package/src/hooks/use-windowed-sections.ts +9 -7
  296. package/src/hooks/use-workspace-edit.ts +2 -1
  297. package/src/index.ts +21 -6
  298. package/src/interaction.ts +71 -0
  299. package/src/lib/composer-responsive-context.ts +15 -0
  300. package/src/lib/relay-wire.ts +4 -0
  301. package/src/lib/sandbox-liveness.ts +11 -0
  302. package/src/lib/terminal-capability.ts +10 -0
  303. package/src/lib/use-portal-token-style.ts +60 -15
  304. package/src/provider.tsx +52 -7
  305. package/src/realtime/dropdown-menu.tsx +15 -19
  306. package/src/realtime/realtime-control.tsx +16 -5
  307. package/src/session-context.ts +90 -0
  308. package/src/timeline/activity-rail.tsx +31 -6
  309. package/src/timeline/index.ts +4 -1
  310. package/src/timeline/parsers.ts +46 -20
  311. package/src/timeline/projection.ts +233 -13
  312. package/src/timeline/registry.ts +19 -0
  313. package/src/timeline/screenshot-lightbox.tsx +30 -9
  314. package/src/timeline/shared.tsx +59 -11
  315. package/src/timeline/tool-renderers.tsx +421 -24
  316. package/src/timeline/turn-summary.tsx +2 -2
  317. package/src/timeline/types.ts +58 -2
  318. package/src/voice-recording-store.ts +15 -0
  319. package/styles/compiled.css +5298 -0
  320. package/styles/compiled.d.ts +2 -0
  321. package/styles/effective-tokens.css +27 -0
  322. package/styles/index.css +18 -0
  323. package/styles/responsive.css +208 -0
  324. package/styles/responsive.d.ts +2 -0
  325. package/styles/tokens.css +50 -17
  326. package/dist/chunk-3PB7MIT6.js.map +0 -1
  327. package/dist/chunk-6EDV6YFE.js.map +0 -1
  328. package/dist/chunk-EB67J347.js.map +0 -1
  329. package/dist/chunk-EKZH6IDG.js.map +0 -1
  330. package/dist/chunk-FGZUCXZF.js.map +0 -1
  331. package/dist/chunk-HFO4ERGQ.js.map +0 -1
  332. package/dist/chunk-JB5725BI.js +0 -48
  333. package/dist/chunk-JB5725BI.js.map +0 -1
  334. package/dist/chunk-LGVMUIRV.js.map +0 -1
  335. package/dist/chunk-LWR4MXSS.js.map +0 -1
  336. package/dist/chunk-SRFUT2ZU.js.map +0 -1
  337. package/dist/chunk-U3CSCMWA.js.map +0 -1
  338. package/dist/chunk-VCBFUSUZ.js.map +0 -1
  339. package/dist/fleet-decision-projection-SLNZMS42.js +0 -241
  340. package/dist/fleet-decision-projection-SLNZMS42.js.map +0 -1
  341. package/dist/queue-surface-implementation-J4XJFKRW.js.map +0 -1
@@ -100,10 +100,10 @@ export function ModelPicker({
100
100
  disabled={disabled === true}
101
101
  aria-label={label}
102
102
  className={cn(
103
- "h-8 max-w-[180px] cursor-pointer appearance-none truncate rounded-og-md bg-transparent pointer-coarse:h-11",
103
+ "og-model-picker-native h-8 max-w-[180px] cursor-pointer appearance-none truncate rounded-og-md bg-transparent pointer-coarse:h-11",
104
104
  "py-0 pl-2 pr-6 text-[13px] text-og-fg-muted",
105
105
  "transition-colors duration-150 hover:bg-og-surface-2 hover:text-og-fg",
106
- "focus:outline-none focus-visible:outline-none",
106
+ "focus:outline-hidden focus-visible:outline-hidden",
107
107
  "disabled:cursor-not-allowed disabled:opacity-50",
108
108
  )}
109
109
  >
@@ -12,14 +12,13 @@ import { DropdownMenu } from "radix-ui";
12
12
  import {
13
13
  useEffect,
14
14
  useMemo,
15
- useRef,
16
15
  useState,
17
16
  type CSSProperties,
18
17
  type ReactNode,
19
18
  type SVGProps,
20
19
  } from "react";
21
20
  import { cn } from "../lib/cn";
22
- import { usePortalTokenStyle } from "../lib/use-portal-token-style";
21
+ import { usePortalTokenSource, usePortalTokenStyle } from "../lib/use-portal-token-style";
23
22
  import {
24
23
  coerceReasoningEffortForModel,
25
24
  effortOptionsForModel,
@@ -243,7 +242,7 @@ export function PickerNavRow(props: {
243
242
  onClick={props.onClick}
244
243
  data-testid={props.testId}
245
244
  className={cn(
246
- "flex w-full cursor-pointer items-center gap-2 rounded-og-sm px-[var(--og-model-picker-row-padding-x)] py-[var(--og-model-picker-row-padding-y)] text-left text-og-fg outline-none transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40",
245
+ "flex w-full cursor-pointer items-center gap-2 rounded-og-sm px-[var(--og-model-picker-row-padding-x)] py-[var(--og-model-picker-row-padding-y)] text-left text-og-fg outline-hidden transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40",
247
246
  props.disabled && "cursor-not-allowed opacity-50",
248
247
  )}
249
248
  >
@@ -278,7 +277,7 @@ export function PickerBackHeader(props: {
278
277
  type="button"
279
278
  onClick={props.onBack}
280
279
  data-testid="model-picker-back"
281
- className="flex min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-og-sm px-1.5 py-1.5 text-left text-og-fg outline-none transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40"
280
+ className="flex min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-og-sm px-1.5 py-1.5 text-left text-og-fg outline-hidden transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40"
282
281
  >
283
282
  <ChevronLeftIcon className="size-3.5 shrink-0 text-og-fg-subtle" />
284
283
  {props.icon}
@@ -455,7 +454,7 @@ export function ModelPolicyPickerMenu(
455
454
  );
456
455
  }}
457
456
  className={cn(
458
- "flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-og-sm text-og-fg-subtle outline-none transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50",
457
+ "flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-og-sm text-og-fg-subtle outline-hidden transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50",
459
458
  activeModel && props.latencyMode === "fast" && "text-og-fg",
460
459
  )}
461
460
  >
@@ -487,7 +486,7 @@ export function ModelPolicyPickerMenu(
487
486
  disabled={!focusModel.selectable}
488
487
  onClick={() => selectEffort(focusModel, effort)}
489
488
  className={cn(
490
- "flex h-[var(--og-model-picker-effort-height)] w-full cursor-pointer items-center rounded-og-sm px-[var(--og-model-picker-row-padding-x)] text-left text-og-menu text-og-fg outline-none transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50",
489
+ "flex h-[var(--og-model-picker-effort-height)] w-full cursor-pointer items-center rounded-og-sm px-[var(--og-model-picker-row-padding-x)] text-left text-og-menu text-og-fg outline-hidden transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50",
491
490
  selected && "bg-og-surface-2",
492
491
  )}
493
492
  >
@@ -542,8 +541,8 @@ export function ModelPolicyPicker(props: ModelPolicyPickerProps) {
542
541
  if (props.open === undefined) setUncontrolledOpen(next);
543
542
  props.onOpenChange?.(next);
544
543
  };
545
- const triggerRef = useRef<HTMLButtonElement | null>(null);
546
- const portalStyle = usePortalTokenStyle(triggerRef);
544
+ const trigger = usePortalTokenSource<HTMLButtonElement>();
545
+ const portalStyle = usePortalTokenStyle(trigger.source);
547
546
  const messages = useMemo(
548
547
  () => ({ ...defaultModelPolicyPickerMessages, ...props.messages }),
549
548
  [props.messages],
@@ -556,7 +555,7 @@ export function ModelPolicyPicker(props: ModelPolicyPickerProps) {
556
555
  return (
557
556
  <span
558
557
  className={cn(
559
- "inline-flex h-8 w-40 shrink-0 animate-pulse rounded-full bg-og-surface-2",
558
+ "og-root inline-flex h-8 w-40 shrink-0 animate-pulse rounded-full bg-og-surface-2",
560
559
  props.className,
561
560
  )}
562
561
  aria-label={messages.loading}
@@ -568,12 +567,12 @@ export function ModelPolicyPicker(props: ModelPolicyPickerProps) {
568
567
  <DropdownMenu.Root open={open} onOpenChange={setOpen}>
569
568
  <DropdownMenu.Trigger asChild>
570
569
  <button
571
- ref={triggerRef}
570
+ ref={trigger.ref}
572
571
  type="button"
573
572
  disabled={props.disabled}
574
573
  aria-label={messages.label}
575
574
  className={cn(
576
- "og-root inline-flex h-[var(--og-model-picker-trigger-height)] min-w-0 max-w-64 items-center gap-1 rounded-full border border-transparent px-2.5 text-og-control text-og-fg-muted outline-none transition-colors hover:border-og-border hover:bg-og-surface-2 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50 max-sm:h-11 max-sm:max-w-[7.5rem] max-sm:px-2",
575
+ "og-root og-model-policy-trigger inline-flex h-[var(--og-model-picker-trigger-height)] min-w-0 max-w-64 items-center gap-1 rounded-full border border-transparent px-2.5 text-og-control text-og-fg-muted outline-hidden transition-colors hover:border-og-border hover:bg-og-surface-2 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50 max-sm:h-11 max-sm:max-w-[7.5rem] max-sm:px-2",
577
576
  props.className,
578
577
  )}
579
578
  >
@@ -584,13 +583,15 @@ export function ModelPolicyPicker(props: ModelPolicyPickerProps) {
584
583
  }
585
584
  className="text-og-fg"
586
585
  />
587
- <span className="min-w-0 truncate font-medium text-og-fg max-sm:hidden">
586
+ <span className="og-model-policy-label-full min-w-0 truncate font-medium text-og-fg max-sm:hidden">
588
587
  {selected?.label ?? props.model}
589
588
  </span>
590
- <span className="min-w-0 truncate font-medium text-og-fg sm:hidden">
589
+ <span className="og-model-policy-label-short min-w-0 truncate font-medium text-og-fg sm:hidden">
591
590
  {selected?.shortLabel ?? selected?.label ?? props.model}
592
591
  </span>
593
- <span className="max-sm:hidden">{labelReasoningEffort(props.effort)}</span>
592
+ <span className="og-model-policy-effort max-sm:hidden">
593
+ {labelReasoningEffort(props.effort)}
594
+ </span>
594
595
  {props.latencyMode === "fast" ? (
595
596
  <ZapIcon
596
597
  className="size-3.5 shrink-0 fill-current stroke-current text-og-fg"
@@ -609,7 +610,7 @@ export function ModelPolicyPicker(props: ModelPolicyPickerProps) {
609
610
  collisionPadding={12}
610
611
  onCloseAutoFocus={(event) => event.preventDefault()}
611
612
  className={cn(
612
- "og-root z-50 flex max-h-[min(20rem,var(--radix-dropdown-menu-content-available-height))] w-[var(--og-model-picker-menu-width)] max-w-[calc(100vw-16px)] flex-col overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1 p-[var(--og-model-picker-menu-padding)] text-og-fg shadow-og-lg",
613
+ "og-root og-model-policy-menu z-50 flex max-h-[min(20rem,var(--radix-dropdown-menu-content-available-height))] w-[var(--og-model-picker-menu-width)] max-w-[calc(100vw-16px)] flex-col overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1 p-[var(--og-model-picker-menu-padding)] text-og-fg shadow-og-lg",
613
614
  props.contentClassName,
614
615
  )}
615
616
  style={{ ...portalStyle, ...props.contentStyle }}
@@ -16,7 +16,7 @@ import {
16
16
  verticalListSortingStrategy,
17
17
  } from "@dnd-kit/sortable";
18
18
  import { CSS } from "@dnd-kit/utilities";
19
- import type { SessionPendingInputPreview, SessionTurn } from "@opengeni/sdk";
19
+ import type { SessionPendingInputPreview, SessionTurn, TimelineAnnotation } from "@opengeni/sdk";
20
20
  import {
21
21
  ArrowDownToLineIcon,
22
22
  ArrowUpToLineIcon,
@@ -32,7 +32,6 @@ import {
32
32
  useCallback,
33
33
  useId,
34
34
  useMemo,
35
- useRef,
36
35
  useState,
37
36
  type KeyboardEvent as ReactKeyboardEvent,
38
37
  } from "react";
@@ -40,9 +39,14 @@ import {
40
39
  import { DropdownMenu } from "radix-ui";
41
40
  import type { ComposerState } from "../hooks/use-composer";
42
41
  import type { QueueMutationKind, UseTurnQueueResult } from "../hooks/use-turn-queue";
43
- import { type PortalTokenStyle, usePortalTokenStyle } from "../lib/use-portal-token-style";
42
+ import {
43
+ type PortalTokenStyle,
44
+ usePortalTokenSource,
45
+ usePortalTokenStyle,
46
+ } from "../lib/use-portal-token-style";
44
47
  import { requestQueueDraftEdit } from "./queue-draft-policy";
45
48
  import { QueueErrorAlert, QueueStoppingStatus } from "./queue-surface-state";
49
+ import { TimelineAnnotationsChip } from "./timeline-annotations";
46
50
 
47
51
  /** The sole pending-input surface: compact above Goal, Agents, and composer. */
48
52
  type QueueSurfaceCommonProps = {
@@ -80,8 +84,9 @@ export function QueueSurface({
80
84
  const [replaceDraftFor, setReplaceDraftFor] = useState<string | null>(null);
81
85
  const [announcement, setAnnouncement] = useState("");
82
86
  const [draggedTurnId, setDraggedTurnId] = useState<string | null>(null);
83
- const surfaceRef = useRef<HTMLDivElement | null>(null);
84
- const portalTokenStyle = usePortalTokenStyle(surfaceRef);
87
+ const surface = usePortalTokenSource<HTMLDivElement>();
88
+ const surfaceRef = surface.currentRef;
89
+ const portalTokenStyle = usePortalTokenStyle(surface.source);
85
90
  const [keyboardDrag, setKeyboardDrag] = useState<{
86
91
  turnId: string;
87
92
  projectedIndex: number;
@@ -95,14 +100,15 @@ export function QueueSurface({
95
100
  (input) => !attachedInputIds.includes(input.id),
96
101
  );
97
102
  const canEditInComposer = queueComposerCheckoutEnabled(composer, readOnly);
98
- const collapsedPreview = useMemo(
99
- () =>
100
- queuePromptPreview(
101
- queue.queue[0]?.prompt ?? queue.pendingInputs[0]?.summary ?? "",
102
- QUEUE_COLLAPSED_PREVIEW_CHARACTERS,
103
- ),
104
- [queue.pendingInputs, queue.queue],
105
- );
103
+ const collapsedPreview = useMemo(() => {
104
+ const firstTurn = queue.queue[0];
105
+ return firstTurn
106
+ ? queueTurnPreview(firstTurn, QUEUE_COLLAPSED_PREVIEW_CHARACTERS)
107
+ : queuePromptPreview(
108
+ queue.pendingInputs[0]?.summary ?? "",
109
+ QUEUE_COLLAPSED_PREVIEW_CHARACTERS,
110
+ );
111
+ }, [queue.pendingInputs, queue.queue]);
106
112
  const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 6 } }));
107
113
 
108
114
  const displayedQueue = useMemo(() => {
@@ -129,7 +135,7 @@ export function QueueSurface({
129
135
  );
130
136
  if (moved) focusQueueTurn(surfaceRef.current, turnId);
131
137
  },
132
- [queue],
138
+ [queue, surfaceRef],
133
139
  );
134
140
 
135
141
  const onDragEnd = useCallback(
@@ -245,7 +251,7 @@ export function QueueSurface({
245
251
 
246
252
  return (
247
253
  <div
248
- ref={surfaceRef}
254
+ ref={surface.ref}
249
255
  className="og-root mx-auto mb-2 w-full max-w-3xl shrink-0 px-4 sm:px-6"
250
256
  data-testid="queue-surface"
251
257
  >
@@ -253,7 +259,7 @@ export function QueueSurface({
253
259
  {queue.stoppingPreviousAttempt ? <QueueStoppingStatus queue={queue} dividerAfter /> : null}
254
260
  <button
255
261
  type="button"
256
- className="flex w-full min-w-0 flex-wrap items-center gap-2 px-3 py-2 text-left outline-none transition-colors hover:bg-surface-2/60 focus-visible:bg-surface-2/60 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring/40 pointer-coarse:min-h-[44px]"
262
+ className="flex w-full min-w-0 flex-wrap items-center gap-2 px-3 py-2 text-left outline-hidden transition-colors hover:bg-surface-2/60 focus-visible:bg-surface-2/60 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring/40 pointer-coarse:min-h-[44px]"
257
263
  onClick={() => setOpen((value) => !value)}
258
264
  aria-description={!open && totalCount > 0 ? collapsedPreview.summary : undefined}
259
265
  aria-expanded={open}
@@ -405,8 +411,8 @@ export function QueueSurface({
405
411
  dir="auto"
406
412
  >
407
413
  {
408
- queuePromptPreview(
409
- queue.queue.find((turn) => turn.id === draggedTurnId)?.prompt ?? "",
414
+ queueTurnPreview(
415
+ queue.queue.find((turn) => turn.id === draggedTurnId),
410
416
  QUEUE_ROW_PREVIEW_CHARACTERS,
411
417
  ).summary
412
418
  }
@@ -486,6 +492,29 @@ type QueuePromptPreview = {
486
492
  isFallback: boolean;
487
493
  };
488
494
 
495
+ function annotationOnlyQueuePreview(count: number): QueuePromptPreview {
496
+ const summary = `${count} timeline ${count === 1 ? "annotation" : "annotations"}`;
497
+ return {
498
+ summary,
499
+ collapsedVisual: summary,
500
+ visibleStart: summary,
501
+ visibleIdentity: null,
502
+ visibleIdentityLabel: null,
503
+ isFallback: false,
504
+ };
505
+ }
506
+
507
+ function queueTurnPreview(
508
+ turn: SessionTurn | undefined,
509
+ maxCharacters: number,
510
+ ): QueuePromptPreview {
511
+ if (!turn) return queuePromptPreview("", maxCharacters);
512
+ const annotations = turn.annotations ?? [];
513
+ return turn.prompt.length === 0 && annotations.length > 0
514
+ ? annotationOnlyQueuePreview(annotations.length)
515
+ : queuePromptPreview(turn.prompt, maxCharacters);
516
+ }
517
+
489
518
  /**
490
519
  * Build a bounded head/tail summary of an arbitrary queued prompt. Sampling
491
520
  * both ends distinguishes prompts with equal long prefixes. Each sampled edge
@@ -748,73 +777,94 @@ function isLowSurrogate(codeUnit: number): boolean {
748
777
 
749
778
  function QueuePrompt({
750
779
  prompt,
780
+ annotations,
751
781
  index,
752
782
  onDisclosureChange,
753
783
  }: {
754
784
  prompt: string;
785
+ annotations: readonly TimelineAnnotation[];
755
786
  index: number;
756
787
  onDisclosureChange: (expanded: boolean) => void;
757
788
  }) {
758
789
  const [expanded, setExpanded] = useState(false);
759
790
  const fullContentId = useId();
760
- const preview = useMemo(() => queuePromptPreview(prompt, QUEUE_ROW_PREVIEW_CHARACTERS), [prompt]);
791
+ const preview = useMemo(
792
+ () =>
793
+ prompt.length === 0 && annotations.length > 0
794
+ ? annotationOnlyQueuePreview(annotations.length)
795
+ : queuePromptPreview(prompt, QUEUE_ROW_PREVIEW_CHARACTERS),
796
+ [annotations.length, prompt],
797
+ );
761
798
 
762
799
  return (
763
800
  <div className="w-full min-w-0 max-w-full">
764
- <div
765
- aria-label={`Queued prompt ${index + 1} summary: ${preview.summary}`}
766
- className="max-w-full overflow-hidden text-og-control leading-5 text-fg"
767
- data-testid={`queue-prompt-preview-${index + 1}`}
768
- dir="auto"
769
- role="note"
770
- >
771
- <span aria-hidden="true" className="flex min-w-0 max-w-full items-baseline gap-2 sm:block">
801
+ {prompt ? (
802
+ <div
803
+ aria-label={`Queued prompt ${index + 1} summary: ${preview.summary}`}
804
+ className="max-w-full overflow-hidden text-og-control leading-5 text-fg"
805
+ data-testid={`queue-prompt-preview-${index + 1}`}
806
+ dir="auto"
807
+ role="note"
808
+ >
772
809
  <span
773
- className={`${preview.isFallback ? "" : "line-clamp-1 sm:line-clamp-2"} min-w-0 flex-1 whitespace-pre-wrap break-all [unicode-bidi:plaintext]`}
774
- data-testid={`queue-prompt-start-${index + 1}`}
775
- dir="auto"
810
+ aria-hidden="true"
811
+ className="flex min-w-0 max-w-full items-baseline gap-2 sm:block"
776
812
  >
777
- {preview.visibleStart}
778
- </span>
779
- {preview.visibleIdentity && preview.visibleIdentityLabel ? (
780
813
  <span
781
- className="flex min-w-0 max-w-[70%] shrink-0 items-center gap-1 text-og-xs leading-4 text-fg-muted sm:mt-0.5 sm:max-w-full"
782
- data-testid={`queue-prompt-identity-row-${index + 1}`}
814
+ className={`${preview.isFallback ? "" : "line-clamp-1 sm:line-clamp-2"} min-w-0 flex-1 whitespace-pre-wrap break-all [unicode-bidi:plaintext]`}
815
+ data-testid={`queue-prompt-start-${index + 1}`}
816
+ dir="auto"
783
817
  >
784
- <span className="shrink-0 font-medium text-fg-subtle">
785
- {preview.visibleIdentityLabel}
786
- </span>
818
+ {preview.visibleStart}
819
+ </span>
820
+ {preview.visibleIdentity && preview.visibleIdentityLabel ? (
787
821
  <span
788
- className="min-w-0 overflow-hidden text-ellipsis whitespace-nowrap font-mono [unicode-bidi:plaintext]"
789
- data-testid={`queue-prompt-identity-${index + 1}`}
790
- dir="auto"
822
+ className="flex min-w-0 max-w-[70%] shrink-0 items-center gap-1 text-og-xs leading-4 text-fg-muted sm:mt-0.5 sm:max-w-full"
823
+ data-testid={`queue-prompt-identity-row-${index + 1}`}
791
824
  >
792
- {preview.visibleIdentity}
825
+ <span className="shrink-0 font-medium text-fg-subtle">
826
+ {preview.visibleIdentityLabel}
827
+ </span>
828
+ <span
829
+ className="min-w-0 overflow-hidden text-ellipsis whitespace-nowrap font-mono [unicode-bidi:plaintext]"
830
+ data-testid={`queue-prompt-identity-${index + 1}`}
831
+ dir="auto"
832
+ >
833
+ {preview.visibleIdentity}
834
+ </span>
793
835
  </span>
794
- </span>
795
- ) : null}
796
- </span>
797
- </div>
798
- <button
799
- type="button"
800
- aria-controls={fullContentId}
801
- aria-expanded={expanded}
802
- aria-label={`${expanded ? "Hide" : "Show"} full content for queued prompt ${index + 1}`}
803
- className="mt-1 inline-flex min-h-7 min-w-0 max-w-full items-center gap-1 whitespace-normal rounded-md text-left text-og-xs font-medium text-fg outline-none focus-visible:ring-2 focus-visible:ring-ring/40 pointer-coarse:min-h-[44px]"
804
- data-testid={`queue-prompt-disclosure-${index + 1}`}
805
- onClick={() => {
806
- const next = !expanded;
807
- setExpanded(next);
808
- onDisclosureChange(next);
809
- }}
810
- >
811
- <ChevronDownIcon
812
- aria-hidden="true"
813
- className={`size-3 shrink-0 transition-transform ${expanded ? "rotate-180" : ""}`}
836
+ ) : null}
837
+ </span>
838
+ </div>
839
+ ) : null}
840
+ {annotations.length > 0 ? (
841
+ <TimelineAnnotationsChip
842
+ annotations={annotations}
843
+ className={prompt ? "mt-1" : undefined}
814
844
  />
815
- {expanded ? "Hide full prompt" : "View full prompt"}
816
- </button>
817
- {expanded ? (
845
+ ) : null}
846
+ {prompt ? (
847
+ <button
848
+ type="button"
849
+ aria-controls={fullContentId}
850
+ aria-expanded={expanded}
851
+ aria-label={`${expanded ? "Hide" : "Show"} full content for queued prompt ${index + 1}`}
852
+ className="mt-1 inline-flex min-h-7 min-w-0 max-w-full items-center gap-1 whitespace-normal rounded-md text-left text-og-xs font-medium text-fg outline-hidden focus-visible:ring-2 focus-visible:ring-ring/40 pointer-coarse:min-h-[44px]"
853
+ data-testid={`queue-prompt-disclosure-${index + 1}`}
854
+ onClick={() => {
855
+ const next = !expanded;
856
+ setExpanded(next);
857
+ onDisclosureChange(next);
858
+ }}
859
+ >
860
+ <ChevronDownIcon
861
+ aria-hidden="true"
862
+ className={`size-3 shrink-0 transition-transform ${expanded ? "rotate-180" : ""}`}
863
+ />
864
+ {expanded ? "Hide full prompt" : "View full prompt"}
865
+ </button>
866
+ ) : null}
867
+ {expanded && prompt ? (
818
868
  <pre
819
869
  id={fullContentId}
820
870
  role="region"
@@ -846,7 +896,12 @@ function ReadOnlyQueueRow({
846
896
  <li className="flex min-w-0 items-start gap-2 bg-surface px-3 py-2">
847
897
  <span className="mt-1 shrink-0 font-mono text-og-xs text-fg-subtle">{index + 1}</span>
848
898
  <div className="min-w-0 flex-1">
849
- <QueuePrompt prompt={turn.prompt} index={index} onDisclosureChange={onDisclosureChange} />
899
+ <QueuePrompt
900
+ prompt={turn.prompt}
901
+ annotations={turn.annotations ?? []}
902
+ index={index}
903
+ onDisclosureChange={onDisclosureChange}
904
+ />
850
905
  {attachedInputs.length > 0 ? (
851
906
  <PendingMachineInputs inputs={attachedInputs} attached />
852
907
  ) : null}
@@ -937,7 +992,12 @@ function SortableQueueRow({
937
992
  {index + 1}
938
993
  </span>
939
994
  <div className="col-span-full row-start-2 min-w-0 sm:col-span-1 sm:col-start-3 sm:row-start-1">
940
- <QueuePrompt prompt={turn.prompt} index={index} onDisclosureChange={onDisclosureChange} />
995
+ <QueuePrompt
996
+ prompt={turn.prompt}
997
+ annotations={turn.annotations ?? []}
998
+ index={index}
999
+ onDisclosureChange={onDisclosureChange}
1000
+ />
941
1001
  {attachedInputs.length > 0 ? (
942
1002
  <PendingMachineInputs inputs={attachedInputs} attached />
943
1003
  ) : null}
@@ -963,7 +1023,7 @@ function SortableQueueRow({
963
1023
  onClick={onSteer}
964
1024
  aria-label={`Steer queued prompt ${index + 1}`}
965
1025
  title="Steer — interrupt the current turn and send this message now"
966
- className="inline-flex h-7 shrink-0 items-center justify-center gap-1 rounded-md px-2 text-og-control font-medium text-fg outline-none transition-[background-color] hover:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:min-h-[44px] pointer-coarse:min-w-[44px]"
1026
+ className="inline-flex h-7 shrink-0 items-center justify-center gap-1 rounded-md px-2 text-og-control font-medium text-fg outline-hidden transition-[background-color] hover:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:min-h-[44px] pointer-coarse:min-w-[44px]"
967
1027
  >
968
1028
  {pending === "steer" ? (
969
1029
  <Loader2Icon className="size-3.5 animate-spin" />
@@ -978,7 +1038,7 @@ function SortableQueueRow({
978
1038
  onClick={onDelete}
979
1039
  aria-label={`Delete queued prompt ${index + 1}`}
980
1040
  title="Delete this queued prompt"
981
- className="inline-flex size-7 shrink-0 items-center justify-center rounded-md outline-none transition-colors hover:bg-surface-2 hover:text-status-failed focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:size-[44px]"
1041
+ className="inline-flex size-7 shrink-0 items-center justify-center rounded-md outline-hidden transition-colors hover:bg-surface-2 hover:text-status-failed focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:size-[44px]"
982
1042
  >
983
1043
  {pending === "delete" ? (
984
1044
  <Loader2Icon className="size-3.5 animate-spin" />
@@ -992,7 +1052,7 @@ function SortableQueueRow({
992
1052
  type="button"
993
1053
  disabled={pending !== null}
994
1054
  aria-label={`More actions for queued prompt ${index + 1}`}
995
- className="inline-flex size-7 shrink-0 items-center justify-center rounded-md outline-none transition-colors hover:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:size-[44px]"
1055
+ className="inline-flex size-7 shrink-0 items-center justify-center rounded-md outline-hidden transition-colors hover:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:size-[44px]"
996
1056
  >
997
1057
  {pending && pending !== "steer" && pending !== "delete" ? (
998
1058
  <Loader2Icon className="size-3.5 animate-spin" />
@@ -1012,7 +1072,7 @@ function SortableQueueRow({
1012
1072
  {onEdit ? (
1013
1073
  <>
1014
1074
  <DropdownMenu.Item
1015
- className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-none focus:bg-surface-2 pointer-coarse:min-h-[44px]"
1075
+ className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 pointer-coarse:min-h-[44px]"
1016
1076
  onSelect={onEdit}
1017
1077
  >
1018
1078
  <PencilIcon className="size-3.5" /> Edit in composer
@@ -1021,28 +1081,28 @@ function SortableQueueRow({
1021
1081
  </>
1022
1082
  ) : null}
1023
1083
  <DropdownMenu.Item
1024
- className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-none focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]"
1084
+ className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]"
1025
1085
  disabled={index === 0}
1026
1086
  onSelect={() => onMove(0)}
1027
1087
  >
1028
1088
  <ArrowUpToLineIcon className="size-3.5" /> Move to top
1029
1089
  </DropdownMenu.Item>
1030
1090
  <DropdownMenu.Item
1031
- className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-none focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]"
1091
+ className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]"
1032
1092
  disabled={index === 0}
1033
1093
  onSelect={() => onMove(index - 1)}
1034
1094
  >
1035
1095
  Move up
1036
1096
  </DropdownMenu.Item>
1037
1097
  <DropdownMenu.Item
1038
- className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-none focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]"
1098
+ className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]"
1039
1099
  disabled={index === count - 1}
1040
1100
  onSelect={() => onMove(index + 1)}
1041
1101
  >
1042
1102
  Move down
1043
1103
  </DropdownMenu.Item>
1044
1104
  <DropdownMenu.Item
1045
- className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-none focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]"
1105
+ className="flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]"
1046
1106
  disabled={index === count - 1}
1047
1107
  onSelect={() => onMove(count - 1)}
1048
1108
  >
@@ -70,7 +70,7 @@ export function QueueErrorAlert({
70
70
  role="region"
71
71
  aria-label="Queue error details"
72
72
  tabIndex={0}
73
- className="max-h-[min(5rem,20dvh)] min-w-0 max-w-full flex-[1_1_5rem] overflow-auto overscroll-contain whitespace-pre-wrap rounded-sm outline-none [overflow-wrap:anywhere] [unicode-bidi:plaintext] focus-visible:ring-2 focus-visible:ring-ring/40"
73
+ className="max-h-[min(5rem,20dvh)] min-w-0 max-w-full flex-[1_1_5rem] overflow-auto overscroll-contain whitespace-pre-wrap rounded-sm outline-hidden [overflow-wrap:anywhere] [unicode-bidi:plaintext] focus-visible:ring-2 focus-visible:ring-ring/40"
74
74
  data-testid="queue-error-message"
75
75
  dir="auto"
76
76
  >
@@ -84,7 +84,7 @@ export function QueueErrorAlert({
84
84
  }}
85
85
  aria-label="Dismiss queue error and retry"
86
86
  title="Retry loading the queue"
87
- className="ms-auto inline-flex size-7 shrink-0 items-center justify-center self-start rounded-md outline-none transition-colors hover:bg-surface-3 focus-visible:ring-2 focus-visible:ring-ring/40 motion-reduce:transition-none pointer-coarse:size-[44px]"
87
+ className="ms-auto inline-flex size-7 shrink-0 items-center justify-center self-start rounded-md outline-hidden transition-colors hover:bg-surface-3 focus-visible:ring-2 focus-visible:ring-ring/40 motion-reduce:transition-none pointer-coarse:size-[44px]"
88
88
  >
89
89
  <RotateCwIcon className="size-3.5" />
90
90
  </button>