@flamingo-stack/openframe-frontend-core 0.0.751 → 0.0.753
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/dist/build/export-map.json +1 -1
- package/dist/{chunk-FHT7SMA7.cjs → chunk-35BJY5RR.cjs} +47 -47
- package/dist/{chunk-ALPRQ3ZX.cjs → chunk-3GG3QAPT.cjs} +15 -15
- package/dist/{chunk-34TWK3JE.cjs → chunk-5E6JHOGX.cjs} +3 -3
- package/dist/{chunk-OFO75R2O.cjs → chunk-7Z4EQOIX.cjs} +174 -174
- package/dist/{chunk-C6LPOYDM.cjs → chunk-AG4HR6Z6.cjs} +8 -8
- package/dist/{chunk-XJ3J4UIS.cjs → chunk-B27XV2TC.cjs} +19 -19
- package/dist/{chunk-MJFTWHV6.cjs → chunk-C6JHDRK3.cjs} +6 -6
- package/dist/{chunk-2YXOD2KL.cjs → chunk-H3RYUTND.cjs} +5 -0
- package/dist/{chunk-53I4YHRT.cjs → chunk-ITQZK3UT.cjs} +3 -3
- package/dist/{chunk-H52GKJ36.cjs → chunk-J3E5UN2O.cjs} +19 -19
- package/dist/{chunk-5WC535NJ.cjs → chunk-JLAYELWS.cjs} +40 -40
- package/dist/{chunk-UGCRLRCT.cjs → chunk-NO5UJLLQ.cjs} +2 -5
- package/dist/{chunk-5P7WBA2U.cjs → chunk-QXQHCX2R.cjs} +4 -4
- package/dist/{chunk-ESRA7NUI.cjs → chunk-R45NJ5ZA.cjs} +90 -90
- package/dist/{chunk-CVBHB4OZ.cjs → chunk-RGYLC3US.cjs} +7 -7
- package/dist/{chunk-TPH4SRR2.cjs → chunk-SDF5UUTE.cjs} +800 -659
- package/dist/{chunk-3TELPOVH.cjs → chunk-T4BBZ5ST.cjs} +2 -2
- package/dist/{chunk-CLAJIQ7E.cjs → chunk-UNRNLSG4.cjs} +19 -19
- package/dist/{chunk-NOUROZYH.cjs → chunk-UVTJT5BK.cjs} +24 -24
- package/dist/{chunk-77IKUBSH.cjs → chunk-W77VPNBJ.cjs} +12 -12
- package/dist/{chunk-DGEB5GUZ.cjs → chunk-WBOHLXFC.cjs} +2 -2
- package/dist/{chunk-X4LAMJHD.cjs → chunk-WIT36ZTN.cjs} +113 -113
- package/dist/{chunk-QOONZMSQ.cjs → chunk-XSOGT6DF.cjs} +28 -28
- package/dist/{chunk-LIGDPFDM.cjs → chunk-XW6WSW36.cjs} +771 -771
- package/dist/{chunk-4WNBVNGP.cjs → chunk-Y7AZCDLZ.cjs} +20 -20
- package/dist/{chunk-SDOCZTST.cjs → chunk-Z6TUOE6L.cjs} +41 -41
- package/dist/{chunk-RVLQHSID.cjs → chunk-ZGADZHLD.cjs} +101 -101
- package/dist/{chunk-MU7FFN6M.cjs → chunk-ZJ77IOMY.cjs} +83 -83
- package/dist/{cloud-tenants-JDPC2DYF.cjs → cloud-tenants-7LTS4DAP.cjs} +11 -11
- package/dist/components/case-studies/index.cjs +24 -24
- package/dist/components/chat/chat-dialog-menu-items.js +6 -6
- package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
- package/dist/components/chat/chat-message-enhanced.js +3 -0
- package/dist/components/chat/chat-panel-context.d.ts +3 -0
- package/dist/components/chat/chat-panel-context.d.ts.map +1 -1
- package/dist/components/chat/embeddable-chat.d.ts +20 -0
- package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
- package/dist/components/chat/embeddable-chat.js +78 -8
- package/dist/components/chat/hooks/index.d.ts +1 -0
- package/dist/components/chat/hooks/index.d.ts.map +1 -1
- package/dist/components/chat/hooks/index.js +1 -0
- package/dist/components/chat/hooks/use-what-to-ask.d.ts +69 -0
- package/dist/components/chat/hooks/use-what-to-ask.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-what-to-ask.js +106 -0
- package/dist/components/chat/index.cjs +15 -7
- package/dist/components/chat/index.d.ts +1 -0
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +1 -0
- package/dist/components/chat/mingo-chat-header.d.ts +4 -2
- package/dist/components/chat/mingo-chat-header.d.ts.map +1 -1
- package/dist/components/chat/mingo-chat-header.js +7 -2
- package/dist/components/chat/suggestions-display.d.ts +11 -0
- package/dist/components/chat/suggestions-display.d.ts.map +1 -0
- package/dist/components/chat/suggestions-display.js +27 -0
- package/dist/components/chat/types/message.types.d.ts +27 -1
- package/dist/components/chat/types/message.types.d.ts.map +1 -1
- package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
- package/dist/components/chat/utils/extract-incomplete-message-state.js +2 -0
- package/dist/components/chat/utils/message-segment-accumulator.d.ts.map +1 -1
- package/dist/components/chat/utils/message-segment-accumulator.js +3 -0
- package/dist/components/contact/index.cjs +12 -12
- package/dist/components/docs/index.cjs +15 -15
- package/dist/components/embeds/index.cjs +12 -12
- package/dist/components/faq/index.cjs +13 -13
- package/dist/components/features/index.cjs +11 -11
- package/dist/components/help-center-pages/index.cjs +112 -112
- package/dist/components/index.cjs +69 -61
- package/dist/components/loading/loading-region.d.ts.map +1 -1
- package/dist/components/loading/loading-region.js +2 -5
- package/dist/components/loading/unified-skeleton.d.ts +2 -0
- package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
- package/dist/components/loading/unified-skeleton.js +5 -0
- package/dist/components/meeting-scheduler/index.cjs +72 -72
- package/dist/components/navigation/index.cjs +14 -14
- package/dist/components/onboarding-guides/index.cjs +14 -14
- package/dist/components/product-demo/index.cjs +12 -12
- package/dist/components/related-content/index.cjs +7 -7
- package/dist/components/tickets/index.cjs +17 -17
- package/dist/components/ui/file-manager/index.cjs +30 -30
- package/dist/components/ui/index.cjs +19 -11
- package/dist/{devices-ADQWD37J.cjs → devices-CGDJAYRB.cjs} +12 -12
- package/dist/{embeddable-chat-7YF2JMPS.cjs → embeddable-chat-CMEHSDV7.cjs} +165 -93
- package/dist/index.cjs +23 -15
- package/dist/{knowledge-TNS64EGK.cjs → knowledge-X5I4QJKV.cjs} +12 -12
- package/dist/{logs-754MDDE4.cjs → logs-GDGIRJFI.cjs} +19 -19
- package/dist/{policies-Q23DPIH6.cjs → policies-2UOCENDX.cjs} +15 -15
- package/dist/{remote-session-ZKP2W3IS.cjs → remote-session-57DGC4X3.cjs} +6 -6
- package/dist/{scripts-DCYLK2RZ.cjs → scripts-AS4GEG6L.cjs} +18 -18
- package/dist/{software-update-XCMGUIER.cjs → software-update-ADPUFMFY.cjs} +15 -15
- package/dist/{tickets-board-BNW4AYFL.cjs → tickets-board-EP6L3BSV.cjs} +7 -7
- package/package.json +1 -1
- package/src/components/chat/chat-dialog-menu-items.tsx +6 -6
- package/src/components/chat/chat-message-enhanced.tsx +3 -0
- package/src/components/chat/chat-panel-context.tsx +3 -0
- package/src/components/chat/embeddable-chat.tsx +132 -9
- package/src/components/chat/hooks/index.ts +1 -0
- package/src/components/chat/hooks/use-what-to-ask.ts +203 -0
- package/src/components/chat/index.ts +1 -0
- package/src/components/chat/mingo-chat-header.tsx +11 -4
- package/src/components/chat/suggestions-display.tsx +41 -0
- package/src/components/chat/types/message.types.ts +31 -1
- package/src/components/chat/utils/extract-incomplete-message-state.ts +2 -0
- package/src/components/chat/utils/message-segment-accumulator.ts +4 -0
- package/src/components/loading/loading-region.tsx +4 -9
- package/src/components/loading/unified-skeleton.tsx +13 -0
|
@@ -4,16 +4,16 @@
|
|
|
4
4
|
var _chunkDTKGIG4Acjs = require('../../chunk-DTKGIG4A.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkUVTJT5BKcjs = require('../../chunk-UVTJT5BK.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
var
|
|
14
|
-
require('../../chunk-
|
|
13
|
+
var _chunkXW6WSW36cjs = require('../../chunk-XW6WSW36.cjs');
|
|
14
|
+
require('../../chunk-AG4HR6Z6.cjs');
|
|
15
15
|
require('../../chunk-NTGIQP7O.cjs');
|
|
16
|
-
require('../../chunk-
|
|
16
|
+
require('../../chunk-3GG3QAPT.cjs');
|
|
17
17
|
require('../../chunk-HQQE74RO.cjs');
|
|
18
18
|
require('../../chunk-DEY6XXGO.cjs');
|
|
19
19
|
require('../../chunk-VUWPLQBY.cjs');
|
|
@@ -21,13 +21,13 @@ require('../../chunk-LU7TD6QS.cjs');
|
|
|
21
21
|
require('../../chunk-24I6RFVU.cjs');
|
|
22
22
|
require('../../chunk-A6P6DHEZ.cjs');
|
|
23
23
|
require('../../chunk-MZ4KBSH7.cjs');
|
|
24
|
-
require('../../chunk-
|
|
24
|
+
require('../../chunk-T4BBZ5ST.cjs');
|
|
25
25
|
require('../../chunk-YUMFVQIN.cjs');
|
|
26
|
-
require('../../chunk-
|
|
26
|
+
require('../../chunk-WIT36ZTN.cjs');
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
var
|
|
30
|
+
var _chunkSDF5UUTEcjs = require('../../chunk-SDF5UUTE.cjs');
|
|
31
31
|
require('../../chunk-LVO7FALW.cjs');
|
|
32
32
|
require('../../chunk-3RFQPQ7Z.cjs');
|
|
33
33
|
require('../../chunk-YRULLK7N.cjs');
|
|
@@ -1838,12 +1838,12 @@ require('../../chunk-7DNL734S.cjs');
|
|
|
1838
1838
|
require('../../chunk-WWUSFOJ7.cjs');
|
|
1839
1839
|
require('../../chunk-SKI6NKOE.cjs');
|
|
1840
1840
|
require('../../chunk-EWPR7662.cjs');
|
|
1841
|
-
require('../../chunk-
|
|
1841
|
+
require('../../chunk-B27XV2TC.cjs');
|
|
1842
1842
|
|
|
1843
1843
|
|
|
1844
1844
|
|
|
1845
1845
|
|
|
1846
|
-
var
|
|
1846
|
+
var _chunk7Z4EQOIXcjs = require('../../chunk-7Z4EQOIX.cjs');
|
|
1847
1847
|
require('../../chunk-QYLIHZKZ.cjs');
|
|
1848
1848
|
require('../../chunk-63N4FN5V.cjs');
|
|
1849
1849
|
require('../../chunk-L2IQESTQ.cjs');
|
|
@@ -1869,7 +1869,7 @@ require('../../chunk-K6VWTUCH.cjs');
|
|
|
1869
1869
|
require('../../chunk-MGF3FUKD.cjs');
|
|
1870
1870
|
require('../../chunk-Z74QE57T.cjs');
|
|
1871
1871
|
require('../../chunk-XZJCBIYR.cjs');
|
|
1872
|
-
require('../../chunk-
|
|
1872
|
+
require('../../chunk-NO5UJLLQ.cjs');
|
|
1873
1873
|
require('../../chunk-2QMBXGMQ.cjs');
|
|
1874
1874
|
require('../../chunk-V45KLJQP.cjs');
|
|
1875
1875
|
require('../../chunk-KHKPLOU4.cjs');
|
|
@@ -1877,12 +1877,12 @@ require('../../chunk-L4UI63K6.cjs');
|
|
|
1877
1877
|
require('../../chunk-OF336YWG.cjs');
|
|
1878
1878
|
require('../../chunk-3LU4UFPS.cjs');
|
|
1879
1879
|
require('../../chunk-RB6BSE3O.cjs');
|
|
1880
|
-
require('../../chunk-
|
|
1880
|
+
require('../../chunk-H3RYUTND.cjs');
|
|
1881
1881
|
require('../../chunk-3ATAYP36.cjs');
|
|
1882
1882
|
|
|
1883
1883
|
// src/components/case-studies/share-experience-section.tsx
|
|
1884
1884
|
var _jsxruntime = require('react/jsx-runtime');
|
|
1885
|
-
var DEFAULT_TITLE = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1885
|
+
var DEFAULT_TITLE = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk7Z4EQOIXcjs.HeadingLines, { children: [
|
|
1886
1886
|
"Share Your Experience",
|
|
1887
1887
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
1888
1888
|
"with Fellow MSPs",
|
|
@@ -1919,7 +1919,7 @@ function ShareExperienceSection({
|
|
|
1919
1919
|
} = {}) {
|
|
1920
1920
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: `flex flex-col gap-10${className ? ` ${className}` : ""}`, children: [
|
|
1921
1921
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "text-ods-text-primary", children: [
|
|
1922
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "text-ods-text-primary text-h1", children:
|
|
1922
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "text-ods-text-primary text-h1", children: _chunk7Z4EQOIXcjs.accentSentenceMarks.call(void 0, title) }),
|
|
1923
1923
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "mt-6 max-w-[765px] text-h4", children: subtitle })
|
|
1924
1924
|
] }),
|
|
1925
1925
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "rounded-md border border-ods-border bg-ods-bg p-10", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-10", children: [
|
|
@@ -1927,9 +1927,9 @@ function ShareExperienceSection({
|
|
|
1927
1927
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-h2", children: howItWorksTitle }),
|
|
1928
1928
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-h4", children: howItWorksBody })
|
|
1929
1929
|
] }),
|
|
1930
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
1930
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkXW6WSW36cjs.BenefitCardGrid, { columns: 4, children: [
|
|
1931
1931
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1932
|
-
|
|
1932
|
+
_chunkXW6WSW36cjs.BenefitCard,
|
|
1933
1933
|
{
|
|
1934
1934
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-12 w-12 items-center justify-center rounded-md border border-ods-border bg-ods-bg p-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMJQLBIZMcjs.G2Icon, { color: "var(--social-g2)", size: 24 }) }),
|
|
1935
1935
|
title: "G2",
|
|
@@ -1938,7 +1938,7 @@ function ShareExperienceSection({
|
|
|
1938
1938
|
}
|
|
1939
1939
|
),
|
|
1940
1940
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1941
|
-
|
|
1941
|
+
_chunkXW6WSW36cjs.BenefitCard,
|
|
1942
1942
|
{
|
|
1943
1943
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-12 w-12 items-center justify-center rounded-md border border-ods-border bg-ods-bg p-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkA2VKPXOBcjs.CapterraIcon, { size: 24 }) }),
|
|
1944
1944
|
title: "Capterra",
|
|
@@ -1947,7 +1947,7 @@ function ShareExperienceSection({
|
|
|
1947
1947
|
}
|
|
1948
1948
|
),
|
|
1949
1949
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1950
|
-
|
|
1950
|
+
_chunkXW6WSW36cjs.BenefitCard,
|
|
1951
1951
|
{
|
|
1952
1952
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-12 w-12 items-center justify-center rounded-md border border-ods-border bg-ods-bg p-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTLKSZG3Dcjs.TrustpilotIcon, { size: 24 }) }),
|
|
1953
1953
|
title: "TrustPilot",
|
|
@@ -1956,7 +1956,7 @@ function ShareExperienceSection({
|
|
|
1956
1956
|
}
|
|
1957
1957
|
),
|
|
1958
1958
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1959
|
-
|
|
1959
|
+
_chunkXW6WSW36cjs.BenefitCard,
|
|
1960
1960
|
{
|
|
1961
1961
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-12 w-12 items-center justify-center rounded-md border border-ods-border bg-ods-bg p-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkILYW6BQNcjs.GetappIcon, { size: 24 }) }),
|
|
1962
1962
|
title: "GetApp",
|
|
@@ -1965,7 +1965,7 @@ function ShareExperienceSection({
|
|
|
1965
1965
|
}
|
|
1966
1966
|
)
|
|
1967
1967
|
] }),
|
|
1968
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1968
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUVTJT5BKcjs.ContactForm, { ...DEFAULT_CONTACT_FORM_PROPS, ...contactFormProps })
|
|
1969
1969
|
] }) })
|
|
1970
1970
|
] });
|
|
1971
1971
|
}
|
|
@@ -1975,7 +1975,7 @@ function ShareExperienceSection({
|
|
|
1975
1975
|
function EntityQuotesPanel({ quotes, className }) {
|
|
1976
1976
|
if (!quotes || quotes.length === 0) return null;
|
|
1977
1977
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1978
|
-
|
|
1978
|
+
_chunkXW6WSW36cjs.StackedRowsPanel,
|
|
1979
1979
|
{
|
|
1980
1980
|
className,
|
|
1981
1981
|
title: `${_chunkDTKGIG4Acjs.ENTITY_QUOTES_TITLE} \xB7 ${quotes.length}`,
|
|
@@ -2004,7 +2004,7 @@ function EntityQuotesPanel({ quotes, className }) {
|
|
|
2004
2004
|
function QuoteCardsStrip({ quotes, className }) {
|
|
2005
2005
|
if (quotes.length === 0) return null;
|
|
2006
2006
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2007
|
-
|
|
2007
|
+
_chunkSDF5UUTEcjs.CardsStrip,
|
|
2008
2008
|
{
|
|
2009
2009
|
className,
|
|
2010
2010
|
showTitle: false,
|
|
@@ -2012,15 +2012,15 @@ function QuoteCardsStrip({ quotes, className }) {
|
|
|
2012
2012
|
items: [...quotes],
|
|
2013
2013
|
itemKey: (quote) => quote.key,
|
|
2014
2014
|
renderCard: (quote, ctx) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
2015
|
-
|
|
2015
|
+
_chunk7Z4EQOIXcjs.Card,
|
|
2016
2016
|
{
|
|
2017
2017
|
"aria-hidden": ctx.isClone || void 0,
|
|
2018
2018
|
onPointerEnter: ctx.isTouch ? void 0 : () => ctx.onActivate(ctx.cardKey),
|
|
2019
2019
|
onPointerLeave: ctx.isTouch ? void 0 : () => ctx.onDeactivate(ctx.cardKey),
|
|
2020
2020
|
className: "relative shrink-0 rounded-md border-ods-border bg-ods-card p-[var(--spacing-system-sf)] shadow-none hover:border-ods-border-hover",
|
|
2021
2021
|
children: [
|
|
2022
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2023
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2022
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXW6WSW36cjs.PersonCell, { size: "lg", name: `"${quote.text}"`, secondary: quote.attribution, avatarUrl: quote.logoUrl }),
|
|
2023
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkSDF5UUTEcjs.CardHitLayer, { href: quote.href, label: `${quote.text}, ${quote.attribution}`, decorative: ctx.isClone })
|
|
2024
2024
|
]
|
|
2025
2025
|
},
|
|
2026
2026
|
ctx.cardKey
|
|
@@ -9,18 +9,18 @@ function chatDialogMenuItems({
|
|
|
9
9
|
onArchive
|
|
10
10
|
}) {
|
|
11
11
|
const items = [
|
|
12
|
-
onCopyLink && {
|
|
13
|
-
id: "copy-link",
|
|
14
|
-
label: "Copy Chat Link",
|
|
15
|
-
icon: /* @__PURE__ */ jsx(Link01HorizontalIcon, { className: chatMenuIconClassName }),
|
|
16
|
-
onClick: onCopyLink
|
|
17
|
-
},
|
|
18
12
|
onRename && {
|
|
19
13
|
id: "rename",
|
|
20
14
|
label: "Rename Chat",
|
|
21
15
|
icon: /* @__PURE__ */ jsx(PenEditIcon, { className: chatMenuIconClassName }),
|
|
22
16
|
onClick: onRename
|
|
23
17
|
},
|
|
18
|
+
onCopyLink && {
|
|
19
|
+
id: "copy-link",
|
|
20
|
+
label: "Copy Chat Link",
|
|
21
|
+
icon: /* @__PURE__ */ jsx(Link01HorizontalIcon, { className: chatMenuIconClassName }),
|
|
22
|
+
onClick: onCopyLink
|
|
23
|
+
},
|
|
24
24
|
onCompact && {
|
|
25
25
|
id: "compact",
|
|
26
26
|
label: "Compact Chat Memory",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-message-enhanced.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-message-enhanced.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAuE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-message-enhanced.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-message-enhanced.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAuE,MAAM,OAAO,CAAC;AA6B5F,OAAO,KAAK,EAA8C,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAysBpG,QAAA,MAAM,2BAA2B,4FAiC/B,CAAC;AAIH,OAAO,EAAE,2BAA2B,IAAI,mBAAmB,EAAE,CAAC"}
|
|
@@ -21,6 +21,7 @@ import { EscalationOfferMessage } from "./escalation-offer-message.js";
|
|
|
21
21
|
import { remarkCardLinks } from "./remark-card-links.js";
|
|
22
22
|
import { remarkMentionChips } from "./remark-mention-chips.js";
|
|
23
23
|
import { remarkStripCitations } from "./remark-strip-citations.js";
|
|
24
|
+
import { SuggestionsDisplay } from "./suggestions-display.js";
|
|
24
25
|
import { SystemEventMessage } from "./system-event-message.js";
|
|
25
26
|
import { ThinkingDisplay } from "./thinking-display.js";
|
|
26
27
|
import { TicketEscalatedMessage } from "./ticket-escalated-message.js";
|
|
@@ -324,6 +325,8 @@ const ChatMessageEnhanced = forwardRef(
|
|
|
324
325
|
const run = askRuns.get(index);
|
|
325
326
|
if (!run) return null;
|
|
326
327
|
return /* @__PURE__ */ jsx(AskDisplay, { cards: run, onSelect: onAskSelect }, index);
|
|
328
|
+
} else if (segment.type === "suggestions") {
|
|
329
|
+
return /* @__PURE__ */ jsx(SuggestionsDisplay, { segment }, index);
|
|
327
330
|
} else if (segment.type === "tool_execution") {
|
|
328
331
|
return /* @__PURE__ */ jsx(
|
|
329
332
|
ToolExecutionDisplay,
|
|
@@ -2,6 +2,9 @@ export interface ChatPanelHandle {
|
|
|
2
2
|
/** Close the chat panel. Called by inline cards' nav click handler
|
|
3
3
|
* ONLY when the resolved navigation is same-tab. */
|
|
4
4
|
closeChat: () => void;
|
|
5
|
+
/** Send `text` in the panel's open chat (a new chat: the send creates it),
|
|
6
|
+
* leaving the composer's draft alone. Used by `suggestions` chips. */
|
|
7
|
+
sendPrompt?: (text: string) => void;
|
|
5
8
|
}
|
|
6
9
|
export declare const ChatPanelContext: import("react").Context<ChatPanelHandle | null>;
|
|
7
10
|
/** Optional consumer — returns `null` when no provider mounted. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-panel-context.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-panel-context.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,eAAe;IAC9B;yDACqD;IACrD,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-panel-context.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-panel-context.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,eAAe;IAC9B;yDACqD;IACrD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB;2EACuE;IACvE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,gBAAgB,iDAA8C,CAAC;AAE5E,mEAAmE;AACnE,wBAAgB,YAAY,IAAI,eAAe,GAAG,IAAI,CAErD"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { type ActionsMenuItem } from '../ui/actions-menu';
|
|
2
3
|
import { type ChatComposerLock } from './chat-composer';
|
|
3
4
|
import type { ChatCardDispatchExtras } from './entity-cards/dispatch';
|
|
4
5
|
import { type GuideWelcomeProps } from './guide-welcome';
|
|
5
6
|
import { type ChatMode, type UseUnifiedChatModes } from './hooks/use-unified-chat';
|
|
7
|
+
import { type WhatToAskContent } from './hooks/use-what-to-ask';
|
|
6
8
|
import { type MingoDialogStatus } from './mingo-chat-rail';
|
|
7
9
|
import { type MingoWelcomeProps } from './mingo-welcome';
|
|
8
10
|
import { type ChatAppearance } from './types/chat.types';
|
|
@@ -320,6 +322,24 @@ export interface EmbeddableChatProps {
|
|
|
320
322
|
* guided tour in a conversation of its own) points it there instead.
|
|
321
323
|
*/
|
|
322
324
|
onWhatToAsk?: () => void;
|
|
325
|
+
/**
|
|
326
|
+
* v2: the "What to ask?" exchange the list's entry shows (when no
|
|
327
|
+
* `onWhatToAsk` takes it over): added at the end of the open conversation,
|
|
328
|
+
* or a new chat opens with it. Local - never sent, never stored. Picking a
|
|
329
|
+
* chip sends its prompt in that chat, like a quick action.
|
|
330
|
+
*
|
|
331
|
+
* A function is called on each click and the exchange appears, whole, once
|
|
332
|
+
* its promise settles (prompts built from live data, e.g. the workspace's
|
|
333
|
+
* devices); clicks while one is pending are ignored. It should not reject:
|
|
334
|
+
* a rejection is logged and shows nothing.
|
|
335
|
+
*/
|
|
336
|
+
whatToAsk?: WhatToAskContent | (() => Promise<WhatToAskContent>);
|
|
337
|
+
/**
|
|
338
|
+
* v2: items in the chat's ⋯ menu after its own, past a separator - actions
|
|
339
|
+
* that are not about the chat (e.g. the host's onboarding reset). Shown in
|
|
340
|
+
* every chat that is not archived, a new one included.
|
|
341
|
+
*/
|
|
342
|
+
chatMenuExtraItems?: ActionsMenuItem[];
|
|
323
343
|
}
|
|
324
344
|
/**
|
|
325
345
|
* EmbeddableChat — the floating "Ask AI" button + Mingo chat panel.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddable-chat.d.ts","sourceRoot":"","sources":["../../../src/components/chat/embeddable-chat.tsx"],"names":[],"mappings":"AAyCA,OAAO,KAAiF,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"embeddable-chat.d.ts","sourceRoot":"","sources":["../../../src/components/chat/embeddable-chat.tsx"],"names":[],"mappings":"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"}
|
|
@@ -55,6 +55,7 @@ import { useCloseOnNavigation } from "./hooks/use-close-on-navigation.js";
|
|
|
55
55
|
import { useEmptyStateConfig } from "./hooks/use-empty-state-config.js";
|
|
56
56
|
import { fetchSlashCommands, useSlashCommandRegistry } from "./hooks/use-slash-commands.js";
|
|
57
57
|
import { useUnifiedChat } from "./hooks/use-unified-chat.js";
|
|
58
|
+
import { awaitsDecision, useWhatToAsk } from "./hooks/use-what-to-ask.js";
|
|
58
59
|
import { MingoArchiveList } from "./mingo-archive-list.js";
|
|
59
60
|
import { MingoChatHeader } from "./mingo-chat-header.js";
|
|
60
61
|
import { ChatDialogModals } from "./mingo-chat-modals.js";
|
|
@@ -66,7 +67,7 @@ import { MingoWelcome } from "./mingo-welcome.js";
|
|
|
66
67
|
import { NavLinkAnchorViaRuntime } from "./nav-link-anchor-via-runtime.js";
|
|
67
68
|
import { accentFromIdentityIcon, getAgentAccent } from "./quick-action-chip.js";
|
|
68
69
|
import { SourceActionButton } from "./source-action-button.js";
|
|
69
|
-
import { CHAT_APPEARANCE } from "./types/chat.types.js";
|
|
70
|
+
import { AUTHOR_TYPE, CHAT_APPEARANCE } from "./types/chat.types.js";
|
|
70
71
|
import { ASK_AI_OPEN_EVENT, ASK_AI_OPEN_WITH_REF_EVENT, chatListensForAskAiOpens } from "./utils/ask-ai-events.js";
|
|
71
72
|
import { formatChatAttachmentMarkdownForBubble } from "./utils/chat-attachment-markdown.js";
|
|
72
73
|
import { resolveHrefForRuntime } from "./utils/chat-nav-resolution.js";
|
|
@@ -441,6 +442,8 @@ function EmbeddableChatInner({
|
|
|
441
442
|
contextMemory,
|
|
442
443
|
aboveComposer,
|
|
443
444
|
onWhatToAsk,
|
|
445
|
+
whatToAsk: whatToAskContent,
|
|
446
|
+
chatMenuExtraItems,
|
|
444
447
|
handleRef
|
|
445
448
|
}) {
|
|
446
449
|
const shellLess = shell !== "drawer";
|
|
@@ -747,8 +750,13 @@ function EmbeddableChatInner({
|
|
|
747
750
|
navigatingAwayRef.current = true;
|
|
748
751
|
setIsOpen(false);
|
|
749
752
|
}, [setIsOpen]);
|
|
753
|
+
const sendPromptRef = useRef(() => {
|
|
754
|
+
});
|
|
750
755
|
const chatPanelHandle = useMemo(
|
|
751
|
-
() => ({
|
|
756
|
+
() => ({
|
|
757
|
+
closeChat: handleNavigationClose,
|
|
758
|
+
sendPrompt: (text) => sendPromptRef.current(text)
|
|
759
|
+
}),
|
|
752
760
|
[handleNavigationClose]
|
|
753
761
|
);
|
|
754
762
|
const askAboutRef = useRef(discussRef);
|
|
@@ -770,15 +778,29 @@ function EmbeddableChatInner({
|
|
|
770
778
|
const [timestampCache] = useState(() => /* @__PURE__ */ new Map());
|
|
771
779
|
const guideUserName = activeMode === "guide" ? [identityUser?.firstName, identityUser?.lastName].filter(Boolean).join(" ").trim() || identityUser?.name?.trim() || void 0 : void 0;
|
|
772
780
|
const guideUserAvatar = activeMode === "guide" ? identityUser?.avatarUrl?.trim() || void 0 : void 0;
|
|
773
|
-
const
|
|
781
|
+
const hostMessages = useMemo(() => {
|
|
774
782
|
const options = { userName: guideUserName, userAvatar: guideUserAvatar, timestampCache };
|
|
775
783
|
const mapped = rawMessages.map((m) => mapHostMessage(m, options));
|
|
776
784
|
pruneTimestampCache(timestampCache, new Set(rawMessages.map((m) => m.id)));
|
|
777
785
|
return mapped;
|
|
778
786
|
}, [rawMessages, guideUserName, guideUserAvatar, timestampCache]);
|
|
787
|
+
const whatToAsk = useWhatToAsk({
|
|
788
|
+
dialogId: activeDialogId,
|
|
789
|
+
content: typeof whatToAskContent === "function" ? void 0 : whatToAskContent,
|
|
790
|
+
user: {
|
|
791
|
+
name: headerUserName ?? "You",
|
|
792
|
+
avatar: identityUser?.avatarUrl?.trim() || userAvatarUrl?.trim() || null,
|
|
793
|
+
authorType: AUTHOR_TYPE.ADMIN
|
|
794
|
+
},
|
|
795
|
+
assistant: { name: "Mingo", assistantType: "mingo" }
|
|
796
|
+
});
|
|
797
|
+
const noteWhatToAskSend = whatToAsk.noteSend;
|
|
798
|
+
const messages = whatToAsk.withExchanges(hostMessages);
|
|
799
|
+
const isWhatToAskDraft = activeDialogId == null && hostMessages.length === 0 && messages.length > 0;
|
|
779
800
|
const handleSend = useCallback(
|
|
780
801
|
(text) => {
|
|
781
802
|
if (composerLock) return;
|
|
803
|
+
noteWhatToAskSend();
|
|
782
804
|
let augmentedText = text;
|
|
783
805
|
if (readyAttachments.length > 0) {
|
|
784
806
|
const markdown = readyAttachments.map((att) => formatChatAttachmentMarkdownForBubble(att, viewUrlPrefix)).join("");
|
|
@@ -797,7 +819,7 @@ function EmbeddableChatInner({
|
|
|
797
819
|
setContextItems([]);
|
|
798
820
|
}
|
|
799
821
|
},
|
|
800
|
-
[composerLock, sendMessage, readyAttachments, viewUrlPrefix, clearAttachments, contextItems]
|
|
822
|
+
[composerLock, noteWhatToAskSend, sendMessage, readyAttachments, viewUrlPrefix, clearAttachments, contextItems]
|
|
801
823
|
);
|
|
802
824
|
const handleAskSelect = useCallback(
|
|
803
825
|
(label) => {
|
|
@@ -1021,7 +1043,11 @@ function EmbeddableChatInner({
|
|
|
1021
1043
|
const freshConversationTitle = isGuideEmpty ? headerAssistantName ?? "Mingo Guide" : "New Chat";
|
|
1022
1044
|
const headerTitle = hasConversation ? activeDialog?.title || freshConversationTitle : isGuideEmpty ? freshConversationTitle : "Current Chats";
|
|
1023
1045
|
const headerBackAriaLabel = hasConversation ? isViewingArchived ? "Back to archive" : "Back" : "Back to Mingo";
|
|
1024
|
-
const
|
|
1046
|
+
const clearWhatToAskDraft = whatToAsk.clearDraft;
|
|
1047
|
+
const headerOnBack = hasConversation ? () => {
|
|
1048
|
+
if (activeDialogId == null) clearWhatToAskDraft();
|
|
1049
|
+
handleBack();
|
|
1050
|
+
} : () => handleActiveModeChange("mingo");
|
|
1025
1051
|
const headerOnRestore = isViewingArchived && unarchiveDialog && activeDialog ? () => setRestoreTarget(activeDialog) : void 0;
|
|
1026
1052
|
const headerOnRename = activeDialogId && activeDialog && mingoCaps.canRename ? () => setRenameTarget(activeDialog) : void 0;
|
|
1027
1053
|
const headerOnArchive = activeDialogId && activeDialog && mingoCaps.canArchive ? () => setArchiveTarget(activeDialog) : void 0;
|
|
@@ -1033,8 +1059,50 @@ function EmbeddableChatInner({
|
|
|
1033
1059
|
const headerPersonAvatarUrl = headerOwner ? headerOwner.avatarUrl?.trim() || void 0 : identityUser?.avatarUrl?.trim() || userAvatarUrl?.trim() || void 0;
|
|
1034
1060
|
const headerAvatar = headerPersonName || headerPersonAvatarUrl ? { name: headerPersonName, avatarUrl: headerPersonAvatarUrl } : void 0;
|
|
1035
1061
|
const handleNewChat = useCallback(() => {
|
|
1062
|
+
clearWhatToAskDraft();
|
|
1036
1063
|
resetToNewChat();
|
|
1037
|
-
}, [resetToNewChat]);
|
|
1064
|
+
}, [clearWhatToAskDraft, resetToNewChat]);
|
|
1065
|
+
const activeDialogStatus = activeDialog && dialogStatusOf ? dialogStatusOf(activeDialog) : void 0;
|
|
1066
|
+
const isChatBlocked = !!composerLock || chatLoading || activeDialogStatus === "working" || activeDialogStatus === "approval" || (pendingApprovals?.length ?? 0) > 0 || awaitsDecision(hostMessages);
|
|
1067
|
+
const showWhatToAsk = (content) => {
|
|
1068
|
+
if (activeDialogId && hasConversation && !isViewingArchived && !isMessagesLoading && !isChatBlocked) {
|
|
1069
|
+
whatToAsk.ask("current", content);
|
|
1070
|
+
return;
|
|
1071
|
+
}
|
|
1072
|
+
const isUnsentNewChat = activeDialogId == null && hostMessages.length === 0 && !isViewingArchived;
|
|
1073
|
+
if (!isUnsentNewChat) {
|
|
1074
|
+
whatToAsk.clearDraft();
|
|
1075
|
+
resetToNewChat();
|
|
1076
|
+
}
|
|
1077
|
+
setComposeOpen(true);
|
|
1078
|
+
whatToAsk.ask("draft", content);
|
|
1079
|
+
};
|
|
1080
|
+
useEffect(() => {
|
|
1081
|
+
sendPromptRef.current = (text) => {
|
|
1082
|
+
if (isChatBlocked) return;
|
|
1083
|
+
noteWhatToAskSend();
|
|
1084
|
+
void sendMessage(text).catch((err) => {
|
|
1085
|
+
console.error("[EmbeddableChat] sendPrompt failed:", err);
|
|
1086
|
+
});
|
|
1087
|
+
};
|
|
1088
|
+
});
|
|
1089
|
+
const showWhatToAskRef = useRef(showWhatToAsk);
|
|
1090
|
+
useEffect(() => {
|
|
1091
|
+
showWhatToAskRef.current = showWhatToAsk;
|
|
1092
|
+
});
|
|
1093
|
+
const whatToAskPendingRef = useRef(false);
|
|
1094
|
+
const requestWhatToAsk = () => {
|
|
1095
|
+
if (!whatToAskContent) return;
|
|
1096
|
+
if (typeof whatToAskContent !== "function") {
|
|
1097
|
+
showWhatToAsk(whatToAskContent);
|
|
1098
|
+
return;
|
|
1099
|
+
}
|
|
1100
|
+
if (whatToAskPendingRef.current) return;
|
|
1101
|
+
whatToAskPendingRef.current = true;
|
|
1102
|
+
whatToAskContent().then((content) => showWhatToAskRef.current(content)).catch((err) => console.error("[EmbeddableChat] whatToAsk failed:", err)).finally(() => {
|
|
1103
|
+
whatToAskPendingRef.current = false;
|
|
1104
|
+
});
|
|
1105
|
+
};
|
|
1038
1106
|
const queuedAskRef = useRef(null);
|
|
1039
1107
|
useEffect(() => {
|
|
1040
1108
|
askAboutRef.current = (reference) => {
|
|
@@ -1146,13 +1214,14 @@ function EmbeddableChatInner({
|
|
|
1146
1214
|
dialogs,
|
|
1147
1215
|
activeDialogId: activeDialogId ?? void 0,
|
|
1148
1216
|
// Beside a new chat (wide only: narrow, the list is its own screen).
|
|
1149
|
-
|
|
1217
|
+
// A new chat holding only "What to ask?" exchanges is still that new chat.
|
|
1218
|
+
draftTitle: wideMingo && (!hasConversation || isWhatToAskDraft) && !archiveOpen ? freshConversationTitle : void 0,
|
|
1150
1219
|
onSelectDialog: (id) => leaveArchiveThen(() => handleSelectDialog(id))(),
|
|
1151
1220
|
onNewChat: leaveArchiveThen(handleNewChat),
|
|
1152
1221
|
onOpenArchive: headerOnOpenArchive && (archiveOpen ? closeArchive : headerOnOpenArchive),
|
|
1153
1222
|
archiveActive: archiveOpen,
|
|
1154
1223
|
// The suggestions a new chat opens on, unless the host has a surface of its own.
|
|
1155
|
-
onWhatToAsk: leaveArchiveThen(onWhatToAsk ?? handleNewChat),
|
|
1224
|
+
onWhatToAsk: () => leaveArchiveThen(onWhatToAsk ?? (whatToAskContent ? requestWhatToAsk : handleNewChat))(),
|
|
1156
1225
|
statusOf: dialogStatusOf,
|
|
1157
1226
|
onRequestRename: mingoCaps.canRename ? setRenameTarget : void 0,
|
|
1158
1227
|
onRequestArchive: mingoCaps.canArchive ? setArchiveTarget : void 0,
|
|
@@ -1180,6 +1249,7 @@ function EmbeddableChatInner({
|
|
|
1180
1249
|
onToggleList: wideMingo ? toggleRailCollapsed : headerShowBack ? headerOnBack : () => setComposeOpen(false),
|
|
1181
1250
|
listOpen: splitActive,
|
|
1182
1251
|
menuItems: headerShowBack && !isViewingArchived ? splitHeaderMenuItems : [],
|
|
1252
|
+
extraMenuItems: isViewingArchived || archiveOpen ? void 0 : chatMenuExtraItems,
|
|
1183
1253
|
onRestore: isViewingArchived ? headerOnRestore : void 0,
|
|
1184
1254
|
onCollapse: wideMingo && onCollapse ? () => {
|
|
1185
1255
|
if (collapseTo === "list" && hasConversation) headerOnBack();
|
|
@@ -10,6 +10,7 @@ export * from './use-chat-attachment-image-gallery';
|
|
|
10
10
|
export * from './use-chat-identity';
|
|
11
11
|
export * from './use-chat-card-item';
|
|
12
12
|
export * from './use-close-on-navigation';
|
|
13
|
+
export * from './use-what-to-ask';
|
|
13
14
|
export * from './use-chat';
|
|
14
15
|
export * from './use-sse';
|
|
15
16
|
export * from './use-sse-chat-adapter';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/hooks/index.ts"],"names":[],"mappings":"AAEA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAG/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/hooks/index.ts"],"names":[],"mappings":"AAEA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAG/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAKlC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAM1B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AAExC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AAMpC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EACL,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAC"}
|
|
@@ -10,6 +10,7 @@ export * from "./use-chat-attachment-image-gallery.js";
|
|
|
10
10
|
export * from "./use-chat-identity.js";
|
|
11
11
|
export * from "./use-chat-card-item.js";
|
|
12
12
|
export * from "./use-close-on-navigation.js";
|
|
13
|
+
export * from "./use-what-to-ask.js";
|
|
13
14
|
export * from "./use-chat.js";
|
|
14
15
|
export * from "./use-sse.js";
|
|
15
16
|
export * from "./use-sse-chat-adapter.js";
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { AssistantType, AuthorType } from '../types/chat.types';
|
|
2
|
+
import type { Message, SuggestionGroup } from '../types/message.types';
|
|
3
|
+
/**
|
|
4
|
+
* The "What to ask?" exchange: the question the user is shown asking, and the
|
|
5
|
+
* assistant's answer, a line of text over grouped prompt chips.
|
|
6
|
+
*/
|
|
7
|
+
export interface WhatToAskContent {
|
|
8
|
+
/** The user's side, e.g. "What can I ask you?". */
|
|
9
|
+
question: string;
|
|
10
|
+
/** The answer's text (markdown), above the chips. */
|
|
11
|
+
reply: string;
|
|
12
|
+
groups: SuggestionGroup[];
|
|
13
|
+
/** A line under the chips, e.g. how picking one works. */
|
|
14
|
+
note?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Who a side of the exchange is shown as. */
|
|
17
|
+
export interface WhatToAskAuthor {
|
|
18
|
+
name?: string;
|
|
19
|
+
avatar?: string | null;
|
|
20
|
+
authorType?: AuthorType;
|
|
21
|
+
assistantType?: AssistantType;
|
|
22
|
+
}
|
|
23
|
+
export interface UseWhatToAskOptions {
|
|
24
|
+
/** The open conversation; `null` for a new chat that has no dialog yet. */
|
|
25
|
+
dialogId: string | null | undefined;
|
|
26
|
+
/** What an exchange shows unless `ask` is handed its own. */
|
|
27
|
+
content?: WhatToAskContent;
|
|
28
|
+
user?: WhatToAskAuthor;
|
|
29
|
+
assistant?: WhatToAskAuthor;
|
|
30
|
+
/** Where a picked prompt goes (typically: sent). Absent: sent in the surrounding chat panel. */
|
|
31
|
+
onPick?: (prompt: string) => void;
|
|
32
|
+
}
|
|
33
|
+
export interface WhatToAsk {
|
|
34
|
+
/**
|
|
35
|
+
* Show the exchange: at the end of the open conversation (`'current'`), or
|
|
36
|
+
* in the new chat (`'draft'`), which then reads as a conversation until it
|
|
37
|
+
* is sent or left. `content` overrides the hook's for this exchange (e.g.
|
|
38
|
+
* prompts built from live data); each exchange keeps what it was shown
|
|
39
|
+
* with. No-op without either.
|
|
40
|
+
*/
|
|
41
|
+
ask: (target: 'current' | 'draft', content?: WhatToAskContent) => void;
|
|
42
|
+
/** The thread with the exchanges of the open conversation (or the new chat) merged in by time. */
|
|
43
|
+
withExchanges: (messages: Message[]) => Message[];
|
|
44
|
+
/** Call before sending: a new chat's exchanges then move into the dialog the send creates. */
|
|
45
|
+
noteSend: () => void;
|
|
46
|
+
/** Drop the new chat's exchanges (the user started over or left it). */
|
|
47
|
+
clearDraft: () => void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Local "What to ask?" exchanges, per conversation: never sent, never stored,
|
|
51
|
+
* gone on reload. Each is a user message and an assistant message carrying a
|
|
52
|
+
* `suggestions` segment, built at render from the exchange's content. A new chat holds its
|
|
53
|
+
* own until a send gives it a dialog (they move there) or the user opens
|
|
54
|
+
* another conversation (they are dropped).
|
|
55
|
+
*/
|
|
56
|
+
export declare function useWhatToAsk({ dialogId, content, user, assistant, onPick }: UseWhatToAskOptions): WhatToAsk;
|
|
57
|
+
/**
|
|
58
|
+
* Whether the thread waits on the user before it can go on: an approval or an
|
|
59
|
+
* escalation offer nobody has answered. "What to ask?" opens a new chat then,
|
|
60
|
+
* rather than adding prompts to a conversation that cannot take them.
|
|
61
|
+
*/
|
|
62
|
+
export declare function awaitsDecision(messages: readonly Message[]): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Places each local message before the first thread message that is later
|
|
65
|
+
* than it, keeping the thread's own order. A thread message without a time
|
|
66
|
+
* never moves anything past it.
|
|
67
|
+
*/
|
|
68
|
+
export declare function mergeByTime(thread: Message[], local: Message[]): Message[];
|
|
69
|
+
//# sourceMappingURL=use-what-to-ask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-what-to-ask.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/hooks/use-what-to-ask.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEvE;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,gGAAgG;IAChG,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB;;;;;;OAMG;IACH,GAAG,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACvE,kGAAkG;IAClG,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC;IAClD,8FAA8F;IAC9F,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,wEAAwE;IACxE,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAWD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,mBAAmB,GAAG,SAAS,CA0D3G;AAmCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAYpE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAa1E"}
|