@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.
Files changed (148) hide show
  1. package/dist/components/ui/sheet.d.ts +2 -0
  2. package/dist/convos.d.ts +58 -36
  3. package/dist/div-button.d.ts +6 -6
  4. package/dist/esm/chunks/{ChatSearch.D_vAxj0b.js → ChatSearch.B1M0RZvX.js} +17 -16
  5. package/dist/esm/chunks/ChatSearch.B1M0RZvX.js.map +1 -0
  6. package/dist/esm/chunks/{FormattedMessage.C2OwhDXi.js → FormattedMessage.ieoe4jPf.js} +5 -5
  7. package/dist/esm/chunks/{FormattedMessage.C2OwhDXi.js.map → FormattedMessage.ieoe4jPf.js.map} +1 -1
  8. package/dist/esm/chunks/{feedback.NWn6_mYe.js → feedback.DkdQ_9Xt.js} +5 -49
  9. package/dist/esm/chunks/feedback.DkdQ_9Xt.js.map +1 -0
  10. package/dist/esm/chunks/love.o_d3F-ZG.js +56 -0
  11. package/dist/esm/chunks/love.o_d3F-ZG.js.map +1 -0
  12. package/dist/esm/components/chat-search.js +1 -1
  13. package/dist/esm/components/convos.js +258 -155
  14. package/dist/esm/components/convos.js.map +1 -1
  15. package/dist/esm/components/feedback.js +1 -1
  16. package/dist/esm/components/markdown.js +1 -1
  17. package/dist/esm/components/ui/button.js +1 -1
  18. package/dist/esm/components/ui/button.js.map +1 -1
  19. package/dist/esm/components/ui/div-button.js +5 -5
  20. package/dist/esm/components/ui/div-button.js.map +1 -1
  21. package/dist/esm/components/ui/sheet.js +99 -0
  22. package/dist/esm/components/ui/sheet.js.map +1 -0
  23. package/dist/esm/convos.css +1 -1
  24. package/dist/esm/global.css +1 -0
  25. package/dist/esm/index.js +15 -4
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/esm/tailwind.preset.js +4 -1
  28. package/dist/esm/tailwind.preset.js.map +1 -1
  29. package/dist/index.d.ts +196 -102
  30. package/dist/sheet.d.ts +39 -0
  31. package/dist/stats.html +1 -1
  32. package/package.json +3 -2
  33. package/tailwind.config.js +17 -0
  34. package/tailwind.preset.ts +4 -1
  35. package/dist/esm/chunks/ChatSearch.D_vAxj0b.js.map +0 -1
  36. package/dist/esm/chunks/_basePickBy-CwGxyceg.Xb99Kj9y.js +0 -140
  37. package/dist/esm/chunks/_basePickBy-CwGxyceg.Xb99Kj9y.js.map +0 -1
  38. package/dist/esm/chunks/_baseUniq-DPdR3RIY.CwjYlx_X.js +0 -585
  39. package/dist/esm/chunks/_baseUniq-DPdR3RIY.CwjYlx_X.js.map +0 -1
  40. package/dist/esm/chunks/arc-DCsLb4RX.BSykn17U.js +0 -84
  41. package/dist/esm/chunks/arc-DCsLb4RX.BSykn17U.js.map +0 -1
  42. package/dist/esm/chunks/architectureDiagram-W76B3OCA-wIkmQqR8.apwMoUL6.js +0 -4662
  43. package/dist/esm/chunks/architectureDiagram-W76B3OCA-wIkmQqR8.apwMoUL6.js.map +0 -1
  44. package/dist/esm/chunks/blockDiagram-QIGZ2CNN-DOHijbkj.Bhy4DvtQ.js +0 -2262
  45. package/dist/esm/chunks/blockDiagram-QIGZ2CNN-DOHijbkj.Bhy4DvtQ.js.map +0 -1
  46. package/dist/esm/chunks/c4Diagram-FPNF74CW-BDvLZfmS.BqXyX6vZ.js +0 -1581
  47. package/dist/esm/chunks/c4Diagram-FPNF74CW-BDvLZfmS.BqXyX6vZ.js.map +0 -1
  48. package/dist/esm/chunks/channel-B_G4xVvq.CDI0vVb4.js +0 -6
  49. package/dist/esm/chunks/channel-B_G4xVvq.CDI0vVb4.js.map +0 -1
  50. package/dist/esm/chunks/chunk-4BX2VUAB-BZuS0UUH.Cg_xxXPg.js +0 -9
  51. package/dist/esm/chunks/chunk-4BX2VUAB-BZuS0UUH.Cg_xxXPg.js.map +0 -1
  52. package/dist/esm/chunks/chunk-55IACEB6-zeObXUUN.DHI8ANMR.js +0 -9
  53. package/dist/esm/chunks/chunk-55IACEB6-zeObXUUN.DHI8ANMR.js.map +0 -1
  54. package/dist/esm/chunks/chunk-FMBD7UC4-Ployc43X.DXd4JseP.js +0 -20
  55. package/dist/esm/chunks/chunk-FMBD7UC4-Ployc43X.DXd4JseP.js.map +0 -1
  56. package/dist/esm/chunks/chunk-K7UQS3LO-DlVqoBtA.DX3jgm_E.js +0 -1373
  57. package/dist/esm/chunks/chunk-K7UQS3LO-DlVqoBtA.DX3jgm_E.js.map +0 -1
  58. package/dist/esm/chunks/chunk-QN33PNHL-AUdLDoKI.BY-ym94M.js +0 -20
  59. package/dist/esm/chunks/chunk-QN33PNHL-AUdLDoKI.BY-ym94M.js.map +0 -1
  60. package/dist/esm/chunks/chunk-QZHKN3VN-DqO1gyPu.ez2zb3P8.js +0 -16
  61. package/dist/esm/chunks/chunk-QZHKN3VN-DqO1gyPu.ez2zb3P8.js.map +0 -1
  62. package/dist/esm/chunks/chunk-TVAH2DTR-DfXCdP5R.DQy4Fkrs.js +0 -1368
  63. package/dist/esm/chunks/chunk-TVAH2DTR-DfXCdP5R.DQy4Fkrs.js.map +0 -1
  64. package/dist/esm/chunks/chunk-TZMSLE5B-rpRajlFG.hDeYXYTj.js +0 -59
  65. package/dist/esm/chunks/chunk-TZMSLE5B-rpRajlFG.hDeYXYTj.js.map +0 -1
  66. package/dist/esm/chunks/classDiagram-KNZD7YFC-Dvpwq6te.Cn76BN4H.js +0 -17
  67. package/dist/esm/chunks/classDiagram-KNZD7YFC-Dvpwq6te.Cn76BN4H.js.map +0 -1
  68. package/dist/esm/chunks/classDiagram-v2-RKCZMP56-Dvpwq6te.Cn76BN4H.js +0 -17
  69. package/dist/esm/chunks/classDiagram-v2-RKCZMP56-Dvpwq6te.Cn76BN4H.js.map +0 -1
  70. package/dist/esm/chunks/clone-BE7mMQvS.DWQ34rNI.js +0 -9
  71. package/dist/esm/chunks/clone-BE7mMQvS.DWQ34rNI.js.map +0 -1
  72. package/dist/esm/chunks/cose-bilkent-S5V4N54A-BUsrR_iz.Bh8yg7Po.js +0 -2610
  73. package/dist/esm/chunks/cose-bilkent-S5V4N54A-BUsrR_iz.Bh8yg7Po.js.map +0 -1
  74. package/dist/esm/chunks/cytoscape.esm-qgs_QMrm.Cg6eOcD7.js +0 -18633
  75. package/dist/esm/chunks/cytoscape.esm-qgs_QMrm.Cg6eOcD7.js.map +0 -1
  76. package/dist/esm/chunks/dagre-5GWH7T2D-BCK0K3-J.B8kiMv3u.js +0 -445
  77. package/dist/esm/chunks/dagre-5GWH7T2D-BCK0K3-J.B8kiMv3u.js.map +0 -1
  78. package/dist/esm/chunks/defaultLocale-D7EN2tov.B8F577Sx.js +0 -168
  79. package/dist/esm/chunks/defaultLocale-D7EN2tov.B8F577Sx.js.map +0 -1
  80. package/dist/esm/chunks/diagram-N5W7TBWH-DNHeQ1XG.DSk26vS_.js +0 -533
  81. package/dist/esm/chunks/diagram-N5W7TBWH-DNHeQ1XG.DSk26vS_.js.map +0 -1
  82. package/dist/esm/chunks/diagram-QEK2KX5R-CLGfmIsQ.CyC2UTXK.js +0 -218
  83. package/dist/esm/chunks/diagram-QEK2KX5R-CLGfmIsQ.CyC2UTXK.js.map +0 -1
  84. package/dist/esm/chunks/diagram-S2PKOQOG-CFTty0ve.D1LXKq3X.js +0 -143
  85. package/dist/esm/chunks/diagram-S2PKOQOG-CFTty0ve.D1LXKq3X.js.map +0 -1
  86. package/dist/esm/chunks/erDiagram-AWTI2OKA-DI06fG0A.CN7PNzR5.js +0 -842
  87. package/dist/esm/chunks/erDiagram-AWTI2OKA-DI06fG0A.CN7PNzR5.js.map +0 -1
  88. package/dist/esm/chunks/feedback.NWn6_mYe.js.map +0 -1
  89. package/dist/esm/chunks/flowDiagram-PVAE7QVJ-cS0QwpLW.jM7NbRUh.js +0 -1621
  90. package/dist/esm/chunks/flowDiagram-PVAE7QVJ-cS0QwpLW.jM7NbRUh.js.map +0 -1
  91. package/dist/esm/chunks/ganttDiagram-OWAHRB6G-g0lXLgos.B7pPM-og.js +0 -2506
  92. package/dist/esm/chunks/ganttDiagram-OWAHRB6G-g0lXLgos.B7pPM-og.js.map +0 -1
  93. package/dist/esm/chunks/gitGraphDiagram-NY62KEGX-B4wrMGJN.BFxyjY4k.js +0 -700
  94. package/dist/esm/chunks/gitGraphDiagram-NY62KEGX-B4wrMGJN.BFxyjY4k.js.map +0 -1
  95. package/dist/esm/chunks/graph-BuR5bqPu.C7CFP2zs.js +0 -248
  96. package/dist/esm/chunks/graph-BuR5bqPu.C7CFP2zs.js.map +0 -1
  97. package/dist/esm/chunks/infoDiagram-STP46IZ2-CGDBggCS.DCEC64lG.js +0 -25
  98. package/dist/esm/chunks/infoDiagram-STP46IZ2-CGDBggCS.DCEC64lG.js.map +0 -1
  99. package/dist/esm/chunks/init-DjUOC4st.BOEiyheD.js +0 -16
  100. package/dist/esm/chunks/init-DjUOC4st.BOEiyheD.js.map +0 -1
  101. package/dist/esm/chunks/journeyDiagram-BIP6EPQ6-BGl5AI_2.sOXXDhT-.js +0 -837
  102. package/dist/esm/chunks/journeyDiagram-BIP6EPQ6-BGl5AI_2.sOXXDhT-.js.map +0 -1
  103. package/dist/esm/chunks/kanban-definition-6OIFK2YF-Br5Lf76e.B761uhE_.js +0 -720
  104. package/dist/esm/chunks/kanban-definition-6OIFK2YF-Br5Lf76e.B761uhE_.js.map +0 -1
  105. package/dist/esm/chunks/katex-SsTUIUTC.Ci8jyli6.js +0 -11675
  106. package/dist/esm/chunks/katex-SsTUIUTC.Ci8jyli6.js.map +0 -1
  107. package/dist/esm/chunks/layout-p8eM70uN.FvhPiL74.js +0 -1322
  108. package/dist/esm/chunks/layout-p8eM70uN.FvhPiL74.js.map +0 -1
  109. package/dist/esm/chunks/linear-DZf3n5Zt.FxmYe42o.js +0 -256
  110. package/dist/esm/chunks/linear-DZf3n5Zt.FxmYe42o.js.map +0 -1
  111. package/dist/esm/chunks/markdownTranslator-D7_8pMsF.C3NBLaFd.js +0 -15968
  112. package/dist/esm/chunks/markdownTranslator-D7_8pMsF.C3NBLaFd.js.map +0 -1
  113. package/dist/esm/chunks/mermaid.core-CqFoMSZo.D88DhzXd.js +0 -15491
  114. package/dist/esm/chunks/mermaid.core-CqFoMSZo.D88DhzXd.js.map +0 -1
  115. package/dist/esm/chunks/mindmap-definition-Q6HEUPPD-C1kH3VVd.Cyskcv6i.js +0 -782
  116. package/dist/esm/chunks/mindmap-definition-Q6HEUPPD-C1kH3VVd.Cyskcv6i.js.map +0 -1
  117. package/dist/esm/chunks/ordinal-DfAQgscy.J1PPD2vL.js +0 -62
  118. package/dist/esm/chunks/ordinal-DfAQgscy.J1PPD2vL.js.map +0 -1
  119. package/dist/esm/chunks/paragraph-node-CmRSSJjl.DeUA_7DY.js +0 -61348
  120. package/dist/esm/chunks/paragraph-node-CmRSSJjl.DeUA_7DY.js.map +0 -1
  121. package/dist/esm/chunks/pieDiagram-ADFJNKIX-BJslR05R.DjzQR5vc.js +0 -162
  122. package/dist/esm/chunks/pieDiagram-ADFJNKIX-BJslR05R.DjzQR5vc.js.map +0 -1
  123. package/dist/esm/chunks/quadrantDiagram-LMRXKWRM-D1e_ge5x.DI9xyo0H.js +0 -1023
  124. package/dist/esm/chunks/quadrantDiagram-LMRXKWRM-D1e_ge5x.DI9xyo0H.js.map +0 -1
  125. package/dist/esm/chunks/requirementDiagram-4UW4RH46-D0dwxz8M.RFf2JPMN.js +0 -851
  126. package/dist/esm/chunks/requirementDiagram-4UW4RH46-D0dwxz8M.RFf2JPMN.js.map +0 -1
  127. package/dist/esm/chunks/sankeyDiagram-GR3RE2ED-Bjb_rMVp.Cqz6Fi3a.js +0 -811
  128. package/dist/esm/chunks/sankeyDiagram-GR3RE2ED-Bjb_rMVp.Cqz6Fi3a.js.map +0 -1
  129. package/dist/esm/chunks/sequenceDiagram-C3RYC4MD-B4BgA_NP.DusV8c9r.js +0 -2512
  130. package/dist/esm/chunks/sequenceDiagram-C3RYC4MD-B4BgA_NP.DusV8c9r.js.map +0 -1
  131. package/dist/esm/chunks/simple-editor.Dy2IcVOx.js +0 -9474
  132. package/dist/esm/chunks/simple-editor.Dy2IcVOx.js.map +0 -1
  133. package/dist/esm/chunks/simple-viewer-D5Y0qq6S.eLIcVhig.js +0 -5543
  134. package/dist/esm/chunks/simple-viewer-D5Y0qq6S.eLIcVhig.js.map +0 -1
  135. package/dist/esm/chunks/stateDiagram-KXAO66HF-BTfthjTl.DTGpiufP.js +0 -264
  136. package/dist/esm/chunks/stateDiagram-KXAO66HF-BTfthjTl.DTGpiufP.js.map +0 -1
  137. package/dist/esm/chunks/stateDiagram-v2-UMBNRL4Z-CY-NEjvL.DCJld7HR.js +0 -17
  138. package/dist/esm/chunks/stateDiagram-v2-UMBNRL4Z-CY-NEjvL.DCJld7HR.js.map +0 -1
  139. package/dist/esm/chunks/timeline-definition-XQNQX7LJ-DaQHmG4W.4EzpEGiV.js +0 -798
  140. package/dist/esm/chunks/timeline-definition-XQNQX7LJ-DaQHmG4W.4EzpEGiV.js.map +0 -1
  141. package/dist/esm/chunks/treemap-75Q7IDZK-BNMPwj0E.CnZbkKYI.js +0 -12982
  142. package/dist/esm/chunks/treemap-75Q7IDZK-BNMPwj0E.CnZbkKYI.js.map +0 -1
  143. package/dist/esm/chunks/xychartDiagram-6GGTOJPD-fFGQonuW.B9WMwjJb.js +0 -1341
  144. package/dist/esm/chunks/xychartDiagram-6GGTOJPD-fFGQonuW.B9WMwjJb.js.map +0 -1
  145. package/dist/esm/components/markdown-editor-viewer.js +0 -2
  146. package/dist/esm/components/markdown-editor-viewer.js.map +0 -1
  147. package/dist/esm/index.css +0 -1
  148. 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, ThumbsUp, UserCircle, UserFocus } from '@phosphor-icons/react';
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 { F as FormattedMessage } from '../chunks/FormattedMessage.C2OwhDXi.js';
5
- import { useForm, Controller } from 'react-hook-form';
6
- import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogClose } from './ui/dialog.js';
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 { Spinner } from './ui/spinner.js';
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 { Table, TableBody, TableRow, TableCell } from './ui/table.js';
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
- import '../convos.css';function StatusBadge({ ...props }) {
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" }), props.children));
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
- function DiscardDialog({
53
- id,
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
- className,
57
- open: externalOpen,
58
- onOpenChange: externalOnOpenChange,
59
- ...args
71
+ onSubmit,
72
+ onApprove,
73
+ selectOpenRef,
74
+ className
60
75
  }) {
61
- const { onDiscard, onApprove } = useConvosContext();
62
- const [isSelectOpen, setIsSelectOpen] = useState(false);
63
- const [internalOpen, setInternalOpen] = useState(false);
64
- const isOpen = externalOpen ?? internalOpen;
65
- const setIsOpen = externalOnOpenChange ?? setInternalOpen;
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
- const onSubmitForm = async (data) => {
85
- await onDiscard(id, data.reason, data.preferredAnswer).then(() => setIsOpen(false));
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
- return /* @__PURE__ */ React__default.createElement(ButtonGroup, { className }, /* @__PURE__ */ React__default.createElement(Dialog, { ...args, open: isOpen, onOpenChange: setIsOpen }, /* @__PURE__ */ React__default.createElement(DialogTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(
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-7",
93
- discarded ? "bg-destructive text-destructive !opacity-100" : "bg-surface text-dark-800"
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(ThumbsDown, { weight: discarded ? "fill" : "regular" })
98
- )), /* @__PURE__ */ React__default.createElement(
99
- DialogContent,
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: "min-w-[826px] bg-dark-100 pt-0 pb-4",
233
+ className: "space-y-4 px-0",
102
234
  onEscapeKeyDown: (e) => {
103
- if (isSelectOpen) {
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(DialogHeader, { className: "py-6" }, /* @__PURE__ */ React__default.createElement(DialogTitle, { className: "heading-xxl !text-2xl" }, "Answer feedback")),
110
- /* @__PURE__ */ React__default.createElement("form", { onSubmit: handleSubmit(onSubmitForm) }, /* @__PURE__ */ React__default.createElement("div", { className: "grid grid-cols-[1fr_2fr] gap-6 pb-4" }, /* @__PURE__ */ React__default.createElement("div", { className: "w-[340px] p-4", "data-name": "discard-dialog-reason" }, /* @__PURE__ */ React__default.createElement("fieldset", { className: "space-y-4" }, /* @__PURE__ */ React__default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__default.createElement(Label, { htmlFor: "reason", className: "text-sm" }, "Reason"), /* @__PURE__ */ React__default.createElement(
111
- Controller,
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
- id: "preferredAnswer",
133
- required: true,
134
- minLength: 10,
135
- placeholder: "Explain what you'd like Brainfish to do next time in this case....",
136
- rows: 4,
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("span", { className: "text-xs text-dark-1000 hidden ml-1" }, 'Tell Brainfish why this is the incorrect answer. You can use "@" to reference the right Knowledge Article.')))), /* @__PURE__ */ React__default.createElement(AnswerDiagnosticsSection, { messageId: id })), /* @__PURE__ */ React__default.createElement(DialogFooter, { className: "py-6" }, /* @__PURE__ */ React__default.createElement(DialogClose, { asChild: true }, /* @__PURE__ */ React__default.createElement(Button, { variant: "link", size: "sm", type: "button" }, "Cancel")), /* @__PURE__ */ React__default.createElement(Button, { type: "submit", variant: "shadow", size: "sm", disabled: isSubmitting }, isSubmitting ? "Submitting..." : "Submit")))
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
- function Message({
186
- id,
187
- type,
188
- role,
189
- content,
190
- relatedArticles,
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 (role === "ai") {
201
- return /* @__PURE__ */ React__default.createElement("li", { className: "relative before-line after-line" }, /* @__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")), /* @__PURE__ */ React__default.createElement(
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
- return /* @__PURE__ */ React__default.createElement("li", null, /* @__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" }, type === "question" /* QUESTION */ && /* @__PURE__ */ React__default.createElement("div", { className: "message-header" }, /* @__PURE__ */ React__default.createElement(FormattedMessage, { message: { content } }), /* @__PURE__ */ React__default.createElement("span", { className: "message-timestamp" }, formattedDate)), type === "feedback" /* 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)), type === "action" /* ACTION */ && /* @__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"))))));
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 groupAttributesByKey(attributes) {
236
- return attributes.reduce(
237
- (acc, attr) => {
238
- Object.entries(attr).forEach(([key, value]) => {
239
- if (!acc[key]) {
240
- acc[key] = [];
241
- }
242
- acc[key].push(value);
243
- });
244
- return acc;
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) => setAttributes(attrs)).catch(() => {
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
- const groupedAttributes = groupAttributesByKey(attributes);
261
- return /* @__PURE__ */ React__default.createElement(Dialog, { ...args }, /* @__PURE__ */ React__default.createElement(DialogTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(
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
- onClick: (e) => {
268
- e.stopPropagation();
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: 16 })
275
- )), /* @__PURE__ */ React__default.createElement(DialogContent, { className: "min-w-[826px] bg-dark-100 pt-0 pb-4" }, /* @__PURE__ */ React__default.createElement(DialogHeader, { className: "py-6" }, /* @__PURE__ */ React__default.createElement(DialogTitle, { className: "heading-xxl !text-2xl" }, "Custom attributes")), /* @__PURE__ */ React__default.createElement("div", { className: "pb-4" }, /* @__PURE__ */ React__default.createElement(Table, { className: "bg-surface" }, /* @__PURE__ */ React__default.createElement(TableBody, { className: "space-y-1" }, Object.entries(groupedAttributes).map(([key, values]) => /* @__PURE__ */ React__default.createElement(TableRow, { key, className: "border-none" }, /* @__PURE__ */ React__default.createElement(TableCell, { className: "capitalize font-bold" }, key), values.map((value, index) => /* @__PURE__ */ React__default.createElement(TableCell, { key: `${key}-${index}` }, value)))))))));
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
- return /* @__PURE__ */ React__default.createElement(AccordionItem, { value: queryId, className: cn("border-none rounded-lg bg-surface", className), ...props }, /* @__PURE__ */ React__default.createElement(AccordionTrigger, { className: "flex-row-reverse px-4 gap-1 items-center", onClick: handleAccordionClick }, /* @__PURE__ */ React__default.createElement(Item, { size: "sm", className: "flex-1 p-0" }, /* @__PURE__ */ React__default.createElement(ItemContent, null, /* @__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(StatusBadge, { variant: status }, statusMessage), hasAttributes && /* @__PURE__ */ React__default.createElement(AttributesDialog, { conversationId: queryId }))), /* @__PURE__ */ React__default.createElement(AccordionContent, { className: "flex flex-col gap-4 text-balance px-3" }, 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 })))));
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