@brainfish-ai/components 0.25.5 → 0.26.1

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