@brainfish-ai/components 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alert-dialog.d.ts +6 -2
- package/dist/button.d.ts +4 -2
- package/dist/chat-search.d.ts +14 -1
- package/dist/confirm-dialog.d.ts +3 -1
- package/dist/convos.d.ts +3 -0
- package/dist/esm/chunks/ChatSearch.bblH7kYY.js +95 -0
- package/dist/esm/chunks/ChatSearch.bblH7kYY.js.map +1 -0
- package/dist/esm/chunks/Conversation.CuRp-tJL.js +22 -0
- package/dist/esm/chunks/{Conversation.BriXFYqU.js.map → Conversation.CuRp-tJL.js.map} +1 -1
- package/dist/esm/chunks/FormattedMessage.XNMN23hm.js +23 -0
- package/dist/esm/chunks/FormattedMessage.XNMN23hm.js.map +1 -0
- package/dist/esm/chunks/MermaidDiagram.PRgXQ5Yh.js +2 -0
- package/dist/esm/chunks/{MermaidDiagram.xQ0CVFOI.js.map → MermaidDiagram.PRgXQ5Yh.js.map} +1 -1
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js +2 -0
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js.map +1 -0
- package/dist/esm/chunks/button.D_2SonNs.js +3 -0
- package/dist/esm/chunks/button.D_2SonNs.js.map +1 -0
- package/dist/esm/chunks/chart.BDL2tf-S.js +10 -0
- package/dist/esm/chunks/{chart.4ZbtBMmR.js.map → chart.BDL2tf-S.js.map} +1 -1
- package/dist/esm/chunks/chat-logo.CqPppEb9.js +3 -0
- package/dist/esm/chunks/chat-logo.CqPppEb9.js.map +1 -0
- package/dist/esm/chunks/combobox.MyoPH18G.js +6 -0
- package/dist/esm/chunks/{combobox.CJKym3Z1.js.map → combobox.MyoPH18G.js.map} +1 -1
- package/dist/esm/chunks/dark.DuW7JuAk.js +2 -0
- package/dist/esm/chunks/{dark.Cq2RCgy4.js.map → dark.DuW7JuAk.js.map} +1 -1
- package/dist/esm/chunks/data-table.CJOR-1Kf.js +5 -0
- package/dist/esm/chunks/{data-table.DbcAYxMY.js.map → data-table.CJOR-1Kf.js.map} +1 -1
- package/dist/esm/chunks/date-picker.C2VT_rZ9.js +4 -0
- package/dist/esm/chunks/{date-picker._cBTpdEK.js.map → date-picker.C2VT_rZ9.js.map} +1 -1
- package/dist/esm/chunks/extends.DPdBf6DS.js +2 -0
- package/dist/esm/chunks/extends.DPdBf6DS.js.map +1 -0
- package/dist/esm/chunks/feature-flags.DOcVlPHk.js +3 -0
- package/dist/esm/chunks/{feature-flags.DeDEcnd1.js.map → feature-flags.DOcVlPHk.js.map} +1 -1
- package/dist/esm/chunks/feedback.CLMuSvsg.js +13 -0
- package/dist/esm/chunks/{feedback.W2OzN-5r.js.map → feedback.CLMuSvsg.js.map} +1 -1
- package/dist/esm/chunks/file-upload-status.D8RhMcbO.js +8 -0
- package/dist/esm/chunks/{file-upload-status.DP2iuttI.js.map → file-upload-status.D8RhMcbO.js.map} +1 -1
- package/dist/esm/chunks/filters.BHp3ukNW.js +22 -0
- package/dist/esm/chunks/{filters.-7vSLEQ2.js.map → filters.BHp3ukNW.js.map} +1 -1
- package/dist/esm/chunks/font-picker.B9GPXyK4.js +6 -0
- package/dist/esm/chunks/{font-picker.DisEoE8a.js.map → font-picker.B9GPXyK4.js.map} +1 -1
- package/dist/esm/chunks/formatDate.D2xEZm8f.js +2 -0
- package/dist/esm/chunks/{formatDate.CWN6IFKq.js.map → formatDate.D2xEZm8f.js.map} +1 -1
- package/dist/esm/chunks/formatNumber.DhVn228t.js +2 -0
- package/dist/esm/chunks/{formatNumber.Bm2k8QrT.js.map → formatNumber.DhVn228t.js.map} +1 -1
- package/dist/esm/chunks/generating-star.BN9p_FDu.js +7 -0
- package/dist/esm/chunks/generating-star.BN9p_FDu.js.map +1 -0
- package/dist/esm/chunks/header-nav.DdOXbPSM.js +10 -0
- package/dist/esm/chunks/{header-nav.b4hvOsKc.js.map → header-nav.DdOXbPSM.js.map} +1 -1
- package/dist/esm/chunks/header-pane.DrVjpN5S.js +20 -0
- package/dist/esm/chunks/{header-pane.BFXHXxVn.js.map → header-pane.DrVjpN5S.js.map} +1 -1
- package/dist/esm/chunks/hooks.BQTKhHSv.js +2 -0
- package/dist/esm/chunks/hooks.BQTKhHSv.js.map +1 -0
- package/dist/esm/chunks/index.uF4ME3WQ.js +4 -0
- package/dist/esm/chunks/{index.BqibIWDw.js.map → index.uF4ME3WQ.js.map} +1 -1
- package/dist/esm/chunks/input-with-tags.DLv9e0XI.js +5 -0
- package/dist/esm/chunks/{input-with-tags.tg2nhPFv.js.map → input-with-tags.DLv9e0XI.js.map} +1 -1
- package/dist/esm/chunks/logo.CketsPBx.js +5 -0
- package/dist/esm/chunks/{logo.D5BMN6Db.js.map → logo.CketsPBx.js.map} +1 -1
- package/dist/esm/chunks/primary.CMQbo1GJ.js +2 -0
- package/dist/esm/chunks/{primary.CtiRZbqq.js.map → primary.CMQbo1GJ.js.map} +1 -1
- package/dist/esm/chunks/review-list.Cn5bw-lP.js +6 -0
- package/dist/esm/chunks/review-list.Cn5bw-lP.js.map +1 -0
- package/dist/esm/chunks/sidebar.DsEgGwJU.js +25 -0
- package/dist/esm/chunks/sidebar.DsEgGwJU.js.map +1 -0
- package/dist/esm/chunks/simpleSelect.DK1qZSXM.js +3 -0
- package/dist/esm/chunks/{simpleSelect.B1rktKkt.js.map → simpleSelect.DK1qZSXM.js.map} +1 -1
- package/dist/esm/chunks/status-badge.BLB0pWDn.js +3 -0
- package/dist/esm/chunks/status-badge.BLB0pWDn.js.map +1 -0
- package/dist/esm/chunks/trend-value.BPBDBsk2.js +3 -0
- package/dist/esm/chunks/{trend-value.COSukPwk.js.map → trend-value.BPBDBsk2.js.map} +1 -1
- package/dist/esm/chunks/two-level-combobox.DJYP--W9.js +8 -0
- package/dist/esm/chunks/{two-level-combobox.BXs2z9u5.js.map → two-level-combobox.DJYP--W9.js.map} +1 -1
- package/dist/esm/chunks/useChartDateFormatters.Dx2h5AAm.js +2 -0
- package/dist/esm/chunks/{useChartDateFormatters.DS9ASgFO.js.map → useChartDateFormatters.Dx2h5AAm.js.map} +1 -1
- package/dist/esm/chunks/utils.C6Qu-kwd.js +2 -0
- package/dist/esm/chunks/{utils.Cwtlq8dh.js.map → utils.C6Qu-kwd.js.map} +1 -1
- package/dist/esm/colors.js +1 -169
- package/dist/esm/colors.js.map +1 -1
- package/dist/esm/components/article-suggestions-banner.js +4 -53
- package/dist/esm/components/article-suggestions-banner.js.map +1 -1
- package/dist/esm/components/articles-coverage.js +4 -116
- package/dist/esm/components/articles-coverage.js.map +1 -1
- package/dist/esm/components/articles-updated.js +4 -74
- package/dist/esm/components/articles-updated.js.map +1 -1
- package/dist/esm/components/breadcrumbs.js +3 -13
- package/dist/esm/components/breadcrumbs.js.map +1 -1
- package/dist/esm/components/chart-area-linear.js +6 -66
- package/dist/esm/components/chart-area-linear.js.map +1 -1
- package/dist/esm/components/chart-radial-stacked.js +2 -48
- package/dist/esm/components/chart-radial-stacked.js.map +1 -1
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/confirm-dialog.js +2 -47
- package/dist/esm/components/confirm-dialog.js.map +1 -1
- package/dist/esm/components/conversation.js +1 -1
- package/dist/esm/components/convos.js +27 -607
- package/dist/esm/components/convos.js.map +1 -1
- package/dist/esm/components/data-table.js +1 -1
- package/dist/esm/components/date-picker.js +1 -1
- package/dist/esm/components/discoveries-created.js +4 -64
- package/dist/esm/components/discoveries-created.js.map +1 -1
- package/dist/esm/components/feedback.js +1 -1
- package/dist/esm/components/file-upload.js +1 -1
- package/dist/esm/components/filter.js +1 -1
- package/dist/esm/components/font-picker.js +1 -1
- package/dist/esm/components/generating-star.js +1 -1
- package/dist/esm/components/input-with-tags.js +1 -1
- package/dist/esm/components/logo.js +1 -1
- package/dist/esm/components/markdown.js +1 -2
- package/dist/esm/components/markdown.js.map +1 -1
- package/dist/esm/components/metric-card.js +3 -29
- package/dist/esm/components/metric-card.js.map +1 -1
- package/dist/esm/components/select.js +1 -1
- package/dist/esm/components/trend-value.js +1 -1
- package/dist/esm/components/two-level-combobox.js +1 -1
- package/dist/esm/components/ui/accordion.js +7 -46
- package/dist/esm/components/ui/accordion.js.map +1 -1
- package/dist/esm/components/ui/alert-dialog.js +3 -114
- package/dist/esm/components/ui/alert-dialog.js.map +1 -1
- package/dist/esm/components/ui/alert.js +4 -103
- package/dist/esm/components/ui/alert.js.map +1 -1
- package/dist/esm/components/ui/avatar.js +7 -89
- package/dist/esm/components/ui/avatar.js.map +1 -1
- package/dist/esm/components/ui/badge.js +2 -26
- package/dist/esm/components/ui/badge.js.map +1 -1
- package/dist/esm/components/ui/breadcrumb.js +4 -60
- package/dist/esm/components/ui/breadcrumb.js.map +1 -1
- package/dist/esm/components/ui/button-group.js +4 -88
- package/dist/esm/components/ui/button-group.js.map +1 -1
- package/dist/esm/components/ui/button.js +1 -5
- package/dist/esm/components/ui/button.js.map +1 -1
- package/dist/esm/components/ui/calendar.js +2 -20
- package/dist/esm/components/ui/calendar.js.map +1 -1
- package/dist/esm/components/ui/card.js +1 -55
- package/dist/esm/components/ui/card.js.map +1 -1
- package/dist/esm/components/ui/collapsible.js +1 -33
- package/dist/esm/components/ui/collapsible.js.map +1 -1
- package/dist/esm/components/ui/combobox.js +1 -1
- package/dist/esm/components/ui/command.js +2 -79
- package/dist/esm/components/ui/command.js.map +1 -1
- package/dist/esm/components/ui/dialog.js +4 -60
- package/dist/esm/components/ui/dialog.js.map +1 -1
- package/dist/esm/components/ui/div-button.js +2 -61
- package/dist/esm/components/ui/div-button.js.map +1 -1
- package/dist/esm/components/ui/dropdown-menu.js +3 -114
- package/dist/esm/components/ui/dropdown-menu.js.map +1 -1
- package/dist/esm/components/ui/icon.js +2 -25
- package/dist/esm/components/ui/icon.js.map +1 -1
- package/dist/esm/components/ui/input.js +4 -47
- package/dist/esm/components/ui/input.js.map +1 -1
- package/dist/esm/components/ui/item.js +11 -140
- package/dist/esm/components/ui/item.js.map +1 -1
- package/dist/esm/components/ui/label.js +1 -19
- package/dist/esm/components/ui/label.js.map +1 -1
- package/dist/esm/components/ui/popover.js +1 -31
- package/dist/esm/components/ui/popover.js.map +1 -1
- package/dist/esm/components/ui/progress.js +2 -22
- package/dist/esm/components/ui/progress.js.map +1 -1
- package/dist/esm/components/ui/scroll-area.js +2 -32
- package/dist/esm/components/ui/scroll-area.js.map +1 -1
- package/dist/esm/components/ui/select.js +5 -66
- package/dist/esm/components/ui/select.js.map +1 -1
- package/dist/esm/components/ui/separator.js +1 -23
- package/dist/esm/components/ui/separator.js.map +1 -1
- package/dist/esm/components/ui/sheet.js +3 -62
- package/dist/esm/components/ui/sheet.js.map +1 -1
- package/dist/esm/components/ui/spinner.js +2 -17
- package/dist/esm/components/ui/spinner.js.map +1 -1
- package/dist/esm/components/ui/switch.js +2 -26
- package/dist/esm/components/ui/switch.js.map +1 -1
- package/dist/esm/components/ui/table.js +1 -82
- package/dist/esm/components/ui/table.js.map +1 -1
- package/dist/esm/components/ui/textarea.js +1 -33
- package/dist/esm/components/ui/textarea.js.map +1 -1
- package/dist/esm/components/ui/tooltip.js +3 -31
- package/dist/esm/components/ui/tooltip.js.map +1 -1
- package/dist/esm/global.css +1 -1
- package/dist/esm/index.js +1 -53
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/layouts/full-layout.js +1 -1
- package/dist/esm/layouts/header-nav.js +1 -1
- package/dist/esm/layouts/sidebar.js +1 -1
- package/dist/esm/logos/microsoft-logo.js +6 -66
- package/dist/esm/logos/microsoft-logo.js.map +1 -1
- package/dist/esm/logos/microsoft-teams-logo.js +12 -112
- package/dist/esm/logos/microsoft-teams-logo.js.map +1 -1
- package/dist/esm/logos/slack-logo.js +3 -39
- package/dist/esm/logos/slack-logo.js.map +1 -1
- package/dist/esm/scenes/knowledge-review.js +17 -380
- package/dist/esm/scenes/knowledge-review.js.map +1 -1
- package/dist/esm/tailwind.preset.js +1 -1526
- package/dist/esm/tailwind.preset.js.map +1 -1
- package/dist/index.d.ts +32 -5
- package/dist/logo.d.ts +9 -0
- package/dist/stats.html +47 -46
- package/package.json +17 -18
- package/tailwind.preset.ts +1 -0
- package/dist/esm/chunks/ChatSearch.CeQrTOVx.js +0 -6825
- package/dist/esm/chunks/ChatSearch.CeQrTOVx.js.map +0 -1
- package/dist/esm/chunks/Conversation.BriXFYqU.js +0 -831
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js +0 -39715
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js.map +0 -1
- package/dist/esm/chunks/MermaidDiagram.xQ0CVFOI.js +0 -50
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js +0 -8
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js.map +0 -1
- package/dist/esm/chunks/button.DQL6gCAt.js +0 -48
- package/dist/esm/chunks/button.DQL6gCAt.js.map +0 -1
- package/dist/esm/chunks/chart.4ZbtBMmR.js +0 -199
- package/dist/esm/chunks/combobox.CJKym3Z1.js +0 -95
- package/dist/esm/chunks/dark.Cq2RCgy4.js +0 -18
- package/dist/esm/chunks/data-table.DbcAYxMY.js +0 -102
- package/dist/esm/chunks/date-picker._cBTpdEK.js +0 -26
- package/dist/esm/chunks/extends.mO86zOh3.js +0 -12
- package/dist/esm/chunks/extends.mO86zOh3.js.map +0 -1
- package/dist/esm/chunks/feature-flags.DeDEcnd1.js +0 -22
- package/dist/esm/chunks/feedback.W2OzN-5r.js +0 -214
- package/dist/esm/chunks/file-upload-status.DP2iuttI.js +0 -141
- package/dist/esm/chunks/filters.-7vSLEQ2.js +0 -565
- package/dist/esm/chunks/font-picker.DisEoE8a.js +0 -181
- package/dist/esm/chunks/formatDate.CWN6IFKq.js +0 -952
- package/dist/esm/chunks/formatNumber.Bm2k8QrT.js +0 -10
- package/dist/esm/chunks/generating-star.DMDPNTaM.js +0 -1501
- package/dist/esm/chunks/generating-star.DMDPNTaM.js.map +0 -1
- package/dist/esm/chunks/header-nav.b4hvOsKc.js +0 -197
- package/dist/esm/chunks/header-pane.BFXHXxVn.js +0 -559
- package/dist/esm/chunks/hooks.BWVaVAT-.js +0 -343
- package/dist/esm/chunks/hooks.BWVaVAT-.js.map +0 -1
- package/dist/esm/chunks/index.BqibIWDw.js +0 -137
- package/dist/esm/chunks/input-with-tags.tg2nhPFv.js +0 -110
- package/dist/esm/chunks/logo.D5BMN6Db.js +0 -191
- package/dist/esm/chunks/primary.CtiRZbqq.js +0 -18
- package/dist/esm/chunks/review-list.BtSnfpSc.js +0 -117
- package/dist/esm/chunks/review-list.BtSnfpSc.js.map +0 -1
- package/dist/esm/chunks/sidebar.BamKohb5.js +0 -803
- package/dist/esm/chunks/sidebar.BamKohb5.js.map +0 -1
- package/dist/esm/chunks/simpleSelect.B1rktKkt.js +0 -23
- package/dist/esm/chunks/status-badge.eFJ1PYeb.js +0 -18
- package/dist/esm/chunks/status-badge.eFJ1PYeb.js.map +0 -1
- package/dist/esm/chunks/trend-value.COSukPwk.js +0 -51
- package/dist/esm/chunks/two-level-combobox.BXs2z9u5.js +0 -132
- package/dist/esm/chunks/useChartDateFormatters.DS9ASgFO.js +0 -11
- package/dist/esm/chunks/utils.Cwtlq8dh.js +0 -45
|
@@ -1,608 +1,28 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
import './ui/dropdown-menu.js';
|
|
29
|
-
import './ui/switch.js';
|
|
30
|
-
import './ui/input.js';
|
|
31
|
-
import './ui/popover.js';
|
|
32
|
-
import './ui/command.js';
|
|
33
|
-
import './ui/dialog.js';
|
|
34
|
-
import './ui/card.js';
|
|
35
|
-
import './ui/progress.js';
|
|
36
|
-
import '@radix-ui/react-accordion';
|
|
37
|
-
import './ui/alert-dialog.js';
|
|
38
|
-
import './ui/alert.js';
|
|
39
|
-
import './ui/button-group.js';
|
|
40
|
-
import './ui/calendar.js';
|
|
41
|
-
import './ui/icon.js';
|
|
42
|
-
import './ui/separator.js';
|
|
43
|
-
import '../logos/microsoft-teams-logo.js';
|
|
44
|
-
import '../logos/slack-logo.js';
|
|
45
|
-
import '../logos/microsoft-logo.js';
|
|
46
|
-
import { d as dark } from '../chunks/dark.Cq2RCgy4.js';
|
|
47
|
-
|
|
48
|
-
function AnswerDiagnosticsSection({ messageId }) {
|
|
49
|
-
const { fetchAnswerDiagnostics } = useConvosContext();
|
|
50
|
-
const [answerDiagnostics, setAnswerDiagnostics] = useState(null);
|
|
51
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
void fetchAnswerDiagnostics(messageId).then((diagnostics) => setAnswerDiagnostics(diagnostics)).finally(() => setIsLoading(false));
|
|
54
|
-
}, [fetchAnswerDiagnostics, messageId]);
|
|
55
|
-
return /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-4 px-4 flex-shrink-0 bg-surface", "data-name": "discard-dialog-answer-diagnostic" }, isLoading ? /* @__PURE__ */ React__default.createElement("div", { className: "flex items-center justify-center h-full" }, /* @__PURE__ */ React__default.createElement(Spinner, null)) : /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, answerDiagnostics && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement("dl", { className: "grid grid-cols-[1fr_2fr] grid-rows-2 gap-5" }, /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ React__default.createElement("dt", { className: "heading-xs" }, "Confidence"), /* @__PURE__ */ React__default.createElement("dd", { className: "text-sm" }, answerDiagnostics.confidence_score)), answerDiagnostics.answer_generation_type && /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ React__default.createElement("dt", { className: "heading-xs" }, "Answer Type"), /* @__PURE__ */ React__default.createElement("dd", { className: "text-sm" }, answerDiagnostics.answer_generation_type)), answerDiagnostics.query_context_relevance && /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ React__default.createElement("dt", { className: "heading-xs" }, "Relevance"), /* @__PURE__ */ React__default.createElement("dd", { className: "text-sm" }, answerDiagnostics.query_context_relevance)), answerDiagnostics.context_sufficiency && /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ React__default.createElement("dt", { className: "heading-xs" }, "Context"), /* @__PURE__ */ React__default.createElement("dd", { className: "text-sm" }, answerDiagnostics.context_sufficiency))), answerDiagnostics.confidence_justification && /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-2", "data-name": "diagnostic-justification" }, /* @__PURE__ */ React__default.createElement("span", { className: "heading-xs" }, "Justification"), /* @__PURE__ */ React__default.createElement("p", { className: "text-sm my-0" }, answerDiagnostics.confidence_justification)), answerDiagnostics.evidence_from_context && answerDiagnostics.evidence_from_context.length > 0 && /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-2", "data-name": "diagnostic-evidence" }, /* @__PURE__ */ React__default.createElement("span", { className: "heading-xs" }, "Evidence (from Knowledge Base)"), answerDiagnostics.evidence_from_context.map((evidence, index) => /* @__PURE__ */ React__default.createElement("div", { key: index, className: "flex flex-col gap-1" }, evidence.supporting_quote && /* @__PURE__ */ React__default.createElement("p", { className: "text-sm my-0" }, evidence.supporting_quote), evidence.url && /* @__PURE__ */ React__default.createElement(Button, { variant: "link", size: "sm", className: "flex gap-1 text-sm self-end items-center", asChild: true }, /* @__PURE__ */ React__default.createElement("a", { href: evidence.url, target: "_blank", rel: "noopener noreferrer" }, /* @__PURE__ */ React__default.createElement("span", null, "Source"), /* @__PURE__ */ React__default.createElement(ArrowSquareOut, { size: 16 })))))))));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
var DiscardReason = /* @__PURE__ */ ((DiscardReason2) => {
|
|
59
|
-
DiscardReason2["INCORRECT_ANSWER"] = "incorrect_answer";
|
|
60
|
-
DiscardReason2["HALLUCINATED_ANSWER"] = "hallucinated_answer";
|
|
61
|
-
DiscardReason2["OVERSHARING"] = "oversharing";
|
|
62
|
-
DiscardReason2["WRONG_ARTICLE_SURFACED"] = "wrong_article_surfaced";
|
|
63
|
-
DiscardReason2["OTHER"] = "other";
|
|
64
|
-
return DiscardReason2;
|
|
65
|
-
})(DiscardReason || {});
|
|
66
|
-
const DiscardReasonLabels = {
|
|
67
|
-
["incorrect_answer" /* INCORRECT_ANSWER */]: "Incorrect answer",
|
|
68
|
-
["hallucinated_answer" /* HALLUCINATED_ANSWER */]: "Hallucinated answer",
|
|
69
|
-
["oversharing" /* OVERSHARING */]: "Oversharing",
|
|
70
|
-
["wrong_article_surfaced" /* WRONG_ARTICLE_SURFACED */]: "Wrong article surfaced",
|
|
71
|
-
["other" /* OTHER */]: "Other"
|
|
72
|
-
};
|
|
73
|
-
function DiscardForm({
|
|
74
|
-
discarded,
|
|
75
|
-
discardedMeta,
|
|
76
|
-
onSubmit,
|
|
77
|
-
onApprove,
|
|
78
|
-
selectOpenRef,
|
|
79
|
-
className
|
|
80
|
-
}) {
|
|
81
|
-
const [isExpanded, setIsExpanded] = useState(discarded ?? false);
|
|
82
|
-
const [isSelectOpen, setIsSelectOpenState] = useState(false);
|
|
83
|
-
const [isDiscarded, setIsDiscarded] = useState(discarded);
|
|
84
|
-
const formRef = useRef(null);
|
|
85
|
-
useEffect(() => {
|
|
86
|
-
setIsDiscarded(discarded);
|
|
87
|
-
if (discarded) setIsExpanded(true);
|
|
88
|
-
}, [discarded]);
|
|
89
|
-
const setIsSelectOpen = (open) => {
|
|
90
|
-
setIsSelectOpenState(open);
|
|
91
|
-
if (selectOpenRef) selectOpenRef.current.isOpen = open;
|
|
92
|
-
};
|
|
93
|
-
useEffect(() => {
|
|
94
|
-
if (selectOpenRef) {
|
|
95
|
-
selectOpenRef.current.close = () => setIsSelectOpen(false);
|
|
96
|
-
}
|
|
97
|
-
}, [selectOpenRef]);
|
|
98
|
-
const {
|
|
99
|
-
control,
|
|
100
|
-
register,
|
|
101
|
-
handleSubmit,
|
|
102
|
-
reset,
|
|
103
|
-
formState: { isSubmitting }
|
|
104
|
-
} = useForm({
|
|
105
|
-
defaultValues: {
|
|
106
|
-
reason: discardedMeta?.reason,
|
|
107
|
-
preferredAnswer: discardedMeta?.suggestedAnswer || ""
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
useEffect(() => {
|
|
111
|
-
reset({
|
|
112
|
-
reason: discardedMeta?.reason,
|
|
113
|
-
preferredAnswer: discardedMeta?.suggestedAnswer || ""
|
|
114
|
-
});
|
|
115
|
-
}, [discardedMeta, reset]);
|
|
116
|
-
useEffect(() => {
|
|
117
|
-
if (formRef.current) {
|
|
118
|
-
formRef.current.inert = !isExpanded;
|
|
119
|
-
}
|
|
120
|
-
}, [isExpanded]);
|
|
121
|
-
const handleCancel = () => {
|
|
122
|
-
setIsExpanded(false);
|
|
123
|
-
setIsSelectOpen(false);
|
|
124
|
-
reset();
|
|
125
|
-
};
|
|
126
|
-
const handleApprove = async () => {
|
|
127
|
-
try {
|
|
128
|
-
await onApprove();
|
|
129
|
-
setIsDiscarded(false);
|
|
130
|
-
setIsExpanded(false);
|
|
131
|
-
setIsSelectOpen(false);
|
|
132
|
-
} catch (error) {
|
|
133
|
-
console.error("Failed to approve:", error);
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
const handleDiscard = async (data) => {
|
|
137
|
-
try {
|
|
138
|
-
await onSubmit(data);
|
|
139
|
-
setIsDiscarded(true);
|
|
140
|
-
setIsSelectOpen(false);
|
|
141
|
-
} catch (error) {
|
|
142
|
-
console.error("Failed to discard:", error);
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
const isResolved = isDiscarded !== void 0 && isDiscarded !== null;
|
|
146
|
-
const showApproveButton = !isResolved || isDiscarded === false;
|
|
147
|
-
const showDiscardButton = !isResolved || isDiscarded === true;
|
|
148
|
-
return /* @__PURE__ */ React__default.createElement("div", { className: cn("space-y-4", className) }, /* @__PURE__ */ React__default.createElement("div", { className: "flex gap-2 px-4" }, showApproveButton && /* @__PURE__ */ React__default.createElement(Tooltip, null, /* @__PURE__ */ React__default.createElement(TooltipTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(
|
|
149
|
-
Button,
|
|
150
|
-
{
|
|
151
|
-
variant: "shadowSurface",
|
|
152
|
-
size: "sm",
|
|
153
|
-
className: cn("text-default !opacity-100", { "bg-green-600 text-dark-100": isDiscarded === false }),
|
|
154
|
-
disabled: isResolved,
|
|
155
|
-
onClick: handleApprove
|
|
156
|
-
},
|
|
157
|
-
/* @__PURE__ */ React__default.createElement(CheckCircle, null),
|
|
158
|
-
" ",
|
|
159
|
-
isDiscarded === false ? "Approved" : "Approve"
|
|
160
|
-
)), /* @__PURE__ */ React__default.createElement(TooltipContent, null, /* @__PURE__ */ React__default.createElement("span", null, "Approve the answer"))), showDiscardButton && /* @__PURE__ */ React__default.createElement(Tooltip, null, /* @__PURE__ */ React__default.createElement(TooltipTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(
|
|
161
|
-
Button,
|
|
162
|
-
{
|
|
163
|
-
variant: "shadowSurface",
|
|
164
|
-
size: "sm",
|
|
165
|
-
className: cn("text-default !opacity-100", { "bg-red-600 text-dark-100": isDiscarded === true }),
|
|
166
|
-
disabled: isResolved,
|
|
167
|
-
onClick: () => setIsExpanded(!isExpanded)
|
|
168
|
-
},
|
|
169
|
-
/* @__PURE__ */ React__default.createElement(XCircle, null),
|
|
170
|
-
isDiscarded === true ? "Discarded" : "Discard"
|
|
171
|
-
)), /* @__PURE__ */ React__default.createElement(TooltipContent, null, /* @__PURE__ */ React__default.createElement("span", null, "Discard the answer")))), /* @__PURE__ */ React__default.createElement(
|
|
172
|
-
"div",
|
|
173
|
-
{
|
|
174
|
-
className: cn(
|
|
175
|
-
"grid transition-[grid-template-rows] duration-300 ease-in-out",
|
|
176
|
-
isExpanded ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
|
|
177
|
-
)
|
|
178
|
-
},
|
|
179
|
-
isDiscarded ? /* @__PURE__ */ React__default.createElement(
|
|
180
|
-
"div",
|
|
181
|
-
{
|
|
182
|
-
className: cn("overflow-hidden min-h-0 px-4 bg-dark-200 space-y-4", isExpanded ? "py-4 mb-4" : "py-0"),
|
|
183
|
-
"data-name": "discard-dialog-reason"
|
|
184
|
-
},
|
|
185
|
-
/* @__PURE__ */ React__default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__default.createElement(Label, { htmlFor: "reason", className: "text-sm" }, "Reason"), /* @__PURE__ */ React__default.createElement("span", { className: "text-sm block" }, discardedMeta?.reason && DiscardReasonLabels[discardedMeta.reason])),
|
|
186
|
-
/* @__PURE__ */ React__default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__default.createElement(Label, { htmlFor: "preferredAnswer", className: "text-sm" }, "Preferred answer"), /* @__PURE__ */ React__default.createElement("span", { className: "text-sm block" }, discardedMeta?.suggestedAnswer))
|
|
187
|
-
) : /* @__PURE__ */ React__default.createElement(
|
|
188
|
-
"form",
|
|
189
|
-
{
|
|
190
|
-
ref: formRef,
|
|
191
|
-
onSubmit: handleSubmit(handleDiscard),
|
|
192
|
-
className: cn(
|
|
193
|
-
"overflow-hidden min-h-0 px-4 bg-dark-200 transition-all duration-300 ease-in-out",
|
|
194
|
-
isExpanded ? "py-4 mb-4" : "py-0"
|
|
195
|
-
)
|
|
196
|
-
},
|
|
197
|
-
/* @__PURE__ */ React__default.createElement("fieldset", { className: "space-y-4", "data-name": "discard-dialog-reason" }, /* @__PURE__ */ React__default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__default.createElement(Label, { htmlFor: "reason", className: "heading-xs" }, "Reason"), /* @__PURE__ */ React__default.createElement(
|
|
198
|
-
Controller,
|
|
199
|
-
{
|
|
200
|
-
control,
|
|
201
|
-
name: "reason",
|
|
202
|
-
rules: { required: true },
|
|
203
|
-
render: ({ field }) => /* @__PURE__ */ React__default.createElement(
|
|
204
|
-
Select,
|
|
205
|
-
{
|
|
206
|
-
value: field.value,
|
|
207
|
-
onValueChange: field.onChange,
|
|
208
|
-
open: isSelectOpen,
|
|
209
|
-
onOpenChange: setIsSelectOpen,
|
|
210
|
-
required: true
|
|
211
|
-
},
|
|
212
|
-
/* @__PURE__ */ React__default.createElement(SelectTrigger, { className: "border-dark-300 bg-surface" }, /* @__PURE__ */ React__default.createElement(SelectValue, { placeholder: "Select a reason" })),
|
|
213
|
-
/* @__PURE__ */ React__default.createElement(SelectContent, null, Object.values(DiscardReason).map((reason) => /* @__PURE__ */ React__default.createElement(SelectItem, { key: reason, value: reason }, DiscardReasonLabels[reason])))
|
|
214
|
-
)
|
|
215
|
-
}
|
|
216
|
-
), /* @__PURE__ */ React__default.createElement("span", { className: "text-xs text-subtle ml-1 hidden" }, "Give your ambient agent a descriptive name that reflects its purpose. This agent will learn from your content to provide personalized assistance.")), /* @__PURE__ */ React__default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__default.createElement(Label, { htmlFor: "preferredAnswer", className: "heading-xs" }, "Preferred answer"), /* @__PURE__ */ React__default.createElement(
|
|
217
|
-
Textarea,
|
|
218
|
-
{
|
|
219
|
-
id: "preferredAnswer",
|
|
220
|
-
required: true,
|
|
221
|
-
minLength: 10,
|
|
222
|
-
placeholder: "Explain what you'd like Brainfish to do next time in this case....",
|
|
223
|
-
rows: 4,
|
|
224
|
-
className: "h-52 resize-none bg-surface",
|
|
225
|
-
...register("preferredAnswer")
|
|
226
|
-
}
|
|
227
|
-
), /* @__PURE__ */ React__default.createElement("span", { className: "text-xs text-subtle ml-1 hidden" }, "Tell Brainfish why this is the incorrect answer.")), /* @__PURE__ */ React__default.createElement("div", { className: "flex gap-2 !mb-1 justify-end mr-1" }, /* @__PURE__ */ React__default.createElement(Button, { variant: "link", size: "sm", type: "button", onClick: handleCancel }, "Cancel"), /* @__PURE__ */ React__default.createElement(Button, { type: "submit", variant: "shadow", size: "sm", disabled: isSubmitting }, isSubmitting ? "Submitting..." : "Submit")))
|
|
228
|
-
)
|
|
229
|
-
));
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
function FeedbackDialog({
|
|
233
|
-
id,
|
|
234
|
-
discarded,
|
|
235
|
-
discardedMeta,
|
|
236
|
-
open: externalOpen,
|
|
237
|
-
onOpenChange: externalOnOpenChange,
|
|
238
|
-
...args
|
|
239
|
-
}) {
|
|
240
|
-
const { onDiscard, onApprove } = useConvosContext();
|
|
241
|
-
const [internalOpen, setInternalOpen] = useState(false);
|
|
242
|
-
const selectOpenRef = useRef({ isOpen: false, close: () => {
|
|
243
|
-
} });
|
|
244
|
-
const isOpen = externalOpen ?? internalOpen;
|
|
245
|
-
const setIsOpen = externalOnOpenChange ?? setInternalOpen;
|
|
246
|
-
const onSubmitForm = async (data) => {
|
|
247
|
-
await onDiscard(id, data.reason, data.preferredAnswer).then(() => setIsOpen(false));
|
|
248
|
-
};
|
|
249
|
-
const handleApprove = async () => {
|
|
250
|
-
await onApprove(id);
|
|
251
|
-
};
|
|
252
|
-
return /* @__PURE__ */ React__default.createElement(Sheet, { modal: false, open: isOpen, onOpenChange: setIsOpen, ...args }, /* @__PURE__ */ React__default.createElement(SheetTrigger, { asChild: true, onClick: (e) => e.stopPropagation(), onKeyUp: (e) => e.stopPropagation() }, /* @__PURE__ */ React__default.createElement(DivButton, { variant: "shadowSurface", size: "sm", "aria-label": "Inspect answer information" }, /* @__PURE__ */ React__default.createElement(ListMagnifyingGlass, { className: "text-dark-600" }), " Inspect")), /* @__PURE__ */ React__default.createElement(
|
|
253
|
-
SheetContent,
|
|
254
|
-
{
|
|
255
|
-
className: "space-y-4 px-0",
|
|
256
|
-
onEscapeKeyDown: (e) => {
|
|
257
|
-
if (selectOpenRef.current.isOpen) {
|
|
258
|
-
e.preventDefault();
|
|
259
|
-
selectOpenRef.current.close();
|
|
260
|
-
}
|
|
261
|
-
},
|
|
262
|
-
onInteractOutside: (e) => {
|
|
263
|
-
if (selectOpenRef.current.isOpen) {
|
|
264
|
-
e.preventDefault();
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
},
|
|
268
|
-
/* @__PURE__ */ React__default.createElement(SheetHeader, { className: "px-4" }, /* @__PURE__ */ React__default.createElement(SheetTitle, { className: "heading-sm m-0" }, "Answer information"), /* @__PURE__ */ React__default.createElement(SheetDescription, { className: "sr-only" }, "Shows answer diagnostics and allows you to provide feedback.")),
|
|
269
|
-
/* @__PURE__ */ React__default.createElement(ScrollArea, { className: "h-[calc(100vh-4rem)] pb-4" }, /* @__PURE__ */ React__default.createElement(
|
|
270
|
-
DiscardForm,
|
|
271
|
-
{
|
|
272
|
-
discarded,
|
|
273
|
-
discardedMeta,
|
|
274
|
-
onSubmit: onSubmitForm,
|
|
275
|
-
onApprove: handleApprove,
|
|
276
|
-
selectOpenRef
|
|
277
|
-
}
|
|
278
|
-
), /* @__PURE__ */ React__default.createElement(AnswerDiagnosticsSection, { messageId: id }))
|
|
279
|
-
));
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
const ConfidenceBadge = ({ score }) => {
|
|
283
|
-
const formattedScore = `${score}%`;
|
|
284
|
-
if (!score || score > 100) {
|
|
285
|
-
return /* @__PURE__ */ React__default.createElement(Badge, { variant: "disabled" }, "N/A");
|
|
286
|
-
} else if (score >= 80) {
|
|
287
|
-
return /* @__PURE__ */ React__default.createElement(Badge, { variant: "success" }, formattedScore);
|
|
288
|
-
} else if (score >= 40 && score < 80) {
|
|
289
|
-
return /* @__PURE__ */ React__default.createElement(Badge, { variant: "warning" }, formattedScore);
|
|
290
|
-
} else {
|
|
291
|
-
return /* @__PURE__ */ React__default.createElement(Badge, { variant: "disabled" }, "N/A");
|
|
292
|
-
}
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
296
|
-
MessageType2["ACTION"] = "action";
|
|
297
|
-
MessageType2["FEEDBACK"] = "feedback";
|
|
298
|
-
MessageType2["QUESTION"] = "question";
|
|
299
|
-
MessageType2["ANSWER"] = "answer";
|
|
300
|
-
return MessageType2;
|
|
301
|
-
})(MessageType || {});
|
|
302
|
-
var Feedback = /* @__PURE__ */ ((Feedback2) => {
|
|
303
|
-
Feedback2["Positive"] = "positive";
|
|
304
|
-
Feedback2["Negative"] = "negative";
|
|
305
|
-
return Feedback2;
|
|
306
|
-
})(Feedback || {});
|
|
307
|
-
const isAIAnswer = (msg) => msg.type === "answer" /* ANSWER */;
|
|
308
|
-
const isUserQuestion = (msg) => msg.type === "question" /* QUESTION */;
|
|
309
|
-
const isFeedback = (msg) => msg.type === "feedback" /* FEEDBACK */;
|
|
310
|
-
const isAction = (msg) => msg.type === "action" /* ACTION */;
|
|
311
|
-
function MessageAttachmentImageThumbnails({ attachments }) {
|
|
312
|
-
return /* @__PURE__ */ React__default.createElement("div", { className: "flex gap-2 flex-wrap" }, attachments.filter((a) => a.type === "image").map((att, i) => /* @__PURE__ */ React__default.createElement("div", { key: i, className: "relative bg-dark-300 p-1 rounded shrink-0" }, /* @__PURE__ */ React__default.createElement("a", { href: att.url, target: "_blank", rel: "noopener noreferrer" }, /* @__PURE__ */ React__default.createElement("img", { src: att.url, alt: "", className: "size-14 object-cover rounded" })), /* @__PURE__ */ React__default.createElement("div", { className: "absolute top-1.5 right-1.5 bg-dark-300 rounded-full p-0.5" }, /* @__PURE__ */ React__default.createElement(Eye, { size: 8 })))));
|
|
313
|
-
}
|
|
314
|
-
function Message(props) {
|
|
315
|
-
const { id, content, timestamp, locale: localeOverride, isFeedbackDialogOpen, onFeedbackDialogChange } = props;
|
|
316
|
-
const { locale: contextLocale } = useConvosContext();
|
|
317
|
-
const locale = localeOverride || contextLocale;
|
|
318
|
-
const formattedDate = formatDate(timestamp, locale);
|
|
319
|
-
if (isAIAnswer(props)) {
|
|
320
|
-
const { relatedArticles, discarded, discardedMeta, confidenceScore } = props;
|
|
321
|
-
return /* @__PURE__ */ React__default.createElement("li", { className: "relative before-line after-line list-none [&_a]:break-all" }, /* @__PURE__ */ React__default.createElement(Item, { className: "message-item" }, /* @__PURE__ */ React__default.createElement(ItemHeader, { className: "justify-start gap-0" }, /* @__PURE__ */ React__default.createElement(GeneratingStar, { variant: "gradient", className: "relative -left-[6px]" }), /* @__PURE__ */ React__default.createElement(ItemTitle, { className: "text-xs font-bold" }, `Generated answer ${discarded ? "(Discarded)" : ""}`)), /* @__PURE__ */ React__default.createElement(
|
|
322
|
-
ItemContent,
|
|
323
|
-
{
|
|
324
|
-
className: cn("message-ai-content", {
|
|
325
|
-
"py-6": !relatedArticles?.length,
|
|
326
|
-
"pt-6 pb-0": relatedArticles?.length
|
|
327
|
-
})
|
|
328
|
-
},
|
|
329
|
-
/* @__PURE__ */ React__default.createElement("div", { className: "message-content-wrapper" }, /* @__PURE__ */ React__default.createElement(FormattedMessage, { message: { content } }), /* @__PURE__ */ React__default.createElement("div", { className: "flex gap-2 justify-between mt-2 items-center" }, /* @__PURE__ */ React__default.createElement("span", { className: "message-timestamp" }, formattedDate), /* @__PURE__ */ React__default.createElement("div", { className: "flex items-center gap-2" }, confidenceScore && /* @__PURE__ */ React__default.createElement(Tooltip, null, /* @__PURE__ */ React__default.createElement(TooltipTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(DivButton, { variant: "outline", size: "sm", className: "text-xs p-1 h-auto" }, confidenceScore)), /* @__PURE__ */ React__default.createElement(TooltipContent, null, /* @__PURE__ */ React__default.createElement("p", null, "Answer score: ", confidenceScore))), /* @__PURE__ */ React__default.createElement(
|
|
330
|
-
FeedbackDialog,
|
|
331
|
-
{
|
|
332
|
-
id,
|
|
333
|
-
discarded,
|
|
334
|
-
discardedMeta,
|
|
335
|
-
open: isFeedbackDialogOpen,
|
|
336
|
-
onOpenChange: onFeedbackDialogChange
|
|
337
|
-
}
|
|
338
|
-
)))),
|
|
339
|
-
!!relatedArticles?.length && /* @__PURE__ */ React__default.createElement(Accordion, { type: "single", collapsible: true, className: "p-0 custom-dashed-border-t-dark-300 w-full" }, /* @__PURE__ */ React__default.createElement(AccordionItem, { value: "related-articles" }, /* @__PURE__ */ React__default.createElement(AccordionTrigger, { className: "px-6" }, "Related articles"), /* @__PURE__ */ React__default.createElement(AccordionContent, null, /* @__PURE__ */ React__default.createElement("ul", { className: "message-article-list" }, relatedArticles.map((article) => /* @__PURE__ */ React__default.createElement(
|
|
340
|
-
"li",
|
|
341
|
-
{
|
|
342
|
-
key: article.id,
|
|
343
|
-
className: "grid gap-2 grid-cols-[auto_1fr] items-center justify-items-start"
|
|
344
|
-
},
|
|
345
|
-
/* @__PURE__ */ React__default.createElement(ConfidenceBadge, { score: Math.round(article.score * 100) }),
|
|
346
|
-
/* @__PURE__ */ React__default.createElement(
|
|
347
|
-
Button,
|
|
348
|
-
{
|
|
349
|
-
variant: "link",
|
|
350
|
-
size: "xs",
|
|
351
|
-
asChild: true,
|
|
352
|
-
className: "flex items-center gap-2 min-w-0 !justify-start w-full"
|
|
353
|
-
},
|
|
354
|
-
/* @__PURE__ */ React__default.createElement("a", { href: article.url, target: "_blank", rel: "noopener noreferrer" }, /* @__PURE__ */ React__default.createElement("span", { className: "truncate" }, article.title), /* @__PURE__ */ React__default.createElement(ArrowSquareOut, { className: "size-4 flex-shrink-0", weight: "regular" }))
|
|
355
|
-
)
|
|
356
|
-
))))))
|
|
357
|
-
)));
|
|
358
|
-
}
|
|
359
|
-
const feedback = isFeedback(props) ? props.feedback : null;
|
|
360
|
-
return /* @__PURE__ */ React__default.createElement("li", { className: "relative list-none before-line--user after-line--user" }, /* @__PURE__ */ React__default.createElement(Item, { className: "message-item" }, /* @__PURE__ */ React__default.createElement(ItemHeader, { className: "basis-0" }, /* @__PURE__ */ React__default.createElement(UserCircle, { weight: "fill", size: 24 })), /* @__PURE__ */ React__default.createElement(ItemContent, { className: "message-user-content" }, isUserQuestion(props) && /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-2" }, props.attachments && props.attachments.some((a) => a.type === "image") && /* @__PURE__ */ React__default.createElement(MessageAttachmentImageThumbnails, { attachments: props.attachments }), !props.onlyShowAttachments && /* @__PURE__ */ React__default.createElement(FormattedMessage, { message: { content } }), /* @__PURE__ */ React__default.createElement("span", { className: "message-timestamp" }, formattedDate)), isFeedback(props) && feedback && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement("div", { className: "message-header" }, /* @__PURE__ */ React__default.createElement("div", { className: "message-feedback-text" }, feedback === "positive" /* Positive */ ? "Upvoted as helpful" : "Downvoted as not helpful"), /* @__PURE__ */ React__default.createElement("div", { className: "message-meta" }, /* @__PURE__ */ React__default.createElement(StatusBadge, { variant: feedback === "positive" /* Positive */ ? "success" : "destructive" }, feedback === "positive" /* Positive */ ? "Answered" : "Unable to help"))), content && /* @__PURE__ */ React__default.createElement("div", { className: "text-base mb-1" }, content), /* @__PURE__ */ React__default.createElement("span", { className: "message-timestamp-simple" }, formattedDate)), isAction(props) && /* @__PURE__ */ React__default.createElement("div", { className: "message-header" }, /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ React__default.createElement("span", { className: "text-subtle text-sm italic" }, content), /* @__PURE__ */ React__default.createElement("span", { className: "message-timestamp-simple" }, formattedDate)), /* @__PURE__ */ React__default.createElement("div", { className: "message-meta" }, /* @__PURE__ */ React__default.createElement(StatusBadge, { variant: "warning" }, "Action"))))));
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
function sortAttributeKeys(attributes) {
|
|
364
|
-
const PRIORITY_KEYS = ["id", "name", "email", "phone"];
|
|
365
|
-
if (attributes.length === 0) {
|
|
366
|
-
return [];
|
|
367
|
-
}
|
|
368
|
-
const priority = (key) => {
|
|
369
|
-
const idx = PRIORITY_KEYS.indexOf(key);
|
|
370
|
-
return idx === -1 ? Infinity : idx;
|
|
371
|
-
};
|
|
372
|
-
return Object.keys(attributes[0]).sort((a, b) => priority(a) - priority(b));
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
function AttributesDialog({ conversationId, open, onOpenChange, ...args }) {
|
|
376
|
-
const [attributes, setAttributes] = useState();
|
|
377
|
-
const [sortedAttributesKeys, setSortedAttributesKeys] = useState();
|
|
378
|
-
const { fetchAttributes } = useConvosContext();
|
|
379
|
-
useEffect(() => {
|
|
380
|
-
void fetchAttributes(conversationId).then((attrs) => {
|
|
381
|
-
setAttributes(attrs);
|
|
382
|
-
setSortedAttributesKeys(sortAttributeKeys(attrs));
|
|
383
|
-
}).catch(() => {
|
|
384
|
-
});
|
|
385
|
-
}, [fetchAttributes, conversationId]);
|
|
386
|
-
if (!attributes?.length) {
|
|
387
|
-
return null;
|
|
388
|
-
}
|
|
389
|
-
return /* @__PURE__ */ React__default.createElement(Sheet, { modal: false, open, onOpenChange, ...args }, /* @__PURE__ */ React__default.createElement(Tooltip, null, /* @__PURE__ */ React__default.createElement(TooltipTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(SheetTrigger, { asChild: true, onClick: (e) => e.stopPropagation(), onKeyUp: (e) => e.stopPropagation() }, /* @__PURE__ */ React__default.createElement(
|
|
390
|
-
DivButton,
|
|
391
|
-
{
|
|
392
|
-
variant: "ghost",
|
|
393
|
-
size: "icon",
|
|
394
|
-
className: "size-7 [&_svg]:size-6 text-dark-900",
|
|
395
|
-
"aria-label": "Open Custom attributes dialog"
|
|
396
|
-
},
|
|
397
|
-
/* @__PURE__ */ React__default.createElement(UserFocus, { size: 24 })
|
|
398
|
-
))), /* @__PURE__ */ React__default.createElement(TooltipContent, null, "Customer attributes")), /* @__PURE__ */ React__default.createElement(SheetContent, { className: "space-y-4" }, /* @__PURE__ */ React__default.createElement(SheetHeader, null, /* @__PURE__ */ React__default.createElement(SheetTitle, { className: "heading-sm m-0" }, "Custom attributes"), /* @__PURE__ */ React__default.createElement(SheetDescription, { className: "sr-only" }, "Custom attributes are used to store additional information about the conversation.")), sortedAttributesKeys && /* @__PURE__ */ React__default.createElement(ScrollArea, { className: "h-[calc(100vh-8rem)]" }, " ", /* @__PURE__ */ React__default.createElement(Table, { className: "bg-surface", "data-test-id": "attributes-table" }, /* @__PURE__ */ React__default.createElement(TableHeader, null, /* @__PURE__ */ React__default.createElement(TableRow, null, sortedAttributesKeys.map((key) => /* @__PURE__ */ React__default.createElement(TableHead, { key, className: "capitalize font-bold" }, key)))), /* @__PURE__ */ React__default.createElement(TableBody, null, attributes.map((record) => /* @__PURE__ */ React__default.createElement(TableRow, { key: record?.id ?? createId(), className: "border-none" }, sortedAttributesKeys.map((key) => /* @__PURE__ */ React__default.createElement(TableCell, { key, "data-title": key }, typeof record[key] === "boolean" ? String(record[key]) : record[key])))))))));
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
const StreamBadge = React__default.forwardRef(
|
|
402
|
-
({ className, streamName, dotColor = "transparent", ...props }, ref) => {
|
|
403
|
-
return /* @__PURE__ */ React__default.createElement(Tooltip, null, /* @__PURE__ */ React__default.createElement(TooltipTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(
|
|
404
|
-
"div",
|
|
405
|
-
{
|
|
406
|
-
ref,
|
|
407
|
-
role: "button",
|
|
408
|
-
className: cn("flex items-center gap-1 rounded-full p-0", className),
|
|
409
|
-
tabIndex: 0
|
|
410
|
-
},
|
|
411
|
-
/* @__PURE__ */ React__default.createElement(Badge, { ...props, className: "bg-surface rounded-full border border-dark-300 text-subtle" }, /* @__PURE__ */ React__default.createElement("span", { className: "flex items-center gap-1" }, /* @__PURE__ */ React__default.createElement(
|
|
412
|
-
Circle,
|
|
413
|
-
{
|
|
414
|
-
size: 8,
|
|
415
|
-
weight: "bold",
|
|
416
|
-
className: "!size-2 rounded-full",
|
|
417
|
-
style: { backgroundColor: dotColor },
|
|
418
|
-
color: dotColor === "transparent" ? dark[300] : "transparent"
|
|
419
|
-
}
|
|
420
|
-
), /* @__PURE__ */ React__default.createElement("span", { className: "max-w-32 truncate inline-block" }, streamName)))
|
|
421
|
-
)), /* @__PURE__ */ React__default.createElement(TooltipContent, null, streamName));
|
|
422
|
-
}
|
|
423
|
-
);
|
|
424
|
-
StreamBadge.displayName = "StreamBadge";
|
|
425
|
-
|
|
426
|
-
const EnrichedStatusBadge = ({ score, status, statusMessage }) => {
|
|
427
|
-
return score ? /* @__PURE__ */ React__default.createElement(Tooltip, null, /* @__PURE__ */ React__default.createElement(TooltipTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(DivButton, { variant: "ghost", size: "sm", className: "p-0 h-[26px]" }, /* @__PURE__ */ React__default.createElement(StatusBadge, { variant: status, suffix: score }, statusMessage))), /* @__PURE__ */ React__default.createElement(TooltipContent, null, /* @__PURE__ */ React__default.createElement("p", null, "Conversation score: ", score))) : /* @__PURE__ */ React__default.createElement(StatusBadge, { variant: status, suffix: score }, statusMessage);
|
|
428
|
-
};
|
|
429
|
-
function Convo({
|
|
430
|
-
locale: localeOverride,
|
|
431
|
-
value: queryId,
|
|
432
|
-
question,
|
|
433
|
-
timestamp,
|
|
434
|
-
location,
|
|
435
|
-
source,
|
|
436
|
-
status,
|
|
437
|
-
statusMessage,
|
|
438
|
-
hasAttributes,
|
|
439
|
-
onClick,
|
|
440
|
-
className,
|
|
441
|
-
score,
|
|
442
|
-
...props
|
|
443
|
-
}) {
|
|
444
|
-
const { getMessages, isLoading: isLoadingFromContext, locale: contextLocale } = useConvosContext();
|
|
445
|
-
const [openDialog, setOpenDialog] = useState(null);
|
|
446
|
-
const [openFeedbackMessageId, setOpenFeedbackMessageId] = useState(null);
|
|
447
|
-
const handleDialogChange = (dialogType, messageId) => (isOpen) => {
|
|
448
|
-
if (isOpen) {
|
|
449
|
-
setOpenDialog(dialogType);
|
|
450
|
-
if (messageId) setOpenFeedbackMessageId(messageId);
|
|
451
|
-
} else {
|
|
452
|
-
setOpenDialog(null);
|
|
453
|
-
setOpenFeedbackMessageId(null);
|
|
454
|
-
}
|
|
455
|
-
};
|
|
456
|
-
const isAnyDialogOpen = openDialog !== null;
|
|
457
|
-
const locale = localeOverride || contextLocale;
|
|
458
|
-
const messages = getMessages(queryId);
|
|
459
|
-
const isLoading = isLoadingFromContext(queryId);
|
|
460
|
-
const formattedDateRelative = formatDistance(timestamp, locale);
|
|
461
|
-
const description = [formattedDateRelative, location].filter(Boolean).join(" • ");
|
|
462
|
-
const handleAccordionClick = (e) => {
|
|
463
|
-
if (e.target.closest('[role="dialog"]')) {
|
|
464
|
-
e.preventDefault();
|
|
465
|
-
e.stopPropagation();
|
|
466
|
-
return;
|
|
467
|
-
}
|
|
468
|
-
onClick?.();
|
|
469
|
-
};
|
|
470
|
-
return /* @__PURE__ */ React__default.createElement(
|
|
471
|
-
AccordionItem,
|
|
472
|
-
{
|
|
473
|
-
value: queryId,
|
|
474
|
-
className: cn(
|
|
475
|
-
'border border-dark-200 hover:border-dark-300 rounded-lg bg-dark-100 [&[data-state="open"]]:bg-surface [&[data-state="open"]]:border-dark-100',
|
|
476
|
-
{ "shadow-md shadow-dark-300": isAnyDialogOpen },
|
|
477
|
-
className
|
|
478
|
-
),
|
|
479
|
-
...props
|
|
480
|
-
},
|
|
481
|
-
/* @__PURE__ */ React__default.createElement(
|
|
482
|
-
AccordionTrigger,
|
|
483
|
-
{
|
|
484
|
-
className: "flex-row-reverse px-4 gap-1 items-center [&[data-state=open]]:px-6",
|
|
485
|
-
onClick: handleAccordionClick
|
|
486
|
-
},
|
|
487
|
-
/* @__PURE__ */ React__default.createElement(Item, { size: "sm", className: "flex-1 p-0 justify-between" }, /* @__PURE__ */ React__default.createElement(ItemContent, { className: "max-w-[400px]" }, /* @__PURE__ */ React__default.createElement(ItemTitle, { className: "text-base text-default" }, question), /* @__PURE__ */ React__default.createElement(ItemDescription, { className: "text-xs text-default flex items-center gap-1" }, description, source && /* @__PURE__ */ React__default.createElement(StreamBadge, { streamName: source.name, dotColor: source.color }))), /* @__PURE__ */ React__default.createElement("div", { className: "flex items-center gap-0" }, hasAttributes && /* @__PURE__ */ React__default.createElement(
|
|
488
|
-
AttributesDialog,
|
|
489
|
-
{
|
|
490
|
-
conversationId: queryId,
|
|
491
|
-
open: openDialog === "attributes",
|
|
492
|
-
onOpenChange: handleDialogChange("attributes")
|
|
493
|
-
}
|
|
494
|
-
), status && /* @__PURE__ */ React__default.createElement(EnrichedStatusBadge, { score, status, statusMessage })))
|
|
495
|
-
),
|
|
496
|
-
/* @__PURE__ */ React__default.createElement(AccordionContent, { className: "flex flex-col gap-4 text-balance px-5" }, isLoading ? /* @__PURE__ */ React__default.createElement("div", { className: "text-center text-subtle py-4" }, "Loading messages...") : /* @__PURE__ */ React__default.createElement("ul", { className: "list-none space-y-4" }, messages.map((message, idx) => {
|
|
497
|
-
const userMsg = isUserQuestion(message) ? message : null;
|
|
498
|
-
const attachments = userMsg?.attachments?.length ? userMsg.attachments : null;
|
|
499
|
-
if (idx === 0) {
|
|
500
|
-
return attachments ? /* @__PURE__ */ React__default.createElement(
|
|
501
|
-
Message,
|
|
502
|
-
{
|
|
503
|
-
key: message.id,
|
|
504
|
-
...{ ...message, onlyShowAttachments: true },
|
|
505
|
-
isFeedbackDialogOpen: openDialog === "feedback" && openFeedbackMessageId === message.id,
|
|
506
|
-
onFeedbackDialogChange: handleDialogChange("feedback", message.id)
|
|
507
|
-
}
|
|
508
|
-
) : null;
|
|
509
|
-
}
|
|
510
|
-
return /* @__PURE__ */ React__default.createElement(
|
|
511
|
-
Message,
|
|
512
|
-
{
|
|
513
|
-
key: message.id,
|
|
514
|
-
...message,
|
|
515
|
-
isFeedbackDialogOpen: openDialog === "feedback" && openFeedbackMessageId === message.id,
|
|
516
|
-
onFeedbackDialogChange: handleDialogChange("feedback", message.id)
|
|
517
|
-
}
|
|
518
|
-
);
|
|
519
|
-
})))
|
|
520
|
-
);
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
const ConvosContext = React__default.createContext(void 0);
|
|
524
|
-
function useConvosContext() {
|
|
525
|
-
const context = React__default.useContext(ConvosContext);
|
|
526
|
-
if (context === void 0) {
|
|
527
|
-
throw new Error("useConvosContext must be used within a ConvosProvider");
|
|
528
|
-
}
|
|
529
|
-
return context;
|
|
530
|
-
}
|
|
531
|
-
function ConvosProvider({ children, value }) {
|
|
532
|
-
return /* @__PURE__ */ React__default.createElement(ConvosContext.Provider, { value }, children);
|
|
533
|
-
}
|
|
534
|
-
function Convos({
|
|
535
|
-
convos,
|
|
536
|
-
fetchMessages,
|
|
537
|
-
fetchAttributes,
|
|
538
|
-
fetchAnswerDiagnostics,
|
|
539
|
-
onDiscard,
|
|
540
|
-
onApprove
|
|
541
|
-
}) {
|
|
542
|
-
const [messagesMap, setMessagesMap] = React__default.useState({});
|
|
543
|
-
const [loadingMap, setLoadingMap] = React__default.useState({});
|
|
544
|
-
const fetchedSetRef = React__default.useRef(/* @__PURE__ */ new Set());
|
|
545
|
-
const loadingMapRef = React__default.useRef({});
|
|
546
|
-
const handleFetchMessages = React__default.useCallback(
|
|
547
|
-
(conversationId) => {
|
|
548
|
-
if (fetchedSetRef.current.has(conversationId) || loadingMapRef.current[conversationId]) {
|
|
549
|
-
return;
|
|
550
|
-
}
|
|
551
|
-
loadingMapRef.current[conversationId] = true;
|
|
552
|
-
setLoadingMap((prev) => ({ ...prev, [conversationId]: true }));
|
|
553
|
-
fetchMessages(conversationId).then((fetchedMessages) => {
|
|
554
|
-
setMessagesMap((prev) => ({ ...prev, [conversationId]: fetchedMessages }));
|
|
555
|
-
fetchedSetRef.current.add(conversationId);
|
|
556
|
-
}).catch(() => {
|
|
557
|
-
}).finally(() => {
|
|
558
|
-
delete loadingMapRef.current[conversationId];
|
|
559
|
-
setLoadingMap((prev) => {
|
|
560
|
-
const newMap = { ...prev };
|
|
561
|
-
delete newMap[conversationId];
|
|
562
|
-
return newMap;
|
|
563
|
-
});
|
|
564
|
-
});
|
|
565
|
-
},
|
|
566
|
-
[fetchMessages]
|
|
567
|
-
);
|
|
568
|
-
const defaultLocale = convos[0]?.locale;
|
|
569
|
-
const contextValue = React__default.useMemo(
|
|
570
|
-
() => ({
|
|
571
|
-
fetchMessages,
|
|
572
|
-
fetchAttributes,
|
|
573
|
-
getMessages: (conversationId) => messagesMap[conversationId] || [],
|
|
574
|
-
isLoading: (conversationId) => loadingMap[conversationId] || false,
|
|
575
|
-
handleFetchMessages,
|
|
576
|
-
locale: defaultLocale,
|
|
577
|
-
fetchAnswerDiagnostics: (messageId) => fetchAnswerDiagnostics(messageId),
|
|
578
|
-
onDiscard,
|
|
579
|
-
onApprove
|
|
580
|
-
}),
|
|
581
|
-
[
|
|
582
|
-
fetchMessages,
|
|
583
|
-
fetchAttributes,
|
|
584
|
-
messagesMap,
|
|
585
|
-
loadingMap,
|
|
586
|
-
handleFetchMessages,
|
|
587
|
-
defaultLocale,
|
|
588
|
-
fetchAnswerDiagnostics,
|
|
589
|
-
onDiscard,
|
|
590
|
-
onApprove
|
|
591
|
-
]
|
|
592
|
-
);
|
|
593
|
-
return /* @__PURE__ */ React__default.createElement(ConvosProvider, { value: contextValue }, /* @__PURE__ */ React__default.createElement(Accordion, { type: "single", collapsible: true, className: "w-full space-y-2" }, convos.map((convo) => /* @__PURE__ */ React__default.createElement(
|
|
594
|
-
Convo,
|
|
595
|
-
{
|
|
596
|
-
...convo,
|
|
597
|
-
key: convo.value,
|
|
598
|
-
onClick: () => handleFetchMessages(convo.value)
|
|
599
|
-
}
|
|
600
|
-
))));
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
const EmptyConvos = ({ children }) => {
|
|
604
|
-
return /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col items-center justify-center h-full w-full mt-40 gap-2" }, /* @__PURE__ */ React__default.createElement(GeneratingStar, { className: "size-8", variant: "disabled" }), /* @__PURE__ */ React__default.createElement("div", { className: "text-subtlest text-sm w-96 text-center leading-5" }, children));
|
|
605
|
-
};
|
|
606
|
-
|
|
607
|
-
export { Convo, Convos, ConvosProvider, EmptyConvos, Feedback, Message, MessageAttachmentImageThumbnails, MessageType, StatusBadge, isAIAnswer, isAction, isFeedback, isUserQuestion, useConvosContext };
|
|
1
|
+
import e,{useState as t,useEffect as a,useRef as s}from"react";import{S as r}from"../chunks/status-badge.BLB0pWDn.js";import{ArrowSquareOut as n,CheckCircle as l,XCircle as c,ListMagnifyingGlass as i,UserCircle as m,Eye as o,UserFocus as d,Circle as u}from"@phosphor-icons/react";import{F as p}from"../chunks/FormattedMessage.XNMN23hm.js";import{Spinner as f}from"./ui/spinner.js";import{B as E}from"../chunks/button.D_2SonNs.js";import{useForm as g,Controller as h}from"react-hook-form";import{Select as v,SelectTrigger as N,SelectValue as x,SelectContent as b,SelectItem as w}from"./ui/select.js";import{Label as y}from"./ui/label.js";import{Textarea as k}from"./ui/textarea.js";import{Tooltip as C,TooltipTrigger as j,TooltipContent as A}from"./ui/tooltip.js";import{c as _}from"../chunks/utils.C6Qu-kwd.js";import{DivButton as O}from"./ui/div-button.js";import{ScrollArea as S}from"./ui/scroll-area.js";import{Sheet as z,SheetTrigger as D,SheetContent as F,SheetHeader as R,SheetTitle as M,SheetDescription as I}from"./ui/sheet.js";import{Badge as q}from"./ui/badge.js";import{G as P}from"../chunks/generating-star.BN9p_FDu.js";import{Item as T,ItemHeader as B,ItemTitle as L,ItemContent as U,ItemDescription as G}from"./ui/item.js";import{Accordion as K,AccordionItem as W,AccordionTrigger as H,AccordionContent as V}from"./ui/accordion.js";import{c as J,b as Q}from"../chunks/formatDate.D2xEZm8f.js";import{createId as $}from"@paralleldrive/cuid2";import{Table as X,TableHeader as Y,TableRow as Z,TableHead as ee,TableBody as te,TableCell as ae}from"./ui/table.js";import '../global.css';import '../convos.css';/* empty css */import"@radix-ui/react-avatar";import"clsx";import"tailwind-merge";import"@radix-ui/react-collapsible";import"./ui/dropdown-menu.js";import"./ui/switch.js";import"./ui/input.js";import"./ui/popover.js";import"./ui/command.js";import"./ui/dialog.js";import"./ui/card.js";import"./ui/progress.js";import"@radix-ui/react-accordion";import"./ui/alert-dialog.js";import"./ui/alert.js";import"./ui/button-group.js";import"./ui/calendar.js";import"./ui/icon.js";import"./ui/separator.js";import"../logos/microsoft-teams-logo.js";import"../logos/slack-logo.js";import"../logos/microsoft-logo.js";import{d as se}from"../chunks/dark.DuW7JuAk.js";function re({messageId:s}){const{fetchAnswerDiagnostics:r}=ye(),[l,c]=t(null),[i,m]=t(!0);return a(()=>{r(s).then(e=>c(e)).finally(()=>m(!1))},[r,s]),/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-4 px-4 flex-shrink-0 bg-surface","data-name":"discard-dialog-answer-diagnostic"},i?/* @__PURE__ */e.createElement("div",{className:"flex items-center justify-center h-full"},/* @__PURE__ */e.createElement(f,null)):/* @__PURE__ */e.createElement(e.Fragment,null,l&&/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement("dl",{className:"grid grid-cols-[1fr_2fr] grid-rows-2 gap-5"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1"},/* @__PURE__ */e.createElement("dt",{className:"heading-xs"},"Confidence"),/* @__PURE__ */e.createElement("dd",{className:"text-sm"},l.confidence_score)),l.answer_generation_type&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1"},/* @__PURE__ */e.createElement("dt",{className:"heading-xs"},"Answer Type"),/* @__PURE__ */e.createElement("dd",{className:"text-sm"},l.answer_generation_type)),l.query_context_relevance&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1"},/* @__PURE__ */e.createElement("dt",{className:"heading-xs"},"Relevance"),/* @__PURE__ */e.createElement("dd",{className:"text-sm"},l.query_context_relevance)),l.context_sufficiency&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1"},/* @__PURE__ */e.createElement("dt",{className:"heading-xs"},"Context"),/* @__PURE__ */e.createElement("dd",{className:"text-sm"},l.context_sufficiency))),l.confidence_justification&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2","data-name":"diagnostic-justification"},/* @__PURE__ */e.createElement("span",{className:"heading-xs"},"Justification"),/* @__PURE__ */e.createElement("p",{className:"text-sm my-0"},l.confidence_justification)),l.evidence_from_context&&l.evidence_from_context.length>0&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2","data-name":"diagnostic-evidence"},/* @__PURE__ */e.createElement("span",{className:"heading-xs"},"Evidence (from Knowledge Base)"),l.evidence_from_context.map((t,a)=>/* @__PURE__ */e.createElement("div",{key:a,className:"flex flex-col gap-1"},t.supporting_quote&&/* @__PURE__ */e.createElement("p",{className:"text-sm my-0"},t.supporting_quote),t.url&&/* @__PURE__ */e.createElement(E,{variant:"link",size:"sm",className:"flex gap-1 text-sm self-end items-center",asChild:!0},/* @__PURE__ */e.createElement("a",{href:t.url,target:"_blank",rel:"noopener noreferrer"},/* @__PURE__ */e.createElement("span",null,"Source"),/* @__PURE__ */e.createElement(n,{size:16})))))))))}var ne=/* @__PURE__ */(e=>(e.INCORRECT_ANSWER="incorrect_answer",e.HALLUCINATED_ANSWER="hallucinated_answer",e.OVERSHARING="oversharing",e.WRONG_ARTICLE_SURFACED="wrong_article_surfaced",e.OTHER="other",e))(ne||{});const le={incorrect_answer:"Incorrect answer",hallucinated_answer:"Hallucinated answer",oversharing:"Oversharing",wrong_article_surfaced:"Wrong article surfaced",other:"Other"};function ce({discarded:r,discardedMeta:n,onSubmit:i,onApprove:m,selectOpenRef:o,className:d}){const[u,p]=t(r??!1),[f,O]=t(!1),[S,z]=t(r),D=s(null);a(()=>{z(r),r&&p(!0)},[r]);const F=e=>{O(e),o&&(o.current.isOpen=e)};a(()=>{o&&(o.current.close=()=>F(!1))},[o]);const{control:R,register:M,handleSubmit:I,reset:q,formState:{isSubmitting:P}}=g({defaultValues:{reason:n?.reason,preferredAnswer:n?.suggestedAnswer||""}});a(()=>{q({reason:n?.reason,preferredAnswer:n?.suggestedAnswer||""})},[n,q]),a(()=>{D.current&&(D.current.inert=!u)},[u]);const T=null!=S,B=!T||!1===S,L=!T||!0===S;/* @__PURE__ */
|
|
2
|
+
return e.createElement("div",{className:_("space-y-4",d)},/* @__PURE__ */e.createElement("div",{className:"flex gap-2 px-4"},B&&/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(j,{asChild:!0},/* @__PURE__ */e.createElement(E,{variant:"surface",elevation:"shadow",size:"sm",className:_("text-default !opacity-100",{"bg-green-600 text-dark-100":!1===S}),disabled:T,onClick:async()=>{try{await m(),z(!1),p(!1),F(!1)}catch(e){console.error("Failed to approve:",e)}}},
|
|
3
|
+
/* @__PURE__ */e.createElement(l,null)," ",!1===S?"Approved":"Approve")),/* @__PURE__ */e.createElement(A,null,/* @__PURE__ */e.createElement("span",null,"Approve the answer"))),L&&/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(j,{asChild:!0},/* @__PURE__ */e.createElement(E,{variant:"surface",elevation:"shadow",size:"sm",className:_("text-default !opacity-100",{"bg-red-600 text-dark-100":!0===S}),disabled:T,onClick:()=>p(!u)},
|
|
4
|
+
/* @__PURE__ */e.createElement(c,null),!0===S?"Discarded":"Discard")),/* @__PURE__ */e.createElement(A,null,/* @__PURE__ */e.createElement("span",null,"Discard the answer")))),/* @__PURE__ */e.createElement("div",{className:_("grid transition-[grid-template-rows] duration-300 ease-in-out",u?"grid-rows-[1fr]":"grid-rows-[0fr]")},S?/* @__PURE__ */e.createElement("div",{className:_("overflow-hidden min-h-0 px-4 bg-dark-200 space-y-4",u?"py-4 mb-4":"py-0"),"data-name":"discard-dialog-reason"},
|
|
5
|
+
/* @__PURE__ */e.createElement("div",{className:"space-y-1"},/* @__PURE__ */e.createElement(y,{htmlFor:"reason",className:"text-sm"},"Reason"),/* @__PURE__ */e.createElement("span",{className:"text-sm block"},n?.reason&&le[n.reason])),
|
|
6
|
+
/* @__PURE__ */e.createElement("div",{className:"space-y-1"},/* @__PURE__ */e.createElement(y,{htmlFor:"preferredAnswer",className:"text-sm"},"Preferred answer"),/* @__PURE__ */e.createElement("span",{className:"text-sm block"},n?.suggestedAnswer))):/* @__PURE__ */e.createElement("form",{ref:D,onSubmit:I(async e=>{try{await i(e),z(!0),F(!1)}catch(t){console.error("Failed to discard:",t)}}),className:_("overflow-hidden min-h-0 px-4 bg-dark-200 transition-all duration-300 ease-in-out",u?"py-4 mb-4":"py-0")},
|
|
7
|
+
/* @__PURE__ */e.createElement("fieldset",{className:"space-y-4","data-name":"discard-dialog-reason"},/* @__PURE__ */e.createElement("div",{className:"space-y-1"},/* @__PURE__ */e.createElement(y,{htmlFor:"reason",className:"heading-xs"},"Reason"),/* @__PURE__ */e.createElement(h,{control:R,name:"reason",rules:{required:!0},render:({field:t})=>/* @__PURE__ */e.createElement(v,{value:t.value,onValueChange:t.onChange,open:f,onOpenChange:F,required:!0},
|
|
8
|
+
/* @__PURE__ */e.createElement(N,{className:"border-dark-300 bg-surface"},/* @__PURE__ */e.createElement(x,{placeholder:"Select a reason"})),
|
|
9
|
+
/* @__PURE__ */e.createElement(b,null,Object.values(ne).map(t=>/* @__PURE__ */e.createElement(w,{key:t,value:t},le[t]))))}),/* @__PURE__ */e.createElement("span",{className:"text-xs text-subtle ml-1 hidden"},"Give your ambient agent a descriptive name that reflects its purpose. This agent will learn from your content to provide personalized assistance.")),/* @__PURE__ */e.createElement("div",{className:"space-y-1"},/* @__PURE__ */e.createElement(y,{htmlFor:"preferredAnswer",className:"heading-xs"},"Preferred answer"),/* @__PURE__ */e.createElement(k,{id:"preferredAnswer",required:!0,minLength:10,placeholder:"Explain what you'd like Brainfish to do next time in this case....",rows:4,className:"h-52 resize-none bg-surface",...M("preferredAnswer")}),/* @__PURE__ */e.createElement("span",{className:"text-xs text-subtle ml-1 hidden"},"Tell Brainfish why this is the incorrect answer.")),/* @__PURE__ */e.createElement("div",{className:"flex gap-2 !mb-1 justify-end mr-1"},/* @__PURE__ */e.createElement(E,{variant:"link",size:"sm",type:"button",onClick:()=>{p(!1),F(!1),q()}},"Cancel"),/* @__PURE__ */e.createElement(E,{type:"submit",variant:"default",elevation:"shadow",size:"sm",disabled:P},P?"Submitting...":"Submit"))))))}function ie({id:a,discarded:r,discardedMeta:n,open:l,onOpenChange:c,...m}){const{onDiscard:o,onApprove:d}=ye(),[u,p]=t(!1),f=s({isOpen:!1,close:()=>{}}),E=l??u,g=c??p;/* @__PURE__ */
|
|
10
|
+
return e.createElement(z,{modal:!1,open:E,onOpenChange:g,...m},/* @__PURE__ */e.createElement(D,{asChild:!0,onClick:e=>e.stopPropagation(),onKeyUp:e=>e.stopPropagation()},/* @__PURE__ */e.createElement(O,{variant:"shadowSurface",size:"sm","aria-label":"Inspect answer information"},/* @__PURE__ */e.createElement(i,{className:"text-dark-600"})," Inspect")),/* @__PURE__ */e.createElement(F,{className:"space-y-4 px-0",onEscapeKeyDown:e=>{f.current.isOpen&&(e.preventDefault(),f.current.close())},onInteractOutside:e=>{f.current.isOpen&&e.preventDefault()}},
|
|
11
|
+
/* @__PURE__ */e.createElement(R,{className:"px-4"},/* @__PURE__ */e.createElement(M,{className:"heading-sm m-0"},"Answer information"),/* @__PURE__ */e.createElement(I,{className:"sr-only"},"Shows answer diagnostics and allows you to provide feedback.")),
|
|
12
|
+
/* @__PURE__ */e.createElement(S,{className:"h-[calc(100vh-4rem)] pb-4"},/* @__PURE__ */e.createElement(ce,{discarded:r,discardedMeta:n,onSubmit:async e=>{await o(a,e.reason,e.preferredAnswer).then(()=>g(!1))},onApprove:async()=>{await d(a)},selectOpenRef:f}),/* @__PURE__ */e.createElement(re,{messageId:a}))))}const me=({score:t})=>{const a=`${t}%`;return!t||t>100?/* @__PURE__ */e.createElement(q,{variant:"disabled"},"N/A"):t>=80?/* @__PURE__ */e.createElement(q,{variant:"success"},a):t>=40&&t<80?/* @__PURE__ */e.createElement(q,{variant:"warning"},a):/* @__PURE__ */e.createElement(q,{variant:"disabled"},"N/A")};var oe=/* @__PURE__ */(e=>(e.ACTION="action",e.FEEDBACK="feedback",e.QUESTION="question",e.ANSWER="answer",e))(oe||{}),de=/* @__PURE__ */(e=>(e.Positive="positive",e.Negative="negative",e))(de||{});const ue=e=>"answer"===e.type,pe=e=>"question"===e.type,fe=e=>"feedback"===e.type,Ee=e=>"action"===e.type;function ge({attachments:t}){/* @__PURE__ */
|
|
13
|
+
return e.createElement("div",{className:"flex gap-2 flex-wrap"},t.filter(e=>"image"===e.type).map((t,a)=>/* @__PURE__ */e.createElement("div",{key:a,className:"relative bg-dark-300 p-1 rounded shrink-0"},/* @__PURE__ */e.createElement("a",{href:t.url,target:"_blank",rel:"noopener noreferrer"},/* @__PURE__ */e.createElement("img",{src:t.url,alt:"",className:"size-14 object-cover rounded"})),/* @__PURE__ */e.createElement("div",{className:"absolute top-1.5 right-1.5 bg-dark-300 rounded-full p-0.5"},/* @__PURE__ */e.createElement(o,{size:8})))))}function he(t){const{id:a,content:s,timestamp:l,locale:c,isFeedbackDialogOpen:i,onFeedbackDialogChange:o}=t,{locale:d}=ye(),u=J(l,c||d);if(ue(t)){const{relatedArticles:r,discarded:l,discardedMeta:c,confidenceScore:m}=t;/* @__PURE__ */
|
|
14
|
+
return e.createElement("li",{className:"relative before-line after-line list-none [&_a]:break-all"},/* @__PURE__ */e.createElement(T,{className:"message-item"},/* @__PURE__ */e.createElement(B,{className:"justify-start gap-0"},/* @__PURE__ */e.createElement(P,{variant:"gradient",className:"relative -left-[6px]"}),/* @__PURE__ */e.createElement(L,{className:"text-xs font-bold"},"Generated answer "+(l?"(Discarded)":""))),/* @__PURE__ */e.createElement(U,{className:_("message-ai-content",{"py-6":!r?.length,"pt-6 pb-0":r?.length})},
|
|
15
|
+
/* @__PURE__ */e.createElement("div",{className:"message-content-wrapper"},/* @__PURE__ */e.createElement(p,{message:{content:s}}),/* @__PURE__ */e.createElement("div",{className:"flex gap-2 justify-between mt-2 items-center"},/* @__PURE__ */e.createElement("span",{className:"message-timestamp"},u),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2"},m&&/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(j,{asChild:!0},/* @__PURE__ */e.createElement(O,{variant:"outline",size:"sm",className:"text-xs p-1 h-auto"},m)),/* @__PURE__ */e.createElement(A,null,/* @__PURE__ */e.createElement("p",null,"Answer score: ",m))),/* @__PURE__ */e.createElement(ie,{id:a,discarded:l,discardedMeta:c,open:i,onOpenChange:o})))),!!r?.length&&/* @__PURE__ */e.createElement(K,{type:"single",collapsible:!0,className:"p-0 custom-dashed-border-t-dark-300 w-full"},/* @__PURE__ */e.createElement(W,{value:"related-articles"},/* @__PURE__ */e.createElement(H,{className:"px-6"},"Related articles"),/* @__PURE__ */e.createElement(V,null,/* @__PURE__ */e.createElement("ul",{className:"message-article-list"},r.map(t=>/* @__PURE__ */e.createElement("li",{key:t.id,className:"grid gap-2 grid-cols-[auto_1fr] items-center justify-items-start"},
|
|
16
|
+
/* @__PURE__ */e.createElement(me,{score:Math.round(100*t.score)}),
|
|
17
|
+
/* @__PURE__ */e.createElement(E,{variant:"link",size:"xs",asChild:!0,className:"flex items-center gap-2 min-w-0 !justify-start w-full"},
|
|
18
|
+
/* @__PURE__ */e.createElement("a",{href:t.url,target:"_blank",rel:"noopener noreferrer"},/* @__PURE__ */e.createElement("span",{className:"truncate"},t.title),/* @__PURE__ */e.createElement(n,{className:"size-4 flex-shrink-0",weight:"regular"}))))))))))))}const f=fe(t)?t.feedback:null;/* @__PURE__ */
|
|
19
|
+
return e.createElement("li",{className:"relative list-none before-line--user after-line--user"},/* @__PURE__ */e.createElement(T,{className:"message-item"},/* @__PURE__ */e.createElement(B,{className:"basis-0"},/* @__PURE__ */e.createElement(m,{weight:"fill",size:24})),/* @__PURE__ */e.createElement(U,{className:"message-user-content"},pe(t)&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2"},t.attachments&&t.attachments.some(e=>"image"===e.type)&&/* @__PURE__ */e.createElement(ge,{attachments:t.attachments}),!t.onlyShowAttachments&&/* @__PURE__ */e.createElement(p,{message:{content:s}}),/* @__PURE__ */e.createElement("span",{className:"message-timestamp"},u)),fe(t)&&f&&/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement("div",{className:"message-header"},/* @__PURE__ */e.createElement("div",{className:"message-feedback-text"},"positive"===f?"Upvoted as helpful":"Downvoted as not helpful"),/* @__PURE__ */e.createElement("div",{className:"message-meta"},/* @__PURE__ */e.createElement(r,{variant:"positive"===f?"success":"destructive"},"positive"===f?"Answered":"Unable to help"))),s&&/* @__PURE__ */e.createElement("div",{className:"text-base mb-1"},s),/* @__PURE__ */e.createElement("span",{className:"message-timestamp-simple"},u)),Ee(t)&&/* @__PURE__ */e.createElement("div",{className:"message-header"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2"},/* @__PURE__ */e.createElement("span",{className:"text-subtle text-sm italic"},s),/* @__PURE__ */e.createElement("span",{className:"message-timestamp-simple"},u)),/* @__PURE__ */e.createElement("div",{className:"message-meta"},/* @__PURE__ */e.createElement(r,{variant:"warning"},"Action"))))))}function ve({conversationId:s,open:r,onOpenChange:n,...l}){const[c,i]=t(),[m,o]=t(),{fetchAttributes:u}=ye();return a(()=>{u(s).then(e=>{i(e),o(function(e){const t=["id","name","email","phone"];if(0===e.length)return[];const a=e=>{const a=t.indexOf(e);return-1===a?1/0:a};return Object.keys(e[0]).sort((e,t)=>a(e)-a(t))}(e))}).catch(()=>{})},[u,s]),c?.length?/* @__PURE__ */e.createElement(z,{modal:!1,open:r,onOpenChange:n,...l},/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(j,{asChild:!0},/* @__PURE__ */e.createElement(D,{asChild:!0,onClick:e=>e.stopPropagation(),onKeyUp:e=>e.stopPropagation()},/* @__PURE__ */e.createElement(O,{variant:"ghost",size:"icon",className:"size-7 [&_svg]:size-6 text-dark-900","aria-label":"Open Custom attributes dialog"},
|
|
20
|
+
/* @__PURE__ */e.createElement(d,{size:24})))),/* @__PURE__ */e.createElement(A,null,"Customer attributes")),/* @__PURE__ */e.createElement(F,{className:"space-y-4"},/* @__PURE__ */e.createElement(R,null,/* @__PURE__ */e.createElement(M,{className:"heading-sm m-0"},"Custom attributes"),/* @__PURE__ */e.createElement(I,{className:"sr-only"},"Custom attributes are used to store additional information about the conversation.")),m&&/* @__PURE__ */e.createElement(S,{className:"h-[calc(100vh-8rem)]"}," ",/* @__PURE__ */e.createElement(X,{className:"bg-surface","data-test-id":"attributes-table"},/* @__PURE__ */e.createElement(Y,null,/* @__PURE__ */e.createElement(Z,null,m.map(t=>/* @__PURE__ */e.createElement(ee,{key:t,className:"capitalize font-bold"},t)))),/* @__PURE__ */e.createElement(te,null,c.map(t=>/* @__PURE__ */e.createElement(Z,{key:t?.id??$(),className:"border-none"},m.map(a=>/* @__PURE__ */e.createElement(ae,{key:a,"data-title":a},"boolean"==typeof t[a]?String(t[a]):t[a]))))))))):null}const Ne=e.forwardRef(({className:t,streamName:a,dotColor:s="transparent",...r},n)=>/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(j,{asChild:!0},/* @__PURE__ */e.createElement("div",{ref:n,role:"button",className:_("flex items-center gap-1 rounded-full p-0",t),tabIndex:0},
|
|
21
|
+
/* @__PURE__ */e.createElement(q,{...r,className:"bg-surface rounded-full border border-dark-300 text-subtle"},/* @__PURE__ */e.createElement("span",{className:"flex items-center gap-1"},/* @__PURE__ */e.createElement(u,{size:8,weight:"bold",className:"!size-2 rounded-full",style:{backgroundColor:s},color:"transparent"===s?se[300]:"transparent"}),/* @__PURE__ */e.createElement("span",{className:"max-w-32 truncate inline-block"},a))))),/* @__PURE__ */e.createElement(A,null,a)));Ne.displayName="StreamBadge";const xe=({score:t,status:a,statusMessage:s})=>t?/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(j,{asChild:!0},/* @__PURE__ */e.createElement(O,{variant:"ghost",size:"sm",className:"p-0 h-[26px]"},/* @__PURE__ */e.createElement(r,{variant:a,suffix:t},s))),/* @__PURE__ */e.createElement(A,null,/* @__PURE__ */e.createElement("p",null,"Conversation score: ",t))):/* @__PURE__ */e.createElement(r,{variant:a,suffix:t},s);function be({locale:a,value:s,question:r,timestamp:n,location:l,source:c,status:i,statusMessage:m,hasAttributes:o,onClick:d,className:u,score:p,...f}){const{getMessages:E,isLoading:g,locale:h}=ye(),[v,N]=t(null),[x,b]=t(null),w=(e,t)=>a=>{a?(N(e),t&&b(t)):(N(null),b(null))},y=null!==v,k=a||h,C=E(s),j=g(s),A=[Q(n,k),l].filter(Boolean).join(" • ");/* @__PURE__ */
|
|
22
|
+
return e.createElement(W,{value:s,className:_('border border-dark-200 hover:border-dark-300 rounded-lg bg-dark-100 [&[data-state="open"]]:bg-surface [&[data-state="open"]]:border-dark-100',{"shadow-md shadow-dark-300":y},u),...f},
|
|
23
|
+
/* @__PURE__ */e.createElement(H,{className:"flex-row-reverse px-4 gap-1 items-center [&[data-state=open]]:px-6",onClick:e=>{if(e.target.closest('[role="dialog"]'))return e.preventDefault(),void e.stopPropagation();d?.()}},
|
|
24
|
+
/* @__PURE__ */e.createElement(T,{size:"sm",className:"flex-1 p-0 justify-between"},/* @__PURE__ */e.createElement(U,{className:"max-w-[400px]"},/* @__PURE__ */e.createElement(L,{className:"text-base text-default"},r),/* @__PURE__ */e.createElement(G,{className:"text-xs text-default flex items-center gap-1"},A,c&&/* @__PURE__ */e.createElement(Ne,{streamName:c.name,dotColor:c.color}))),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-0"},o&&/* @__PURE__ */e.createElement(ve,{conversationId:s,open:"attributes"===v,onOpenChange:w("attributes")}),i&&/* @__PURE__ */e.createElement(xe,{score:p,status:i,statusMessage:m})))),
|
|
25
|
+
/* @__PURE__ */e.createElement(V,{className:"flex flex-col gap-4 text-balance px-5"},j?/* @__PURE__ */e.createElement("div",{className:"text-center text-subtle py-4"},"Loading messages..."):/* @__PURE__ */e.createElement("ul",{className:"list-none space-y-4"},C.map((t,a)=>{const s=pe(t)?t:null,r=s?.attachments?.length?s.attachments:null;return 0===a?r?/* @__PURE__ */e.createElement(he,{key:t.id,...{...t,onlyShowAttachments:!0},isFeedbackDialogOpen:"feedback"===v&&x===t.id,onFeedbackDialogChange:w("feedback",t.id)}):null:/* @__PURE__ */e.createElement(he,{key:t.id,...t,isFeedbackDialogOpen:"feedback"===v&&x===t.id,onFeedbackDialogChange:w("feedback",t.id)})}))))}const we=e.createContext(void 0);function ye(){const t=e.useContext(we);if(void 0===t)throw new Error("useConvosContext must be used within a ConvosProvider");return t}function ke({children:t,value:a}){/* @__PURE__ */
|
|
26
|
+
return e.createElement(we.Provider,{value:a},t)}function Ce({convos:t,fetchMessages:a,fetchAttributes:s,fetchAnswerDiagnostics:r,onDiscard:n,onApprove:l}){const[c,i]=e.useState({}),[m,o]=e.useState({}),d=e.useRef(/* @__PURE__ */new Set),u=e.useRef({}),p=e.useCallback(e=>{d.current.has(e)||u.current[e]||(u.current[e]=!0,o(t=>({...t,[e]:!0})),a(e).then(t=>{i(a=>({...a,[e]:t})),d.current.add(e)}).catch(()=>{}).finally(()=>{delete u.current[e],o(t=>{const a={...t};return delete a[e],a})}))},[a]),f=t[0]?.locale,E=e.useMemo(()=>({fetchMessages:a,fetchAttributes:s,getMessages:e=>c[e]||[],isLoading:e=>m[e]||!1,handleFetchMessages:p,locale:f,fetchAnswerDiagnostics:e=>r(e),onDiscard:n,onApprove:l}),[a,s,c,m,p,f,r,n,l]);/* @__PURE__ */
|
|
27
|
+
return e.createElement(ke,{value:E},/* @__PURE__ */e.createElement(K,{type:"single",collapsible:!0,className:"w-full space-y-2"},t.map(t=>/* @__PURE__ */e.createElement(be,{...t,key:t.value,onClick:()=>p(t.value)}))))}const je=({children:t})=>/* @__PURE__ */e.createElement("div",{className:"flex flex-col items-center justify-center h-full w-full mt-40 gap-2"},/* @__PURE__ */e.createElement(P,{className:"size-8",variant:"disabled"}),/* @__PURE__ */e.createElement("div",{className:"text-subtlest text-sm w-96 text-center leading-5"},t));export{be as Convo,Ce as Convos,ke as ConvosProvider,je as EmptyConvos,de as Feedback,he as Message,ge as MessageAttachmentImageThumbnails,oe as MessageType,r as StatusBadge,ue as isAIAnswer,Ee as isAction,fe as isFeedback,pe as isUserQuestion,ye as useConvosContext};
|
|
608
28
|
//# sourceMappingURL=convos.js.map
|