@opengeni/react 3.1.0 → 3.1.3-canary.38890816741001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +89 -11
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/approvals.d.ts +2 -1
  5. package/dist/artifacts-document.js +5 -3
  6. package/dist/artifacts-presentation.js +5 -3
  7. package/dist/artifacts-spreadsheet.d.ts +1 -1
  8. package/dist/artifacts-spreadsheet.js +5 -3
  9. package/dist/artifacts.d.ts +5 -1
  10. package/dist/artifacts.js +536 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
  16. package/dist/chunk-2DDJ6YH6.js +41 -0
  17. package/dist/chunk-2DDJ6YH6.js.map +1 -0
  18. package/dist/chunk-2HVLQ26H.js +183 -0
  19. package/dist/chunk-2HVLQ26H.js.map +1 -0
  20. package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
  23. package/dist/chunk-2SFFYIH3.js.map +1 -0
  24. package/dist/chunk-3PVDYTTB.js +24 -0
  25. package/dist/chunk-3PVDYTTB.js.map +1 -0
  26. package/dist/chunk-3UZCWK46.js +298 -0
  27. package/dist/chunk-3UZCWK46.js.map +1 -0
  28. package/dist/chunk-47CKUXTW.js +293 -0
  29. package/dist/chunk-47CKUXTW.js.map +1 -0
  30. package/dist/chunk-4QYP6QUI.js +109 -0
  31. package/dist/chunk-4QYP6QUI.js.map +1 -0
  32. package/dist/chunk-5EY26VZ7.js +1053 -0
  33. package/dist/chunk-5EY26VZ7.js.map +1 -0
  34. package/dist/chunk-5I4VRWBB.js +56 -0
  35. package/dist/chunk-5I4VRWBB.js.map +1 -0
  36. package/dist/chunk-5WOR7UCL.js +191 -0
  37. package/dist/chunk-5WOR7UCL.js.map +1 -0
  38. package/dist/chunk-5YJLGOM5.js +51 -0
  39. package/dist/chunk-5YJLGOM5.js.map +1 -0
  40. package/dist/chunk-6JFN3OWG.js +386 -0
  41. package/dist/chunk-6JFN3OWG.js.map +1 -0
  42. package/dist/chunk-7QJT5O4S.js +35 -0
  43. package/dist/chunk-7QJT5O4S.js.map +1 -0
  44. package/dist/chunk-A55KV72M.js +402 -0
  45. package/dist/chunk-A55KV72M.js.map +1 -0
  46. package/dist/chunk-ADWCLI4G.js +2028 -0
  47. package/dist/chunk-ADWCLI4G.js.map +1 -0
  48. package/dist/chunk-B27E3V37.js +29 -0
  49. package/dist/chunk-B27E3V37.js.map +1 -0
  50. package/dist/chunk-B7TC2A33.js +83 -0
  51. package/dist/chunk-B7TC2A33.js.map +1 -0
  52. package/dist/chunk-BLL56F7R.js +385 -0
  53. package/dist/chunk-BLL56F7R.js.map +1 -0
  54. package/dist/chunk-BOFEQC6K.js +162 -0
  55. package/dist/chunk-BOFEQC6K.js.map +1 -0
  56. package/dist/chunk-CM7LVUKC.js +35 -0
  57. package/dist/chunk-CM7LVUKC.js.map +1 -0
  58. package/dist/chunk-CORUP6JB.js +122 -0
  59. package/dist/chunk-CORUP6JB.js.map +1 -0
  60. package/dist/chunk-CSX5FFKZ.js +35 -0
  61. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  62. package/dist/chunk-EGVHJKGJ.js +3125 -0
  63. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  64. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  65. package/dist/chunk-G76LSA76.js.map +1 -0
  66. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  67. package/dist/chunk-GQMRL52F.js.map +1 -0
  68. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  69. package/dist/chunk-GUUXOISA.js.map +1 -0
  70. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  71. package/dist/chunk-I7X2P4FU.js.map +1 -0
  72. package/dist/chunk-IGFZFLI2.js +1390 -0
  73. package/dist/chunk-IGFZFLI2.js.map +1 -0
  74. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  75. package/dist/chunk-IMSUVYQB.js.map +1 -0
  76. package/dist/chunk-IOYHDEP3.js +38 -0
  77. package/dist/chunk-IOYHDEP3.js.map +1 -0
  78. package/dist/chunk-IZV5FTJC.js +55 -0
  79. package/dist/chunk-IZV5FTJC.js.map +1 -0
  80. package/dist/chunk-KF33GTWN.js +343 -0
  81. package/dist/chunk-KF33GTWN.js.map +1 -0
  82. package/dist/chunk-KSGQ5ODA.js +457 -0
  83. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  84. package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
  85. package/dist/chunk-KZC6QRNR.js.map +1 -0
  86. package/dist/chunk-LJUMYUBO.js +218 -0
  87. package/dist/chunk-LJUMYUBO.js.map +1 -0
  88. package/dist/chunk-LSW2OJVV.js +380 -0
  89. package/dist/chunk-LSW2OJVV.js.map +1 -0
  90. package/dist/chunk-M357MHH3.js +2 -0
  91. package/dist/chunk-M357MHH3.js.map +1 -0
  92. package/dist/chunk-MK2TQO4Y.js +24 -0
  93. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  94. package/dist/chunk-N7S72EXK.js +25 -0
  95. package/dist/chunk-N7S72EXK.js.map +1 -0
  96. package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
  97. package/dist/chunk-NKMYZFHA.js.map +1 -0
  98. package/dist/chunk-NX4ADH73.js +14 -0
  99. package/dist/chunk-NX4ADH73.js.map +1 -0
  100. package/dist/chunk-O7F6UJO4.js +71 -0
  101. package/dist/chunk-O7F6UJO4.js.map +1 -0
  102. package/dist/chunk-OVB5WIG5.js +14064 -0
  103. package/dist/chunk-OVB5WIG5.js.map +1 -0
  104. package/dist/chunk-OYQQJL3J.js +16 -0
  105. package/dist/chunk-OYQQJL3J.js.map +1 -0
  106. package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
  107. package/dist/chunk-P4BNUO57.js.map +1 -0
  108. package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
  109. package/dist/chunk-PEHTX3V7.js.map +1 -0
  110. package/dist/chunk-PMV53IMM.js +26 -0
  111. package/dist/chunk-PMV53IMM.js.map +1 -0
  112. package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
  113. package/dist/chunk-PYEOPA4M.js.map +1 -0
  114. package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
  115. package/dist/chunk-QHUE7E4N.js.map +1 -0
  116. package/dist/chunk-QV3DJVRZ.js +11 -0
  117. package/dist/chunk-QV3DJVRZ.js.map +1 -0
  118. package/dist/chunk-R5SBNG7S.js +810 -0
  119. package/dist/chunk-R5SBNG7S.js.map +1 -0
  120. package/dist/chunk-RI42H5IU.js +326 -0
  121. package/dist/chunk-RI42H5IU.js.map +1 -0
  122. package/dist/chunk-S2QH6EZ5.js +211 -0
  123. package/dist/chunk-S2QH6EZ5.js.map +1 -0
  124. package/dist/chunk-SHLZMAJN.js +304 -0
  125. package/dist/chunk-SHLZMAJN.js.map +1 -0
  126. package/dist/chunk-TGXK4BAZ.js +293 -0
  127. package/dist/chunk-TGXK4BAZ.js.map +1 -0
  128. package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
  129. package/dist/chunk-TNEZNMSN.js.map +1 -0
  130. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  131. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  132. package/dist/chunk-UNJPZGNK.js +63 -0
  133. package/dist/chunk-UNJPZGNK.js.map +1 -0
  134. package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-VIUEOHXY.js +394 -0
  137. package/dist/chunk-VIUEOHXY.js.map +1 -0
  138. package/dist/chunk-WIUKB3LD.js +1911 -0
  139. package/dist/chunk-WIUKB3LD.js.map +1 -0
  140. package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
  141. package/dist/chunk-WNN7NO2N.js.map +1 -0
  142. package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
  143. package/dist/chunk-X5UVUIMF.js.map +1 -0
  144. package/dist/chunk-XDA5QJE7.js +402 -0
  145. package/dist/chunk-XDA5QJE7.js.map +1 -0
  146. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  147. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  148. package/dist/chunk-XHF7OYAN.js +1150 -0
  149. package/dist/chunk-XHF7OYAN.js.map +1 -0
  150. package/dist/chunk-YSRBFJMQ.js +43 -0
  151. package/dist/chunk-YSRBFJMQ.js.map +1 -0
  152. package/dist/chunk-ZOZAPAUO.js +174 -0
  153. package/dist/chunk-ZOZAPAUO.js.map +1 -0
  154. package/dist/chunk-ZQV5W7YC.js +809 -0
  155. package/dist/chunk-ZQV5W7YC.js.map +1 -0
  156. package/dist/chunk-ZUWF4NF7.js +13 -0
  157. package/dist/chunk-ZUWF4NF7.js.map +1 -0
  158. package/dist/client.d.ts +16 -7
  159. package/dist/clipboard.js +3 -1
  160. package/dist/commands/types.d.ts +2 -0
  161. package/dist/components/anthropic-mark.d.ts +3 -0
  162. package/dist/components/approval-surface.d.ts +19 -6
  163. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  164. package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
  165. package/dist/components/artifacts/artifact-surface.d.ts +4 -2
  166. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  167. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  168. package/dist/components/artifacts/document-editor.d.ts +4 -2
  169. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  170. package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
  171. package/dist/components/artifacts/editable-document.d.ts +1 -1
  172. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  173. package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
  174. package/dist/components/artifacts/index.d.ts +9 -2
  175. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  176. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  177. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  178. package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
  179. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  180. package/dist/components/artifacts/site-view.d.ts +26 -0
  181. package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
  182. package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
  183. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  184. package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
  185. package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
  186. package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
  187. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  188. package/dist/components/browser-select-control.d.ts +16 -0
  189. package/dist/components/browser-viewer.d.ts +11 -2
  190. package/dist/components/chat-composer.d.ts +21 -3
  191. package/dist/components/child-session-link.d.ts +9 -0
  192. package/dist/components/claude-mark.d.ts +3 -0
  193. package/dist/components/code-editor.d.ts +1 -4
  194. package/dist/components/composer-transcription-control.d.ts +7 -0
  195. package/dist/components/composer.d.ts +34 -67
  196. package/dist/components/computer-viewer.d.ts +1 -1
  197. package/dist/components/copy-button.d.ts +3 -1
  198. package/dist/components/desktop-viewer.d.ts +1 -1
  199. package/dist/components/fleet-tile.d.ts +2 -2
  200. package/dist/components/grok-mark.d.ts +26 -0
  201. package/dist/components/human-input-form.d.ts +28 -32
  202. package/dist/components/human-input-surface.d.ts +7 -2
  203. package/dist/components/linkified-text.d.ts +18 -0
  204. package/dist/components/machine-input-display.d.ts +22 -1
  205. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  206. package/dist/components/machines/machine-detail.d.ts +7 -1
  207. package/dist/components/machines/machine-status.d.ts +48 -0
  208. package/dist/components/markdown-table-layout.d.ts +18 -0
  209. package/dist/components/markdown.d.ts +37 -4
  210. package/dist/components/message-timeline.d.ts +86 -7
  211. package/dist/components/model-mark.d.ts +29 -0
  212. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  213. package/dist/components/model-policy-picker.d.ts +41 -25
  214. package/dist/components/new-conversation.d.ts +32 -0
  215. package/dist/components/open-geni-chat.d.ts +73 -0
  216. package/dist/components/open-geni-links.d.ts +68 -0
  217. package/dist/components/openrouter-mark.d.ts +6 -0
  218. package/dist/components/opper-mark.d.ts +7 -0
  219. package/dist/components/preview-loading.d.ts +2 -0
  220. package/dist/components/provider-recovery-notice.d.ts +16 -0
  221. package/dist/components/queue-item-content.d.ts +9 -0
  222. package/dist/components/rehype-secret-refs.d.ts +23 -0
  223. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  224. package/dist/components/sandbox-files.d.ts +3 -1
  225. package/dist/components/sandbox-workspace.d.ts +18 -0
  226. package/dist/components/secret-question-field.d.ts +31 -0
  227. package/dist/components/secret-ref-chip.d.ts +35 -0
  228. package/dist/components/session-capability-frame.d.ts +37 -0
  229. package/dist/components/session-chrome.d.ts +57 -8
  230. package/dist/components/session-commands-panel.d.ts +6 -0
  231. package/dist/components/session-commands.d.ts +6 -0
  232. package/dist/components/session-connection-request.d.ts +8 -0
  233. package/dist/components/session-conversation.d.ts +157 -0
  234. package/dist/components/session-list.d.ts +39 -0
  235. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  236. package/dist/components/session-proxy-scope.d.ts +35 -0
  237. package/dist/components/session-status.d.ts +4 -1
  238. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  239. package/dist/components/timeline-anchor.d.ts +24 -0
  240. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  241. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  242. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  243. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  244. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  245. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  246. package/dist/components/timeline-annotations.d.ts +13 -3
  247. package/dist/components/timeline-reading-progress.d.ts +11 -0
  248. package/dist/components/timeline-search.d.ts +34 -0
  249. package/dist/components/timeline-settlement.d.ts +16 -0
  250. package/dist/components/tip-follow.d.ts +16 -0
  251. package/dist/components/tool-action-review.d.ts +47 -0
  252. package/dist/components/tool-review-history.d.ts +25 -0
  253. package/dist/components/usage-limit-notice.d.ts +49 -0
  254. package/dist/components/usage-member-list.d.ts +91 -0
  255. package/dist/components/usage-meter.d.ts +73 -0
  256. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  257. package/dist/components/user-message-body.d.ts +10 -1
  258. package/dist/composer-messages.d.ts +74 -0
  259. package/dist/composer-messages.js +9 -0
  260. package/dist/composer-messages.js.map +1 -0
  261. package/dist/composer-voice-events.d.ts +8 -0
  262. package/dist/composer.d.ts +5 -4
  263. package/dist/composer.js +26 -13
  264. package/dist/computer-viewer-GMLDXPON.js +20 -0
  265. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  266. package/dist/connect-account-identity.d.ts +8 -0
  267. package/dist/connect-accounts.d.ts +15 -0
  268. package/dist/connect-chooser.d.ts +18 -0
  269. package/dist/connect-panel.d.ts +18 -0
  270. package/dist/connect-setup.d.ts +18 -0
  271. package/dist/connect.d.ts +21 -0
  272. package/dist/connect.js +2149 -0
  273. package/dist/connect.js.map +1 -0
  274. package/dist/connection-catalog.d.ts +38 -0
  275. package/dist/connection-discovery.d.ts +12 -0
  276. package/dist/connection-installed.d.ts +17 -0
  277. package/dist/connection-logo.d.ts +9 -0
  278. package/dist/connection-service-logo.d.ts +8 -0
  279. package/dist/connection-service-presentation.d.ts +13 -0
  280. package/dist/connection-skeleton.d.ts +5 -0
  281. package/dist/connection-type-picker.d.ts +6 -0
  282. package/dist/conversation-timeline.d.ts +5 -0
  283. package/dist/desktop.d.ts +7 -0
  284. package/dist/desktop.js +27 -0
  285. package/dist/desktop.js.map +1 -0
  286. package/dist/device-authorization.d.ts +23 -0
  287. package/dist/diffs.d.ts +8 -0
  288. package/dist/diffs.js +15 -0
  289. package/dist/diffs.js.map +1 -0
  290. package/dist/discovery-cache.d.ts +5 -0
  291. package/dist/editor.d.ts +7 -0
  292. package/dist/editor.js +22 -0
  293. package/dist/editor.js.map +1 -0
  294. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  295. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  296. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  297. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  298. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  299. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  300. package/dist/hooks/latest-question.d.ts +25 -0
  301. package/dist/hooks/shared-machines-list.d.ts +4 -0
  302. package/dist/hooks/shared-query.d.ts +113 -0
  303. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  304. package/dist/hooks/use-auth-runs.d.ts +1 -4
  305. package/dist/hooks/use-available-models.d.ts +1 -1
  306. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  307. package/dist/hooks/use-browser-session.d.ts +12 -1
  308. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  309. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  310. package/dist/hooks/use-composer.d.ts +24 -2
  311. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  312. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  313. package/dist/hooks/use-computer-session.d.ts +4 -0
  314. package/dist/hooks/use-connect.d.ts +23 -0
  315. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  316. package/dist/hooks/use-file-attachments.d.ts +12 -0
  317. package/dist/hooks/use-goal.d.ts +2 -1
  318. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  319. package/dist/hooks/use-new-conversation.d.ts +56 -0
  320. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  321. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  322. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  323. package/dist/hooks/use-session-conversation.d.ts +49 -0
  324. package/dist/hooks/use-session-events.d.ts +28 -7
  325. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  326. package/dist/hooks/use-session-model-account.d.ts +48 -0
  327. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  328. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  329. package/dist/hooks/use-usage.d.ts +40 -0
  330. package/dist/hooks/use-vaults.d.ts +53 -0
  331. package/dist/hooks/use-voice-input.d.ts +8 -1
  332. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  333. package/dist/hooks/use-workspace-sessions.d.ts +22 -5
  334. package/dist/human-input-model.d.ts +122 -0
  335. package/dist/identity-link-accounts.d.ts +11 -0
  336. package/dist/identity-link-consent.d.ts +18 -0
  337. package/dist/index.d.ts +82 -20
  338. package/dist/index.js +2350 -6605
  339. package/dist/index.js.map +1 -1
  340. package/dist/interaction.d.ts +1 -1
  341. package/dist/interaction.js +14 -24
  342. package/dist/interaction.js.map +1 -1
  343. package/dist/latest-question-R77KWSUP.js +118 -0
  344. package/dist/latest-question-R77KWSUP.js.map +1 -0
  345. package/dist/lib/clipboard.d.ts +7 -0
  346. package/dist/lib/error-message.d.ts +7 -0
  347. package/dist/lib/format.d.ts +58 -4
  348. package/dist/lib/host-theme.d.ts +77 -0
  349. package/dist/lib/interaction-errors.d.ts +3 -0
  350. package/dist/lib/menu-styles.d.ts +22 -0
  351. package/dist/lib/notify-observer.d.ts +2 -0
  352. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  353. package/dist/lib/provider-recovery.d.ts +55 -0
  354. package/dist/lib/scrollbars.d.ts +11 -0
  355. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  356. package/dist/lib/transient-retry.d.ts +25 -0
  357. package/dist/lib/workbench-peers.d.ts +36 -0
  358. package/dist/lib/xterm-theme.d.ts +7 -5
  359. package/dist/machines.js +9 -5
  360. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  361. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  362. package/dist/mcp-connection-status.d.ts +14 -0
  363. package/dist/model-mark-paths.d.ts +34 -0
  364. package/dist/model-mark-paths.js +16 -0
  365. package/dist/model-mark-paths.js.map +1 -0
  366. package/dist/model-picker-model.d.ts +111 -0
  367. package/dist/model-picker-model.js +25 -0
  368. package/dist/model-picker-model.js.map +1 -0
  369. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  370. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  371. package/dist/model-policy.d.ts +30 -3
  372. package/dist/model-policy.js +14 -1
  373. package/dist/native-previews.d.ts +28 -0
  374. package/dist/native-previews.js +82 -0
  375. package/dist/native-previews.js.map +1 -0
  376. package/dist/new-session-draft.d.ts +7 -0
  377. package/dist/new-session-draft.js +639 -0
  378. package/dist/new-session-draft.js.map +1 -0
  379. package/dist/notification-text.d.ts +27 -0
  380. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  381. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  382. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  383. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  384. package/dist/older-history.d.ts +3 -2
  385. package/dist/organization-model.d.ts +32 -0
  386. package/dist/organization-model.js +65 -0
  387. package/dist/organization-model.js.map +1 -0
  388. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  389. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  390. package/dist/plugin-details.d.ts +14 -0
  391. package/dist/plugin-discovery.d.ts +25 -0
  392. package/dist/preview-loading-paint.d.ts +20 -0
  393. package/dist/provider.d.ts +25 -2
  394. package/dist/queue-presentation-model.d.ts +72 -0
  395. package/dist/queue-presentation-model.js +38 -0
  396. package/dist/queue-presentation-model.js.map +1 -0
  397. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  398. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  399. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  400. package/dist/realtime/embedded-voice.d.ts +1 -0
  401. package/dist/realtime/realtime-control.d.ts +4 -65
  402. package/dist/realtime/session-realtime.d.ts +78 -0
  403. package/dist/realtime.js +25 -1294
  404. package/dist/realtime.js.map +1 -1
  405. package/dist/sandbox-files-O27IPOZW.js +21 -0
  406. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  407. package/dist/sandbox-label-model.d.ts +30 -0
  408. package/dist/sandbox-label-model.js +20 -0
  409. package/dist/sandbox-label-model.js.map +1 -0
  410. package/dist/scrollbars.d.ts +1 -0
  411. package/dist/scrollbars.js +10 -0
  412. package/dist/scrollbars.js.map +1 -0
  413. package/dist/secret-reference-label.d.ts +14 -0
  414. package/dist/secrets-ui.d.ts +57 -0
  415. package/dist/session-agents-model.d.ts +10 -0
  416. package/dist/session-agents-model.js +25 -0
  417. package/dist/session-agents-model.js.map +1 -0
  418. package/dist/session-attention-model.d.ts +8 -0
  419. package/dist/session-attention-model.js +47 -0
  420. package/dist/session-attention-model.js.map +1 -0
  421. package/dist/session-auth-recommendation.d.ts +5 -0
  422. package/dist/session-capability-policy.d.ts +31 -0
  423. package/dist/session-feedback-model.d.ts +20 -0
  424. package/dist/session-feedback-model.js +56 -0
  425. package/dist/session-feedback-model.js.map +1 -0
  426. package/dist/session-list-model.d.ts +138 -0
  427. package/dist/session-list-model.js +274 -0
  428. package/dist/session-list-model.js.map +1 -0
  429. package/dist/session-realtime-7DJOIHQW.js +21 -0
  430. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  431. package/dist/session-realtime.d.ts +7 -0
  432. package/dist/session-realtime.js +19 -0
  433. package/dist/session-realtime.js.map +1 -0
  434. package/dist/session-status-model.d.ts +36 -0
  435. package/dist/session-ui.d.ts +39 -1
  436. package/dist/session-ui.js +126 -12
  437. package/dist/session-ui.js.map +1 -1
  438. package/dist/session.d.ts +8 -2
  439. package/dist/session.js +35 -20
  440. package/dist/site-snapshot.d.ts +14 -0
  441. package/dist/sites-ui.d.ts +24 -0
  442. package/dist/sites.d.ts +3 -0
  443. package/dist/sites.js +14 -0
  444. package/dist/sites.js.map +1 -0
  445. package/dist/skill-discovery.d.ts +47 -0
  446. package/dist/terminal.d.ts +8 -0
  447. package/dist/terminal.js +32 -0
  448. package/dist/terminal.js.map +1 -0
  449. package/dist/testing/session-scenarios.d.ts +10 -0
  450. package/dist/testing/session-scenarios.js +367 -0
  451. package/dist/testing/session-scenarios.js.map +1 -0
  452. package/dist/timeline/activity-rail.d.ts +11 -2
  453. package/dist/timeline/agent-identity.d.ts +30 -0
  454. package/dist/timeline/agent-row.d.ts +31 -0
  455. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  456. package/dist/timeline/compaction-copy.d.ts +46 -0
  457. package/dist/timeline/entrance.d.ts +13 -1
  458. package/dist/timeline/focus-sequence.d.ts +9 -0
  459. package/dist/timeline/genie-copy.d.ts +3 -0
  460. package/dist/timeline/genie-loading.d.ts +47 -0
  461. package/dist/timeline/index.d.ts +10 -5
  462. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  463. package/dist/timeline/message-sender.d.ts +19 -0
  464. package/dist/timeline/notice-presentation.d.ts +13 -0
  465. package/dist/timeline/parsers.d.ts +11 -0
  466. package/dist/timeline/patch-apply-command.d.ts +18 -0
  467. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  468. package/dist/timeline/platform-activity-row.d.ts +1 -2
  469. package/dist/timeline/presented-image.d.ts +11 -0
  470. package/dist/timeline/projection.d.ts +31 -2
  471. package/dist/timeline/provider-logo.d.ts +15 -0
  472. package/dist/timeline/question-nav-model.d.ts +23 -0
  473. package/dist/timeline/registry.d.ts +12 -1
  474. package/dist/timeline/retained-image.d.ts +18 -0
  475. package/dist/timeline/retained-loaders.d.ts +27 -0
  476. package/dist/timeline/rolling-activity.d.ts +11 -0
  477. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  478. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  479. package/dist/timeline/shared.d.ts +4 -1
  480. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  481. package/dist/timeline/startup-preference.d.ts +3 -0
  482. package/dist/timeline/startup-timings.d.ts +4 -0
  483. package/dist/timeline/tool-display-name.d.ts +5 -2
  484. package/dist/timeline/tool-presentation.d.ts +172 -0
  485. package/dist/timeline/turn-summary-model.d.ts +95 -0
  486. package/dist/timeline/turn-summary.d.ts +20 -54
  487. package/dist/timeline/types.d.ts +179 -7
  488. package/dist/timeline/work-presentation.d.ts +60 -0
  489. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  490. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  491. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  492. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  493. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  494. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  495. package/dist/timeline-model.d.ts +29 -0
  496. package/dist/timeline-model.js +254 -0
  497. package/dist/timeline-model.js.map +1 -0
  498. package/dist/usage/allowance-copy.d.ts +25 -0
  499. package/dist/usage/session-usage-limit.d.ts +88 -0
  500. package/dist/usage/summary.d.ts +35 -0
  501. package/dist/usage.d.ts +17 -0
  502. package/dist/usage.js +1187 -0
  503. package/dist/usage.js.map +1 -0
  504. package/dist/voice-recording-owner.d.ts +7 -0
  505. package/package.json +107 -7
  506. package/src/accounts.tsx +116 -14
  507. package/src/approvals.ts +8 -1
  508. package/src/artifacts-spreadsheet.ts +1 -0
  509. package/src/artifacts.ts +44 -0
  510. package/src/assets/README.md +8 -0
  511. package/src/assets/gmail.ico +0 -0
  512. package/src/assets/outlook.ico +0 -0
  513. package/src/capability-catalog-row.tsx +94 -0
  514. package/src/capability-logo-fallback.ts +22 -0
  515. package/src/client.ts +20 -31
  516. package/src/commands/registry.ts +18 -15
  517. package/src/commands/types.ts +2 -0
  518. package/src/components/anthropic-mark.tsx +10 -0
  519. package/src/components/approval-surface.tsx +401 -138
  520. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  521. package/src/components/artifacts/artifact-sandbox.tsx +189 -0
  522. package/src/components/artifacts/artifact-surface.tsx +40 -20
  523. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  524. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  525. package/src/components/artifacts/document-editor.tsx +141 -16
  526. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  527. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  528. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  529. package/src/components/artifacts/editable-document.tsx +37 -36
  530. package/src/components/artifacts/editable-presentation.tsx +36 -18
  531. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  532. package/src/components/artifacts/index.ts +45 -0
  533. package/src/components/artifacts/inline-html-document.ts +24 -0
  534. package/src/components/artifacts/latest-task-runner.ts +49 -0
  535. package/src/components/artifacts/presentation-editor.tsx +323 -67
  536. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  537. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  538. package/src/components/artifacts/site-view.tsx +121 -0
  539. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  540. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  541. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  542. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  543. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  544. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  545. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  546. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  547. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  548. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  549. package/src/components/browser-select-control.tsx +312 -0
  550. package/src/components/browser-viewer.tsx +778 -318
  551. package/src/components/chat-composer.tsx +47 -5
  552. package/src/components/child-session-link.tsx +36 -0
  553. package/src/components/claude-mark.tsx +11 -0
  554. package/src/components/code-editor.tsx +13 -16
  555. package/src/components/composer-transcription-control.tsx +128 -30
  556. package/src/components/composer.tsx +404 -195
  557. package/src/components/computer-viewer.tsx +880 -253
  558. package/src/components/copy-button.tsx +13 -5
  559. package/src/components/desktop-viewer.tsx +1 -1
  560. package/src/components/enrollment-consent.tsx +1 -1
  561. package/src/components/enrollment-device-flow.tsx +1 -1
  562. package/src/components/file-browser.tsx +10 -14
  563. package/src/components/fleet-tile.tsx +9 -18
  564. package/src/components/generated-video-player.tsx +4 -2
  565. package/src/components/grok-mark.tsx +34 -0
  566. package/src/components/human-input-form.tsx +590 -283
  567. package/src/components/human-input-surface.tsx +11 -0
  568. package/src/components/interaction-intervention-banner.tsx +2 -2
  569. package/src/components/linkified-text.tsx +79 -0
  570. package/src/components/machine-card.tsx +35 -78
  571. package/src/components/machine-dock-bar.tsx +1 -1
  572. package/src/components/machine-input-display.ts +197 -3
  573. package/src/components/machines/agent-status-icon.tsx +31 -0
  574. package/src/components/machines/machine-detail.tsx +200 -31
  575. package/src/components/machines/machine-operation-policy.tsx +1 -1
  576. package/src/components/machines/machine-status.ts +241 -0
  577. package/src/components/machines-dashboard.tsx +2 -17
  578. package/src/components/markdown-table-layout.ts +143 -0
  579. package/src/components/markdown.tsx +466 -129
  580. package/src/components/message-timeline.tsx +2567 -728
  581. package/src/components/model-mark.tsx +102 -0
  582. package/src/components/model-picker.tsx +15 -4
  583. package/src/components/model-policy-picker-menu.tsx +371 -0
  584. package/src/components/model-policy-picker.tsx +256 -412
  585. package/src/components/new-conversation.tsx +221 -0
  586. package/src/components/open-geni-chat.tsx +309 -0
  587. package/src/components/open-geni-links.tsx +179 -0
  588. package/src/components/openrouter-mark.tsx +13 -0
  589. package/src/components/opper-mark.tsx +18 -0
  590. package/src/components/pierre-diff.tsx +41 -16
  591. package/src/components/pierre-file.tsx +35 -10
  592. package/src/components/preview-loading.tsx +109 -0
  593. package/src/components/provider-recovery-notice.tsx +49 -0
  594. package/src/components/queue-item-content.ts +14 -0
  595. package/src/components/queue-surface-implementation.tsx +51 -356
  596. package/src/components/queue-surface-state.tsx +3 -1
  597. package/src/components/rehype-secret-refs.ts +98 -0
  598. package/src/components/remark-soft-line-breaks.ts +166 -0
  599. package/src/components/sandbox-files.tsx +91 -15
  600. package/src/components/sandbox-terminal.tsx +84 -13
  601. package/src/components/sandbox-workspace.tsx +147 -51
  602. package/src/components/secret-question-field.tsx +324 -0
  603. package/src/components/secret-ref-chip.tsx +185 -0
  604. package/src/components/session-capability-frame.tsx +197 -0
  605. package/src/components/session-chrome.tsx +842 -251
  606. package/src/components/session-commands-panel.tsx +126 -0
  607. package/src/components/session-commands.tsx +18 -0
  608. package/src/components/session-connection-request.tsx +97 -0
  609. package/src/components/session-conversation.tsx +876 -0
  610. package/src/components/session-list.tsx +257 -0
  611. package/src/components/session-mcp-capability-card.tsx +680 -0
  612. package/src/components/session-proxy-scope.tsx +153 -0
  613. package/src/components/session-status.tsx +26 -17
  614. package/src/components/session-usage-limit-notice.tsx +174 -0
  615. package/src/components/timeline-anchor.tsx +119 -0
  616. package/src/components/timeline-annotation-chrome.tsx +196 -0
  617. package/src/components/timeline-annotation-layout.ts +268 -0
  618. package/src/components/timeline-annotation-markers.tsx +185 -0
  619. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  620. package/src/components/timeline-annotation-selection.tsx +106 -54
  621. package/src/components/timeline-annotation-shared.ts +245 -0
  622. package/src/components/timeline-annotations-dialog.tsx +185 -128
  623. package/src/components/timeline-annotations.tsx +189 -45
  624. package/src/components/timeline-reading-progress.ts +80 -0
  625. package/src/components/timeline-search.tsx +168 -0
  626. package/src/components/timeline-settlement.ts +60 -0
  627. package/src/components/tip-follow.ts +52 -0
  628. package/src/components/tool-action-review.tsx +650 -0
  629. package/src/components/tool-review-history.tsx +88 -0
  630. package/src/components/tooltip.tsx +38 -5
  631. package/src/components/usage-limit-notice.tsx +179 -0
  632. package/src/components/usage-member-list.tsx +792 -0
  633. package/src/components/usage-meter.tsx +382 -0
  634. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  635. package/src/components/user-message-body.tsx +27 -2
  636. package/src/components/workspace-dock.tsx +18 -1
  637. package/src/composer-messages.ts +150 -0
  638. package/src/composer-voice-events.ts +12 -0
  639. package/src/composer.ts +6 -1
  640. package/src/connect-account-identity.tsx +34 -0
  641. package/src/connect-accounts.tsx +233 -0
  642. package/src/connect-chooser.tsx +336 -0
  643. package/src/connect-panel.tsx +99 -0
  644. package/src/connect-setup.tsx +355 -0
  645. package/src/connect.ts +60 -0
  646. package/src/connection-assets.d.ts +4 -0
  647. package/src/connection-catalog.tsx +162 -0
  648. package/src/connection-discovery.tsx +238 -0
  649. package/src/connection-installed.tsx +51 -0
  650. package/src/connection-logo.tsx +37 -0
  651. package/src/connection-service-logo.tsx +55 -0
  652. package/src/connection-service-presentation.ts +46 -0
  653. package/src/connection-skeleton.tsx +16 -0
  654. package/src/connection-type-picker.tsx +36 -0
  655. package/src/conversation-timeline.ts +92 -0
  656. package/src/desktop.ts +24 -0
  657. package/src/device-authorization.tsx +98 -0
  658. package/src/diffs.ts +16 -0
  659. package/src/discovery-cache.ts +42 -0
  660. package/src/editor.ts +13 -0
  661. package/src/hooks/internal.ts +3 -2
  662. package/src/hooks/latest-question.ts +164 -0
  663. package/src/hooks/shared-machines-list.ts +34 -1
  664. package/src/hooks/shared-query.ts +721 -0
  665. package/src/hooks/use-attached-browsers.ts +1 -1
  666. package/src/hooks/use-auth-runs.ts +0 -27
  667. package/src/hooks/use-available-models.ts +21 -15
  668. package/src/hooks/use-browser-frame-stream.ts +19 -2
  669. package/src/hooks/use-browser-session.ts +680 -205
  670. package/src/hooks/use-browser-sessions.ts +32 -1
  671. package/src/hooks/use-client-config-flags.ts +118 -0
  672. package/src/hooks/use-codex-accounts.ts +247 -47
  673. package/src/hooks/use-composer.ts +276 -47
  674. package/src/hooks/use-computer-frame-stream.ts +25 -7
  675. package/src/hooks/use-computer-input-posture.ts +94 -0
  676. package/src/hooks/use-computer-session.ts +409 -95
  677. package/src/hooks/use-connect.ts +23 -0
  678. package/src/hooks/use-desktop-stream.ts +19 -28
  679. package/src/hooks/use-file-attachments.ts +80 -4
  680. package/src/hooks/use-goal.ts +107 -13
  681. package/src/hooks/use-last-started-turn-policy.ts +46 -14
  682. package/src/hooks/use-machines.ts +4 -0
  683. package/src/hooks/use-new-conversation.ts +374 -0
  684. package/src/hooks/use-new-session-draft.ts +813 -0
  685. package/src/hooks/use-realtime-voice-models.ts +46 -0
  686. package/src/hooks/use-sandbox-files.ts +68 -20
  687. package/src/hooks/use-session-background-commands.ts +22 -11
  688. package/src/hooks/use-session-capabilities.ts +3 -2
  689. package/src/hooks/use-session-conversation.ts +150 -0
  690. package/src/hooks/use-session-events.ts +703 -382
  691. package/src/hooks/use-session-lineage.ts +20 -16
  692. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  693. package/src/hooks/use-session-model-account.ts +174 -0
  694. package/src/hooks/use-session.ts +53 -21
  695. package/src/hooks/use-slash-commands.ts +6 -11
  696. package/src/hooks/use-supergrok-accounts.ts +22 -8
  697. package/src/hooks/use-terminal-stream.ts +153 -27
  698. package/src/hooks/use-transcription.ts +6 -0
  699. package/src/hooks/use-turn-queue.ts +2 -1
  700. package/src/hooks/use-usage.ts +100 -0
  701. package/src/hooks/use-vaults.ts +153 -0
  702. package/src/hooks/use-video-artifact-playback.ts +1 -1
  703. package/src/hooks/use-voice-input.ts +127 -19
  704. package/src/hooks/use-workspace-capture.ts +3 -2
  705. package/src/hooks/use-workspace-edit.ts +23 -5
  706. package/src/hooks/use-workspace-sessions.ts +97 -32
  707. package/src/human-input-model.ts +359 -0
  708. package/src/identity-link-accounts.tsx +148 -0
  709. package/src/identity-link-consent.tsx +192 -0
  710. package/src/index.ts +262 -16
  711. package/src/interaction.ts +1 -0
  712. package/src/lib/clipboard.ts +29 -0
  713. package/src/lib/error-message.ts +37 -0
  714. package/src/lib/format.ts +213 -16
  715. package/src/lib/host-theme.ts +529 -0
  716. package/src/lib/interaction-errors.ts +15 -0
  717. package/src/lib/menu-styles.ts +44 -0
  718. package/src/lib/notify-observer.ts +15 -0
  719. package/src/lib/pierre-diffs-loader.ts +53 -0
  720. package/src/lib/provider-recovery.ts +243 -0
  721. package/src/lib/scrollbars.ts +30 -0
  722. package/src/lib/terminal-input-readiness.ts +51 -0
  723. package/src/lib/transient-retry.ts +99 -0
  724. package/src/lib/workbench-peers.ts +62 -0
  725. package/src/lib/xterm-theme.ts +23 -21
  726. package/src/mcp-connection-status.ts +35 -0
  727. package/src/model-mark-paths.ts +53 -0
  728. package/src/model-picker-model.ts +330 -0
  729. package/src/model-policy.ts +299 -74
  730. package/src/native-previews.ts +100 -0
  731. package/src/new-session-draft.ts +22 -0
  732. package/src/notification-text.ts +81 -0
  733. package/src/older-history.ts +22 -4
  734. package/src/organization-model.ts +118 -0
  735. package/src/plugin-details.tsx +185 -0
  736. package/src/plugin-discovery.tsx +196 -0
  737. package/src/preview-loading-paint.ts +68 -0
  738. package/src/provider.tsx +74 -15
  739. package/src/queue-presentation-model.ts +464 -0
  740. package/src/realtime/dropdown-menu.tsx +19 -12
  741. package/src/realtime/embedded-new-voice.tsx +1 -0
  742. package/src/realtime/embedded-voice.tsx +3 -0
  743. package/src/realtime/realtime-control.tsx +138 -501
  744. package/src/realtime/session-realtime.ts +566 -0
  745. package/src/sandbox-label-model.ts +53 -0
  746. package/src/scrollbars.ts +3 -0
  747. package/src/secret-reference-label.ts +43 -0
  748. package/src/secrets-ui.tsx +59 -0
  749. package/src/session-agents-model.ts +33 -0
  750. package/src/session-attention-model.ts +62 -0
  751. package/src/session-auth-recommendation.ts +48 -0
  752. package/src/session-capability-policy.ts +196 -0
  753. package/src/session-context.ts +3 -4
  754. package/src/session-feedback-model.ts +95 -0
  755. package/src/session-list-model.ts +434 -0
  756. package/src/session-realtime.ts +18 -0
  757. package/src/session-status-model.ts +99 -0
  758. package/src/session-ui.ts +98 -1
  759. package/src/session.ts +17 -1
  760. package/src/site-snapshot.ts +74 -0
  761. package/src/sites-ui.tsx +348 -0
  762. package/src/sites.ts +3 -0
  763. package/src/skill-discovery.tsx +208 -0
  764. package/src/terminal.ts +26 -0
  765. package/src/testing/session-scenarios.ts +404 -0
  766. package/src/timeline/activity-rail.tsx +242 -101
  767. package/src/timeline/agent-identity.tsx +84 -0
  768. package/src/timeline/agent-row.tsx +231 -0
  769. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  770. package/src/timeline/compaction-copy.ts +115 -0
  771. package/src/timeline/entrance.tsx +28 -3
  772. package/src/timeline/fleet-decision-projection.ts +2 -1
  773. package/src/timeline/fleet-decision-row.tsx +1 -0
  774. package/src/timeline/focus-sequence.ts +44 -0
  775. package/src/timeline/genie-copy.ts +19 -0
  776. package/src/timeline/genie-loading.tsx +143 -0
  777. package/src/timeline/index.ts +30 -2
  778. package/src/timeline/knowledge-receipt.tsx +100 -0
  779. package/src/timeline/message-sender.tsx +71 -0
  780. package/src/timeline/notice-presentation.ts +48 -0
  781. package/src/timeline/parsers.ts +42 -2
  782. package/src/timeline/patch-apply-command.tsx +135 -0
  783. package/src/timeline/platform-activity-presentation.ts +166 -0
  784. package/src/timeline/platform-activity-row.tsx +15 -90
  785. package/src/timeline/presented-image.ts +63 -0
  786. package/src/timeline/projection.ts +1746 -76
  787. package/src/timeline/provider-logo.tsx +53 -0
  788. package/src/timeline/question-nav-model.ts +28 -0
  789. package/src/timeline/registry.ts +26 -4
  790. package/src/timeline/retained-image.ts +97 -0
  791. package/src/timeline/retained-loaders.ts +91 -0
  792. package/src/timeline/rolling-activity.tsx +80 -0
  793. package/src/timeline/screenshot-lightbox.tsx +228 -5
  794. package/src/timeline/session-usage-limit-row.tsx +42 -0
  795. package/src/timeline/shared.tsx +42 -15
  796. package/src/timeline/startup-dispatch-details.tsx +36 -0
  797. package/src/timeline/startup-preference.ts +33 -0
  798. package/src/timeline/startup-timings.tsx +145 -0
  799. package/src/timeline/tool-display-name.ts +19 -7
  800. package/src/timeline/tool-presentation.ts +1316 -0
  801. package/src/timeline/tool-renderers.tsx +835 -1138
  802. package/src/timeline/turn-summary-model.ts +343 -0
  803. package/src/timeline/turn-summary.tsx +272 -365
  804. package/src/timeline/types.ts +189 -6
  805. package/src/timeline/work-presentation.ts +189 -0
  806. package/src/timeline-model.ts +143 -0
  807. package/src/usage/allowance-copy.ts +64 -0
  808. package/src/usage/session-usage-limit.ts +266 -0
  809. package/src/usage/summary.ts +93 -0
  810. package/src/usage.ts +70 -0
  811. package/src/voice-recording-owner.ts +22 -0
  812. package/styles/compiled.css +2319 -748
  813. package/styles/connect.css +290 -0
  814. package/styles/connect.d.ts +1 -0
  815. package/styles/effective-tokens.css +1 -0
  816. package/styles/index.css +309 -9
  817. package/styles/responsive.css +99 -7
  818. package/styles/session-capability.css +44 -0
  819. package/styles/tokens.css +134 -66
  820. package/dist/browser-viewer-AEFHUYZK.js +0 -14
  821. package/dist/chunk-4MDLEHXL.js.map +0 -1
  822. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  823. package/dist/chunk-D3UIAJKY.js.map +0 -1
  824. package/dist/chunk-ELIYWBZR.js.map +0 -1
  825. package/dist/chunk-H5YGYNXS.js.map +0 -1
  826. package/dist/chunk-HQVCKCLG.js +0 -9458
  827. package/dist/chunk-HQVCKCLG.js.map +0 -1
  828. package/dist/chunk-HUIKIDM5.js.map +0 -1
  829. package/dist/chunk-ICA6R6TW.js.map +0 -1
  830. package/dist/chunk-JVYQRRC4.js.map +0 -1
  831. package/dist/chunk-KCGXPP5V.js.map +0 -1
  832. package/dist/chunk-KZ73RL76.js.map +0 -1
  833. package/dist/chunk-LAKLF4PA.js +0 -141
  834. package/dist/chunk-LAKLF4PA.js.map +0 -1
  835. package/dist/chunk-MZ2G2XBA.js.map +0 -1
  836. package/dist/chunk-NEXLLTP4.js.map +0 -1
  837. package/dist/chunk-OAM4WAAM.js.map +0 -1
  838. package/dist/chunk-PEI6RANI.js.map +0 -1
  839. package/dist/chunk-RGALCTWO.js.map +0 -1
  840. package/dist/chunk-W6NFJXSA.js +0 -454
  841. package/dist/chunk-W6NFJXSA.js.map +0 -1
  842. package/dist/chunk-WSK7G5LE.js +0 -170
  843. package/dist/chunk-WSK7G5LE.js.map +0 -1
  844. package/dist/chunk-X4A66EWZ.js +0 -223
  845. package/dist/chunk-X4A66EWZ.js.map +0 -1
  846. package/dist/chunk-XXWH2JLC.js.map +0 -1
  847. package/dist/chunk-YFKJ7VZH.js +0 -268
  848. package/dist/chunk-YFKJ7VZH.js.map +0 -1
  849. package/dist/chunk-YJFGAFBD.js.map +0 -1
  850. package/dist/computer-viewer-FWEZISW4.js +0 -16
  851. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  852. package/dist/hooks/use-environments.d.ts +0 -41
  853. package/dist/hooks/use-packs.d.ts +0 -32
  854. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  855. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  856. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  857. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  858. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  859. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  860. package/src/hooks/use-environments.ts +0 -182
  861. package/src/hooks/use-packs.ts +0 -157
  862. /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  863. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
