@brainfish-ai/components 0.18.0 → 0.18.4-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ui/sheet.d.ts +2 -0
- package/dist/convos.d.ts +58 -36
- package/dist/div-button.d.ts +6 -6
- package/dist/esm/chunks/{ChatSearch.D_vAxj0b.js → ChatSearch.B1M0RZvX.js} +17 -16
- package/dist/esm/chunks/ChatSearch.B1M0RZvX.js.map +1 -0
- package/dist/esm/chunks/{FormattedMessage.C2OwhDXi.js → FormattedMessage.ieoe4jPf.js} +5 -5
- package/dist/esm/chunks/{FormattedMessage.C2OwhDXi.js.map → FormattedMessage.ieoe4jPf.js.map} +1 -1
- package/dist/esm/chunks/{feedback.NWn6_mYe.js → feedback.DkdQ_9Xt.js} +5 -49
- package/dist/esm/chunks/feedback.DkdQ_9Xt.js.map +1 -0
- package/dist/esm/chunks/love.o_d3F-ZG.js +56 -0
- package/dist/esm/chunks/love.o_d3F-ZG.js.map +1 -0
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/convos.js +258 -155
- package/dist/esm/components/convos.js.map +1 -1
- package/dist/esm/components/feedback.js +1 -1
- package/dist/esm/components/markdown.js +1 -1
- package/dist/esm/components/ui/button.js +1 -1
- package/dist/esm/components/ui/button.js.map +1 -1
- package/dist/esm/components/ui/div-button.js +5 -5
- package/dist/esm/components/ui/div-button.js.map +1 -1
- package/dist/esm/components/ui/sheet.js +99 -0
- package/dist/esm/components/ui/sheet.js.map +1 -0
- package/dist/esm/convos.css +1 -1
- package/dist/esm/global.css +1 -0
- package/dist/esm/index.js +15 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tailwind.preset.js +4 -1
- package/dist/esm/tailwind.preset.js.map +1 -1
- package/dist/index.d.ts +196 -102
- package/dist/sheet.d.ts +39 -0
- package/dist/stats.html +1 -1
- package/package.json +3 -2
- package/tailwind.config.js +17 -0
- package/tailwind.preset.ts +4 -1
- package/dist/esm/chunks/ChatSearch.D_vAxj0b.js.map +0 -1
- package/dist/esm/chunks/_basePickBy-CwGxyceg.Xb99Kj9y.js +0 -140
- package/dist/esm/chunks/_basePickBy-CwGxyceg.Xb99Kj9y.js.map +0 -1
- package/dist/esm/chunks/_baseUniq-DPdR3RIY.CwjYlx_X.js +0 -585
- package/dist/esm/chunks/_baseUniq-DPdR3RIY.CwjYlx_X.js.map +0 -1
- package/dist/esm/chunks/arc-DCsLb4RX.BSykn17U.js +0 -84
- package/dist/esm/chunks/arc-DCsLb4RX.BSykn17U.js.map +0 -1
- package/dist/esm/chunks/architectureDiagram-W76B3OCA-wIkmQqR8.apwMoUL6.js +0 -4662
- package/dist/esm/chunks/architectureDiagram-W76B3OCA-wIkmQqR8.apwMoUL6.js.map +0 -1
- package/dist/esm/chunks/blockDiagram-QIGZ2CNN-DOHijbkj.Bhy4DvtQ.js +0 -2262
- package/dist/esm/chunks/blockDiagram-QIGZ2CNN-DOHijbkj.Bhy4DvtQ.js.map +0 -1
- package/dist/esm/chunks/c4Diagram-FPNF74CW-BDvLZfmS.BqXyX6vZ.js +0 -1581
- package/dist/esm/chunks/c4Diagram-FPNF74CW-BDvLZfmS.BqXyX6vZ.js.map +0 -1
- package/dist/esm/chunks/channel-B_G4xVvq.CDI0vVb4.js +0 -6
- package/dist/esm/chunks/channel-B_G4xVvq.CDI0vVb4.js.map +0 -1
- package/dist/esm/chunks/chunk-4BX2VUAB-BZuS0UUH.Cg_xxXPg.js +0 -9
- package/dist/esm/chunks/chunk-4BX2VUAB-BZuS0UUH.Cg_xxXPg.js.map +0 -1
- package/dist/esm/chunks/chunk-55IACEB6-zeObXUUN.DHI8ANMR.js +0 -9
- package/dist/esm/chunks/chunk-55IACEB6-zeObXUUN.DHI8ANMR.js.map +0 -1
- package/dist/esm/chunks/chunk-FMBD7UC4-Ployc43X.DXd4JseP.js +0 -20
- package/dist/esm/chunks/chunk-FMBD7UC4-Ployc43X.DXd4JseP.js.map +0 -1
- package/dist/esm/chunks/chunk-K7UQS3LO-DlVqoBtA.DX3jgm_E.js +0 -1373
- package/dist/esm/chunks/chunk-K7UQS3LO-DlVqoBtA.DX3jgm_E.js.map +0 -1
- package/dist/esm/chunks/chunk-QN33PNHL-AUdLDoKI.BY-ym94M.js +0 -20
- package/dist/esm/chunks/chunk-QN33PNHL-AUdLDoKI.BY-ym94M.js.map +0 -1
- package/dist/esm/chunks/chunk-QZHKN3VN-DqO1gyPu.ez2zb3P8.js +0 -16
- package/dist/esm/chunks/chunk-QZHKN3VN-DqO1gyPu.ez2zb3P8.js.map +0 -1
- package/dist/esm/chunks/chunk-TVAH2DTR-DfXCdP5R.DQy4Fkrs.js +0 -1368
- package/dist/esm/chunks/chunk-TVAH2DTR-DfXCdP5R.DQy4Fkrs.js.map +0 -1
- package/dist/esm/chunks/chunk-TZMSLE5B-rpRajlFG.hDeYXYTj.js +0 -59
- package/dist/esm/chunks/chunk-TZMSLE5B-rpRajlFG.hDeYXYTj.js.map +0 -1
- package/dist/esm/chunks/classDiagram-KNZD7YFC-Dvpwq6te.Cn76BN4H.js +0 -17
- package/dist/esm/chunks/classDiagram-KNZD7YFC-Dvpwq6te.Cn76BN4H.js.map +0 -1
- package/dist/esm/chunks/classDiagram-v2-RKCZMP56-Dvpwq6te.Cn76BN4H.js +0 -17
- package/dist/esm/chunks/classDiagram-v2-RKCZMP56-Dvpwq6te.Cn76BN4H.js.map +0 -1
- package/dist/esm/chunks/clone-BE7mMQvS.DWQ34rNI.js +0 -9
- package/dist/esm/chunks/clone-BE7mMQvS.DWQ34rNI.js.map +0 -1
- package/dist/esm/chunks/cose-bilkent-S5V4N54A-BUsrR_iz.Bh8yg7Po.js +0 -2610
- package/dist/esm/chunks/cose-bilkent-S5V4N54A-BUsrR_iz.Bh8yg7Po.js.map +0 -1
- package/dist/esm/chunks/cytoscape.esm-qgs_QMrm.Cg6eOcD7.js +0 -18633
- package/dist/esm/chunks/cytoscape.esm-qgs_QMrm.Cg6eOcD7.js.map +0 -1
- package/dist/esm/chunks/dagre-5GWH7T2D-BCK0K3-J.B8kiMv3u.js +0 -445
- package/dist/esm/chunks/dagre-5GWH7T2D-BCK0K3-J.B8kiMv3u.js.map +0 -1
- package/dist/esm/chunks/defaultLocale-D7EN2tov.B8F577Sx.js +0 -168
- package/dist/esm/chunks/defaultLocale-D7EN2tov.B8F577Sx.js.map +0 -1
- package/dist/esm/chunks/diagram-N5W7TBWH-DNHeQ1XG.DSk26vS_.js +0 -533
- package/dist/esm/chunks/diagram-N5W7TBWH-DNHeQ1XG.DSk26vS_.js.map +0 -1
- package/dist/esm/chunks/diagram-QEK2KX5R-CLGfmIsQ.CyC2UTXK.js +0 -218
- package/dist/esm/chunks/diagram-QEK2KX5R-CLGfmIsQ.CyC2UTXK.js.map +0 -1
- package/dist/esm/chunks/diagram-S2PKOQOG-CFTty0ve.D1LXKq3X.js +0 -143
- package/dist/esm/chunks/diagram-S2PKOQOG-CFTty0ve.D1LXKq3X.js.map +0 -1
- package/dist/esm/chunks/erDiagram-AWTI2OKA-DI06fG0A.CN7PNzR5.js +0 -842
- package/dist/esm/chunks/erDiagram-AWTI2OKA-DI06fG0A.CN7PNzR5.js.map +0 -1
- package/dist/esm/chunks/feedback.NWn6_mYe.js.map +0 -1
- package/dist/esm/chunks/flowDiagram-PVAE7QVJ-cS0QwpLW.jM7NbRUh.js +0 -1621
- package/dist/esm/chunks/flowDiagram-PVAE7QVJ-cS0QwpLW.jM7NbRUh.js.map +0 -1
- package/dist/esm/chunks/ganttDiagram-OWAHRB6G-g0lXLgos.B7pPM-og.js +0 -2506
- package/dist/esm/chunks/ganttDiagram-OWAHRB6G-g0lXLgos.B7pPM-og.js.map +0 -1
- package/dist/esm/chunks/gitGraphDiagram-NY62KEGX-B4wrMGJN.BFxyjY4k.js +0 -700
- package/dist/esm/chunks/gitGraphDiagram-NY62KEGX-B4wrMGJN.BFxyjY4k.js.map +0 -1
- package/dist/esm/chunks/graph-BuR5bqPu.C7CFP2zs.js +0 -248
- package/dist/esm/chunks/graph-BuR5bqPu.C7CFP2zs.js.map +0 -1
- package/dist/esm/chunks/infoDiagram-STP46IZ2-CGDBggCS.DCEC64lG.js +0 -25
- package/dist/esm/chunks/infoDiagram-STP46IZ2-CGDBggCS.DCEC64lG.js.map +0 -1
- package/dist/esm/chunks/init-DjUOC4st.BOEiyheD.js +0 -16
- package/dist/esm/chunks/init-DjUOC4st.BOEiyheD.js.map +0 -1
- package/dist/esm/chunks/journeyDiagram-BIP6EPQ6-BGl5AI_2.sOXXDhT-.js +0 -837
- package/dist/esm/chunks/journeyDiagram-BIP6EPQ6-BGl5AI_2.sOXXDhT-.js.map +0 -1
- package/dist/esm/chunks/kanban-definition-6OIFK2YF-Br5Lf76e.B761uhE_.js +0 -720
- package/dist/esm/chunks/kanban-definition-6OIFK2YF-Br5Lf76e.B761uhE_.js.map +0 -1
- package/dist/esm/chunks/katex-SsTUIUTC.Ci8jyli6.js +0 -11675
- package/dist/esm/chunks/katex-SsTUIUTC.Ci8jyli6.js.map +0 -1
- package/dist/esm/chunks/layout-p8eM70uN.FvhPiL74.js +0 -1322
- package/dist/esm/chunks/layout-p8eM70uN.FvhPiL74.js.map +0 -1
- package/dist/esm/chunks/linear-DZf3n5Zt.FxmYe42o.js +0 -256
- package/dist/esm/chunks/linear-DZf3n5Zt.FxmYe42o.js.map +0 -1
- package/dist/esm/chunks/markdownTranslator-D7_8pMsF.C3NBLaFd.js +0 -15968
- package/dist/esm/chunks/markdownTranslator-D7_8pMsF.C3NBLaFd.js.map +0 -1
- package/dist/esm/chunks/mermaid.core-CqFoMSZo.D88DhzXd.js +0 -15491
- package/dist/esm/chunks/mermaid.core-CqFoMSZo.D88DhzXd.js.map +0 -1
- package/dist/esm/chunks/mindmap-definition-Q6HEUPPD-C1kH3VVd.Cyskcv6i.js +0 -782
- package/dist/esm/chunks/mindmap-definition-Q6HEUPPD-C1kH3VVd.Cyskcv6i.js.map +0 -1
- package/dist/esm/chunks/ordinal-DfAQgscy.J1PPD2vL.js +0 -62
- package/dist/esm/chunks/ordinal-DfAQgscy.J1PPD2vL.js.map +0 -1
- package/dist/esm/chunks/paragraph-node-CmRSSJjl.DeUA_7DY.js +0 -61348
- package/dist/esm/chunks/paragraph-node-CmRSSJjl.DeUA_7DY.js.map +0 -1
- package/dist/esm/chunks/pieDiagram-ADFJNKIX-BJslR05R.DjzQR5vc.js +0 -162
- package/dist/esm/chunks/pieDiagram-ADFJNKIX-BJslR05R.DjzQR5vc.js.map +0 -1
- package/dist/esm/chunks/quadrantDiagram-LMRXKWRM-D1e_ge5x.DI9xyo0H.js +0 -1023
- package/dist/esm/chunks/quadrantDiagram-LMRXKWRM-D1e_ge5x.DI9xyo0H.js.map +0 -1
- package/dist/esm/chunks/requirementDiagram-4UW4RH46-D0dwxz8M.RFf2JPMN.js +0 -851
- package/dist/esm/chunks/requirementDiagram-4UW4RH46-D0dwxz8M.RFf2JPMN.js.map +0 -1
- package/dist/esm/chunks/sankeyDiagram-GR3RE2ED-Bjb_rMVp.Cqz6Fi3a.js +0 -811
- package/dist/esm/chunks/sankeyDiagram-GR3RE2ED-Bjb_rMVp.Cqz6Fi3a.js.map +0 -1
- package/dist/esm/chunks/sequenceDiagram-C3RYC4MD-B4BgA_NP.DusV8c9r.js +0 -2512
- package/dist/esm/chunks/sequenceDiagram-C3RYC4MD-B4BgA_NP.DusV8c9r.js.map +0 -1
- package/dist/esm/chunks/simple-editor.Dy2IcVOx.js +0 -9474
- package/dist/esm/chunks/simple-editor.Dy2IcVOx.js.map +0 -1
- package/dist/esm/chunks/simple-viewer-D5Y0qq6S.eLIcVhig.js +0 -5543
- package/dist/esm/chunks/simple-viewer-D5Y0qq6S.eLIcVhig.js.map +0 -1
- package/dist/esm/chunks/stateDiagram-KXAO66HF-BTfthjTl.DTGpiufP.js +0 -264
- package/dist/esm/chunks/stateDiagram-KXAO66HF-BTfthjTl.DTGpiufP.js.map +0 -1
- package/dist/esm/chunks/stateDiagram-v2-UMBNRL4Z-CY-NEjvL.DCJld7HR.js +0 -17
- package/dist/esm/chunks/stateDiagram-v2-UMBNRL4Z-CY-NEjvL.DCJld7HR.js.map +0 -1
- package/dist/esm/chunks/timeline-definition-XQNQX7LJ-DaQHmG4W.4EzpEGiV.js +0 -798
- package/dist/esm/chunks/timeline-definition-XQNQX7LJ-DaQHmG4W.4EzpEGiV.js.map +0 -1
- package/dist/esm/chunks/treemap-75Q7IDZK-BNMPwj0E.CnZbkKYI.js +0 -12982
- package/dist/esm/chunks/treemap-75Q7IDZK-BNMPwj0E.CnZbkKYI.js.map +0 -1
- package/dist/esm/chunks/xychartDiagram-6GGTOJPD-fFGQonuW.B9WMwjJb.js +0 -1341
- package/dist/esm/chunks/xychartDiagram-6GGTOJPD-fFGQonuW.B9WMwjJb.js.map +0 -1
- package/dist/esm/components/markdown-editor-viewer.js +0 -2
- package/dist/esm/components/markdown-editor-viewer.js.map +0 -1
- package/dist/esm/index.css +0 -1
- package/dist/markdown-editor-viewer.d.ts +0 -105
|
@@ -1,24 +1,43 @@
|
|
|
1
|
-
import React__default, { useState, useEffect } from 'react';
|
|
2
|
-
import { Circle, ArrowSquareOut, ThumbsDown,
|
|
1
|
+
import React__default, { useState, useEffect, useRef } from 'react';
|
|
2
|
+
import { Circle, ArrowSquareOut, ThumbsUp, ThumbsDown, Info, UserCircle, UserFocus } from '@phosphor-icons/react';
|
|
3
3
|
import { Badge } from './ui/badge.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { c as cn } from '../chunks/utils.Cwtlq8dh.js';
|
|
5
|
+
import { F as FormattedMessage } from '../chunks/FormattedMessage.ieoe4jPf.js';
|
|
6
|
+
import { Spinner } from './ui/spinner.js';
|
|
7
7
|
import { Button } from './ui/button.js';
|
|
8
|
+
import { useForm, Controller } from 'react-hook-form';
|
|
8
9
|
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './ui/select.js';
|
|
9
10
|
import { Label } from './ui/label.js';
|
|
10
|
-
import { ButtonGroup } from '../componentns/ui/button-group.js';
|
|
11
11
|
import { Textarea } from './ui/textarea.js';
|
|
12
|
+
import { Tooltip, TooltipTrigger, TooltipContent } from './ui/tooltip.js';
|
|
13
|
+
import { L as Love } from '../chunks/love.o_d3F-ZG.js';
|
|
14
|
+
import { DivButton } from './ui/div-button.js';
|
|
12
15
|
import { ScrollArea } from './ui/scroll-area.js';
|
|
13
|
-
import {
|
|
14
|
-
import { c as cn } from '../chunks/utils.Cwtlq8dh.js';
|
|
16
|
+
import { Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle, SheetDescription } from './ui/sheet.js';
|
|
15
17
|
import { G as GeneratingStar } from '../chunks/generating-star.COkD0gHd.js';
|
|
16
18
|
import { Item, ItemHeader, ItemTitle, ItemContent, ItemDescription } from './ui/item.js';
|
|
17
19
|
import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from './ui/accordion.js';
|
|
18
|
-
import {
|
|
20
|
+
import { createId } from '@paralleldrive/cuid2';
|
|
21
|
+
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from './ui/table.js';
|
|
22
|
+
import '../global.css';import '../convos.css';/* empty css */
|
|
23
|
+
import '@radix-ui/react-collapsible';
|
|
24
|
+
import './ui/dropdown-menu.js';
|
|
25
|
+
import './ui/switch.js';
|
|
26
|
+
import './ui/input.js';
|
|
27
|
+
import './ui/popover.js';
|
|
28
|
+
import './ui/command.js';
|
|
29
|
+
import './ui/dialog.js';
|
|
30
|
+
import './ui/card.js';
|
|
31
|
+
import './ui/progress.js';
|
|
32
|
+
import './ui/alert-dialog.js';
|
|
33
|
+
import './ui/alert.js';
|
|
34
|
+
import '../componentns/ui/button-group.js';
|
|
35
|
+
import './ui/calendar.js';
|
|
36
|
+
import './ui/icon.js';
|
|
37
|
+
import './ui/separator.js';
|
|
19
38
|
|
|
20
|
-
|
|
21
|
-
return /* @__PURE__ */ React__default.createElement(Badge, { ...props }, /* @__PURE__ */ React__default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ React__default.createElement(Circle, { weight: "fill", size: 8, className: "size-2" }),
|
|
39
|
+
function StatusBadge({ className, suffix, children, ...props }) {
|
|
40
|
+
return /* @__PURE__ */ React__default.createElement("div", { className: cn("flex items-center gap-1 rounded-md p-1", suffix && "bg-dark-300", className) }, /* @__PURE__ */ React__default.createElement(Badge, { ...props }, /* @__PURE__ */ React__default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ React__default.createElement(Circle, { weight: "fill", size: 8, className: "size-2" }), children)), suffix && /* @__PURE__ */ React__default.createElement("span", { className: "text-xs text-default" }, suffix));
|
|
22
41
|
}
|
|
23
42
|
|
|
24
43
|
function AnswerDiagnosticsSection({ messageId }) {
|
|
@@ -28,41 +47,43 @@ function AnswerDiagnosticsSection({ messageId }) {
|
|
|
28
47
|
useEffect(() => {
|
|
29
48
|
void fetchAnswerDiagnostics(messageId).then((diagnostics) => setAnswerDiagnostics(diagnostics)).finally(() => setIsLoading(false));
|
|
30
49
|
}, [fetchAnswerDiagnostics, messageId]);
|
|
31
|
-
return /* @__PURE__ */ React__default.createElement(
|
|
32
|
-
ScrollArea,
|
|
33
|
-
{
|
|
34
|
-
type: "always",
|
|
35
|
-
className: "h-[440px] border border-dark-300 rounded-lg",
|
|
36
|
-
"data-name": "discard-dialog-answer-diagnostic"
|
|
37
|
-
},
|
|
38
|
-
/* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-4 p-4 flex-shrink-0 bg-surface" }, /* @__PURE__ */ React__default.createElement("h3", { className: "text-lg font-medium my-0" }, "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: "font-medium" }, "Confidence"), /* @__PURE__ */ React__default.createElement("dd", { className: "text-xs" }, answerDiagnostics.confidence_score)), answerDiagnostics.answer_generation_type && /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ React__default.createElement("dt", { className: "font-medium" }, "Answer Type"), /* @__PURE__ */ React__default.createElement("dd", { className: "text-xs" }, 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: "font-medium" }, "Relevance"), /* @__PURE__ */ React__default.createElement("dd", { className: "text-xs" }, answerDiagnostics.query_context_relevance)), answerDiagnostics.context_sufficiency && /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ React__default.createElement("dt", { className: "font-medium" }, "Context"), /* @__PURE__ */ React__default.createElement("dd", { className: "text-xs" }, 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: "font-medium" }, "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: "font-medium" }, "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(
|
|
39
|
-
"a",
|
|
40
|
-
{
|
|
41
|
-
href: evidence.url,
|
|
42
|
-
target: "_blank",
|
|
43
|
-
rel: "noopener noreferrer",
|
|
44
|
-
className: "flex gap-1 text-sm self-end items-center"
|
|
45
|
-
},
|
|
46
|
-
/* @__PURE__ */ React__default.createElement("span", null, "Source"),
|
|
47
|
-
/* @__PURE__ */ React__default.createElement(ArrowSquareOut, { size: 16 })
|
|
48
|
-
)))))))
|
|
49
|
-
);
|
|
50
|
+
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 })))))))));
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
var DiscardReason = /* @__PURE__ */ ((DiscardReason2) => {
|
|
54
|
+
DiscardReason2["INCORRECT_ANSWER"] = "incorrect_answer";
|
|
55
|
+
DiscardReason2["HALLUCINATED_ANSWER"] = "hallucinated_answer";
|
|
56
|
+
DiscardReason2["OVERSHARING"] = "oversharing";
|
|
57
|
+
DiscardReason2["WRONG_ARTICLE_SURFACED"] = "wrong_article_surfaced";
|
|
58
|
+
DiscardReason2["OTHER"] = "other";
|
|
59
|
+
return DiscardReason2;
|
|
60
|
+
})(DiscardReason || {});
|
|
61
|
+
const DiscardReasonLabels = {
|
|
62
|
+
["incorrect_answer" /* INCORRECT_ANSWER */]: "Incorrect answer",
|
|
63
|
+
["hallucinated_answer" /* HALLUCINATED_ANSWER */]: "Hallucinated answer",
|
|
64
|
+
["oversharing" /* OVERSHARING */]: "Oversharing",
|
|
65
|
+
["wrong_article_surfaced" /* WRONG_ARTICLE_SURFACED */]: "Wrong article surfaced",
|
|
66
|
+
["other" /* OTHER */]: "Other"
|
|
67
|
+
};
|
|
68
|
+
function DiscardForm({
|
|
54
69
|
discarded,
|
|
55
70
|
discardedMeta,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
71
|
+
onSubmit,
|
|
72
|
+
onApprove,
|
|
73
|
+
selectOpenRef,
|
|
74
|
+
className
|
|
60
75
|
}) {
|
|
61
|
-
const
|
|
62
|
-
const [isSelectOpen,
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
const
|
|
76
|
+
const [isExpanded, setIsExpanded] = useState(discarded ?? false);
|
|
77
|
+
const [isSelectOpen, setIsSelectOpenState] = useState(false);
|
|
78
|
+
const formRef = useRef(null);
|
|
79
|
+
const [showLove, setShowLove] = useState(false);
|
|
80
|
+
const setIsSelectOpen = (open) => {
|
|
81
|
+
setIsSelectOpenState(open);
|
|
82
|
+
if (selectOpenRef) selectOpenRef.current.isOpen = open;
|
|
83
|
+
};
|
|
84
|
+
if (selectOpenRef) {
|
|
85
|
+
selectOpenRef.current.close = () => setIsSelectOpen(false);
|
|
86
|
+
}
|
|
66
87
|
const {
|
|
67
88
|
control,
|
|
68
89
|
register,
|
|
@@ -81,73 +102,158 @@ function DiscardDialog({
|
|
|
81
102
|
preferredAnswer: discardedMeta?.suggestedAnswer || ""
|
|
82
103
|
});
|
|
83
104
|
}, [discardedMeta, reset]);
|
|
84
|
-
|
|
85
|
-
|
|
105
|
+
useEffect(() => {
|
|
106
|
+
if (formRef.current) {
|
|
107
|
+
formRef.current.inert = !isExpanded;
|
|
108
|
+
}
|
|
109
|
+
}, [isExpanded]);
|
|
110
|
+
const handleCancel = () => {
|
|
111
|
+
setIsExpanded(false);
|
|
112
|
+
setIsSelectOpen(false);
|
|
113
|
+
reset();
|
|
114
|
+
};
|
|
115
|
+
const handleApprove = () => {
|
|
116
|
+
setShowLove(true);
|
|
117
|
+
setTimeout(() => setShowLove(false), 2e3);
|
|
118
|
+
onApprove();
|
|
86
119
|
};
|
|
87
|
-
|
|
120
|
+
const isResolved = discarded !== void 0 && discarded !== null;
|
|
121
|
+
return /* @__PURE__ */ React__default.createElement("div", { className: cn("space-y-4", className) }, /* @__PURE__ */ React__default.createElement("div", { className: "flex gap-2 px-4" }, /* @__PURE__ */ React__default.createElement(Love, { doAnimation: showLove }, /* @__PURE__ */ React__default.createElement(Tooltip, null, /* @__PURE__ */ React__default.createElement(TooltipTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(
|
|
88
122
|
Button,
|
|
89
123
|
{
|
|
90
124
|
variant: "shadow",
|
|
91
125
|
className: cn(
|
|
92
|
-
"size-
|
|
93
|
-
|
|
126
|
+
"size-8 text-default !opacity-100",
|
|
127
|
+
{ "bg-surface": !isResolved },
|
|
128
|
+
{ "bg-dark-300": discarded === true },
|
|
129
|
+
{ "bg-green-600 text-dark-100": discarded === false }
|
|
94
130
|
),
|
|
95
|
-
size: "icon"
|
|
131
|
+
size: "icon",
|
|
132
|
+
disabled: isResolved,
|
|
133
|
+
onClick: handleApprove
|
|
134
|
+
},
|
|
135
|
+
/* @__PURE__ */ React__default.createElement(ThumbsUp, null)
|
|
136
|
+
)), /* @__PURE__ */ React__default.createElement(TooltipContent, null, /* @__PURE__ */ React__default.createElement("span", null, "Approve the answer")))), /* @__PURE__ */ React__default.createElement(Tooltip, null, /* @__PURE__ */ React__default.createElement(TooltipTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(
|
|
137
|
+
Button,
|
|
138
|
+
{
|
|
139
|
+
variant: "shadow",
|
|
140
|
+
className: cn(
|
|
141
|
+
"size-8 text-default !opacity-100",
|
|
142
|
+
{ "bg-surface": !isResolved },
|
|
143
|
+
{ "bg-dark-300": discarded === false },
|
|
144
|
+
{ "bg-red-600 text-dark-100": discarded === true }
|
|
145
|
+
),
|
|
146
|
+
size: "icon",
|
|
147
|
+
disabled: isResolved,
|
|
148
|
+
onClick: () => setIsExpanded(!isExpanded)
|
|
149
|
+
},
|
|
150
|
+
/* @__PURE__ */ React__default.createElement(ThumbsDown, null)
|
|
151
|
+
)), /* @__PURE__ */ React__default.createElement(TooltipContent, null, /* @__PURE__ */ React__default.createElement("span", null, "Discard the answer")))), /* @__PURE__ */ React__default.createElement(
|
|
152
|
+
"div",
|
|
153
|
+
{
|
|
154
|
+
className: cn(
|
|
155
|
+
"grid transition-[grid-template-rows] duration-300 ease-in-out",
|
|
156
|
+
isExpanded ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
|
|
157
|
+
)
|
|
96
158
|
},
|
|
97
|
-
/* @__PURE__ */ React__default.createElement(
|
|
98
|
-
|
|
99
|
-
|
|
159
|
+
discarded ? /* @__PURE__ */ React__default.createElement(
|
|
160
|
+
"div",
|
|
161
|
+
{
|
|
162
|
+
className: cn("overflow-hidden min-h-0 px-4 bg-dark-200 space-y-4", isExpanded ? "py-4 mb-4" : "py-0"),
|
|
163
|
+
"data-name": "discard-dialog-reason"
|
|
164
|
+
},
|
|
165
|
+
/* @__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])),
|
|
166
|
+
/* @__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))
|
|
167
|
+
) : /* @__PURE__ */ React__default.createElement(
|
|
168
|
+
"form",
|
|
169
|
+
{
|
|
170
|
+
ref: formRef,
|
|
171
|
+
onSubmit: handleSubmit(onSubmit),
|
|
172
|
+
className: cn(
|
|
173
|
+
"overflow-hidden min-h-0 px-4 bg-dark-200 transition-all duration-300 ease-in-out",
|
|
174
|
+
isExpanded ? "py-4 mb-4" : "py-0"
|
|
175
|
+
)
|
|
176
|
+
},
|
|
177
|
+
/* @__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(
|
|
178
|
+
Controller,
|
|
179
|
+
{
|
|
180
|
+
control,
|
|
181
|
+
name: "reason",
|
|
182
|
+
rules: { required: true },
|
|
183
|
+
render: ({ field }) => /* @__PURE__ */ React__default.createElement(
|
|
184
|
+
Select,
|
|
185
|
+
{
|
|
186
|
+
value: field.value,
|
|
187
|
+
onValueChange: field.onChange,
|
|
188
|
+
open: isSelectOpen,
|
|
189
|
+
onOpenChange: setIsSelectOpen,
|
|
190
|
+
required: true
|
|
191
|
+
},
|
|
192
|
+
/* @__PURE__ */ React__default.createElement(SelectTrigger, { className: "border-dark-300 bg-surface" }, /* @__PURE__ */ React__default.createElement(SelectValue, { placeholder: "Select a reason" })),
|
|
193
|
+
/* @__PURE__ */ React__default.createElement(SelectContent, null, Object.values(DiscardReason).map((reason) => /* @__PURE__ */ React__default.createElement(SelectItem, { key: reason, value: reason }, DiscardReasonLabels[reason])))
|
|
194
|
+
)
|
|
195
|
+
}
|
|
196
|
+
), /* @__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(
|
|
197
|
+
Textarea,
|
|
198
|
+
{
|
|
199
|
+
id: "preferredAnswer",
|
|
200
|
+
required: true,
|
|
201
|
+
minLength: 10,
|
|
202
|
+
placeholder: "Explain what you'd like Brainfish to do next time in this case....",
|
|
203
|
+
rows: 4,
|
|
204
|
+
className: "h-52 resize-none bg-surface",
|
|
205
|
+
...register("preferredAnswer")
|
|
206
|
+
}
|
|
207
|
+
), /* @__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")))
|
|
208
|
+
)
|
|
209
|
+
));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function FeedbackDialog({
|
|
213
|
+
id,
|
|
214
|
+
discarded,
|
|
215
|
+
discardedMeta,
|
|
216
|
+
open: externalOpen,
|
|
217
|
+
onOpenChange: externalOnOpenChange,
|
|
218
|
+
...args
|
|
219
|
+
}) {
|
|
220
|
+
const { onDiscard, onApprove } = useConvosContext();
|
|
221
|
+
const [internalOpen, setInternalOpen] = useState(false);
|
|
222
|
+
const selectOpenRef = useRef({ isOpen: false, close: () => {
|
|
223
|
+
} });
|
|
224
|
+
const isOpen = externalOpen ?? internalOpen;
|
|
225
|
+
const setIsOpen = externalOnOpenChange ?? setInternalOpen;
|
|
226
|
+
const onSubmitForm = async (data) => {
|
|
227
|
+
await onDiscard(id, data.reason, data.preferredAnswer).then(() => setIsOpen(false));
|
|
228
|
+
};
|
|
229
|
+
const handleApprove = () => onApprove(id);
|
|
230
|
+
return /* @__PURE__ */ React__default.createElement(Sheet, { modal: false, open: isOpen, onOpenChange: setIsOpen, ...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(DivButton, { variant: "ghost", className: "size-7 [&_svg]:size-6 text-dark-600", size: "icon" }, /* @__PURE__ */ React__default.createElement(Info, null)))), /* @__PURE__ */ React__default.createElement(TooltipContent, null, /* @__PURE__ */ React__default.createElement("p", null, "Answer information"))), /* @__PURE__ */ React__default.createElement(
|
|
231
|
+
SheetContent,
|
|
100
232
|
{
|
|
101
|
-
className: "
|
|
233
|
+
className: "space-y-4 px-0",
|
|
102
234
|
onEscapeKeyDown: (e) => {
|
|
103
|
-
if (
|
|
235
|
+
if (selectOpenRef.current.isOpen) {
|
|
236
|
+
e.preventDefault();
|
|
237
|
+
selectOpenRef.current.close();
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
onInteractOutside: (e) => {
|
|
241
|
+
if (selectOpenRef.current.isOpen) {
|
|
104
242
|
e.preventDefault();
|
|
105
|
-
setIsSelectOpen(false);
|
|
106
243
|
}
|
|
107
244
|
}
|
|
108
245
|
},
|
|
109
|
-
/* @__PURE__ */ React__default.createElement(
|
|
110
|
-
/* @__PURE__ */ React__default.createElement(
|
|
111
|
-
|
|
112
|
-
{
|
|
113
|
-
control,
|
|
114
|
-
name: "reason",
|
|
115
|
-
rules: { required: true },
|
|
116
|
-
render: ({ field }) => /* @__PURE__ */ React__default.createElement(
|
|
117
|
-
Select,
|
|
118
|
-
{
|
|
119
|
-
value: field.value,
|
|
120
|
-
onValueChange: field.onChange,
|
|
121
|
-
open: isSelectOpen,
|
|
122
|
-
onOpenChange: setIsSelectOpen,
|
|
123
|
-
required: true
|
|
124
|
-
},
|
|
125
|
-
/* @__PURE__ */ React__default.createElement(SelectTrigger, { className: "border-dark-300 bg-surface" }, /* @__PURE__ */ React__default.createElement(SelectValue, { placeholder: "Select a reason" })),
|
|
126
|
-
/* @__PURE__ */ React__default.createElement(SelectContent, null, /* @__PURE__ */ React__default.createElement(SelectItem, { value: "incorrect_answer" /* INCORRECT_ANSWER */ }, "Incorrect answer"), /* @__PURE__ */ React__default.createElement(SelectItem, { value: "hallucinated_answer" /* HALLUCINATED_ANSWER */ }, "Hallucinated answer"), /* @__PURE__ */ React__default.createElement(SelectItem, { value: "oversharing" /* OVERSHARING */ }, "Oversharing"), /* @__PURE__ */ React__default.createElement(SelectItem, { value: "wrong_article_surfaced" /* WRONG_ARTICLE_SURFACED */ }, "Wrong article surfaced"), /* @__PURE__ */ React__default.createElement(SelectItem, { value: "other" /* OTHER */ }, "Other"))
|
|
127
|
-
)
|
|
128
|
-
}
|
|
129
|
-
)), /* @__PURE__ */ React__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React__default.createElement(Label, { htmlFor: "preferredAnswer", className: "text-base font-normal" }, "Preferred answer"), /* @__PURE__ */ React__default.createElement(
|
|
130
|
-
Textarea,
|
|
246
|
+
/* @__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.")),
|
|
247
|
+
/* @__PURE__ */ React__default.createElement(ScrollArea, { className: "h-[calc(100vh-4rem)] pb-4" }, /* @__PURE__ */ React__default.createElement(
|
|
248
|
+
DiscardForm,
|
|
131
249
|
{
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
className: "h-52 resize-none bg-surface",
|
|
138
|
-
...register("preferredAnswer")
|
|
250
|
+
discarded,
|
|
251
|
+
discardedMeta,
|
|
252
|
+
onSubmit: onSubmitForm,
|
|
253
|
+
onApprove: handleApprove,
|
|
254
|
+
selectOpenRef
|
|
139
255
|
}
|
|
140
|
-
), /* @__PURE__ */ React__default.createElement(
|
|
141
|
-
)), /* @__PURE__ */ React__default.createElement(
|
|
142
|
-
Button,
|
|
143
|
-
{
|
|
144
|
-
variant: "shadow",
|
|
145
|
-
className: cn("bg-surface size-7 text-dark-800", { "!opacity-100 bg-dark-300": discarded }),
|
|
146
|
-
size: "icon",
|
|
147
|
-
disabled: discarded,
|
|
148
|
-
onClick: () => onApprove(id)
|
|
149
|
-
},
|
|
150
|
-
/* @__PURE__ */ React__default.createElement(ThumbsUp, null)
|
|
256
|
+
), /* @__PURE__ */ React__default.createElement(AnswerDiagnosticsSection, { messageId: id }))
|
|
151
257
|
));
|
|
152
258
|
}
|
|
153
259
|
|
|
@@ -182,23 +288,18 @@ var Feedback = /* @__PURE__ */ ((Feedback2) => {
|
|
|
182
288
|
Feedback2["Negative"] = "negative";
|
|
183
289
|
return Feedback2;
|
|
184
290
|
})(Feedback || {});
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
feedback,
|
|
192
|
-
timestamp,
|
|
193
|
-
locale: localeOverride,
|
|
194
|
-
discarded,
|
|
195
|
-
discardedMeta
|
|
196
|
-
}) {
|
|
291
|
+
const isAIAnswer = (msg) => msg.type === "answer" /* ANSWER */;
|
|
292
|
+
const isUserQuestion = (msg) => msg.type === "question" /* QUESTION */;
|
|
293
|
+
const isFeedback = (msg) => msg.type === "feedback" /* FEEDBACK */;
|
|
294
|
+
const isAction = (msg) => msg.type === "action" /* ACTION */;
|
|
295
|
+
function Message(props) {
|
|
296
|
+
const { id, content, timestamp, locale: localeOverride } = props;
|
|
197
297
|
const { locale: contextLocale } = useConvosContext();
|
|
198
298
|
const locale = localeOverride || contextLocale;
|
|
199
299
|
const formattedDate = formatDate(timestamp, locale);
|
|
200
|
-
if (
|
|
201
|
-
|
|
300
|
+
if (isAIAnswer(props)) {
|
|
301
|
+
const { relatedArticles, discarded, discardedMeta, confidenceScore } = props;
|
|
302
|
+
return /* @__PURE__ */ React__default.createElement("li", { className: "relative before-line after-line list-none" }, /* @__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(
|
|
202
303
|
ItemContent,
|
|
203
304
|
{
|
|
204
305
|
className: cn("message-ai-content", {
|
|
@@ -206,16 +307,7 @@ function Message({
|
|
|
206
307
|
"pt-6 pb-0": relatedArticles?.length
|
|
207
308
|
})
|
|
208
309
|
},
|
|
209
|
-
/* @__PURE__ */ React__default.createElement(
|
|
210
|
-
DiscardDialog,
|
|
211
|
-
{
|
|
212
|
-
id,
|
|
213
|
-
discarded,
|
|
214
|
-
discardedMeta,
|
|
215
|
-
className: "absolute -top-4 right-5"
|
|
216
|
-
}
|
|
217
|
-
),
|
|
218
|
-
/* @__PURE__ */ React__default.createElement("div", { className: "message-content-wrapper" }, /* @__PURE__ */ React__default.createElement(FormattedMessage, { message: { content } }), /* @__PURE__ */ React__default.createElement("span", { className: "message-timestamp float-right mt-2" }, formattedDate)),
|
|
310
|
+
/* @__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-end mt-2 items-center" }, /* @__PURE__ */ React__default.createElement(FeedbackDialog, { id, discarded, discardedMeta }), 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("span", { className: "message-timestamp" }, formattedDate))),
|
|
219
311
|
!!relatedArticles?.length && /* @__PURE__ */ React__default.createElement(Accordion, { type: "single", collapsible: true, className: "p-0 custom-dashed-border-t-dark-300" }, /* @__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("li", { key: article.id, className: "message-meta" }, /* @__PURE__ */ React__default.createElement(Badge, { variant: "warning" }, Math.round(article.score * 100), "%"), /* @__PURE__ */ React__default.createElement(
|
|
220
312
|
"a",
|
|
221
313
|
{
|
|
@@ -229,50 +321,46 @@ function Message({
|
|
|
229
321
|
)))))))
|
|
230
322
|
)));
|
|
231
323
|
}
|
|
232
|
-
|
|
324
|
+
const feedback = isFeedback(props) ? props.feedback : null;
|
|
325
|
+
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: "message-header" }, /* @__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("span", { className: "message-timestamp-simple" }, formattedDate), /* @__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" }, content)), isAction(props) && /* @__PURE__ */ React__default.createElement("div", { className: "message-header" }, /* @__PURE__ */ React__default.createElement("span", { className: "text-subtle text-sm italic" }, content), /* @__PURE__ */ React__default.createElement("div", { className: "message-meta" }, /* @__PURE__ */ React__default.createElement("span", { className: "message-timestamp-simple" }, formattedDate), /* @__PURE__ */ React__default.createElement(StatusBadge, { variant: "warning" }, "Action"))))));
|
|
233
326
|
}
|
|
234
327
|
|
|
235
|
-
function
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
},
|
|
246
|
-
{}
|
|
247
|
-
);
|
|
328
|
+
function sortAttributeKeys(attributes) {
|
|
329
|
+
const PRIORITY_KEYS = ["id", "name", "email", "phone"];
|
|
330
|
+
if (attributes.length === 0) {
|
|
331
|
+
return [];
|
|
332
|
+
}
|
|
333
|
+
const priority = (key) => {
|
|
334
|
+
const idx = PRIORITY_KEYS.indexOf(key);
|
|
335
|
+
return idx === -1 ? Infinity : idx;
|
|
336
|
+
};
|
|
337
|
+
return Object.keys(attributes[0]).sort((a, b) => priority(a) - priority(b));
|
|
248
338
|
}
|
|
249
339
|
|
|
250
340
|
function AttributesDialog({ conversationId, ...args }) {
|
|
251
341
|
const [attributes, setAttributes] = useState();
|
|
342
|
+
const [sortedAttributesKeys, setSortedAttributesKeys] = useState();
|
|
252
343
|
const { fetchAttributes } = useConvosContext();
|
|
253
344
|
useEffect(() => {
|
|
254
|
-
void fetchAttributes(conversationId).then((attrs) =>
|
|
345
|
+
void fetchAttributes(conversationId).then((attrs) => {
|
|
346
|
+
setAttributes(attrs);
|
|
347
|
+
setSortedAttributesKeys(sortAttributeKeys(attrs));
|
|
348
|
+
}).catch(() => {
|
|
255
349
|
});
|
|
256
350
|
}, [fetchAttributes, conversationId]);
|
|
257
351
|
if (!attributes?.length) {
|
|
258
352
|
return null;
|
|
259
353
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
Button,
|
|
354
|
+
return /* @__PURE__ */ React__default.createElement(Sheet, { modal: false, ...args }, /* @__PURE__ */ React__default.createElement(SheetTrigger, { asChild: true, onClick: (e) => e.stopPropagation(), onKeyUp: (e) => e.stopPropagation() }, /* @__PURE__ */ React__default.createElement(
|
|
355
|
+
DivButton,
|
|
263
356
|
{
|
|
264
357
|
variant: "ghost",
|
|
265
|
-
className: cn("size-7"),
|
|
266
358
|
size: "icon",
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
},
|
|
270
|
-
onKeyUp: (e) => {
|
|
271
|
-
e.stopPropagation();
|
|
272
|
-
}
|
|
359
|
+
className: "size-7 [&_svg]:size-6 text-subtlest",
|
|
360
|
+
"aria-label": "Open Custom attributes dialog"
|
|
273
361
|
},
|
|
274
|
-
/* @__PURE__ */ React__default.createElement(UserFocus, { size:
|
|
275
|
-
)), /* @__PURE__ */ React__default.createElement(
|
|
362
|
+
/* @__PURE__ */ React__default.createElement(UserFocus, { size: 24 })
|
|
363
|
+
)), /* @__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 }, record[key])))))))));
|
|
276
364
|
}
|
|
277
365
|
|
|
278
366
|
function Convo({
|
|
@@ -287,6 +375,7 @@ function Convo({
|
|
|
287
375
|
hasAttributes,
|
|
288
376
|
onClick,
|
|
289
377
|
className,
|
|
378
|
+
score,
|
|
290
379
|
...props
|
|
291
380
|
}) {
|
|
292
381
|
const { getMessages, isLoading: isLoadingFromContext, locale: contextLocale } = useConvosContext();
|
|
@@ -303,7 +392,29 @@ function Convo({
|
|
|
303
392
|
}
|
|
304
393
|
onClick?.();
|
|
305
394
|
};
|
|
306
|
-
|
|
395
|
+
const EnrichedStatusBadge = ({ score: score2 }) => {
|
|
396
|
+
return score2 ? /* @__PURE__ */ React__default.createElement(Tooltip, null, /* @__PURE__ */ React__default.createElement(TooltipTrigger, null, /* @__PURE__ */ React__default.createElement(StatusBadge, { variant: status, suffix: score2 }, statusMessage)), /* @__PURE__ */ React__default.createElement(TooltipContent, null, /* @__PURE__ */ React__default.createElement("p", null, "Conversation score: ", score2))) : /* @__PURE__ */ React__default.createElement(StatusBadge, { variant: status, suffix: score2 }, statusMessage);
|
|
397
|
+
};
|
|
398
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
399
|
+
AccordionItem,
|
|
400
|
+
{
|
|
401
|
+
value: queryId,
|
|
402
|
+
className: cn(
|
|
403
|
+
'border-none rounded-lg bg-dark-100 [&[data-state="open"]]:bg-surface hover:bg-surface [&[data-state=open]]:shadow-md [&[data-state=open]]:shadow-dark-300',
|
|
404
|
+
className
|
|
405
|
+
),
|
|
406
|
+
...props
|
|
407
|
+
},
|
|
408
|
+
/* @__PURE__ */ React__default.createElement(
|
|
409
|
+
AccordionTrigger,
|
|
410
|
+
{
|
|
411
|
+
className: "flex-row-reverse px-4 gap-1 items-center [&[data-state=open]]:px-6",
|
|
412
|
+
onClick: handleAccordionClick
|
|
413
|
+
},
|
|
414
|
+
/* @__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" }, description)), /* @__PURE__ */ React__default.createElement("div", { className: "flex items-center gap-0" }, hasAttributes && /* @__PURE__ */ React__default.createElement(AttributesDialog, { conversationId: queryId }), status && /* @__PURE__ */ React__default.createElement(EnrichedStatusBadge, { score })))
|
|
415
|
+
),
|
|
416
|
+
/* @__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.slice(1).map((message) => /* @__PURE__ */ React__default.createElement(Message, { key: message.id, ...message }))))
|
|
417
|
+
);
|
|
307
418
|
}
|
|
308
419
|
|
|
309
420
|
const ConvosContext = React__default.createContext(void 0);
|
|
@@ -379,20 +490,12 @@ function Convos({
|
|
|
379
490
|
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(
|
|
380
491
|
Convo,
|
|
381
492
|
{
|
|
493
|
+
...convo,
|
|
382
494
|
key: convo.value,
|
|
383
|
-
value: convo.value,
|
|
384
|
-
question: convo.question,
|
|
385
|
-
timestamp: convo.timestamp,
|
|
386
|
-
location: convo.location,
|
|
387
|
-
source: convo.source,
|
|
388
|
-
status: convo.status,
|
|
389
|
-
statusMessage: convo.statusMessage,
|
|
390
|
-
hasAttributes: convo.hasAttributes,
|
|
391
|
-
locale: convo.locale,
|
|
392
495
|
onClick: () => handleFetchMessages(convo.value)
|
|
393
496
|
}
|
|
394
497
|
))));
|
|
395
498
|
}
|
|
396
499
|
|
|
397
|
-
export { Convo, Convos, ConvosProvider, Feedback, Message, MessageType, StatusBadge, useConvosContext };
|
|
500
|
+
export { Convo, Convos, ConvosProvider, Feedback, Message, MessageType, StatusBadge, isAIAnswer, isAction, isFeedback, isUserQuestion, useConvosContext };
|
|
398
501
|
//# sourceMappingURL=convos.js.map
|