@opengeni/react 1.3.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/README.md +29 -1
  2. package/dist/accounts.js +2 -0
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/artifacts-document.js +5 -4
  5. package/dist/artifacts-presentation.js +5 -4
  6. package/dist/artifacts-spreadsheet.js +4 -3
  7. package/dist/artifacts.js +14 -13
  8. package/dist/artifacts.js.map +1 -1
  9. package/dist/browser-viewer-WGJ43YGI.js +17 -0
  10. package/dist/chat-interactive-block-ZFHOKTMS.js +12 -0
  11. package/dist/{chunk-WEHMPOXK.js → chunk-2DDJ6YH6.js} +3 -1
  12. package/dist/{chunk-WEHMPOXK.js.map → chunk-2DDJ6YH6.js.map} +1 -1
  13. package/dist/{chunk-C5X5AJXK.js → chunk-2HVLQ26H.js} +5 -4
  14. package/dist/{chunk-C5X5AJXK.js.map → chunk-2HVLQ26H.js.map} +1 -1
  15. package/dist/{chunk-A4UJB2MM.js → chunk-32CGLXW2.js} +4 -3
  16. package/dist/{chunk-A4UJB2MM.js.map → chunk-32CGLXW2.js.map} +1 -1
  17. package/dist/{chunk-5CVXZA3Y.js → chunk-45NUOSXQ.js} +3 -2
  18. package/dist/{chunk-5CVXZA3Y.js.map → chunk-45NUOSXQ.js.map} +1 -1
  19. package/dist/{chunk-WUISZ3WU.js → chunk-53KJBGPZ.js} +5 -4
  20. package/dist/{chunk-WUISZ3WU.js.map → chunk-53KJBGPZ.js.map} +1 -1
  21. package/dist/{chunk-TMYGL6X5.js → chunk-55DXD22O.js} +73 -7
  22. package/dist/chunk-55DXD22O.js.map +1 -0
  23. package/dist/{chunk-JT4JW7BC.js → chunk-5I4VRWBB.js} +3 -1
  24. package/dist/{chunk-JT4JW7BC.js.map → chunk-5I4VRWBB.js.map} +1 -1
  25. package/dist/{chunk-UK4TINKT.js → chunk-B27E3V37.js} +3 -1
  26. package/dist/{chunk-UK4TINKT.js.map → chunk-B27E3V37.js.map} +1 -1
  27. package/dist/{chunk-J6DBS4T3.js → chunk-BNKV5ZLF.js} +5 -4
  28. package/dist/{chunk-J6DBS4T3.js.map → chunk-BNKV5ZLF.js.map} +1 -1
  29. package/dist/{chunk-YM2DE7BQ.js → chunk-C5BF4L26.js} +13 -12
  30. package/dist/{chunk-YM2DE7BQ.js.map → chunk-C5BF4L26.js.map} +1 -1
  31. package/dist/{chunk-YBXQDQFX.js → chunk-C7CMD56T.js} +6 -5
  32. package/dist/{chunk-YBXQDQFX.js.map → chunk-C7CMD56T.js.map} +1 -1
  33. package/dist/{chunk-UGLEYEMP.js → chunk-CM7LVUKC.js} +3 -1
  34. package/dist/{chunk-UGLEYEMP.js.map → chunk-CM7LVUKC.js.map} +1 -1
  35. package/dist/{chunk-PGSX7UCP.js → chunk-CREMJMVN.js} +1502 -833
  36. package/dist/chunk-CREMJMVN.js.map +1 -0
  37. package/dist/{chunk-JVYQRRC4.js → chunk-CVYCLFMH.js} +3 -1
  38. package/dist/{chunk-JVYQRRC4.js.map → chunk-CVYCLFMH.js.map} +1 -1
  39. package/dist/{chunk-Y2PRMYLC.js → chunk-G3U2A6GS.js} +3 -2
  40. package/dist/{chunk-Y2PRMYLC.js.map → chunk-G3U2A6GS.js.map} +1 -1
  41. package/dist/{chunk-WWEUO2PL.js → chunk-G6YRCIYJ.js} +202 -14
  42. package/dist/chunk-G6YRCIYJ.js.map +1 -0
  43. package/dist/{chunk-B3V6TG77.js → chunk-GC3PH6N7.js} +3 -1
  44. package/dist/{chunk-B3V6TG77.js.map → chunk-GC3PH6N7.js.map} +1 -1
  45. package/dist/{chunk-FZCP527Y.js → chunk-HXYOSSQO.js} +3 -2
  46. package/dist/{chunk-FZCP527Y.js.map → chunk-HXYOSSQO.js.map} +1 -1
  47. package/dist/{chunk-BRM6FVZA.js → chunk-IEE7WCLN.js} +4 -3
  48. package/dist/{chunk-BRM6FVZA.js.map → chunk-IEE7WCLN.js.map} +1 -1
  49. package/dist/{chunk-DYWBUX5Q.js → chunk-IMSUVYQB.js} +6 -5
  50. package/dist/{chunk-DYWBUX5Q.js.map → chunk-IMSUVYQB.js.map} +1 -1
  51. package/dist/{chunk-CY7WK5FD.js → chunk-IUHHPMAX.js} +203 -46
  52. package/dist/chunk-IUHHPMAX.js.map +1 -0
  53. package/dist/{chunk-SGKD2OCN.js → chunk-IYQCWGU5.js} +6 -5
  54. package/dist/{chunk-SGKD2OCN.js.map → chunk-IYQCWGU5.js.map} +1 -1
  55. package/dist/{chunk-J2QWVSQY.js → chunk-JH7V627O.js} +8 -7
  56. package/dist/{chunk-J2QWVSQY.js.map → chunk-JH7V627O.js.map} +1 -1
  57. package/dist/{chunk-EESD3PY3.js → chunk-JHTIMBOL.js} +6 -5
  58. package/dist/{chunk-EESD3PY3.js.map → chunk-JHTIMBOL.js.map} +1 -1
  59. package/dist/{chunk-LNIRAOA3.js → chunk-L2J3PU7A.js} +7 -6
  60. package/dist/{chunk-LNIRAOA3.js.map → chunk-L2J3PU7A.js.map} +1 -1
  61. package/dist/{chunk-ZYRGEKWS.js → chunk-LJUMYUBO.js} +3 -1
  62. package/dist/{chunk-ZYRGEKWS.js.map → chunk-LJUMYUBO.js.map} +1 -1
  63. package/dist/{chunk-4RVYOY4O.js → chunk-LSW2OJVV.js} +4 -3
  64. package/dist/{chunk-4RVYOY4O.js.map → chunk-LSW2OJVV.js.map} +1 -1
  65. package/dist/{chunk-UTRTG6LH.js → chunk-LVS3MH5T.js} +3 -1
  66. package/dist/{chunk-UTRTG6LH.js.map → chunk-LVS3MH5T.js.map} +1 -1
  67. package/dist/chunk-M357MHH3.js +2 -0
  68. package/dist/{chunk-GYVRFZDY.js → chunk-MDIXFKA3.js} +9 -8
  69. package/dist/{chunk-GYVRFZDY.js.map → chunk-MDIXFKA3.js.map} +1 -1
  70. package/dist/{chunk-WRHIZYZF.js → chunk-MEQM4LI3.js} +6 -5
  71. package/dist/{chunk-WRHIZYZF.js.map → chunk-MEQM4LI3.js.map} +1 -1
  72. package/dist/chunk-NX4ADH73.js +14 -0
  73. package/dist/chunk-NX4ADH73.js.map +1 -0
  74. package/dist/{chunk-XCHWDJ22.js → chunk-OGTTUYNT.js} +3 -1
  75. package/dist/{chunk-XCHWDJ22.js.map → chunk-OGTTUYNT.js.map} +1 -1
  76. package/dist/{chunk-GIMRELBW.js → chunk-OYQQJL3J.js} +3 -1
  77. package/dist/{chunk-GIMRELBW.js.map → chunk-OYQQJL3J.js.map} +1 -1
  78. package/dist/{chunk-RSI7XYXL.js → chunk-PBCZL4JP.js} +6 -5
  79. package/dist/{chunk-RSI7XYXL.js.map → chunk-PBCZL4JP.js.map} +1 -1
  80. package/dist/{chunk-I7IWRQLN.js → chunk-PHBFJCEU.js} +17 -11
  81. package/dist/chunk-PHBFJCEU.js.map +1 -0
  82. package/dist/{chunk-3CTRFMAK.js → chunk-PKCAYHDC.js} +5 -4
  83. package/dist/{chunk-3CTRFMAK.js.map → chunk-PKCAYHDC.js.map} +1 -1
  84. package/dist/{chunk-K3HQAKQX.js → chunk-PMV53IMM.js} +3 -1
  85. package/dist/{chunk-K3HQAKQX.js.map → chunk-PMV53IMM.js.map} +1 -1
  86. package/dist/{chunk-YQEAA6LT.js → chunk-QHUE7E4N.js} +3 -2
  87. package/dist/{chunk-YQEAA6LT.js.map → chunk-QHUE7E4N.js.map} +1 -1
  88. package/dist/{chunk-RC6BZ44Q.js → chunk-QMMCJGFI.js} +4 -3
  89. package/dist/{chunk-RC6BZ44Q.js.map → chunk-QMMCJGFI.js.map} +1 -1
  90. package/dist/{chunk-YV4L3ILF.js → chunk-QV3DJVRZ.js} +3 -1
  91. package/dist/{chunk-YV4L3ILF.js.map → chunk-QV3DJVRZ.js.map} +1 -1
  92. package/dist/{chunk-447JLCBU.js → chunk-S2QH6EZ5.js} +3 -1
  93. package/dist/{chunk-447JLCBU.js.map → chunk-S2QH6EZ5.js.map} +1 -1
  94. package/dist/{chunk-PNY3JKBJ.js → chunk-SFH43JT2.js} +5 -4
  95. package/dist/{chunk-PNY3JKBJ.js.map → chunk-SFH43JT2.js.map} +1 -1
  96. package/dist/{chunk-ERGYJIBB.js → chunk-T46QZH3E.js} +4 -2
  97. package/dist/{chunk-ERGYJIBB.js.map → chunk-T46QZH3E.js.map} +1 -1
  98. package/dist/{chunk-5J4FOW6Q.js → chunk-TNEZNMSN.js} +3 -1
  99. package/dist/{chunk-5J4FOW6Q.js.map → chunk-TNEZNMSN.js.map} +1 -1
  100. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  101. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  102. package/dist/{chunk-742CZ3L3.js → chunk-UDPH5SLV.js} +19 -202
  103. package/dist/chunk-UDPH5SLV.js.map +1 -0
  104. package/dist/{chunk-HDJWDK7W.js → chunk-VCSERYXH.js} +10 -9
  105. package/dist/{chunk-HDJWDK7W.js.map → chunk-VCSERYXH.js.map} +1 -1
  106. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  107. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  108. package/dist/{chunk-5F4WR7X7.js → chunk-XS67YG5R.js} +3 -1
  109. package/dist/{chunk-5F4WR7X7.js.map → chunk-XS67YG5R.js.map} +1 -1
  110. package/dist/{chunk-TKOTKRWY.js → chunk-XTD7TZHW.js} +3 -1
  111. package/dist/{chunk-TKOTKRWY.js.map → chunk-XTD7TZHW.js.map} +1 -1
  112. package/dist/{chunk-A2PI6UMY.js → chunk-YSRBFJMQ.js} +3 -1
  113. package/dist/{chunk-A2PI6UMY.js.map → chunk-YSRBFJMQ.js.map} +1 -1
  114. package/dist/chunk-YVFRBXST.js +1420 -0
  115. package/dist/chunk-YVFRBXST.js.map +1 -0
  116. package/dist/{chunk-SCOTPE2I.js → chunk-YYLBXXTE.js} +3 -1
  117. package/dist/{chunk-SCOTPE2I.js.map → chunk-YYLBXXTE.js.map} +1 -1
  118. package/dist/{chunk-RHREZ7BO.js → chunk-ZUWF4NF7.js} +3 -1
  119. package/dist/{chunk-RHREZ7BO.js.map → chunk-ZUWF4NF7.js.map} +1 -1
  120. package/dist/clipboard.js +3 -2
  121. package/dist/components/composer-transcription-control.d.ts +7 -0
  122. package/dist/components/open-geni-chat.d.ts +6 -2
  123. package/dist/components/session-conversation.d.ts +31 -19
  124. package/dist/components/session-list.d.ts +4 -1
  125. package/dist/components/tool-action-review.d.ts +29 -2
  126. package/dist/components/tool-review-history.d.ts +8 -4
  127. package/dist/composer-voice-events.d.ts +8 -0
  128. package/dist/composer.js +15 -13
  129. package/dist/computer-viewer-46UIN7F3.js +20 -0
  130. package/dist/connect.js +15 -12
  131. package/dist/connect.js.map +1 -1
  132. package/dist/desktop.js +6 -5
  133. package/dist/desktop.js.map +1 -1
  134. package/dist/diffs.js +2 -1
  135. package/dist/diffs.js.map +1 -1
  136. package/dist/editor.js +4 -3
  137. package/dist/editor.js.map +1 -1
  138. package/dist/embedded-voice-NIL4RDX3.js +69 -0
  139. package/dist/embedded-voice-NIL4RDX3.js.map +1 -0
  140. package/dist/{fleet-decision-row-YZ3ZKWMM.js → fleet-decision-row-SI63O5V4.js} +3 -1
  141. package/dist/{fleet-decision-row-YZ3ZKWMM.js.map → fleet-decision-row-SI63O5V4.js.map} +1 -1
  142. package/dist/hooks/use-client-config-flags.d.ts +43 -0
  143. package/dist/hooks/use-realtime-voice-models.d.ts +9 -0
  144. package/dist/hooks/use-voice-input.d.ts +8 -1
  145. package/dist/index.d.ts +3 -3
  146. package/dist/index.js +60 -48
  147. package/dist/index.js.map +1 -1
  148. package/dist/interaction.js +14 -13
  149. package/dist/interaction.js.map +1 -1
  150. package/dist/{latest-question-YTOBHCWR.js → latest-question-2POFPYNB.js} +5 -4
  151. package/dist/{latest-question-YTOBHCWR.js.map → latest-question-2POFPYNB.js.map} +1 -1
  152. package/dist/machines.js +8 -7
  153. package/dist/{markdown-table-layout-QXSLK4BY.js → markdown-table-layout-DQ4DRNVT.js} +3 -1
  154. package/dist/{markdown-table-layout-QXSLK4BY.js.map → markdown-table-layout-DQ4DRNVT.js.map} +1 -1
  155. package/dist/model-policy-picker-menu-WRNSRFQC.js +15 -0
  156. package/dist/model-policy.js +2 -1
  157. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  158. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  159. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  160. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  161. package/dist/{platform-activity-row-627BFZ46.js → platform-activity-row-PJJVATTZ.js} +3 -1
  162. package/dist/{platform-activity-row-627BFZ46.js.map → platform-activity-row-PJJVATTZ.js.map} +1 -1
  163. package/dist/{queue-surface-implementation-ZHFI5JBP.js → queue-surface-implementation-67FS7FUI.js} +10 -9
  164. package/dist/{queue-surface-implementation-ZHFI5JBP.js.map → queue-surface-implementation-67FS7FUI.js.map} +1 -1
  165. package/dist/realtime/embedded-voice.d.ts +20 -0
  166. package/dist/realtime/realtime-control.d.ts +2 -0
  167. package/dist/realtime.js +22 -1332
  168. package/dist/realtime.js.map +1 -1
  169. package/dist/sandbox-files-34CJJNOY.js +21 -0
  170. package/dist/session-capability-policy.d.ts +20 -1
  171. package/dist/session-ui.js +32 -30
  172. package/dist/session-ui.js.map +1 -1
  173. package/dist/session.js +12 -11
  174. package/dist/sites.js +2 -1
  175. package/dist/terminal.js +6 -5
  176. package/dist/terminal.js.map +1 -1
  177. package/dist/timeline/index.d.ts +2 -0
  178. package/dist/timeline/retained-loaders.d.ts +27 -0
  179. package/dist/{timeline-annotation-markers-GNDHTGBD.js → timeline-annotation-markers-U3G66KUD.js} +5 -4
  180. package/dist/{timeline-annotation-markers-GNDHTGBD.js.map → timeline-annotation-markers-U3G66KUD.js.map} +1 -1
  181. package/dist/{timeline-annotation-selection-DMLMM2TX.js → timeline-annotation-selection-BI7QTPTZ.js} +4 -3
  182. package/dist/{timeline-annotation-selection-DMLMM2TX.js.map → timeline-annotation-selection-BI7QTPTZ.js.map} +1 -1
  183. package/dist/{timeline-annotations-dialog-ELRDBHTS.js → timeline-annotations-dialog-FOMHSDTE.js} +7 -6
  184. package/dist/{timeline-annotations-dialog-ELRDBHTS.js.map → timeline-annotations-dialog-FOMHSDTE.js.map} +1 -1
  185. package/dist/usage.js +6 -5
  186. package/dist/usage.js.map +1 -1
  187. package/dist/voice-recording-owner.d.ts +7 -0
  188. package/package.json +3 -3
  189. package/src/components/approval-surface.tsx +190 -79
  190. package/src/components/artifacts/session-artifact-viewer.tsx +4 -2
  191. package/src/components/composer-transcription-control.tsx +121 -25
  192. package/src/components/composer.tsx +1 -0
  193. package/src/components/markdown.tsx +7 -2
  194. package/src/components/message-timeline.tsx +10 -1
  195. package/src/components/open-geni-chat.tsx +53 -13
  196. package/src/components/session-conversation.tsx +273 -63
  197. package/src/components/session-list.tsx +9 -2
  198. package/src/components/session-proxy-scope.tsx +26 -5
  199. package/src/components/tool-action-review.tsx +502 -239
  200. package/src/components/tool-review-history.tsx +18 -43
  201. package/src/composer-voice-events.ts +12 -0
  202. package/src/connection-discovery.tsx +4 -1
  203. package/src/hooks/use-client-config-flags.ts +110 -0
  204. package/src/hooks/use-goal.ts +12 -1
  205. package/src/hooks/use-realtime-voice-models.ts +67 -0
  206. package/src/hooks/use-session-events.ts +19 -16
  207. package/src/hooks/use-transcription.ts +6 -0
  208. package/src/hooks/use-voice-input.ts +115 -18
  209. package/src/index.ts +9 -0
  210. package/src/realtime/embedded-voice.tsx +81 -0
  211. package/src/realtime/realtime-control.tsx +109 -17
  212. package/src/session-capability-policy.ts +119 -6
  213. package/src/timeline/index.ts +10 -0
  214. package/src/timeline/retained-loaders.ts +86 -0
  215. package/src/timeline/tool-display-name.ts +5 -1
  216. package/src/timeline/tool-renderers.tsx +143 -10
  217. package/src/voice-recording-owner.ts +22 -0
  218. package/styles/compiled.css +135 -37
  219. package/styles/index.css +49 -0
  220. package/styles/responsive.css +61 -4
  221. package/styles/session-capability.css +1 -1
  222. package/styles/tokens.css +1 -1
  223. package/dist/browser-viewer-SHYKQRNX.js +0 -16
  224. package/dist/chat-interactive-block-UGBTNB3L.js +0 -11
  225. package/dist/chunk-742CZ3L3.js.map +0 -1
  226. package/dist/chunk-CY7WK5FD.js.map +0 -1
  227. package/dist/chunk-I7IWRQLN.js.map +0 -1
  228. package/dist/chunk-IWIDV7SB.js +0 -1
  229. package/dist/chunk-PGSX7UCP.js.map +0 -1
  230. package/dist/chunk-TMYGL6X5.js.map +0 -1
  231. package/dist/chunk-WWEUO2PL.js.map +0 -1
  232. package/dist/computer-viewer-6SRGWRUX.js +0 -19
  233. package/dist/model-policy-picker-menu-DXHUL73H.js +0 -14
  234. package/dist/sandbox-files-GORZOUUJ.js +0 -20
  235. /package/dist/{browser-viewer-SHYKQRNX.js.map → browser-viewer-WGJ43YGI.js.map} +0 -0
  236. /package/dist/{chat-interactive-block-UGBTNB3L.js.map → chat-interactive-block-ZFHOKTMS.js.map} +0 -0
  237. /package/dist/{chunk-IWIDV7SB.js.map → chunk-M357MHH3.js.map} +0 -0
  238. /package/dist/{computer-viewer-6SRGWRUX.js.map → computer-viewer-46UIN7F3.js.map} +0 -0
  239. /package/dist/{model-policy-picker-menu-DXHUL73H.js.map → model-policy-picker-menu-WRNSRFQC.js.map} +0 -0
  240. /package/dist/{sandbox-files-GORZOUUJ.js.map → sandbox-files-34CJJNOY.js.map} +0 -0
