@opengeni/react 3.1.0 → 3.1.3-canary.38890816741001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +89 -11
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/approvals.d.ts +2 -1
  5. package/dist/artifacts-document.js +5 -3
  6. package/dist/artifacts-presentation.js +5 -3
  7. package/dist/artifacts-spreadsheet.d.ts +1 -1
  8. package/dist/artifacts-spreadsheet.js +5 -3
  9. package/dist/artifacts.d.ts +5 -1
  10. package/dist/artifacts.js +536 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
  16. package/dist/chunk-2DDJ6YH6.js +41 -0
  17. package/dist/chunk-2DDJ6YH6.js.map +1 -0
  18. package/dist/chunk-2HVLQ26H.js +183 -0
  19. package/dist/chunk-2HVLQ26H.js.map +1 -0
  20. package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
  23. package/dist/chunk-2SFFYIH3.js.map +1 -0
  24. package/dist/chunk-3PVDYTTB.js +24 -0
  25. package/dist/chunk-3PVDYTTB.js.map +1 -0
  26. package/dist/chunk-3UZCWK46.js +298 -0
  27. package/dist/chunk-3UZCWK46.js.map +1 -0
  28. package/dist/chunk-47CKUXTW.js +293 -0
  29. package/dist/chunk-47CKUXTW.js.map +1 -0
  30. package/dist/chunk-4QYP6QUI.js +109 -0
  31. package/dist/chunk-4QYP6QUI.js.map +1 -0
  32. package/dist/chunk-5EY26VZ7.js +1053 -0
  33. package/dist/chunk-5EY26VZ7.js.map +1 -0
  34. package/dist/chunk-5I4VRWBB.js +56 -0
  35. package/dist/chunk-5I4VRWBB.js.map +1 -0
  36. package/dist/chunk-5WOR7UCL.js +191 -0
  37. package/dist/chunk-5WOR7UCL.js.map +1 -0
  38. package/dist/chunk-5YJLGOM5.js +51 -0
  39. package/dist/chunk-5YJLGOM5.js.map +1 -0
  40. package/dist/chunk-6JFN3OWG.js +386 -0
  41. package/dist/chunk-6JFN3OWG.js.map +1 -0
  42. package/dist/chunk-7QJT5O4S.js +35 -0
  43. package/dist/chunk-7QJT5O4S.js.map +1 -0
  44. package/dist/chunk-A55KV72M.js +402 -0
  45. package/dist/chunk-A55KV72M.js.map +1 -0
  46. package/dist/chunk-ADWCLI4G.js +2028 -0
  47. package/dist/chunk-ADWCLI4G.js.map +1 -0
  48. package/dist/chunk-B27E3V37.js +29 -0
  49. package/dist/chunk-B27E3V37.js.map +1 -0
  50. package/dist/chunk-B7TC2A33.js +83 -0
  51. package/dist/chunk-B7TC2A33.js.map +1 -0
  52. package/dist/chunk-BLL56F7R.js +385 -0
  53. package/dist/chunk-BLL56F7R.js.map +1 -0
  54. package/dist/chunk-BOFEQC6K.js +162 -0
  55. package/dist/chunk-BOFEQC6K.js.map +1 -0
  56. package/dist/chunk-CM7LVUKC.js +35 -0
  57. package/dist/chunk-CM7LVUKC.js.map +1 -0
  58. package/dist/chunk-CORUP6JB.js +122 -0
  59. package/dist/chunk-CORUP6JB.js.map +1 -0
  60. package/dist/chunk-CSX5FFKZ.js +35 -0
  61. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  62. package/dist/chunk-EGVHJKGJ.js +3125 -0
  63. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  64. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  65. package/dist/chunk-G76LSA76.js.map +1 -0
  66. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  67. package/dist/chunk-GQMRL52F.js.map +1 -0
  68. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  69. package/dist/chunk-GUUXOISA.js.map +1 -0
  70. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  71. package/dist/chunk-I7X2P4FU.js.map +1 -0
  72. package/dist/chunk-IGFZFLI2.js +1390 -0
  73. package/dist/chunk-IGFZFLI2.js.map +1 -0
  74. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  75. package/dist/chunk-IMSUVYQB.js.map +1 -0
  76. package/dist/chunk-IOYHDEP3.js +38 -0
  77. package/dist/chunk-IOYHDEP3.js.map +1 -0
  78. package/dist/chunk-IZV5FTJC.js +55 -0
  79. package/dist/chunk-IZV5FTJC.js.map +1 -0
  80. package/dist/chunk-KF33GTWN.js +343 -0
  81. package/dist/chunk-KF33GTWN.js.map +1 -0
  82. package/dist/chunk-KSGQ5ODA.js +457 -0
  83. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  84. package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
  85. package/dist/chunk-KZC6QRNR.js.map +1 -0
  86. package/dist/chunk-LJUMYUBO.js +218 -0
  87. package/dist/chunk-LJUMYUBO.js.map +1 -0
  88. package/dist/chunk-LSW2OJVV.js +380 -0
  89. package/dist/chunk-LSW2OJVV.js.map +1 -0
  90. package/dist/chunk-M357MHH3.js +2 -0
  91. package/dist/chunk-M357MHH3.js.map +1 -0
  92. package/dist/chunk-MK2TQO4Y.js +24 -0
  93. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  94. package/dist/chunk-N7S72EXK.js +25 -0
  95. package/dist/chunk-N7S72EXK.js.map +1 -0
  96. package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
  97. package/dist/chunk-NKMYZFHA.js.map +1 -0
  98. package/dist/chunk-NX4ADH73.js +14 -0
  99. package/dist/chunk-NX4ADH73.js.map +1 -0
  100. package/dist/chunk-O7F6UJO4.js +71 -0
  101. package/dist/chunk-O7F6UJO4.js.map +1 -0
  102. package/dist/chunk-OVB5WIG5.js +14064 -0
  103. package/dist/chunk-OVB5WIG5.js.map +1 -0
  104. package/dist/chunk-OYQQJL3J.js +16 -0
  105. package/dist/chunk-OYQQJL3J.js.map +1 -0
  106. package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
  107. package/dist/chunk-P4BNUO57.js.map +1 -0
  108. package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
  109. package/dist/chunk-PEHTX3V7.js.map +1 -0
  110. package/dist/chunk-PMV53IMM.js +26 -0
  111. package/dist/chunk-PMV53IMM.js.map +1 -0
  112. package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
  113. package/dist/chunk-PYEOPA4M.js.map +1 -0
  114. package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
  115. package/dist/chunk-QHUE7E4N.js.map +1 -0
  116. package/dist/chunk-QV3DJVRZ.js +11 -0
  117. package/dist/chunk-QV3DJVRZ.js.map +1 -0
  118. package/dist/chunk-R5SBNG7S.js +810 -0
  119. package/dist/chunk-R5SBNG7S.js.map +1 -0
  120. package/dist/chunk-RI42H5IU.js +326 -0
  121. package/dist/chunk-RI42H5IU.js.map +1 -0
  122. package/dist/chunk-S2QH6EZ5.js +211 -0
  123. package/dist/chunk-S2QH6EZ5.js.map +1 -0
  124. package/dist/chunk-SHLZMAJN.js +304 -0
  125. package/dist/chunk-SHLZMAJN.js.map +1 -0
  126. package/dist/chunk-TGXK4BAZ.js +293 -0
  127. package/dist/chunk-TGXK4BAZ.js.map +1 -0
  128. package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
  129. package/dist/chunk-TNEZNMSN.js.map +1 -0
  130. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  131. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  132. package/dist/chunk-UNJPZGNK.js +63 -0
  133. package/dist/chunk-UNJPZGNK.js.map +1 -0
  134. package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-VIUEOHXY.js +394 -0
  137. package/dist/chunk-VIUEOHXY.js.map +1 -0
  138. package/dist/chunk-WIUKB3LD.js +1911 -0
  139. package/dist/chunk-WIUKB3LD.js.map +1 -0
  140. package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
  141. package/dist/chunk-WNN7NO2N.js.map +1 -0
  142. package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
  143. package/dist/chunk-X5UVUIMF.js.map +1 -0
  144. package/dist/chunk-XDA5QJE7.js +402 -0
  145. package/dist/chunk-XDA5QJE7.js.map +1 -0
  146. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  147. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  148. package/dist/chunk-XHF7OYAN.js +1150 -0
  149. package/dist/chunk-XHF7OYAN.js.map +1 -0
  150. package/dist/chunk-YSRBFJMQ.js +43 -0
  151. package/dist/chunk-YSRBFJMQ.js.map +1 -0
  152. package/dist/chunk-ZOZAPAUO.js +174 -0
  153. package/dist/chunk-ZOZAPAUO.js.map +1 -0
  154. package/dist/chunk-ZQV5W7YC.js +809 -0
  155. package/dist/chunk-ZQV5W7YC.js.map +1 -0
  156. package/dist/chunk-ZUWF4NF7.js +13 -0
  157. package/dist/chunk-ZUWF4NF7.js.map +1 -0
  158. package/dist/client.d.ts +16 -7
  159. package/dist/clipboard.js +3 -1
  160. package/dist/commands/types.d.ts +2 -0
  161. package/dist/components/anthropic-mark.d.ts +3 -0
  162. package/dist/components/approval-surface.d.ts +19 -6
  163. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  164. package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
  165. package/dist/components/artifacts/artifact-surface.d.ts +4 -2
  166. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  167. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  168. package/dist/components/artifacts/document-editor.d.ts +4 -2
  169. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  170. package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
  171. package/dist/components/artifacts/editable-document.d.ts +1 -1
  172. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  173. package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
  174. package/dist/components/artifacts/index.d.ts +9 -2
  175. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  176. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  177. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  178. package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
  179. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  180. package/dist/components/artifacts/site-view.d.ts +26 -0
  181. package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
  182. package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
  183. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  184. package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
  185. package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
  186. package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
  187. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  188. package/dist/components/browser-select-control.d.ts +16 -0
  189. package/dist/components/browser-viewer.d.ts +11 -2
  190. package/dist/components/chat-composer.d.ts +21 -3
  191. package/dist/components/child-session-link.d.ts +9 -0
  192. package/dist/components/claude-mark.d.ts +3 -0
  193. package/dist/components/code-editor.d.ts +1 -4
  194. package/dist/components/composer-transcription-control.d.ts +7 -0
  195. package/dist/components/composer.d.ts +34 -67
  196. package/dist/components/computer-viewer.d.ts +1 -1
  197. package/dist/components/copy-button.d.ts +3 -1
  198. package/dist/components/desktop-viewer.d.ts +1 -1
  199. package/dist/components/fleet-tile.d.ts +2 -2
  200. package/dist/components/grok-mark.d.ts +26 -0
  201. package/dist/components/human-input-form.d.ts +28 -32
  202. package/dist/components/human-input-surface.d.ts +7 -2
  203. package/dist/components/linkified-text.d.ts +18 -0
  204. package/dist/components/machine-input-display.d.ts +22 -1
  205. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  206. package/dist/components/machines/machine-detail.d.ts +7 -1
  207. package/dist/components/machines/machine-status.d.ts +48 -0
  208. package/dist/components/markdown-table-layout.d.ts +18 -0
  209. package/dist/components/markdown.d.ts +37 -4
  210. package/dist/components/message-timeline.d.ts +86 -7
  211. package/dist/components/model-mark.d.ts +29 -0
  212. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  213. package/dist/components/model-policy-picker.d.ts +41 -25
  214. package/dist/components/new-conversation.d.ts +32 -0
  215. package/dist/components/open-geni-chat.d.ts +73 -0
  216. package/dist/components/open-geni-links.d.ts +68 -0
  217. package/dist/components/openrouter-mark.d.ts +6 -0
  218. package/dist/components/opper-mark.d.ts +7 -0
  219. package/dist/components/preview-loading.d.ts +2 -0
  220. package/dist/components/provider-recovery-notice.d.ts +16 -0
  221. package/dist/components/queue-item-content.d.ts +9 -0
  222. package/dist/components/rehype-secret-refs.d.ts +23 -0
  223. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  224. package/dist/components/sandbox-files.d.ts +3 -1
  225. package/dist/components/sandbox-workspace.d.ts +18 -0
  226. package/dist/components/secret-question-field.d.ts +31 -0
  227. package/dist/components/secret-ref-chip.d.ts +35 -0
  228. package/dist/components/session-capability-frame.d.ts +37 -0
  229. package/dist/components/session-chrome.d.ts +57 -8
  230. package/dist/components/session-commands-panel.d.ts +6 -0
  231. package/dist/components/session-commands.d.ts +6 -0
  232. package/dist/components/session-connection-request.d.ts +8 -0
  233. package/dist/components/session-conversation.d.ts +157 -0
  234. package/dist/components/session-list.d.ts +39 -0
  235. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  236. package/dist/components/session-proxy-scope.d.ts +35 -0
  237. package/dist/components/session-status.d.ts +4 -1
  238. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  239. package/dist/components/timeline-anchor.d.ts +24 -0
  240. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  241. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  242. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  243. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  244. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  245. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  246. package/dist/components/timeline-annotations.d.ts +13 -3
  247. package/dist/components/timeline-reading-progress.d.ts +11 -0
  248. package/dist/components/timeline-search.d.ts +34 -0
  249. package/dist/components/timeline-settlement.d.ts +16 -0
  250. package/dist/components/tip-follow.d.ts +16 -0
  251. package/dist/components/tool-action-review.d.ts +47 -0
  252. package/dist/components/tool-review-history.d.ts +25 -0
  253. package/dist/components/usage-limit-notice.d.ts +49 -0
  254. package/dist/components/usage-member-list.d.ts +91 -0
  255. package/dist/components/usage-meter.d.ts +73 -0
  256. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  257. package/dist/components/user-message-body.d.ts +10 -1
  258. package/dist/composer-messages.d.ts +74 -0
  259. package/dist/composer-messages.js +9 -0
  260. package/dist/composer-messages.js.map +1 -0
  261. package/dist/composer-voice-events.d.ts +8 -0
  262. package/dist/composer.d.ts +5 -4
  263. package/dist/composer.js +26 -13
  264. package/dist/computer-viewer-GMLDXPON.js +20 -0
  265. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  266. package/dist/connect-account-identity.d.ts +8 -0
  267. package/dist/connect-accounts.d.ts +15 -0
  268. package/dist/connect-chooser.d.ts +18 -0
  269. package/dist/connect-panel.d.ts +18 -0
  270. package/dist/connect-setup.d.ts +18 -0
  271. package/dist/connect.d.ts +21 -0
  272. package/dist/connect.js +2149 -0
  273. package/dist/connect.js.map +1 -0
  274. package/dist/connection-catalog.d.ts +38 -0
  275. package/dist/connection-discovery.d.ts +12 -0
  276. package/dist/connection-installed.d.ts +17 -0
  277. package/dist/connection-logo.d.ts +9 -0
  278. package/dist/connection-service-logo.d.ts +8 -0
  279. package/dist/connection-service-presentation.d.ts +13 -0
  280. package/dist/connection-skeleton.d.ts +5 -0
  281. package/dist/connection-type-picker.d.ts +6 -0
  282. package/dist/conversation-timeline.d.ts +5 -0
  283. package/dist/desktop.d.ts +7 -0
  284. package/dist/desktop.js +27 -0
  285. package/dist/desktop.js.map +1 -0
  286. package/dist/device-authorization.d.ts +23 -0
  287. package/dist/diffs.d.ts +8 -0
  288. package/dist/diffs.js +15 -0
  289. package/dist/diffs.js.map +1 -0
  290. package/dist/discovery-cache.d.ts +5 -0
  291. package/dist/editor.d.ts +7 -0
  292. package/dist/editor.js +22 -0
  293. package/dist/editor.js.map +1 -0
  294. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  295. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  296. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  297. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  298. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  299. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  300. package/dist/hooks/latest-question.d.ts +25 -0
  301. package/dist/hooks/shared-machines-list.d.ts +4 -0
  302. package/dist/hooks/shared-query.d.ts +113 -0
  303. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  304. package/dist/hooks/use-auth-runs.d.ts +1 -4
  305. package/dist/hooks/use-available-models.d.ts +1 -1
  306. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  307. package/dist/hooks/use-browser-session.d.ts +12 -1
  308. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  309. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  310. package/dist/hooks/use-composer.d.ts +24 -2
  311. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  312. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  313. package/dist/hooks/use-computer-session.d.ts +4 -0
  314. package/dist/hooks/use-connect.d.ts +23 -0
  315. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  316. package/dist/hooks/use-file-attachments.d.ts +12 -0
  317. package/dist/hooks/use-goal.d.ts +2 -1
  318. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  319. package/dist/hooks/use-new-conversation.d.ts +56 -0
  320. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  321. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  322. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  323. package/dist/hooks/use-session-conversation.d.ts +49 -0
  324. package/dist/hooks/use-session-events.d.ts +28 -7
  325. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  326. package/dist/hooks/use-session-model-account.d.ts +48 -0
  327. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  328. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  329. package/dist/hooks/use-usage.d.ts +40 -0
  330. package/dist/hooks/use-vaults.d.ts +53 -0
  331. package/dist/hooks/use-voice-input.d.ts +8 -1
  332. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  333. package/dist/hooks/use-workspace-sessions.d.ts +22 -5
  334. package/dist/human-input-model.d.ts +122 -0
  335. package/dist/identity-link-accounts.d.ts +11 -0
  336. package/dist/identity-link-consent.d.ts +18 -0
  337. package/dist/index.d.ts +82 -20
  338. package/dist/index.js +2350 -6605
  339. package/dist/index.js.map +1 -1
  340. package/dist/interaction.d.ts +1 -1
  341. package/dist/interaction.js +14 -24
  342. package/dist/interaction.js.map +1 -1
  343. package/dist/latest-question-R77KWSUP.js +118 -0
  344. package/dist/latest-question-R77KWSUP.js.map +1 -0
  345. package/dist/lib/clipboard.d.ts +7 -0
  346. package/dist/lib/error-message.d.ts +7 -0
  347. package/dist/lib/format.d.ts +58 -4
  348. package/dist/lib/host-theme.d.ts +77 -0
  349. package/dist/lib/interaction-errors.d.ts +3 -0
  350. package/dist/lib/menu-styles.d.ts +22 -0
  351. package/dist/lib/notify-observer.d.ts +2 -0
  352. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  353. package/dist/lib/provider-recovery.d.ts +55 -0
  354. package/dist/lib/scrollbars.d.ts +11 -0
  355. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  356. package/dist/lib/transient-retry.d.ts +25 -0
  357. package/dist/lib/workbench-peers.d.ts +36 -0
  358. package/dist/lib/xterm-theme.d.ts +7 -5
  359. package/dist/machines.js +9 -5
  360. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  361. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  362. package/dist/mcp-connection-status.d.ts +14 -0
  363. package/dist/model-mark-paths.d.ts +34 -0
  364. package/dist/model-mark-paths.js +16 -0
  365. package/dist/model-mark-paths.js.map +1 -0
  366. package/dist/model-picker-model.d.ts +111 -0
  367. package/dist/model-picker-model.js +25 -0
  368. package/dist/model-picker-model.js.map +1 -0
  369. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  370. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  371. package/dist/model-policy.d.ts +30 -3
  372. package/dist/model-policy.js +14 -1
  373. package/dist/native-previews.d.ts +28 -0
  374. package/dist/native-previews.js +82 -0
  375. package/dist/native-previews.js.map +1 -0
  376. package/dist/new-session-draft.d.ts +7 -0
  377. package/dist/new-session-draft.js +639 -0
  378. package/dist/new-session-draft.js.map +1 -0
  379. package/dist/notification-text.d.ts +27 -0
  380. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  381. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  382. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  383. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  384. package/dist/older-history.d.ts +3 -2
  385. package/dist/organization-model.d.ts +32 -0
  386. package/dist/organization-model.js +65 -0
  387. package/dist/organization-model.js.map +1 -0
  388. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  389. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  390. package/dist/plugin-details.d.ts +14 -0
  391. package/dist/plugin-discovery.d.ts +25 -0
  392. package/dist/preview-loading-paint.d.ts +20 -0
  393. package/dist/provider.d.ts +25 -2
  394. package/dist/queue-presentation-model.d.ts +72 -0
  395. package/dist/queue-presentation-model.js +38 -0
  396. package/dist/queue-presentation-model.js.map +1 -0
  397. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  398. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  399. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  400. package/dist/realtime/embedded-voice.d.ts +1 -0
  401. package/dist/realtime/realtime-control.d.ts +4 -65
  402. package/dist/realtime/session-realtime.d.ts +78 -0
  403. package/dist/realtime.js +25 -1294
  404. package/dist/realtime.js.map +1 -1
  405. package/dist/sandbox-files-O27IPOZW.js +21 -0
  406. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  407. package/dist/sandbox-label-model.d.ts +30 -0
  408. package/dist/sandbox-label-model.js +20 -0
  409. package/dist/sandbox-label-model.js.map +1 -0
  410. package/dist/scrollbars.d.ts +1 -0
  411. package/dist/scrollbars.js +10 -0
  412. package/dist/scrollbars.js.map +1 -0
  413. package/dist/secret-reference-label.d.ts +14 -0
  414. package/dist/secrets-ui.d.ts +57 -0
  415. package/dist/session-agents-model.d.ts +10 -0
  416. package/dist/session-agents-model.js +25 -0
  417. package/dist/session-agents-model.js.map +1 -0
  418. package/dist/session-attention-model.d.ts +8 -0
  419. package/dist/session-attention-model.js +47 -0
  420. package/dist/session-attention-model.js.map +1 -0
  421. package/dist/session-auth-recommendation.d.ts +5 -0
  422. package/dist/session-capability-policy.d.ts +31 -0
  423. package/dist/session-feedback-model.d.ts +20 -0
  424. package/dist/session-feedback-model.js +56 -0
  425. package/dist/session-feedback-model.js.map +1 -0
  426. package/dist/session-list-model.d.ts +138 -0
  427. package/dist/session-list-model.js +274 -0
  428. package/dist/session-list-model.js.map +1 -0
  429. package/dist/session-realtime-7DJOIHQW.js +21 -0
  430. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  431. package/dist/session-realtime.d.ts +7 -0
  432. package/dist/session-realtime.js +19 -0
  433. package/dist/session-realtime.js.map +1 -0
  434. package/dist/session-status-model.d.ts +36 -0
  435. package/dist/session-ui.d.ts +39 -1
  436. package/dist/session-ui.js +126 -12
  437. package/dist/session-ui.js.map +1 -1
  438. package/dist/session.d.ts +8 -2
  439. package/dist/session.js +35 -20
  440. package/dist/site-snapshot.d.ts +14 -0
  441. package/dist/sites-ui.d.ts +24 -0
  442. package/dist/sites.d.ts +3 -0
  443. package/dist/sites.js +14 -0
  444. package/dist/sites.js.map +1 -0
  445. package/dist/skill-discovery.d.ts +47 -0
  446. package/dist/terminal.d.ts +8 -0
  447. package/dist/terminal.js +32 -0
  448. package/dist/terminal.js.map +1 -0
  449. package/dist/testing/session-scenarios.d.ts +10 -0
  450. package/dist/testing/session-scenarios.js +367 -0
  451. package/dist/testing/session-scenarios.js.map +1 -0
  452. package/dist/timeline/activity-rail.d.ts +11 -2
  453. package/dist/timeline/agent-identity.d.ts +30 -0
  454. package/dist/timeline/agent-row.d.ts +31 -0
  455. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  456. package/dist/timeline/compaction-copy.d.ts +46 -0
  457. package/dist/timeline/entrance.d.ts +13 -1
  458. package/dist/timeline/focus-sequence.d.ts +9 -0
  459. package/dist/timeline/genie-copy.d.ts +3 -0
  460. package/dist/timeline/genie-loading.d.ts +47 -0
  461. package/dist/timeline/index.d.ts +10 -5
  462. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  463. package/dist/timeline/message-sender.d.ts +19 -0
  464. package/dist/timeline/notice-presentation.d.ts +13 -0
  465. package/dist/timeline/parsers.d.ts +11 -0
  466. package/dist/timeline/patch-apply-command.d.ts +18 -0
  467. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  468. package/dist/timeline/platform-activity-row.d.ts +1 -2
  469. package/dist/timeline/presented-image.d.ts +11 -0
  470. package/dist/timeline/projection.d.ts +31 -2
  471. package/dist/timeline/provider-logo.d.ts +15 -0
  472. package/dist/timeline/question-nav-model.d.ts +23 -0
  473. package/dist/timeline/registry.d.ts +12 -1
  474. package/dist/timeline/retained-image.d.ts +18 -0
  475. package/dist/timeline/retained-loaders.d.ts +27 -0
  476. package/dist/timeline/rolling-activity.d.ts +11 -0
  477. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  478. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  479. package/dist/timeline/shared.d.ts +4 -1
  480. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  481. package/dist/timeline/startup-preference.d.ts +3 -0
  482. package/dist/timeline/startup-timings.d.ts +4 -0
  483. package/dist/timeline/tool-display-name.d.ts +5 -2
  484. package/dist/timeline/tool-presentation.d.ts +172 -0
  485. package/dist/timeline/turn-summary-model.d.ts +95 -0
  486. package/dist/timeline/turn-summary.d.ts +20 -54
  487. package/dist/timeline/types.d.ts +179 -7
  488. package/dist/timeline/work-presentation.d.ts +60 -0
  489. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  490. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  491. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  492. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  493. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  494. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  495. package/dist/timeline-model.d.ts +29 -0
  496. package/dist/timeline-model.js +254 -0
  497. package/dist/timeline-model.js.map +1 -0
  498. package/dist/usage/allowance-copy.d.ts +25 -0
  499. package/dist/usage/session-usage-limit.d.ts +88 -0
  500. package/dist/usage/summary.d.ts +35 -0
  501. package/dist/usage.d.ts +17 -0
  502. package/dist/usage.js +1187 -0
  503. package/dist/usage.js.map +1 -0
  504. package/dist/voice-recording-owner.d.ts +7 -0
  505. package/package.json +107 -7
  506. package/src/accounts.tsx +116 -14
  507. package/src/approvals.ts +8 -1
  508. package/src/artifacts-spreadsheet.ts +1 -0
  509. package/src/artifacts.ts +44 -0
  510. package/src/assets/README.md +8 -0
  511. package/src/assets/gmail.ico +0 -0
  512. package/src/assets/outlook.ico +0 -0
  513. package/src/capability-catalog-row.tsx +94 -0
  514. package/src/capability-logo-fallback.ts +22 -0
  515. package/src/client.ts +20 -31
  516. package/src/commands/registry.ts +18 -15
  517. package/src/commands/types.ts +2 -0
  518. package/src/components/anthropic-mark.tsx +10 -0
  519. package/src/components/approval-surface.tsx +401 -138
  520. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  521. package/src/components/artifacts/artifact-sandbox.tsx +189 -0
  522. package/src/components/artifacts/artifact-surface.tsx +40 -20
  523. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  524. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  525. package/src/components/artifacts/document-editor.tsx +141 -16
  526. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  527. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  528. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  529. package/src/components/artifacts/editable-document.tsx +37 -36
  530. package/src/components/artifacts/editable-presentation.tsx +36 -18
  531. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  532. package/src/components/artifacts/index.ts +45 -0
  533. package/src/components/artifacts/inline-html-document.ts +24 -0
  534. package/src/components/artifacts/latest-task-runner.ts +49 -0
  535. package/src/components/artifacts/presentation-editor.tsx +323 -67
  536. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  537. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  538. package/src/components/artifacts/site-view.tsx +121 -0
  539. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  540. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  541. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  542. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  543. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  544. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  545. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  546. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  547. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  548. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  549. package/src/components/browser-select-control.tsx +312 -0
  550. package/src/components/browser-viewer.tsx +778 -318
  551. package/src/components/chat-composer.tsx +47 -5
  552. package/src/components/child-session-link.tsx +36 -0
  553. package/src/components/claude-mark.tsx +11 -0
  554. package/src/components/code-editor.tsx +13 -16
  555. package/src/components/composer-transcription-control.tsx +128 -30
  556. package/src/components/composer.tsx +404 -195
  557. package/src/components/computer-viewer.tsx +880 -253
  558. package/src/components/copy-button.tsx +13 -5
  559. package/src/components/desktop-viewer.tsx +1 -1
  560. package/src/components/enrollment-consent.tsx +1 -1
  561. package/src/components/enrollment-device-flow.tsx +1 -1
  562. package/src/components/file-browser.tsx +10 -14
  563. package/src/components/fleet-tile.tsx +9 -18
  564. package/src/components/generated-video-player.tsx +4 -2
  565. package/src/components/grok-mark.tsx +34 -0
  566. package/src/components/human-input-form.tsx +590 -283
  567. package/src/components/human-input-surface.tsx +11 -0
  568. package/src/components/interaction-intervention-banner.tsx +2 -2
  569. package/src/components/linkified-text.tsx +79 -0
  570. package/src/components/machine-card.tsx +35 -78
  571. package/src/components/machine-dock-bar.tsx +1 -1
  572. package/src/components/machine-input-display.ts +197 -3
  573. package/src/components/machines/agent-status-icon.tsx +31 -0
  574. package/src/components/machines/machine-detail.tsx +200 -31
  575. package/src/components/machines/machine-operation-policy.tsx +1 -1
  576. package/src/components/machines/machine-status.ts +241 -0
  577. package/src/components/machines-dashboard.tsx +2 -17
  578. package/src/components/markdown-table-layout.ts +143 -0
  579. package/src/components/markdown.tsx +466 -129
  580. package/src/components/message-timeline.tsx +2567 -728
  581. package/src/components/model-mark.tsx +102 -0
  582. package/src/components/model-picker.tsx +15 -4
  583. package/src/components/model-policy-picker-menu.tsx +371 -0
  584. package/src/components/model-policy-picker.tsx +256 -412
  585. package/src/components/new-conversation.tsx +221 -0
  586. package/src/components/open-geni-chat.tsx +309 -0
  587. package/src/components/open-geni-links.tsx +179 -0
  588. package/src/components/openrouter-mark.tsx +13 -0
  589. package/src/components/opper-mark.tsx +18 -0
  590. package/src/components/pierre-diff.tsx +41 -16
  591. package/src/components/pierre-file.tsx +35 -10
  592. package/src/components/preview-loading.tsx +109 -0
  593. package/src/components/provider-recovery-notice.tsx +49 -0
  594. package/src/components/queue-item-content.ts +14 -0
  595. package/src/components/queue-surface-implementation.tsx +51 -356
  596. package/src/components/queue-surface-state.tsx +3 -1
  597. package/src/components/rehype-secret-refs.ts +98 -0
  598. package/src/components/remark-soft-line-breaks.ts +166 -0
  599. package/src/components/sandbox-files.tsx +91 -15
  600. package/src/components/sandbox-terminal.tsx +84 -13
  601. package/src/components/sandbox-workspace.tsx +147 -51
  602. package/src/components/secret-question-field.tsx +324 -0
  603. package/src/components/secret-ref-chip.tsx +185 -0
  604. package/src/components/session-capability-frame.tsx +197 -0
  605. package/src/components/session-chrome.tsx +842 -251
  606. package/src/components/session-commands-panel.tsx +126 -0
  607. package/src/components/session-commands.tsx +18 -0
  608. package/src/components/session-connection-request.tsx +97 -0
  609. package/src/components/session-conversation.tsx +876 -0
  610. package/src/components/session-list.tsx +257 -0
  611. package/src/components/session-mcp-capability-card.tsx +680 -0
  612. package/src/components/session-proxy-scope.tsx +153 -0
  613. package/src/components/session-status.tsx +26 -17
  614. package/src/components/session-usage-limit-notice.tsx +174 -0
  615. package/src/components/timeline-anchor.tsx +119 -0
  616. package/src/components/timeline-annotation-chrome.tsx +196 -0
  617. package/src/components/timeline-annotation-layout.ts +268 -0
  618. package/src/components/timeline-annotation-markers.tsx +185 -0
  619. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  620. package/src/components/timeline-annotation-selection.tsx +106 -54
  621. package/src/components/timeline-annotation-shared.ts +245 -0
  622. package/src/components/timeline-annotations-dialog.tsx +185 -128
  623. package/src/components/timeline-annotations.tsx +189 -45
  624. package/src/components/timeline-reading-progress.ts +80 -0
  625. package/src/components/timeline-search.tsx +168 -0
  626. package/src/components/timeline-settlement.ts +60 -0
  627. package/src/components/tip-follow.ts +52 -0
  628. package/src/components/tool-action-review.tsx +650 -0
  629. package/src/components/tool-review-history.tsx +88 -0
  630. package/src/components/tooltip.tsx +38 -5
  631. package/src/components/usage-limit-notice.tsx +179 -0
  632. package/src/components/usage-member-list.tsx +792 -0
  633. package/src/components/usage-meter.tsx +382 -0
  634. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  635. package/src/components/user-message-body.tsx +27 -2
  636. package/src/components/workspace-dock.tsx +18 -1
  637. package/src/composer-messages.ts +150 -0
  638. package/src/composer-voice-events.ts +12 -0
  639. package/src/composer.ts +6 -1
  640. package/src/connect-account-identity.tsx +34 -0
  641. package/src/connect-accounts.tsx +233 -0
  642. package/src/connect-chooser.tsx +336 -0
  643. package/src/connect-panel.tsx +99 -0
  644. package/src/connect-setup.tsx +355 -0
  645. package/src/connect.ts +60 -0
  646. package/src/connection-assets.d.ts +4 -0
  647. package/src/connection-catalog.tsx +162 -0
  648. package/src/connection-discovery.tsx +238 -0
  649. package/src/connection-installed.tsx +51 -0
  650. package/src/connection-logo.tsx +37 -0
  651. package/src/connection-service-logo.tsx +55 -0
  652. package/src/connection-service-presentation.ts +46 -0
  653. package/src/connection-skeleton.tsx +16 -0
  654. package/src/connection-type-picker.tsx +36 -0
  655. package/src/conversation-timeline.ts +92 -0
  656. package/src/desktop.ts +24 -0
  657. package/src/device-authorization.tsx +98 -0
  658. package/src/diffs.ts +16 -0
  659. package/src/discovery-cache.ts +42 -0
  660. package/src/editor.ts +13 -0
  661. package/src/hooks/internal.ts +3 -2
  662. package/src/hooks/latest-question.ts +164 -0
  663. package/src/hooks/shared-machines-list.ts +34 -1
  664. package/src/hooks/shared-query.ts +721 -0
  665. package/src/hooks/use-attached-browsers.ts +1 -1
  666. package/src/hooks/use-auth-runs.ts +0 -27
  667. package/src/hooks/use-available-models.ts +21 -15
  668. package/src/hooks/use-browser-frame-stream.ts +19 -2
  669. package/src/hooks/use-browser-session.ts +680 -205
  670. package/src/hooks/use-browser-sessions.ts +32 -1
  671. package/src/hooks/use-client-config-flags.ts +118 -0
  672. package/src/hooks/use-codex-accounts.ts +247 -47
  673. package/src/hooks/use-composer.ts +276 -47
  674. package/src/hooks/use-computer-frame-stream.ts +25 -7
  675. package/src/hooks/use-computer-input-posture.ts +94 -0
  676. package/src/hooks/use-computer-session.ts +409 -95
  677. package/src/hooks/use-connect.ts +23 -0
  678. package/src/hooks/use-desktop-stream.ts +19 -28
  679. package/src/hooks/use-file-attachments.ts +80 -4
  680. package/src/hooks/use-goal.ts +107 -13
  681. package/src/hooks/use-last-started-turn-policy.ts +46 -14
  682. package/src/hooks/use-machines.ts +4 -0
  683. package/src/hooks/use-new-conversation.ts +374 -0
  684. package/src/hooks/use-new-session-draft.ts +813 -0
  685. package/src/hooks/use-realtime-voice-models.ts +46 -0
  686. package/src/hooks/use-sandbox-files.ts +68 -20
  687. package/src/hooks/use-session-background-commands.ts +22 -11
  688. package/src/hooks/use-session-capabilities.ts +3 -2
  689. package/src/hooks/use-session-conversation.ts +150 -0
  690. package/src/hooks/use-session-events.ts +703 -382
  691. package/src/hooks/use-session-lineage.ts +20 -16
  692. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  693. package/src/hooks/use-session-model-account.ts +174 -0
  694. package/src/hooks/use-session.ts +53 -21
  695. package/src/hooks/use-slash-commands.ts +6 -11
  696. package/src/hooks/use-supergrok-accounts.ts +22 -8
  697. package/src/hooks/use-terminal-stream.ts +153 -27
  698. package/src/hooks/use-transcription.ts +6 -0
  699. package/src/hooks/use-turn-queue.ts +2 -1
  700. package/src/hooks/use-usage.ts +100 -0
  701. package/src/hooks/use-vaults.ts +153 -0
  702. package/src/hooks/use-video-artifact-playback.ts +1 -1
  703. package/src/hooks/use-voice-input.ts +127 -19
  704. package/src/hooks/use-workspace-capture.ts +3 -2
  705. package/src/hooks/use-workspace-edit.ts +23 -5
  706. package/src/hooks/use-workspace-sessions.ts +97 -32
  707. package/src/human-input-model.ts +359 -0
  708. package/src/identity-link-accounts.tsx +148 -0
  709. package/src/identity-link-consent.tsx +192 -0
  710. package/src/index.ts +262 -16
  711. package/src/interaction.ts +1 -0
  712. package/src/lib/clipboard.ts +29 -0
  713. package/src/lib/error-message.ts +37 -0
  714. package/src/lib/format.ts +213 -16
  715. package/src/lib/host-theme.ts +529 -0
  716. package/src/lib/interaction-errors.ts +15 -0
  717. package/src/lib/menu-styles.ts +44 -0
  718. package/src/lib/notify-observer.ts +15 -0
  719. package/src/lib/pierre-diffs-loader.ts +53 -0
  720. package/src/lib/provider-recovery.ts +243 -0
  721. package/src/lib/scrollbars.ts +30 -0
  722. package/src/lib/terminal-input-readiness.ts +51 -0
  723. package/src/lib/transient-retry.ts +99 -0
  724. package/src/lib/workbench-peers.ts +62 -0
  725. package/src/lib/xterm-theme.ts +23 -21
  726. package/src/mcp-connection-status.ts +35 -0
  727. package/src/model-mark-paths.ts +53 -0
  728. package/src/model-picker-model.ts +330 -0
  729. package/src/model-policy.ts +299 -74
  730. package/src/native-previews.ts +100 -0
  731. package/src/new-session-draft.ts +22 -0
  732. package/src/notification-text.ts +81 -0
  733. package/src/older-history.ts +22 -4
  734. package/src/organization-model.ts +118 -0
  735. package/src/plugin-details.tsx +185 -0
  736. package/src/plugin-discovery.tsx +196 -0
  737. package/src/preview-loading-paint.ts +68 -0
  738. package/src/provider.tsx +74 -15
  739. package/src/queue-presentation-model.ts +464 -0
  740. package/src/realtime/dropdown-menu.tsx +19 -12
  741. package/src/realtime/embedded-new-voice.tsx +1 -0
  742. package/src/realtime/embedded-voice.tsx +3 -0
  743. package/src/realtime/realtime-control.tsx +138 -501
  744. package/src/realtime/session-realtime.ts +566 -0
  745. package/src/sandbox-label-model.ts +53 -0
  746. package/src/scrollbars.ts +3 -0
  747. package/src/secret-reference-label.ts +43 -0
  748. package/src/secrets-ui.tsx +59 -0
  749. package/src/session-agents-model.ts +33 -0
  750. package/src/session-attention-model.ts +62 -0
  751. package/src/session-auth-recommendation.ts +48 -0
  752. package/src/session-capability-policy.ts +196 -0
  753. package/src/session-context.ts +3 -4
  754. package/src/session-feedback-model.ts +95 -0
  755. package/src/session-list-model.ts +434 -0
  756. package/src/session-realtime.ts +18 -0
  757. package/src/session-status-model.ts +99 -0
  758. package/src/session-ui.ts +98 -1
  759. package/src/session.ts +17 -1
  760. package/src/site-snapshot.ts +74 -0
  761. package/src/sites-ui.tsx +348 -0
  762. package/src/sites.ts +3 -0
  763. package/src/skill-discovery.tsx +208 -0
  764. package/src/terminal.ts +26 -0
  765. package/src/testing/session-scenarios.ts +404 -0
  766. package/src/timeline/activity-rail.tsx +242 -101
  767. package/src/timeline/agent-identity.tsx +84 -0
  768. package/src/timeline/agent-row.tsx +231 -0
  769. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  770. package/src/timeline/compaction-copy.ts +115 -0
  771. package/src/timeline/entrance.tsx +28 -3
  772. package/src/timeline/fleet-decision-projection.ts +2 -1
  773. package/src/timeline/fleet-decision-row.tsx +1 -0
  774. package/src/timeline/focus-sequence.ts +44 -0
  775. package/src/timeline/genie-copy.ts +19 -0
  776. package/src/timeline/genie-loading.tsx +143 -0
  777. package/src/timeline/index.ts +30 -2
  778. package/src/timeline/knowledge-receipt.tsx +100 -0
  779. package/src/timeline/message-sender.tsx +71 -0
  780. package/src/timeline/notice-presentation.ts +48 -0
  781. package/src/timeline/parsers.ts +42 -2
  782. package/src/timeline/patch-apply-command.tsx +135 -0
  783. package/src/timeline/platform-activity-presentation.ts +166 -0
  784. package/src/timeline/platform-activity-row.tsx +15 -90
  785. package/src/timeline/presented-image.ts +63 -0
  786. package/src/timeline/projection.ts +1746 -76
  787. package/src/timeline/provider-logo.tsx +53 -0
  788. package/src/timeline/question-nav-model.ts +28 -0
  789. package/src/timeline/registry.ts +26 -4
  790. package/src/timeline/retained-image.ts +97 -0
  791. package/src/timeline/retained-loaders.ts +91 -0
  792. package/src/timeline/rolling-activity.tsx +80 -0
  793. package/src/timeline/screenshot-lightbox.tsx +228 -5
  794. package/src/timeline/session-usage-limit-row.tsx +42 -0
  795. package/src/timeline/shared.tsx +42 -15
  796. package/src/timeline/startup-dispatch-details.tsx +36 -0
  797. package/src/timeline/startup-preference.ts +33 -0
  798. package/src/timeline/startup-timings.tsx +145 -0
  799. package/src/timeline/tool-display-name.ts +19 -7
  800. package/src/timeline/tool-presentation.ts +1316 -0
  801. package/src/timeline/tool-renderers.tsx +835 -1138
  802. package/src/timeline/turn-summary-model.ts +343 -0
  803. package/src/timeline/turn-summary.tsx +272 -365
  804. package/src/timeline/types.ts +189 -6
  805. package/src/timeline/work-presentation.ts +189 -0
  806. package/src/timeline-model.ts +143 -0
  807. package/src/usage/allowance-copy.ts +64 -0
  808. package/src/usage/session-usage-limit.ts +266 -0
  809. package/src/usage/summary.ts +93 -0
  810. package/src/usage.ts +70 -0
  811. package/src/voice-recording-owner.ts +22 -0
  812. package/styles/compiled.css +2319 -748
  813. package/styles/connect.css +290 -0
  814. package/styles/connect.d.ts +1 -0
  815. package/styles/effective-tokens.css +1 -0
  816. package/styles/index.css +309 -9
  817. package/styles/responsive.css +99 -7
  818. package/styles/session-capability.css +44 -0
  819. package/styles/tokens.css +134 -66
  820. package/dist/browser-viewer-AEFHUYZK.js +0 -14
  821. package/dist/chunk-4MDLEHXL.js.map +0 -1
  822. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  823. package/dist/chunk-D3UIAJKY.js.map +0 -1
  824. package/dist/chunk-ELIYWBZR.js.map +0 -1
  825. package/dist/chunk-H5YGYNXS.js.map +0 -1
  826. package/dist/chunk-HQVCKCLG.js +0 -9458
  827. package/dist/chunk-HQVCKCLG.js.map +0 -1
  828. package/dist/chunk-HUIKIDM5.js.map +0 -1
  829. package/dist/chunk-ICA6R6TW.js.map +0 -1
  830. package/dist/chunk-JVYQRRC4.js.map +0 -1
  831. package/dist/chunk-KCGXPP5V.js.map +0 -1
  832. package/dist/chunk-KZ73RL76.js.map +0 -1
  833. package/dist/chunk-LAKLF4PA.js +0 -141
  834. package/dist/chunk-LAKLF4PA.js.map +0 -1
  835. package/dist/chunk-MZ2G2XBA.js.map +0 -1
  836. package/dist/chunk-NEXLLTP4.js.map +0 -1
  837. package/dist/chunk-OAM4WAAM.js.map +0 -1
  838. package/dist/chunk-PEI6RANI.js.map +0 -1
  839. package/dist/chunk-RGALCTWO.js.map +0 -1
  840. package/dist/chunk-W6NFJXSA.js +0 -454
  841. package/dist/chunk-W6NFJXSA.js.map +0 -1
  842. package/dist/chunk-WSK7G5LE.js +0 -170
  843. package/dist/chunk-WSK7G5LE.js.map +0 -1
  844. package/dist/chunk-X4A66EWZ.js +0 -223
  845. package/dist/chunk-X4A66EWZ.js.map +0 -1
  846. package/dist/chunk-XXWH2JLC.js.map +0 -1
  847. package/dist/chunk-YFKJ7VZH.js +0 -268
  848. package/dist/chunk-YFKJ7VZH.js.map +0 -1
  849. package/dist/chunk-YJFGAFBD.js.map +0 -1
  850. package/dist/computer-viewer-FWEZISW4.js +0 -16
  851. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  852. package/dist/hooks/use-environments.d.ts +0 -41
  853. package/dist/hooks/use-packs.d.ts +0 -32
  854. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  855. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  856. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  857. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  858. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  859. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  860. package/src/hooks/use-environments.ts +0 -182
  861. package/src/hooks/use-packs.ts +0 -157
  862. /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  863. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
