@opengeni/react 3.1.0 → 3.1.2

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
@@ -0,0 +1,721 @@
1
+ import { useCallback, useLayoutEffect, useReducer, useRef, useSyncExternalStore } from "react";
2
+ import { normalizeError } from "../lib/error-message";
3
+ import { usePageLiveActivity } from "./internal";
4
+
5
+ /**
6
+ * A small client-scoped stale-while-revalidate store for read models that many
7
+ * surfaces show (subscription accounts, their usage limits). Internal to
8
+ * `@opengeni/react`: hosts reach it only through the hooks built on it and the
9
+ * `OpenGeniProvider` `retainReadsAcrossMounts` opt-in.
10
+ *
11
+ * Scoping:
12
+ *
13
+ * - Every entry lives under the exact client object that read it (a WeakMap),
14
+ * like `createDiscoveryCache`; the key names the exact read
15
+ * (`["codex-accounts", workspaceId, "session", sessionId]`).
16
+ * - By default nothing outlives its readers: mounted readers of one key share
17
+ * one request and one snapshot, and the entry is dropped as soon as the last
18
+ * reader unmounts. A reader renders an entry's rows only once it has
19
+ * registered on it (layout phase, then a re-render before paint), and only
20
+ * the reader instance that let go may take an entry back (StrictMode, effect
21
+ * re-runs); a different reader mounting in the same commit (a host
22
+ * re-keying its tree for another person) never renders the previous rows,
23
+ * starts from nothing, and the earlier read and writes are discarded. Only a scope a host retains
24
+ * (`retainSharedQueries`, used by the provider opt-in) keeps unmounted
25
+ * entries for `retainMs`, so a host that reuses one client for different
26
+ * people never serves one person's rows to the next mount. Ending the last
27
+ * retention clears the scope.
28
+ * - `clearSharedQueries(scope)` drops every row at once. Mounted readers stay
29
+ * subscribed and read again; writes from operations that started before the
30
+ * clear are discarded.
31
+ *
32
+ * Semantics:
33
+ *
34
+ * - A mount with retained data renders it immediately and revalidates in the
35
+ * background once it is older than `staleTimeMs`. An enabled reader reports
36
+ * `loading` until its key's first read completes.
37
+ * - Page visibility pauses only polling and background revalidation of rows
38
+ * already on screen; invalidation and `refresh()` read on a hidden page too.
39
+ * - A loader is bound to its key when the render that supplied it commits, so a
40
+ * render that never commits (a transition) or a key change cannot run one
41
+ * key's loader for another key's entry.
42
+ * - Failures are never cached. An access refusal (401/403/404) also drops the
43
+ * retained data; another failure keeps it beside the error.
44
+ * - `invalidateSharedQueries` supersedes any read in flight (its result is
45
+ * discarded), re-reads mounted entries and evicts unmounted ones, so a later
46
+ * mount never shows rows a mutation has made wrong.
47
+ */
48
+
49
+ export type SharedQueryKey = readonly (string | number | boolean | null)[];
50
+
51
+ export type SharedQuerySnapshot<T> = {
52
+ data: T | null;
53
+ /** True only while there is nothing to show yet (first read for this key). */
54
+ loading: boolean;
55
+ /** True while any read for this key is in flight, including background ones. */
56
+ fetching: boolean;
57
+ error: Error | null;
58
+ /** Epoch milliseconds of the last successful read or write, or null. */
59
+ updatedAt: number | null;
60
+ };
61
+
62
+ export type SharedQueryOptions = {
63
+ /** False: never read, and show no data (not even retained rows). */
64
+ enabled?: boolean | undefined;
65
+ /** Poll while mounted and the page is visible. Shortest interval wins. */
66
+ pollIntervalMs?: number | undefined;
67
+ /** Retained data younger than this is not re-read on mount. Default 10s. */
68
+ staleTimeMs?: number | undefined;
69
+ /** How long an unmounted entry is retained in a retained scope. Default 10 minutes. */
70
+ retainMs?: number | undefined;
71
+ };
72
+
73
+ export type SharedQueryResult<T> = SharedQuerySnapshot<T> & {
74
+ /** Force a read now (joining one queued after any in-flight read). */
75
+ refresh: () => Promise<void>;
76
+ };
77
+
78
+ /** Records data read some other way; false when the write was refused. */
79
+ export type SharedQueryWriter = <T>(parts: SharedQueryKey, data: T) => boolean;
80
+
81
+ const DEFAULT_STALE_TIME_MS = 10_000;
82
+ const DEFAULT_RETAIN_MS = 10 * 60_000;
83
+
84
+ type Loader<T> = (signal: AbortSignal) => Promise<T>;
85
+ type LoaderBinding = { key: string; load: Loader<unknown> };
86
+
87
+ type Subscriber = {
88
+ /** The hook instance; only it may take back an entry it just let go of. */
89
+ owner: object;
90
+ /** The committed loader and the key it reads; null for subscribe-only readers. */
91
+ binding: { current: LoaderBinding } | null;
92
+ enabled: boolean;
93
+ pageLive: boolean;
94
+ pollIntervalMs: number | undefined;
95
+ staleTimeMs: number;
96
+ retainMs: number;
97
+ };
98
+
99
+ type Entry = {
100
+ key: string;
101
+ parts: SharedQueryKey;
102
+ snapshot: SharedQuerySnapshot<unknown>;
103
+ /** The scope that holds this entry; its store listeners are notified per key. */
104
+ home: Scope;
105
+ subscribers: Set<Subscriber>;
106
+ inFlight: Promise<void> | null;
107
+ trailing: Promise<void> | null;
108
+ abort: AbortController | null;
109
+ generation: number;
110
+ /** The retained data may be wrong; the next reconcile re-reads. */
111
+ invalidated: boolean;
112
+ timer: ReturnType<typeof setTimeout> | null;
113
+ /** The interval `timer` was armed with. */
114
+ timerInterval: number | null;
115
+ retainTimer: ReturnType<typeof setTimeout> | null;
116
+ /** The reader instance that last let go of this entry while it awaits release. */
117
+ releasedBy: object | null;
118
+ /** When this entry last started over for a new owner (see `resetSequence`). */
119
+ resetMark: number;
120
+ };
121
+
122
+ type Scope = {
123
+ entries: Map<string, Entry>;
124
+ /**
125
+ * Store (useSyncExternalStore) listeners per key, not per entry: a reader
126
+ * hidden by Suspense keeps its store subscription while it is unregistered,
127
+ * and must still hear about the entry that replaces an evicted one.
128
+ */
129
+ listeners: Map<string, Set<() => void>>;
130
+ /** Bumped by every clear; writers from an earlier epoch are refused. */
131
+ epoch: number;
132
+ /** Active retentions; unmounted entries are kept only while positive. */
133
+ retainers: number;
134
+ releaseTimer: ReturnType<typeof setTimeout> | null;
135
+ };
136
+
137
+ const scopes = new WeakMap<object, Scope>();
138
+ /**
139
+ * Orders writers against entries that started over for a new owner: a writer
140
+ * created before an entry's mark never writes to it.
141
+ */
142
+ let resetSequence = 0;
143
+
144
+ function idle<T>(loading: boolean): SharedQuerySnapshot<T> {
145
+ return { data: null, loading, fetching: false, error: null, updatedAt: null };
146
+ }
147
+ const IDLE_LOADING = idle<never>(true);
148
+ const IDLE = idle<never>(false);
149
+
150
+ function serialize(parts: SharedQueryKey): string {
151
+ return JSON.stringify(parts);
152
+ }
153
+
154
+ /** A refusal that repeating the read cannot fix; retained rows must go. */
155
+ export function isSharedQueryAccessRefusal(cause: unknown): boolean {
156
+ if (!cause || typeof cause !== "object" || !("status" in cause)) return false;
157
+ const status = (cause as { status: unknown }).status;
158
+ return status === 401 || status === 403 || status === 404;
159
+ }
160
+
161
+ function scopeState(scope: object): Scope {
162
+ let state = scopes.get(scope);
163
+ if (!state) {
164
+ state = {
165
+ entries: new Map(),
166
+ listeners: new Map(),
167
+ epoch: 0,
168
+ retainers: 0,
169
+ releaseTimer: null,
170
+ };
171
+ scopes.set(scope, state);
172
+ }
173
+ return state;
174
+ }
175
+
176
+ function notify(state: Scope, key: string): void {
177
+ const listeners = state.listeners.get(key);
178
+ if (!listeners) return;
179
+ for (const listener of [...listeners]) listener();
180
+ }
181
+
182
+ function setSnapshot(entry: Entry, next: SharedQuerySnapshot<unknown>): void {
183
+ entry.snapshot = next;
184
+ notify(entry.home, entry.key);
185
+ }
186
+
187
+ /** A store listener for a client's key, whichever entry currently holds it. */
188
+ function listen(scope: object, key: string, listener: () => void): () => void {
189
+ const state = scopeState(scope);
190
+ let listeners = state.listeners.get(key);
191
+ if (!listeners) {
192
+ listeners = new Set();
193
+ state.listeners.set(key, listeners);
194
+ }
195
+ listeners.add(listener);
196
+ return () => {
197
+ const current = state.listeners.get(key);
198
+ if (!current) return;
199
+ current.delete(listener);
200
+ if (current.size === 0) state.listeners.delete(key);
201
+ };
202
+ }
203
+
204
+ /** Readers that may read: enabled and bound to this key (visible or not). */
205
+ function readers(entry: Entry): Subscriber[] {
206
+ return [...entry.subscribers].filter(
207
+ (each) => each.enabled && each.binding?.current.key === entry.key,
208
+ );
209
+ }
210
+
211
+ /**
212
+ * Registered readers keep an entry. Store listeners don't: they belong to the
213
+ * client and key (see `Scope.listeners`), React removes them in the passive
214
+ * phase, and a reader hidden by Suspense keeps one while it is unregistered.
215
+ */
216
+ function mounted(entry: Entry): boolean {
217
+ return entry.subscribers.size > 0;
218
+ }
219
+
220
+ function stopTimer(entry: Entry): void {
221
+ if (entry.timer !== null) {
222
+ clearTimeout(entry.timer);
223
+ entry.timer = null;
224
+ }
225
+ entry.timerInterval = null;
226
+ }
227
+
228
+ function stopRetainTimer(entry: Entry): void {
229
+ if (entry.retainTimer !== null) {
230
+ clearTimeout(entry.retainTimer);
231
+ entry.retainTimer = null;
232
+ }
233
+ }
234
+
235
+ /** Any read in flight or queued is superseded: its result is never stored. */
236
+ function supersedeReads(entry: Entry): void {
237
+ entry.generation += 1;
238
+ entry.abort?.abort();
239
+ entry.abort = null;
240
+ entry.inFlight = null;
241
+ entry.trailing = null;
242
+ }
243
+
244
+ function evict(state: Scope, entry: Entry): void {
245
+ supersedeReads(entry);
246
+ stopTimer(entry);
247
+ stopRetainTimer(entry);
248
+ if (state.entries.get(entry.key) !== entry) return;
249
+ state.entries.delete(entry.key);
250
+ // Store subscriptions that outlive the entry (Suspense) now read nothing.
251
+ notify(state, entry.key);
252
+ }
253
+
254
+ /** Poll at the shortest interval among readers on a visible page; keep a timer already armed for it. */
255
+ function arm(entry: Entry): void {
256
+ let interval: number | undefined;
257
+ for (const each of readers(entry)) {
258
+ if (!each.pageLive) continue;
259
+ if (each.pollIntervalMs === undefined || each.pollIntervalMs <= 0) continue;
260
+ interval =
261
+ interval === undefined ? each.pollIntervalMs : Math.min(interval, each.pollIntervalMs);
262
+ }
263
+ if (entry.timer !== null && entry.timerInterval === interval) return;
264
+ stopTimer(entry);
265
+ if (interval === undefined) return;
266
+ entry.timerInterval = interval;
267
+ entry.timer = setTimeout(() => {
268
+ entry.timer = null;
269
+ entry.timerInterval = null;
270
+ void run(entry).finally(() => arm(entry));
271
+ }, interval);
272
+ }
273
+
274
+ async function runFresh(entry: Entry): Promise<void> {
275
+ const subscriber = readers(entry).at(-1);
276
+ if (!subscriber?.binding) return;
277
+ const { load } = subscriber.binding.current;
278
+ const ticket = ++entry.generation;
279
+ const abort = new AbortController();
280
+ entry.abort = abort;
281
+ entry.invalidated = false;
282
+ if (!entry.snapshot.fetching) setSnapshot(entry, { ...entry.snapshot, fetching: true });
283
+ try {
284
+ const data = await load(abort.signal);
285
+ if (ticket !== entry.generation) return;
286
+ setSnapshot(entry, {
287
+ data,
288
+ loading: false,
289
+ fetching: false,
290
+ error: null,
291
+ updatedAt: Date.now(),
292
+ });
293
+ } catch (cause) {
294
+ if (ticket !== entry.generation) return;
295
+ const refused = isSharedQueryAccessRefusal(cause);
296
+ setSnapshot(entry, {
297
+ data: refused ? null : entry.snapshot.data,
298
+ loading: false,
299
+ fetching: false,
300
+ error: normalizeError(cause),
301
+ // A failure is never a fresh read: the next mount re-reads.
302
+ updatedAt: null,
303
+ });
304
+ } finally {
305
+ if (entry.abort === abort) entry.abort = null;
306
+ }
307
+ }
308
+
309
+ function run(entry: Entry, force = false): Promise<void> {
310
+ if (entry.inFlight) {
311
+ if (!force) return entry.inFlight;
312
+ // A forced read issued during another read must observe whatever changed
313
+ // since that read started, so queue exactly one successor read.
314
+ if (entry.trailing) return entry.trailing;
315
+ const predecessor = entry.inFlight;
316
+ let trailing!: Promise<void>;
317
+ trailing = predecessor.then(() => {
318
+ // Superseded meanwhile: the read that replaced it is the newer one.
319
+ if (entry.trailing !== trailing) return entry.inFlight ?? undefined;
320
+ entry.trailing = null;
321
+ if (readers(entry).length > 0) return run(entry);
322
+ // Nobody can read now: what the predecessor stored is not known to be
323
+ // current, so the next mount or resume re-reads.
324
+ entry.invalidated = true;
325
+ return undefined;
326
+ });
327
+ entry.trailing = trailing;
328
+ return trailing;
329
+ }
330
+ let promise!: Promise<void>;
331
+ promise = runFresh(entry).finally(() => {
332
+ if (entry.inFlight === promise) entry.inFlight = null;
333
+ });
334
+ entry.inFlight = promise;
335
+ return promise;
336
+ }
337
+
338
+ function isStale(entry: Entry, staleTimeMs: number): boolean {
339
+ const updatedAt = entry.snapshot.updatedAt;
340
+ return entry.invalidated || updatedAt === null || Date.now() - updatedAt >= staleTimeMs;
341
+ }
342
+
343
+ function reconcile(entry: Entry): void {
344
+ const active = readers(entry);
345
+ if (active.length === 0) {
346
+ stopTimer(entry);
347
+ if (entry.snapshot.loading) setSnapshot(entry, { ...entry.snapshot, loading: false });
348
+ return;
349
+ }
350
+ const staleTimeMs = Math.min(...active.map((each) => each.staleTimeMs));
351
+ // A hidden page still reads what it has nothing (or nothing right) to show;
352
+ // it only defers revalidating rows already on screen.
353
+ const due =
354
+ active.some((each) => each.pageLive) || entry.invalidated || entry.snapshot.data === null;
355
+ if (due && isStale(entry, staleTimeMs)) {
356
+ // A mount or resume never inherits an earlier failure: it reads again and
357
+ // shows a loading state (or retained rows) until that read settles.
358
+ if (entry.snapshot.error || (entry.snapshot.data === null && !entry.snapshot.loading)) {
359
+ setSnapshot(entry, {
360
+ ...entry.snapshot,
361
+ error: null,
362
+ loading: entry.snapshot.data === null,
363
+ });
364
+ }
365
+ void run(entry).finally(() => arm(entry));
366
+ return;
367
+ }
368
+ // A reader joined or left: the shortest interval may have changed.
369
+ arm(entry);
370
+ }
371
+
372
+ function scheduleRelease(state: Scope, entry: Entry, retainMs: number): void {
373
+ stopRetainTimer(entry);
374
+ // Even an unretained entry waits one task, so StrictMode's immediate
375
+ // unmount/remount keeps sharing the read it already started.
376
+ entry.retainTimer = setTimeout(() => {
377
+ entry.retainTimer = null;
378
+ if (!mounted(entry)) evict(state, entry);
379
+ }, retainMs);
380
+ }
381
+
382
+ function getOrCreate(scope: object, key: string, loading: boolean): Entry {
383
+ const state = scopeState(scope);
384
+ const existing = state.entries.get(key);
385
+ if (existing) {
386
+ stopRetainTimer(existing);
387
+ return existing;
388
+ }
389
+ const created: Entry = {
390
+ key,
391
+ parts: JSON.parse(key) as SharedQueryKey,
392
+ snapshot: idle(loading),
393
+ home: state,
394
+ subscribers: new Set(),
395
+ inFlight: null,
396
+ trailing: null,
397
+ abort: null,
398
+ generation: 0,
399
+ invalidated: false,
400
+ timer: null,
401
+ timerInterval: null,
402
+ retainTimer: null,
403
+ releasedBy: null,
404
+ // Without retention a new entry may be someone else's: writers created
405
+ // before it (by an earlier, now unmounted reader) never fill it.
406
+ resetMark: state.retainers === 0 ? ++resetSequence : 0,
407
+ };
408
+ state.entries.set(key, created);
409
+ return created;
410
+ }
411
+
412
+ /**
413
+ * Register a reader instance. In an unretained scope an entry that another
414
+ * instance let go of in this same commit is not adopted: its rows and any read
415
+ * in flight belonged to that reader (possibly another person), so it starts
416
+ * over and writes to it begun before now are refused. True when it was reset.
417
+ */
418
+ function registerSubscriber(scope: object, entry: Entry, subscriber: Subscriber): boolean {
419
+ const state = scopeState(scope);
420
+ const foreign =
421
+ entry.subscribers.size === 0 &&
422
+ entry.releasedBy !== null &&
423
+ entry.releasedBy !== subscriber.owner &&
424
+ state.retainers === 0;
425
+ if (foreign) {
426
+ supersedeReads(entry);
427
+ stopTimer(entry);
428
+ entry.invalidated = false;
429
+ entry.resetMark = ++resetSequence;
430
+ setSnapshot(entry, IDLE);
431
+ }
432
+ entry.releasedBy = null;
433
+ entry.subscribers.add(subscriber);
434
+ return foreign;
435
+ }
436
+
437
+ function unsubscribe(scope: object, entry: Entry, subscriber: Subscriber, retainMs: number): void {
438
+ entry.subscribers.delete(subscriber);
439
+ if (entry.subscribers.size > 0) {
440
+ reconcile(entry);
441
+ return;
442
+ }
443
+ entry.releasedBy = subscriber.owner;
444
+ // Only the poll stops: in a retained scope a read in flight still lands
445
+ // for the next mount. Otherwise the entry goes with its last reader.
446
+ stopTimer(entry);
447
+ if (entry.snapshot.loading) setSnapshot(entry, { ...entry.snapshot, loading: false });
448
+ const state = scopes.get(scope);
449
+ if (!state || state.entries.get(entry.key) !== entry) return;
450
+ scheduleRelease(state, entry, state.retainers > 0 ? retainMs : 0);
451
+ }
452
+
453
+ /**
454
+ * The entry a reader may render. Without host retention an entry's rows belong
455
+ * to the readers registered on it: until this reader has registered (layout
456
+ * phase) it renders a placeholder, so a reader replacing another in one
457
+ * commit never renders, or hands its children, the previous rows.
458
+ */
459
+ function visibleEntry(scope: object, key: string, registered: Entry | null): Entry | null {
460
+ const state = scopes.get(scope);
461
+ const entry = state?.entries.get(key);
462
+ if (!state || !entry) return null;
463
+ if (state.retainers === 0 && registered !== entry) return null;
464
+ return entry;
465
+ }
466
+
467
+ /** The retained snapshot for a key, without subscribing or reading. */
468
+ export function peekSharedQuery<T>(
469
+ scope: object,
470
+ parts: SharedQueryKey,
471
+ ): SharedQuerySnapshot<T> | null {
472
+ return (
473
+ (scopes.get(scope)?.entries.get(serialize(parts))?.snapshot as
474
+ | SharedQuerySnapshot<T>
475
+ | undefined) ?? null
476
+ );
477
+ }
478
+
479
+ /**
480
+ * A writer for data read some other way (for example a live provider refresh).
481
+ * Create it BEFORE starting that read: a clear in between refuses every write,
482
+ * and an entry that started over for a new owner meanwhile refuses writes to
483
+ * it, so a retired identity's late result is never recorded. Mounted readers
484
+ * render a write at once; with no reader, only a retained scope keeps it.
485
+ */
486
+ export function sharedQueryWriter(scope: object): SharedQueryWriter {
487
+ const state = scopeState(scope);
488
+ const epoch = state.epoch;
489
+ const since = resetSequence;
490
+ return <T>(parts: SharedQueryKey, data: T): boolean => {
491
+ if (state.epoch !== epoch) return false;
492
+ const key = serialize(parts);
493
+ const existing = state.entries.get(key);
494
+ if (existing && existing.resetMark > since) return false;
495
+ if (!(existing && mounted(existing)) && state.retainers === 0) return false;
496
+ const entry = existing ?? getOrCreate(scope, key, false);
497
+ // A read already in flight started before this write; its result is older.
498
+ supersedeReads(entry);
499
+ entry.invalidated = false;
500
+ setSnapshot(entry, {
501
+ data,
502
+ loading: false,
503
+ fetching: false,
504
+ error: null,
505
+ updatedAt: Date.now(),
506
+ });
507
+ if (!mounted(entry)) scheduleRelease(state, entry, DEFAULT_RETAIN_MS);
508
+ return true;
509
+ };
510
+ }
511
+
512
+ /**
513
+ * Mark every entry whose key starts with `prefix` as wrong. Reads in flight are
514
+ * superseded. Mounted entries re-read now (keeping their rows on screen
515
+ * meanwhile); paused ones re-read when they resume; unmounted entries are
516
+ * evicted so the next mount never renders them.
517
+ */
518
+ export function invalidateSharedQueries(scope: object, prefix: SharedQueryKey): Promise<void> {
519
+ const state = scopes.get(scope);
520
+ if (!state) return Promise.resolve();
521
+ const reads: Promise<void>[] = [];
522
+ for (const entry of [...state.entries.values()]) {
523
+ if (!prefix.every((part, index) => entry.parts[index] === part)) continue;
524
+ if (!mounted(entry)) {
525
+ evict(state, entry);
526
+ continue;
527
+ }
528
+ supersedeReads(entry);
529
+ entry.invalidated = true;
530
+ // Readers keep their rows on screen while the re-read runs, also on a
531
+ // hidden page (a sign-in finished in another tab must not blank Settings).
532
+ if (readers(entry).length > 0) {
533
+ reads.push(run(entry).finally(() => arm(entry)));
534
+ continue;
535
+ }
536
+ // Only disabled or subscribe-only readers: drop the rows; an enabled
537
+ // reader reads again when it appears.
538
+ stopTimer(entry);
539
+ setSnapshot(entry, IDLE);
540
+ }
541
+ return Promise.all(reads).then(() => undefined);
542
+ }
543
+
544
+ /**
545
+ * Drop everything retained for a client. Unmounted entries go; mounted ones
546
+ * are reset in place (their readers stay subscribed) and active ones read
547
+ * again. Writes from operations that began before the clear are refused.
548
+ */
549
+ export function clearSharedQueries(scope: object): void {
550
+ const state = scopes.get(scope);
551
+ if (!state) return;
552
+ state.epoch += 1;
553
+ for (const entry of [...state.entries.values()]) {
554
+ if (!mounted(entry)) {
555
+ evict(state, entry);
556
+ continue;
557
+ }
558
+ supersedeReads(entry);
559
+ stopTimer(entry);
560
+ stopRetainTimer(entry);
561
+ entry.invalidated = true;
562
+ const active = readers(entry).length > 0;
563
+ setSnapshot(entry, active ? IDLE_LOADING : IDLE);
564
+ if (active) void run(entry).finally(() => arm(entry));
565
+ }
566
+ }
567
+
568
+ /**
569
+ * Keep unmounted entries for this client until the returned release is
570
+ * called. Releasing the last retention clears the client's entries (after one
571
+ * task, so StrictMode's immediate remount keeps them).
572
+ */
573
+ export function retainSharedQueries(scope: object): () => void {
574
+ const state = scopeState(scope);
575
+ state.retainers += 1;
576
+ if (state.releaseTimer !== null) {
577
+ clearTimeout(state.releaseTimer);
578
+ state.releaseTimer = null;
579
+ }
580
+ let released = false;
581
+ return () => {
582
+ if (released) return;
583
+ released = true;
584
+ state.retainers -= 1;
585
+ if (state.retainers > 0) return;
586
+ if (state.releaseTimer !== null) clearTimeout(state.releaseTimer);
587
+ state.releaseTimer = setTimeout(() => {
588
+ state.releaseTimer = null;
589
+ if (state.retainers === 0) clearSharedQueries(scope);
590
+ }, 0);
591
+ };
592
+ }
593
+
594
+ /**
595
+ * Subscribe to one shared read. `scope` is the client object that performs
596
+ * the read; `parts` must name every input the loader depends on.
597
+ */
598
+ export function useSharedQuery<T>(
599
+ scope: object,
600
+ parts: SharedQueryKey,
601
+ load: Loader<T>,
602
+ options: SharedQueryOptions = {},
603
+ ): SharedQueryResult<T> {
604
+ const enabled = options.enabled ?? true;
605
+ const pageLive = usePageLiveActivity();
606
+ const key = serialize(parts);
607
+ // The loader is bound to its key only when the render that supplied both
608
+ // commits: a render React discards (a transition) never rebinds it, and a
609
+ // subscriber whose binding names another key is ignored by every read, so
610
+ // one key's loader never fills another key's entry.
611
+ const binding = useRef<LoaderBinding>({ key, load: load as Loader<unknown> });
612
+ useLayoutEffect(() => {
613
+ binding.current = { key, load: load as Loader<unknown> };
614
+ }, [key, load]);
615
+ const staleTimeMs = options.staleTimeMs ?? DEFAULT_STALE_TIME_MS;
616
+ const retainMs = options.retainMs ?? DEFAULT_RETAIN_MS;
617
+ const pollIntervalMs = options.pollIntervalMs;
618
+
619
+ const subscribe = useCallback(
620
+ (listener: () => void) => listen(scope, key, listener),
621
+ [scope, key],
622
+ );
623
+ // The entry this instance is registered on (set in the layout phase).
624
+ const registered = useRef<Entry | null>(null);
625
+ const getSnapshot = useCallback(
626
+ () =>
627
+ (visibleEntry(scope, key, registered.current)?.snapshot as
628
+ | SharedQuerySnapshot<T>
629
+ | undefined) ?? (enabled ? IDLE_LOADING : IDLE),
630
+ [scope, key, enabled],
631
+ );
632
+ const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
633
+ const owner = useRef<object>({});
634
+ const [, rerender] = useReducer((count: number) => count + 1, 0);
635
+
636
+ // Registered in the layout phase, after any reader this commit unmounts has
637
+ // let go, so a foreign entry is reset before the browser paints.
638
+ useLayoutEffect(() => {
639
+ const entry = getOrCreate(scope, key, enabled);
640
+ const subscriber: Subscriber = {
641
+ owner: owner.current,
642
+ binding,
643
+ enabled,
644
+ pageLive,
645
+ pollIntervalMs,
646
+ staleTimeMs,
647
+ retainMs,
648
+ };
649
+ registerSubscriber(scope, entry, subscriber);
650
+ registered.current = entry;
651
+ reconcile(entry);
652
+ // Rendered before registering (a placeholder) or before a reset: show
653
+ // what is registered now, before the browser paints.
654
+ if (getSnapshot() !== snapshot) rerender();
655
+ return () => {
656
+ if (registered.current === entry) registered.current = null;
657
+ unsubscribe(scope, entry, subscriber, retainMs);
658
+ };
659
+ // `snapshot` is what this commit rendered; it never re-registers a reader.
660
+ // eslint-disable-next-line react-hooks/exhaustive-deps
661
+ }, [scope, key, enabled, pageLive, pollIntervalMs, staleTimeMs, retainMs]);
662
+
663
+ const refresh = useCallback((): Promise<void> => {
664
+ const entry = scopes.get(scope)?.entries.get(key);
665
+ if (!entry || readers(entry).length === 0) return Promise.resolve();
666
+ return run(entry, true).finally(() => arm(entry));
667
+ }, [scope, key]);
668
+
669
+ // A disabled reader shows nothing, not even rows retained by other readers.
670
+ if (!enabled) return { ...IDLE, refresh };
671
+ // Enabled with nothing read yet (also the first render after enabling).
672
+ const unread = snapshot.data === null && snapshot.error === null && snapshot.updatedAt === null;
673
+ return { ...snapshot, loading: snapshot.loading || unread, refresh };
674
+ }
675
+
676
+ /**
677
+ * Subscribe to an entry that is only ever written (`sharedQueryWriter`), never
678
+ * read: it renders whatever is recorded and keeps the entry while mounted.
679
+ */
680
+ export function useSharedQueryValue<T>(
681
+ scope: object,
682
+ parts: SharedQueryKey,
683
+ ): SharedQuerySnapshot<T> {
684
+ const key = serialize(parts);
685
+ const subscribe = useCallback(
686
+ (listener: () => void) => listen(scope, key, listener),
687
+ [scope, key],
688
+ );
689
+ const registered = useRef<Entry | null>(null);
690
+ const getSnapshot = useCallback(
691
+ () =>
692
+ (visibleEntry(scope, key, registered.current)?.snapshot as
693
+ | SharedQuerySnapshot<T>
694
+ | undefined) ?? IDLE,
695
+ [scope, key],
696
+ );
697
+ const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
698
+ const owner = useRef<object>({});
699
+ const [, rerender] = useReducer((count: number) => count + 1, 0);
700
+ useLayoutEffect(() => {
701
+ const entry = getOrCreate(scope, key, false);
702
+ const subscriber: Subscriber = {
703
+ owner: owner.current,
704
+ binding: null,
705
+ enabled: false,
706
+ pageLive: true,
707
+ pollIntervalMs: undefined,
708
+ staleTimeMs: DEFAULT_STALE_TIME_MS,
709
+ retainMs: DEFAULT_RETAIN_MS,
710
+ };
711
+ registerSubscriber(scope, entry, subscriber);
712
+ registered.current = entry;
713
+ if (getSnapshot() !== snapshot) rerender();
714
+ return () => {
715
+ if (registered.current === entry) registered.current = null;
716
+ unsubscribe(scope, entry, subscriber, DEFAULT_RETAIN_MS);
717
+ };
718
+ // eslint-disable-next-line react-hooks/exhaustive-deps
719
+ }, [scope, key]);
720
+ return snapshot;
721
+ }