@@ -230,7 +230,7 @@ const baseComponents: Components = {
230
230
  ),
231
231
  td: ({ children, ...props }) => (
232
232
  <td
233
- className="border-b border-og-border/70 px-0 py-1.5 pr-4 align-top text-og-fg-muted [tr:last-child>&]:border-b-0"
233
+ className="border-b border-og-border/70 px-0 py-1.5 pr-4 align-top text-og-fg-muted"
234
234
  {...props}
235
235
  >
236
236
  {children}
@@ -615,7 +615,12 @@ function MarkdownTable({ children, className, ...props }: ComponentPropsWithoutR
615
615
  <div className="overflow-x-auto" tabIndex={0}>
616
616
  <table
617
617
  ref={tableRef}
618
- className={cn("w-full min-w-0 border-collapse text-og-base", className)}
618
+ className={cn(
619
+ // Leading `&` only: a trailing one (`tr:last-child>&`) under the scoped
620
+ // selector list needs `:is()`, which bundlers warn about for older targets.
621
+ "w-full min-w-0 border-collapse text-og-base [&_tr:last-child>td]:border-b-0",
622
+ className,
623
+ )}
619
624
  {...props}
620
625
  >
621
626
  {children}
@@ -2496,6 +2496,16 @@ export function MessageTimeline({
2496
2496
  }
2497
2497
  releasePinAfterScrollSettled(node);
2498
2498
  };
2499
+ // React 18 has no `onScrollEnd` prop: it warns and never calls it, while
2500
+ // `supportsScrollEndEvent()` still makes the camera wait for scrollend. A
2501
+ // native listener (re-bound each commit, so it always sees this render's
2502
+ // handler and scroller) works on every supported React version.
2503
+ useEffect(() => {
2504
+ const node = scrollRef.current;
2505
+ if (!node) return;
2506
+ node.addEventListener("scrollend", onScrollEnd);
2507
+ return () => node.removeEventListener("scrollend", onScrollEnd);
2508
+ });
2499
2509
 
2500
2510
  const timeline = (
2501
2511
  <AllowancePresentationProvider
@@ -2538,7 +2548,6 @@ export function MessageTimeline({
2538
2548
  }
2539
2549
  tabIndex={-1}
2540
2550
  onScroll={onScroll}
2541
- onScrollEnd={onScrollEnd}
2542
2551
  onWheel={onWheel}
2543
2552
  onTouchStart={(event) => {
2544
2553
  stopSettlement();
@@ -1,4 +1,10 @@
1
- import type { FileResourceRef, LatencyMode, OpenGeniClient, ReasoningEffort } from "@opengeni/sdk";
1
+ import {
2
+ OpenGeniApiError,
3
+ type FileResourceRef,
4
+ type LatencyMode,
5
+ type OpenGeniClient,
6
+ type ReasoningEffort,
7
+ } from "@opengeni/sdk";
2
8
  import { MenuIcon, XIcon } from "lucide-react";
3
9
  import { useCallback, useRef, useState, type CSSProperties, type FormEvent } from "react";
4
10
  import { useWorkspaceModelCatalog } from "../hooks/use-available-models";
@@ -14,9 +20,10 @@ import {
14
20
  import { useOpenGeni, type ClientOverride } from "../session-context";
15
21
  import { ChatComposer } from "./chat-composer";
16
22
  import { ModelPolicyPicker } from "./model-policy-picker";
23
+ import { useClientConfigFlags } from "../hooks/use-client-config-flags";
17
24
  import {
18
25
  SessionConversation,
19
- useClientConfigFlags,
26
+ useComposerTranscription,
20
27
  type SessionConversationProps,
21
28
  } from "./session-conversation";
22
29
  import { SessionList, type SessionListLabels, type SessionListProps } from "./session-list";
@@ -71,7 +78,11 @@ export type OpenGeniChatProps = ClientOverride &
71
78
  options: OpenGeniChatCreateOptions,
72
79
  ) => Promise<string>)
73
80
  | undefined;
74
- /** Hide the "New chat" entry point. */
81
+ /**
82
+ * Hide the "New chat" entry point. It is also hidden when the session proxy
83
+ * reports chat creation unavailable (no `createSession` hook) and no
84
+ * `createSession` prop is given.
85
+ */
75
86
  newChat?: boolean | undefined;
76
87
  /**
77
88
  * Forwarded to the conversation (message rendering, tool renderers,
@@ -152,6 +163,9 @@ function Chat({
152
163
  const [listRevision, setListRevision] = useState(0);
153
164
  const root = useRef<HTMLDivElement>(null);
154
165
  const hostTheme = useHostTheme(root, { theme, surface });
166
+ const config = useClientConfigFlags(context.client);
167
+ // A host creator replaces the proxy route; otherwise trust the proxy's report.
168
+ const canCreate = createSession !== undefined || config.sessionCreation;
155
169
 
156
170
  const select = useCallback(
157
171
  (next: string | null) => {
@@ -171,12 +185,20 @@ function Chat({
171
185
  if (createSession) return await createSession(initialMessage, idempotencyKey, options);
172
186
  const creator = (context.client as unknown as CreateClient).createSession;
173
187
  if (typeof creator !== "function") throw new Error(labels.newChatUnavailable);
174
- const created = await creator.call(context.client, context.workspaceId, {
175
- initialMessage,
176
- idempotencyKey,
177
- ...options,
178
- } as Parameters<NonNullable<CreateClient["createSession"]>>[1]);
179
- return created.id;
188
+ try {
189
+ const created = await creator.call(context.client, context.workspaceId, {
190
+ initialMessage,
191
+ idempotencyKey,
192
+ ...options,
193
+ } as Parameters<NonNullable<CreateClient["createSession"]>>[1]);
194
+ return created.id;
195
+ } catch (error) {
196
+ // A proxy without a createSession hook refuses the route itself.
197
+ if (error instanceof OpenGeniApiError && error.code === "route_not_allowed") {
198
+ throw new Error(labels.newChatUnavailable, { cause: error });
199
+ }
200
+ throw error;
201
+ }
180
202
  },
181
203
  [context.client, context.workspaceId, createSession, labels.newChatUnavailable],
182
204
  );
@@ -188,7 +210,7 @@ function Chat({
188
210
  labels={labels}
189
211
  selectedSessionId={selected}
190
212
  onSelect={select}
191
- onNewChat={newChat ? () => select(null) : undefined}
213
+ onNewChat={newChat && canCreate ? () => select(null) : undefined}
192
214
  onArchived={(archivedId) => {
193
215
  if (archivedId === selected) select(null);
194
216
  }}
@@ -256,6 +278,8 @@ function Chat({
256
278
  {selected ? (
257
279
  <SessionConversation
258
280
  {...conversationProps}
281
+ // Sub-agent chats open in place, like a chat from the list.
282
+ onOpenSession={conversationProps?.onOpenSession ?? select}
259
283
  {...scope}
260
284
  sessionId={selected}
261
285
  height="100%"
@@ -266,6 +290,7 @@ function Chat({
266
290
  labels={labels}
267
291
  placeholderOverride={labelOverrides?.newChatPlaceholder}
268
292
  conversationProps={conversationProps}
293
+ available={canCreate}
269
294
  create={create}
270
295
  onCreated={(id) => {
271
296
  setListRevision((revision) => revision + 1);
@@ -291,6 +316,7 @@ function NewChat({
291
316
  labels,
292
317
  placeholderOverride,
293
318
  conversationProps,
319
+ available,
294
320
  create,
295
321
  onCreated,
296
322
  }: {
@@ -298,6 +324,8 @@ function NewChat({
298
324
  labels: OpenGeniChatLabels;
299
325
  placeholderOverride: string | undefined;
300
326
  conversationProps: OpenGeniChatProps["conversationProps"];
327
+ /** False when this product cannot start chats; the composer is disabled and says so. */
328
+ available: boolean;
301
329
  create: (
302
330
  initialMessage: string,
303
331
  idempotencyKey: string,
@@ -317,6 +345,11 @@ function NewChat({
317
345
  });
318
346
  const files = useFileAttachments(scope);
319
347
  const uploadsEnabled = (conversationProps?.attachments ?? true) && config.uploads;
348
+ const transcription = useComposerTranscription(
349
+ context.client,
350
+ context.workspaceId,
351
+ (conversationProps?.voiceInput ?? true) && available ? config.voiceInput : null,
352
+ );
320
353
  const [text, setText] = useState("");
321
354
  const [sending, setSending] = useState(false);
322
355
  const [error, setError] = useState<{ cause: unknown } | null>(null);
@@ -333,7 +366,7 @@ function NewChat({
333
366
 
334
367
  const submit = async (): Promise<boolean> => {
335
368
  const initialMessage = text.trim() || (resources.length > 0 ? FILE_ONLY_MESSAGE_TEXT : "");
336
- if (!initialMessage || sending || pendingFiles) return false;
369
+ if (!initialMessage || sending || pendingFiles || !available) return false;
337
370
  const options: OpenGeniChatCreateOptions = {
338
371
  ...(resources.length > 0 ? { resources } : {}),
339
372
  ...(showModelPicker ? choice : {}),
@@ -377,7 +410,8 @@ function NewChat({
377
410
  send: submit,
378
411
  steer: submit,
379
412
  sending,
380
- canSend: (text.trim().length > 0 || resources.length > 0) && !sending && !pendingFiles,
413
+ canSend:
414
+ available && (text.trim().length > 0 || resources.length > 0) && !sending && !pendingFiles,
381
415
  pause: NOOP_ASYNC,
382
416
  pausing: false,
383
417
  resume: NOOP_ASYNC,
@@ -420,8 +454,10 @@ function NewChat({
420
454
  ) : null}
421
455
  <ChatComposer
422
456
  {...composerProps}
457
+ {...(transcription && composerProps?.transcription === undefined ? { transcription } : {})}
423
458
  composer={composer}
424
459
  attachments={uploadsEnabled ? files : undefined}
460
+ disabled={!available || composerProps?.disabled}
425
461
  runControl="none"
426
462
  running={false}
427
463
  placeholder={placeholderOverride ?? composerProps?.placeholder ?? labels.newChatPlaceholder}
@@ -455,7 +491,11 @@ function NewChat({
455
491
  }
456
492
  responsiveBasis={composerProps?.responsiveBasis ?? "container"}
457
493
  />
458
- {error ? (
494
+ {!available ? (
495
+ <p className="text-center text-og-sm text-og-fg-muted" data-og-new-chat-unavailable="">
496
+ {labels.newChatUnavailable}
497
+ </p>
498
+ ) : error ? (
459
499
  <p role="alert" className="text-center text-og-sm text-og-status-failed">
460
500
  {formatError(
461
501
  error.cause,