@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.
- package/README.md +29 -1
- package/dist/accounts.js +2 -0
- package/dist/accounts.js.map +1 -1
- package/dist/artifacts-document.js +5 -4
- package/dist/artifacts-presentation.js +5 -4
- package/dist/artifacts-spreadsheet.js +4 -3
- package/dist/artifacts.js +14 -13
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-WGJ43YGI.js +17 -0
- package/dist/chat-interactive-block-ZFHOKTMS.js +12 -0
- package/dist/{chunk-WEHMPOXK.js → chunk-2DDJ6YH6.js} +3 -1
- package/dist/{chunk-WEHMPOXK.js.map → chunk-2DDJ6YH6.js.map} +1 -1
- package/dist/{chunk-C5X5AJXK.js → chunk-2HVLQ26H.js} +5 -4
- package/dist/{chunk-C5X5AJXK.js.map → chunk-2HVLQ26H.js.map} +1 -1
- package/dist/{chunk-A4UJB2MM.js → chunk-32CGLXW2.js} +4 -3
- package/dist/{chunk-A4UJB2MM.js.map → chunk-32CGLXW2.js.map} +1 -1
- package/dist/{chunk-5CVXZA3Y.js → chunk-45NUOSXQ.js} +3 -2
- package/dist/{chunk-5CVXZA3Y.js.map → chunk-45NUOSXQ.js.map} +1 -1
- package/dist/{chunk-WUISZ3WU.js → chunk-53KJBGPZ.js} +5 -4
- package/dist/{chunk-WUISZ3WU.js.map → chunk-53KJBGPZ.js.map} +1 -1
- package/dist/{chunk-TMYGL6X5.js → chunk-55DXD22O.js} +73 -7
- package/dist/chunk-55DXD22O.js.map +1 -0
- package/dist/{chunk-JT4JW7BC.js → chunk-5I4VRWBB.js} +3 -1
- package/dist/{chunk-JT4JW7BC.js.map → chunk-5I4VRWBB.js.map} +1 -1
- package/dist/{chunk-UK4TINKT.js → chunk-B27E3V37.js} +3 -1
- package/dist/{chunk-UK4TINKT.js.map → chunk-B27E3V37.js.map} +1 -1
- package/dist/{chunk-J6DBS4T3.js → chunk-BNKV5ZLF.js} +5 -4
- package/dist/{chunk-J6DBS4T3.js.map → chunk-BNKV5ZLF.js.map} +1 -1
- package/dist/{chunk-YM2DE7BQ.js → chunk-C5BF4L26.js} +13 -12
- package/dist/{chunk-YM2DE7BQ.js.map → chunk-C5BF4L26.js.map} +1 -1
- package/dist/{chunk-YBXQDQFX.js → chunk-C7CMD56T.js} +6 -5
- package/dist/{chunk-YBXQDQFX.js.map → chunk-C7CMD56T.js.map} +1 -1
- package/dist/{chunk-UGLEYEMP.js → chunk-CM7LVUKC.js} +3 -1
- package/dist/{chunk-UGLEYEMP.js.map → chunk-CM7LVUKC.js.map} +1 -1
- package/dist/{chunk-PGSX7UCP.js → chunk-CREMJMVN.js} +1502 -833
- package/dist/chunk-CREMJMVN.js.map +1 -0
- package/dist/{chunk-JVYQRRC4.js → chunk-CVYCLFMH.js} +3 -1
- package/dist/{chunk-JVYQRRC4.js.map → chunk-CVYCLFMH.js.map} +1 -1
- package/dist/{chunk-Y2PRMYLC.js → chunk-G3U2A6GS.js} +3 -2
- package/dist/{chunk-Y2PRMYLC.js.map → chunk-G3U2A6GS.js.map} +1 -1
- package/dist/{chunk-WWEUO2PL.js → chunk-G6YRCIYJ.js} +202 -14
- package/dist/chunk-G6YRCIYJ.js.map +1 -0
- package/dist/{chunk-B3V6TG77.js → chunk-GC3PH6N7.js} +3 -1
- package/dist/{chunk-B3V6TG77.js.map → chunk-GC3PH6N7.js.map} +1 -1
- package/dist/{chunk-FZCP527Y.js → chunk-HXYOSSQO.js} +3 -2
- package/dist/{chunk-FZCP527Y.js.map → chunk-HXYOSSQO.js.map} +1 -1
- package/dist/{chunk-BRM6FVZA.js → chunk-IEE7WCLN.js} +4 -3
- package/dist/{chunk-BRM6FVZA.js.map → chunk-IEE7WCLN.js.map} +1 -1
- package/dist/{chunk-DYWBUX5Q.js → chunk-IMSUVYQB.js} +6 -5
- package/dist/{chunk-DYWBUX5Q.js.map → chunk-IMSUVYQB.js.map} +1 -1
- package/dist/{chunk-CY7WK5FD.js → chunk-IUHHPMAX.js} +203 -46
- package/dist/chunk-IUHHPMAX.js.map +1 -0
- package/dist/{chunk-SGKD2OCN.js → chunk-IYQCWGU5.js} +6 -5
- package/dist/{chunk-SGKD2OCN.js.map → chunk-IYQCWGU5.js.map} +1 -1
- package/dist/{chunk-J2QWVSQY.js → chunk-JH7V627O.js} +8 -7
- package/dist/{chunk-J2QWVSQY.js.map → chunk-JH7V627O.js.map} +1 -1
- package/dist/{chunk-EESD3PY3.js → chunk-JHTIMBOL.js} +6 -5
- package/dist/{chunk-EESD3PY3.js.map → chunk-JHTIMBOL.js.map} +1 -1
- package/dist/{chunk-LNIRAOA3.js → chunk-L2J3PU7A.js} +7 -6
- package/dist/{chunk-LNIRAOA3.js.map → chunk-L2J3PU7A.js.map} +1 -1
- package/dist/{chunk-ZYRGEKWS.js → chunk-LJUMYUBO.js} +3 -1
- package/dist/{chunk-ZYRGEKWS.js.map → chunk-LJUMYUBO.js.map} +1 -1
- package/dist/{chunk-4RVYOY4O.js → chunk-LSW2OJVV.js} +4 -3
- package/dist/{chunk-4RVYOY4O.js.map → chunk-LSW2OJVV.js.map} +1 -1
- package/dist/{chunk-UTRTG6LH.js → chunk-LVS3MH5T.js} +3 -1
- package/dist/{chunk-UTRTG6LH.js.map → chunk-LVS3MH5T.js.map} +1 -1
- package/dist/chunk-M357MHH3.js +2 -0
- package/dist/{chunk-GYVRFZDY.js → chunk-MDIXFKA3.js} +9 -8
- package/dist/{chunk-GYVRFZDY.js.map → chunk-MDIXFKA3.js.map} +1 -1
- package/dist/{chunk-WRHIZYZF.js → chunk-MEQM4LI3.js} +6 -5
- package/dist/{chunk-WRHIZYZF.js.map → chunk-MEQM4LI3.js.map} +1 -1
- package/dist/chunk-NX4ADH73.js +14 -0
- package/dist/chunk-NX4ADH73.js.map +1 -0
- package/dist/{chunk-XCHWDJ22.js → chunk-OGTTUYNT.js} +3 -1
- package/dist/{chunk-XCHWDJ22.js.map → chunk-OGTTUYNT.js.map} +1 -1
- package/dist/{chunk-GIMRELBW.js → chunk-OYQQJL3J.js} +3 -1
- package/dist/{chunk-GIMRELBW.js.map → chunk-OYQQJL3J.js.map} +1 -1
- package/dist/{chunk-RSI7XYXL.js → chunk-PBCZL4JP.js} +6 -5
- package/dist/{chunk-RSI7XYXL.js.map → chunk-PBCZL4JP.js.map} +1 -1
- package/dist/{chunk-I7IWRQLN.js → chunk-PHBFJCEU.js} +17 -11
- package/dist/chunk-PHBFJCEU.js.map +1 -0
- package/dist/{chunk-3CTRFMAK.js → chunk-PKCAYHDC.js} +5 -4
- package/dist/{chunk-3CTRFMAK.js.map → chunk-PKCAYHDC.js.map} +1 -1
- package/dist/{chunk-K3HQAKQX.js → chunk-PMV53IMM.js} +3 -1
- package/dist/{chunk-K3HQAKQX.js.map → chunk-PMV53IMM.js.map} +1 -1
- package/dist/{chunk-YQEAA6LT.js → chunk-QHUE7E4N.js} +3 -2
- package/dist/{chunk-YQEAA6LT.js.map → chunk-QHUE7E4N.js.map} +1 -1
- package/dist/{chunk-RC6BZ44Q.js → chunk-QMMCJGFI.js} +4 -3
- package/dist/{chunk-RC6BZ44Q.js.map → chunk-QMMCJGFI.js.map} +1 -1
- package/dist/{chunk-YV4L3ILF.js → chunk-QV3DJVRZ.js} +3 -1
- package/dist/{chunk-YV4L3ILF.js.map → chunk-QV3DJVRZ.js.map} +1 -1
- package/dist/{chunk-447JLCBU.js → chunk-S2QH6EZ5.js} +3 -1
- package/dist/{chunk-447JLCBU.js.map → chunk-S2QH6EZ5.js.map} +1 -1
- package/dist/{chunk-PNY3JKBJ.js → chunk-SFH43JT2.js} +5 -4
- package/dist/{chunk-PNY3JKBJ.js.map → chunk-SFH43JT2.js.map} +1 -1
- package/dist/{chunk-ERGYJIBB.js → chunk-T46QZH3E.js} +4 -2
- package/dist/{chunk-ERGYJIBB.js.map → chunk-T46QZH3E.js.map} +1 -1
- package/dist/{chunk-5J4FOW6Q.js → chunk-TNEZNMSN.js} +3 -1
- package/dist/{chunk-5J4FOW6Q.js.map → chunk-TNEZNMSN.js.map} +1 -1
- package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
- package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
- package/dist/{chunk-742CZ3L3.js → chunk-UDPH5SLV.js} +19 -202
- package/dist/chunk-UDPH5SLV.js.map +1 -0
- package/dist/{chunk-HDJWDK7W.js → chunk-VCSERYXH.js} +10 -9
- package/dist/{chunk-HDJWDK7W.js.map → chunk-VCSERYXH.js.map} +1 -1
- package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
- package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
- package/dist/{chunk-5F4WR7X7.js → chunk-XS67YG5R.js} +3 -1
- package/dist/{chunk-5F4WR7X7.js.map → chunk-XS67YG5R.js.map} +1 -1
- package/dist/{chunk-TKOTKRWY.js → chunk-XTD7TZHW.js} +3 -1
- package/dist/{chunk-TKOTKRWY.js.map → chunk-XTD7TZHW.js.map} +1 -1
- package/dist/{chunk-A2PI6UMY.js → chunk-YSRBFJMQ.js} +3 -1
- package/dist/{chunk-A2PI6UMY.js.map → chunk-YSRBFJMQ.js.map} +1 -1
- package/dist/chunk-YVFRBXST.js +1420 -0
- package/dist/chunk-YVFRBXST.js.map +1 -0
- package/dist/{chunk-SCOTPE2I.js → chunk-YYLBXXTE.js} +3 -1
- package/dist/{chunk-SCOTPE2I.js.map → chunk-YYLBXXTE.js.map} +1 -1
- package/dist/{chunk-RHREZ7BO.js → chunk-ZUWF4NF7.js} +3 -1
- package/dist/{chunk-RHREZ7BO.js.map → chunk-ZUWF4NF7.js.map} +1 -1
- package/dist/clipboard.js +3 -2
- package/dist/components/composer-transcription-control.d.ts +7 -0
- package/dist/components/open-geni-chat.d.ts +6 -2
- package/dist/components/session-conversation.d.ts +31 -19
- package/dist/components/session-list.d.ts +4 -1
- package/dist/components/tool-action-review.d.ts +29 -2
- package/dist/components/tool-review-history.d.ts +8 -4
- package/dist/composer-voice-events.d.ts +8 -0
- package/dist/composer.js +15 -13
- package/dist/computer-viewer-46UIN7F3.js +20 -0
- package/dist/connect.js +15 -12
- package/dist/connect.js.map +1 -1
- package/dist/desktop.js +6 -5
- package/dist/desktop.js.map +1 -1
- package/dist/diffs.js +2 -1
- package/dist/diffs.js.map +1 -1
- package/dist/editor.js +4 -3
- package/dist/editor.js.map +1 -1
- package/dist/embedded-voice-NIL4RDX3.js +69 -0
- package/dist/embedded-voice-NIL4RDX3.js.map +1 -0
- package/dist/{fleet-decision-row-YZ3ZKWMM.js → fleet-decision-row-SI63O5V4.js} +3 -1
- package/dist/{fleet-decision-row-YZ3ZKWMM.js.map → fleet-decision-row-SI63O5V4.js.map} +1 -1
- package/dist/hooks/use-client-config-flags.d.ts +43 -0
- package/dist/hooks/use-realtime-voice-models.d.ts +9 -0
- package/dist/hooks/use-voice-input.d.ts +8 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +60 -48
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +14 -13
- package/dist/interaction.js.map +1 -1
- package/dist/{latest-question-YTOBHCWR.js → latest-question-2POFPYNB.js} +5 -4
- package/dist/{latest-question-YTOBHCWR.js.map → latest-question-2POFPYNB.js.map} +1 -1
- package/dist/machines.js +8 -7
- package/dist/{markdown-table-layout-QXSLK4BY.js → markdown-table-layout-DQ4DRNVT.js} +3 -1
- package/dist/{markdown-table-layout-QXSLK4BY.js.map → markdown-table-layout-DQ4DRNVT.js.map} +1 -1
- package/dist/model-policy-picker-menu-WRNSRFQC.js +15 -0
- package/dist/model-policy.js +2 -1
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
- package/dist/{platform-activity-row-627BFZ46.js → platform-activity-row-PJJVATTZ.js} +3 -1
- package/dist/{platform-activity-row-627BFZ46.js.map → platform-activity-row-PJJVATTZ.js.map} +1 -1
- package/dist/{queue-surface-implementation-ZHFI5JBP.js → queue-surface-implementation-67FS7FUI.js} +10 -9
- package/dist/{queue-surface-implementation-ZHFI5JBP.js.map → queue-surface-implementation-67FS7FUI.js.map} +1 -1
- package/dist/realtime/embedded-voice.d.ts +20 -0
- package/dist/realtime/realtime-control.d.ts +2 -0
- package/dist/realtime.js +22 -1332
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-34CJJNOY.js +21 -0
- package/dist/session-capability-policy.d.ts +20 -1
- package/dist/session-ui.js +32 -30
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +12 -11
- package/dist/sites.js +2 -1
- package/dist/terminal.js +6 -5
- package/dist/terminal.js.map +1 -1
- package/dist/timeline/index.d.ts +2 -0
- package/dist/timeline/retained-loaders.d.ts +27 -0
- package/dist/{timeline-annotation-markers-GNDHTGBD.js → timeline-annotation-markers-U3G66KUD.js} +5 -4
- package/dist/{timeline-annotation-markers-GNDHTGBD.js.map → timeline-annotation-markers-U3G66KUD.js.map} +1 -1
- package/dist/{timeline-annotation-selection-DMLMM2TX.js → timeline-annotation-selection-BI7QTPTZ.js} +4 -3
- package/dist/{timeline-annotation-selection-DMLMM2TX.js.map → timeline-annotation-selection-BI7QTPTZ.js.map} +1 -1
- package/dist/{timeline-annotations-dialog-ELRDBHTS.js → timeline-annotations-dialog-FOMHSDTE.js} +7 -6
- package/dist/{timeline-annotations-dialog-ELRDBHTS.js.map → timeline-annotations-dialog-FOMHSDTE.js.map} +1 -1
- package/dist/usage.js +6 -5
- package/dist/usage.js.map +1 -1
- package/dist/voice-recording-owner.d.ts +7 -0
- package/package.json +3 -3
- package/src/components/approval-surface.tsx +190 -79
- package/src/components/artifacts/session-artifact-viewer.tsx +4 -2
- package/src/components/composer-transcription-control.tsx +121 -25
- package/src/components/composer.tsx +1 -0
- package/src/components/markdown.tsx +7 -2
- package/src/components/message-timeline.tsx +10 -1
- package/src/components/open-geni-chat.tsx +53 -13
- package/src/components/session-conversation.tsx +273 -63
- package/src/components/session-list.tsx +9 -2
- package/src/components/session-proxy-scope.tsx +26 -5
- package/src/components/tool-action-review.tsx +502 -239
- package/src/components/tool-review-history.tsx +18 -43
- package/src/composer-voice-events.ts +12 -0
- package/src/connection-discovery.tsx +4 -1
- package/src/hooks/use-client-config-flags.ts +110 -0
- package/src/hooks/use-goal.ts +12 -1
- package/src/hooks/use-realtime-voice-models.ts +67 -0
- package/src/hooks/use-session-events.ts +19 -16
- package/src/hooks/use-transcription.ts +6 -0
- package/src/hooks/use-voice-input.ts +115 -18
- package/src/index.ts +9 -0
- package/src/realtime/embedded-voice.tsx +81 -0
- package/src/realtime/realtime-control.tsx +109 -17
- package/src/session-capability-policy.ts +119 -6
- package/src/timeline/index.ts +10 -0
- package/src/timeline/retained-loaders.ts +86 -0
- package/src/timeline/tool-display-name.ts +5 -1
- package/src/timeline/tool-renderers.tsx +143 -10
- package/src/voice-recording-owner.ts +22 -0
- package/styles/compiled.css +135 -37
- package/styles/index.css +49 -0
- package/styles/responsive.css +61 -4
- package/styles/session-capability.css +1 -1
- package/styles/tokens.css +1 -1
- package/dist/browser-viewer-SHYKQRNX.js +0 -16
- package/dist/chat-interactive-block-UGBTNB3L.js +0 -11
- package/dist/chunk-742CZ3L3.js.map +0 -1
- package/dist/chunk-CY7WK5FD.js.map +0 -1
- package/dist/chunk-I7IWRQLN.js.map +0 -1
- package/dist/chunk-IWIDV7SB.js +0 -1
- package/dist/chunk-PGSX7UCP.js.map +0 -1
- package/dist/chunk-TMYGL6X5.js.map +0 -1
- package/dist/chunk-WWEUO2PL.js.map +0 -1
- package/dist/computer-viewer-6SRGWRUX.js +0 -19
- package/dist/model-policy-picker-menu-DXHUL73H.js +0 -14
- package/dist/sandbox-files-GORZOUUJ.js +0 -20
- /package/dist/{browser-viewer-SHYKQRNX.js.map → browser-viewer-WGJ43YGI.js.map} +0 -0
- /package/dist/{chat-interactive-block-UGBTNB3L.js.map → chat-interactive-block-ZFHOKTMS.js.map} +0 -0
- /package/dist/{chunk-IWIDV7SB.js.map → chunk-M357MHH3.js.map} +0 -0
- /package/dist/{computer-viewer-6SRGWRUX.js.map → computer-viewer-46UIN7F3.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-DXHUL73H.js.map → model-policy-picker-menu-WRNSRFQC.js.map} +0 -0
- /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
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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:
|
|
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
|
-
{
|
|
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,
|