@@ -71,17 +71,19 @@ export function useBrowserSessions(
71
71
  id: 0,
72
72
  controller: null,
73
73
  });
74
+ const loadQueueRef = useRef<{ pending: boolean; promise: Promise<void> } | null>(null);
74
75
  const mountedRef = useRef(true);
75
76
 
76
77
  const visibleState = state.workspaceId === workspaceId ? state : emptyState(workspaceId, enabled);
77
78
 
78
79
  const cancelLoad = useCallback(() => {
80
+ loadQueueRef.current = null;
79
81
  const id = requestRef.current.id + 1;
80
82
  requestRef.current.controller?.abort();
81
83
  requestRef.current = { id, controller: null };
82
84
  }, []);
83
85
 
84
- const load = useCallback(
86
+ const loadOnce = useCallback(
85
87
  async (foreground: boolean): Promise<void> => {
86
88
  if (!enabled) return;
87
89
  const id = requestRef.current.id + 1;
@@ -128,6 +130,35 @@ export function useBrowserSessions(
128
130
  [client, enabled, workspaceId],
129
131
  );
130
132
 
133
+ const load = useCallback(
134
+ (foreground: boolean): Promise<void> => {
135
+ const current = loadQueueRef.current;
136
+ if (current) {
137
+ current.pending = true;
138
+ return current.promise;
139
+ }
140
+ const queue = { pending: false, promise: Promise.resolve() };
141
+ loadQueueRef.current = queue;
142
+ queue.promise = Promise.resolve()
143
+ .then(async () => {
144
+ // A slow read must be allowed to finish. Invalidations and polling
145
+ // coalesce into one trailing read instead of repeatedly aborting it.
146
+ while (loadQueueRef.current === queue) {
147
+ queue.pending = false;
148
+ await loadOnce(foreground);
149
+ foreground = false;
150
+ if (!queue.pending) break;
151
+ }
152
+ if (loadQueueRef.current === queue) loadQueueRef.current = null;
153
+ })
154
+ .finally(() => {
155
+ if (loadQueueRef.current === queue) loadQueueRef.current = null;
156
+ });
157
+ return queue.promise;
158
+ },
159
+ [loadOnce],
160
+ );
161
+
131
162
  const refresh = useCallback(async () => await load(false), [load]);
132
163
 
133
164
  useEffect(() => {
@@ -0,0 +1,118 @@
1
+ import type { ClientVoiceInputConfig, ReasoningEffort } from "@opengeni/sdk";
2
+ import { useEffect, useState } from "react";
3
+
4
+ /** The client-config fields the stock conversation and chat read. */
5
+ export type ClientConfigFlagsSource = {
6
+ getClientConfig: () => Promise<{
7
+ fileUploads?: { enabled?: boolean };
8
+ modelSelection?: boolean | undefined;
9
+ sandboxFiles?: boolean | undefined;
10
+ defaultReasoningEffort?: ReasoningEffort | undefined;
11
+ artifacts?: unknown;
12
+ sessionCreation?: boolean | undefined;
13
+ archive?: boolean | undefined;
14
+ voiceInput?: ClientVoiceInputConfig | undefined;
15
+ realtimeVoice?: boolean | undefined;
16
+ }>;
17
+ };
18
+
19
+ export type ClientConfigFlags = {
20
+ /** Whether the config has loaded. Proxy capability flags stay `true` until it says otherwise. */
21
+ loaded: boolean;
22
+ uploads: boolean;
23
+ modelSelection: boolean;
24
+ sandboxFiles: boolean;
25
+ defaultReasoningEffort: ReasoningEffort | null;
26
+ /**
27
+ * Inline Site previews and the artifact viewer. `false` only when a session
28
+ * proxy says it does not serve them; native deployments omit the flag.
29
+ */
30
+ artifacts: boolean;
31
+ /** Browser chat creation. `false` only when a session proxy has no `createSession` hook. */
32
+ sessionCreation: boolean;
33
+ /** Chat archive/restore. `false` only when a session proxy disables it. */
34
+ archive: boolean;
35
+ /** Native voice input when the deployment can transcribe, else null. */
36
+ voiceInput: ClientVoiceInputConfig | null;
37
+ /**
38
+ * Live voice. `false` until the config loads and when a session proxy turns
39
+ * it off; availability otherwise comes from the realtime model catalog.
40
+ */
41
+ realtimeVoice: boolean;
42
+ /**
43
+ * The host explicitly offers live voice to end users (a session proxy with
44
+ * `realtimeVoice: true`). Embedded conversations show the voice button only
45
+ * then or when their `realtimeVoice` prop is `true`.
46
+ */
47
+ realtimeVoiceOffered: boolean;
48
+ };
49
+
50
+ const INITIAL_FLAGS: ClientConfigFlags = {
51
+ loaded: false,
52
+ uploads: false,
53
+ modelSelection: false,
54
+ sandboxFiles: false,
55
+ defaultReasoningEffort: null,
56
+ artifacts: true,
57
+ sessionCreation: true,
58
+ archive: true,
59
+ voiceInput: null,
60
+ realtimeVoice: false,
61
+ realtimeVoiceOffered: false,
62
+ };
63
+
64
+ type ClientConfigFlagsInput = Awaited<ReturnType<ClientConfigFlagsSource["getClientConfig"]>>;
65
+
66
+ // One read per client: the chat, its list, the new-chat composer and the
67
+ // conversation all ask, and behind a session proxy each read is a round trip.
68
+ const configReads = new WeakMap<object, Promise<ClientConfigFlagsInput>>();
69
+
70
+ function readClientConfig(client: ClientConfigFlagsSource): Promise<ClientConfigFlagsInput> {
71
+ let read = configReads.get(client);
72
+ if (!read) {
73
+ read = client.getClientConfig();
74
+ configReads.set(client, read);
75
+ // A failed read is retried by the next mount rather than cached.
76
+ read.catch(() => {
77
+ if (configReads.get(client) === read) configReads.delete(client);
78
+ });
79
+ }
80
+ return read;
81
+ }
82
+
83
+ /** Deployment and session-proxy capabilities from the client config. */
84
+ export function useClientConfigFlags(
85
+ client: Partial<ClientConfigFlagsSource> | ClientConfigFlagsSource,
86
+ ): ClientConfigFlags {
87
+ const [flags, setFlags] = useState<ClientConfigFlags>(INITIAL_FLAGS);
88
+ useEffect(() => {
89
+ // Custom clients without a config read keep the defaults.
90
+ if (typeof client.getClientConfig !== "function") return;
91
+ let live = true;
92
+ readClientConfig(client as ClientConfigFlagsSource).then(
93
+ (config) => {
94
+ if (live) {
95
+ setFlags({
96
+ loaded: true,
97
+ uploads: config.fileUploads?.enabled === true,
98
+ // Only an explicit offer shows end users the picker.
99
+ modelSelection: config.modelSelection === true,
100
+ sandboxFiles: config.sandboxFiles !== false,
101
+ defaultReasoningEffort: config.defaultReasoningEffort ?? null,
102
+ artifacts: config.artifacts !== false,
103
+ sessionCreation: config.sessionCreation !== false,
104
+ archive: config.archive !== false,
105
+ voiceInput: config.voiceInput?.available === true ? config.voiceInput : null,
106
+ realtimeVoice: config.realtimeVoice !== false,
107
+ realtimeVoiceOffered: config.realtimeVoice === true,
108
+ });
109
+ }
110
+ },
111
+ () => undefined,
112
+ );
113
+ return () => {
114
+ live = false;
115
+ };
116
+ }, [client]);
117
+ return flags;
118
+ }
@@ -3,41 +3,158 @@ import type {
3
3
  CodexAccount,
4
4
  CodexAccountsResponse,
5
5
  CodexRotationSettings,
6
+ CodexUsageMap,
7
+ SessionCodexAccountsResponse,
6
8
  SessionEvent,
7
9
  } from "@opengeni/sdk";
8
10
  import { useOpenGeni, type ClientOverride } from "../provider";
9
11
  import {
10
12
  useMutationRunner,
11
- usePolledValue,
12
13
  useSessionEventTrigger,
13
14
  type SessionEventFeedOptions,
14
15
  } from "./internal";
16
+ import {
17
+ invalidateSharedQueries,
18
+ peekSharedQuery,
19
+ sharedQueryWriter,
20
+ useSharedQuery,
21
+ useSharedQueryValue,
22
+ type SharedQueryKey,
23
+ type SharedQueryWriter,
24
+ } from "./shared-query";
25
+
26
+ /**
27
+ * Shared-cache keys for Codex reads. Every surface that reads the same thing
28
+ * through the same client (the session switcher, Settings > Models) shares one
29
+ * entry, so a revisit renders the last rows at once and re-reads quietly.
30
+ * Internal: not exported from the package root.
31
+ */
32
+ export const codexAccountsQueryKey = (workspaceId: string, sessionId?: string | null) =>
33
+ (sessionId
34
+ ? ["codex-accounts", workspaceId, "session", sessionId]
35
+ : ["codex-accounts", workspaceId]) as SharedQueryKey;
36
+ /** The last LIVE provider usage per account, written by every live usage read. */
37
+ export const codexLiveUsageQueryKey = (workspaceId: string) =>
38
+ ["codex-live-usage", workspaceId] as SharedQueryKey;
39
+
40
+ /**
41
+ * The last LIVE provider reading per account and when each one was taken. Only
42
+ * live provider reads write it, never the server's cached limit columns.
43
+ */
44
+ export type CodexLiveUsageSnapshot = {
45
+ usage: CodexUsageMap;
46
+ /** Epoch milliseconds of each account's reading. */
47
+ readAt: Record<string, number>;
48
+ };
49
+
50
+ /**
51
+ * Record live readings through a writer created before the read started.
52
+ * `replace` is a read of every account (the batch); `merge` updates only the
53
+ * accounts in `readings` and leaves the others' readings and times alone.
54
+ */
55
+ export function recordCodexLiveUsage(
56
+ write: SharedQueryWriter,
57
+ scope: object,
58
+ workspaceId: string,
59
+ readings: CodexUsageMap,
60
+ mode: "replace" | "merge",
61
+ ): boolean {
62
+ const key = codexLiveUsageQueryKey(workspaceId);
63
+ const previous =
64
+ mode === "merge" ? peekSharedQuery<CodexLiveUsageSnapshot>(scope, key)?.data : null;
65
+ const now = Date.now();
66
+ return write<CodexLiveUsageSnapshot>(key, {
67
+ usage: { ...previous?.usage, ...readings },
68
+ readAt: {
69
+ ...previous?.readAt,
70
+ ...Object.fromEntries(Object.keys(readings).map((id) => [id, now])),
71
+ },
72
+ });
73
+ }
74
+
75
+ /** When the oldest reading in the snapshot was taken (epoch ms), or null. */
76
+ function oldestReading(snapshot: CodexLiveUsageSnapshot | null | undefined): number | null {
77
+ const times = Object.values(snapshot?.readAt ?? {});
78
+ return times.length > 0 ? Math.min(...times) : null;
79
+ }
80
+
81
+ const liveUsageReads = new WeakMap<object, Map<string, Promise<CodexUsageMap>>>();
82
+
83
+ /** One live usage refresh per client + workspace at a time; joiners share it. */
84
+ function sharedLiveUsageRead(
85
+ scope: object,
86
+ workspaceId: string,
87
+ read: () => Promise<{ usage: CodexUsageMap }>,
88
+ ): Promise<CodexUsageMap> {
89
+ let reads = liveUsageReads.get(scope);
90
+ if (!reads) {
91
+ reads = new Map();
92
+ liveUsageReads.set(scope, reads);
93
+ }
94
+ const existing = reads.get(workspaceId);
95
+ if (existing) return existing;
96
+ // Bound to the identity epoch the read starts in: a clear meanwhile drops it.
97
+ const write = sharedQueryWriter(scope);
98
+ const request = read().then((fresh) => {
99
+ recordCodexLiveUsage(write, scope, workspaceId, fresh.usage, "replace");
100
+ return fresh.usage;
101
+ });
102
+ const settle = () => {
103
+ if (reads!.get(workspaceId) === request) reads!.delete(workspaceId);
104
+ };
105
+ request.then(settle, settle);
106
+ reads.set(workspaceId, request);
107
+ return request;
108
+ }
15
109
 
16
110
  /** Events that change which Codex account a session runs on (or just ran). */
17
111
  export function isCodexAccountEvent(event: Pick<SessionEvent, "type">): boolean {
18
- return event.type === "codex.account.switched";
112
+ return [
113
+ "codex.credential.selected",
114
+ "codex.account.switched",
115
+ "codex.account.selection.changed",
116
+ "model_account.selection.changed",
117
+ "codex.capacity.waiting",
118
+ "codex.capacity.resumed",
119
+ "codex.capacity.superseded",
120
+ "turn.completed",
121
+ "turn.failed",
122
+ "turn.cancelled",
123
+ "turn.requires_action",
124
+ "session.status.changed",
125
+ ].includes(event.type);
19
126
  }
20
127
 
21
128
  /**
22
129
  * The structural slice of the SDK client the Codex-accounts surface needs. Method
23
130
  * NAMES + SIGNATURES match `OpenGeniClient` so the real client satisfies it
24
131
  * directly; declared structurally (not a hard Pick) so a test/Geni client can
25
- * stand in. `getSession` reads the session's pin/last; `pinSessionCodexAccount`
132
+ * stand in. `listSessionCodexAccounts` reads the accepted selection and choices
133
+ * atomically; `pinSessionCodexAccount`
26
134
  * is the optional mutation (absent ⇒ the indicator hides the switch affordance).
27
135
  */
28
136
  export type CodexAccountsClientLike = {
29
137
  listCodexAccounts: (workspaceId: string) => Promise<CodexAccountsResponse>;
138
+ /** Required for session-scoped use; never fall back to another pool. */
139
+ listSessionCodexAccounts?: (
140
+ workspaceId: string,
141
+ sessionId: string,
142
+ ) => Promise<SessionCodexAccountsResponse>;
30
143
  getSession?: (
31
144
  workspaceId: string,
32
145
  sessionId: string,
33
- ) => Promise<{ codexPinnedCredentialId?: string | null; codexLastCredentialId?: string | null }>;
146
+ ) => Promise<{
147
+ codexPinnedCredentialId?: string | null;
148
+ codexLastCredentialId?: string | null;
149
+ codexCurrentSelection?: { credentialId: string | null; waiting: boolean } | null;
150
+ }>;
34
151
  pinSessionCodexAccount?: (
35
152
  workspaceId: string,
36
153
  sessionId: string,
37
154
  target: string,
38
- ) => Promise<{ pinned: string }>;
155
+ ) => Promise<{ pinned: string; appliedTo?: "waiting_turn" | "next_turn" }>;
39
156
  /** Optional (absent ⇒ the card hides live refresh): batched live /wham/usage refresh. */
40
- refreshCodexUsage?: (workspaceId: string) => Promise<{ usage: Record<string, unknown> }>;
157
+ refreshCodexUsage?: (workspaceId: string) => Promise<{ usage: CodexUsageMap }>;
41
158
  };
42
159
 
43
160
  export type UseCodexAccountsOptions = ClientOverride &
@@ -51,23 +168,33 @@ export type UseCodexAccountsOptions = ClientOverride &
51
168
 
52
169
  export type UseCodexAccountsResult = {
53
170
  accounts: CodexAccount[];
54
- /** The workspace ACTIVE account (used when a session is unpinned). */
171
+ /** The ACTIVE account for the retry pool, or current workspace pool for new work. */
55
172
  activeAccountId: string | null;
56
173
  /** The session's PINNED account (null ⇒ following workspace active). */
57
174
  pinnedAccountId: string | null;
58
- /** The account the next turn will run on: pin > workspace active. */
175
+ /** Current preference only; automatic allocation can choose another account. */
59
176
  effectiveAccountId: string | null;
177
+ currentSelection: { credentialId: string | null; waiting: boolean } | null;
178
+ /** The accepted account can differ from the choices for the next turn. */
179
+ currentAccount: CodexAccount | null;
180
+ switchAppliedTo: "waiting_turn" | "next_turn" | null;
60
181
  /** The account the session's last turn ACTUALLY ran on (the "Running on:" source). */
61
182
  lastAccountId: string | null;
62
183
  settings: CodexRotationSettings;
63
184
  loading: boolean;
185
+ error: Error | null;
64
186
  refresh: () => Promise<void>;
65
187
  /**
66
188
  * Trigger a LIVE batched /wham/usage refresh across all accounts, then re-read
67
189
  * the cached metadata so the new windows land on `accounts`. Modeled on `pin`.
68
190
  * No-op (resolves false) when the client can't refresh usage.
191
+ * With `maxAgeMs`, live readings younger than that are reused instead.
69
192
  */
70
- refreshUsage: () => Promise<boolean>;
193
+ refreshUsage: (options?: { maxAgeMs?: number | undefined }) => Promise<boolean>;
194
+ /** Live provider readings override stale cached labels after refreshUsage. */
195
+ liveUsage: CodexUsageMap;
196
+ /** When the live readings in `liveUsage` were taken (epoch ms), or null. */
197
+ liveUsageUpdatedAt: number | null;
71
198
  /** True while a live usage refresh is in flight (drives the bar skeleton). */
72
199
  refreshingUsage: boolean;
73
200
  /** Pin (or unpin via "auto") the session's account; returns true on success. */
@@ -78,6 +205,8 @@ export type UseCodexAccountsResult = {
78
205
  mutationError: Error | null;
79
206
  };
80
207
 
208
+ const EMPTY_USAGE: CodexUsageMap = {};
209
+
81
210
  const EMPTY_SETTINGS: CodexRotationSettings = {
82
211
  rotationEnabled: false,
83
212
  rotationStrategy: "sharded",
@@ -85,6 +214,8 @@ const EMPTY_SETTINGS: CodexRotationSettings = {
85
214
  };
86
215
 
87
216
  type CodexAccountsState = {
217
+ currentAccount: CodexAccount | null;
218
+ currentSelection: { credentialId: string | null; waiting: boolean } | null;
88
219
  accounts: CodexAccount[];
89
220
  activeAccountId: string | null;
90
221
  settings: CodexRotationSettings;
@@ -93,6 +224,8 @@ type CodexAccountsState = {
93
224
  };
94
225
 
95
226
  const EMPTY_STATE: CodexAccountsState = {
227
+ currentAccount: null,
228
+ currentSelection: null,
96
229
  accounts: [],
97
230
  activeAccountId: null,
98
231
  settings: EMPTY_SETTINGS,
@@ -101,10 +234,11 @@ const EMPTY_STATE: CodexAccountsState = {
101
234
  };
102
235
 
103
236
  /**
104
- * The workspace's Codex accounts + the per-workspace active pointer + (when
105
- * session-scoped) the session pin and last-ran-on account. Composed like
106
- * `useMachines`: slow polling (the realtime work is done by the
107
- * `codex.account.switched` event trigger) + a `pin` mutation.
237
+ * The workspace's Codex accounts, or session-authorized retry/next-turn choices
238
+ * and accepted current account. Reads go through the client-scoped shared cache
239
+ * (`useSharedQuery`): a remount renders the retained rows at once and re-reads
240
+ * in the background; slow polling plus the `codex.account.switched` event
241
+ * trigger keep them current, and `pin` invalidates the workspace's entries.
108
242
  * Dual-consumer safe via the structural `CodexAccountsClientLike` surface.
109
243
  */
110
244
  export function useCodexAccounts(options: UseCodexAccountsOptions = {}): UseCodexAccountsResult {
@@ -113,33 +247,52 @@ export function useCodexAccounts(options: UseCodexAccountsOptions = {}): UseCode
113
247
  const sessionId = options.sessionId;
114
248
  const sharedEvents = options.events;
115
249
 
116
- const load = useCallback(async (): Promise<CodexAccountsState> => {
117
- const accountsP = codexClient.listCodexAccounts(workspaceId);
118
- const sessionP =
119
- sessionId && codexClient.getSession
120
- ? codexClient.getSession(workspaceId, sessionId).catch(() => null)
121
- : Promise.resolve(null);
122
- const [acc, session] = await Promise.all([accountsP, sessionP]);
123
- return {
124
- accounts: acc.accounts,
125
- activeAccountId: acc.activeAccountId,
126
- settings: acc.settings,
127
- pinnedAccountId: session?.codexPinnedCredentialId ?? null,
128
- lastAccountId: session?.codexLastCredentialId ?? null,
129
- };
250
+ const load = useCallback(async (): Promise<
251
+ CodexAccountsResponse | SessionCodexAccountsResponse
252
+ > => {
253
+ if (sessionId) {
254
+ if (!codexClient.listSessionCodexAccounts)
255
+ throw new Error("Session Codex account projection is unavailable");
256
+ return await codexClient.listSessionCodexAccounts(workspaceId, sessionId);
257
+ }
258
+ return await codexClient.listCodexAccounts(workspaceId);
130
259
  }, [codexClient, workspaceId, sessionId]);
131
260
 
132
261
  const {
133
- data: loadedData,
262
+ data: response,
134
263
  loading,
264
+ error,
135
265
  refresh,
136
- } = usePolledValue(load, {
266
+ } = useSharedQuery(codexClient, codexAccountsQueryKey(workspaceId, sessionId), load, {
137
267
  pollIntervalMs: options.pollIntervalMs,
138
268
  enabled: options.enabled,
139
269
  });
270
+ // Never read on mount: only an explicit live refresh writes this entry.
271
+ const liveUsageQuery = useSharedQueryValue<CodexLiveUsageSnapshot>(
272
+ codexClient,
273
+ codexLiveUsageQueryKey(workspaceId),
274
+ );
275
+ const loadedData: CodexAccountsState | null = !response
276
+ ? null
277
+ : sessionId
278
+ ? (response as SessionCodexAccountsResponse)
279
+ : {
280
+ currentSelection: null,
281
+ currentAccount: null,
282
+ accounts: response.accounts,
283
+ activeAccountId: response.activeAccountId,
284
+ settings: response.settings,
285
+ pinnedAccountId: null,
286
+ lastAccountId: null,
287
+ };
140
288
  const { run: runMutation, mutating: pinning, mutationError } = useMutationRunner();
141
289
  const { run: runUsageMutation, mutating: refreshingUsage } = useMutationRunner();
290
+ const liveUsage = liveUsageQuery.data?.usage ?? EMPTY_USAGE;
142
291
  const [pinningTarget, setPinningTarget] = useState<string | null>(null);
292
+ const [switchReceipt, setSwitchReceipt] = useState<{
293
+ sessionId: string;
294
+ appliedTo: "waiting_turn" | "next_turn";
295
+ } | null>(null);
143
296
 
144
297
  // Refresh only after the durable post-selection event. `turn.started` is
145
298
  // emitted before account selection settles and races this authoritative read.
@@ -161,45 +314,92 @@ export function useCodexAccounts(options: UseCodexAccountsOptions = {}): UseCode
161
314
  return false;
162
315
  }
163
316
  setPinningTarget(target);
317
+ setSwitchReceipt(null);
318
+ const invalidated: { current: Promise<void> | null } = { current: null };
164
319
  const result = await runMutation(async () => {
165
- await codexClient.pinSessionCodexAccount!(workspaceId, sessionId, target);
320
+ const receipt = await codexClient.pinSessionCodexAccount!(workspaceId, sessionId, target);
321
+ // Every retained Codex read for this workspace may now be wrong. This
322
+ // runs even if the component unmounted meanwhile (the runner then
323
+ // resolves null), so no other surface keeps showing the old choice.
324
+ invalidated.current = invalidateSharedQueries(
325
+ codexClient,
326
+ codexAccountsQueryKey(workspaceId),
327
+ );
328
+ setSwitchReceipt({ sessionId, appliedTo: receipt.appliedTo ?? "next_turn" });
166
329
  return true;
167
330
  });
168
331
  setPinningTarget(null);
169
- if (result) await refresh();
332
+ if (result) await invalidated.current;
170
333
  return result === true;
171
334
  },
172
- [codexClient, workspaceId, sessionId, runMutation, refresh],
335
+ [codexClient, workspaceId, sessionId, runMutation],
173
336
  );
174
337
 
175
338
  // Live usage refresh: hit the batched provider read, then re-read cached
176
339
  // metadata so the fresh windows land on `accounts`. The provider read writes the
177
- // cache columns server-side; state.refresh() pulls them back.
178
- const refreshUsage = useCallback(async (): Promise<boolean> => {
179
- if (!codexClient.refreshCodexUsage) {
180
- return false;
181
- }
182
- const result = await runUsageMutation(async () => {
183
- await codexClient.refreshCodexUsage!(workspaceId);
184
- return true;
185
- });
186
- if (result) await refresh();
187
- return result === true;
188
- }, [codexClient, workspaceId, runUsageMutation, refresh]);
189
-
190
- const data = loadedData ?? EMPTY_STATE;
340
+ // cache columns server-side; refresh() pulls them back. Concurrent callers share
341
+ // one provider read, and `maxAgeMs` reuses readings that are recent enough for
342
+ // every listed account (a single-account refresh elsewhere never counts for all).
343
+ const listedAccountIds = response?.accounts.map((account) => account.id).join("\n") ?? null;
344
+ const refreshUsage = useCallback(
345
+ async (refreshOptions: { maxAgeMs?: number | undefined } = {}): Promise<boolean> => {
346
+ if (!codexClient.refreshCodexUsage) {
347
+ return false;
348
+ }
349
+ const maxAgeMs = refreshOptions.maxAgeMs;
350
+ const retained = peekSharedQuery<CodexLiveUsageSnapshot>(
351
+ codexClient,
352
+ codexLiveUsageQueryKey(workspaceId),
353
+ )?.data;
354
+ const ids = listedAccountIds ? listedAccountIds.split("\n") : [];
355
+ if (
356
+ maxAgeMs !== undefined &&
357
+ retained &&
358
+ ids.length > 0 &&
359
+ ids.every((id) => {
360
+ const readAt = retained.readAt[id];
361
+ return readAt !== undefined && Date.now() - readAt < maxAgeMs;
362
+ })
363
+ ) {
364
+ return true;
365
+ }
366
+ const result = await runUsageMutation(async () => {
367
+ await sharedLiveUsageRead(codexClient, workspaceId, () =>
368
+ codexClient.refreshCodexUsage!(workspaceId),
369
+ );
370
+ return true;
371
+ });
372
+ if (result) await refresh();
373
+ return result === true;
374
+ },
375
+ [codexClient, workspaceId, runUsageMutation, refresh, listedAccountIds],
376
+ );
377
+
378
+ // Reauthorization failure must remove a previously visible session pool.
379
+ const data = (sessionId && error ? null : loadedData) ?? EMPTY_STATE;
191
380
  const effectiveAccountId = data.pinnedAccountId ?? data.activeAccountId;
381
+ const withLiveUsage = (account: CodexAccount): CodexAccount => {
382
+ const live = liveUsage[account.id]?.usage;
383
+ return live ? { ...account, fiveHour: live.fiveHour, weekly: live.weekly } : account;
384
+ };
192
385
 
193
386
  return {
194
- accounts: data.accounts,
387
+ currentAccount: data.currentAccount ? withLiveUsage(data.currentAccount) : null,
388
+ currentSelection: data.currentSelection,
389
+ switchAppliedTo:
390
+ switchReceipt?.sessionId === sessionId ? (switchReceipt?.appliedTo ?? null) : null,
391
+ accounts: data.accounts.map(withLiveUsage),
195
392
  activeAccountId: data.activeAccountId,
196
393
  pinnedAccountId: data.pinnedAccountId,
197
394
  effectiveAccountId,
198
395
  lastAccountId: data.lastAccountId,
199
396
  settings: data.settings,
200
397
  loading,
398
+ error,
201
399
  refresh,
202
400
  refreshUsage,
401
+ liveUsage,
402
+ liveUsageUpdatedAt: oldestReading(liveUsageQuery.data),
203
403
  refreshingUsage,
204
404
  pin,
205
405
  pinning,