@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/realtime/realtime-control.tsx","../src/realtime/dropdown-menu.tsx"],"sourcesContent":["import { type EffectiveSessionControl, type SessionEvent, type SessionStatus } from \"@opengeni/sdk\";\nimport {\n hasStoredSessionRealtimeOwnerProof,\n projectSessionRealtimeLifecycle,\n type SessionRealtimeClientLike,\n type SessionRealtimeController,\n type SessionRealtimeControllerSnapshot,\n type CreateSessionRealtimeControllerOptions,\n type SessionRealtimeLifecycleProjection,\n type SessionRealtimeModel,\n type WorkspaceRealtimeModelCatalogItem,\n} from \"@opengeni/sdk/realtime\";\nimport {\n AudioLinesIcon,\n CheckIcon,\n ChevronDownIcon,\n CircleAlertIcon,\n LoaderCircleIcon,\n MicIcon,\n MicOffIcon,\n RotateCcwIcon,\n SquareIcon,\n Volume2Icon,\n VolumeXIcon,\n} from \"lucide-react\";\nimport { AnimatePresence, motion, useReducedMotion } from \"motion/react\";\nimport {\n type ReactNode,\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n BillingClassMark,\n PickerAnimatedPage,\n PickerBackHeader,\n PickerNavRow,\n} from \"../components/model-policy-picker\";\nimport type { EmbeddedRealtimeSessionClientLike } from \"../client\";\nimport { cn } from \"../lib/cn\";\nimport type { PickerBillingClass as BillingClass } from \"../model-policy\";\nimport { useEmbeddedRealtimeSession } from \"../session-context\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\";\n\nexport type RealtimeModelOption = {\n id: SessionRealtimeModel;\n label: string;\n provider: \"OpenGeni\" | \"Connected Codex\" | \"Connected SuperGrok\" | \"Your Gateway\";\n description: string;\n available: boolean;\n unavailableReason: string | null;\n recommended: boolean;\n};\n\nconst CODEX_LIVE_MODEL: RealtimeModelOption = {\n id: \"gpt-live-1-boulder-alpha\",\n label: \"Codex Live\",\n provider: \"Connected Codex\",\n description: \"Deep session integration\",\n available: false,\n unavailableReason: \"Connect Codex to use this voice model\",\n recommended: false,\n};\n\nconst REALTIME_MODEL_PROVIDERS = [\n \"OpenGeni\",\n \"Connected Codex\",\n \"Connected SuperGrok\",\n \"Your Gateway\",\n] as const;\ntype RealtimeModelProvider = (typeof REALTIME_MODEL_PROVIDERS)[number];\n\nconst REALTIME_PROVIDER_META: Record<\n RealtimeModelProvider,\n { billingClass: BillingClass; hint: string }\n> = {\n OpenGeni: { billingClass: \"opengeni_credits\", hint: \"Will use credits\" },\n \"Connected Codex\": {\n billingClass: \"codex_subscription\",\n hint: \"ChatGPT / Codex plan\",\n },\n \"Connected SuperGrok\": {\n billingClass: \"supergrok_subscription\",\n hint: \"SuperGrok / xAI plan\",\n },\n \"Your Gateway\": { billingClass: \"byok\", hint: \"Billed to your AI Gateway\" },\n};\nconst REALTIME_MODEL_STORAGE_PREFIX = \"opengeni:realtime-model\";\nconst REALTIME_MODEL_CATALOG_CACHE_TTL_MS = 60_000;\nconst REALTIME_MODEL_CATALOG_CACHE_MAX_WORKSPACES = 64;\n\ntype RealtimeControllerClient = EmbeddedRealtimeSessionClientLike & SessionRealtimeClientLike;\n\ntype RealtimeModelCatalogCacheEntry =\n | { state: \"loading\"; promise: Promise<RealtimeModelOption[]> }\n | { state: \"ready\"; models: RealtimeModelOption[]; expiresAt: number };\n\n// Scope advisory availability to the exact client object and workspace. The\n// server still authorizes every realtime operation; changing principals should\n// replace the client just as it does for the rest of the SDK state.\nconst realtimeModelCatalogCache = new WeakMap<\n RealtimeControllerClient,\n Map<string, RealtimeModelCatalogCacheEntry>\n>();\n\nfunction realtimeModelFallback(codexConnected: boolean): RealtimeModelOption[] {\n return [\n {\n ...CODEX_LIVE_MODEL,\n available: codexConnected,\n unavailableReason: codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,\n },\n ];\n}\n\nfunction realtimeModelCatalogCacheFor(\n client: RealtimeControllerClient,\n): Map<string, RealtimeModelCatalogCacheEntry> {\n const existing = realtimeModelCatalogCache.get(client);\n if (existing) return existing;\n const created = new Map<string, RealtimeModelCatalogCacheEntry>();\n realtimeModelCatalogCache.set(client, created);\n return created;\n}\n\nfunction readCachedRealtimeModelCatalog(\n client: RealtimeControllerClient,\n workspaceId: string,\n now = Date.now(),\n): RealtimeModelOption[] | null {\n const cache = realtimeModelCatalogCache.get(client);\n const entry = cache?.get(workspaceId);\n if (!entry || entry.state === \"loading\") return null;\n if (entry.expiresAt > now) return entry.models;\n cache?.delete(workspaceId);\n return null;\n}\n\nfunction pruneRealtimeModelCatalogCache(\n cache: Map<string, RealtimeModelCatalogCacheEntry>,\n now: number,\n): void {\n for (const [workspaceId, entry] of cache) {\n if (entry.state === \"ready\" && entry.expiresAt <= now) cache.delete(workspaceId);\n }\n while (cache.size >= REALTIME_MODEL_CATALOG_CACHE_MAX_WORKSPACES) {\n const oldestWorkspaceId = cache.keys().next().value;\n if (oldestWorkspaceId === undefined) return;\n cache.delete(oldestWorkspaceId);\n }\n}\n\nfunction loadRealtimeModelCatalog(\n client: RealtimeControllerClient,\n workspaceId: string,\n): Promise<RealtimeModelOption[]> | null {\n const load = client.getWorkspaceRealtimeModelCatalog;\n if (!load) return null;\n const now = Date.now();\n const cache = realtimeModelCatalogCacheFor(client);\n const entry = cache.get(workspaceId);\n if (entry?.state === \"loading\") return entry.promise;\n if (entry?.state === \"ready\" && entry.expiresAt > now) return Promise.resolve(entry.models);\n if (entry) cache.delete(workspaceId);\n pruneRealtimeModelCatalogCache(cache, now);\n\n const promise = load\n .call(client, workspaceId)\n .then((response) => response.models.map(toRealtimeModelOption))\n .then((models) => {\n const current = cache.get(workspaceId);\n if (current?.state === \"loading\" && current.promise === promise) {\n cache.delete(workspaceId);\n cache.set(workspaceId, {\n state: \"ready\",\n models,\n expiresAt: Date.now() + REALTIME_MODEL_CATALOG_CACHE_TTL_MS,\n });\n }\n return models;\n })\n .catch((error: unknown) => {\n const current = cache.get(workspaceId);\n if (current?.state === \"loading\" && current.promise === promise) cache.delete(workspaceId);\n throw error;\n });\n cache.set(workspaceId, { state: \"loading\", promise });\n return promise;\n}\n\nexport type SessionRealtimeControllerFactory = (\n options: CreateSessionRealtimeControllerOptions,\n) => SessionRealtimeController;\n\ntype AdmissionInput = {\n sessionStatus: SessionStatus;\n controlState: \"active\" | \"paused\";\n settlement: { state: string } | null;\n codexConnected: boolean;\n lifecycleActive: boolean;\n};\n\nexport function codexRealtimeAdmissionAllowed(input: AdmissionInput): boolean {\n return codexRealtimeAdmissionBlocker(input) === null;\n}\n\nexport function codexRealtimeAdmissionBlocker(input: AdmissionInput): string | null {\n if (input.sessionStatus === \"cancelled\") return \"This session was cancelled.\";\n if (input.controlState !== \"active\") return \"Resume this session before starting voice.\";\n if (input.settlement !== null) return \"Wait for the current session transition to finish.\";\n if (!input.codexConnected) return \"Connect Codex to use this voice model.\";\n if (input.lifecycleActive) return \"Voice is already active for this session.\";\n return null;\n}\n\nexport function useSessionRealtime(options: {\n client?: RealtimeControllerClient | undefined;\n workspaceId?: string | undefined;\n sessionId: string;\n sessionStatus: SessionStatus;\n effectiveControl: EffectiveSessionControl;\n events: SessionEvent[];\n eventsReady: boolean;\n codexConnected: boolean;\n model?: SessionRealtimeModel | undefined;\n modelAvailable?: boolean | undefined;\n modelUnavailableReason?: string | null | undefined;\n /** Model-visible application context captured with each durable realtime message. */\n getModelContext?: (() => string | undefined) | undefined;\n /** Deterministic browser-test/demo seam. Production hosts should use the SDK default. */\n controllerFactory?: SessionRealtimeControllerFactory | undefined;\n}) {\n const { client, workspaceId } = useEmbeddedRealtimeSession({\n client: options.client,\n workspaceId: options.workspaceId,\n });\n const model = options.model ?? CODEX_LIVE_MODEL.id;\n const audioRef = useRef<HTMLAudioElement>(null);\n const controllerRef = useRef<SessionRealtimeController | null>(null);\n const controllerModelRef = useRef<SessionRealtimeModel | null>(null);\n const modelContextProviderRef = useRef(options.getModelContext);\n modelContextProviderRef.current = options.getModelContext;\n const [snapshot, setSnapshot] = useState<SessionRealtimeControllerSnapshot>(() => ({\n status: hasStoredSessionRealtimeOwnerProof({\n workspaceId,\n sessionId: options.sessionId,\n model,\n })\n ? \"recovering\"\n : \"idle\",\n realtimeId: null,\n mode: null,\n bridge: null,\n microphone: \"inactive\",\n inputMuted: false,\n audibleOutput: \"inactive\",\n outputMuted: false,\n connectionGeneration: 0,\n reconnectAttempt: 0,\n diagnostic: null,\n error: null,\n }));\n const lifecycle = useMemo(\n () => projectSessionRealtimeLifecycle(options.events),\n [options.events],\n );\n const lifecycleRef = useRef(lifecycle);\n const eventsReadyRef = useRef(options.eventsReady);\n lifecycleRef.current = lifecycle;\n eventsReadyRef.current = options.eventsReady;\n const lifecycleActive = sessionRealtimeLifecycleIsActive(lifecycle);\n\n useEffect(() => {\n let disposed = false;\n let controller: SessionRealtimeController | null = null;\n let unsubscribe: (() => void) | null = null;\n void import(\"@opengeni/sdk/realtime\")\n .then(({ createSessionRealtimeController }) => {\n if (disposed) return;\n const controllerFactory = options.controllerFactory ?? createSessionRealtimeController;\n controller = controllerFactory({\n client,\n workspaceId,\n sessionId: options.sessionId,\n ...(audioRef.current ? { remoteAudio: audioRef.current } : {}),\n model,\n getModelContext: () => modelContextProviderRef.current?.(),\n });\n controllerRef.current = controller;\n controllerModelRef.current = model;\n unsubscribe = controller.subscribe(setSnapshot);\n if (eventsReadyRef.current) {\n void controller.observeLifecycle(lifecycleRef.current).catch(() => undefined);\n }\n })\n .catch((error: unknown) => {\n if (disposed) return;\n setSnapshot({\n status: \"error\",\n realtimeId: null,\n mode: null,\n bridge: null,\n microphone: \"inactive\",\n inputMuted: false,\n audibleOutput: \"inactive\",\n outputMuted: false,\n connectionGeneration: 0,\n reconnectAttempt: 0,\n diagnostic: {\n kind: \"negotiation_failure\",\n message:\n error instanceof Error ? error.message : \"Codex realtime controller failed to load\",\n recoverable: false,\n connectionGeneration: 0,\n attempt: 0,\n },\n error:\n error instanceof Error ? error.message : \"Codex realtime controller failed to load\",\n });\n });\n return () => {\n disposed = true;\n unsubscribe?.();\n controller?.close();\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n controllerModelRef.current = null;\n }\n };\n }, [client, model, options.controllerFactory, options.sessionId, workspaceId]);\n\n useEffect(() => {\n if (!options.eventsReady) return;\n void controllerRef.current?.observeLifecycle(lifecycle).catch(() => undefined);\n }, [lifecycle, options.eventsReady]);\n\n const start = useCallback(async () => {\n const controller = controllerRef.current;\n if (!controller || controllerModelRef.current !== model) {\n throw new Error(\"The selected voice model is still preparing\");\n }\n await controller.start();\n }, [model]);\n const stop = useCallback(async () => {\n await controllerRef.current?.stop();\n }, []);\n const retry = useCallback(async () => {\n await controllerRef.current?.retry();\n }, []);\n const retryAudibleOutput = useCallback(async () => {\n await controllerRef.current?.retryAudibleOutput();\n }, []);\n const setInputMuted = useCallback((muted: boolean) => {\n controllerRef.current?.setInputMuted(muted);\n }, []);\n const setOutputMuted = useCallback((muted: boolean) => {\n controllerRef.current?.setOutputMuted(muted);\n }, []);\n const admissionInput = {\n sessionStatus: options.sessionStatus,\n controlState: options.effectiveControl.state,\n settlement: options.effectiveControl.settlement,\n codexConnected: options.modelAvailable ?? options.codexConnected,\n lifecycleActive,\n } satisfies AdmissionInput;\n const admissionBlocker =\n options.modelAvailable === false\n ? (options.modelUnavailableReason ?? \"This voice model is unavailable.\")\n : codexRealtimeAdmissionBlocker(admissionInput);\n const canStart =\n controllerRef.current !== null &&\n controllerModelRef.current === model &&\n [\"idle\", \"error\"].includes(snapshot.status) &&\n admissionBlocker === null;\n\n return {\n snapshot,\n lifecycleActive,\n canStart,\n admissionBlocker,\n codexConnected: options.codexConnected,\n audioRef,\n start,\n stop,\n retry,\n retryAudibleOutput,\n setInputMuted,\n setOutputMuted,\n };\n}\n\nfunction sessionRealtimeLifecycleIsActive(\n lifecycle: SessionRealtimeLifecycleProjection | null,\n): boolean {\n if (lifecycle?.state !== \"active\") return false;\n const leaseExpiresAt = Date.parse(lifecycle.leaseExpiresAt);\n return !Number.isFinite(leaseExpiresAt) || leaseExpiresAt > Date.now();\n}\n\nexport function SessionRealtimeControl(props: {\n client?: RealtimeControllerClient | undefined;\n workspaceId?: string | undefined;\n sessionId: string;\n sessionStatus: SessionStatus;\n effectiveControl: EffectiveSessionControl;\n events: SessionEvent[];\n eventsReady: boolean;\n codexConnected: boolean;\n /** Model-visible application context captured with each durable realtime message. */\n getModelContext?: (() => string | undefined) | undefined;\n realtimeAutostartModel?: SessionRealtimeModel | undefined;\n onRealtimeAutostartConsumed?: (() => void) | undefined;\n /** Host hides dictate (and can choreograph layout) while realtime voice is live. */\n onVoiceActiveChange?: ((active: boolean) => void) | undefined;\n /**\n * `split` attaches the model chevron at every breakpoint (public default).\n * `split-desktop` hides it below `sm` when the host owns mobile selection.\n * Inside a container-responsive Composer.Root, `sm` follows that composer.\n * `none` never attaches a model menu to the bar button.\n */\n modelMenu?: \"split\" | \"split-desktop\" | \"none\" | undefined;\n /** Explicitly expose low-level controller diagnostics; disabled by default. */\n showDiagnostics?: boolean | undefined;\n /** Deterministic browser-test/demo seam. Production hosts should use the SDK default. */\n controllerFactory?: SessionRealtimeControllerFactory | undefined;\n}) {\n const lifecycle = useMemo(() => projectSessionRealtimeLifecycle(props.events), [props.events]);\n const lifecycleActive = sessionRealtimeLifecycleIsActive(lifecycle);\n const selection = useRealtimeModelSelection({\n client: props.client,\n workspaceId: props.workspaceId,\n codexConnected: props.codexConnected,\n activeModel: lifecycleActive && lifecycle?.state === \"active\" ? lifecycle.model : null,\n });\n const selectedModel = selection.selectedModel;\n const realtime = useSessionRealtime({\n ...props,\n model: selectedModel.id,\n modelAvailable: selectedModel.available,\n modelUnavailableReason: selectedModel.unavailableReason,\n });\n const autostartModelRef = useRef(props.realtimeAutostartModel ?? null);\n const autostartStartedRef = useRef(false);\n\n const { models, selectedModel: selectedRealtimeModel, selectModel } = selection;\n const { canStart, start } = realtime;\n const onRealtimeAutostartConsumed = props.onRealtimeAutostartConsumed;\n const onVoiceActiveChange = props.onVoiceActiveChange;\n const voiceActive = realtime.snapshot.mode?.state === \"active\";\n\n useEffect(() => {\n onVoiceActiveChange?.(voiceActive);\n }, [onVoiceActiveChange, voiceActive]);\n\n useEffect(() => {\n const pending = autostartModelRef.current;\n if (!pending || autostartStartedRef.current || lifecycleActive) return;\n const available = models.some((model) => model.id === pending && model.available);\n if (!available) return;\n if (selectedRealtimeModel.id !== pending) {\n selectModel(pending);\n return;\n }\n if (!canStart) return;\n autostartStartedRef.current = true;\n void start()\n .then(() => {\n autostartModelRef.current = null;\n onRealtimeAutostartConsumed?.();\n })\n .catch(() => {\n autostartStartedRef.current = false;\n });\n }, [\n canStart,\n lifecycleActive,\n models,\n props.sessionId,\n props.workspaceId,\n onRealtimeAutostartConsumed,\n selectModel,\n selectedRealtimeModel.id,\n start,\n ]);\n\n return (\n <RealtimeVoiceControl\n snapshot={realtime.snapshot}\n canStart={realtime.canStart}\n admissionBlocker={realtime.admissionBlocker}\n modelAvailable={selectedModel.available}\n menuSide=\"top\"\n modelMenu={props.modelMenu ?? \"split\"}\n showDiagnostics={props.showDiagnostics}\n audioRef={realtime.audioRef}\n selectedModel={selectedModel}\n models={selection.models}\n onSelectModel={realtime.lifecycleActive ? undefined : selection.selectModel}\n onStart={realtime.start}\n onStop={realtime.stop}\n onRetry={realtime.retry}\n onRetryAudibleOutput={realtime.retryAudibleOutput}\n onSetInputMuted={realtime.setInputMuted}\n onSetOutputMuted={realtime.setOutputMuted}\n />\n );\n}\n\nexport function useRealtimeModelSelection(options: {\n client?: RealtimeControllerClient | undefined;\n workspaceId?: string | undefined;\n codexConnected: boolean;\n activeModel?: SessionRealtimeModel | null | undefined;\n}) {\n const { client, workspaceId } = useEmbeddedRealtimeSession({\n client: options.client,\n workspaceId: options.workspaceId,\n });\n const activeModel = options.activeModel;\n const initialCachedCatalog = readCachedRealtimeModelCatalog(client, workspaceId);\n const [catalog, setCatalog] = useState<RealtimeModelOption[]>(\n () => initialCachedCatalog ?? realtimeModelFallback(options.codexConnected),\n );\n const catalogScopeRef = useRef({\n client,\n workspaceId,\n source: initialCachedCatalog ? (\"cache\" as const) : (\"fallback\" as const),\n });\n const [selectedModelId, setSelectedModelId] = useState<SessionRealtimeModel>(() => {\n const preferred = readRealtimeModelPreference(workspaceId) ?? CODEX_LIVE_MODEL.id;\n if (!initialCachedCatalog) return preferred;\n if (initialCachedCatalog.some((model) => model.id === preferred && model.available)) {\n return preferred;\n }\n return initialCachedCatalog.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;\n });\n\n useEffect(() => {\n let disposed = false;\n const applyCatalog = (models: RealtimeModelOption[]) => {\n catalogScopeRef.current = { client, workspaceId, source: \"cache\" };\n setCatalog(models);\n setSelectedModelId((current) => {\n if (models.some((model) => model.id === current && model.available)) return current;\n return models.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;\n });\n };\n const cached = readCachedRealtimeModelCatalog(client, workspaceId);\n if (cached) {\n const scope = catalogScopeRef.current;\n if (\n scope.client !== client ||\n scope.workspaceId !== workspaceId ||\n scope.source !== \"cache\"\n ) {\n applyCatalog(cached);\n }\n return;\n }\n const loading = loadRealtimeModelCatalog(client, workspaceId);\n if (!loading) return;\n void loading\n .then((models) => {\n if (disposed) return;\n applyCatalog(models);\n })\n .catch(() => undefined);\n return () => {\n disposed = true;\n };\n }, [client, workspaceId]);\n\n useEffect(() => {\n if (activeModel) setSelectedModelId(activeModel);\n }, [activeModel]);\n\n const selectedModel =\n catalog.find((model) => model.id === selectedModelId) ??\n ({\n ...CODEX_LIVE_MODEL,\n available: options.codexConnected,\n unavailableReason: options.codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,\n } satisfies RealtimeModelOption);\n const selectModel = useCallback(\n (value: string) => {\n const model = catalog.find((candidate) => candidate.id === value);\n if (!model || !model.available || activeModel) return;\n setSelectedModelId(model.id);\n writeRealtimeModelPreference(workspaceId, model.id);\n },\n [activeModel, catalog, workspaceId],\n );\n\n return { models: catalog, selectedModel, selectModel };\n}\n\nconst IDLE_REALTIME_SNAPSHOT: SessionRealtimeControllerSnapshot = {\n status: \"idle\",\n realtimeId: null,\n mode: null,\n bridge: null,\n microphone: \"inactive\",\n inputMuted: false,\n audibleOutput: \"inactive\",\n outputMuted: false,\n connectionGeneration: 0,\n reconnectAttempt: 0,\n diagnostic: null,\n error: null,\n};\n\ntype NewSessionRealtimeControlProps = {\n client?: RealtimeControllerClient | undefined;\n workspaceId?: string | undefined;\n codexConnected: boolean;\n disabled?: boolean | undefined;\n disabledReason?: string | null | undefined;\n onStart: (model: SessionRealtimeModel) => Promise<boolean>;\n /** Parent-owned selection (e.g. shared with the mobile “+” voice-model panel). */\n models?: readonly RealtimeModelOption[] | undefined;\n selectedModel?: RealtimeModelOption | undefined;\n onSelectModel?: ((modelId: string) => void) | undefined;\n /**\n * `split` attaches the model chevron at every breakpoint (public default).\n * `split-desktop` hides it below `sm` when the host owns mobile selection (e.g. “+”).\n * Inside a container-responsive Composer.Root, `sm` follows that composer.\n * `none` never attaches a model menu to the bar button.\n */\n modelMenu?: \"split\" | \"split-desktop\" | \"none\" | undefined;\n};\n\ntype NewSessionRealtimeSelection = {\n models: readonly RealtimeModelOption[];\n selectedModel: RealtimeModelOption;\n selectModel: (modelId: string) => void;\n};\n\nexport function NewSessionRealtimeControl(props: NewSessionRealtimeControlProps) {\n if (props.models && props.selectedModel && props.onSelectModel) {\n return (\n <NewSessionRealtimeControlView\n {...props}\n selection={{\n models: props.models,\n selectedModel: props.selectedModel,\n selectModel: props.onSelectModel,\n }}\n />\n );\n }\n return <NewSessionRealtimeControlWithInternalSelection {...props} />;\n}\n\nfunction NewSessionRealtimeControlWithInternalSelection(props: NewSessionRealtimeControlProps) {\n const selection = useRealtimeModelSelection({\n client: props.client,\n workspaceId: props.workspaceId,\n codexConnected: props.codexConnected,\n });\n return <NewSessionRealtimeControlView {...props} selection={selection} />;\n}\n\nfunction NewSessionRealtimeControlView(\n props: NewSessionRealtimeControlProps & { selection: NewSessionRealtimeSelection },\n) {\n const selection = props.selection;\n const audioRef = useRef<HTMLAudioElement>(null);\n const [starting, setStarting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const snapshot = useMemo<SessionRealtimeControllerSnapshot>(\n () =>\n starting\n ? { ...IDLE_REALTIME_SNAPSHOT, status: \"starting\" }\n : error\n ? { ...IDLE_REALTIME_SNAPSHOT, status: \"error\", error }\n : IDLE_REALTIME_SNAPSHOT,\n [error, starting],\n );\n const canStart = selection.selectedModel.available && props.disabled !== true && !starting;\n const onStart = props.onStart;\n const selectedModelId = selection.selectedModel.id;\n const start = useCallback(async () => {\n if (!canStart) return;\n setStarting(true);\n setError(null);\n try {\n const started = await onStart(selectedModelId);\n if (!started) setError(\"The voice session could not be created.\");\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setStarting(false);\n }\n }, [canStart, onStart, selectedModelId]);\n\n return (\n <RealtimeVoiceControl\n snapshot={snapshot}\n canStart={canStart}\n admissionBlocker={selection.selectedModel.unavailableReason ?? props.disabledReason ?? null}\n modelAvailable={selection.selectedModel.available}\n selectionDisabled={starting}\n menuSide=\"bottom\"\n modelMenu={props.modelMenu ?? \"split\"}\n showDiagnostics={false}\n audioRef={audioRef}\n selectedModel={selection.selectedModel}\n models={selection.models}\n onSelectModel={selection.selectModel}\n onStart={start}\n onStop={async () => undefined}\n onRetry={start}\n onRetryAudibleOutput={async () => undefined}\n onSetInputMuted={() => undefined}\n onSetOutputMuted={() => undefined}\n />\n );\n}\n\nexport function RealtimeVoiceControl(props: {\n snapshot: SessionRealtimeControllerSnapshot;\n canStart: boolean;\n admissionBlocker?: string | null | undefined;\n modelAvailable: boolean;\n selectionDisabled?: boolean | undefined;\n /** Prefer `bottom` on home/new-session; `top` for the docked session composer. */\n menuSide?: \"top\" | \"bottom\" | undefined;\n /**\n * `split` = start + model chevron at every breakpoint (public SDK default).\n * `split-desktop` = chevron from `sm` up; below that the host owns selection.\n * Inside a container-responsive Composer.Root, `sm` follows that composer.\n * `none` = start button only.\n */\n modelMenu?: \"split\" | \"split-desktop\" | \"none\" | undefined;\n showDiagnostics?: boolean | undefined;\n /** Extra classes on the in-bar mute cluster (e.g. `max-sm:hidden` when mutes live in “+”). */\n muteControlsClassName?: string | undefined;\n audioRef: RefObject<HTMLAudioElement | null>;\n selectedModel?: RealtimeModelOption | undefined;\n models?: readonly RealtimeModelOption[] | undefined;\n onSelectModel?: ((modelId: string) => void) | undefined;\n onStart: () => Promise<void>;\n onStop: () => Promise<void>;\n onRetry: () => Promise<void>;\n onRetryAudibleOutput: () => Promise<void>;\n onSetInputMuted: (muted: boolean) => void;\n onSetOutputMuted: (muted: boolean) => void;\n}) {\n const reduceMotion = useReducedMotion();\n const selectedModel = props.selectedModel ?? {\n ...CODEX_LIVE_MODEL,\n available: props.modelAvailable,\n unavailableReason: props.modelAvailable ? null : CODEX_LIVE_MODEL.unavailableReason,\n };\n const models = props.models ?? [selectedModel];\n const status = statusContent(\n props.snapshot,\n props.modelAvailable,\n props.canStart,\n props.admissionBlocker ?? null,\n selectedModel.label,\n );\n const modeOwned = props.snapshot.mode?.state === \"active\";\n const retryConnection =\n modeOwned &&\n props.snapshot.status !== \"stopping\" &&\n props.snapshot.status !== \"active\" &&\n props.snapshot.diagnostic?.recoverable === true;\n const audioBlocked = props.snapshot.audibleOutput === \"blocked\" && !props.snapshot.outputMuted;\n const mainDisabled =\n props.snapshot.status === \"stopping\" ||\n props.snapshot.status === \"lost_owner\" ||\n (!modeOwned && !props.canStart) ||\n (props.snapshot.status === \"starting\" && !modeOwned);\n const mainLabel = audioBlocked\n ? \"Resume voice audio\"\n : retryConnection\n ? \"Retry voice connection\"\n : modeOwned\n ? \"End voice conversation\"\n : `Start voice with ${selectedModel.label}`;\n const runMainAction = audioBlocked\n ? props.onRetryAudibleOutput\n : retryConnection\n ? props.onRetry\n : modeOwned\n ? props.onStop\n : props.onStart;\n const diagnosticsVisible = props.showDiagnostics ?? false;\n const modelMenu = props.modelMenu ?? \"split\";\n const showAttachedModelMenu = modelMenu === \"split\" || modelMenu === \"split-desktop\";\n const desktopOnlyModelMenu = modelMenu === \"split-desktop\";\n const [pickerOpen, setPickerOpen] = useState(false);\n const [pickerProvider, setPickerProvider] = useState<RealtimeModelProvider | null>(\n selectedModel.provider,\n );\n const [pickerDirection, setPickerDirection] = useState<1 | -1>(1);\n\n useEffect(() => {\n if (!pickerOpen) setPickerProvider(selectedModel.provider);\n }, [pickerOpen, selectedModel.provider]);\n\n return (\n <div\n role=\"group\"\n aria-label=\"Realtime voice\"\n data-picker-side={props.menuSide ?? \"top\"}\n data-model-menu={modelMenu}\n className=\"og-realtime-control inline-flex shrink-0 items-center\"\n >\n <audio ref={props.audioRef} autoPlay className=\"hidden\" aria-hidden=\"true\" />\n <RealtimeComposerGlow phase={status.phase} reduceMotion={reduceMotion === true} />\n <AnimatePresence initial={false}>\n {modeOwned ? (\n <motion.div\n key=\"realtime-mute-controls\"\n data-testid=\"realtime-mute-controls\"\n // After dictate collapses and the model slides left, bloom mutes\n // out from the primary voice control. Exit is immediate (no delay).\n initial={reduceMotion ? false : { opacity: 0, width: 0 }}\n animate={{\n opacity: 1,\n width: \"auto\",\n transition: reduceMotion\n ? { duration: 0 }\n : { delay: 0.3, duration: 0.48, ease: [0.22, 1, 0.36, 1] },\n }}\n {...(reduceMotion\n ? {}\n : {\n exit: {\n opacity: 0,\n width: 0,\n transition: { duration: 0.28, ease: [0.4, 0, 1, 1] },\n },\n })}\n className={cn(\n \"inline-flex shrink-0 items-center overflow-hidden\",\n props.muteControlsClassName,\n )}\n >\n <motion.div\n className=\"inline-flex items-center gap-0.5 pr-1\"\n initial={reduceMotion ? false : { x: 18, opacity: 0 }}\n animate={{\n x: 0,\n opacity: 1,\n transition: reduceMotion\n ? { duration: 0 }\n : {\n delay: 0.32,\n type: \"spring\",\n stiffness: 320,\n damping: 30,\n mass: 0.8,\n },\n }}\n {...(reduceMotion\n ? {}\n : {\n exit: {\n x: 14,\n opacity: 0,\n transition: { duration: 0.22, ease: [0.4, 0, 1, 1] },\n },\n })}\n >\n <RealtimeMuteButton\n muted={props.snapshot.inputMuted}\n kind=\"microphone\"\n reduceMotion={reduceMotion === true}\n enterDelay={reduceMotion ? 0 : 0.34}\n onToggle={() => props.onSetInputMuted(!props.snapshot.inputMuted)}\n />\n <RealtimeMuteButton\n muted={props.snapshot.outputMuted}\n kind=\"output\"\n reduceMotion={reduceMotion === true}\n enterDelay={reduceMotion ? 0 : 0.4}\n onToggle={() => props.onSetOutputMuted(!props.snapshot.outputMuted)}\n />\n </motion.div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n <div className=\"inline-flex shrink-0 items-center\">\n <motion.button\n type=\"button\"\n data-testid=\"realtime-primary-action\"\n data-phase={status.phase}\n aria-label={mainLabel}\n aria-pressed={modeOwned}\n title={mainLabel}\n disabled={mainDisabled}\n {...(reduceMotion ? {} : { whileTap: { scale: 0.92 } })}\n transition={{ type: \"spring\", stiffness: 520, damping: 30 }}\n onClick={() => void runMainAction().catch(() => undefined)}\n className={cn(\n // Match transcription mic: ghost icon when idle; filled only when live.\n // Public contract: coarse pointers keep a 44px target; split menu uses\n // left-only rounding at `sm+` where the chevron attaches.\n \"og-realtime-primary relative inline-flex size-8 items-center justify-center outline-hidden\",\n \"rounded-og-md transition-[background-color,border-color,color,box-shadow] duration-200 ease-og-out\",\n \"focus-visible:z-10 focus-visible:ring-2 focus-visible:ring-og-accent/45\",\n \"disabled:cursor-not-allowed disabled:opacity-45 pointer-coarse:size-11\",\n showAttachedModelMenu &&\n (desktopOnlyModelMenu\n ? \"sm:rounded-l-og-md sm:rounded-r-none\"\n : \"rounded-l-og-md rounded-r-none\"),\n voiceButtonTone(status.phase),\n )}\n >\n <RealtimeActionGlyph\n phase={status.phase}\n audioBlocked={audioBlocked}\n reduceMotion={reduceMotion === true}\n />\n </motion.button>\n\n {showAttachedModelMenu ? (\n <DropdownMenu open={pickerOpen} onOpenChange={setPickerOpen}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Choose voice model and options\"\n title={`Voice model: ${selectedModel.label}`}\n disabled={props.selectionDisabled}\n className={cn(\n // Keep the split trigger compact on desktop while preserving a\n // full 44px mobile target independent of pointer-media support.\n \"og-realtime-model-trigger inline-flex h-11 w-11 items-center justify-center rounded-r-og-md outline-hidden sm:h-8 sm:w-6\",\n \"transition-[background-color,border-color,color] duration-200 ease-og-out\",\n \"focus-visible:z-10 focus-visible:ring-2 focus-visible:ring-og-accent/45\",\n desktopOnlyModelMenu && \"hidden sm:inline-flex\",\n voiceChevronTone(status.phase),\n )}\n >\n <ChevronDownIcon className=\"size-3\" aria-hidden />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n side={props.menuSide ?? \"top\"}\n align=\"end\"\n sideOffset={8}\n collisionPadding={12}\n className=\"og-realtime-menu flex w-72 max-h-[min(20rem,var(--radix-dropdown-menu-content-available-height))] flex-col overflow-hidden rounded-xl border-border bg-surface p-1.5 shadow-xl\"\n onCloseAutoFocus={(event) => event.preventDefault()}\n >\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain\">\n <RealtimeModelPickerMenu\n models={models}\n selectedModel={selectedModel}\n provider={pickerProvider}\n direction={pickerDirection}\n disabled={\n props.selectionDisabled === true || props.snapshot.mode?.state === \"active\"\n }\n onProviderChange={(provider, direction) => {\n setPickerDirection(direction);\n setPickerProvider(provider);\n }}\n onSelect={(modelId) => {\n props.onSelectModel?.(modelId);\n setPickerOpen(false);\n }}\n />\n </div>\n\n {status.phase !== \"idle\" ? (\n <>\n <DropdownMenuSeparator className=\"mx-1 bg-og-border\" />\n <div className=\"px-2.5 py-2\" role=\"status\" aria-live=\"polite\">\n <div className=\"flex items-center gap-2 text-og-sm font-medium text-og-fg\">\n <RealtimeStatusDot\n phase={status.phase}\n reduceMotion={reduceMotion === true}\n />\n {status.label}\n </div>\n <p className=\"mt-1 text-og-xs leading-5 text-og-fg-subtle\">{status.detail}</p>\n </div>\n </>\n ) : null}\n\n {audioBlocked ? (\n <DropdownMenuItem\n className=\"rounded-og-md\"\n onSelect={() => void props.onRetryAudibleOutput().catch(() => undefined)}\n >\n <Volume2Icon />\n Resume audio\n </DropdownMenuItem>\n ) : null}\n {retryConnection ? (\n <DropdownMenuItem\n className=\"rounded-og-md\"\n onSelect={() => void props.onRetry().catch(() => undefined)}\n >\n <RotateCcwIcon />\n Retry connection\n </DropdownMenuItem>\n ) : null}\n {modeOwned && props.snapshot.status !== \"lost_owner\" ? (\n <DropdownMenuItem\n variant=\"destructive\"\n className=\"rounded-og-md\"\n disabled={props.snapshot.status === \"stopping\"}\n onSelect={() => void props.onStop().catch(() => undefined)}\n >\n <SquareIcon />\n End voice conversation\n </DropdownMenuItem>\n ) : null}\n\n {diagnosticsVisible ? <RealtimeDiagnosticsMenu snapshot={props.snapshot} /> : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {status.label}. {status.detail}\n </span>\n {props.snapshot.error ? (\n <span className=\"sr-only\" role=\"alert\">\n {props.snapshot.error}\n </span>\n ) : null}\n </div>\n );\n}\n\n/** Drill-in body for the mobile composer “+” menu — same catalog as the desktop chevron. */\nexport function RealtimeVoiceModelPanel(props: {\n models: readonly RealtimeModelOption[];\n selectedModel: RealtimeModelOption;\n disabled?: boolean | undefined;\n leading?: ReactNode | undefined;\n onSelect: (modelId: SessionRealtimeModel) => void;\n}) {\n const [provider, setProvider] = useState<RealtimeModelProvider | null>(null);\n const [direction, setDirection] = useState<1 | -1>(1);\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\" data-testid=\"realtime-voice-model-panel\">\n <div className=\"flex shrink-0 items-start gap-1 px-2 pt-1 pb-1.5\">\n {props.leading}\n <div className=\"min-w-0\">\n <div className=\"text-og-menu font-medium text-og-fg\">Voice model</div>\n <p className=\"mt-0.5 text-og-control text-og-fg-subtle\">\n Used when you start a voice conversation.\n </p>\n </div>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain px-1.5 pb-1.5\">\n <RealtimeModelPickerMenu\n models={props.models}\n selectedModel={props.selectedModel}\n provider={provider}\n direction={direction}\n disabled={props.disabled === true}\n onProviderChange={(next, nextDirection) => {\n setDirection(nextDirection);\n setProvider(next);\n }}\n onSelect={props.onSelect}\n />\n </div>\n </div>\n );\n}\n\nfunction RealtimeMuteButton(props: {\n muted: boolean;\n kind: \"microphone\" | \"output\";\n reduceMotion: boolean;\n enterDelay?: number | undefined;\n onToggle(): void;\n}) {\n const microphone = props.kind === \"microphone\";\n const label = microphone\n ? props.muted\n ? \"Unmute microphone\"\n : \"Mute microphone\"\n : props.muted\n ? \"Unmute voice audio\"\n : \"Mute voice audio\";\n const Icon = microphone\n ? props.muted\n ? MicOffIcon\n : MicIcon\n : props.muted\n ? VolumeXIcon\n : Volume2Icon;\n\n return (\n <motion.button\n type=\"button\"\n aria-label={label}\n aria-pressed={props.muted}\n title={label}\n initial={props.reduceMotion ? false : { scale: 0.72, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{\n delay: props.enterDelay ?? 0,\n type: \"spring\",\n stiffness: 420,\n damping: 26,\n mass: 0.7,\n }}\n {...(props.reduceMotion ? {} : { whileTap: { scale: 0.92 } })}\n onClick={props.onToggle}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-og-md outline-hidden\",\n \"transition-[background-color,border-color,color] duration-150 ease-og-out\",\n \"focus-visible:ring-2 focus-visible:ring-og-accent/45 pointer-coarse:size-11\",\n props.muted\n ? \"border border-og-accent/35 bg-og-accent-soft text-og-accent\"\n : \"text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg\",\n )}\n >\n <Icon className=\"size-3.5\" aria-hidden />\n </motion.button>\n );\n}\n\nexport function RealtimeModelPickerMenu(props: {\n models: readonly RealtimeModelOption[];\n selectedModel: RealtimeModelOption;\n provider: RealtimeModelProvider | null;\n direction: 1 | -1;\n disabled: boolean;\n onProviderChange: (provider: RealtimeModelProvider | null, direction: 1 | -1) => void;\n onSelect: (modelId: SessionRealtimeModel) => void;\n}) {\n const providers = REALTIME_MODEL_PROVIDERS.filter((provider) =>\n props.models.some((model) => model.provider === provider),\n );\n const pageKey = props.provider ? `voice-models:${props.provider}` : \"voice-providers\";\n const body = props.provider ? (\n <div data-testid=\"realtime-model-picker-models\">\n <PickerBackHeader\n label={props.provider}\n icon={\n <BillingClassMark\n billingClass={REALTIME_PROVIDER_META[props.provider].billingClass}\n aria-label=\"\"\n />\n }\n onBack={() => props.onProviderChange(null, -1)}\n />\n <div className=\"flex flex-col gap-0.5\">\n {props.models\n .filter((model) => model.provider === props.provider)\n .map((model) => {\n const selected = model.id === props.selectedModel.id;\n return (\n <PickerNavRow\n key={model.id}\n label={model.label}\n hint={\n model.unavailableReason ??\n (model.recommended ? `Recommended · ${model.description}` : model.description)\n }\n disabled={props.disabled || !model.available}\n title={model.unavailableReason ?? model.description}\n active={selected}\n showChevron={false}\n trailing={selected ? <CheckIcon className=\"size-3.5\" aria-hidden /> : undefined}\n testId={`realtime-model-choice-${model.id}`}\n onClick={() => props.onSelect(model.id)}\n />\n );\n })}\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col gap-0.5\" data-testid=\"realtime-model-picker-providers\">\n {providers.map((provider) => {\n const meta = REALTIME_PROVIDER_META[provider];\n return (\n <PickerNavRow\n key={provider}\n label={provider}\n hint={meta.hint}\n icon={<BillingClassMark billingClass={meta.billingClass} aria-label=\"\" />}\n active={props.selectedModel.provider === provider}\n testId={`realtime-model-provider-${meta.billingClass}`}\n onClick={() => props.onProviderChange(provider, 1)}\n />\n );\n })}\n </div>\n );\n\n return (\n <div className=\"relative overflow-hidden\" data-testid=\"realtime-model-picker-menu\">\n <PickerAnimatedPage pageKey={pageKey} direction={props.direction}>\n {body}\n </PickerAnimatedPage>\n </div>\n );\n}\n\nfunction RealtimeDiagnosticsMenu({ snapshot }: { snapshot: SessionRealtimeControllerSnapshot }) {\n const bridge = snapshot.bridge;\n const rows = [\n [\"controller\", snapshot.status],\n [\"microphone\", snapshot.microphone],\n [\"microphone muted\", String(snapshot.inputMuted)],\n [\"audio\", snapshot.audibleOutput],\n [\"audio muted\", String(snapshot.outputMuted)],\n [\"generation\", String(snapshot.connectionGeneration)],\n [\"reconnect attempt\", String(snapshot.reconnectAttempt)],\n [\"mode\", snapshot.mode?.state ?? \"none\"],\n [\"mode version\", snapshot.mode ? String(snapshot.mode.version) : \"—\"],\n [\"connection epoch\", snapshot.mode ? String(snapshot.mode.connectionEpoch) : \"—\"],\n [\"provider started\", bridge ? String(bridge.providerStarted) : \"false\"],\n [\"provider speaking\", bridge ? String(bridge.speaking) : \"false\"],\n [\"delegation\", bridge?.activeDelegationId ? \"active\" : \"none\"],\n [\"pending durable events\", bridge ? String(bridge.pendingInbound) : \"0\"],\n [\"pending bytes\", bridge ? String(bridge.pendingInboundBytes) : \"0\"],\n [\"client ack\", bridge?.clientAckThroughSequence?.toString() ?? \"—\"],\n [\"ignored provider events\", bridge ? String(bridge.ignoredEventCount) : \"0\"],\n [\"last ignored event\", bridge?.lastIgnoredEventType ?? \"none\"],\n [\"bridge error\", bridge?.lastError ?? \"none\"],\n [\"diagnostic\", snapshot.diagnostic?.kind ?? \"none\"],\n ] as const;\n\n return (\n <>\n <DropdownMenuSeparator className=\"mx-1 bg-og-border\" />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"rounded-og-md text-og-fg-muted\">\n Realtime diagnostics\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"max-h-80 w-72 overflow-y-auto rounded-og-lg border-og-border bg-og-surface-1 p-1.5 text-og-fg shadow-og-lg\">\n {rows.map(([label, value]) => (\n <DropdownMenuItem\n key={label}\n disabled\n className=\"grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)] gap-3 rounded-og-md font-mono text-[11px] opacity-100\"\n >\n <span className=\"truncate text-og-fg-subtle\">{label}</span>\n <span className=\"truncate text-right text-og-fg\">{value}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n );\n}\n\ntype RealtimeVisualPhase =\n | \"idle\"\n | \"connecting\"\n | \"listening\"\n | \"speaking\"\n | \"reconnecting\"\n | \"blocked\"\n | \"unavailable\"\n | \"error\"\n | \"elsewhere\"\n | \"stopping\";\n\nfunction statusContent(\n snapshot: SessionRealtimeControllerSnapshot,\n modelAvailable: boolean,\n canStart: boolean,\n admissionBlocker: string | null,\n modelLabel: string,\n): { phase: RealtimeVisualPhase; label: string; detail: string } {\n if (snapshot.audibleOutput === \"blocked\" && !snapshot.outputMuted) {\n return {\n phase: \"blocked\",\n label: \"Audio output blocked\",\n detail: \"Resume audio to hear the existing voice connection.\",\n };\n }\n switch (snapshot.status) {\n case \"starting\":\n return {\n phase: \"connecting\",\n label: \"Connecting…\",\n detail: \"Preparing your microphone and live voice.\",\n };\n case \"active\":\n return snapshot.bridge?.speaking\n ? {\n phase: \"speaking\",\n label: \"Speaking\",\n detail: \"Interrupt naturally whenever you want.\",\n }\n : {\n phase: \"listening\",\n label: \"Listening\",\n detail: \"Voice and typed messages share this session.\",\n };\n case \"stopping\":\n return {\n phase: \"stopping\",\n label: \"Ending voice…\",\n detail: \"Saving the remaining conversation context.\",\n };\n case \"recovering\":\n return {\n phase: \"reconnecting\",\n label: \"Reconnecting…\",\n detail: snapshot.error ?? \"Keeping this voice conversation connected.\",\n };\n case \"lost_owner\":\n return {\n phase: \"elsewhere\",\n label: \"Voice active elsewhere\",\n detail: \"Return to the browser that started it, or wait for that connection to expire.\",\n };\n case \"error\":\n return {\n phase: \"error\",\n label: \"Voice unavailable\",\n detail: snapshot.error ?? \"The connection could not be started.\",\n };\n case \"idle\":\n if (!modelAvailable) {\n return {\n phase: \"unavailable\",\n label: \"Voice model unavailable\",\n detail: admissionBlocker ?? \"Choose another voice model.\",\n };\n }\n if (!canStart && admissionBlocker) {\n return {\n phase: \"unavailable\",\n label: \"Voice unavailable\",\n detail: admissionBlocker,\n };\n }\n return {\n phase: \"idle\",\n label: \"Start voice\",\n detail: `Talk live with ${modelLabel}.`,\n };\n }\n}\n\nfunction RealtimeComposerGlow(props: { phase: RealtimeVisualPhase; reduceMotion: boolean }) {\n const visible = [\n \"connecting\",\n \"listening\",\n \"speaking\",\n \"reconnecting\",\n \"blocked\",\n \"error\",\n \"stopping\",\n ].includes(props.phase);\n return (\n <AnimatePresence initial={false}>\n {visible ? (\n <motion.span\n aria-hidden\n key={props.phase}\n initial={{ opacity: 0 }}\n animate={\n props.reduceMotion\n ? { opacity: 0.48 }\n : props.phase === \"speaking\"\n ? { opacity: [0.42, 0.82, 0.52] }\n : props.phase === \"listening\"\n ? { opacity: [0.34, 0.62, 0.42] }\n : { opacity: [0.28, 0.58, 0.28] }\n }\n exit={{ opacity: 0 }}\n transition={\n props.reduceMotion\n ? { duration: 0.12 }\n : {\n duration: props.phase === \"speaking\" ? 1.15 : 2.1,\n ease: \"easeInOut\",\n repeat: Number.POSITIVE_INFINITY,\n }\n }\n className={cn(\n \"pointer-events-none absolute -inset-px z-[1] rounded-og-lg ring-1 ring-inset shadow-og-glow\",\n props.phase === \"speaking\"\n ? \"ring-og-status-running/50\"\n : props.phase === \"blocked\" || props.phase === \"error\"\n ? \"ring-og-status-waiting/45\"\n : \"ring-og-accent/45\",\n )}\n />\n ) : null}\n </AnimatePresence>\n );\n}\n\nfunction RealtimeActionGlyph(props: {\n phase: RealtimeVisualPhase;\n audioBlocked: boolean;\n reduceMotion: boolean;\n}) {\n if ([\"connecting\", \"reconnecting\", \"stopping\"].includes(props.phase)) {\n return <LoaderCircleIcon className=\"size-3.5 animate-og-spin\" aria-hidden />;\n }\n if (props.phase === \"blocked\") {\n return props.audioBlocked ? (\n <Volume2Icon className=\"size-3.5\" aria-hidden />\n ) : (\n <CircleAlertIcon className=\"size-3.5\" aria-hidden />\n );\n }\n if (props.phase === \"error\" || props.phase === \"elsewhere\" || props.phase === \"unavailable\") {\n return <CircleAlertIcon className=\"size-3.5\" aria-hidden />;\n }\n if (props.phase === \"listening\" || props.phase === \"speaking\") {\n return (\n <span className=\"relative inline-flex size-4 items-center justify-center\">\n {!props.reduceMotion ? (\n <motion.span\n aria-hidden\n className=\"absolute inset-0 rounded-full border border-current\"\n animate={{ opacity: [0.65, 0], scale: [0.65, 1.45] }}\n transition={{\n duration: props.phase === \"speaking\" ? 0.9 : 1.5,\n ease: \"easeOut\",\n repeat: Number.POSITIVE_INFINITY,\n }}\n />\n ) : null}\n <SquareIcon className=\"relative size-2.5 fill-current\" aria-hidden />\n </span>\n );\n }\n return <AudioLinesIcon className=\"size-4\" aria-hidden />;\n}\n\nfunction RealtimeStatusDot(props: { phase: RealtimeVisualPhase; reduceMotion: boolean }) {\n const live = props.phase === \"listening\" || props.phase === \"speaking\";\n return (\n <span className=\"relative inline-flex size-2 shrink-0\" aria-hidden>\n {live && !props.reduceMotion ? (\n <motion.span\n className=\"absolute inset-0 rounded-full bg-og-status-running\"\n animate={{ opacity: [0.45, 0], scale: [1, 2.2] }}\n transition={{\n duration: 1.4,\n ease: \"easeOut\",\n repeat: Number.POSITIVE_INFINITY,\n }}\n />\n ) : null}\n <span\n className={cn(\n \"relative size-2 rounded-full\",\n live\n ? \"bg-og-status-running\"\n : props.phase === \"blocked\" || props.phase === \"error\"\n ? \"bg-og-status-waiting\"\n : props.phase === \"elsewhere\" || props.phase === \"unavailable\"\n ? \"bg-og-fg-subtle\"\n : \"bg-og-accent\",\n )}\n />\n </span>\n );\n}\n\nfunction voiceButtonTone(phase: RealtimeVisualPhase): string {\n if (phase === \"listening\" || phase === \"speaking\") {\n return \"border border-og-accent/45 bg-og-accent text-og-accent-fg shadow-og-sm hover:bg-og-accent-strong\";\n }\n if (phase === \"blocked\" || phase === \"error\") {\n return \"border border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting hover:bg-og-status-waiting/15\";\n }\n if (phase === \"connecting\" || phase === \"reconnecting\" || phase === \"stopping\") {\n return \"border border-og-accent/35 bg-og-accent-soft text-og-accent\";\n }\n // Idle: same ghost treatment as the composer transcription mic — no box.\n return \"text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg\";\n}\n\nfunction voiceChevronTone(phase: RealtimeVisualPhase): string {\n if (phase === \"listening\" || phase === \"speaking\") {\n return \"border border-l-0 border-og-accent/45 bg-og-accent text-og-accent-fg hover:bg-og-accent-strong\";\n }\n if (phase === \"blocked\" || phase === \"error\") {\n return \"border border-l-0 border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting hover:bg-og-status-waiting/15\";\n }\n if (phase === \"connecting\" || phase === \"reconnecting\" || phase === \"stopping\") {\n return \"border border-l-0 border-og-accent/35 bg-og-accent-soft text-og-accent\";\n }\n return \"text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg\";\n}\n\nfunction toRealtimeModelOption(model: WorkspaceRealtimeModelCatalogItem): RealtimeModelOption {\n return { ...model };\n}\n\nfunction readRealtimeModelPreference(workspaceId: string): SessionRealtimeModel | null {\n if (typeof localStorage === \"undefined\") return null;\n try {\n const value = localStorage.getItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`);\n return isRealtimeModel(value) ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction writeRealtimeModelPreference(workspaceId: string, model: SessionRealtimeModel): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`, model);\n } catch {\n // Voice selection still works when browser storage is unavailable.\n }\n}\n\nfunction isRealtimeModel(value: string | null): value is SessionRealtimeModel {\n return (\n value === \"gpt-live-1-boulder-alpha\" ||\n value === \"opengeni-gateway/openai/gpt-realtime-2.1\" ||\n value === \"opengeni-gateway/openai/gpt-realtime-mini\" ||\n value === \"opengeni-gateway/xai/grok-voice-think-fast-2.0\" ||\n value === \"supergrok/grok-voice-think-fast-2.0\" ||\n value === \"workspace-gateway/openai/gpt-realtime-2.1\" ||\n value === \"workspace-gateway/openai/gpt-realtime-mini\" ||\n value === \"workspace-gateway/xai/grok-voice-think-fast-2.0\"\n );\n}\n\n/** @deprecated Use the provider-neutral realtime names. */\nexport const useSessionCodexRealtime = useSessionRealtime;\n/** @deprecated Use the provider-neutral realtime names. */\nexport const useWorkspaceRealtimeModelSelection = useRealtimeModelSelection;\n/** @deprecated Use the provider-neutral realtime names. */\nexport const SessionCodexRealtimeControl = SessionRealtimeControl;\n/** @deprecated Use the provider-neutral realtime names. */\nexport const CodexRealtimeControl = RealtimeVoiceControl;\n","\"use client\";\n\nimport { ChevronRightIcon } from \"lucide-react\";\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\";\nimport { createContext, useContext, type ComponentProps, type Ref } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { usePortalTokenSource, usePortalTokenStyle } from \"../lib/use-portal-token-style\";\n\ntype DropdownMenuSourceContextValue = {\n source: HTMLElement | null;\n ref: (node: HTMLElement | null) => void;\n};\n\nconst DropdownMenuSourceContext = createContext<DropdownMenuSourceContextValue | null>(null);\n\nfunction assignRef<T>(ref: Ref<T> | undefined, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\nfunction DropdownMenu(props: ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n const source = usePortalTokenSource<HTMLElement>();\n return (\n <DropdownMenuSourceContext.Provider value={source}>\n <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n </DropdownMenuSourceContext.Provider>\n );\n}\n\nfunction DropdownMenuTrigger({\n ref,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n const sourceRef = useContext(DropdownMenuSourceContext);\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n ref={(node) => {\n sourceRef?.ref(node);\n assignRef(ref, node);\n }}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n style,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n const source = useContext(DropdownMenuSourceContext);\n const portalStyle = usePortalTokenStyle(source?.source ?? null);\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"og-root z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className,\n )}\n style={{ ...portalStyle, ...style }}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-og-menu outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub(props: ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-og-menu outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n style,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n const source = useContext(DropdownMenuSourceContext);\n const portalStyle = usePortalTokenStyle(source?.source ?? null);\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"og-root z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className,\n )}\n style={{ ...portalStyle, ...style }}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n"],"mappings":"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","names":["jsx","jsxs"]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import {
3
+ SandboxFiles
4
+ } from "./chunk-EGVHJKGJ.js";
5
+ import "./chunk-LSW2OJVV.js";
6
+ import "./chunk-B27E3V37.js";
7
+ import "./chunk-R5SBNG7S.js";
8
+ import "./chunk-YSRBFJMQ.js";
9
+ import "./chunk-OYQQJL3J.js";
10
+ import "./chunk-PMV53IMM.js";
11
+ import "./chunk-XEA5BCMA.js";
12
+ import "./chunk-QHUE7E4N.js";
13
+ import "./chunk-CM7LVUKC.js";
14
+ import "./chunk-G76LSA76.js";
15
+ import "./chunk-QV3DJVRZ.js";
16
+ import "./chunk-5I4VRWBB.js";
17
+ import "./chunk-TXS65BB2.js";
18
+ export {
19
+ SandboxFiles
20
+ };
21
+ //# sourceMappingURL=sandbox-files-O27IPOZW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * User-facing names for where a session's commands run, shared by the web
3
+ * sandbox switcher and every timeline that labels command rows ("on Cloud
4
+ * sandbox · …"). No DOM, no React.
5
+ */
6
+ import type { SandboxBackend } from "@opengeni/sdk";
7
+ import type { MachineView } from "./types/machines.js";
8
+ export declare const CLOUD_SANDBOX_LABEL = "Cloud sandbox";
9
+ export declare const NO_SANDBOX_LABEL = "No sandbox";
10
+ export declare const LOCAL_SANDBOX_LABEL = "Local sandbox";
11
+ /**
12
+ * User-facing name for a session's own managed box. Hosting vendors (Modal,
13
+ * Daytona, ...) are deployment detail, not something a user chose, so hosted
14
+ * providers read as the neutral "Cloud sandbox" and the local-dev Docker box as
15
+ * "Local sandbox". The local backend runs directly on the host, so it keeps the
16
+ * honest "this computer" instead of implying isolation. Connected Machines keep
17
+ * their own names.
18
+ */
19
+ export declare function sessionSandboxLabel(backend: SandboxBackend | string): string;
20
+ /** Display name for a fleet row: the session's own box never shows its vendor. */
21
+ export declare function machineDisplayName(machine: Pick<MachineView, "isSessionGroup" | "kind" | "name">): string;
22
+ /**
23
+ * Who can use a Connected Machine, in the words of the Connect dialog's
24
+ * "Who can use it?" choice: a personal machine is "Only me" (its owner, in any
25
+ * workspace they can access), a workspace machine is shared with that
26
+ * workspace's members, and an organization machine with the whole organization.
27
+ */
28
+ export declare function machineScopeLabel(scope: MachineView["scope"]): string;
29
+ /** The compute label a session timeline shows: the active machine, else the cloud box. */
30
+ export declare function sessionComputeLabel(machines: readonly Pick<MachineView, "active" | "isSessionGroup" | "kind" | "name">[]): string;
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import {
3
+ CLOUD_SANDBOX_LABEL,
4
+ LOCAL_SANDBOX_LABEL,
5
+ NO_SANDBOX_LABEL,
6
+ machineDisplayName,
7
+ machineScopeLabel,
8
+ sessionComputeLabel,
9
+ sessionSandboxLabel
10
+ } from "./chunk-CSX5FFKZ.js";
11
+ export {
12
+ CLOUD_SANDBOX_LABEL,
13
+ LOCAL_SANDBOX_LABEL,
14
+ NO_SANDBOX_LABEL,
15
+ machineDisplayName,
16
+ machineScopeLabel,
17
+ sessionComputeLabel,
18
+ sessionSandboxLabel
19
+ };
20
+ //# sourceMappingURL=sandbox-label-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1 @@
1
+ export { CLASSIC_SCROLLBARS_ATTRIBUTE, markClassicScrollbars } from "./lib/scrollbars.js";
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ import {
3
+ CLASSIC_SCROLLBARS_ATTRIBUTE,
4
+ markClassicScrollbars
5
+ } from "./chunk-MK2TQO4Y.js";
6
+ export {
7
+ CLASSIC_SCROLLBARS_ATTRIBUTE,
8
+ markClassicScrollbars
9
+ };
10
+ //# sourceMappingURL=scrollbars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,14 @@
1
+ import type { SecretReferenceLike } from "./secrets-ui.js";
2
+ export type SecretReferenceLabel = {
3
+ /** The part that truncates: the item name (or "Secret" for an ID reference). */
4
+ primary: string;
5
+ /** The field, one-time code and previous markers; never truncated. */
6
+ suffix: string;
7
+ };
8
+ /**
9
+ * "GitHub · password": the last path segments (the vault, when named, stays in
10
+ * the tooltip); an ID reference reads "Secret · field"; `/otp` adds
11
+ * "· one-time code" and `#previous` adds "(previous)".
12
+ */
13
+ export declare function secretReferenceLabel(reference: SecretReferenceLike): SecretReferenceLabel;
14
+ export declare function secretReferenceLabelText(reference: SecretReferenceLike): string;
@@ -0,0 +1,57 @@
1
+ import type { GeneratePasswordSpec } from "@opengeni/sdk";
2
+ import { type ReactNode } from "react";
3
+ /**
4
+ * Secret-reference token shapes (structural mirror of `@opengeni/contracts`
5
+ * `SecretTextToken`). @opengeni/react may not depend on the contracts
6
+ * runtime, so hosts inject the one tokenizer and generator through
7
+ * `SecretsUiProvider`.
8
+ */
9
+ export type SecretReferenceTargetLike = {
10
+ form: "id";
11
+ itemId: string;
12
+ field: string | null;
13
+ } | {
14
+ form: "path";
15
+ segments: readonly string[];
16
+ };
17
+ export type SecretReferenceLike = {
18
+ kind: "secret" | "secretfile";
19
+ raw: string;
20
+ start: number;
21
+ end: number;
22
+ target: SecretReferenceTargetLike;
23
+ otp: boolean;
24
+ previous: boolean;
25
+ };
26
+ export type SecretTextTokenLike = {
27
+ type: "text";
28
+ value: string;
29
+ } | {
30
+ type: "reference";
31
+ reference: SecretReferenceLike;
32
+ } | {
33
+ type: "invalid";
34
+ raw: string;
35
+ start: number;
36
+ end: number;
37
+ reason: string;
38
+ };
39
+ export type PasswordStrengthLike = {
40
+ bits: number;
41
+ label: "weak" | "fair" | "strong" | "very_strong";
42
+ };
43
+ export type SecretsUi = {
44
+ /** Split text into plain text, references and invalid reference-looking text. */
45
+ tokenize: (text: string) => SecretTextTokenLike[];
46
+ /** Client-side password generator (same implementation as the server). */
47
+ generatePassword: (spec?: GeneratePasswordSpec) => string;
48
+ passwordStrength?: ((password: string) => PasswordStrengthLike) | undefined;
49
+ /** Optional link target for a reference chip (for example the item page). */
50
+ hrefForReference?: ((reference: SecretReferenceLike) => string | null) | undefined;
51
+ };
52
+ export declare function SecretsUiProvider({ value, children, }: {
53
+ value: SecretsUi | null;
54
+ children?: ReactNode;
55
+ }): import("react").JSX.Element;
56
+ /** Null without a provider: chips render as plain text, Generate is server-side. */
57
+ export declare function useSecretsUi(): SecretsUi | null;
@@ -0,0 +1,10 @@
1
+ import type { LineageNode, SessionGoal } from "@opengeni/sdk";
2
+ export type SessionAgentsSignal = {
3
+ count: number;
4
+ detail: string;
5
+ tone: "running" | "waiting" | "neutral";
6
+ };
7
+ /** The agents chip for a session's spawned workers, or undefined without any. */
8
+ export declare function sessionAgentsSignal(agents: readonly Pick<LineageNode, "session">[]): SessionAgentsSignal | undefined;
9
+ /** One human word for a goal's state, as the web goal pill reads. */
10
+ export declare function sessionGoalStateLabel(goal: Pick<SessionGoal, "status">): string;
@@ -0,0 +1,25 @@
1
+ "use client";
2
+
3
+ // src/session-agents-model.ts
4
+ function sessionAgentsSignal(agents) {
5
+ if (agents.length === 0) return void 0;
6
+ const running = agents.filter(
7
+ (node) => node.session.status === "running" && node.session.effectiveControl.state === "active"
8
+ ).length;
9
+ const paused = agents.filter((node) => node.session.effectiveControl.state === "paused").length;
10
+ return {
11
+ count: agents.length,
12
+ detail: running > 0 ? `${running} running` : paused > 0 ? `${paused} paused` : "Idle",
13
+ tone: running > 0 ? "running" : paused > 0 ? "waiting" : "neutral"
14
+ };
15
+ }
16
+ function sessionGoalStateLabel(goal) {
17
+ if (goal.status === "completed") return "Completed";
18
+ if (goal.status === "paused") return "Paused";
19
+ return "Active";
20
+ }
21
+ export {
22
+ sessionAgentsSignal,
23
+ sessionGoalStateLabel
24
+ };
25
+ //# sourceMappingURL=session-agents-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/session-agents-model.ts"],"sourcesContent":["import type { LineageNode, SessionGoal } from \"@opengeni/sdk\";\n\n/* Renderer-neutral session chrome signals shared by the web dock and native\n apps: the sub-agents chip and the goal chip. */\n\nexport type SessionAgentsSignal = {\n count: number;\n detail: string;\n tone: \"running\" | \"waiting\" | \"neutral\";\n};\n\n/** The agents chip for a session's spawned workers, or undefined without any. */\nexport function sessionAgentsSignal(\n agents: readonly Pick<LineageNode, \"session\">[],\n): SessionAgentsSignal | undefined {\n if (agents.length === 0) return undefined;\n const running = agents.filter(\n (node) => node.session.status === \"running\" && node.session.effectiveControl.state === \"active\",\n ).length;\n const paused = agents.filter((node) => node.session.effectiveControl.state === \"paused\").length;\n return {\n count: agents.length,\n detail: running > 0 ? `${running} running` : paused > 0 ? `${paused} paused` : \"Idle\",\n tone: running > 0 ? \"running\" : paused > 0 ? \"waiting\" : \"neutral\",\n };\n}\n\n/** One human word for a goal's state, as the web goal pill reads. */\nexport function sessionGoalStateLabel(goal: Pick<SessionGoal, \"status\">): string {\n if (goal.status === \"completed\") return \"Completed\";\n if (goal.status === \"paused\") return \"Paused\";\n return \"Active\";\n}\n"],"mappings":";;;AAYO,SAAS,oBACd,QACiC;AACjC,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,UAAU,OAAO;AAAA,IACrB,CAAC,SAAS,KAAK,QAAQ,WAAW,aAAa,KAAK,QAAQ,iBAAiB,UAAU;AAAA,EACzF,EAAE;AACF,QAAM,SAAS,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,iBAAiB,UAAU,QAAQ,EAAE;AACzF,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,QAAQ,UAAU,IAAI,GAAG,OAAO,aAAa,SAAS,IAAI,GAAG,MAAM,YAAY;AAAA,IAC/E,MAAM,UAAU,IAAI,YAAY,SAAS,IAAI,YAAY;AAAA,EAC3D;AACF;AAGO,SAAS,sBAAsB,MAA2C;AAC/E,MAAI,KAAK,WAAW,YAAa,QAAO;AACxC,MAAI,KAAK,WAAW,SAAU,QAAO;AACrC,SAAO;AACT;","names":[]}
@@ -0,0 +1,8 @@
1
+ import type { SessionEvent } from "@opengeni/sdk";
2
+ export declare const SESSION_ATTENTION_EVENT_TYPES: ReadonlySet<string>;
3
+ /**
4
+ * The latest delivered attention boundary, independent of raw token activity.
5
+ * A foreground reader acknowledges through this sequence, so streaming flushes
6
+ * never cause a personal-state write and later activity stays unread.
7
+ */
8
+ export declare function sessionAttentionReadThroughSequence(events: readonly SessionEvent[]): number;
@@ -0,0 +1,47 @@
1
+ "use client";
2
+
3
+ // src/session-attention-model.ts
4
+ var SESSION_ATTENTION_EVENT_TYPES = /* @__PURE__ */ new Set([
5
+ "agent.message.completed",
6
+ "turn.completed",
7
+ "turn.failed",
8
+ "session.requiresAction",
9
+ "session.humanInput.requested",
10
+ "tool.auth_needed",
11
+ "credential.auth_needed",
12
+ "goal.completed",
13
+ "goal.paused",
14
+ "goal.progress",
15
+ "goal.rewrite.proposed",
16
+ "rig.setup.failed",
17
+ "sandbox.operation.failed",
18
+ "sandbox.box.lost",
19
+ "workspace.revision.degraded",
20
+ "machine.op.failed",
21
+ "machine.link.lost",
22
+ "session.event.envelope_omitted"
23
+ ]);
24
+ function sessionAttentionReadThroughSequence(events) {
25
+ for (let index = events.length - 1; index >= 0; index -= 1) {
26
+ const event = events[index];
27
+ if (!SESSION_ATTENTION_EVENT_TYPES.has(event.type) || event.duplicateOfEventId || event.turnAssociation != null && event.turnAssociation !== "current")
28
+ continue;
29
+ const payload = event.payload && typeof event.payload === "object" ? event.payload : {};
30
+ if (event.type === "agent.message.completed" && (payload.phase === "commentary" || payload.text == null || payload.text === ""))
31
+ continue;
32
+ if (event.type === "turn.completed") {
33
+ if (payload.segmentLimit === "session_usage_limit") return event.sequence;
34
+ if (Object.hasOwn(payload, "maintenance") || Object.hasOwn(payload, "segmentLimit")) continue;
35
+ const output = payload.output ?? payload.result;
36
+ if ((output == null || output === "") && (payload.reply == null || payload.reply === ""))
37
+ continue;
38
+ }
39
+ return event.sequence;
40
+ }
41
+ return 0;
42
+ }
43
+ export {
44
+ SESSION_ATTENTION_EVENT_TYPES,
45
+ sessionAttentionReadThroughSequence
46
+ };
47
+ //# sourceMappingURL=session-attention-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/session-attention-model.ts"],"sourcesContent":["import type { SessionEvent } from \"@opengeni/sdk\";\n\n// Keep this client scheduling predicate aligned with the meaningful-attention\n// predicate in packages/db/src/session-meaningful-events.ts. The server remains\n// authoritative; this only avoids personal-state writes for streaming activity.\nexport const SESSION_ATTENTION_EVENT_TYPES: ReadonlySet<string> = new Set([\n \"agent.message.completed\",\n \"turn.completed\",\n \"turn.failed\",\n \"session.requiresAction\",\n \"session.humanInput.requested\",\n \"tool.auth_needed\",\n \"credential.auth_needed\",\n \"goal.completed\",\n \"goal.paused\",\n \"goal.progress\",\n \"goal.rewrite.proposed\",\n \"rig.setup.failed\",\n \"sandbox.operation.failed\",\n \"sandbox.box.lost\",\n \"workspace.revision.degraded\",\n \"machine.op.failed\",\n \"machine.link.lost\",\n \"session.event.envelope_omitted\",\n]);\n\n/**\n * The latest delivered attention boundary, independent of raw token activity.\n * A foreground reader acknowledges through this sequence, so streaming flushes\n * never cause a personal-state write and later activity stays unread.\n */\nexport function sessionAttentionReadThroughSequence(events: readonly SessionEvent[]): number {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]!;\n if (\n !SESSION_ATTENTION_EVENT_TYPES.has(event.type) ||\n event.duplicateOfEventId ||\n (event.turnAssociation != null && event.turnAssociation !== \"current\")\n )\n continue;\n const payload =\n event.payload && typeof event.payload === \"object\"\n ? (event.payload as Record<string, unknown>)\n : {};\n if (\n event.type === \"agent.message.completed\" &&\n (payload.phase === \"commentary\" || payload.text == null || payload.text === \"\")\n )\n continue;\n if (event.type === \"turn.completed\") {\n // A task usage-limit stop is an actionable boundary (only a person can\n // raise or clear the limit), matching the server's attention predicate.\n if (payload.segmentLimit === \"session_usage_limit\") return event.sequence;\n if (Object.hasOwn(payload, \"maintenance\") || Object.hasOwn(payload, \"segmentLimit\")) continue;\n const output = payload.output ?? payload.result;\n if ((output == null || output === \"\") && (payload.reply == null || payload.reply === \"\"))\n continue;\n }\n return event.sequence;\n }\n return 0;\n}\n"],"mappings":";;;AAKO,IAAM,gCAAqD,oBAAI,IAAI;AAAA,EACxE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,SAAS,oCAAoC,QAAyC;AAC3F,WAAS,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC1D,UAAM,QAAQ,OAAO,KAAK;AAC1B,QACE,CAAC,8BAA8B,IAAI,MAAM,IAAI,KAC7C,MAAM,sBACL,MAAM,mBAAmB,QAAQ,MAAM,oBAAoB;AAE5D;AACF,UAAM,UACJ,MAAM,WAAW,OAAO,MAAM,YAAY,WACrC,MAAM,UACP,CAAC;AACP,QACE,MAAM,SAAS,8BACd,QAAQ,UAAU,gBAAgB,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAE5E;AACF,QAAI,MAAM,SAAS,kBAAkB;AAGnC,UAAI,QAAQ,iBAAiB,sBAAuB,QAAO,MAAM;AACjE,UAAI,OAAO,OAAO,SAAS,aAAa,KAAK,OAAO,OAAO,SAAS,cAAc,EAAG;AACrF,YAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,WAAK,UAAU,QAAQ,WAAW,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,UAAU;AACnF;AAAA,IACJ;AACA,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,5 @@
1
+ import type { AuthNeededItem } from "./timeline/types.js";
2
+ import type { CapabilityCatalogItem } from "@opengeni/sdk";
3
+ /** Recovery events identify runtime servers/connections, while recommendation
4
+ * events already carry a catalog id. Never guess among same-domain accounts. */
5
+ export declare function sessionAuthRecommendation(item: AuthNeededItem, catalog: CapabilityCatalogItem[]): AuthNeededItem | undefined;
@@ -0,0 +1,31 @@
1
+ import type { CapabilityCatalogItem, UpdateSessionToolPolicyRequest } from "@opengeni/sdk";
2
+ import type { OpenGeniBrowserClient as OpenGeniClient } from "@opengeni/sdk/browser";
3
+ /** Catalog tool discovery may be lazy; selecting the installed server does not
4
+ * require its individual tool inventory to have been fetched. */
5
+ export declare function sessionCapabilityTools(item: CapabilityCatalogItem): import("@opengeni/sdk").ToolRef[];
6
+ /** A connection never resets the human's existing tool selection. Default-mode
7
+ * sessions discover newly enabled servers at admission; explicit/inherited
8
+ * policies add only this reviewed capability, with the existing CAS fence. */
9
+ export declare function attachSessionCapability(client: OpenGeniClient, workspaceId: string, sessionId: string, item: CapabilityCatalogItem, stillCurrent?: () => boolean): Promise<void>;
10
+ /** Read-only review. Hosts must show ancestor changes and obtain a separate
11
+ * explicit click before applying. This plan is never authorization. */
12
+ export type SessionCapabilityAccessPlan = {
13
+ workspaceId: string;
14
+ sessionId: string;
15
+ capabilityId: string;
16
+ sessions: Array<{
17
+ id: string;
18
+ title: string | null;
19
+ parentSessionId: string | null;
20
+ toolPolicyVersion: number;
21
+ request: UpdateSessionToolPolicyRequest | null;
22
+ }>;
23
+ };
24
+ export declare function prepareSessionCapabilityAccess(client: OpenGeniClient, workspaceId: string, sessionId: string, item: CapabilityCatalogItem, stillCurrent?: () => boolean): Promise<SessionCapabilityAccessPlan>;
25
+ /** Preflight the entire review, then apply ordinary CAS-fenced API writes root
26
+ * first. A partial failure may leave approved ancestor changes committed; never
27
+ * claim success or roll back another person's edits. Prepare a new review. */
28
+ export declare function applySessionCapabilityAccess(client: OpenGeniClient, plan: SessionCapabilityAccessPlan, stillCurrent?: () => boolean): Promise<void>;
29
+ /** Native OAuth callbacks have already saved the provider connection. Finish
30
+ * the separate, version-fenced session tool selection before reporting success. */
31
+ export declare function completeSessionCapabilityOAuth(client: OpenGeniClient, workspaceId: string, sessionId: string, capabilityId: string | null): Promise<void>;
@@ -0,0 +1,20 @@
1
+ import type { CreateFeedbackRequest, Feedback, FeedbackSentiment, OpenGeniClient } from "@opengeni/sdk";
2
+ export type FeedbackClient = Pick<OpenGeniClient, "createFeedback" | "listOwnFeedback">;
3
+ /** One shared read per session, with recovery after a transient network failure. */
4
+ export declare function loadSessionFeedback(client: Pick<OpenGeniClient, "listOwnFeedback">, workspaceId: string, sessionId: string, onLoaded: (result: Awaited<ReturnType<OpenGeniClient["listOwnFeedback"]>>) => void): () => void;
5
+ /** The first saved rating per turn (the list is newest-first). */
6
+ export declare function turnRatingsFromFeedback(feedback: readonly Feedback[]): Record<string, FeedbackSentiment>;
7
+ export type FeedbackPayload = Omit<CreateFeedbackRequest, "idempotencyKey">;
8
+ /**
9
+ * The request to send, reusing the previous idempotency key when the user
10
+ * retries the identical submission (a lost response must not duplicate it).
11
+ */
12
+ export declare function feedbackSubmission(payload: FeedbackPayload, previous: CreateFeedbackRequest | null, newKey: () => string): CreateFeedbackRequest;
13
+ export declare function feedbackDialogCopy(target: {
14
+ sessionId?: string | undefined;
15
+ turnId?: string | undefined;
16
+ }): {
17
+ title: string;
18
+ description: string;
19
+ };
20
+ export declare function feedbackSentimentLabel(sentiment: FeedbackSentiment): string;