@opengeni/react 3.3.2 → 3.4.0

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 (855) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +2 -0
  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-4EUKJXUO.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-XYRDDSXF.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-JAQ5K7W6.js → chunk-2SFFYIH3.js} +1178 -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-3RJKUVCA.js +14068 -0
  27. package/dist/chunk-3RJKUVCA.js.map +1 -0
  28. package/dist/chunk-3UZCWK46.js +298 -0
  29. package/dist/chunk-3UZCWK46.js.map +1 -0
  30. package/dist/chunk-47CKUXTW.js +293 -0
  31. package/dist/chunk-47CKUXTW.js.map +1 -0
  32. package/dist/chunk-4QYP6QUI.js +109 -0
  33. package/dist/chunk-4QYP6QUI.js.map +1 -0
  34. package/dist/chunk-5EY26VZ7.js +1053 -0
  35. package/dist/chunk-5EY26VZ7.js.map +1 -0
  36. package/dist/chunk-5I4VRWBB.js +56 -0
  37. package/dist/chunk-5I4VRWBB.js.map +1 -0
  38. package/dist/chunk-5WOR7UCL.js +191 -0
  39. package/dist/chunk-5WOR7UCL.js.map +1 -0
  40. package/dist/chunk-5YJLGOM5.js +51 -0
  41. package/dist/chunk-5YJLGOM5.js.map +1 -0
  42. package/dist/chunk-6JFN3OWG.js +386 -0
  43. package/dist/chunk-6JFN3OWG.js.map +1 -0
  44. package/dist/chunk-7QJT5O4S.js +35 -0
  45. package/dist/chunk-7QJT5O4S.js.map +1 -0
  46. package/dist/chunk-A55KV72M.js +402 -0
  47. package/dist/chunk-A55KV72M.js.map +1 -0
  48. package/dist/chunk-ADWCLI4G.js +2028 -0
  49. package/dist/chunk-ADWCLI4G.js.map +1 -0
  50. package/dist/chunk-B27E3V37.js +29 -0
  51. package/dist/chunk-B27E3V37.js.map +1 -0
  52. package/dist/chunk-B7TC2A33.js +83 -0
  53. package/dist/chunk-B7TC2A33.js.map +1 -0
  54. package/dist/chunk-BLL56F7R.js +385 -0
  55. package/dist/chunk-BLL56F7R.js.map +1 -0
  56. package/dist/chunk-BOFEQC6K.js +162 -0
  57. package/dist/chunk-BOFEQC6K.js.map +1 -0
  58. package/dist/chunk-CM7LVUKC.js +35 -0
  59. package/dist/chunk-CM7LVUKC.js.map +1 -0
  60. package/dist/chunk-CORUP6JB.js +122 -0
  61. package/dist/chunk-CORUP6JB.js.map +1 -0
  62. package/dist/chunk-CSX5FFKZ.js +35 -0
  63. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  64. package/dist/chunk-EGVHJKGJ.js +3125 -0
  65. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  66. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  67. package/dist/chunk-G76LSA76.js.map +1 -0
  68. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  69. package/dist/chunk-GQMRL52F.js.map +1 -0
  70. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  71. package/dist/chunk-GUUXOISA.js.map +1 -0
  72. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  73. package/dist/chunk-I7X2P4FU.js.map +1 -0
  74. package/dist/chunk-IGFZFLI2.js +1390 -0
  75. package/dist/chunk-IGFZFLI2.js.map +1 -0
  76. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  77. package/dist/chunk-IMSUVYQB.js.map +1 -0
  78. package/dist/chunk-IOYHDEP3.js +38 -0
  79. package/dist/chunk-IOYHDEP3.js.map +1 -0
  80. package/dist/chunk-IZV5FTJC.js +55 -0
  81. package/dist/chunk-IZV5FTJC.js.map +1 -0
  82. package/dist/chunk-KF33GTWN.js +343 -0
  83. package/dist/chunk-KF33GTWN.js.map +1 -0
  84. package/dist/chunk-KSGQ5ODA.js +457 -0
  85. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  86. package/dist/{chunk-ZPBTI3TE.js → chunk-KZC6QRNR.js} +1513 -697
  87. package/dist/chunk-KZC6QRNR.js.map +1 -0
  88. package/dist/chunk-LJUMYUBO.js +218 -0
  89. package/dist/chunk-LJUMYUBO.js.map +1 -0
  90. package/dist/chunk-LSW2OJVV.js +380 -0
  91. package/dist/chunk-LSW2OJVV.js.map +1 -0
  92. package/dist/chunk-M357MHH3.js +2 -0
  93. package/dist/chunk-M357MHH3.js.map +1 -0
  94. package/dist/chunk-MK2TQO4Y.js +24 -0
  95. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  96. package/dist/chunk-N7S72EXK.js +25 -0
  97. package/dist/chunk-N7S72EXK.js.map +1 -0
  98. package/dist/{chunk-YVCHAQZY.js → chunk-NKMYZFHA.js} +616 -621
  99. package/dist/chunk-NKMYZFHA.js.map +1 -0
  100. package/dist/chunk-NX4ADH73.js +14 -0
  101. package/dist/chunk-NX4ADH73.js.map +1 -0
  102. package/dist/chunk-O7F6UJO4.js +71 -0
  103. package/dist/chunk-O7F6UJO4.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-IOLVN74D.js → chunk-V5ZUJT2T.js} +175 -42
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-WBJY57A3.js +402 -0
  137. package/dist/chunk-WBJY57A3.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-3AGBGTRT.js → chunk-X5UVUIMF.js} +1712 -1174
  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/grok-mark.d.ts +26 -0
  200. package/dist/components/human-input-form.d.ts +28 -32
  201. package/dist/components/human-input-surface.d.ts +7 -2
  202. package/dist/components/linkified-text.d.ts +18 -0
  203. package/dist/components/machine-input-display.d.ts +22 -1
  204. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  205. package/dist/components/machines/machine-detail.d.ts +7 -1
  206. package/dist/components/machines/machine-status.d.ts +48 -0
  207. package/dist/components/markdown-table-layout.d.ts +18 -0
  208. package/dist/components/markdown.d.ts +37 -4
  209. package/dist/components/message-timeline.d.ts +86 -7
  210. package/dist/components/model-mark.d.ts +29 -0
  211. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  212. package/dist/components/model-policy-picker.d.ts +35 -28
  213. package/dist/components/new-conversation.d.ts +32 -0
  214. package/dist/components/open-geni-chat.d.ts +73 -0
  215. package/dist/components/open-geni-links.d.ts +68 -0
  216. package/dist/components/openrouter-mark.d.ts +6 -0
  217. package/dist/components/opper-mark.d.ts +7 -0
  218. package/dist/components/preview-loading.d.ts +2 -0
  219. package/dist/components/provider-recovery-notice.d.ts +16 -0
  220. package/dist/components/queue-item-content.d.ts +9 -0
  221. package/dist/components/rehype-secret-refs.d.ts +23 -0
  222. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  223. package/dist/components/sandbox-files.d.ts +3 -1
  224. package/dist/components/sandbox-workspace.d.ts +18 -0
  225. package/dist/components/secret-question-field.d.ts +31 -0
  226. package/dist/components/secret-ref-chip.d.ts +35 -0
  227. package/dist/components/session-capability-frame.d.ts +37 -0
  228. package/dist/components/session-chrome.d.ts +57 -8
  229. package/dist/components/session-commands-panel.d.ts +6 -0
  230. package/dist/components/session-commands.d.ts +6 -0
  231. package/dist/components/session-connection-request.d.ts +8 -0
  232. package/dist/components/session-conversation.d.ts +157 -0
  233. package/dist/components/session-list.d.ts +39 -0
  234. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  235. package/dist/components/session-proxy-scope.d.ts +35 -0
  236. package/dist/components/session-status.d.ts +4 -1
  237. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  238. package/dist/components/timeline-anchor.d.ts +24 -0
  239. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  240. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  241. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  242. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  243. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  244. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  245. package/dist/components/timeline-annotations.d.ts +13 -3
  246. package/dist/components/timeline-reading-progress.d.ts +11 -0
  247. package/dist/components/timeline-search.d.ts +34 -0
  248. package/dist/components/timeline-settlement.d.ts +16 -0
  249. package/dist/components/tool-action-review.d.ts +47 -0
  250. package/dist/components/tool-review-history.d.ts +25 -0
  251. package/dist/components/usage-limit-notice.d.ts +49 -0
  252. package/dist/components/usage-member-list.d.ts +91 -0
  253. package/dist/components/usage-meter.d.ts +73 -0
  254. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  255. package/dist/components/user-message-body.d.ts +10 -1
  256. package/dist/composer-messages.d.ts +74 -0
  257. package/dist/composer-messages.js +9 -0
  258. package/dist/composer-messages.js.map +1 -0
  259. package/dist/composer-voice-events.d.ts +8 -0
  260. package/dist/composer.d.ts +5 -4
  261. package/dist/composer.js +26 -13
  262. package/dist/computer-viewer-GMLDXPON.js +20 -0
  263. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  264. package/dist/connect-account-identity.d.ts +8 -0
  265. package/dist/connect-accounts.d.ts +15 -0
  266. package/dist/connect-chooser.d.ts +18 -0
  267. package/dist/connect-panel.d.ts +18 -0
  268. package/dist/connect-setup.d.ts +18 -0
  269. package/dist/connect.d.ts +21 -0
  270. package/dist/connect.js +2149 -0
  271. package/dist/connect.js.map +1 -0
  272. package/dist/connection-catalog.d.ts +38 -0
  273. package/dist/connection-discovery.d.ts +12 -0
  274. package/dist/connection-installed.d.ts +17 -0
  275. package/dist/connection-logo.d.ts +9 -0
  276. package/dist/connection-service-logo.d.ts +8 -0
  277. package/dist/connection-service-presentation.d.ts +13 -0
  278. package/dist/connection-skeleton.d.ts +5 -0
  279. package/dist/connection-type-picker.d.ts +6 -0
  280. package/dist/conversation-timeline.d.ts +5 -0
  281. package/dist/desktop.d.ts +7 -0
  282. package/dist/desktop.js +27 -0
  283. package/dist/desktop.js.map +1 -0
  284. package/dist/device-authorization.d.ts +23 -0
  285. package/dist/diffs.d.ts +8 -0
  286. package/dist/diffs.js +15 -0
  287. package/dist/diffs.js.map +1 -0
  288. package/dist/discovery-cache.d.ts +5 -0
  289. package/dist/editor.d.ts +7 -0
  290. package/dist/editor.js +22 -0
  291. package/dist/editor.js.map +1 -0
  292. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  293. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  294. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  295. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  296. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  297. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  298. package/dist/hooks/latest-question.d.ts +25 -0
  299. package/dist/hooks/shared-machines-list.d.ts +4 -0
  300. package/dist/hooks/shared-query.d.ts +113 -0
  301. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  302. package/dist/hooks/use-auth-runs.d.ts +1 -4
  303. package/dist/hooks/use-available-models.d.ts +1 -1
  304. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  305. package/dist/hooks/use-browser-session.d.ts +12 -1
  306. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  307. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  308. package/dist/hooks/use-composer.d.ts +24 -2
  309. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  310. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  311. package/dist/hooks/use-computer-session.d.ts +4 -0
  312. package/dist/hooks/use-connect.d.ts +23 -0
  313. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  314. package/dist/hooks/use-file-attachments.d.ts +12 -0
  315. package/dist/hooks/use-goal.d.ts +2 -1
  316. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  317. package/dist/hooks/use-new-conversation.d.ts +56 -0
  318. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  319. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  320. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  321. package/dist/hooks/use-session-conversation.d.ts +49 -0
  322. package/dist/hooks/use-session-events.d.ts +26 -5
  323. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  324. package/dist/hooks/use-session-model-account.d.ts +48 -0
  325. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  326. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  327. package/dist/hooks/use-usage.d.ts +40 -0
  328. package/dist/hooks/use-vaults.d.ts +53 -0
  329. package/dist/hooks/use-voice-input.d.ts +8 -1
  330. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  331. package/dist/hooks/use-workspace-sessions.d.ts +24 -5
  332. package/dist/human-input-model.d.ts +122 -0
  333. package/dist/identity-link-accounts.d.ts +11 -0
  334. package/dist/identity-link-consent.d.ts +18 -0
  335. package/dist/index.d.ts +82 -20
  336. package/dist/index.js +2340 -6603
  337. package/dist/index.js.map +1 -1
  338. package/dist/interaction.d.ts +1 -1
  339. package/dist/interaction.js +14 -24
  340. package/dist/interaction.js.map +1 -1
  341. package/dist/latest-question-R77KWSUP.js +118 -0
  342. package/dist/latest-question-R77KWSUP.js.map +1 -0
  343. package/dist/lib/clipboard.d.ts +7 -0
  344. package/dist/lib/error-message.d.ts +7 -0
  345. package/dist/lib/format.d.ts +58 -4
  346. package/dist/lib/host-theme.d.ts +77 -0
  347. package/dist/lib/interaction-errors.d.ts +3 -0
  348. package/dist/lib/menu-styles.d.ts +22 -0
  349. package/dist/lib/notify-observer.d.ts +2 -0
  350. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  351. package/dist/lib/provider-recovery.d.ts +55 -0
  352. package/dist/lib/scrollbars.d.ts +11 -0
  353. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  354. package/dist/lib/transient-retry.d.ts +25 -0
  355. package/dist/lib/workbench-peers.d.ts +36 -0
  356. package/dist/lib/xterm-theme.d.ts +7 -5
  357. package/dist/machines.js +9 -5
  358. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  359. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  360. package/dist/mcp-connection-status.d.ts +14 -0
  361. package/dist/model-mark-paths.d.ts +34 -0
  362. package/dist/model-mark-paths.js +16 -0
  363. package/dist/model-mark-paths.js.map +1 -0
  364. package/dist/model-picker-model.d.ts +111 -0
  365. package/dist/model-picker-model.js +25 -0
  366. package/dist/model-picker-model.js.map +1 -0
  367. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  368. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  369. package/dist/model-policy.d.ts +30 -3
  370. package/dist/model-policy.js +14 -1
  371. package/dist/native-previews.d.ts +28 -0
  372. package/dist/native-previews.js +82 -0
  373. package/dist/native-previews.js.map +1 -0
  374. package/dist/new-session-draft.d.ts +7 -0
  375. package/dist/new-session-draft.js +639 -0
  376. package/dist/new-session-draft.js.map +1 -0
  377. package/dist/notification-text.d.ts +27 -0
  378. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  379. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  380. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  381. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  382. package/dist/older-history.d.ts +3 -2
  383. package/dist/organization-model.d.ts +32 -0
  384. package/dist/organization-model.js +65 -0
  385. package/dist/organization-model.js.map +1 -0
  386. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  387. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  388. package/dist/plugin-details.d.ts +14 -0
  389. package/dist/plugin-discovery.d.ts +25 -0
  390. package/dist/preview-loading-paint.d.ts +20 -0
  391. package/dist/provider.d.ts +25 -2
  392. package/dist/queue-presentation-model.d.ts +72 -0
  393. package/dist/queue-presentation-model.js +38 -0
  394. package/dist/queue-presentation-model.js.map +1 -0
  395. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  396. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  397. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  398. package/dist/realtime/embedded-voice.d.ts +1 -0
  399. package/dist/realtime/realtime-control.d.ts +4 -65
  400. package/dist/realtime/session-realtime.d.ts +78 -0
  401. package/dist/realtime.js +25 -1333
  402. package/dist/realtime.js.map +1 -1
  403. package/dist/sandbox-files-O27IPOZW.js +21 -0
  404. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  405. package/dist/sandbox-label-model.d.ts +30 -0
  406. package/dist/sandbox-label-model.js +20 -0
  407. package/dist/sandbox-label-model.js.map +1 -0
  408. package/dist/scrollbars.d.ts +1 -0
  409. package/dist/scrollbars.js +10 -0
  410. package/dist/scrollbars.js.map +1 -0
  411. package/dist/secret-reference-label.d.ts +14 -0
  412. package/dist/secrets-ui.d.ts +57 -0
  413. package/dist/session-agents-model.d.ts +10 -0
  414. package/dist/session-agents-model.js +25 -0
  415. package/dist/session-agents-model.js.map +1 -0
  416. package/dist/session-attention-model.d.ts +8 -0
  417. package/dist/session-attention-model.js +47 -0
  418. package/dist/session-attention-model.js.map +1 -0
  419. package/dist/session-auth-recommendation.d.ts +5 -0
  420. package/dist/session-capability-policy.d.ts +31 -0
  421. package/dist/session-feedback-model.d.ts +20 -0
  422. package/dist/session-feedback-model.js +56 -0
  423. package/dist/session-feedback-model.js.map +1 -0
  424. package/dist/session-list-model.d.ts +138 -0
  425. package/dist/session-list-model.js +274 -0
  426. package/dist/session-list-model.js.map +1 -0
  427. package/dist/session-realtime-7DJOIHQW.js +21 -0
  428. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  429. package/dist/session-realtime.d.ts +7 -0
  430. package/dist/session-realtime.js +19 -0
  431. package/dist/session-realtime.js.map +1 -0
  432. package/dist/session-status-model.d.ts +36 -0
  433. package/dist/session-ui.d.ts +39 -1
  434. package/dist/session-ui.js +126 -12
  435. package/dist/session-ui.js.map +1 -1
  436. package/dist/session.d.ts +8 -2
  437. package/dist/session.js +35 -20
  438. package/dist/site-snapshot.d.ts +14 -0
  439. package/dist/sites-ui.d.ts +24 -0
  440. package/dist/sites.d.ts +3 -0
  441. package/dist/sites.js +14 -0
  442. package/dist/sites.js.map +1 -0
  443. package/dist/skill-discovery.d.ts +47 -0
  444. package/dist/terminal.d.ts +8 -0
  445. package/dist/terminal.js +32 -0
  446. package/dist/terminal.js.map +1 -0
  447. package/dist/testing/session-scenarios.d.ts +10 -0
  448. package/dist/testing/session-scenarios.js +367 -0
  449. package/dist/testing/session-scenarios.js.map +1 -0
  450. package/dist/timeline/activity-rail.d.ts +11 -2
  451. package/dist/timeline/agent-identity.d.ts +30 -0
  452. package/dist/timeline/agent-row.d.ts +31 -0
  453. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  454. package/dist/timeline/compaction-copy.d.ts +46 -0
  455. package/dist/timeline/focus-sequence.d.ts +9 -0
  456. package/dist/timeline/genie-copy.d.ts +3 -0
  457. package/dist/timeline/genie-loading.d.ts +47 -0
  458. package/dist/timeline/index.d.ts +10 -5
  459. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  460. package/dist/timeline/message-sender.d.ts +19 -0
  461. package/dist/timeline/notice-presentation.d.ts +13 -0
  462. package/dist/timeline/parsers.d.ts +11 -0
  463. package/dist/timeline/patch-apply-command.d.ts +18 -0
  464. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  465. package/dist/timeline/platform-activity-row.d.ts +1 -2
  466. package/dist/timeline/presented-image.d.ts +11 -0
  467. package/dist/timeline/projection.d.ts +31 -2
  468. package/dist/timeline/provider-logo.d.ts +15 -0
  469. package/dist/timeline/question-nav-model.d.ts +23 -0
  470. package/dist/timeline/registry.d.ts +12 -1
  471. package/dist/timeline/retained-image.d.ts +18 -0
  472. package/dist/timeline/retained-loaders.d.ts +27 -0
  473. package/dist/timeline/rolling-activity.d.ts +11 -0
  474. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  475. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  476. package/dist/timeline/shared.d.ts +4 -1
  477. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  478. package/dist/timeline/startup-preference.d.ts +3 -0
  479. package/dist/timeline/startup-timings.d.ts +4 -0
  480. package/dist/timeline/tool-display-name.d.ts +5 -2
  481. package/dist/timeline/tool-presentation.d.ts +172 -0
  482. package/dist/timeline/turn-summary-model.d.ts +95 -0
  483. package/dist/timeline/turn-summary.d.ts +20 -54
  484. package/dist/timeline/types.d.ts +179 -7
  485. package/dist/timeline/work-presentation.d.ts +60 -0
  486. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  487. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  488. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  489. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  490. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  491. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  492. package/dist/timeline-model.d.ts +29 -0
  493. package/dist/timeline-model.js +254 -0
  494. package/dist/timeline-model.js.map +1 -0
  495. package/dist/usage/allowance-copy.d.ts +25 -0
  496. package/dist/usage/session-usage-limit.d.ts +88 -0
  497. package/dist/usage/summary.d.ts +35 -0
  498. package/dist/usage.d.ts +17 -0
  499. package/dist/usage.js +1187 -0
  500. package/dist/usage.js.map +1 -0
  501. package/dist/voice-recording-owner.d.ts +7 -0
  502. package/package.json +106 -7
  503. package/src/approvals.ts +8 -1
  504. package/src/artifacts-spreadsheet.ts +1 -0
  505. package/src/artifacts.ts +44 -0
  506. package/src/assets/README.md +8 -0
  507. package/src/assets/gmail.ico +0 -0
  508. package/src/assets/outlook.ico +0 -0
  509. package/src/capability-catalog-row.tsx +94 -0
  510. package/src/capability-logo-fallback.ts +22 -0
  511. package/src/client.ts +20 -31
  512. package/src/commands/registry.ts +18 -15
  513. package/src/commands/types.ts +2 -0
  514. package/src/components/anthropic-mark.tsx +10 -0
  515. package/src/components/approval-surface.tsx +401 -138
  516. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  517. package/src/components/artifacts/artifact-sandbox.tsx +193 -0
  518. package/src/components/artifacts/artifact-surface.tsx +40 -20
  519. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  520. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  521. package/src/components/artifacts/document-editor.tsx +141 -16
  522. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  523. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  524. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  525. package/src/components/artifacts/editable-document.tsx +37 -36
  526. package/src/components/artifacts/editable-presentation.tsx +36 -18
  527. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  528. package/src/components/artifacts/index.ts +45 -0
  529. package/src/components/artifacts/inline-html-document.ts +24 -0
  530. package/src/components/artifacts/latest-task-runner.ts +49 -0
  531. package/src/components/artifacts/presentation-editor.tsx +323 -67
  532. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  533. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  534. package/src/components/artifacts/site-view.tsx +121 -0
  535. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  536. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  537. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  538. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  539. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  540. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  541. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  542. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  543. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  544. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  545. package/src/components/browser-select-control.tsx +312 -0
  546. package/src/components/browser-viewer.tsx +778 -318
  547. package/src/components/chat-composer.tsx +47 -5
  548. package/src/components/child-session-link.tsx +36 -0
  549. package/src/components/claude-mark.tsx +11 -0
  550. package/src/components/code-editor.tsx +13 -16
  551. package/src/components/composer-transcription-control.tsx +128 -30
  552. package/src/components/composer.tsx +404 -195
  553. package/src/components/computer-viewer.tsx +880 -253
  554. package/src/components/copy-button.tsx +13 -5
  555. package/src/components/desktop-viewer.tsx +1 -1
  556. package/src/components/enrollment-consent.tsx +1 -1
  557. package/src/components/enrollment-device-flow.tsx +1 -1
  558. package/src/components/file-browser.tsx +10 -14
  559. package/src/components/fleet-tile.tsx +5 -3
  560. package/src/components/generated-video-player.tsx +4 -2
  561. package/src/components/grok-mark.tsx +34 -0
  562. package/src/components/human-input-form.tsx +590 -283
  563. package/src/components/human-input-surface.tsx +11 -0
  564. package/src/components/interaction-intervention-banner.tsx +2 -2
  565. package/src/components/linkified-text.tsx +79 -0
  566. package/src/components/machine-card.tsx +35 -78
  567. package/src/components/machine-dock-bar.tsx +1 -1
  568. package/src/components/machine-input-display.ts +197 -3
  569. package/src/components/machines/agent-status-icon.tsx +31 -0
  570. package/src/components/machines/machine-detail.tsx +200 -31
  571. package/src/components/machines/machine-operation-policy.tsx +1 -1
  572. package/src/components/machines/machine-status.ts +241 -0
  573. package/src/components/machines-dashboard.tsx +2 -17
  574. package/src/components/markdown-table-layout.ts +143 -0
  575. package/src/components/markdown.tsx +466 -129
  576. package/src/components/message-timeline.tsx +2370 -667
  577. package/src/components/model-mark.tsx +102 -0
  578. package/src/components/model-picker.tsx +15 -4
  579. package/src/components/model-policy-picker-menu.tsx +371 -0
  580. package/src/components/model-policy-picker.tsx +252 -429
  581. package/src/components/new-conversation.tsx +221 -0
  582. package/src/components/open-geni-chat.tsx +309 -0
  583. package/src/components/open-geni-links.tsx +179 -0
  584. package/src/components/openrouter-mark.tsx +13 -0
  585. package/src/components/opper-mark.tsx +18 -0
  586. package/src/components/pierre-diff.tsx +41 -16
  587. package/src/components/pierre-file.tsx +35 -10
  588. package/src/components/preview-loading.tsx +109 -0
  589. package/src/components/provider-recovery-notice.tsx +49 -0
  590. package/src/components/queue-item-content.ts +14 -0
  591. package/src/components/queue-surface-implementation.tsx +51 -356
  592. package/src/components/queue-surface-state.tsx +3 -1
  593. package/src/components/rehype-secret-refs.ts +98 -0
  594. package/src/components/remark-soft-line-breaks.ts +166 -0
  595. package/src/components/sandbox-files.tsx +91 -15
  596. package/src/components/sandbox-terminal.tsx +84 -13
  597. package/src/components/sandbox-workspace.tsx +147 -51
  598. package/src/components/secret-question-field.tsx +324 -0
  599. package/src/components/secret-ref-chip.tsx +185 -0
  600. package/src/components/session-capability-frame.tsx +197 -0
  601. package/src/components/session-chrome.tsx +842 -251
  602. package/src/components/session-commands-panel.tsx +126 -0
  603. package/src/components/session-commands.tsx +18 -0
  604. package/src/components/session-connection-request.tsx +97 -0
  605. package/src/components/session-conversation.tsx +876 -0
  606. package/src/components/session-list.tsx +257 -0
  607. package/src/components/session-mcp-capability-card.tsx +680 -0
  608. package/src/components/session-proxy-scope.tsx +153 -0
  609. package/src/components/session-status.tsx +26 -17
  610. package/src/components/session-usage-limit-notice.tsx +174 -0
  611. package/src/components/timeline-anchor.tsx +119 -0
  612. package/src/components/timeline-annotation-chrome.tsx +196 -0
  613. package/src/components/timeline-annotation-layout.ts +268 -0
  614. package/src/components/timeline-annotation-markers.tsx +185 -0
  615. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  616. package/src/components/timeline-annotation-selection.tsx +106 -54
  617. package/src/components/timeline-annotation-shared.ts +245 -0
  618. package/src/components/timeline-annotations-dialog.tsx +185 -128
  619. package/src/components/timeline-annotations.tsx +189 -45
  620. package/src/components/timeline-reading-progress.ts +80 -0
  621. package/src/components/timeline-search.tsx +168 -0
  622. package/src/components/timeline-settlement.ts +60 -0
  623. package/src/components/tool-action-review.tsx +650 -0
  624. package/src/components/tool-review-history.tsx +88 -0
  625. package/src/components/usage-limit-notice.tsx +179 -0
  626. package/src/components/usage-member-list.tsx +792 -0
  627. package/src/components/usage-meter.tsx +382 -0
  628. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  629. package/src/components/user-message-body.tsx +27 -2
  630. package/src/components/workspace-dock.tsx +18 -1
  631. package/src/composer-messages.ts +150 -0
  632. package/src/composer-voice-events.ts +12 -0
  633. package/src/composer.ts +6 -1
  634. package/src/connect-account-identity.tsx +34 -0
  635. package/src/connect-accounts.tsx +233 -0
  636. package/src/connect-chooser.tsx +336 -0
  637. package/src/connect-panel.tsx +99 -0
  638. package/src/connect-setup.tsx +355 -0
  639. package/src/connect.ts +60 -0
  640. package/src/connection-assets.d.ts +4 -0
  641. package/src/connection-catalog.tsx +162 -0
  642. package/src/connection-discovery.tsx +238 -0
  643. package/src/connection-installed.tsx +51 -0
  644. package/src/connection-logo.tsx +37 -0
  645. package/src/connection-service-logo.tsx +55 -0
  646. package/src/connection-service-presentation.ts +46 -0
  647. package/src/connection-skeleton.tsx +16 -0
  648. package/src/connection-type-picker.tsx +36 -0
  649. package/src/conversation-timeline.ts +92 -0
  650. package/src/desktop.ts +24 -0
  651. package/src/device-authorization.tsx +98 -0
  652. package/src/diffs.ts +16 -0
  653. package/src/discovery-cache.ts +42 -0
  654. package/src/editor.ts +13 -0
  655. package/src/hooks/internal.ts +3 -2
  656. package/src/hooks/latest-question.ts +164 -0
  657. package/src/hooks/shared-machines-list.ts +34 -1
  658. package/src/hooks/shared-query.ts +721 -0
  659. package/src/hooks/use-attached-browsers.ts +1 -1
  660. package/src/hooks/use-auth-runs.ts +0 -27
  661. package/src/hooks/use-available-models.ts +2 -2
  662. package/src/hooks/use-browser-frame-stream.ts +19 -2
  663. package/src/hooks/use-browser-session.ts +680 -205
  664. package/src/hooks/use-browser-sessions.ts +32 -1
  665. package/src/hooks/use-client-config-flags.ts +118 -0
  666. package/src/hooks/use-codex-accounts.ts +247 -47
  667. package/src/hooks/use-composer.ts +227 -44
  668. package/src/hooks/use-computer-frame-stream.ts +25 -7
  669. package/src/hooks/use-computer-input-posture.ts +94 -0
  670. package/src/hooks/use-computer-session.ts +409 -95
  671. package/src/hooks/use-connect.ts +23 -0
  672. package/src/hooks/use-desktop-stream.ts +19 -28
  673. package/src/hooks/use-file-attachments.ts +80 -4
  674. package/src/hooks/use-goal.ts +79 -9
  675. package/src/hooks/use-last-started-turn-policy.ts +37 -11
  676. package/src/hooks/use-machines.ts +4 -0
  677. package/src/hooks/use-new-conversation.ts +374 -0
  678. package/src/hooks/use-new-session-draft.ts +813 -0
  679. package/src/hooks/use-realtime-voice-models.ts +46 -0
  680. package/src/hooks/use-sandbox-files.ts +68 -20
  681. package/src/hooks/use-session-background-commands.ts +22 -11
  682. package/src/hooks/use-session-capabilities.ts +3 -2
  683. package/src/hooks/use-session-conversation.ts +150 -0
  684. package/src/hooks/use-session-events.ts +531 -335
  685. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  686. package/src/hooks/use-session-model-account.ts +174 -0
  687. package/src/hooks/use-session.ts +30 -2
  688. package/src/hooks/use-slash-commands.ts +6 -11
  689. package/src/hooks/use-supergrok-accounts.ts +22 -8
  690. package/src/hooks/use-terminal-stream.ts +153 -27
  691. package/src/hooks/use-transcription.ts +6 -0
  692. package/src/hooks/use-turn-queue.ts +2 -1
  693. package/src/hooks/use-usage.ts +100 -0
  694. package/src/hooks/use-vaults.ts +153 -0
  695. package/src/hooks/use-video-artifact-playback.ts +1 -1
  696. package/src/hooks/use-voice-input.ts +127 -19
  697. package/src/hooks/use-workspace-capture.ts +3 -2
  698. package/src/hooks/use-workspace-edit.ts +23 -5
  699. package/src/hooks/use-workspace-sessions.ts +74 -7
  700. package/src/human-input-model.ts +359 -0
  701. package/src/identity-link-accounts.tsx +148 -0
  702. package/src/identity-link-consent.tsx +192 -0
  703. package/src/index.ts +262 -16
  704. package/src/interaction.ts +1 -0
  705. package/src/lib/clipboard.ts +29 -0
  706. package/src/lib/error-message.ts +37 -0
  707. package/src/lib/format.ts +205 -10
  708. package/src/lib/host-theme.ts +529 -0
  709. package/src/lib/interaction-errors.ts +15 -0
  710. package/src/lib/menu-styles.ts +44 -0
  711. package/src/lib/notify-observer.ts +15 -0
  712. package/src/lib/pierre-diffs-loader.ts +53 -0
  713. package/src/lib/provider-recovery.ts +243 -0
  714. package/src/lib/scrollbars.ts +30 -0
  715. package/src/lib/terminal-input-readiness.ts +51 -0
  716. package/src/lib/transient-retry.ts +99 -0
  717. package/src/lib/workbench-peers.ts +62 -0
  718. package/src/lib/xterm-theme.ts +23 -21
  719. package/src/mcp-connection-status.ts +35 -0
  720. package/src/model-mark-paths.ts +53 -0
  721. package/src/model-picker-model.ts +330 -0
  722. package/src/model-policy.ts +299 -74
  723. package/src/native-previews.ts +100 -0
  724. package/src/new-session-draft.ts +22 -0
  725. package/src/notification-text.ts +81 -0
  726. package/src/older-history.ts +22 -4
  727. package/src/organization-model.ts +118 -0
  728. package/src/plugin-details.tsx +185 -0
  729. package/src/plugin-discovery.tsx +196 -0
  730. package/src/preview-loading-paint.ts +68 -0
  731. package/src/provider.tsx +74 -15
  732. package/src/queue-presentation-model.ts +464 -0
  733. package/src/realtime/dropdown-menu.tsx +19 -12
  734. package/src/realtime/embedded-new-voice.tsx +1 -0
  735. package/src/realtime/embedded-voice.tsx +3 -0
  736. package/src/realtime/realtime-control.tsx +138 -550
  737. package/src/realtime/session-realtime.ts +566 -0
  738. package/src/sandbox-label-model.ts +53 -0
  739. package/src/scrollbars.ts +3 -0
  740. package/src/secret-reference-label.ts +43 -0
  741. package/src/secrets-ui.tsx +59 -0
  742. package/src/session-agents-model.ts +33 -0
  743. package/src/session-attention-model.ts +62 -0
  744. package/src/session-auth-recommendation.ts +48 -0
  745. package/src/session-capability-policy.ts +196 -0
  746. package/src/session-context.ts +3 -4
  747. package/src/session-feedback-model.ts +95 -0
  748. package/src/session-list-model.ts +434 -0
  749. package/src/session-realtime.ts +18 -0
  750. package/src/session-status-model.ts +99 -0
  751. package/src/session-ui.ts +98 -1
  752. package/src/session.ts +17 -1
  753. package/src/site-snapshot.ts +74 -0
  754. package/src/sites-ui.tsx +348 -0
  755. package/src/sites.ts +3 -0
  756. package/src/skill-discovery.tsx +208 -0
  757. package/src/terminal.ts +26 -0
  758. package/src/testing/session-scenarios.ts +404 -0
  759. package/src/timeline/activity-rail.tsx +242 -101
  760. package/src/timeline/agent-identity.tsx +84 -0
  761. package/src/timeline/agent-row.tsx +231 -0
  762. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  763. package/src/timeline/compaction-copy.ts +115 -0
  764. package/src/timeline/fleet-decision-projection.ts +2 -1
  765. package/src/timeline/fleet-decision-row.tsx +1 -0
  766. package/src/timeline/focus-sequence.ts +44 -0
  767. package/src/timeline/genie-copy.ts +19 -0
  768. package/src/timeline/genie-loading.tsx +143 -0
  769. package/src/timeline/index.ts +30 -2
  770. package/src/timeline/knowledge-receipt.tsx +100 -0
  771. package/src/timeline/message-sender.tsx +71 -0
  772. package/src/timeline/notice-presentation.ts +48 -0
  773. package/src/timeline/parsers.ts +42 -2
  774. package/src/timeline/patch-apply-command.tsx +135 -0
  775. package/src/timeline/platform-activity-presentation.ts +166 -0
  776. package/src/timeline/platform-activity-row.tsx +15 -90
  777. package/src/timeline/presented-image.ts +63 -0
  778. package/src/timeline/projection.ts +1742 -76
  779. package/src/timeline/provider-logo.tsx +53 -0
  780. package/src/timeline/question-nav-model.ts +28 -0
  781. package/src/timeline/registry.ts +26 -4
  782. package/src/timeline/retained-image.ts +97 -0
  783. package/src/timeline/retained-loaders.ts +91 -0
  784. package/src/timeline/rolling-activity.tsx +80 -0
  785. package/src/timeline/screenshot-lightbox.tsx +228 -5
  786. package/src/timeline/session-usage-limit-row.tsx +42 -0
  787. package/src/timeline/shared.tsx +42 -15
  788. package/src/timeline/startup-dispatch-details.tsx +36 -0
  789. package/src/timeline/startup-preference.ts +33 -0
  790. package/src/timeline/startup-timings.tsx +145 -0
  791. package/src/timeline/tool-display-name.ts +19 -7
  792. package/src/timeline/tool-presentation.ts +1316 -0
  793. package/src/timeline/tool-renderers.tsx +835 -1138
  794. package/src/timeline/turn-summary-model.ts +343 -0
  795. package/src/timeline/turn-summary.tsx +272 -365
  796. package/src/timeline/types.ts +189 -6
  797. package/src/timeline/work-presentation.ts +189 -0
  798. package/src/timeline-model.ts +143 -0
  799. package/src/usage/allowance-copy.ts +64 -0
  800. package/src/usage/session-usage-limit.ts +266 -0
  801. package/src/usage/summary.ts +93 -0
  802. package/src/usage.ts +70 -0
  803. package/src/voice-recording-owner.ts +22 -0
  804. package/styles/compiled.css +2319 -748
  805. package/styles/connect.css +290 -0
  806. package/styles/connect.d.ts +1 -0
  807. package/styles/effective-tokens.css +1 -0
  808. package/styles/index.css +309 -9
  809. package/styles/responsive.css +99 -7
  810. package/styles/session-capability.css +44 -0
  811. package/styles/tokens.css +134 -66
  812. package/dist/browser-viewer-MKKFRRRV.js +0 -14
  813. package/dist/chunk-2DZVYHVO.js +0 -470
  814. package/dist/chunk-2DZVYHVO.js.map +0 -1
  815. package/dist/chunk-3AGBGTRT.js.map +0 -1
  816. package/dist/chunk-4MDLEHXL.js.map +0 -1
  817. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  818. package/dist/chunk-7EAFGICR.js +0 -302
  819. package/dist/chunk-7EAFGICR.js.map +0 -1
  820. package/dist/chunk-ELIYWBZR.js.map +0 -1
  821. package/dist/chunk-H5YGYNXS.js.map +0 -1
  822. package/dist/chunk-HUIKIDM5.js.map +0 -1
  823. package/dist/chunk-ICA6R6TW.js.map +0 -1
  824. package/dist/chunk-IOLVN74D.js.map +0 -1
  825. package/dist/chunk-JAQ5K7W6.js.map +0 -1
  826. package/dist/chunk-JVYQRRC4.js.map +0 -1
  827. package/dist/chunk-KCGXPP5V.js.map +0 -1
  828. package/dist/chunk-KZ73RL76.js.map +0 -1
  829. package/dist/chunk-NEXLLTP4.js.map +0 -1
  830. package/dist/chunk-PEI6RANI.js.map +0 -1
  831. package/dist/chunk-VTOREEXF.js +0 -142
  832. package/dist/chunk-VTOREEXF.js.map +0 -1
  833. package/dist/chunk-WSK7G5LE.js +0 -170
  834. package/dist/chunk-WSK7G5LE.js.map +0 -1
  835. package/dist/chunk-X4A66EWZ.js +0 -223
  836. package/dist/chunk-X4A66EWZ.js.map +0 -1
  837. package/dist/chunk-XYRDDSXF.js.map +0 -1
  838. package/dist/chunk-YG4QEQF5.js +0 -9557
  839. package/dist/chunk-YG4QEQF5.js.map +0 -1
  840. package/dist/chunk-YVCHAQZY.js.map +0 -1
  841. package/dist/chunk-ZPBTI3TE.js.map +0 -1
  842. package/dist/computer-viewer-FWEZISW4.js +0 -16
  843. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  844. package/dist/hooks/use-environments.d.ts +0 -41
  845. package/dist/hooks/use-packs.d.ts +0 -32
  846. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  847. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  848. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  849. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  850. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  851. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  852. package/src/hooks/use-environments.ts +0 -182
  853. package/src/hooks/use-packs.ts +0 -157
  854. /package/dist/{browser-viewer-MKKFRRRV.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  855. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-4EUKJXUO.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
+ }