@@ -44,6 +44,9 @@ const MAX_ZOOM = 4;
44
44
  const RAIL_ITEM_HEIGHT = 116;
45
45
  const RAIL_OVERSCAN = 3;
46
46
  const DEFAULT_RAIL_HEIGHT = 640;
47
+ const MOBILE_RAIL_ITEM_HEIGHT = 44;
48
+ const MOBILE_RAIL_OVERSCAN = 3;
49
+ const DEFAULT_MOBILE_LIST_HEIGHT = 264;
47
50
  const DEFAULT_VIEWPORT = { width: 960, height: 640 };
48
51
  const SPATIAL_TILE = 256;
49
52
  const MAX_SPATIAL_BUCKETS_PER_OBJECT = 1_024;
@@ -331,6 +334,7 @@ export type PresentationProjectionEditorProps = Omit<
331
334
 
332
335
  export type PresentationProjectionArtifactSurfaceProps = PresentationProjectionEditorProps & {
333
336
  title?: string | undefined;
337
+ showHeader?: boolean | undefined;
334
338
  subtitle?: ReactNode | undefined;
335
339
  actions?: ReactNode | undefined;
336
340
  busy?: boolean | undefined;
@@ -347,6 +351,8 @@ export type PresentationEditorProps = {
347
351
  zoom?: number | undefined;
348
352
  defaultZoom?: number | undefined;
349
353
  readOnly?: boolean | undefined;
354
+ /** Temporarily fence commands while keeping the current editor draft. */
355
+ authoringBlockedReason?: "pending_conflict" | "prior_writer" | undefined;
350
356
  className?: string | undefined;
351
357
  onSlideChange?: ((slide: Slide, index: number) => void) | undefined;
352
358
  onSelectionChange?: ((object: PresentationObject | null, slide: Slide) => void) | undefined;
@@ -357,6 +363,7 @@ export type PresentationEditorProps = {
357
363
 
358
364
  export type PresentationArtifactSurfaceProps = PresentationEditorProps & {
359
365
  title?: string | undefined;
366
+ showHeader?: boolean | undefined;
360
367
  subtitle?: ReactNode | undefined;
361
368
  actions?: ReactNode | undefined;
362
369
  busy?: boolean | undefined;
@@ -450,6 +457,15 @@ export function PresentationProjectionEditor({
450
457
  );
451
458
  }
452
459
 
460
+ function nextSlideIndexFromKey(key: string, activeIndex: number, length: number): number | null {
461
+ if (length === 0) return null;
462
+ if (key === "ArrowDown") return Math.min(length - 1, activeIndex + 1);
463
+ if (key === "ArrowUp") return Math.max(0, activeIndex - 1);
464
+ if (key === "Home") return 0;
465
+ if (key === "End") return length - 1;
466
+ return null;
467
+ }
468
+
453
469
  function PresentationEditorCore({
454
470
  presentation,
455
471
  revision,
@@ -460,6 +476,7 @@ function PresentationEditorCore({
460
476
  zoom: controlledZoom,
461
477
  defaultZoom = 0.75,
462
478
  readOnly = false,
479
+ authoringBlockedReason,
463
480
  className,
464
481
  onSlideChange,
465
482
  onSelectionChange,
@@ -467,6 +484,14 @@ function PresentationEditorCore({
467
484
  onCommandError,
468
485
  onZoomChange,
469
486
  }: PresentationEditorProps) {
487
+ const mutationsBlocked = readOnly || authoringBlockedReason !== undefined;
488
+ const authoringStatus = readOnly
489
+ ? null
490
+ : authoringBlockedReason === "pending_conflict"
491
+ ? "An earlier change needs attention"
492
+ : authoringBlockedReason === "prior_writer"
493
+ ? "Saving earlier changes…"
494
+ : null;
470
495
  const slides = presentation.slides.items;
471
496
  const firstSlideId = slides[0]?.id ?? null;
472
497
  const [localSlideId, setLocalSlideId] = useState(
@@ -492,6 +517,11 @@ function PresentationEditorCore({
492
517
  scrollTop: 0,
493
518
  height: DEFAULT_RAIL_HEIGHT,
494
519
  });
520
+ const [mobileSelectorOpen, setMobileSelectorOpen] = useState(false);
521
+ const [mobileRail, setMobileRail] = useState({
522
+ scrollTop: 0,
523
+ height: DEFAULT_MOBILE_LIST_HEIGHT,
524
+ });
495
525
  const [viewport, setViewport] = useState<ViewportMetrics>({
496
526
  scrollLeft: 0,
497
527
  scrollTop: 0,
@@ -504,6 +534,9 @@ function PresentationEditorCore({
504
534
  const [textDraft, setTextDraft] = useState("");
505
535
  const [paintEpoch, setPaintEpoch] = useState(0);
506
536
  const railRef = useRef<HTMLDivElement>(null);
537
+ const mobileSelectorTriggerRef = useRef<HTMLButtonElement>(null);
538
+ const mobileSelectorPanelRef = useRef<HTMLDivElement>(null);
539
+ const mobileRailRef = useRef<HTMLDivElement>(null);
507
540
  const viewportRef = useRef<HTMLDivElement>(null);
508
541
  const stageRef = useRef<HTMLDivElement>(null);
509
542
  const canvasRef = useRef<HTMLCanvasElement>(null);
@@ -517,6 +550,7 @@ function PresentationEditorCore({
517
550
  const commandVersionsRef = useRef(new Map<string, number>());
518
551
  const pendingSlideIdRef = useRef<string | null>(null);
519
552
  const pendingObjectIdRef = useRef<string | null>(null);
553
+ const mobileRailScrollOnOpenRef = useRef(0);
520
554
  const domId = useId().replaceAll(":", "");
521
555
  const selectionProxyId = `${domId}-presentation-selection`;
522
556
  const instructionsId = `${domId}-presentation-instructions`;
@@ -596,6 +630,47 @@ function PresentationEditorCore({
596
630
  return () => observer.disconnect();
597
631
  }, []);
598
632
 
633
+ useLayoutEffect(() => {
634
+ if (!mobileSelectorOpen) return;
635
+ const element = mobileRailRef.current;
636
+ if (!element) return;
637
+ element.scrollTop = mobileRailScrollOnOpenRef.current;
638
+ element.focus();
639
+ const measure = () =>
640
+ setMobileRail((current) => ({
641
+ scrollTop: element.scrollTop,
642
+ height: element.clientHeight || current.height,
643
+ }));
644
+ measure();
645
+ if (typeof ResizeObserver === "undefined") return;
646
+ const observer = new ResizeObserver(measure);
647
+ observer.observe(element);
648
+ return () => observer.disconnect();
649
+ }, [mobileSelectorOpen]);
650
+
651
+ useEffect(() => {
652
+ if (!mobileSelectorOpen) return;
653
+ const onPointerDown = (event: PointerEvent) => {
654
+ const target = event.target;
655
+ if (!(target instanceof Node)) return;
656
+ if (mobileSelectorTriggerRef.current?.contains(target)) return;
657
+ if (mobileSelectorPanelRef.current?.contains(target)) return;
658
+ setMobileSelectorOpen(false);
659
+ };
660
+ const onKeyDown = (event: KeyboardEvent) => {
661
+ if (event.key !== "Escape") return;
662
+ event.preventDefault();
663
+ setMobileSelectorOpen(false);
664
+ mobileSelectorTriggerRef.current?.focus();
665
+ };
666
+ document.addEventListener("pointerdown", onPointerDown);
667
+ document.addEventListener("keydown", onKeyDown);
668
+ return () => {
669
+ document.removeEventListener("pointerdown", onPointerDown);
670
+ document.removeEventListener("keydown", onKeyDown);
671
+ };
672
+ }, [mobileSelectorOpen]);
673
+
599
674
  useLayoutEffect(() => {
600
675
  const element = viewportRef.current;
601
676
  if (!element) return;
@@ -835,7 +910,7 @@ function PresentationEditorCore({
835
910
 
836
911
  const runCommit = useCallback(
837
912
  (key: string, command: PresentationCommit, rollback: () => void, retry: () => void) => {
838
- if (!onCommit) return;
913
+ if (mutationsBlocked || !onCommit) return;
839
914
  const version = (commandVersionsRef.current.get(key) ?? 0) + 1;
840
915
  commandVersionsRef.current.set(key, version);
841
916
  const scope = commandScopeRef.current;
@@ -875,12 +950,12 @@ function PresentationEditorCore({
875
950
  },
876
951
  );
877
952
  },
878
- [onCommandError, onCommit],
953
+ [mutationsBlocked, onCommandError, onCommit],
879
954
  );
880
955
 
881
956
  const commitPosition = useCallback(
882
957
  (entry: DisplayObject, kind: "move" | "resize", next: PresentationPosition) => {
883
- if (!activeSlide || readOnly || entry.readOnly) return;
958
+ if (!activeSlide || mutationsBlocked || entry.readOnly) return;
884
959
  const before = copyPosition(entry.object.position);
885
960
  const after = normalizeEditorPosition(next);
886
961
  if (samePosition(before, after)) return;
@@ -909,11 +984,11 @@ function PresentationEditorCore({
909
984
  );
910
985
  submit();
911
986
  },
912
- [activeSlide, readOnly, runCommit],
987
+ [activeSlide, mutationsBlocked, runCommit],
913
988
  );
914
989
 
915
990
  const insertSlide = useCallback(() => {
916
- if (readOnly) return;
991
+ if (mutationsBlocked) return;
917
992
  const slideId = randomPresentationId();
918
993
  const index = activeIndex < 0 ? slides.length : activeIndex + 1;
919
994
  const command: PresentationCommit = { kind: "slide-insert", slideId, index };
@@ -929,10 +1004,10 @@ function PresentationEditorCore({
929
1004
  );
930
1005
  };
931
1006
  submit();
932
- }, [activeIndex, readOnly, runCommit, slides.length]);
1007
+ }, [activeIndex, mutationsBlocked, runCommit, slides.length]);
933
1008
 
934
1009
  const deleteSlide = useCallback(() => {
935
- if (readOnly || !activeSlide) return;
1010
+ if (mutationsBlocked || !activeSlide) return;
936
1011
  const command: PresentationCommit = {
937
1012
  kind: "slide-delete",
938
1013
  slideId: activeSlide.id,
@@ -941,10 +1016,10 @@ function PresentationEditorCore({
941
1016
  const submit = () =>
942
1017
  runCommit(`slide-delete:${activeSlide.id}`, command, () => undefined, submit);
943
1018
  submit();
944
- }, [activeIndex, activeSlide, readOnly, runCommit]);
1019
+ }, [activeIndex, activeSlide, mutationsBlocked, runCommit]);
945
1020
 
946
1021
  const insertTextBox = useCallback(() => {
947
- if (readOnly || !activeSlide) return;
1022
+ if (mutationsBlocked || !activeSlide) return;
948
1023
  const objectId = randomPresentationId();
949
1024
  const position = nextTextBoxPosition(objects, presentation.slideSize);
950
1025
  const command: PresentationCommit = {
@@ -966,10 +1041,10 @@ function PresentationEditorCore({
966
1041
  );
967
1042
  };
968
1043
  submit();
969
- }, [activeSlide, objects, presentation.slideSize, readOnly, runCommit]);
1044
+ }, [activeSlide, objects, presentation.slideSize, mutationsBlocked, runCommit]);
970
1045
 
971
1046
  const deleteObject = useCallback(() => {
972
- if (readOnly || !activeSlide || !selected || selected.readOnly) return;
1047
+ if (mutationsBlocked || !activeSlide || !selected || selected.readOnly) return;
973
1048
  const command: PresentationCommit = {
974
1049
  kind: "object-delete",
975
1050
  slideId: activeSlide.id,
@@ -978,11 +1053,11 @@ function PresentationEditorCore({
978
1053
  const submit = () =>
979
1054
  runCommit(`object-delete:${activeSlide.id}:${selected.id}`, command, () => undefined, submit);
980
1055
  submit();
981
- }, [activeSlide, readOnly, runCommit, selected]);
1056
+ }, [activeSlide, mutationsBlocked, runCommit, selected]);
982
1057
 
983
1058
  const startTextEdit = useCallback(
984
1059
  (entry: DisplayObject | null) => {
985
- if (readOnly || !entry || entry.readOnly || entry.kind !== "shape") return;
1060
+ if (mutationsBlocked || !entry || entry.readOnly || entry.kind !== "shape") return;
986
1061
  const shape = entry.object as PresentationShape;
987
1062
  if (shape.geometry === "line") return;
988
1063
  const before = shape.text.toString();
@@ -992,7 +1067,7 @@ function PresentationEditorCore({
992
1067
  setTextEdit(edit);
993
1068
  setTextDraft(before);
994
1069
  },
995
- [activeSlide, readOnly],
1070
+ [activeSlide, mutationsBlocked],
996
1071
  );
997
1072
 
998
1073
  useEffect(() => {
@@ -1004,12 +1079,12 @@ function PresentationEditorCore({
1004
1079
  const finishTextEdit = useCallback(
1005
1080
  (cancel = false) => {
1006
1081
  const edit = textEditRef.current;
1007
- if (!edit) return;
1082
+ if (!edit || (!cancel && authoringBlockedReason !== undefined)) return;
1008
1083
  textEditRef.current = null;
1009
1084
  setTextEdit(null);
1010
1085
  const { shape, before, slideId } = edit;
1011
1086
  if (!activeSlide || activeSlide.id !== slideId) return;
1012
- if (cancel || readOnly || before === textDraft) return;
1087
+ if (cancel || mutationsBlocked || before === textDraft) return;
1013
1088
  shape.text.set(textDraft);
1014
1089
  setModelEpoch((value) => value + 1);
1015
1090
  const command: PresentationCommit = {
@@ -1035,7 +1110,7 @@ function PresentationEditorCore({
1035
1110
  );
1036
1111
  submit();
1037
1112
  },
1038
- [activeSlide, readOnly, runCommit, textDraft],
1113
+ [activeSlide, authoringBlockedReason, mutationsBlocked, runCommit, textDraft],
1039
1114
  );
1040
1115
 
1041
1116
  const cycleObject = useCallback(
@@ -1058,6 +1133,34 @@ function PresentationEditorCore({
1058
1133
  [activeIndex, activeSlide, selectSlide, slides],
1059
1134
  );
1060
1135
 
1136
+ const toggleMobileSlideSelector = useCallback(() => {
1137
+ setMobileSelectorOpen((open) => {
1138
+ if (open) return false;
1139
+ const index = Math.max(0, activeIndex);
1140
+ const height = DEFAULT_MOBILE_LIST_HEIGHT;
1141
+ const maxScroll = Math.max(0, slides.length * MOBILE_RAIL_ITEM_HEIGHT - height);
1142
+ const scrollTop = Math.max(
1143
+ 0,
1144
+ Math.min(
1145
+ maxScroll,
1146
+ index * MOBILE_RAIL_ITEM_HEIGHT - height / 2 + MOBILE_RAIL_ITEM_HEIGHT / 2,
1147
+ ),
1148
+ );
1149
+ mobileRailScrollOnOpenRef.current = scrollTop;
1150
+ setMobileRail({ scrollTop, height });
1151
+ return true;
1152
+ });
1153
+ }, [activeIndex, slides.length]);
1154
+
1155
+ const chooseMobileSlide = useCallback(
1156
+ (slide: Slide, index: number) => {
1157
+ if (slide !== activeSlide) selectSlide(slide, index);
1158
+ setMobileSelectorOpen(false);
1159
+ mobileSelectorTriggerRef.current?.focus();
1160
+ },
1161
+ [activeSlide, selectSlide],
1162
+ );
1163
+
1061
1164
  const handleCanvasKeyDown = useCallback(
1062
1165
  (event: ReactKeyboardEvent<SVGSVGElement>) => {
1063
1166
  if (event.metaKey || event.ctrlKey) {
@@ -1107,7 +1210,7 @@ function PresentationEditorCore({
1107
1210
  }
1108
1211
  if (!selected || !event.key.startsWith("Arrow")) return;
1109
1212
  event.preventDefault();
1110
- if (readOnly || selected.readOnly) return;
1213
+ if (mutationsBlocked || selected.readOnly) return;
1111
1214
  const amount = event.shiftKey ? 10 : 1;
1112
1215
  const dx = event.key === "ArrowLeft" ? -amount : event.key === "ArrowRight" ? amount : 0;
1113
1216
  const dy = event.key === "ArrowUp" ? -amount : event.key === "ArrowDown" ? amount : 0;
@@ -1130,7 +1233,7 @@ function PresentationEditorCore({
1130
1233
  commitPosition,
1131
1234
  cycleObject,
1132
1235
  fitSlide,
1133
- readOnly,
1236
+ mutationsBlocked,
1134
1237
  selectObject,
1135
1238
  selected,
1136
1239
  startTextEdit,
@@ -1157,7 +1260,7 @@ function PresentationEditorCore({
1157
1260
  event.preventDefault();
1158
1261
  event.stopPropagation();
1159
1262
  selectObject(entry);
1160
- if (readOnly || entry.readOnly) return;
1263
+ if (mutationsBlocked || entry.readOnly) return;
1161
1264
  const start = pointFromPointer(event);
1162
1265
  const before = copyPosition(entry.object.position);
1163
1266
  dragRef.current = {
@@ -1171,7 +1274,7 @@ function PresentationEditorCore({
1171
1274
  setDraftPosition({ objectId: entry.id, position: before });
1172
1275
  overlayRef.current?.setPointerCapture?.(event.pointerId);
1173
1276
  },
1174
- [pointFromPointer, readOnly, selectObject],
1277
+ [pointFromPointer, mutationsBlocked, selectObject],
1175
1278
  );
1176
1279
 
1177
1280
  const handlePointerDown = useCallback(
@@ -1191,17 +1294,22 @@ function PresentationEditorCore({
1191
1294
  const handlePointerMove = useCallback(
1192
1295
  (event: ReactPointerEvent<SVGSVGElement>) => {
1193
1296
  const drag = dragRef.current;
1194
- if (!drag || drag.pointerId !== event.pointerId) return;
1297
+ if (!drag || drag.pointerId !== event.pointerId || mutationsBlocked) return;
1195
1298
  const point = pointFromPointer(event);
1196
1299
  setDraftPosition({ objectId: drag.object.id, position: positionFromDrag(drag, point) });
1197
1300
  },
1198
- [pointFromPointer],
1301
+ [mutationsBlocked, pointFromPointer],
1199
1302
  );
1200
1303
 
1201
1304
  const finishDrag = useCallback(
1202
1305
  (event: ReactPointerEvent<SVGSVGElement>, cancel = false) => {
1203
1306
  const drag = dragRef.current;
1204
- if (!drag || drag.pointerId !== event.pointerId) return;
1307
+ if (
1308
+ !drag ||
1309
+ drag.pointerId !== event.pointerId ||
1310
+ (!cancel && authoringBlockedReason !== undefined)
1311
+ )
1312
+ return;
1205
1313
  dragRef.current = null;
1206
1314
  const captureTarget = overlayRef.current;
1207
1315
  if (captureTarget?.hasPointerCapture?.(event.pointerId)) {
@@ -1214,21 +1322,36 @@ function PresentationEditorCore({
1214
1322
  const point = pointFromPointer(event);
1215
1323
  commitPosition(entry, drag.mode, positionFromDrag(drag, point));
1216
1324
  },
1217
- [commitPosition, objectById, pointFromPointer],
1325
+ [authoringBlockedReason, commitPosition, objectById, pointFromPointer],
1218
1326
  );
1219
1327
 
1220
- const handleLostPointerCapture = useCallback((event: ReactPointerEvent<SVGSVGElement>) => {
1221
- const drag = dragRef.current;
1222
- if (!drag || drag.pointerId !== event.pointerId) return;
1223
- dragRef.current = null;
1224
- setDraftPosition(null);
1225
- }, []);
1328
+ const handleLostPointerCapture = useCallback(
1329
+ (event: ReactPointerEvent<SVGSVGElement>) => {
1330
+ const drag = dragRef.current;
1331
+ if (!drag || drag.pointerId !== event.pointerId || authoringBlockedReason !== undefined)
1332
+ return;
1333
+ dragRef.current = null;
1334
+ setDraftPosition(null);
1335
+ },
1336
+ [authoringBlockedReason],
1337
+ );
1226
1338
 
1227
1339
  const railStart = Math.max(0, Math.floor(rail.scrollTop / RAIL_ITEM_HEIGHT) - RAIL_OVERSCAN);
1228
1340
  const railEnd = Math.min(
1229
1341
  slides.length,
1230
1342
  Math.ceil((rail.scrollTop + rail.height) / RAIL_ITEM_HEIGHT) + RAIL_OVERSCAN,
1231
1343
  );
1344
+ const mobileRailStart = Math.max(
1345
+ 0,
1346
+ Math.floor(mobileRail.scrollTop / MOBILE_RAIL_ITEM_HEIGHT) - MOBILE_RAIL_OVERSCAN,
1347
+ );
1348
+ const mobileRailEnd = Math.min(
1349
+ slides.length,
1350
+ Math.ceil((mobileRail.scrollTop + mobileRail.height) / MOBILE_RAIL_ITEM_HEIGHT) +
1351
+ MOBILE_RAIL_OVERSCAN,
1352
+ );
1353
+ const slideCountLabel =
1354
+ activeIndex >= 0 ? `${activeIndex + 1} / ${slides.length}` : `0 / ${slides.length}`;
1232
1355
  const stageWidth = presentation.slideSize.width * zoom;
1233
1356
  const stageHeight = presentation.slideSize.height * zoom;
1234
1357
 
@@ -1238,8 +1361,16 @@ function PresentationEditorCore({
1238
1361
  style={{ minHeight: "22rem" }}
1239
1362
  data-og-presentation-editor
1240
1363
  data-og-painted-object-count={visibleObjectIndexes.length}
1241
- data-og-command-state={commandFailure ? "error" : pendingCommands > 0 ? "pending" : "idle"}
1242
- aria-busy={pendingCommands > 0 ? "true" : undefined}
1364
+ data-og-command-state={
1365
+ commandFailure || authoringBlockedReason === "pending_conflict"
1366
+ ? "error"
1367
+ : pendingCommands > 0 || authoringBlockedReason === "prior_writer"
1368
+ ? "pending"
1369
+ : "idle"
1370
+ }
1371
+ aria-busy={
1372
+ pendingCommands > 0 || authoringBlockedReason === "prior_writer" ? "true" : undefined
1373
+ }
1243
1374
  >
1244
1375
  <div
1245
1376
  role="toolbar"
@@ -1256,8 +1387,22 @@ function PresentationEditorCore({
1256
1387
  >
1257
1388
  <ChevronLeftIcon />
1258
1389
  </button>
1259
- <span className="min-w-16 shrink-0 text-center text-og-xs tabular-nums text-og-fg-muted">
1260
- {activeIndex >= 0 ? `${activeIndex + 1} / ${slides.length}` : `0 / ${slides.length}`}
1390
+ <button
1391
+ ref={mobileSelectorTriggerRef}
1392
+ type="button"
1393
+ aria-label="Choose slide"
1394
+ aria-haspopup="listbox"
1395
+ aria-expanded={mobileSelectorOpen}
1396
+ aria-controls={mobileSelectorOpen ? `${domId}-mobile-slides` : undefined}
1397
+ disabled={slides.length === 0}
1398
+ data-og-mobile-slide-selector
1399
+ onClick={toggleMobileSlideSelector}
1400
+ className="inline-flex min-h-11 min-w-16 shrink-0 items-center justify-center rounded-og-sm px-2 text-og-xs tabular-nums text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 sm:hidden"
1401
+ >
1402
+ <span>{slideCountLabel}</span>
1403
+ </button>
1404
+ <span className="hidden min-w-16 shrink-0 text-center text-og-xs tabular-nums text-og-fg-muted sm:inline">
1405
+ {slideCountLabel}
1261
1406
  </span>
1262
1407
  <button
1263
1408
  type="button"
@@ -1271,7 +1416,7 @@ function PresentationEditorCore({
1271
1416
  <button
1272
1417
  type="button"
1273
1418
  aria-label="Add slide"
1274
- disabled={readOnly}
1419
+ disabled={mutationsBlocked}
1275
1420
  onClick={insertSlide}
1276
1421
  className="ml-0.5 grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 [&>svg]:size-3.5"
1277
1422
  >
@@ -1280,7 +1425,7 @@ function PresentationEditorCore({
1280
1425
  <button
1281
1426
  type="button"
1282
1427
  aria-label="Delete slide"
1283
- disabled={readOnly || !activeSlide}
1428
+ disabled={mutationsBlocked || !activeSlide}
1284
1429
  onClick={deleteSlide}
1285
1430
  className="grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-status-failed disabled:opacity-35 [&>svg]:size-3.5"
1286
1431
  >
@@ -1318,7 +1463,7 @@ function PresentationEditorCore({
1318
1463
  <button
1319
1464
  type="button"
1320
1465
  aria-label="Add text box"
1321
- disabled={readOnly || !activeSlide}
1466
+ disabled={mutationsBlocked || !activeSlide}
1322
1467
  onClick={insertTextBox}
1323
1468
  className="grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 [&>svg]:size-3.5"
1324
1469
  >
@@ -1327,7 +1472,7 @@ function PresentationEditorCore({
1327
1472
  <button
1328
1473
  type="button"
1329
1474
  aria-label="Delete selected object"
1330
- disabled={readOnly || !selected || selected.readOnly}
1475
+ disabled={mutationsBlocked || !selected || selected.readOnly}
1331
1476
  onClick={deleteObject}
1332
1477
  className="grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-status-failed disabled:opacity-35 [&>svg]:size-3.5"
1333
1478
  >
@@ -1339,32 +1484,38 @@ function PresentationEditorCore({
1339
1484
  title={
1340
1485
  commandFailure
1341
1486
  ? "Change not saved"
1487
+ : authoringStatus
1488
+ ? authoringStatus
1489
+ : pendingCommands > 0
1490
+ ? "Saving…"
1491
+ : mutationsBlocked
1492
+ ? "View only"
1493
+ : selected
1494
+ ? `${objectLabel(selected)}${selected.readOnly ? " · View only" : ""}`
1495
+ : "Select an object to edit"
1496
+ }
1497
+ >
1498
+ {commandFailure
1499
+ ? "Change not saved"
1500
+ : authoringStatus
1501
+ ? authoringStatus
1342
1502
  : pendingCommands > 0
1343
1503
  ? "Saving…"
1344
- : readOnly
1504
+ : mutationsBlocked
1345
1505
  ? "View only"
1346
1506
  : selected
1347
1507
  ? `${objectLabel(selected)}${selected.readOnly ? " · View only" : ""}`
1348
- : "Select an object to edit"
1349
- }
1350
- >
1351
- {commandFailure
1352
- ? "Change not saved"
1353
- : pendingCommands > 0
1354
- ? "Saving…"
1355
- : readOnly
1356
- ? "View only"
1357
- : selected
1358
- ? `${objectLabel(selected)}${selected.readOnly ? " · View only" : ""}`
1359
- : "Select an object to edit"}
1508
+ : "Select an object to edit"}
1360
1509
  </span>
1361
1510
  </div>
1362
1511
 
1363
1512
  <div role="status" aria-live="polite" className="sr-only">
1364
- {commandFailure?.message ?? (pendingCommands > 0 ? "Saving presentation changes" : "")}
1513
+ {commandFailure?.message ??
1514
+ authoringStatus ??
1515
+ (pendingCommands > 0 ? "Saving presentation changes" : "")}
1365
1516
  </div>
1366
1517
 
1367
- <div className="flex min-h-0 min-w-0 flex-1">
1518
+ <div className="relative flex min-h-0 min-w-0 flex-1">
1368
1519
  <div
1369
1520
  ref={railRef}
1370
1521
  role="listbox"
@@ -1389,12 +1540,7 @@ function PresentationEditorCore({
1389
1540
  }));
1390
1541
  }}
1391
1542
  onKeyDown={(event) => {
1392
- if (slides.length === 0) return;
1393
- let nextIndex: number | null = null;
1394
- if (event.key === "ArrowDown") nextIndex = Math.min(slides.length - 1, activeIndex + 1);
1395
- else if (event.key === "ArrowUp") nextIndex = Math.max(0, activeIndex - 1);
1396
- else if (event.key === "Home") nextIndex = 0;
1397
- else if (event.key === "End") nextIndex = slides.length - 1;
1543
+ const nextIndex = nextSlideIndexFromKey(event.key, activeIndex, slides.length);
1398
1544
  if (nextIndex === null) return;
1399
1545
  event.preventDefault();
1400
1546
  const next = slides[nextIndex];
@@ -1447,6 +1593,101 @@ function PresentationEditorCore({
1447
1593
  </div>
1448
1594
  </div>
1449
1595
 
1596
+ {mobileSelectorOpen ? (
1597
+ <div
1598
+ ref={mobileSelectorPanelRef}
1599
+ className="absolute left-2 top-2 z-40 max-w-56 overflow-hidden rounded-og-md border border-og-border bg-og-surface-1 shadow-og-md sm:hidden"
1600
+ style={{ width: "calc(100% - 1rem)" }}
1601
+ >
1602
+ <div
1603
+ ref={mobileRailRef}
1604
+ id={`${domId}-mobile-slides`}
1605
+ role="listbox"
1606
+ tabIndex={0}
1607
+ aria-label="Slides"
1608
+ aria-orientation="vertical"
1609
+ aria-activedescendant={
1610
+ activeSlide && activeIndex >= mobileRailStart && activeIndex < mobileRailEnd
1611
+ ? `${domId}-mobile-slide-${safeDomId(activeSlide.id)}`
1612
+ : undefined
1613
+ }
1614
+ className="max-h-72 overflow-y-auto outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent"
1615
+ data-og-mobile-slide-list
1616
+ data-og-window-start={mobileRailStart}
1617
+ data-og-window-end={mobileRailEnd}
1618
+ onScroll={(event) => {
1619
+ const scrollTop = event.currentTarget.scrollTop;
1620
+ const height = event.currentTarget.clientHeight;
1621
+ setMobileRail((current) => ({
1622
+ scrollTop,
1623
+ height: height || current.height,
1624
+ }));
1625
+ }}
1626
+ onKeyDown={(event) => {
1627
+ if (event.key === "Escape") {
1628
+ event.preventDefault();
1629
+ setMobileSelectorOpen(false);
1630
+ mobileSelectorTriggerRef.current?.focus();
1631
+ return;
1632
+ }
1633
+ const nextIndex = nextSlideIndexFromKey(event.key, activeIndex, slides.length);
1634
+ if (nextIndex === null) return;
1635
+ event.preventDefault();
1636
+ const next = slides[nextIndex];
1637
+ if (!next) return;
1638
+ if (next !== activeSlide) selectSlide(next, nextIndex);
1639
+ const list = event.currentTarget;
1640
+ const top = nextIndex * MOBILE_RAIL_ITEM_HEIGHT;
1641
+ const bottom = top + MOBILE_RAIL_ITEM_HEIGHT;
1642
+ if (top < list.scrollTop) list.scrollTop = top;
1643
+ else if (bottom > list.scrollTop + list.clientHeight) {
1644
+ list.scrollTop = bottom - list.clientHeight;
1645
+ }
1646
+ }}
1647
+ >
1648
+ <div
1649
+ className="relative w-full"
1650
+ style={{ height: slides.length * MOBILE_RAIL_ITEM_HEIGHT }}
1651
+ >
1652
+ {slides.slice(mobileRailStart, mobileRailEnd).map((slide, offset) => {
1653
+ const index = mobileRailStart + offset;
1654
+ const active = slide === activeSlide;
1655
+ return (
1656
+ <button
1657
+ key={slide.id}
1658
+ id={`${domId}-mobile-slide-${safeDomId(slide.id)}`}
1659
+ type="button"
1660
+ role="option"
1661
+ tabIndex={-1}
1662
+ aria-selected={active}
1663
+ aria-label={`Slide ${index + 1}${slide.title ? `: ${slide.title}` : ""}`}
1664
+ onClick={() => chooseMobileSlide(slide, index)}
1665
+ className={cn(
1666
+ "absolute left-0 flex min-h-11 w-full items-center gap-2 px-2 text-left",
1667
+ active
1668
+ ? "bg-og-surface-3 text-og-fg"
1669
+ : "text-og-fg-muted hover:bg-og-surface-3/70",
1670
+ )}
1671
+ style={{
1672
+ top: index * MOBILE_RAIL_ITEM_HEIGHT,
1673
+ height: MOBILE_RAIL_ITEM_HEIGHT,
1674
+ }}
1675
+ data-og-mobile-slide-index={index}
1676
+ >
1677
+ <span className="w-7 shrink-0 text-right text-og-xs tabular-nums text-og-fg-subtle">
1678
+ {index + 1}
1679
+ </span>
1680
+ <span className="min-w-0 flex-1 truncate text-og-sm">
1681
+ {slide.title || `Slide ${index + 1}`}
1682
+ </span>
1683
+ </button>
1684
+ );
1685
+ })}
1686
+ </div>
1687
+ </div>
1688
+ </div>
1689
+ ) : null}
1690
+
1450
1691
  <div
1451
1692
  ref={viewportRef}
1452
1693
  className="relative min-h-0 min-w-0 flex-1 overflow-auto bg-og-surface-3/60 p-6"
@@ -1476,7 +1717,10 @@ function PresentationEditorCore({
1476
1717
  <span className="truncate">{commandFailure.message}</span>
1477
1718
  <button
1478
1719
  type="button"
1479
- onClick={commandFailure.retry}
1720
+ disabled={mutationsBlocked}
1721
+ onClick={() => {
1722
+ if (!mutationsBlocked) commandFailure.retry();
1723
+ }}
1480
1724
  className="shrink-0 rounded-og-xs px-1.5 py-0.5 font-medium outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent"
1481
1725
  >
1482
1726
  Retry
@@ -1489,6 +1733,9 @@ function PresentationEditorCore({
1489
1733
  className="relative mx-auto shrink-0 overflow-hidden shadow-og-lg"
1490
1734
  style={{ width: stageWidth, height: stageHeight, backgroundColor: "#fff" }}
1491
1735
  data-og-presentation-stage
1736
+ // The slide is white paper in both app themes, so its selection
1737
+ // chrome uses the light palette to stay visible on it.
1738
+ data-og-theme="light"
1492
1739
  >
1493
1740
  <canvas
1494
1741
  ref={canvasRef}
@@ -1504,7 +1751,7 @@ function PresentationEditorCore({
1504
1751
  aria-describedby={
1505
1752
  selected ? `${instructionsId} ${selectionProxyId}` : instructionsId
1506
1753
  }
1507
- aria-readonly={readOnly || selected?.readOnly || undefined}
1754
+ aria-readonly={mutationsBlocked || selected?.readOnly || undefined}
1508
1755
  viewBox={`0 0 ${presentation.slideSize.width} ${presentation.slideSize.height}`}
1509
1756
  className="absolute inset-0 size-full touch-none outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent"
1510
1757
  onKeyDown={handleCanvasKeyDown}
@@ -1526,17 +1773,17 @@ function PresentationEditorCore({
1526
1773
  width={effectiveSelectedPosition.width}
1527
1774
  height={effectiveSelectedPosition.height}
1528
1775
  fill="transparent"
1529
- stroke="var(--og-accent, #3b82f6)"
1776
+ stroke="var(--og-color-accent-deep)"
1530
1777
  strokeWidth={2}
1531
1778
  vectorEffect="non-scaling-stroke"
1532
1779
  pointerEvents="none"
1533
1780
  />
1534
- {!readOnly && !selected.readOnly ? (
1781
+ {!mutationsBlocked && !selected.readOnly ? (
1535
1782
  <circle
1536
1783
  cx={effectiveSelectedPosition.left + effectiveSelectedPosition.width}
1537
1784
  cy={effectiveSelectedPosition.top + effectiveSelectedPosition.height}
1538
1785
  r={6 / zoom}
1539
- fill="var(--og-accent, #3b82f6)"
1786
+ fill="var(--og-color-accent-deep)"
1540
1787
  stroke="white"
1541
1788
  strokeWidth={1.5}
1542
1789
  vectorEffect="non-scaling-stroke"
@@ -1564,9 +1811,14 @@ function PresentationEditorCore({
1564
1811
  ref={editorRef}
1565
1812
  aria-label={`Edit ${textEdit.shape.name}`}
1566
1813
  value={textDraft}
1814
+ readOnly={mutationsBlocked}
1567
1815
  maxLength={1_000_000}
1568
- onChange={(event) => setTextDraft(event.currentTarget.value)}
1569
- onInput={(event) => setTextDraft(event.currentTarget.value)}
1816
+ onChange={(event) => {
1817
+ if (!mutationsBlocked) setTextDraft(event.currentTarget.value);
1818
+ }}
1819
+ onInput={(event) => {
1820
+ if (!mutationsBlocked) setTextDraft(event.currentTarget.value);
1821
+ }}
1570
1822
  onBlur={() => finishTextEdit()}
1571
1823
  onKeyDown={(event) => {
1572
1824
  if (event.key === "Escape") {
@@ -1614,6 +1866,7 @@ function PresentationEditorCore({
1614
1866
  export function PresentationArtifactSurface({
1615
1867
  presentation,
1616
1868
  title = "Presentation",
1869
+ showHeader,
1617
1870
  subtitle,
1618
1871
  actions,
1619
1872
  busy,
@@ -1625,6 +1878,7 @@ export function PresentationArtifactSurface({
1625
1878
  <ArtifactSurface
1626
1879
  modality="presentation"
1627
1880
  title={title}
1881
+ showHeader={showHeader}
1628
1882
  subtitle={subtitle ?? `${count} slide${count === 1 ? "" : "s"}`}
1629
1883
  actions={actions}
1630
1884
  busy={busy}
@@ -1639,6 +1893,7 @@ export function PresentationArtifactSurface({
1639
1893
  export function PresentationProjectionArtifactSurface({
1640
1894
  projection,
1641
1895
  title = "Presentation",
1896
+ showHeader,
1642
1897
  subtitle,
1643
1898
  actions,
1644
1899
  busy,
@@ -1650,6 +1905,7 @@ export function PresentationProjectionArtifactSurface({
1650
1905
  <ArtifactSurface
1651
1906
  modality="presentation"
1652
1907
  title={title}
1908
+ showHeader={showHeader}
1653
1909
  subtitle={subtitle ?? `${count} slide${count === 1 ? "" : "s"}`}
1654
1910
  actions={actions}
1655
1911
  busy={busy}