@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
@@ -0,0 +1,359 @@
1
+ import type {
2
+ GeneratePasswordSpec,
3
+ HumanInputAnswer,
4
+ HumanInputQuestion,
5
+ HumanInputSecretAnswer,
6
+ HumanInputSecretAnswerResult,
7
+ HumanInputSecretSaveTo,
8
+ HumanInputSecretSpec,
9
+ } from "@opengeni/sdk";
10
+
11
+ /* Pure drafting and validation rules for structured human-input requests,
12
+ shared by the web HumanInputForm and non-DOM renderers. */
13
+
14
+ export type HumanInputAnswerDraft = {
15
+ values: string[];
16
+ other: string;
17
+ otherSelected: boolean;
18
+ };
19
+
20
+ export type HumanInputFormMessages = {
21
+ title: string;
22
+ description: string;
23
+ submit: string;
24
+ skip: string;
25
+ submitting: string;
26
+ other: string;
27
+ deadlineLabel: string;
28
+ formatDeadline: (value: string) => string;
29
+ required: string;
30
+ otherRequired: string;
31
+ minSelections: (count: number) => string;
32
+ maxSelections: (count: number) => string;
33
+ optional: string;
34
+ /** Shown when the question list overflows the card and more content is below. */
35
+ moreBelow: string;
36
+ questionCount: (count: number) => string;
37
+ collapse: string;
38
+ expand: string;
39
+ selectionHint: (min: number | null | undefined, max: number | null | undefined) => string | null;
40
+ /** Secret questions (`kind: "secret"`). */
41
+ secretShow: string;
42
+ secretHide: string;
43
+ secretGenerate: string;
44
+ /** Shown in place of the input when the server will generate the value. */
45
+ secretWillGenerate: string;
46
+ secretUndo: string;
47
+ secretSaveTo: string;
48
+ secretSaveToOptions: Record<HumanInputSecretSaveTo, string>;
49
+ /** One line under Save to: where the value goes. `vault` is the agent's named vault, if any. */
50
+ secretVaultHint: (saveTo: HumanInputSecretSaveTo, vault: string | null) => string;
51
+ /** The requested Save to is not allowed for this person. */
52
+ secretSaveToDowngraded: (
53
+ requested: HumanInputSecretSaveTo,
54
+ actual: HumanInputSecretSaveTo,
55
+ ) => string;
56
+ secretLooksLike: (example: string) => string;
57
+ /** Soft warning only: the value does not match the agent's pattern. */
58
+ secretPatternWarning: (looksLike: string | null) => string;
59
+ /** The answered chip: "Saved to Private › GitHub". */
60
+ secretSaved: (vaultName: string, itemName: string) => string;
61
+ };
62
+
63
+ const SAVE_TO_IN_SENTENCE: Record<HumanInputSecretSaveTo, string> = {
64
+ user: "Only me",
65
+ task: "this task",
66
+ workspace: "this workspace",
67
+ };
68
+
69
+ export const defaultHumanInputFormMessages: HumanInputFormMessages = {
70
+ title: "Input required",
71
+ /** Multi-question chrome has no default subtitle; hosts may still override. */
72
+ description: "",
73
+ submit: "Send answers",
74
+ skip: "Skip",
75
+ submitting: "Submitting…",
76
+ other: "Other",
77
+ deadlineLabel: "Expires",
78
+ formatDeadline,
79
+ required: "This question is required.",
80
+ otherRequired: "Enter a value for Other.",
81
+ minSelections: (count) => `Choose at least ${count} option${count === 1 ? "" : "s"}.`,
82
+ maxSelections: (count) => `Choose no more than ${count} option${count === 1 ? "" : "s"}.`,
83
+ optional: "Optional",
84
+ moreBelow: "More below",
85
+ questionCount: (count) => `${count} questions`,
86
+ collapse: "Collapse",
87
+ expand: "Expand",
88
+ selectionHint: (min, max) => {
89
+ if (min != null && max != null) return `Choose ${min}–${max}.`;
90
+ if (min != null) return `Choose at least ${min}.`;
91
+ if (max != null) return `Choose up to ${max}.`;
92
+ return null;
93
+ },
94
+ secretShow: "Show",
95
+ secretHide: "Hide",
96
+ secretGenerate: "Generate",
97
+ secretWillGenerate: "A strong password will be generated",
98
+ secretUndo: "Undo",
99
+ secretSaveTo: "Save to",
100
+ secretSaveToOptions: { user: "Only me", task: "This task", workspace: "This workspace" },
101
+ secretVaultHint: (saveTo, vault) =>
102
+ vault
103
+ ? `Saves to the ${vault} vault`
104
+ : saveTo === "user"
105
+ ? "Saves to your private vault"
106
+ : saveTo === "task"
107
+ ? "Saves to this task"
108
+ : "Saves to the workspace vault",
109
+ secretSaveToDowngraded: (requested, actual) =>
110
+ `You can't save to ${SAVE_TO_IN_SENTENCE[requested]}, so it will be saved to ${SAVE_TO_IN_SENTENCE[actual]}.`,
111
+ secretLooksLike: (example) => `Looks like ${example}`,
112
+ secretPatternWarning: (looksLike) =>
113
+ looksLike
114
+ ? `This doesn't look like ${looksLike}. You can still send it.`
115
+ : "This doesn't match the expected format. You can still send it.",
116
+ secretSaved: (vaultName, itemName) => `Saved to ${vaultName} › ${itemName}`,
117
+ };
118
+
119
+ /**
120
+ * Text, single- and multi-select drafts. Secret questions are not drafted:
121
+ * their value lives only in an uncontrolled input and is collected with
122
+ * {@link secretAnswerFromReading} at submit time.
123
+ */
124
+ export function answersFromDrafts(
125
+ questions: HumanInputQuestion[],
126
+ drafts: Record<string, HumanInputAnswerDraft>,
127
+ messageOverrides: Partial<HumanInputFormMessages> = {},
128
+ ): { answers: HumanInputAnswer[]; errors: Record<string, string> } {
129
+ const messages = { ...defaultHumanInputFormMessages, ...messageOverrides };
130
+ const answers: HumanInputAnswer[] = [];
131
+ const errors: Record<string, string> = {};
132
+ for (const question of questions) {
133
+ if (question.kind === "secret") continue;
134
+ const draft = drafts[question.id] ?? emptyDraft();
135
+ const values = question.kind === "text" ? draft.values.filter(Boolean) : draft.values;
136
+ const other = draft.otherSelected ? draft.other : "";
137
+ const hasOther = Boolean(other.trim());
138
+ const supplied = values.length + (hasOther ? 1 : 0);
139
+
140
+ // Other-selected-but-empty must win over generic "required" — otherwise the
141
+ // user sees the wrong diagnosis next to a clearly selected control.
142
+ if (question.kind !== "text" && draft.otherSelected && !hasOther) {
143
+ errors[question.id] = messages.otherRequired;
144
+ continue;
145
+ }
146
+
147
+ if (question.required && supplied === 0) {
148
+ errors[question.id] = messages.required;
149
+ continue;
150
+ }
151
+ if (question.kind !== "text") {
152
+ const min = question.validation?.minSelections;
153
+ const max = question.kind === "single_select" ? 1 : question.validation?.maxSelections;
154
+ if (min != null && supplied < min) {
155
+ errors[question.id] = messages.minSelections(min);
156
+ continue;
157
+ }
158
+ if (max != null && supplied > max) {
159
+ errors[question.id] = messages.maxSelections(max);
160
+ continue;
161
+ }
162
+ }
163
+ if (supplied > 0) {
164
+ answers.push({
165
+ questionId: question.id,
166
+ values,
167
+ ...(hasOther ? { other } : {}),
168
+ });
169
+ }
170
+ }
171
+ return { answers, errors };
172
+ }
173
+
174
+ export function initialDrafts(
175
+ questions: HumanInputQuestion[],
176
+ ): Record<string, HumanInputAnswerDraft> {
177
+ return Object.fromEntries(questions.map((question) => [question.id, emptyDraft()]));
178
+ }
179
+
180
+ export function emptyDraft(): HumanInputAnswerDraft {
181
+ return { values: [], other: "", otherSelected: false };
182
+ }
183
+
184
+ export function formatDeadline(value: string): string {
185
+ const date = new Date(value);
186
+ if (Number.isNaN(date.getTime())) return value;
187
+ const ms = date.getTime() - Date.now();
188
+ if (ms <= 0) return "deadline passed";
189
+ const minutes = Math.round(ms / 60_000);
190
+ if (minutes < 1) return "in under a minute";
191
+ if (minutes < 60) return `in ${minutes}m`;
192
+ const hours = Math.round(minutes / 60);
193
+ if (hours < 48) return `in ${hours}h`;
194
+ return date.toLocaleString();
195
+ }
196
+
197
+ /** The form heading: a single question leads with its own label/prompt. */
198
+ export function humanInputHeading(
199
+ questions: readonly HumanInputQuestion[],
200
+ messages: Pick<HumanInputFormMessages, "title" | "description">,
201
+ ): { title: string; description: string | null } {
202
+ const single = questions.length === 1 ? questions[0]! : null;
203
+ return {
204
+ title: single ? (single.label ?? single.prompt) : messages.title,
205
+ description: single
206
+ ? single.label
207
+ ? single.prompt
208
+ : (single.helpText ?? null)
209
+ : messages.description || null,
210
+ };
211
+ }
212
+
213
+ /* ---- secret questions ------------------------------------------------------ */
214
+
215
+ export const SECRET_SAVE_TO_ORDER: readonly HumanInputSecretSaveTo[] = [
216
+ "user",
217
+ "task",
218
+ "workspace",
219
+ ];
220
+
221
+ export type SecretAutocomplete = "current-password" | "new-password" | "one-time-code" | "off";
222
+
223
+ /**
224
+ * The `autocomplete` token for the secret input. The contract defaults
225
+ * `autocomplete` to "current-password", so that value is treated as "not
226
+ * chosen": a TOTP field asks for a one-time code, and a field the person may
227
+ * generate is a new password (password managers offer to create and save it).
228
+ */
229
+ export function secretAutocomplete(spec: HumanInputSecretSpec): SecretAutocomplete {
230
+ if (spec.autocomplete && spec.autocomplete !== "current-password") return spec.autocomplete;
231
+ if (spec.fieldKind === "totp") return "one-time-code";
232
+ if (spec.allowGenerate || spec.generate) return "new-password";
233
+ return "current-password";
234
+ }
235
+
236
+ /** Digits keyboard on phones for one-time codes. */
237
+ export function secretInputMode(spec: HumanInputSecretSpec): "numeric" | undefined {
238
+ return secretAutocomplete(spec) === "one-time-code" ? "numeric" : undefined;
239
+ }
240
+
241
+ /** A plain-text field kind is not concealed (no show/hide). */
242
+ export function secretConcealed(spec: HumanInputSecretSpec): boolean {
243
+ return spec.fieldKind !== "text";
244
+ }
245
+
246
+ /** Generate is offered for concealed values the agent allows to be generated. */
247
+ export function secretCanGenerate(spec: HumanInputSecretSpec): boolean {
248
+ return Boolean(spec.allowGenerate || spec.generate) && spec.fieldKind !== "totp";
249
+ }
250
+
251
+ /** The input's label: "Password", "API key", "One-time code", or the field name. */
252
+ export function secretFieldLabel(spec: HumanInputSecretSpec): string {
253
+ const field = spec.field?.trim() || "password";
254
+ if (spec.fieldKind === "totp" && field.toLowerCase() === "password") return "One-time code";
255
+ if (spec.itemType === "api_key" && field.toLowerCase() === "password") return "API key";
256
+ if (spec.itemType === "note" && field.toLowerCase() === "password") return "Note";
257
+ const words = field.replace(/[_-]+/g, " ").replace(/\s+/g, " ").trim();
258
+ return words.charAt(0).toUpperCase() + words.slice(1);
259
+ }
260
+
261
+ export type SecretSaveToChoice = {
262
+ /** What the agent asked for (contract default: "user"). */
263
+ requested: HumanInputSecretSaveTo;
264
+ /** The initial selection: the request, or the best allowed target. */
265
+ initial: HumanInputSecretSaveTo;
266
+ /** True when the request is not allowed and was replaced. */
267
+ downgraded: boolean;
268
+ /** Allowed choices in display order. */
269
+ options: HumanInputSecretSaveTo[];
270
+ };
271
+
272
+ /**
273
+ * Filter Save to by what this person may write. A request that is not allowed
274
+ * falls back to the most private allowed target (Only me, then This task).
275
+ */
276
+ export function resolveSecretSaveTo(
277
+ spec: HumanInputSecretSpec,
278
+ allowed: readonly HumanInputSecretSaveTo[] = SECRET_SAVE_TO_ORDER,
279
+ ): SecretSaveToChoice {
280
+ const requested = spec.saveTo ?? "user";
281
+ const options = SECRET_SAVE_TO_ORDER.filter((target) => allowed.includes(target));
282
+ if (options.includes(requested)) {
283
+ return { requested, initial: requested, downgraded: false, options };
284
+ }
285
+ // Nothing allowed is a host error; keep the request so the server decides.
286
+ if (options.length === 0) {
287
+ return { requested, initial: requested, downgraded: false, options: [requested] };
288
+ }
289
+ return { requested, initial: options[0]!, downgraded: true, options };
290
+ }
291
+
292
+ /** The vault the agent named applies only to the scope it asked for. */
293
+ export function secretVaultForTarget(
294
+ spec: HumanInputSecretSpec,
295
+ saveTo: HumanInputSecretSaveTo,
296
+ ): string | null {
297
+ return spec.vault && saveTo === (spec.saveTo ?? "user") ? spec.vault : null;
298
+ }
299
+
300
+ /**
301
+ * Soft check against the agent's `pattern` (a regular expression searched in
302
+ * the value, not anchored). Never blocks submit; an invalid pattern is ignored.
303
+ */
304
+ export function secretPatternMismatch(pattern: string | null | undefined, value: string): boolean {
305
+ if (!pattern || !value) return false;
306
+ let expression: RegExp;
307
+ try {
308
+ expression = new RegExp(pattern, "u");
309
+ } catch {
310
+ try {
311
+ expression = new RegExp(pattern);
312
+ } catch {
313
+ return false;
314
+ }
315
+ }
316
+ return !expression.test(value);
317
+ }
318
+
319
+ /** What a secret field holds at submit time. `value` exists only for this call. */
320
+ export type SecretFieldReading = {
321
+ value: string | null;
322
+ generate: GeneratePasswordSpec | null;
323
+ username: string | null;
324
+ saveTo: HumanInputSecretSaveTo;
325
+ };
326
+
327
+ /**
328
+ * Build the write-only `secretAnswers` entry and the public answer for one
329
+ * secret question. The public answer has no values: the server adds the
330
+ * saved reference. Returns null for an unanswered optional question.
331
+ */
332
+ export function secretAnswerFromReading(
333
+ question: HumanInputQuestion,
334
+ reading: SecretFieldReading,
335
+ messageOverrides: Partial<HumanInputFormMessages> = {},
336
+ ): { answer: HumanInputAnswer; secretAnswer: HumanInputSecretAnswer } | { error: string } | null {
337
+ const messages = { ...defaultHumanInputFormMessages, ...messageOverrides };
338
+ const value = reading.generate ? null : reading.value || null;
339
+ if (!reading.generate && value === null) {
340
+ return question.required ? { error: messages.required } : null;
341
+ }
342
+ const username = reading.username?.trim() || null;
343
+ const secretAnswer: HumanInputSecretAnswer = {
344
+ questionId: question.id,
345
+ ...(reading.generate ? { generate: reading.generate } : { value: value! }),
346
+ ...(username ? { username } : {}),
347
+ saveTo: reading.saveTo,
348
+ };
349
+ return { answer: { questionId: question.id, values: [] }, secretAnswer };
350
+ }
351
+
352
+ /** The answered chip label, never a value. */
353
+ export function secretAnswerLabel(
354
+ result: HumanInputSecretAnswerResult,
355
+ messageOverrides: Partial<HumanInputFormMessages> = {},
356
+ ): string {
357
+ const messages = { ...defaultHumanInputFormMessages, ...messageOverrides };
358
+ return messages.secretSaved(result.vaultName, result.itemName);
359
+ }
@@ -0,0 +1,148 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import type { ExternalIdentityLink, ExternalIdentityLinkPage } from "@opengeni/sdk";
3
+
4
+ export type IdentityLinkAccountsClient = {
5
+ listIdentityLinks(workspaceId: string, cursor?: string): Promise<ExternalIdentityLinkPage>;
6
+ revokeIdentityLink(
7
+ workspaceId: string,
8
+ linkId: string,
9
+ expectedRevision: number,
10
+ ): Promise<ExternalIdentityLink>;
11
+ };
12
+
13
+ /** Participant-scoped inventory. Revocation never deletes native work or merges
14
+ * identities. The caller remounts this component when the signed-in user changes. */
15
+ export function IdentityLinkAccounts({
16
+ client,
17
+ workspaceId,
18
+ }: {
19
+ client: IdentityLinkAccountsClient;
20
+ workspaceId: string;
21
+ }) {
22
+ const [links, setLinks] = useState<ExternalIdentityLink[]>([]);
23
+ const [cursor, setCursor] = useState<string | null>(null);
24
+ const [busy, setBusy] = useState(true);
25
+ const [error, setError] = useState(false);
26
+ const [revision, setRevision] = useState(0);
27
+ const generation = useRef(0);
28
+ const inFlight = useRef(false);
29
+ useEffect(() => {
30
+ const current = ++generation.current;
31
+ inFlight.current = true;
32
+ setLinks([]);
33
+ setCursor(null);
34
+ setBusy(true);
35
+ setError(false);
36
+ void client
37
+ .listIdentityLinks(workspaceId)
38
+ .then(
39
+ (page) => {
40
+ if (current !== generation.current) return;
41
+ setLinks(page.links);
42
+ setCursor(page.nextCursor);
43
+ },
44
+ () => {
45
+ if (current === generation.current) setError(true);
46
+ },
47
+ )
48
+ .finally(() => {
49
+ if (current === generation.current) {
50
+ inFlight.current = false;
51
+ setBusy(false);
52
+ }
53
+ });
54
+ return () => {
55
+ // Invalidate live async work, rather than cleaning up a captured DOM node.
56
+ // eslint-disable-next-line react-hooks/exhaustive-deps
57
+ generation.current++;
58
+ };
59
+ }, [client, workspaceId, revision]);
60
+
61
+ async function act(link?: ExternalIdentityLink) {
62
+ if (inFlight.current || (!link && !cursor)) return;
63
+ const current = generation.current;
64
+ inFlight.current = true;
65
+ setBusy(true);
66
+ setError(false);
67
+ try {
68
+ if (link) {
69
+ const updated = await client.revokeIdentityLink(workspaceId, link.id, link.revision);
70
+ if (current === generation.current)
71
+ setLinks((values) =>
72
+ values.map((value) => (value.id === updated.id ? { ...value, ...updated } : value)),
73
+ );
74
+ } else {
75
+ const page = await client.listIdentityLinks(workspaceId, cursor!);
76
+ if (current === generation.current) {
77
+ setLinks((values) => [
78
+ ...new Map([...values, ...page.links].map((value) => [value.id, value])).values(),
79
+ ]);
80
+ setCursor(page.nextCursor);
81
+ }
82
+ }
83
+ } catch {
84
+ if (current === generation.current) setError(true);
85
+ } finally {
86
+ if (current === generation.current) {
87
+ inFlight.current = false;
88
+ setBusy(false);
89
+ }
90
+ }
91
+ }
92
+ return (
93
+ <section
94
+ className="og-connect og-identity-link"
95
+ aria-label="Linked product access"
96
+ aria-busy={busy}
97
+ >
98
+ <h2>Linked product access</h2>
99
+ <p>
100
+ Manage products allowed to act as your account in this organization. Revoking a link stops
101
+ future linked access; it does not delete your work or undo an operation already started.
102
+ </p>
103
+ {/* The links sit in one card under the heading, like a settings section;
104
+ the empty and loading lines are rows of that card. */}
105
+ <div className="og-identity-link-card">
106
+ {error && (
107
+ <div role="alert">
108
+ Could not update account links. Reload to see current access.
109
+ <button type="button" disabled={busy} onClick={() => setRevision((value) => value + 1)}>
110
+ Reload links
111
+ </button>
112
+ </div>
113
+ )}
114
+ {busy && <p role="status">Loading account links…</p>}
115
+ {!busy && !error && links.length === 0 && (
116
+ <p>No products have linked access to this account.</p>
117
+ )}
118
+ <ul>
119
+ {links.map((link) => (
120
+ <li key={link.id}>
121
+ <p>
122
+ {link.externalIdentity?.source || "Product identity"}{" "}
123
+ <code>{link.externalIdentity?.externalId ?? link.externalIdentityId}</code>
124
+ </p>
125
+ <p>
126
+ Status: {link.status}.{" "}
127
+ {link.expiresAt
128
+ ? `Expires ${new Date(link.expiresAt).toLocaleString()}.`
129
+ : "No automatic expiry."}
130
+ </p>
131
+ <p>{link.permissions.join(", ")}</p>
132
+ {(link.status === "active" || link.status === "pending") && (
133
+ <button type="button" disabled={busy} onClick={() => void act(link)}>
134
+ Revoke access
135
+ </button>
136
+ )}
137
+ </li>
138
+ ))}
139
+ </ul>
140
+ {cursor && (
141
+ <button type="button" disabled={busy} onClick={() => void act()}>
142
+ Load more links
143
+ </button>
144
+ )}
145
+ </div>
146
+ </section>
147
+ );
148
+ }
@@ -0,0 +1,192 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import type {
3
+ ExternalIdentityLink,
4
+ ConfirmExternalIdentityLinkRequest,
5
+ ExternalIdentityLinkPreview,
6
+ } from "@opengeni/sdk";
7
+
8
+ export type IdentityLinkClient = {
9
+ previewIdentityLink(
10
+ workspaceId: string,
11
+ linkId: string,
12
+ challenge: string,
13
+ ): Promise<ExternalIdentityLinkPreview>;
14
+ confirmIdentityLink(
15
+ workspaceId: string,
16
+ linkId: string,
17
+ input: ConfirmExternalIdentityLinkRequest,
18
+ ): Promise<ExternalIdentityLink>;
19
+ revokeIdentityLink(
20
+ workspaceId: string,
21
+ linkId: string,
22
+ expectedRevision: number,
23
+ ): Promise<ExternalIdentityLink>;
24
+ };
25
+ export type IdentityLinkConsentProps = {
26
+ client: IdentityLinkClient;
27
+ workspaceId: string;
28
+ linkId: string;
29
+ challenge: string;
30
+ /** Host label is explanatory, never proof of the requesting application. */
31
+ className?: string;
32
+ onComplete?: (link: ExternalIdentityLink) => void;
33
+ };
34
+
35
+ /** Optional native-login consent. Ordinary Connect does not use this surface.
36
+ * Permission choices only narrow the server's request; no automatic approval. */
37
+ export function IdentityLinkConsent({
38
+ client,
39
+ workspaceId,
40
+ linkId,
41
+ challenge,
42
+ className,
43
+ onComplete,
44
+ }: IdentityLinkConsentProps) {
45
+ const [link, setLink] = useState<ExternalIdentityLink | null>(null);
46
+ const [preview, setPreview] = useState<ExternalIdentityLinkPreview | null>(null);
47
+ const [selected, setSelected] = useState<ExternalIdentityLink["permissions"]>([]);
48
+ const [busy, setBusy] = useState(false);
49
+ const [error, setError] = useState(false);
50
+ const [retry, setRetry] = useState(0);
51
+ const generation = useRef(0);
52
+ useEffect(() => {
53
+ const current = ++generation.current;
54
+ setLink(null);
55
+ setPreview(null);
56
+ setSelected([]);
57
+ setBusy(true);
58
+ setError(false);
59
+ void client
60
+ .previewIdentityLink(workspaceId, linkId, challenge)
61
+ .then(
62
+ (result) => {
63
+ if (generation.current !== current) return;
64
+ setPreview(result);
65
+ setLink(result.link);
66
+ setSelected(result.link.permissions);
67
+ },
68
+ () => {
69
+ if (generation.current === current) setError(true);
70
+ },
71
+ )
72
+ .finally(() => {
73
+ if (generation.current === current) setBusy(false);
74
+ });
75
+ return () => {
76
+ // Invalidate live async work, rather than cleaning up a captured DOM node.
77
+ // eslint-disable-next-line react-hooks/exhaustive-deps
78
+ generation.current++;
79
+ };
80
+ }, [client, workspaceId, linkId, challenge, retry]);
81
+ async function mutate(revoke: boolean) {
82
+ if (!link || busy) return;
83
+ const current = generation.current;
84
+ setBusy(true);
85
+ setError(false);
86
+ try {
87
+ const result = revoke
88
+ ? await client.revokeIdentityLink(workspaceId, linkId, link.revision)
89
+ : await client.confirmIdentityLink(workspaceId, linkId, {
90
+ challenge,
91
+ expectedRevision: link.revision,
92
+ permissions: selected,
93
+ });
94
+ if (generation.current !== current) return;
95
+ setLink(result);
96
+ onComplete?.(result);
97
+ } catch {
98
+ if (generation.current === current) setError(true);
99
+ } finally {
100
+ if (generation.current === current) setBusy(false);
101
+ }
102
+ }
103
+ return (
104
+ <section
105
+ className={["og-connect og-identity-link", className].filter(Boolean).join(" ")}
106
+ aria-label="Link your account"
107
+ aria-busy={busy}
108
+ >
109
+ <h2>Link your Opengeni account</h2>
110
+ <p>
111
+ Only continue if you started this request in a product you trust. Linking lets that product
112
+ act as your account with the permissions you select. It does not merge accounts or move
113
+ existing work.
114
+ </p>
115
+ {preview && (
116
+ <dl>
117
+ <dt>Organization</dt>
118
+ <dd>{preview.organizationId}</dd>
119
+ <dt>Product user</dt>
120
+ <dd>
121
+ {preview.externalIdentity.externalId} ({preview.externalIdentity.source})
122
+ </dd>
123
+ <dt>Your Opengeni identity</dt>
124
+ <dd>{preview.nativeSubjectId}</dd>
125
+ </dl>
126
+ )}
127
+ {error && (
128
+ <div role="alert">
129
+ This request could not be completed. It may have expired, changed, or require you to sign
130
+ in to the right organization.
131
+ {!link && (
132
+ <button type="button" disabled={busy} onClick={() => setRetry((value) => value + 1)}>
133
+ Try again
134
+ </button>
135
+ )}
136
+ </div>
137
+ )}
138
+ {!link && busy && <p role="status">Loading the account-link request…</p>}
139
+ {link?.status === "pending" && (
140
+ <>
141
+ <p>
142
+ {link.expiresAt
143
+ ? `Access ends ${new Date(link.expiresAt).toLocaleString()}.`
144
+ : "Access lasts until you or the product revoke this link."}{" "}
145
+ Your current permissions still apply.
146
+ </p>
147
+ <fieldset disabled={busy}>
148
+ <legend>Allow these permissions</legend>
149
+ {link.permissions.map((permission) => (
150
+ <label key={permission}>
151
+ <input
152
+ type="checkbox"
153
+ checked={selected.includes(permission)}
154
+ onChange={(event) =>
155
+ setSelected((values) =>
156
+ event.target.checked
157
+ ? [...values, permission]
158
+ : values.filter((value) => value !== permission),
159
+ )
160
+ }
161
+ />
162
+ <span>{permission.replaceAll(":", " · ")}</span>
163
+ </label>
164
+ ))}
165
+ </fieldset>
166
+ <button
167
+ type="button"
168
+ disabled={busy || selected.length === 0}
169
+ onClick={() => void mutate(false)}
170
+ >
171
+ {busy ? "Saving…" : "Allow selected access"}
172
+ </button>
173
+ <p>You can close this page without granting access.</p>
174
+ </>
175
+ )}
176
+ {link?.status === "active" && (
177
+ <>
178
+ <p role="status">Account linked. Return to your product to continue.</p>
179
+ <button type="button" disabled={busy} onClick={() => void mutate(true)}>
180
+ Revoke this link
181
+ </button>
182
+ </>
183
+ )}
184
+ {link?.status === "revoked" && (
185
+ <p role="status">Link revoked. Your Opengeni account and existing work are unchanged.</p>
186
+ )}
187
+ {link?.status === "expired" && (
188
+ <p role="status">This request has expired. Start a new request from your product.</p>
189
+ )}
190
+ </section>
191
+ );
192
+ }