@opengeni/react 3.1.0 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +89 -11
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/approvals.d.ts +2 -1
  5. package/dist/artifacts-document.js +5 -3
  6. package/dist/artifacts-presentation.js +5 -3
  7. package/dist/artifacts-spreadsheet.d.ts +1 -1
  8. package/dist/artifacts-spreadsheet.js +5 -3
  9. package/dist/artifacts.d.ts +5 -1
  10. package/dist/artifacts.js +536 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
  16. package/dist/chunk-2DDJ6YH6.js +41 -0
  17. package/dist/chunk-2DDJ6YH6.js.map +1 -0
  18. package/dist/chunk-2HVLQ26H.js +183 -0
  19. package/dist/chunk-2HVLQ26H.js.map +1 -0
  20. package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
  23. package/dist/chunk-2SFFYIH3.js.map +1 -0
  24. package/dist/chunk-3PVDYTTB.js +24 -0
  25. package/dist/chunk-3PVDYTTB.js.map +1 -0
  26. package/dist/chunk-3UZCWK46.js +298 -0
  27. package/dist/chunk-3UZCWK46.js.map +1 -0
  28. package/dist/chunk-47CKUXTW.js +293 -0
  29. package/dist/chunk-47CKUXTW.js.map +1 -0
  30. package/dist/chunk-4QYP6QUI.js +109 -0
  31. package/dist/chunk-4QYP6QUI.js.map +1 -0
  32. package/dist/chunk-5EY26VZ7.js +1053 -0
  33. package/dist/chunk-5EY26VZ7.js.map +1 -0
  34. package/dist/chunk-5I4VRWBB.js +56 -0
  35. package/dist/chunk-5I4VRWBB.js.map +1 -0
  36. package/dist/chunk-5WOR7UCL.js +191 -0
  37. package/dist/chunk-5WOR7UCL.js.map +1 -0
  38. package/dist/chunk-5YJLGOM5.js +51 -0
  39. package/dist/chunk-5YJLGOM5.js.map +1 -0
  40. package/dist/chunk-6JFN3OWG.js +386 -0
  41. package/dist/chunk-6JFN3OWG.js.map +1 -0
  42. package/dist/chunk-7QJT5O4S.js +35 -0
  43. package/dist/chunk-7QJT5O4S.js.map +1 -0
  44. package/dist/chunk-A55KV72M.js +402 -0
  45. package/dist/chunk-A55KV72M.js.map +1 -0
  46. package/dist/chunk-ADWCLI4G.js +2028 -0
  47. package/dist/chunk-ADWCLI4G.js.map +1 -0
  48. package/dist/chunk-B27E3V37.js +29 -0
  49. package/dist/chunk-B27E3V37.js.map +1 -0
  50. package/dist/chunk-B7TC2A33.js +83 -0
  51. package/dist/chunk-B7TC2A33.js.map +1 -0
  52. package/dist/chunk-BLL56F7R.js +385 -0
  53. package/dist/chunk-BLL56F7R.js.map +1 -0
  54. package/dist/chunk-BOFEQC6K.js +162 -0
  55. package/dist/chunk-BOFEQC6K.js.map +1 -0
  56. package/dist/chunk-CM7LVUKC.js +35 -0
  57. package/dist/chunk-CM7LVUKC.js.map +1 -0
  58. package/dist/chunk-CORUP6JB.js +122 -0
  59. package/dist/chunk-CORUP6JB.js.map +1 -0
  60. package/dist/chunk-CSX5FFKZ.js +35 -0
  61. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  62. package/dist/chunk-EGVHJKGJ.js +3125 -0
  63. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  64. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  65. package/dist/chunk-G76LSA76.js.map +1 -0
  66. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  67. package/dist/chunk-GQMRL52F.js.map +1 -0
  68. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  69. package/dist/chunk-GUUXOISA.js.map +1 -0
  70. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  71. package/dist/chunk-I7X2P4FU.js.map +1 -0
  72. package/dist/chunk-IGFZFLI2.js +1390 -0
  73. package/dist/chunk-IGFZFLI2.js.map +1 -0
  74. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  75. package/dist/chunk-IMSUVYQB.js.map +1 -0
  76. package/dist/chunk-IOYHDEP3.js +38 -0
  77. package/dist/chunk-IOYHDEP3.js.map +1 -0
  78. package/dist/chunk-IZV5FTJC.js +55 -0
  79. package/dist/chunk-IZV5FTJC.js.map +1 -0
  80. package/dist/chunk-KF33GTWN.js +343 -0
  81. package/dist/chunk-KF33GTWN.js.map +1 -0
  82. package/dist/chunk-KSGQ5ODA.js +457 -0
  83. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  84. package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
  85. package/dist/chunk-KZC6QRNR.js.map +1 -0
  86. package/dist/chunk-LJUMYUBO.js +218 -0
  87. package/dist/chunk-LJUMYUBO.js.map +1 -0
  88. package/dist/chunk-LSW2OJVV.js +380 -0
  89. package/dist/chunk-LSW2OJVV.js.map +1 -0
  90. package/dist/chunk-M357MHH3.js +2 -0
  91. package/dist/chunk-M357MHH3.js.map +1 -0
  92. package/dist/chunk-MK2TQO4Y.js +24 -0
  93. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  94. package/dist/chunk-N7S72EXK.js +25 -0
  95. package/dist/chunk-N7S72EXK.js.map +1 -0
  96. package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
  97. package/dist/chunk-NKMYZFHA.js.map +1 -0
  98. package/dist/chunk-NX4ADH73.js +14 -0
  99. package/dist/chunk-NX4ADH73.js.map +1 -0
  100. package/dist/chunk-O7F6UJO4.js +71 -0
  101. package/dist/chunk-O7F6UJO4.js.map +1 -0
  102. package/dist/chunk-OVB5WIG5.js +14064 -0
  103. package/dist/chunk-OVB5WIG5.js.map +1 -0
  104. package/dist/chunk-OYQQJL3J.js +16 -0
  105. package/dist/chunk-OYQQJL3J.js.map +1 -0
  106. package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
  107. package/dist/chunk-P4BNUO57.js.map +1 -0
  108. package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
  109. package/dist/chunk-PEHTX3V7.js.map +1 -0
  110. package/dist/chunk-PMV53IMM.js +26 -0
  111. package/dist/chunk-PMV53IMM.js.map +1 -0
  112. package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
  113. package/dist/chunk-PYEOPA4M.js.map +1 -0
  114. package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
  115. package/dist/chunk-QHUE7E4N.js.map +1 -0
  116. package/dist/chunk-QV3DJVRZ.js +11 -0
  117. package/dist/chunk-QV3DJVRZ.js.map +1 -0
  118. package/dist/chunk-R5SBNG7S.js +810 -0
  119. package/dist/chunk-R5SBNG7S.js.map +1 -0
  120. package/dist/chunk-RI42H5IU.js +326 -0
  121. package/dist/chunk-RI42H5IU.js.map +1 -0
  122. package/dist/chunk-S2QH6EZ5.js +211 -0
  123. package/dist/chunk-S2QH6EZ5.js.map +1 -0
  124. package/dist/chunk-SHLZMAJN.js +304 -0
  125. package/dist/chunk-SHLZMAJN.js.map +1 -0
  126. package/dist/chunk-TGXK4BAZ.js +293 -0
  127. package/dist/chunk-TGXK4BAZ.js.map +1 -0
  128. package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
  129. package/dist/chunk-TNEZNMSN.js.map +1 -0
  130. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  131. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  132. package/dist/chunk-UNJPZGNK.js +63 -0
  133. package/dist/chunk-UNJPZGNK.js.map +1 -0
  134. package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-VIUEOHXY.js +394 -0
  137. package/dist/chunk-VIUEOHXY.js.map +1 -0
  138. package/dist/chunk-WIUKB3LD.js +1911 -0
  139. package/dist/chunk-WIUKB3LD.js.map +1 -0
  140. package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
  141. package/dist/chunk-WNN7NO2N.js.map +1 -0
  142. package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
  143. package/dist/chunk-X5UVUIMF.js.map +1 -0
  144. package/dist/chunk-XDA5QJE7.js +402 -0
  145. package/dist/chunk-XDA5QJE7.js.map +1 -0
  146. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  147. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  148. package/dist/chunk-XHF7OYAN.js +1150 -0
  149. package/dist/chunk-XHF7OYAN.js.map +1 -0
  150. package/dist/chunk-YSRBFJMQ.js +43 -0
  151. package/dist/chunk-YSRBFJMQ.js.map +1 -0
  152. package/dist/chunk-ZOZAPAUO.js +174 -0
  153. package/dist/chunk-ZOZAPAUO.js.map +1 -0
  154. package/dist/chunk-ZQV5W7YC.js +809 -0
  155. package/dist/chunk-ZQV5W7YC.js.map +1 -0
  156. package/dist/chunk-ZUWF4NF7.js +13 -0
  157. package/dist/chunk-ZUWF4NF7.js.map +1 -0
  158. package/dist/client.d.ts +16 -7
  159. package/dist/clipboard.js +3 -1
  160. package/dist/commands/types.d.ts +2 -0
  161. package/dist/components/anthropic-mark.d.ts +3 -0
  162. package/dist/components/approval-surface.d.ts +19 -6
  163. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  164. package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
  165. package/dist/components/artifacts/artifact-surface.d.ts +4 -2
  166. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  167. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  168. package/dist/components/artifacts/document-editor.d.ts +4 -2
  169. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  170. package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
  171. package/dist/components/artifacts/editable-document.d.ts +1 -1
  172. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  173. package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
  174. package/dist/components/artifacts/index.d.ts +9 -2
  175. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  176. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  177. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  178. package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
  179. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  180. package/dist/components/artifacts/site-view.d.ts +26 -0
  181. package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
  182. package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
  183. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  184. package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
  185. package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
  186. package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
  187. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  188. package/dist/components/browser-select-control.d.ts +16 -0
  189. package/dist/components/browser-viewer.d.ts +11 -2
  190. package/dist/components/chat-composer.d.ts +21 -3
  191. package/dist/components/child-session-link.d.ts +9 -0
  192. package/dist/components/claude-mark.d.ts +3 -0
  193. package/dist/components/code-editor.d.ts +1 -4
  194. package/dist/components/composer-transcription-control.d.ts +7 -0
  195. package/dist/components/composer.d.ts +34 -67
  196. package/dist/components/computer-viewer.d.ts +1 -1
  197. package/dist/components/copy-button.d.ts +3 -1
  198. package/dist/components/desktop-viewer.d.ts +1 -1
  199. package/dist/components/fleet-tile.d.ts +2 -2
  200. package/dist/components/grok-mark.d.ts +26 -0
  201. package/dist/components/human-input-form.d.ts +28 -32
  202. package/dist/components/human-input-surface.d.ts +7 -2
  203. package/dist/components/linkified-text.d.ts +18 -0
  204. package/dist/components/machine-input-display.d.ts +22 -1
  205. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  206. package/dist/components/machines/machine-detail.d.ts +7 -1
  207. package/dist/components/machines/machine-status.d.ts +48 -0
  208. package/dist/components/markdown-table-layout.d.ts +18 -0
  209. package/dist/components/markdown.d.ts +37 -4
  210. package/dist/components/message-timeline.d.ts +86 -7
  211. package/dist/components/model-mark.d.ts +29 -0
  212. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  213. package/dist/components/model-policy-picker.d.ts +41 -25
  214. package/dist/components/new-conversation.d.ts +32 -0
  215. package/dist/components/open-geni-chat.d.ts +73 -0
  216. package/dist/components/open-geni-links.d.ts +68 -0
  217. package/dist/components/openrouter-mark.d.ts +6 -0
  218. package/dist/components/opper-mark.d.ts +7 -0
  219. package/dist/components/preview-loading.d.ts +2 -0
  220. package/dist/components/provider-recovery-notice.d.ts +16 -0
  221. package/dist/components/queue-item-content.d.ts +9 -0
  222. package/dist/components/rehype-secret-refs.d.ts +23 -0
  223. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  224. package/dist/components/sandbox-files.d.ts +3 -1
  225. package/dist/components/sandbox-workspace.d.ts +18 -0
  226. package/dist/components/secret-question-field.d.ts +31 -0
  227. package/dist/components/secret-ref-chip.d.ts +35 -0
  228. package/dist/components/session-capability-frame.d.ts +37 -0
  229. package/dist/components/session-chrome.d.ts +57 -8
  230. package/dist/components/session-commands-panel.d.ts +6 -0
  231. package/dist/components/session-commands.d.ts +6 -0
  232. package/dist/components/session-connection-request.d.ts +8 -0
  233. package/dist/components/session-conversation.d.ts +157 -0
  234. package/dist/components/session-list.d.ts +39 -0
  235. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  236. package/dist/components/session-proxy-scope.d.ts +35 -0
  237. package/dist/components/session-status.d.ts +4 -1
  238. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  239. package/dist/components/timeline-anchor.d.ts +24 -0
  240. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  241. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  242. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  243. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  244. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  245. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  246. package/dist/components/timeline-annotations.d.ts +13 -3
  247. package/dist/components/timeline-reading-progress.d.ts +11 -0
  248. package/dist/components/timeline-search.d.ts +34 -0
  249. package/dist/components/timeline-settlement.d.ts +16 -0
  250. package/dist/components/tip-follow.d.ts +16 -0
  251. package/dist/components/tool-action-review.d.ts +47 -0
  252. package/dist/components/tool-review-history.d.ts +25 -0
  253. package/dist/components/usage-limit-notice.d.ts +49 -0
  254. package/dist/components/usage-member-list.d.ts +91 -0
  255. package/dist/components/usage-meter.d.ts +73 -0
  256. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  257. package/dist/components/user-message-body.d.ts +10 -1
  258. package/dist/composer-messages.d.ts +74 -0
  259. package/dist/composer-messages.js +9 -0
  260. package/dist/composer-messages.js.map +1 -0
  261. package/dist/composer-voice-events.d.ts +8 -0
  262. package/dist/composer.d.ts +5 -4
  263. package/dist/composer.js +26 -13
  264. package/dist/computer-viewer-GMLDXPON.js +20 -0
  265. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  266. package/dist/connect-account-identity.d.ts +8 -0
  267. package/dist/connect-accounts.d.ts +15 -0
  268. package/dist/connect-chooser.d.ts +18 -0
  269. package/dist/connect-panel.d.ts +18 -0
  270. package/dist/connect-setup.d.ts +18 -0
  271. package/dist/connect.d.ts +21 -0
  272. package/dist/connect.js +2149 -0
  273. package/dist/connect.js.map +1 -0
  274. package/dist/connection-catalog.d.ts +38 -0
  275. package/dist/connection-discovery.d.ts +12 -0
  276. package/dist/connection-installed.d.ts +17 -0
  277. package/dist/connection-logo.d.ts +9 -0
  278. package/dist/connection-service-logo.d.ts +8 -0
  279. package/dist/connection-service-presentation.d.ts +13 -0
  280. package/dist/connection-skeleton.d.ts +5 -0
  281. package/dist/connection-type-picker.d.ts +6 -0
  282. package/dist/conversation-timeline.d.ts +5 -0
  283. package/dist/desktop.d.ts +7 -0
  284. package/dist/desktop.js +27 -0
  285. package/dist/desktop.js.map +1 -0
  286. package/dist/device-authorization.d.ts +23 -0
  287. package/dist/diffs.d.ts +8 -0
  288. package/dist/diffs.js +15 -0
  289. package/dist/diffs.js.map +1 -0
  290. package/dist/discovery-cache.d.ts +5 -0
  291. package/dist/editor.d.ts +7 -0
  292. package/dist/editor.js +22 -0
  293. package/dist/editor.js.map +1 -0
  294. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  295. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  296. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  297. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  298. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  299. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  300. package/dist/hooks/latest-question.d.ts +25 -0
  301. package/dist/hooks/shared-machines-list.d.ts +4 -0
  302. package/dist/hooks/shared-query.d.ts +113 -0
  303. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  304. package/dist/hooks/use-auth-runs.d.ts +1 -4
  305. package/dist/hooks/use-available-models.d.ts +1 -1
  306. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  307. package/dist/hooks/use-browser-session.d.ts +12 -1
  308. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  309. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  310. package/dist/hooks/use-composer.d.ts +24 -2
  311. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  312. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  313. package/dist/hooks/use-computer-session.d.ts +4 -0
  314. package/dist/hooks/use-connect.d.ts +23 -0
  315. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  316. package/dist/hooks/use-file-attachments.d.ts +12 -0
  317. package/dist/hooks/use-goal.d.ts +2 -1
  318. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  319. package/dist/hooks/use-new-conversation.d.ts +56 -0
  320. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  321. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  322. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  323. package/dist/hooks/use-session-conversation.d.ts +49 -0
  324. package/dist/hooks/use-session-events.d.ts +28 -7
  325. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  326. package/dist/hooks/use-session-model-account.d.ts +48 -0
  327. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  328. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  329. package/dist/hooks/use-usage.d.ts +40 -0
  330. package/dist/hooks/use-vaults.d.ts +53 -0
  331. package/dist/hooks/use-voice-input.d.ts +8 -1
  332. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  333. package/dist/hooks/use-workspace-sessions.d.ts +22 -5
  334. package/dist/human-input-model.d.ts +122 -0
  335. package/dist/identity-link-accounts.d.ts +11 -0
  336. package/dist/identity-link-consent.d.ts +18 -0
  337. package/dist/index.d.ts +82 -20
  338. package/dist/index.js +2350 -6605
  339. package/dist/index.js.map +1 -1
  340. package/dist/interaction.d.ts +1 -1
  341. package/dist/interaction.js +14 -24
  342. package/dist/interaction.js.map +1 -1
  343. package/dist/latest-question-R77KWSUP.js +118 -0
  344. package/dist/latest-question-R77KWSUP.js.map +1 -0
  345. package/dist/lib/clipboard.d.ts +7 -0
  346. package/dist/lib/error-message.d.ts +7 -0
  347. package/dist/lib/format.d.ts +58 -4
  348. package/dist/lib/host-theme.d.ts +77 -0
  349. package/dist/lib/interaction-errors.d.ts +3 -0
  350. package/dist/lib/menu-styles.d.ts +22 -0
  351. package/dist/lib/notify-observer.d.ts +2 -0
  352. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  353. package/dist/lib/provider-recovery.d.ts +55 -0
  354. package/dist/lib/scrollbars.d.ts +11 -0
  355. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  356. package/dist/lib/transient-retry.d.ts +25 -0
  357. package/dist/lib/workbench-peers.d.ts +36 -0
  358. package/dist/lib/xterm-theme.d.ts +7 -5
  359. package/dist/machines.js +9 -5
  360. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  361. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  362. package/dist/mcp-connection-status.d.ts +14 -0
  363. package/dist/model-mark-paths.d.ts +34 -0
  364. package/dist/model-mark-paths.js +16 -0
  365. package/dist/model-mark-paths.js.map +1 -0
  366. package/dist/model-picker-model.d.ts +111 -0
  367. package/dist/model-picker-model.js +25 -0
  368. package/dist/model-picker-model.js.map +1 -0
  369. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  370. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  371. package/dist/model-policy.d.ts +30 -3
  372. package/dist/model-policy.js +14 -1
  373. package/dist/native-previews.d.ts +28 -0
  374. package/dist/native-previews.js +82 -0
  375. package/dist/native-previews.js.map +1 -0
  376. package/dist/new-session-draft.d.ts +7 -0
  377. package/dist/new-session-draft.js +639 -0
  378. package/dist/new-session-draft.js.map +1 -0
  379. package/dist/notification-text.d.ts +27 -0
  380. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  381. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  382. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  383. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  384. package/dist/older-history.d.ts +3 -2
  385. package/dist/organization-model.d.ts +32 -0
  386. package/dist/organization-model.js +65 -0
  387. package/dist/organization-model.js.map +1 -0
  388. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  389. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  390. package/dist/plugin-details.d.ts +14 -0
  391. package/dist/plugin-discovery.d.ts +25 -0
  392. package/dist/preview-loading-paint.d.ts +20 -0
  393. package/dist/provider.d.ts +25 -2
  394. package/dist/queue-presentation-model.d.ts +72 -0
  395. package/dist/queue-presentation-model.js +38 -0
  396. package/dist/queue-presentation-model.js.map +1 -0
  397. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  398. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  399. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  400. package/dist/realtime/embedded-voice.d.ts +1 -0
  401. package/dist/realtime/realtime-control.d.ts +4 -65
  402. package/dist/realtime/session-realtime.d.ts +78 -0
  403. package/dist/realtime.js +25 -1294
  404. package/dist/realtime.js.map +1 -1
  405. package/dist/sandbox-files-O27IPOZW.js +21 -0
  406. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  407. package/dist/sandbox-label-model.d.ts +30 -0
  408. package/dist/sandbox-label-model.js +20 -0
  409. package/dist/sandbox-label-model.js.map +1 -0
  410. package/dist/scrollbars.d.ts +1 -0
  411. package/dist/scrollbars.js +10 -0
  412. package/dist/scrollbars.js.map +1 -0
  413. package/dist/secret-reference-label.d.ts +14 -0
  414. package/dist/secrets-ui.d.ts +57 -0
  415. package/dist/session-agents-model.d.ts +10 -0
  416. package/dist/session-agents-model.js +25 -0
  417. package/dist/session-agents-model.js.map +1 -0
  418. package/dist/session-attention-model.d.ts +8 -0
  419. package/dist/session-attention-model.js +47 -0
  420. package/dist/session-attention-model.js.map +1 -0
  421. package/dist/session-auth-recommendation.d.ts +5 -0
  422. package/dist/session-capability-policy.d.ts +31 -0
  423. package/dist/session-feedback-model.d.ts +20 -0
  424. package/dist/session-feedback-model.js +56 -0
  425. package/dist/session-feedback-model.js.map +1 -0
  426. package/dist/session-list-model.d.ts +138 -0
  427. package/dist/session-list-model.js +274 -0
  428. package/dist/session-list-model.js.map +1 -0
  429. package/dist/session-realtime-7DJOIHQW.js +21 -0
  430. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  431. package/dist/session-realtime.d.ts +7 -0
  432. package/dist/session-realtime.js +19 -0
  433. package/dist/session-realtime.js.map +1 -0
  434. package/dist/session-status-model.d.ts +36 -0
  435. package/dist/session-ui.d.ts +39 -1
  436. package/dist/session-ui.js +126 -12
  437. package/dist/session-ui.js.map +1 -1
  438. package/dist/session.d.ts +8 -2
  439. package/dist/session.js +35 -20
  440. package/dist/site-snapshot.d.ts +14 -0
  441. package/dist/sites-ui.d.ts +24 -0
  442. package/dist/sites.d.ts +3 -0
  443. package/dist/sites.js +14 -0
  444. package/dist/sites.js.map +1 -0
  445. package/dist/skill-discovery.d.ts +47 -0
  446. package/dist/terminal.d.ts +8 -0
  447. package/dist/terminal.js +32 -0
  448. package/dist/terminal.js.map +1 -0
  449. package/dist/testing/session-scenarios.d.ts +10 -0
  450. package/dist/testing/session-scenarios.js +367 -0
  451. package/dist/testing/session-scenarios.js.map +1 -0
  452. package/dist/timeline/activity-rail.d.ts +11 -2
  453. package/dist/timeline/agent-identity.d.ts +30 -0
  454. package/dist/timeline/agent-row.d.ts +31 -0
  455. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  456. package/dist/timeline/compaction-copy.d.ts +46 -0
  457. package/dist/timeline/entrance.d.ts +13 -1
  458. package/dist/timeline/focus-sequence.d.ts +9 -0
  459. package/dist/timeline/genie-copy.d.ts +3 -0
  460. package/dist/timeline/genie-loading.d.ts +47 -0
  461. package/dist/timeline/index.d.ts +10 -5
  462. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  463. package/dist/timeline/message-sender.d.ts +19 -0
  464. package/dist/timeline/notice-presentation.d.ts +13 -0
  465. package/dist/timeline/parsers.d.ts +11 -0
  466. package/dist/timeline/patch-apply-command.d.ts +18 -0
  467. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  468. package/dist/timeline/platform-activity-row.d.ts +1 -2
  469. package/dist/timeline/presented-image.d.ts +11 -0
  470. package/dist/timeline/projection.d.ts +31 -2
  471. package/dist/timeline/provider-logo.d.ts +15 -0
  472. package/dist/timeline/question-nav-model.d.ts +23 -0
  473. package/dist/timeline/registry.d.ts +12 -1
  474. package/dist/timeline/retained-image.d.ts +18 -0
  475. package/dist/timeline/retained-loaders.d.ts +27 -0
  476. package/dist/timeline/rolling-activity.d.ts +11 -0
  477. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  478. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  479. package/dist/timeline/shared.d.ts +4 -1
  480. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  481. package/dist/timeline/startup-preference.d.ts +3 -0
  482. package/dist/timeline/startup-timings.d.ts +4 -0
  483. package/dist/timeline/tool-display-name.d.ts +5 -2
  484. package/dist/timeline/tool-presentation.d.ts +172 -0
  485. package/dist/timeline/turn-summary-model.d.ts +95 -0
  486. package/dist/timeline/turn-summary.d.ts +20 -54
  487. package/dist/timeline/types.d.ts +179 -7
  488. package/dist/timeline/work-presentation.d.ts +60 -0
  489. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  490. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  491. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  492. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  493. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  494. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  495. package/dist/timeline-model.d.ts +29 -0
  496. package/dist/timeline-model.js +254 -0
  497. package/dist/timeline-model.js.map +1 -0
  498. package/dist/usage/allowance-copy.d.ts +25 -0
  499. package/dist/usage/session-usage-limit.d.ts +88 -0
  500. package/dist/usage/summary.d.ts +35 -0
  501. package/dist/usage.d.ts +17 -0
  502. package/dist/usage.js +1187 -0
  503. package/dist/usage.js.map +1 -0
  504. package/dist/voice-recording-owner.d.ts +7 -0
  505. package/package.json +107 -7
  506. package/src/accounts.tsx +116 -14
  507. package/src/approvals.ts +8 -1
  508. package/src/artifacts-spreadsheet.ts +1 -0
  509. package/src/artifacts.ts +44 -0
  510. package/src/assets/README.md +8 -0
  511. package/src/assets/gmail.ico +0 -0
  512. package/src/assets/outlook.ico +0 -0
  513. package/src/capability-catalog-row.tsx +94 -0
  514. package/src/capability-logo-fallback.ts +22 -0
  515. package/src/client.ts +20 -31
  516. package/src/commands/registry.ts +18 -15
  517. package/src/commands/types.ts +2 -0
  518. package/src/components/anthropic-mark.tsx +10 -0
  519. package/src/components/approval-surface.tsx +401 -138
  520. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  521. package/src/components/artifacts/artifact-sandbox.tsx +189 -0
  522. package/src/components/artifacts/artifact-surface.tsx +40 -20
  523. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  524. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  525. package/src/components/artifacts/document-editor.tsx +141 -16
  526. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  527. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  528. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  529. package/src/components/artifacts/editable-document.tsx +37 -36
  530. package/src/components/artifacts/editable-presentation.tsx +36 -18
  531. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  532. package/src/components/artifacts/index.ts +45 -0
  533. package/src/components/artifacts/inline-html-document.ts +24 -0
  534. package/src/components/artifacts/latest-task-runner.ts +49 -0
  535. package/src/components/artifacts/presentation-editor.tsx +323 -67
  536. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  537. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  538. package/src/components/artifacts/site-view.tsx +121 -0
  539. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  540. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  541. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  542. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  543. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  544. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  545. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  546. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  547. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  548. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  549. package/src/components/browser-select-control.tsx +312 -0
  550. package/src/components/browser-viewer.tsx +778 -318
  551. package/src/components/chat-composer.tsx +47 -5
  552. package/src/components/child-session-link.tsx +36 -0
  553. package/src/components/claude-mark.tsx +11 -0
  554. package/src/components/code-editor.tsx +13 -16
  555. package/src/components/composer-transcription-control.tsx +128 -30
  556. package/src/components/composer.tsx +404 -195
  557. package/src/components/computer-viewer.tsx +880 -253
  558. package/src/components/copy-button.tsx +13 -5
  559. package/src/components/desktop-viewer.tsx +1 -1
  560. package/src/components/enrollment-consent.tsx +1 -1
  561. package/src/components/enrollment-device-flow.tsx +1 -1
  562. package/src/components/file-browser.tsx +10 -14
  563. package/src/components/fleet-tile.tsx +9 -18
  564. package/src/components/generated-video-player.tsx +4 -2
  565. package/src/components/grok-mark.tsx +34 -0
  566. package/src/components/human-input-form.tsx +590 -283
  567. package/src/components/human-input-surface.tsx +11 -0
  568. package/src/components/interaction-intervention-banner.tsx +2 -2
  569. package/src/components/linkified-text.tsx +79 -0
  570. package/src/components/machine-card.tsx +35 -78
  571. package/src/components/machine-dock-bar.tsx +1 -1
  572. package/src/components/machine-input-display.ts +197 -3
  573. package/src/components/machines/agent-status-icon.tsx +31 -0
  574. package/src/components/machines/machine-detail.tsx +200 -31
  575. package/src/components/machines/machine-operation-policy.tsx +1 -1
  576. package/src/components/machines/machine-status.ts +241 -0
  577. package/src/components/machines-dashboard.tsx +2 -17
  578. package/src/components/markdown-table-layout.ts +143 -0
  579. package/src/components/markdown.tsx +466 -129
  580. package/src/components/message-timeline.tsx +2567 -728
  581. package/src/components/model-mark.tsx +102 -0
  582. package/src/components/model-picker.tsx +15 -4
  583. package/src/components/model-policy-picker-menu.tsx +371 -0
  584. package/src/components/model-policy-picker.tsx +256 -412
  585. package/src/components/new-conversation.tsx +221 -0
  586. package/src/components/open-geni-chat.tsx +309 -0
  587. package/src/components/open-geni-links.tsx +179 -0
  588. package/src/components/openrouter-mark.tsx +13 -0
  589. package/src/components/opper-mark.tsx +18 -0
  590. package/src/components/pierre-diff.tsx +41 -16
  591. package/src/components/pierre-file.tsx +35 -10
  592. package/src/components/preview-loading.tsx +109 -0
  593. package/src/components/provider-recovery-notice.tsx +49 -0
  594. package/src/components/queue-item-content.ts +14 -0
  595. package/src/components/queue-surface-implementation.tsx +51 -356
  596. package/src/components/queue-surface-state.tsx +3 -1
  597. package/src/components/rehype-secret-refs.ts +98 -0
  598. package/src/components/remark-soft-line-breaks.ts +166 -0
  599. package/src/components/sandbox-files.tsx +91 -15
  600. package/src/components/sandbox-terminal.tsx +84 -13
  601. package/src/components/sandbox-workspace.tsx +147 -51
  602. package/src/components/secret-question-field.tsx +324 -0
  603. package/src/components/secret-ref-chip.tsx +185 -0
  604. package/src/components/session-capability-frame.tsx +197 -0
  605. package/src/components/session-chrome.tsx +842 -251
  606. package/src/components/session-commands-panel.tsx +126 -0
  607. package/src/components/session-commands.tsx +18 -0
  608. package/src/components/session-connection-request.tsx +97 -0
  609. package/src/components/session-conversation.tsx +876 -0
  610. package/src/components/session-list.tsx +257 -0
  611. package/src/components/session-mcp-capability-card.tsx +680 -0
  612. package/src/components/session-proxy-scope.tsx +153 -0
  613. package/src/components/session-status.tsx +26 -17
  614. package/src/components/session-usage-limit-notice.tsx +174 -0
  615. package/src/components/timeline-anchor.tsx +119 -0
  616. package/src/components/timeline-annotation-chrome.tsx +196 -0
  617. package/src/components/timeline-annotation-layout.ts +268 -0
  618. package/src/components/timeline-annotation-markers.tsx +185 -0
  619. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  620. package/src/components/timeline-annotation-selection.tsx +106 -54
  621. package/src/components/timeline-annotation-shared.ts +245 -0
  622. package/src/components/timeline-annotations-dialog.tsx +185 -128
  623. package/src/components/timeline-annotations.tsx +189 -45
  624. package/src/components/timeline-reading-progress.ts +80 -0
  625. package/src/components/timeline-search.tsx +168 -0
  626. package/src/components/timeline-settlement.ts +60 -0
  627. package/src/components/tip-follow.ts +52 -0
  628. package/src/components/tool-action-review.tsx +650 -0
  629. package/src/components/tool-review-history.tsx +88 -0
  630. package/src/components/tooltip.tsx +38 -5
  631. package/src/components/usage-limit-notice.tsx +179 -0
  632. package/src/components/usage-member-list.tsx +792 -0
  633. package/src/components/usage-meter.tsx +382 -0
  634. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  635. package/src/components/user-message-body.tsx +27 -2
  636. package/src/components/workspace-dock.tsx +18 -1
  637. package/src/composer-messages.ts +150 -0
  638. package/src/composer-voice-events.ts +12 -0
  639. package/src/composer.ts +6 -1
  640. package/src/connect-account-identity.tsx +34 -0
  641. package/src/connect-accounts.tsx +233 -0
  642. package/src/connect-chooser.tsx +336 -0
  643. package/src/connect-panel.tsx +99 -0
  644. package/src/connect-setup.tsx +355 -0
  645. package/src/connect.ts +60 -0
  646. package/src/connection-assets.d.ts +4 -0
  647. package/src/connection-catalog.tsx +162 -0
  648. package/src/connection-discovery.tsx +238 -0
  649. package/src/connection-installed.tsx +51 -0
  650. package/src/connection-logo.tsx +37 -0
  651. package/src/connection-service-logo.tsx +55 -0
  652. package/src/connection-service-presentation.ts +46 -0
  653. package/src/connection-skeleton.tsx +16 -0
  654. package/src/connection-type-picker.tsx +36 -0
  655. package/src/conversation-timeline.ts +92 -0
  656. package/src/desktop.ts +24 -0
  657. package/src/device-authorization.tsx +98 -0
  658. package/src/diffs.ts +16 -0
  659. package/src/discovery-cache.ts +42 -0
  660. package/src/editor.ts +13 -0
  661. package/src/hooks/internal.ts +3 -2
  662. package/src/hooks/latest-question.ts +164 -0
  663. package/src/hooks/shared-machines-list.ts +34 -1
  664. package/src/hooks/shared-query.ts +721 -0
  665. package/src/hooks/use-attached-browsers.ts +1 -1
  666. package/src/hooks/use-auth-runs.ts +0 -27
  667. package/src/hooks/use-available-models.ts +21 -15
  668. package/src/hooks/use-browser-frame-stream.ts +19 -2
  669. package/src/hooks/use-browser-session.ts +680 -205
  670. package/src/hooks/use-browser-sessions.ts +32 -1
  671. package/src/hooks/use-client-config-flags.ts +118 -0
  672. package/src/hooks/use-codex-accounts.ts +247 -47
  673. package/src/hooks/use-composer.ts +276 -47
  674. package/src/hooks/use-computer-frame-stream.ts +25 -7
  675. package/src/hooks/use-computer-input-posture.ts +94 -0
  676. package/src/hooks/use-computer-session.ts +409 -95
  677. package/src/hooks/use-connect.ts +23 -0
  678. package/src/hooks/use-desktop-stream.ts +19 -28
  679. package/src/hooks/use-file-attachments.ts +80 -4
  680. package/src/hooks/use-goal.ts +107 -13
  681. package/src/hooks/use-last-started-turn-policy.ts +46 -14
  682. package/src/hooks/use-machines.ts +4 -0
  683. package/src/hooks/use-new-conversation.ts +374 -0
  684. package/src/hooks/use-new-session-draft.ts +813 -0
  685. package/src/hooks/use-realtime-voice-models.ts +46 -0
  686. package/src/hooks/use-sandbox-files.ts +68 -20
  687. package/src/hooks/use-session-background-commands.ts +22 -11
  688. package/src/hooks/use-session-capabilities.ts +3 -2
  689. package/src/hooks/use-session-conversation.ts +150 -0
  690. package/src/hooks/use-session-events.ts +703 -382
  691. package/src/hooks/use-session-lineage.ts +20 -16
  692. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  693. package/src/hooks/use-session-model-account.ts +174 -0
  694. package/src/hooks/use-session.ts +53 -21
  695. package/src/hooks/use-slash-commands.ts +6 -11
  696. package/src/hooks/use-supergrok-accounts.ts +22 -8
  697. package/src/hooks/use-terminal-stream.ts +153 -27
  698. package/src/hooks/use-transcription.ts +6 -0
  699. package/src/hooks/use-turn-queue.ts +2 -1
  700. package/src/hooks/use-usage.ts +100 -0
  701. package/src/hooks/use-vaults.ts +153 -0
  702. package/src/hooks/use-video-artifact-playback.ts +1 -1
  703. package/src/hooks/use-voice-input.ts +127 -19
  704. package/src/hooks/use-workspace-capture.ts +3 -2
  705. package/src/hooks/use-workspace-edit.ts +23 -5
  706. package/src/hooks/use-workspace-sessions.ts +97 -32
  707. package/src/human-input-model.ts +359 -0
  708. package/src/identity-link-accounts.tsx +148 -0
  709. package/src/identity-link-consent.tsx +192 -0
  710. package/src/index.ts +262 -16
  711. package/src/interaction.ts +1 -0
  712. package/src/lib/clipboard.ts +29 -0
  713. package/src/lib/error-message.ts +37 -0
  714. package/src/lib/format.ts +213 -16
  715. package/src/lib/host-theme.ts +529 -0
  716. package/src/lib/interaction-errors.ts +15 -0
  717. package/src/lib/menu-styles.ts +44 -0
  718. package/src/lib/notify-observer.ts +15 -0
  719. package/src/lib/pierre-diffs-loader.ts +53 -0
  720. package/src/lib/provider-recovery.ts +243 -0
  721. package/src/lib/scrollbars.ts +30 -0
  722. package/src/lib/terminal-input-readiness.ts +51 -0
  723. package/src/lib/transient-retry.ts +99 -0
  724. package/src/lib/workbench-peers.ts +62 -0
  725. package/src/lib/xterm-theme.ts +23 -21
  726. package/src/mcp-connection-status.ts +35 -0
  727. package/src/model-mark-paths.ts +53 -0
  728. package/src/model-picker-model.ts +330 -0
  729. package/src/model-policy.ts +299 -74
  730. package/src/native-previews.ts +100 -0
  731. package/src/new-session-draft.ts +22 -0
  732. package/src/notification-text.ts +81 -0
  733. package/src/older-history.ts +22 -4
  734. package/src/organization-model.ts +118 -0
  735. package/src/plugin-details.tsx +185 -0
  736. package/src/plugin-discovery.tsx +196 -0
  737. package/src/preview-loading-paint.ts +68 -0
  738. package/src/provider.tsx +74 -15
  739. package/src/queue-presentation-model.ts +464 -0
  740. package/src/realtime/dropdown-menu.tsx +19 -12
  741. package/src/realtime/embedded-new-voice.tsx +1 -0
  742. package/src/realtime/embedded-voice.tsx +3 -0
  743. package/src/realtime/realtime-control.tsx +138 -501
  744. package/src/realtime/session-realtime.ts +566 -0
  745. package/src/sandbox-label-model.ts +53 -0
  746. package/src/scrollbars.ts +3 -0
  747. package/src/secret-reference-label.ts +43 -0
  748. package/src/secrets-ui.tsx +59 -0
  749. package/src/session-agents-model.ts +33 -0
  750. package/src/session-attention-model.ts +62 -0
  751. package/src/session-auth-recommendation.ts +48 -0
  752. package/src/session-capability-policy.ts +196 -0
  753. package/src/session-context.ts +3 -4
  754. package/src/session-feedback-model.ts +95 -0
  755. package/src/session-list-model.ts +434 -0
  756. package/src/session-realtime.ts +18 -0
  757. package/src/session-status-model.ts +99 -0
  758. package/src/session-ui.ts +98 -1
  759. package/src/session.ts +17 -1
  760. package/src/site-snapshot.ts +74 -0
  761. package/src/sites-ui.tsx +348 -0
  762. package/src/sites.ts +3 -0
  763. package/src/skill-discovery.tsx +208 -0
  764. package/src/terminal.ts +26 -0
  765. package/src/testing/session-scenarios.ts +404 -0
  766. package/src/timeline/activity-rail.tsx +242 -101
  767. package/src/timeline/agent-identity.tsx +84 -0
  768. package/src/timeline/agent-row.tsx +231 -0
  769. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  770. package/src/timeline/compaction-copy.ts +115 -0
  771. package/src/timeline/entrance.tsx +28 -3
  772. package/src/timeline/fleet-decision-projection.ts +2 -1
  773. package/src/timeline/fleet-decision-row.tsx +1 -0
  774. package/src/timeline/focus-sequence.ts +44 -0
  775. package/src/timeline/genie-copy.ts +19 -0
  776. package/src/timeline/genie-loading.tsx +143 -0
  777. package/src/timeline/index.ts +30 -2
  778. package/src/timeline/knowledge-receipt.tsx +100 -0
  779. package/src/timeline/message-sender.tsx +71 -0
  780. package/src/timeline/notice-presentation.ts +48 -0
  781. package/src/timeline/parsers.ts +42 -2
  782. package/src/timeline/patch-apply-command.tsx +135 -0
  783. package/src/timeline/platform-activity-presentation.ts +166 -0
  784. package/src/timeline/platform-activity-row.tsx +15 -90
  785. package/src/timeline/presented-image.ts +63 -0
  786. package/src/timeline/projection.ts +1746 -76
  787. package/src/timeline/provider-logo.tsx +53 -0
  788. package/src/timeline/question-nav-model.ts +28 -0
  789. package/src/timeline/registry.ts +26 -4
  790. package/src/timeline/retained-image.ts +97 -0
  791. package/src/timeline/retained-loaders.ts +91 -0
  792. package/src/timeline/rolling-activity.tsx +80 -0
  793. package/src/timeline/screenshot-lightbox.tsx +228 -5
  794. package/src/timeline/session-usage-limit-row.tsx +42 -0
  795. package/src/timeline/shared.tsx +42 -15
  796. package/src/timeline/startup-dispatch-details.tsx +36 -0
  797. package/src/timeline/startup-preference.ts +33 -0
  798. package/src/timeline/startup-timings.tsx +145 -0
  799. package/src/timeline/tool-display-name.ts +19 -7
  800. package/src/timeline/tool-presentation.ts +1316 -0
  801. package/src/timeline/tool-renderers.tsx +835 -1138
  802. package/src/timeline/turn-summary-model.ts +343 -0
  803. package/src/timeline/turn-summary.tsx +272 -365
  804. package/src/timeline/types.ts +189 -6
  805. package/src/timeline/work-presentation.ts +189 -0
  806. package/src/timeline-model.ts +143 -0
  807. package/src/usage/allowance-copy.ts +64 -0
  808. package/src/usage/session-usage-limit.ts +266 -0
  809. package/src/usage/summary.ts +93 -0
  810. package/src/usage.ts +70 -0
  811. package/src/voice-recording-owner.ts +22 -0
  812. package/styles/compiled.css +2319 -748
  813. package/styles/connect.css +290 -0
  814. package/styles/connect.d.ts +1 -0
  815. package/styles/effective-tokens.css +1 -0
  816. package/styles/index.css +309 -9
  817. package/styles/responsive.css +99 -7
  818. package/styles/session-capability.css +44 -0
  819. package/styles/tokens.css +134 -66
  820. package/dist/browser-viewer-AEFHUYZK.js +0 -14
  821. package/dist/chunk-4MDLEHXL.js.map +0 -1
  822. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  823. package/dist/chunk-D3UIAJKY.js.map +0 -1
  824. package/dist/chunk-ELIYWBZR.js.map +0 -1
  825. package/dist/chunk-H5YGYNXS.js.map +0 -1
  826. package/dist/chunk-HQVCKCLG.js +0 -9458
  827. package/dist/chunk-HQVCKCLG.js.map +0 -1
  828. package/dist/chunk-HUIKIDM5.js.map +0 -1
  829. package/dist/chunk-ICA6R6TW.js.map +0 -1
  830. package/dist/chunk-JVYQRRC4.js.map +0 -1
  831. package/dist/chunk-KCGXPP5V.js.map +0 -1
  832. package/dist/chunk-KZ73RL76.js.map +0 -1
  833. package/dist/chunk-LAKLF4PA.js +0 -141
  834. package/dist/chunk-LAKLF4PA.js.map +0 -1
  835. package/dist/chunk-MZ2G2XBA.js.map +0 -1
  836. package/dist/chunk-NEXLLTP4.js.map +0 -1
  837. package/dist/chunk-OAM4WAAM.js.map +0 -1
  838. package/dist/chunk-PEI6RANI.js.map +0 -1
  839. package/dist/chunk-RGALCTWO.js.map +0 -1
  840. package/dist/chunk-W6NFJXSA.js +0 -454
  841. package/dist/chunk-W6NFJXSA.js.map +0 -1
  842. package/dist/chunk-WSK7G5LE.js +0 -170
  843. package/dist/chunk-WSK7G5LE.js.map +0 -1
  844. package/dist/chunk-X4A66EWZ.js +0 -223
  845. package/dist/chunk-X4A66EWZ.js.map +0 -1
  846. package/dist/chunk-XXWH2JLC.js.map +0 -1
  847. package/dist/chunk-YFKJ7VZH.js +0 -268
  848. package/dist/chunk-YFKJ7VZH.js.map +0 -1
  849. package/dist/chunk-YJFGAFBD.js.map +0 -1
  850. package/dist/computer-viewer-FWEZISW4.js +0 -16
  851. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  852. package/dist/hooks/use-environments.d.ts +0 -41
  853. package/dist/hooks/use-packs.d.ts +0 -32
  854. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  855. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  856. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  857. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  858. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  859. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  860. package/src/hooks/use-environments.ts +0 -182
  861. package/src/hooks/use-packs.ts +0 -157
  862. /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  863. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
