@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
@@ -12,7 +12,16 @@ import {
12
12
  type SpreadsheetSheetGeneration,
13
13
  } from "@opengeni/sdk/editable-artifacts";
14
14
  import { PlusIcon } from "lucide-react";
15
- import { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from "react";
15
+ import {
16
+ type ReactNode,
17
+ useCallback,
18
+ useEffect,
19
+ useId,
20
+ useLayoutEffect,
21
+ useMemo,
22
+ useRef,
23
+ useState,
24
+ } from "react";
16
25
 
17
26
  import { cn } from "../../lib/cn";
18
27
  import { ArtifactSurface } from "./artifact-surface";
@@ -23,9 +32,15 @@ import {
23
32
  useEditableArtifactView,
24
33
  } from "./editable-artifact-ui";
25
34
  import { SparseSpreadsheetCellIndex } from "./spreadsheet-canvas";
35
+ import { SpreadsheetDownloadButton, type SpreadsheetDownload } from "./spreadsheet-download";
36
+ import {
37
+ SpreadsheetSubmissionProvider,
38
+ useSpreadsheetSubmissions,
39
+ } from "./spreadsheet-submissions";
26
40
  import {
27
41
  SpreadsheetProjectionGrid,
28
42
  type SpreadsheetCommit,
43
+ type SpreadsheetDimensionCommit,
29
44
  type SpreadsheetGridProjection,
30
45
  type SpreadsheetRangeCommit,
31
46
  type SpreadsheetSelection,
@@ -40,6 +55,11 @@ const MAX_INTERACTIVE_QUERY_CELLS = 65_536;
40
55
  const MAX_INTERACTIVE_QUERY_BYTES = 8 * 1024 * 1024;
41
56
  const EMPTY_FORMAT = Object.freeze({});
42
57
  const EMPTY_SHEETS: readonly EditableSpreadsheetSheetMetadata[] = [];
58
+ const useClientLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
59
+ // Identity only: a replacement SDK object is a new authoring lifetime, even
60
+ // when artifact, sheet, and generation IDs are unchanged. No model data lives here.
61
+ const SESSION_KEYS = new WeakMap<EditableArtifactSession, number>();
62
+ let nextSessionKey = 0;
43
63
 
44
64
  export type EditableSpreadsheetGridProps = {
45
65
  session: EditableArtifactSession;
@@ -52,6 +72,7 @@ export type EditableSpreadsheetGridProps = {
52
72
  overscanColumns?: number | undefined;
53
73
  onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;
54
74
  onCommit?: ((commit: SpreadsheetCommit) => void) | undefined;
75
+ onResize?: ((change: SpreadsheetDimensionCommit) => void) | undefined;
55
76
  onCommandError?: ((error: Error) => void) | undefined;
56
77
  onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;
57
78
  className?: string | undefined;
@@ -62,13 +83,18 @@ export type EditableSpreadsheetArtifactSurfaceProps = Omit<
62
83
  "metadataRevision" | "sheet"
63
84
  > & {
64
85
  title?: string | undefined;
86
+ showHeader?: boolean | undefined;
65
87
  subtitle?: ReactNode | undefined;
66
88
  actions?: ReactNode | undefined;
89
+ /** Authenticated XLSX export of the current saved native head. */
90
+ download?: SpreadsheetDownload | undefined;
67
91
  initialSheetId?: string | undefined;
68
92
  allowAddSheet?: boolean | undefined;
69
93
  };
70
94
 
71
95
  type ProjectionState = {
96
+ session: EditableArtifactSession;
97
+ generationId: string | null;
72
98
  query: EditableSpreadsheetViewportQuery;
73
99
  projection: EditableSpreadsheetViewportProjection | null;
74
100
  error: Error | null;
@@ -78,7 +104,16 @@ type ProjectionState = {
78
104
  * Durable spreadsheet editor over one SDK session. Canonical state remains in
79
105
  * the dedicated Worker; React receives one bounded immutable viewport only.
80
106
  */
81
- export function EditableSpreadsheetGrid({
107
+ export function EditableSpreadsheetGrid(props: EditableSpreadsheetGridProps) {
108
+ return (
109
+ <EditableSpreadsheetGridSession
110
+ key={`${spreadsheetSessionKey(props.session)}:${props.sheet.sheetId}:${props.sheet.generationId ?? "pending"}`}
111
+ {...props}
112
+ />
113
+ );
114
+ }
115
+
116
+ function EditableSpreadsheetGridSession({
82
117
  session,
83
118
  sheet,
84
119
  metadataRevision,
@@ -89,10 +124,14 @@ export function EditableSpreadsheetGrid({
89
124
  overscanColumns = 2,
90
125
  onSelectionChange,
91
126
  onCommit,
127
+ onResize,
92
128
  onCommandError,
93
129
  onViewportChange,
94
130
  className,
95
131
  }: EditableSpreadsheetGridProps) {
132
+ const authoringLifetime = useSpreadsheetAuthoringLifetime();
133
+ const submissions = useSpreadsheetSubmissions();
134
+ const view = useEditableArtifactView(session);
96
135
  const rowCount = boundedSheetCount(requestedRowCount, EXCEL_MAX_ROWS, sheet.usedBounds?.endRow);
97
136
  const columnCount = boundedSheetCount(
98
137
  requestedColumnCount,
@@ -100,6 +139,8 @@ export function EditableSpreadsheetGrid({
100
139
  sheet.usedBounds?.endColumn,
101
140
  );
102
141
  const [state, setState] = useState<ProjectionState>(() => ({
142
+ session,
143
+ generationId: sheet.generationId,
103
144
  query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),
104
145
  projection: null,
105
146
  error: null,
@@ -107,23 +148,36 @@ export function EditableSpreadsheetGrid({
107
148
  const activeCellRef = useRef({ row: 0, column: 0 });
108
149
 
109
150
  useEffect(() => {
110
- setState({
111
- query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),
112
- projection: null,
113
- error: null,
114
- });
151
+ setState((current) =>
152
+ current.session === session &&
153
+ current.generationId === sheet.generationId &&
154
+ current.query.sheetId === sheet.sheetId
155
+ ? current
156
+ : {
157
+ session,
158
+ generationId: sheet.generationId,
159
+ query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),
160
+ projection: null,
161
+ error: null,
162
+ },
163
+ );
115
164
  activeCellRef.current = { row: 0, column: 0 };
116
- }, [columnCount, rowCount, session, sheet.sheetId]);
165
+ }, [columnCount, rowCount, session, sheet.generationId, sheet.sheetId]);
117
166
 
118
167
  useEffect(() => {
119
168
  const query = state.query;
120
- return session.subscribeSpreadsheetViewport(
169
+ const matchesScope = (current: ProjectionState) =>
170
+ current.session === session &&
171
+ current.generationId === sheet.generationId &&
172
+ sameViewportQuery(current.query, query);
173
+ let active = true;
174
+ const unsubscribe = session.subscribeSpreadsheetViewport(
121
175
  query,
122
176
  (projection) => {
123
- if (!sameViewport(projection, query)) return;
177
+ if (!active || !sameViewport(projection, query)) return;
124
178
  if (sheet.generationId !== null && projection.generationId !== sheet.generationId) {
125
179
  setState((current) =>
126
- sameViewportQuery(current.query, query)
180
+ matchesScope(current)
127
181
  ? {
128
182
  ...current,
129
183
  projection: null,
@@ -134,17 +188,20 @@ export function EditableSpreadsheetGrid({
134
188
  return;
135
189
  }
136
190
  setState((current) =>
137
- sameViewportQuery(current.query, query) ? { query, projection, error: null } : current,
191
+ matchesScope(current) ? { ...current, projection, error: null } : current,
138
192
  );
139
193
  },
140
194
  {
141
195
  onError(error) {
142
- setState((current) =>
143
- sameViewportQuery(current.query, query) ? { ...current, error } : current,
144
- );
196
+ if (!active) return;
197
+ setState((current) => (matchesScope(current) ? { ...current, error } : current));
145
198
  },
146
199
  },
147
200
  );
201
+ return () => {
202
+ active = false;
203
+ unsubscribe();
204
+ };
148
205
  }, [session, sheet.generationId, state.query]);
149
206
 
150
207
  const projection = useMemo(
@@ -153,81 +210,142 @@ export function EditableSpreadsheetGrid({
153
210
  sheet,
154
211
  metadataRevision,
155
212
  state.query,
156
- state.projection,
213
+ state.session === session && state.generationId === sheet.generationId
214
+ ? state.projection
215
+ : null,
157
216
  rowCount,
158
217
  columnCount,
159
218
  ),
160
- [columnCount, metadataRevision, rowCount, sheet, state.projection, state.query],
219
+ [columnCount, metadataRevision, rowCount, session, sheet, state],
161
220
  );
162
221
  const generation = useMemo(() => sheetGeneration(sheet), [sheet]);
163
- const editable = !readOnly && generation !== null;
222
+ const editable =
223
+ !readOnly && view.writable && !view.authoringBlockedReason && generation !== null;
224
+ const syncStatus = view.authoringBlockedReason
225
+ ? "Waiting for earlier edits…"
226
+ : view.state === "live"
227
+ ? editable
228
+ ? "Saved"
229
+ : "Read only"
230
+ : editableArtifactStatusLabel(view);
231
+ const syncError =
232
+ view.blockedPending.length > 0
233
+ ? "Some earlier changes could not sync."
234
+ : view.lastError?.message;
235
+ const resizable =
236
+ editable && sheet.defaultRowHeight !== undefined && sheet.defaultColumnWidth !== undefined;
164
237
 
165
238
  const handleCommit = useCallback(
166
239
  async (commit: SpreadsheetCommit) => {
240
+ const lifetime = requireSpreadsheetAuthoringLifetime(authoringLifetime);
167
241
  if (!generation) throw new Error("This sheet generation is not writable yet");
168
242
  const input = spreadsheetCellInput(commit.input, commit.kind);
169
- await session.applySpreadsheetCommands({
170
- version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,
171
- commands: [
172
- {
173
- kind: "cells.set",
174
- sheet: generation,
175
- anchor: { row: commit.cell.row, column: commit.cell.col },
176
- rows: 1,
177
- columns: 1,
178
- cells: [input],
179
- },
180
- ],
181
- });
182
- onCommit?.(commit);
243
+ await submissions.run(() =>
244
+ session.applySpreadsheetCommands({
245
+ version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,
246
+ commands: [
247
+ {
248
+ kind: "cells.set",
249
+ sheet: generation,
250
+ anchor: { row: commit.cell.row, column: commit.cell.col },
251
+ rows: 1,
252
+ columns: 1,
253
+ cells: [input],
254
+ },
255
+ ],
256
+ }),
257
+ );
258
+ if (authoringLifetime.current === lifetime) onCommit?.(commit);
183
259
  },
184
- [generation, onCommit, session],
260
+ [authoringLifetime, generation, onCommit, session, submissions],
185
261
  );
186
262
 
187
263
  const handleClear = useCallback(
188
264
  async (selection: SpreadsheetSelection) => {
265
+ requireSpreadsheetAuthoringLifetime(authoringLifetime);
189
266
  if (!generation) throw new Error("This sheet generation is not writable yet");
190
267
  const top = Math.min(selection.anchor.row, selection.focus.row);
191
268
  const bottom = Math.max(selection.anchor.row, selection.focus.row);
192
269
  const left = Math.min(selection.anchor.col, selection.focus.col);
193
270
  const right = Math.max(selection.anchor.col, selection.focus.col);
194
- await session.applySpreadsheetCommands({
195
- version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,
196
- commands: [
197
- {
198
- kind: "range.clear",
199
- sheet: generation,
200
- range: {
201
- start: { row: top, column: left },
202
- end: { row: bottom, column: right },
271
+ await submissions.run(() =>
272
+ session.applySpreadsheetCommands({
273
+ version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,
274
+ commands: [
275
+ {
276
+ kind: "range.clear",
277
+ sheet: generation,
278
+ range: {
279
+ start: { row: top, column: left },
280
+ end: { row: bottom, column: right },
281
+ },
203
282
  },
204
- },
205
- ],
206
- });
283
+ ],
284
+ }),
285
+ );
207
286
  },
208
- [generation, session],
287
+ [authoringLifetime, generation, session, submissions],
209
288
  );
210
289
 
211
290
  const handleCommitRange = useCallback(
212
291
  async (commit: SpreadsheetRangeCommit) => {
292
+ requireSpreadsheetAuthoringLifetime(authoringLifetime);
213
293
  if (!generation) throw new Error("This sheet generation is not writable yet");
214
- await session.applySpreadsheetCommands({
215
- version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,
216
- commands: [
217
- {
218
- kind: "cells.set",
219
- sheet: generation,
220
- anchor: { row: commit.anchor.row, column: commit.anchor.col },
221
- rows: commit.rows,
222
- columns: commit.columns,
223
- cells: commit.inputs.map((input) =>
224
- spreadsheetCellInput(input, input.startsWith("=") ? "formula" : "value"),
225
- ),
226
- },
227
- ],
228
- });
294
+ await submissions.run(() =>
295
+ session.applySpreadsheetCommands({
296
+ version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,
297
+ commands: [
298
+ {
299
+ kind: "cells.set",
300
+ sheet: generation,
301
+ anchor: { row: commit.anchor.row, column: commit.anchor.col },
302
+ rows: commit.rows,
303
+ columns: commit.columns,
304
+ cells: commit.inputs.map((input) =>
305
+ spreadsheetCellInput(input, input.startsWith("=") ? "formula" : "value"),
306
+ ),
307
+ },
308
+ ],
309
+ }),
310
+ );
311
+ },
312
+ [authoringLifetime, generation, session, submissions],
313
+ );
314
+ const handleResize = useCallback(
315
+ async (change: SpreadsheetDimensionCommit) => {
316
+ const lifetime = requireSpreadsheetAuthoringLifetime(authoringLifetime);
317
+ if (!generation) throw new Error("This sheet generation is not writable yet");
318
+ await submissions.run(() =>
319
+ session.applySpreadsheetCommands({
320
+ version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,
321
+ commands: [
322
+ change.axis === "column"
323
+ ? {
324
+ kind: "column.width.set",
325
+ sheet: generation,
326
+ column: change.index,
327
+ width: change.size === sheet.defaultColumnWidth ? null : change.size,
328
+ }
329
+ : {
330
+ kind: "row.height.set",
331
+ sheet: generation,
332
+ row: change.index,
333
+ height: change.size === sheet.defaultRowHeight ? null : change.size,
334
+ },
335
+ ],
336
+ }),
337
+ );
338
+ if (authoringLifetime.current === lifetime) onResize?.(change);
229
339
  },
230
- [generation, session],
340
+ [
341
+ authoringLifetime,
342
+ generation,
343
+ onResize,
344
+ session,
345
+ sheet.defaultColumnWidth,
346
+ sheet.defaultRowHeight,
347
+ submissions,
348
+ ],
231
349
  );
232
350
 
233
351
  const handleSelection = useCallback(
@@ -239,6 +357,7 @@ export function EditableSpreadsheetGrid({
239
357
  setState((current) => {
240
358
  if (queryContains(current.query, selection.focus.row, selection.focus.col)) return current;
241
359
  return {
360
+ ...current,
242
361
  query: boundedViewportQuery(
243
362
  sheet.sheetId,
244
363
  selection.focus.row,
@@ -271,15 +390,22 @@ export function EditableSpreadsheetGrid({
271
390
  activeCellRef.current,
272
391
  );
273
392
  setState((current) =>
274
- sameViewportQuery(current.query, next)
275
- ? current
276
- : { query: next, projection: current.projection, error: null },
393
+ sameViewportQuery(current.query, next) ? current : { ...current, query: next, error: null },
277
394
  );
278
395
  onViewportChange?.(viewport);
279
396
  },
280
397
  [columnCount, onViewportChange, rowCount, sheet.sheetId],
281
398
  );
282
399
 
400
+ if (editableArtifactAccessRevoked(view)) {
401
+ return (
402
+ <EditableArtifactMessage
403
+ title="Spreadsheet unavailable"
404
+ detail="You no longer have access to this artifact"
405
+ />
406
+ );
407
+ }
408
+
283
409
  return (
284
410
  <div className={cn("relative h-full min-h-0", className)}>
285
411
  <SpreadsheetProjectionGrid
@@ -291,10 +417,14 @@ export function EditableSpreadsheetGrid({
291
417
  commit={editable ? handleCommit : undefined}
292
418
  commitRange={editable ? handleCommitRange : undefined}
293
419
  clear={editable ? handleClear : undefined}
420
+ resize={resizable ? handleResize : undefined}
421
+ pendingTransactions={view.pendingTransactions}
422
+ syncStatus={syncStatus}
423
+ syncError={syncError}
294
424
  onCommandError={onCommandError}
295
425
  onViewportChange={handleViewport}
296
426
  />
297
- {state.error ? (
427
+ {state.error && state.session === session && state.generationId === sheet.generationId ? (
298
428
  <output
299
429
  role="status"
300
430
  className="pointer-events-none absolute bottom-2 left-2 z-50 rounded-og-sm border border-og-status-failed/30 bg-og-surface-1/95 px-2 py-1 text-og-xs text-og-status-failed shadow-og-sm"
@@ -308,16 +438,28 @@ export function EditableSpreadsheetGrid({
308
438
  }
309
439
 
310
440
  /** Artifact chrome, sheet navigation, and one Worker-backed spreadsheet grid. */
311
- export function EditableSpreadsheetArtifactSurface({
441
+ export function EditableSpreadsheetArtifactSurface(props: EditableSpreadsheetArtifactSurfaceProps) {
442
+ return (
443
+ <SpreadsheetSubmissionProvider key={spreadsheetSessionKey(props.session)}>
444
+ <EditableSpreadsheetArtifactSurfaceSession {...props} />
445
+ </SpreadsheetSubmissionProvider>
446
+ );
447
+ }
448
+
449
+ function EditableSpreadsheetArtifactSurfaceSession({
312
450
  session,
313
451
  title = "Workbook",
452
+ showHeader,
314
453
  subtitle,
315
454
  actions,
455
+ download,
316
456
  initialSheetId,
317
457
  allowAddSheet = true,
318
458
  readOnly = false,
319
459
  ...gridProps
320
460
  }: EditableSpreadsheetArtifactSurfaceProps) {
461
+ const authoringLifetime = useSpreadsheetAuthoringLifetime();
462
+ const submissions = useSpreadsheetSubmissions();
321
463
  const { metadata, error: metadataError } = useSpreadsheetMetadata(session);
322
464
  const view = useEditableArtifactView(session);
323
465
  const [activeSheetId, setActiveSheetId] = useState<string | null>(initialSheetId ?? null);
@@ -329,26 +471,29 @@ export function EditableSpreadsheetArtifactSurface({
329
471
  (initialSheetId ? sheets.find((sheet) => sheet.sheetId === initialSheetId) : undefined) ??
330
472
  sheets[0] ??
331
473
  null;
332
- const writable = !readOnly && view.writable;
474
+ const writable = !readOnly && view.writable && !view.authoringBlockedReason;
333
475
  const accessRevoked = editableArtifactAccessRevoked(view);
334
476
 
335
477
  const addSheet = useCallback(async () => {
336
478
  if (!writable || creatingSheet) return;
479
+ const lifetime = requireSpreadsheetAuthoringLifetime(authoringLifetime);
337
480
  setCreatingSheet(true);
338
481
  setSurfaceError(null);
339
482
  try {
340
483
  const after = activeSheet ? sheetGeneration(activeSheet) : null;
341
- const created = await session.createSpreadsheetSheet({
342
- name: nextAvailableSheetName(sheets),
343
- after,
344
- });
345
- setActiveSheetId(created.sheetId);
484
+ const created = await submissions.run(() =>
485
+ session.createSpreadsheetSheet({
486
+ name: nextAvailableSheetName(sheets),
487
+ after,
488
+ }),
489
+ );
490
+ if (authoringLifetime.current === lifetime) setActiveSheetId(created.sheetId);
346
491
  } catch (cause) {
347
- setSurfaceError(asError(cause));
492
+ if (authoringLifetime.current === lifetime) setSurfaceError(asError(cause));
348
493
  } finally {
349
- setCreatingSheet(false);
494
+ if (authoringLifetime.current === lifetime) setCreatingSheet(false);
350
495
  }
351
- }, [activeSheet, creatingSheet, session, sheets, writable]);
496
+ }, [activeSheet, authoringLifetime, creatingSheet, session, sheets, submissions, writable]);
352
497
 
353
498
  const footer = (
354
499
  <div
@@ -357,21 +502,16 @@ export function EditableSpreadsheetArtifactSurface({
357
502
  aria-label="Worksheets"
358
503
  >
359
504
  {sheets.map((sheet) => (
360
- <button
505
+ <EditableWorksheetTab
361
506
  key={`${sheet.sheetId}:${sheet.generationId ?? "pending"}`}
362
- type="button"
363
- role="tab"
364
- aria-selected={sheet.sheetId === activeSheet?.sheetId}
365
- onClick={() => setActiveSheetId(sheet.sheetId)}
366
- className={cn(
367
- "h-7 shrink-0 rounded-og-sm px-2.5 text-og-sm outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent",
368
- sheet.sheetId === activeSheet?.sheetId
369
- ? "bg-og-surface-3 font-medium text-og-fg"
370
- : "text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg",
371
- )}
372
- >
373
- {sheet.name}
374
- </button>
507
+ session={session}
508
+ sheet={sheet}
509
+ sheets={sheets}
510
+ selected={sheet.sheetId === activeSheet?.sheetId}
511
+ writable={writable}
512
+ onSelect={() => setActiveSheetId(sheet.sheetId)}
513
+ onCommandError={gridProps.onCommandError}
514
+ />
375
515
  ))}
376
516
  {writable && allowAddSheet ? (
377
517
  <button
@@ -392,6 +532,7 @@ export function EditableSpreadsheetArtifactSurface({
392
532
  <ArtifactSurface
393
533
  modality="spreadsheet"
394
534
  title={title}
535
+ showHeader={showHeader}
395
536
  subtitle={
396
537
  subtitle ??
397
538
  (accessRevoked
@@ -400,7 +541,16 @@ export function EditableSpreadsheetArtifactSurface({
400
541
  ? `${sheets.length} sheet${sheets.length === 1 ? "" : "s"}`
401
542
  : editableArtifactStatusLabel(view))
402
543
  }
403
- actions={actions}
544
+ actions={
545
+ download ? (
546
+ <>
547
+ {actions}
548
+ <SpreadsheetDownloadButton session={session} title={title} download={download} />
549
+ </>
550
+ ) : (
551
+ actions
552
+ )
553
+ }
404
554
  footer={accessRevoked ? undefined : footer}
405
555
  busy={!accessRevoked && !metadata && !error}
406
556
  >
@@ -429,7 +579,7 @@ export function EditableSpreadsheetArtifactSurface({
429
579
  type="button"
430
580
  onClick={() => void addSheet()}
431
581
  disabled={creatingSheet}
432
- className="mt-3 rounded-og-sm bg-og-accent-deep px-3 py-1.5 text-og-sm font-medium text-og-accent-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50"
582
+ className="mt-3 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-3 py-1.5 text-og-sm font-medium hover:bg-og-primary-hover outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50"
433
583
  >
434
584
  {creatingSheet ? "Adding…" : "Add worksheet"}
435
585
  </button>
@@ -446,22 +596,303 @@ export function EditableSpreadsheetArtifactSurface({
446
596
  );
447
597
  }
448
598
 
599
+ /** Inline authoring state only; the tab label always comes from canonical metadata. */
600
+ function EditableWorksheetTab({
601
+ session,
602
+ sheet,
603
+ sheets,
604
+ selected,
605
+ writable,
606
+ onSelect,
607
+ onCommandError,
608
+ }: {
609
+ session: EditableArtifactSession;
610
+ sheet: EditableSpreadsheetSheetMetadata;
611
+ sheets: readonly EditableSpreadsheetSheetMetadata[];
612
+ selected: boolean;
613
+ writable: boolean;
614
+ onSelect: () => void;
615
+ onCommandError?: ((error: Error) => void) | undefined;
616
+ }) {
617
+ const submissions = useSpreadsheetSubmissions();
618
+ const [editing, setEditing] = useState(false);
619
+ const [name, setName] = useState(sheet.name);
620
+ const [saving, setSaving] = useState(false);
621
+ const [accepted, setAccepted] = useState(false);
622
+ const [error, setError] = useState<string | null>(null);
623
+ const inputRef = useRef<HTMLInputElement>(null);
624
+ const tabRef = useRef<HTMLButtonElement>(null);
625
+ const busyRef = useRef(false);
626
+ const mountedRef = useRef(true);
627
+ const latestRef = useRef({ session, sheet, writable });
628
+ latestRef.current = { session, sheet, writable };
629
+ const errorId = useId();
630
+ const canRename = writable && sheet.generationId !== null;
631
+ const scopeRef = useRef({
632
+ session,
633
+ sheetId: sheet.sheetId,
634
+ generationId: sheet.generationId,
635
+ canRename,
636
+ });
637
+ if (
638
+ scopeRef.current.session !== session ||
639
+ scopeRef.current.sheetId !== sheet.sheetId ||
640
+ scopeRef.current.generationId !== sheet.generationId ||
641
+ scopeRef.current.canRename !== canRename
642
+ ) {
643
+ scopeRef.current = {
644
+ session,
645
+ sheetId: sheet.sheetId,
646
+ generationId: sheet.generationId,
647
+ canRename,
648
+ };
649
+ }
650
+
651
+ useEffect(() => {
652
+ mountedRef.current = true;
653
+ return () => {
654
+ mountedRef.current = false;
655
+ };
656
+ }, []);
657
+ useEffect(() => {
658
+ setEditing(false);
659
+ setSaving(false);
660
+ setAccepted(false);
661
+ setError(null);
662
+ busyRef.current = false;
663
+ }, [session, sheet.generationId, sheet.sheetId, canRename]);
664
+ useEffect(() => {
665
+ if (!editing) return;
666
+ inputRef.current?.focus();
667
+ inputRef.current?.select();
668
+ }, [editing]);
669
+ useEffect(() => {
670
+ if (!accepted || !editing || sheet.name !== name) return;
671
+ const restoreFocus =
672
+ document.activeElement === document.body || document.activeElement === inputRef.current;
673
+ setEditing(false);
674
+ setSaving(false);
675
+ setAccepted(false);
676
+ busyRef.current = false;
677
+ if (restoreFocus) queueMicrotask(() => tabRef.current?.focus({ preventScroll: true }));
678
+ }, [accepted, editing, name, sheet.name]);
679
+
680
+ const start = () => {
681
+ if (!canRename || busyRef.current) return;
682
+ onSelect();
683
+ setName(sheet.name);
684
+ setError(null);
685
+ setAccepted(false);
686
+ setEditing(true);
687
+ };
688
+ const cancel = () => {
689
+ if (busyRef.current) return;
690
+ setEditing(false);
691
+ setError(null);
692
+ queueMicrotask(() => tabRef.current?.focus({ preventScroll: true }));
693
+ };
694
+ const rename = async () => {
695
+ if (!canRename || busyRef.current) return;
696
+ const generation = sheetGeneration(sheet);
697
+ if (!generation) return;
698
+ const next = name.trim();
699
+ if (!next || next.length > 31 || /[\\/?*[\]:\0]/u.test(next)) {
700
+ setError("Use 1–31 characters without \\ / ? * [ ] :.");
701
+ return;
702
+ }
703
+ if (sheets.some((other) => other.sheetId !== sheet.sheetId && other.name === next)) {
704
+ setError("A worksheet already has this name.");
705
+ return;
706
+ }
707
+ if (next === sheet.name) {
708
+ cancel();
709
+ return;
710
+ }
711
+ setName(next);
712
+ setError(null);
713
+ setSaving(true);
714
+ busyRef.current = true;
715
+ const scope = scopeRef.current;
716
+ const current = () =>
717
+ mountedRef.current && scopeRef.current === scope && latestRef.current.writable;
718
+ try {
719
+ await submissions.run(() =>
720
+ session.applySpreadsheetCommands({
721
+ version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,
722
+ commands: [{ kind: "sheet.rename", sheet: generation, name: next }],
723
+ }),
724
+ );
725
+ if (current()) setAccepted(true);
726
+ } catch (cause) {
727
+ if (!current()) return;
728
+ const failure = asError(cause);
729
+ busyRef.current = false;
730
+ setSaving(false);
731
+ setError(failure.message || "Could not rename worksheet. Try again.");
732
+ onCommandError?.(failure);
733
+ queueMicrotask(() => inputRef.current?.focus());
734
+ }
735
+ };
736
+
737
+ const tab = (
738
+ <button
739
+ ref={tabRef}
740
+ type="button"
741
+ role="tab"
742
+ tabIndex={editing && canRename ? -1 : undefined}
743
+ aria-selected={selected}
744
+ aria-keyshortcuts={canRename ? "F2" : undefined}
745
+ title={canRename ? "Double-click or press F2 to rename" : undefined}
746
+ onClick={onSelect}
747
+ onDoubleClick={start}
748
+ onKeyDown={(event) => {
749
+ if (event.key === "F2") {
750
+ event.preventDefault();
751
+ start();
752
+ }
753
+ }}
754
+ className={cn(
755
+ "h-7 shrink-0 rounded-og-sm px-2.5 text-og-sm outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent",
756
+ selected
757
+ ? "bg-og-surface-3 font-medium text-og-fg"
758
+ : "text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg",
759
+ )}
760
+ >
761
+ {sheet.name}
762
+ </button>
763
+ );
764
+
765
+ return editing && canRename ? (
766
+ <>
767
+ <span className="sr-only">{tab}</span>
768
+ <form
769
+ className="flex min-w-0 flex-wrap items-center gap-1 py-1"
770
+ style={{ width: "min(18rem, 100%)" }}
771
+ onSubmit={(event) => {
772
+ event.preventDefault();
773
+ void rename();
774
+ }}
775
+ >
776
+ <input
777
+ ref={inputRef}
778
+ aria-label="Worksheet name"
779
+ aria-invalid={error ? "true" : undefined}
780
+ aria-describedby={error ? errorId : undefined}
781
+ disabled={saving}
782
+ value={name}
783
+ onInput={(event) => {
784
+ setName(event.currentTarget.value);
785
+ setError(null);
786
+ }}
787
+ onKeyDown={(event) => {
788
+ if (event.nativeEvent.isComposing || event.keyCode === 229) return;
789
+ if (event.key === "Escape") {
790
+ event.preventDefault();
791
+ cancel();
792
+ }
793
+ if (event.key === "Enter") {
794
+ event.preventDefault();
795
+ void rename();
796
+ }
797
+ }}
798
+ className="h-7 w-40 rounded-og-sm border border-og-border bg-og-surface-1 px-2 text-og-sm text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50"
799
+ />
800
+ {saving ? (
801
+ <span role="status" className="text-og-xs text-og-fg-muted">
802
+ Renaming…
803
+ </span>
804
+ ) : (
805
+ <>
806
+ <button
807
+ type="submit"
808
+ className="rounded-og-sm px-2 py-1 text-og-xs text-og-fg outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent"
809
+ >
810
+ Save
811
+ </button>
812
+ <button
813
+ type="button"
814
+ onClick={cancel}
815
+ className="rounded-og-sm px-2 py-1 text-og-xs text-og-fg-muted outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent"
816
+ >
817
+ Cancel
818
+ </button>
819
+ </>
820
+ )}
821
+ {error ? (
822
+ <span
823
+ id={errorId}
824
+ role="alert"
825
+ className="text-og-xs text-og-status-failed"
826
+ style={{ flexBasis: "100%", overflowWrap: "anywhere" }}
827
+ >
828
+ {error}
829
+ </span>
830
+ ) : null}
831
+ </form>
832
+ </>
833
+ ) : (
834
+ tab
835
+ );
836
+ }
837
+
838
+ function spreadsheetSessionKey(session: EditableArtifactSession): number {
839
+ let key = SESSION_KEYS.get(session);
840
+ if (key === undefined) {
841
+ key = ++nextSessionKey;
842
+ SESSION_KEYS.set(session, key);
843
+ }
844
+ return key;
845
+ }
846
+
847
+ function useSpreadsheetAuthoringLifetime() {
848
+ const lifetime = useRef<object | null>({});
849
+ useClientLayoutEffect(() => {
850
+ lifetime.current = {};
851
+ return () => {
852
+ lifetime.current = null;
853
+ };
854
+ }, []);
855
+ return lifetime;
856
+ }
857
+
858
+ function requireSpreadsheetAuthoringLifetime(lifetime: { current: object | null }): object {
859
+ if (!lifetime.current) throw new Error("Spreadsheet authoring session changed");
860
+ return lifetime.current;
861
+ }
862
+
449
863
  function useSpreadsheetMetadata(session: EditableArtifactSession): {
450
864
  metadata: EditableSpreadsheetMetadataProjection | null;
451
865
  error: Error | null;
452
866
  } {
453
867
  const [state, setState] = useState<{
868
+ session: EditableArtifactSession;
454
869
  metadata: EditableSpreadsheetMetadataProjection | null;
455
870
  error: Error | null;
456
- }>({ metadata: null, error: null });
457
- useEffect(
458
- () =>
459
- session.subscribeSpreadsheetMetadata({}, (metadata) => setState({ metadata, error: null }), {
460
- onError: (error) => setState((current) => ({ ...current, error })),
461
- }),
462
- [session],
463
- );
464
- return state;
871
+ }>({ session, metadata: null, error: null });
872
+ useEffect(() => {
873
+ let active = true;
874
+ const unsubscribe = session.subscribeSpreadsheetMetadata(
875
+ {},
876
+ (metadata) => {
877
+ if (active) setState({ session, metadata, error: null });
878
+ },
879
+ {
880
+ onError: (error) => {
881
+ if (active)
882
+ setState((current) =>
883
+ current.session === session
884
+ ? { ...current, error }
885
+ : { session, metadata: null, error },
886
+ );
887
+ },
888
+ },
889
+ );
890
+ return () => {
891
+ active = false;
892
+ unsubscribe();
893
+ };
894
+ }, [session]);
895
+ return state.session === session ? state : { metadata: null, error: null };
465
896
  }
466
897
 
467
898
  function projectSdkViewport(
@@ -472,7 +903,12 @@ function projectSdkViewport(
472
903
  rowCount: number,
473
904
  columnCount: number,
474
905
  ): SpreadsheetGridProjection {
475
- const current = viewport && sameViewport(viewport, query) ? viewport : null;
906
+ // Keep the last valid bounded coverage while a resize/scroll query is replaced.
907
+ // Never carry cells across a session, sheet, or generation boundary.
908
+ const current =
909
+ viewport && viewport.sheetId === sheet.sheetId && viewport.generationId === sheet.generationId
910
+ ? viewport
911
+ : null;
476
912
  const projectedCells = (current?.cells ?? []).map((cell) => ({
477
913
  row: cell.row,
478
914
  col: cell.column,
@@ -489,8 +925,12 @@ function projectSdkViewport(
489
925
  sheetId: sheet.sheetId,
490
926
  sheetName: sheet.name,
491
927
  generationId: current?.generationId ?? sheet.generationId,
492
- revision: `${metadataRevision}:${current?.revision ?? "loading"}`,
928
+ revision: current?.revision.toString() ?? "loading",
493
929
  dimensionRevision: metadataRevision.toString(),
930
+ defaultRowHeight: sheet.defaultRowHeight,
931
+ defaultColumnWidth: sheet.defaultColumnWidth,
932
+ rowHeights: sheet.rowHeights,
933
+ columnWidths: sheet.columnWidths,
494
934
  rowCount,
495
935
  columnCount,
496
936
  usedRange: used