@@ -0,0 +1,813 @@
1
+ import type {
2
+ FileAsset,
3
+ NewSessionDraft,
4
+ NewSessionSelectionHistory,
5
+ OpenGeniClient,
6
+ ResourceRef,
7
+ SaveNewSessionDraftRequest,
8
+ } from "@opengeni/sdk";
9
+ import { OpenGeniApiError } from "@opengeni/sdk";
10
+ import { useCallback, useEffect, useRef, useState } from "react";
11
+ import {
12
+ isTransientServiceFailure,
13
+ retryTransient,
14
+ TRANSIENT_RECONNECT_INTERVAL_MS,
15
+ TRANSIENT_RETRY_DELAYS_MS,
16
+ } from "../lib/transient-retry";
17
+
18
+ export type NewSessionDraftEditable = Omit<SaveNewSessionDraftRequest, "expectedRevision">;
19
+
20
+ export type UseNewSessionDraftOptions = {
21
+ workspaceId: string;
22
+ client: Pick<OpenGeniClient, "getNewSessionDraft" | "saveNewSessionDraft" | "getFile">;
23
+ /** The complete browser-visible value. It must contain ready file refs only. */
24
+ value: NewSessionDraftEditable;
25
+ /** Apply a remote value to the controlled text/model/tool/options state. */
26
+ onApplyRemote: (
27
+ value: NewSessionDraftEditable,
28
+ selectionHistory: NewSessionSelectionHistory,
29
+ ) => void;
30
+ /** Replace finalized attachments with freshly revalidated server assets. */
31
+ restoreReadyFiles: (files: Iterable<FileAsset>) => void;
32
+ /** Revalidate non-file resource identities against the current UI catalog. */
33
+ hydrateResources?: (resources: ResourceRef[]) => ResourceRef[] | Promise<ResourceRef[]>;
34
+ /** Keep the first read pending until catalogs needed for hydration are ready. */
35
+ resourceHydrationReady?: boolean;
36
+ /** A create in flight owns the exact clicked snapshot; resume autosave on settlement. */
37
+ suspendAutosave?: boolean;
38
+ /** Test seam for the quiet retry backoff and the background reconnect pace. */
39
+ transientRetry?: { delaysMs?: readonly number[]; reconnectIntervalMs?: number };
40
+ };
41
+
42
+ export type FlushedNewSessionDraft = {
43
+ revision: number;
44
+ /** Signature of the exact local snapshot acknowledged by this revision. */
45
+ signature: string;
46
+ };
47
+
48
+ export type AcknowledgeConsumedNewSessionDraftResult =
49
+ | { kind: "consumed" }
50
+ | { kind: "preserved"; flushed: FlushedNewSessionDraft };
51
+
52
+ export type UseNewSessionDraftResult = {
53
+ draft: NewSessionDraft | null;
54
+ revision: number;
55
+ loading: boolean;
56
+ saving: boolean;
57
+ conflict: Error | null;
58
+ error: Error | null;
59
+ /**
60
+ * `error` only says Opengeni was briefly unreachable (a deploy or database
61
+ * restart). Show the calm updating notice instead of the error; the hook
62
+ * keeps reconnecting in the background and clears this on success.
63
+ */
64
+ unavailable: boolean;
65
+ /** The latest failure, readable right after an awaited call (state lags a render). */
66
+ currentError: () => Error | null;
67
+ /** Mark Opengeni unreachable after a transient failure elsewhere in the send path. */
68
+ reportUnavailable: (cause: unknown) => boolean;
69
+ flush: () => Promise<FlushedNewSessionDraft | null>;
70
+ /** Send the visible snapshot, rebasing a stale draft revision without replacing the composer. */
71
+ flushForSend: (snapshot?: NewSessionDraftEditable) => Promise<FlushedNewSessionDraft | null>;
72
+ isCurrentSignature: (signature: string) => boolean;
73
+ /**
74
+ * Fence the exact acknowledged snapshot after session creation consumes it,
75
+ * preserving a genuinely newer local value against the safe-seed row.
76
+ */
77
+ acknowledgeConsumed: (
78
+ flushed: FlushedNewSessionDraft,
79
+ visibleSignature?: string,
80
+ ) => Promise<AcknowledgeConsumedNewSessionDraftResult | null>;
81
+ reload: () => Promise<void>;
82
+ /** Surface a create-time OCC rejection through the ordinary draft recovery UI. */
83
+ captureConflict: (cause: unknown) => boolean;
84
+ resolveConflict: (choice: "keep_mine" | "use_remote") => Promise<void>;
85
+ clearError: () => void;
86
+ };
87
+
88
+ type ValidatedRemoteDraft = {
89
+ draft: NewSessionDraft;
90
+ editable: NewSessionDraftEditable;
91
+ files: FileAsset[];
92
+ };
93
+
94
+ /**
95
+ * Actor-private, server-authoritative state for the composer shown before a
96
+ * session exists. Reads and writes are fenced to one client/workspace target;
97
+ * writes serialize and acquire the latest acknowledged revision at execution
98
+ * time, so a stale closure can never invent its own OCC base.
99
+ */
100
+ export function useNewSessionDraft(options: UseNewSessionDraftOptions): UseNewSessionDraftResult {
101
+ const { client, workspaceId } = options;
102
+ const resourceHydrationReady = options.resourceHydrationReady ?? true;
103
+ const suspendAutosave = options.suspendAutosave ?? false;
104
+ const hydrateResources = options.hydrateResources;
105
+ const retryDelaysMs = options.transientRetry?.delaysMs ?? TRANSIENT_RETRY_DELAYS_MS;
106
+ const reconnectIntervalMs =
107
+ options.transientRetry?.reconnectIntervalMs ?? TRANSIENT_RECONNECT_INTERVAL_MS;
108
+ const [draft, setDraft] = useState<NewSessionDraft | null>(null);
109
+ const [loading, setLoading] = useState(true);
110
+ const [saving, setSaving] = useState(false);
111
+ const [conflict, setConflict] = useState<Error | null>(null);
112
+ const [error, setErrorState] = useState<Error | null>(null);
113
+ const errorRef = useRef<Error | null>(null);
114
+ const setError = useCallback((next: Error | null) => {
115
+ errorRef.current = next;
116
+ setErrorState(next);
117
+ }, []);
118
+ /**
119
+ * Composer value when a first load failed. A background reconnect may apply
120
+ * the remote draft only while the person has not edited since then.
121
+ */
122
+ const unloadedValueSignature = useRef<string | null>(null);
123
+ const valueRef = useRef(options.value);
124
+ valueRef.current = options.value;
125
+ const onApplyRemoteRef = useRef(options.onApplyRemote);
126
+ onApplyRemoteRef.current = options.onApplyRemote;
127
+ const restoreReadyFilesRef = useRef(options.restoreReadyFiles);
128
+ restoreReadyFilesRef.current = options.restoreReadyFiles;
129
+ const draftRef = useRef<NewSessionDraft | null>(null);
130
+ const lastSavedSignature = useRef<string | null>(null);
131
+ const passiveProjectionSignature = useRef<string | null>(null);
132
+ const pendingHydratedBaselineGeneration = useRef<number | null>(null);
133
+ const targetGeneration = useRef(0);
134
+ const persistenceEpoch = useRef(0);
135
+ const saveChain = useRef<Promise<void>>(Promise.resolve());
136
+ const autosaveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
137
+ const conflictRef = useRef<Error | null>(null);
138
+ const loadingRef = useRef(true);
139
+ const activeRemoteReads = useRef(new Set<AbortController>());
140
+ const targetKey = `${workspaceId}\u0000${clientIdentity(client)}`;
141
+ const targetKeyRef = useRef(targetKey);
142
+
143
+ const setCurrentConflict = useCallback((next: Error | null) => {
144
+ conflictRef.current = next;
145
+ setConflict(next);
146
+ }, []);
147
+
148
+ const captureConflict = useCallback(
149
+ (cause: unknown): boolean => {
150
+ if (!isNewSessionDraftConflict(cause)) return false;
151
+ const problem = asError(cause);
152
+ setCurrentConflict(problem);
153
+ setError(problem);
154
+ return true;
155
+ },
156
+ [setCurrentConflict, setError],
157
+ );
158
+
159
+ const abortActiveRemoteReads = useCallback(() => {
160
+ for (const controller of activeRemoteReads.current) controller.abort();
161
+ activeRemoteReads.current.clear();
162
+ }, []);
163
+
164
+ const validateRemoteDraft = useCallback(
165
+ async (
166
+ remote: NewSessionDraft,
167
+ generation: number,
168
+ signal: AbortSignal,
169
+ ): Promise<ValidatedRemoteDraft | null> => {
170
+ if (!resourceHydrationReady || signal.aborted) return null;
171
+ const hydratedResources = hydrateResources
172
+ ? await hydrateResources(remote.resources)
173
+ : remote.resources;
174
+ if (generation !== targetGeneration.current || signal.aborted) return null;
175
+ const seen = new Set<string>();
176
+ const fileRefs = hydratedResources.flatMap((resource) => {
177
+ if (resource.kind !== "file" || seen.has(resource.fileId)) return [];
178
+ seen.add(resource.fileId);
179
+ return [resource];
180
+ });
181
+ const settled = await Promise.allSettled(
182
+ fileRefs.map((resource) =>
183
+ retryTransient(() => client.getFile(workspaceId, resource.fileId, { signal }), {
184
+ signal,
185
+ delaysMs: retryDelaysMs,
186
+ }),
187
+ ),
188
+ );
189
+ if (generation !== targetGeneration.current || signal.aborted) return null;
190
+ const files = settled.flatMap((result, index) => {
191
+ if (result.status !== "fulfilled") return [];
192
+ const file = result.value;
193
+ const expected = fileRefs[index]?.fileId;
194
+ return file.id === expected && file.workspaceId === workspaceId && file.status === "ready"
195
+ ? [file]
196
+ : [];
197
+ });
198
+ return {
199
+ draft: remote,
200
+ editable: {
201
+ text: remote.text,
202
+ resources: [
203
+ ...hydratedResources.filter((resource) => resource.kind === "repository"),
204
+ ...files.map(
205
+ (file): ResourceRef => ({
206
+ kind: "file",
207
+ fileId: file.id,
208
+ }),
209
+ ),
210
+ ],
211
+ tools: remote.tools,
212
+ toolsProvided: remote.toolsProvided,
213
+ model: remote.model,
214
+ reasoningEffort: remote.reasoningEffort,
215
+ latencyMode: remote.latencyMode ?? "standard",
216
+ ...(remote.modelProvided !== undefined ? { modelProvided: remote.modelProvided } : {}),
217
+ ...(Object.hasOwn(remote, "selectedProjectChannelId")
218
+ ? { selectedProjectChannelId: remote.selectedProjectChannelId }
219
+ : {}),
220
+ options: remote.options,
221
+ },
222
+ files,
223
+ };
224
+ },
225
+ [client, hydrateResources, resourceHydrationReady, retryDelaysMs, workspaceId],
226
+ );
227
+
228
+ const readRemote = useCallback(
229
+ async (quietRetries = true): Promise<ValidatedRemoteDraft | null> => {
230
+ const controller = new AbortController();
231
+ activeRemoteReads.current.add(controller);
232
+ const generation = targetGeneration.current;
233
+ try {
234
+ // A deploy or database restart answers 502/503 for a few seconds; the
235
+ // read is safe to repeat, so retry it quietly before reporting anything.
236
+ const remote = normalizeLegacyNewSessionDraft(
237
+ await retryTransient(
238
+ () => client.getNewSessionDraft(workspaceId, { signal: controller.signal }),
239
+ {
240
+ signal: controller.signal,
241
+ shouldContinue: () => generation === targetGeneration.current,
242
+ delaysMs: quietRetries ? retryDelaysMs : [],
243
+ },
244
+ ),
245
+ );
246
+ if (generation !== targetGeneration.current || controller.signal.aborted) return null;
247
+ return await validateRemoteDraft(remote, generation, controller.signal);
248
+ } finally {
249
+ activeRemoteReads.current.delete(controller);
250
+ }
251
+ },
252
+ [client, retryDelaysMs, validateRemoteDraft, workspaceId],
253
+ );
254
+
255
+ const applyRemote = useCallback(
256
+ (remote: ValidatedRemoteDraft): void => {
257
+ draftRef.current = remote.draft;
258
+ // A GET may project away revoked files, repositories, or tools without
259
+ // changing the stored row. This signature suppresses passive autosave;
260
+ // explicit Send always writes its exact snapshot before create.
261
+ lastSavedSignature.current = draftSignature(remote.editable);
262
+ passiveProjectionSignature.current = null;
263
+ pendingHydratedBaselineGeneration.current = targetGeneration.current;
264
+ unloadedValueSignature.current = null;
265
+ setDraft(remote.draft);
266
+ setCurrentConflict(null);
267
+ setError(null);
268
+ restoreReadyFilesRef.current(remote.files);
269
+ onApplyRemoteRef.current(remote.editable, remote.draft.selectionHistory);
270
+ },
271
+ [setCurrentConflict, setError],
272
+ );
273
+
274
+ const reload = useCallback(async (): Promise<void> => {
275
+ if (!resourceHydrationReady) return;
276
+ const generation = targetGeneration.current;
277
+ const valueAtStart = draftSignature(valueRef.current);
278
+ loadingRef.current = true;
279
+ setLoading(true);
280
+ try {
281
+ const remote = await readRemote();
282
+ if (remote && generation === targetGeneration.current) applyRemote(remote);
283
+ } catch (cause) {
284
+ if (generation === targetGeneration.current) {
285
+ if (!draftRef.current) unloadedValueSignature.current = valueAtStart;
286
+ setError(asError(cause));
287
+ }
288
+ } finally {
289
+ if (generation === targetGeneration.current) {
290
+ loadingRef.current = false;
291
+ setLoading(false);
292
+ }
293
+ }
294
+ }, [applyRemote, readRemote, resourceHydrationReady, setError]);
295
+
296
+ // `reload` intentionally follows resource hydration callbacks, but those
297
+ // callbacks can change identity when a catalog refresh publishes a new
298
+ // snapshot. Keep the effect below targeted to durable authority (the actor,
299
+ // workspace/client, and readiness), not to an incidental callback identity.
300
+ const reloadRef = useRef(reload);
301
+ reloadRef.current = reload;
302
+
303
+ // A client replacement represents a new authenticated actor. Reset all OCC
304
+ // state before the first await, so no effect in this commit can persist the
305
+ // prior actor/workspace value under the new target.
306
+ useEffect(() => {
307
+ if (targetKeyRef.current !== targetKey) {
308
+ targetKeyRef.current = targetKey;
309
+ }
310
+ targetGeneration.current += 1;
311
+ abortActiveRemoteReads();
312
+ persistenceEpoch.current += 1;
313
+ draftRef.current = null;
314
+ lastSavedSignature.current = null;
315
+ passiveProjectionSignature.current = null;
316
+ pendingHydratedBaselineGeneration.current = null;
317
+ unloadedValueSignature.current = null;
318
+ saveChain.current = Promise.resolve();
319
+ if (autosaveTimer.current) clearTimeout(autosaveTimer.current);
320
+ autosaveTimer.current = null;
321
+ setDraft(null);
322
+ setCurrentConflict(null);
323
+ setError(null);
324
+ setSaving(false);
325
+ loadingRef.current = true;
326
+ setLoading(true);
327
+ return () => {
328
+ targetGeneration.current += 1;
329
+ abortActiveRemoteReads();
330
+ if (autosaveTimer.current) clearTimeout(autosaveTimer.current);
331
+ autosaveTimer.current = null;
332
+ };
333
+ }, [abortActiveRemoteReads, setCurrentConflict, setError, targetKey]);
334
+
335
+ // Initial/target reads wait for the catalogs required to validate resources.
336
+ // A later catalog refresh keeps this boolean true and therefore does not
337
+ // restart the read or fence a local/in-flight edit.
338
+ useEffect(() => {
339
+ if (resourceHydrationReady) void reloadRef.current();
340
+ }, [resourceHydrationReady, targetKey]);
341
+
342
+ const persistSnapshot = useCallback(
343
+ (snapshot: NewSessionDraftEditable, force = false): Promise<FlushedNewSessionDraft | null> => {
344
+ const generation = targetGeneration.current;
345
+ const epoch = persistenceEpoch.current;
346
+ const signature = draftSignature(snapshot);
347
+ const run = async (): Promise<FlushedNewSessionDraft | null> => {
348
+ if (generation !== targetGeneration.current || epoch !== persistenceEpoch.current) {
349
+ return null;
350
+ }
351
+ const current = draftRef.current;
352
+ if (!current) return null;
353
+ if (!force && signature === lastSavedSignature.current) {
354
+ return { revision: current.revision, signature };
355
+ }
356
+ setSaving(true);
357
+ try {
358
+ const save = () =>
359
+ client.saveNewSessionDraft(workspaceId, {
360
+ ...snapshot,
361
+ expectedRevision: current.revision,
362
+ });
363
+ // Send's save is idempotent by construction: it writes one exact
364
+ // snapshot against one expected revision. If an unconfirmed attempt
365
+ // did commit, the repeat is a revision conflict that flushForSend
366
+ // already reconciles by rereading, so it can never apply twice.
367
+ const saved = force
368
+ ? await retryTransient(save, {
369
+ shouldContinue: () =>
370
+ generation === targetGeneration.current && epoch === persistenceEpoch.current,
371
+ delaysMs: retryDelaysMs,
372
+ })
373
+ : await save();
374
+ if (generation !== targetGeneration.current || epoch !== persistenceEpoch.current) {
375
+ return null;
376
+ }
377
+ draftRef.current = saved;
378
+ lastSavedSignature.current = signature;
379
+ passiveProjectionSignature.current = null;
380
+ setDraft(saved);
381
+ setCurrentConflict(null);
382
+ setError(null);
383
+ return { revision: saved.revision, signature };
384
+ } catch (cause) {
385
+ if (generation !== targetGeneration.current || epoch !== persistenceEpoch.current) {
386
+ return null;
387
+ }
388
+ const problem = asError(cause);
389
+ if (isNewSessionDraftConflict(cause)) setCurrentConflict(problem);
390
+ setError(problem);
391
+ return null;
392
+ } finally {
393
+ if (generation === targetGeneration.current && epoch === persistenceEpoch.current) {
394
+ setSaving(false);
395
+ }
396
+ }
397
+ };
398
+ const operation = saveChain.current.then(run, run);
399
+ saveChain.current = operation.then(
400
+ () => undefined,
401
+ () => undefined,
402
+ );
403
+ return operation;
404
+ },
405
+ [client, retryDelaysMs, setCurrentConflict, setError, workspaceId],
406
+ );
407
+
408
+ const valueSignature = draftSignature(options.value);
409
+ useEffect(() => {
410
+ if (
411
+ !loading &&
412
+ draftRef.current &&
413
+ pendingHydratedBaselineGeneration.current === targetGeneration.current
414
+ ) {
415
+ // Route hydration may deliberately project the durable row through newer
416
+ // route intent (Recents/Default/named project) and therefore change its
417
+ // compute/provenance representation. The first complete controlled value
418
+ // after onApplyRemote is a passive-autosave baseline only. It is not a
419
+ // durable acknowledgement: an immediate create-time flush must persist
420
+ // this projection against the remote revision before exact create.
421
+ pendingHydratedBaselineGeneration.current = null;
422
+ passiveProjectionSignature.current = valueSignature;
423
+ return;
424
+ }
425
+ if (
426
+ loading ||
427
+ suspendAutosave ||
428
+ !draftRef.current ||
429
+ conflictRef.current ||
430
+ valueSignature === lastSavedSignature.current ||
431
+ valueSignature === passiveProjectionSignature.current
432
+ ) {
433
+ return;
434
+ }
435
+ passiveProjectionSignature.current = null;
436
+ const snapshot = cloneEditable(valueRef.current);
437
+ autosaveTimer.current = setTimeout(() => {
438
+ autosaveTimer.current = null;
439
+ void persistSnapshot(snapshot);
440
+ }, 500);
441
+ return () => {
442
+ if (autosaveTimer.current) clearTimeout(autosaveTimer.current);
443
+ autosaveTimer.current = null;
444
+ };
445
+ }, [loading, persistSnapshot, suspendAutosave, valueSignature]);
446
+
447
+ const flush = useCallback(async (): Promise<FlushedNewSessionDraft | null> => {
448
+ if (loadingRef.current || conflictRef.current || !draftRef.current) return null;
449
+ if (autosaveTimer.current) clearTimeout(autosaveTimer.current);
450
+ autosaveTimer.current = null;
451
+ return await persistSnapshot(cloneEditable(valueRef.current));
452
+ }, [persistSnapshot]);
453
+
454
+ const flushForSend = useCallback(
455
+ async (sendSnapshot?: NewSessionDraftEditable): Promise<FlushedNewSessionDraft | null> => {
456
+ if (loadingRef.current) return null;
457
+ if (autosaveTimer.current) clearTimeout(autosaveTimer.current);
458
+ autosaveTimer.current = null;
459
+ const snapshot = cloneEditable(sendSnapshot ?? valueRef.current);
460
+ const generation = targetGeneration.current;
461
+ if (!draftRef.current) {
462
+ // A consumed draft can be followed by a newer local edit. Reacquire
463
+ // the safe seed before preserving that edit.
464
+ try {
465
+ const remote = await readRemote();
466
+ if (!remote || generation !== targetGeneration.current) return null;
467
+ draftRef.current = remote.draft;
468
+ lastSavedSignature.current = draftSignature(remote.editable);
469
+ setDraft(remote.draft);
470
+ } catch (cause) {
471
+ if (generation === targetGeneration.current) setError(asError(cause));
472
+ return null;
473
+ }
474
+ }
475
+ // A sibling can save between our read and write. Retry a bounded number of
476
+ // times; only the explicit Send may choose the visible snapshot over it.
477
+ for (let attempt = 0; attempt < 3; attempt += 1) {
478
+ if (generation !== targetGeneration.current) return null;
479
+ if (conflictRef.current) {
480
+ await saveChain.current;
481
+ try {
482
+ const remote = await readRemote();
483
+ if (!remote || generation !== targetGeneration.current) return null;
484
+ draftRef.current = remote.draft;
485
+ lastSavedSignature.current = draftSignature(remote.editable);
486
+ passiveProjectionSignature.current = null;
487
+ setDraft(remote.draft);
488
+ setCurrentConflict(null);
489
+ setError(null);
490
+ } catch (cause) {
491
+ if (generation === targetGeneration.current) setError(asError(cause));
492
+ return null;
493
+ }
494
+ }
495
+ // GET can be a sanitized projection of a different stored row. An
496
+ // explicit Send always writes its clicked snapshot, even when its
497
+ // signature appears unchanged, before exact create consumes it.
498
+ const flushed = await persistSnapshot(snapshot, true);
499
+ if (flushed) return flushed;
500
+ if (!conflictRef.current) return null;
501
+ }
502
+ return null;
503
+ },
504
+ [persistSnapshot, readRemote, setCurrentConflict, setError],
505
+ );
506
+
507
+ const isCurrentSignature = useCallback(
508
+ (signature: string): boolean => draftSignature(valueRef.current) === signature,
509
+ [],
510
+ );
511
+
512
+ const acknowledgeConsumed = useCallback(
513
+ async (
514
+ flushed: FlushedNewSessionDraft,
515
+ visibleSignature = flushed.signature,
516
+ ): Promise<AcknowledgeConsumedNewSessionDraftResult | null> => {
517
+ const current = draftRef.current;
518
+ if (
519
+ !current ||
520
+ current.revision !== flushed.revision ||
521
+ lastSavedSignature.current !== flushed.signature
522
+ ) {
523
+ return null;
524
+ }
525
+
526
+ if (autosaveTimer.current) clearTimeout(autosaveTimer.current);
527
+ autosaveTimer.current = null;
528
+
529
+ const generation = targetGeneration.current;
530
+ const epoch = persistenceEpoch.current + 1;
531
+ persistenceEpoch.current = epoch;
532
+ const priorSaves = saveChain.current;
533
+
534
+ // Session creation accepted this exact server revision. Invalidate every
535
+ // save that captured the old row as its OCC base, then wait for its
536
+ // physical response before reading the safe seed. A late response must
537
+ // not restore stale persistence authority or race the seed read.
538
+ setCurrentConflict(null);
539
+ setError(null);
540
+
541
+ const run = async (): Promise<AcknowledgeConsumedNewSessionDraftResult | null> => {
542
+ if (generation !== targetGeneration.current || epoch !== persistenceEpoch.current) {
543
+ return null;
544
+ }
545
+ setSaving(true);
546
+ try {
547
+ await priorSaves;
548
+ if (generation !== targetGeneration.current || epoch !== persistenceEpoch.current) {
549
+ return null;
550
+ }
551
+ const remote = await readRemote();
552
+ if (!remote || generation !== targetGeneration.current) return null;
553
+
554
+ // A successful create turns the accepted revision into exactly one
555
+ // newer safe seed. A larger revision proves that a sibling/in-flight
556
+ // edit won after the create; never overwrite that newer authority.
557
+ const expectedSeedRevision = flushed.revision + 1;
558
+ if (remote.draft.revision > expectedSeedRevision) {
559
+ const problem = new Error(
560
+ "New-session defaults changed in another client while the session was created",
561
+ );
562
+ draftRef.current = remote.draft;
563
+ lastSavedSignature.current = draftSignature(remote.editable);
564
+ passiveProjectionSignature.current = null;
565
+ setDraft(remote.draft);
566
+ setCurrentConflict(problem);
567
+ setError(problem);
568
+ return null;
569
+ }
570
+ if (remote.draft.revision < expectedSeedRevision) {
571
+ const problem = new Error("New-session defaults were not seeded yet");
572
+ setError(problem);
573
+ return null;
574
+ }
575
+
576
+ draftRef.current = remote.draft;
577
+ lastSavedSignature.current = draftSignature(remote.editable);
578
+ passiveProjectionSignature.current = null;
579
+ setDraft(remote.draft);
580
+ // Typing may continue while the safe-seed fetch is pending.
581
+ const snapshot = cloneEditable(valueRef.current);
582
+ const signature = draftSignature(snapshot);
583
+ if (signature === visibleSignature) {
584
+ // The server now owns the safe seed. Keep the post-create composer
585
+ // UI-only until the next page load instead of persisting the
586
+ // route's deliberate clear as a new empty draft.
587
+ draftRef.current = null;
588
+ lastSavedSignature.current = null;
589
+ passiveProjectionSignature.current = null;
590
+ setDraft(null);
591
+ return { kind: "consumed" };
592
+ }
593
+
594
+ // A newer local edit is the next draft. It may be saved only against
595
+ // the exact safe-seed revision; OCC still fences a concurrent sibling
596
+ // save that lands between this read and this write.
597
+ const saved = await client.saveNewSessionDraft(workspaceId, {
598
+ ...snapshot,
599
+ expectedRevision: remote.draft.revision,
600
+ });
601
+ if (generation !== targetGeneration.current || epoch !== persistenceEpoch.current) {
602
+ return null;
603
+ }
604
+ draftRef.current = saved;
605
+ lastSavedSignature.current = signature;
606
+ passiveProjectionSignature.current = null;
607
+ setDraft(saved);
608
+ setCurrentConflict(null);
609
+ setError(null);
610
+ return {
611
+ kind: "preserved",
612
+ flushed: { revision: saved.revision, signature },
613
+ };
614
+ } catch (cause) {
615
+ if (generation !== targetGeneration.current || epoch !== persistenceEpoch.current) {
616
+ return null;
617
+ }
618
+ const problem = asError(cause);
619
+ if (isNewSessionDraftConflict(cause)) setCurrentConflict(problem);
620
+ setError(problem);
621
+ return null;
622
+ } finally {
623
+ if (generation === targetGeneration.current && epoch === persistenceEpoch.current) {
624
+ setSaving(false);
625
+ }
626
+ }
627
+ };
628
+
629
+ const operation = saveChain.current.then(run, run);
630
+ saveChain.current = operation.then(
631
+ () => undefined,
632
+ () => undefined,
633
+ );
634
+ return await operation;
635
+ },
636
+ [client, readRemote, setCurrentConflict, setError, workspaceId],
637
+ );
638
+
639
+ const resolveConflict = useCallback(
640
+ async (choice: "keep_mine" | "use_remote"): Promise<void> => {
641
+ if (choice === "use_remote") {
642
+ await reload();
643
+ return;
644
+ }
645
+ const mine = cloneEditable(valueRef.current);
646
+ const generation = targetGeneration.current;
647
+ loadingRef.current = true;
648
+ setLoading(true);
649
+ try {
650
+ const remote = await readRemote();
651
+ if (!remote || generation !== targetGeneration.current) return;
652
+ draftRef.current = remote.draft;
653
+ lastSavedSignature.current = draftSignature(remote.editable);
654
+ passiveProjectionSignature.current = null;
655
+ setDraft(remote.draft);
656
+ setCurrentConflict(null);
657
+ await persistSnapshot(mine);
658
+ } catch (cause) {
659
+ if (generation === targetGeneration.current) setError(asError(cause));
660
+ } finally {
661
+ if (generation === targetGeneration.current) {
662
+ loadingRef.current = false;
663
+ setLoading(false);
664
+ }
665
+ }
666
+ },
667
+ [persistSnapshot, readRemote, reload, setCurrentConflict, setError],
668
+ );
669
+
670
+ const unavailable = error !== null && conflict === null && isTransientServiceFailure(error);
671
+
672
+ /**
673
+ * Re-read after Opengeni was unreachable. The remote draft replaces the
674
+ * composer only when the first load never succeeded and nothing was typed
675
+ * since; otherwise it only becomes the save base, so local text survives and
676
+ * an unconfirmed save is reconciled by what the server actually holds.
677
+ */
678
+ const reconnect = useCallback(async (): Promise<void> => {
679
+ if (!resourceHydrationReady) return;
680
+ const generation = targetGeneration.current;
681
+ try {
682
+ // One attempt per tick: the loop itself is the retry.
683
+ const remote = await readRemote(false);
684
+ if (!remote || generation !== targetGeneration.current) return;
685
+ if (
686
+ !draftRef.current &&
687
+ unloadedValueSignature.current !== null &&
688
+ unloadedValueSignature.current === draftSignature(valueRef.current)
689
+ ) {
690
+ applyRemote(remote);
691
+ return;
692
+ }
693
+ unloadedValueSignature.current = null;
694
+ draftRef.current = remote.draft;
695
+ lastSavedSignature.current = draftSignature(remote.editable);
696
+ passiveProjectionSignature.current = null;
697
+ setDraft(remote.draft);
698
+ setError(null);
699
+ } catch (cause) {
700
+ if (generation === targetGeneration.current) setError(asError(cause));
701
+ }
702
+ }, [applyRemote, readRemote, resourceHydrationReady, setError]);
703
+ const reconnectRef = useRef(reconnect);
704
+ reconnectRef.current = reconnect;
705
+
706
+ useEffect(() => {
707
+ if (!unavailable) return;
708
+ let stopped = false;
709
+ let timer: ReturnType<typeof setTimeout> | undefined;
710
+ const tick = () => {
711
+ timer = setTimeout(() => {
712
+ if (stopped) return;
713
+ void reconnectRef.current().finally(() => {
714
+ if (!stopped) tick();
715
+ });
716
+ }, reconnectIntervalMs);
717
+ };
718
+ tick();
719
+ return () => {
720
+ stopped = true;
721
+ if (timer !== undefined) clearTimeout(timer);
722
+ };
723
+ }, [unavailable, reconnectIntervalMs, targetKey]);
724
+
725
+ return {
726
+ draft,
727
+ revision: draft?.revision ?? 0,
728
+ loading,
729
+ saving,
730
+ conflict,
731
+ error,
732
+ unavailable,
733
+ currentError: useCallback(() => errorRef.current, []),
734
+ reportUnavailable: useCallback(
735
+ (cause: unknown): boolean => {
736
+ if (!isTransientServiceFailure(cause)) return false;
737
+ setError(asError(cause));
738
+ return true;
739
+ },
740
+ [setError],
741
+ ),
742
+ flush,
743
+ flushForSend,
744
+ isCurrentSignature,
745
+ acknowledgeConsumed,
746
+ reload,
747
+ captureConflict,
748
+ resolveConflict,
749
+ clearError: useCallback(() => {
750
+ setError(null);
751
+ setCurrentConflict(null);
752
+ }, [setCurrentConflict, setError]),
753
+ };
754
+ }
755
+
756
+ function cloneEditable(value: NewSessionDraftEditable): NewSessionDraftEditable {
757
+ return structuredClone(value);
758
+ }
759
+
760
+ function normalizeLegacyNewSessionDraft(remote: NewSessionDraft): NewSessionDraft {
761
+ // Old servers returned the tools array without the explicitness marker. The
762
+ // old request contract made that array the user's complete selection, so an
763
+ // absent marker must remain explicit (including an empty array) on a new
764
+ // client rather than inheriting current workspace defaults.
765
+ return {
766
+ ...remote,
767
+ toolsProvided: Object.hasOwn(remote, "toolsProvided") ? remote.toolsProvided : true,
768
+ latencyMode: remote.latencyMode ?? "standard",
769
+ selectionHistory: remote.selectionHistory ?? { projects: [] },
770
+ };
771
+ }
772
+
773
+ function draftSignature(value: NewSessionDraftEditable): string {
774
+ return JSON.stringify(sortedJson(value));
775
+ }
776
+
777
+ /** Key-sorted copy so equal drafts compare equal regardless of key order. */
778
+ function sortedJson(value: unknown): unknown {
779
+ if (Array.isArray(value)) return value.map(sortedJson);
780
+ if (value && typeof value === "object") {
781
+ return Object.fromEntries(
782
+ Object.entries(value)
783
+ .sort(([a], [b]) => a.localeCompare(b))
784
+ .map(([key, nested]) => [key, sortedJson(nested)]),
785
+ );
786
+ }
787
+ return value;
788
+ }
789
+
790
+ function clientIdentity(client: object): number {
791
+ let identity = clientIdentities.get(client);
792
+ if (identity === undefined) {
793
+ identity = nextClientIdentity;
794
+ nextClientIdentity += 1;
795
+ clientIdentities.set(client, identity);
796
+ }
797
+ return identity;
798
+ }
799
+
800
+ const clientIdentities = new WeakMap<object, number>();
801
+ let nextClientIdentity = 1;
802
+
803
+ export function isNewSessionDraftConflict(cause: unknown): boolean {
804
+ return (
805
+ cause instanceof OpenGeniApiError &&
806
+ cause.status === 409 &&
807
+ cause.code === "NEW_SESSION_DRAFT_CONFLICT"
808
+ );
809
+ }
810
+
811
+ function asError(cause: unknown): Error {
812
+ return cause instanceof Error ? cause : new Error(String(cause));
813
+ }