@brainfish-ai/components 0.18.6 → 0.18.7

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.
@@ -331,7 +331,7 @@ function Message(props) {
331
331
  const formattedDate = formatDate(timestamp, locale);
332
332
  if (isAIAnswer(props)) {
333
333
  const { relatedArticles, discarded, discardedMeta, confidenceScore } = props;
334
- 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(
334
+ 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(
335
335
  ItemContent,
336
336
  {
337
337
  className: cn("message-ai-content", {
@@ -1 +1 @@
1
- {"version":3,"file":"convos.js","sources":["../../../src/components/convos/status-badge.tsx","../../../src/components/convos/answer-diagnostics.tsx","../../../src/components/convos/discard-form.tsx","../../../src/components/convos/feedback-dialog.tsx","../../../src/components/convos/confidence-badge.tsx","../../../src/lib/formatDate.ts","../../../src/components/convos/message.tsx","../../../src/lib/sortAttributeKeys.ts","../../../src/components/convos/attributes-dialog.tsx","../../../src/components/convos/stream-badge.tsx","../../../src/components/convos/convo.tsx","../../../src/components/convos/convos.tsx"],"sourcesContent":["import React from 'react';\nimport { Circle } from '@phosphor-icons/react';\n\nimport { Badge } from '@/components/ui/badge';\nimport { cn } from '@/lib/utils';\n\ntype Props = React.ComponentPropsWithRef<typeof Badge> & {\n suffix?: React.ReactNode;\n};\n\nexport const StatusBadge = React.forwardRef<HTMLDivElement, Props>(({ className, suffix, children, ...props }, ref) => {\n return (\n <div ref={ref} className={cn('flex items-center gap-1 rounded-md p-1', suffix && 'bg-dark-300', className)}>\n <Badge {...props}>\n <div className=\"flex items-center gap-1\">\n <Circle weight=\"fill\" size={8} className=\"!size-2\" />\n {children}\n </div>\n </Badge>\n {suffix && <span className=\"text-xs text-default\">{suffix}</span>}\n </div>\n );\n});\n\nStatusBadge.displayName = 'StatusBadge';\n","import React, { useEffect, useState } from 'react';\nimport { ArrowSquareOut } from '@phosphor-icons/react';\n\nimport { Spinner } from '../ui/spinner';\nimport { useConvosContext } from './convos';\nimport { Button } from '../ui/button';\n\ntype ContextSufficiency = 'Sufficient' | 'Partially Sufficient' | 'Insufficient';\ntype AnswerGenerationType = 'Direct Extraction' | 'Summarization' | 'Inference' | 'Combination' | 'Cannot Answer';\ntype QueryContextRelevance = 'High' | 'Medium' | 'Low';\ninterface EvidenceFromContext {\n supporting_quote?: string;\n url?: string;\n}\nexport type AnswerDiagnostics = {\n confidence_score: string;\n answer_generation_type?: AnswerGenerationType;\n query_context_relevance?: QueryContextRelevance;\n context_sufficiency?: ContextSufficiency;\n confidence_justification?: string;\n evidence_from_context?: EvidenceFromContext[];\n};\n\ninterface AnswerDiagnosticsProps {\n messageId: string;\n}\n\nexport function AnswerDiagnosticsSection({ messageId }: AnswerDiagnosticsProps) {\n const { fetchAnswerDiagnostics } = useConvosContext();\n const [answerDiagnostics, setAnswerDiagnostics] = useState<AnswerDiagnostics | null>(null);\n const [isLoading, setIsLoading] = useState(true); // start loading when it mounts. It will start to fetch answer diagnostics on mount\n\n useEffect(() => {\n void fetchAnswerDiagnostics(messageId)\n .then((diagnostics) => setAnswerDiagnostics(diagnostics))\n .finally(() => setIsLoading(false));\n }, [fetchAnswerDiagnostics, messageId]);\n\n return (\n <div className=\"flex flex-col gap-4 px-4 flex-shrink-0 bg-surface\" data-name=\"discard-dialog-answer-diagnostic\">\n {isLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <Spinner />\n </div>\n ) : (\n <>\n {answerDiagnostics && (\n <>\n <dl className=\"grid grid-cols-[1fr_2fr] grid-rows-2 gap-5\">\n <div className=\"flex flex-col gap-1\">\n <dt className=\"heading-xs\">Confidence</dt>\n <dd className=\"text-sm\">{answerDiagnostics.confidence_score}</dd>\n </div>\n {answerDiagnostics.answer_generation_type && (\n <div className=\"flex flex-col gap-1\">\n <dt className=\"heading-xs\">Answer Type</dt>\n <dd className=\"text-sm\">{answerDiagnostics.answer_generation_type}</dd>\n </div>\n )}\n {answerDiagnostics.query_context_relevance && (\n <div className=\"flex flex-col gap-1\">\n <dt className=\"heading-xs\">Relevance</dt>\n <dd className=\"text-sm\">{answerDiagnostics.query_context_relevance}</dd>\n </div>\n )}\n {answerDiagnostics.context_sufficiency && (\n <div className=\"flex flex-col gap-1\">\n <dt className=\"heading-xs\">Context</dt>\n <dd className=\"text-sm\">{answerDiagnostics.context_sufficiency}</dd>\n </div>\n )}\n </dl>\n {answerDiagnostics.confidence_justification && (\n <div className=\"flex flex-col gap-2\" data-name=\"diagnostic-justification\">\n <span className=\"heading-xs\">Justification</span>\n <p className=\"text-sm my-0\">{answerDiagnostics.confidence_justification}</p>\n </div>\n )}\n {answerDiagnostics.evidence_from_context && answerDiagnostics.evidence_from_context.length > 0 && (\n <div className=\"flex flex-col gap-2\" data-name=\"diagnostic-evidence\">\n <span className=\"heading-xs\">Evidence (from Knowledge Base)</span>\n {answerDiagnostics.evidence_from_context.map((evidence, index) => (\n <div key={index} className=\"flex flex-col gap-1\">\n {evidence.supporting_quote && <p className=\"text-sm my-0\">{evidence.supporting_quote}</p>}\n {evidence.url && (\n <Button variant=\"link\" size=\"sm\" className=\"flex gap-1 text-sm self-end items-center\" asChild>\n <a href={evidence.url} target=\"_blank\" rel=\"noopener noreferrer\">\n <span>Source</span>\n <ArrowSquareOut size={16} />\n </a>\n </Button>\n )}\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </>\n )}\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useForm, Controller } from 'react-hook-form';\nimport { CheckCircle, XCircle } from '@phosphor-icons/react';\n\nimport { Button } from '../ui/button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select';\nimport { Label } from '../ui/label';\nimport { Textarea } from '../ui/textarea';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\nimport { cn } from '@/lib/utils';\n\nexport enum DiscardReason {\n INCORRECT_ANSWER = 'incorrect_answer',\n HALLUCINATED_ANSWER = 'hallucinated_answer',\n OVERSHARING = 'oversharing',\n WRONG_ARTICLE_SURFACED = 'wrong_article_surfaced',\n OTHER = 'other',\n}\n\nexport const DiscardReasonLabels: Record<DiscardReason, string> = {\n [DiscardReason.INCORRECT_ANSWER]: 'Incorrect answer',\n [DiscardReason.HALLUCINATED_ANSWER]: 'Hallucinated answer',\n [DiscardReason.OVERSHARING]: 'Oversharing',\n [DiscardReason.WRONG_ARTICLE_SURFACED]: 'Wrong article surfaced',\n [DiscardReason.OTHER]: 'Other',\n};\n\nexport interface DiscardFormData {\n reason: DiscardReason;\n preferredAnswer?: string;\n}\n\nexport interface DiscardedMeta {\n reason: DiscardReason;\n suggestedAnswer?: string;\n}\n\nexport interface SelectOpenHandle {\n isOpen: boolean;\n close: () => void;\n}\n\ninterface DiscardFormProps {\n discarded?: boolean;\n discardedMeta?: DiscardedMeta;\n onSubmit: (data: DiscardFormData) => Promise<void>;\n onApprove: () => Promise<void>;\n selectOpenRef?: React.MutableRefObject<SelectOpenHandle>;\n className?: string;\n}\n\nexport function DiscardForm({\n discarded,\n discardedMeta,\n onSubmit,\n onApprove,\n selectOpenRef,\n className,\n}: DiscardFormProps): React.ReactNode {\n const [isExpanded, setIsExpanded] = useState(discarded ?? false);\n const [isSelectOpen, setIsSelectOpenState] = useState(false);\n const [isDiscarded, setIsDiscarded] = useState(discarded);\n const formRef = useRef<HTMLFormElement>(null);\n\n // Sync local state when prop changes (e.g., after server refresh)\n useEffect(() => {\n setIsDiscarded(discarded);\n if (discarded) setIsExpanded(true);\n }, [discarded]);\n\n const setIsSelectOpen = (open: boolean) => {\n setIsSelectOpenState(open);\n if (selectOpenRef) selectOpenRef.current.isOpen = open;\n };\n\n // Expose close method to parent via ref - must be in useEffect to avoid side effects during render\n useEffect(() => {\n if (selectOpenRef) {\n selectOpenRef.current.close = () => setIsSelectOpen(false);\n }\n }, [selectOpenRef]);\n\n const {\n control,\n register,\n handleSubmit,\n reset,\n formState: { isSubmitting },\n } = useForm<DiscardFormData>({\n defaultValues: {\n reason: discardedMeta?.reason,\n preferredAnswer: discardedMeta?.suggestedAnswer || '',\n },\n });\n\n useEffect(() => {\n reset({\n reason: discardedMeta?.reason,\n preferredAnswer: discardedMeta?.suggestedAnswer || '',\n });\n }, [discardedMeta, reset]);\n\n useEffect(() => {\n if (formRef.current) {\n formRef.current.inert = !isExpanded;\n }\n }, [isExpanded]);\n\n const handleCancel = () => {\n setIsExpanded(false);\n setIsSelectOpen(false);\n reset();\n };\n\n const handleApprove = async () => {\n try {\n await onApprove();\n setIsDiscarded(false);\n setIsExpanded(false);\n setIsSelectOpen(false);\n } catch (error) {\n console.error('Failed to approve:', error);\n // TODO: Consider adding error UI feedback\n }\n };\n\n const handleDiscard = async (data: DiscardFormData) => {\n try {\n await onSubmit(data);\n setIsDiscarded(true);\n setIsSelectOpen(false);\n } catch (error) {\n console.error('Failed to discard:', error);\n // TODO: Consider adding error UI feedback\n }\n };\n\n const isResolved = isDiscarded !== undefined && isDiscarded !== null;\n const showApproveButton = !isResolved || isDiscarded === false;\n const showDiscardButton = !isResolved || isDiscarded === true;\n\n return (\n <div className={cn('space-y-4', className)}>\n {/* Buttons */}\n <div className=\"flex gap-2 px-4\">\n {showApproveButton && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"shadowSurface\"\n size=\"sm\"\n className={cn('text-default !opacity-100', { 'bg-green-600 text-dark-100': isDiscarded === false })}\n disabled={isResolved}\n onClick={handleApprove}\n >\n <CheckCircle /> {isDiscarded === false ? 'Approved' : 'Approve'}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <span>Approve the answer</span>\n </TooltipContent>\n </Tooltip>\n )}\n {showDiscardButton && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"shadowSurface\"\n size=\"sm\"\n className={cn('text-default !opacity-100', { 'bg-red-600 text-dark-100': isDiscarded === true })}\n disabled={isResolved}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n <XCircle />\n {isDiscarded === true ? 'Discarded' : 'Discard'}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <span>Discard the answer</span>\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n {/* Form */}\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-300 ease-in-out',\n isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n )}\n >\n {isDiscarded ? (\n <div\n className={cn('overflow-hidden min-h-0 px-4 bg-dark-200 space-y-4', isExpanded ? 'py-4 mb-4' : 'py-0')}\n data-name=\"discard-dialog-reason\"\n >\n <div className=\"space-y-1\">\n <Label htmlFor=\"reason\" className=\"text-sm\">\n Reason\n </Label>\n <span className=\"text-sm block\">\n {discardedMeta?.reason && DiscardReasonLabels[discardedMeta.reason]}\n </span>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"preferredAnswer\" className=\"text-sm\">\n Preferred answer\n </Label>\n <span className=\"text-sm block\">{discardedMeta?.suggestedAnswer}</span>\n </div>\n </div>\n ) : (\n <form\n ref={formRef}\n onSubmit={handleSubmit(handleDiscard)}\n className={cn(\n 'overflow-hidden min-h-0 px-4 bg-dark-200 transition-all duration-300 ease-in-out',\n isExpanded ? 'py-4 mb-4' : 'py-0',\n )}\n >\n <fieldset className=\"space-y-4\" data-name=\"discard-dialog-reason\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"reason\" className=\"heading-xs\">\n Reason\n </Label>\n <Controller\n control={control}\n name=\"reason\"\n rules={{ required: true }}\n render={({ field }) => (\n <Select\n value={field.value}\n onValueChange={field.onChange}\n open={isSelectOpen}\n onOpenChange={setIsSelectOpen}\n required\n >\n <SelectTrigger className=\"border-dark-300 bg-surface\">\n <SelectValue placeholder=\"Select a reason\" />\n </SelectTrigger>\n <SelectContent>\n {Object.values(DiscardReason).map((reason) => (\n <SelectItem key={reason} value={reason}>\n {DiscardReasonLabels[reason]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n />\n <span className=\"text-xs text-subtle ml-1 hidden\">\n Give your ambient agent a descriptive name that reflects its purpose. This agent will learn from your\n content to provide personalized assistance.\n </span>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"preferredAnswer\" className=\"heading-xs\">\n Preferred answer\n </Label>\n <Textarea\n id=\"preferredAnswer\"\n required\n minLength={10}\n placeholder=\"Explain what you'd like Brainfish to do next time in this case....\"\n rows={4}\n className=\"h-52 resize-none bg-surface\"\n {...register('preferredAnswer')}\n />\n <span className=\"text-xs text-subtle ml-1 hidden\">\n Tell Brainfish why this is the incorrect answer.\n </span>\n </div>\n <div className=\"flex gap-2 !mb-1 justify-end mr-1\">\n <Button variant=\"link\" size=\"sm\" type=\"button\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"shadow\" size=\"sm\" disabled={isSubmitting}>\n {isSubmitting ? 'Submitting...' : 'Submit'}\n </Button>\n </div>\n </fieldset>\n </form>\n )}\n </div>\n </div>\n );\n}\n","import React, { useRef, useState } from 'react';\nimport { DialogProps } from '@radix-ui/react-dialog';\nimport { ListMagnifyingGlass } from '@phosphor-icons/react';\n\nimport { AnswerDiagnosticsSection } from './answer-diagnostics';\nimport { useConvosContext } from './convos';\nimport { DiscardForm, DiscardFormData, DiscardReason, SelectOpenHandle } from './discard-form';\nimport { DivButton } from '../ui/div-button';\nimport { ScrollArea } from '../ui/scroll-area';\n\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet';\n\nexport { DiscardReason } from './discard-form';\n\ninterface FeedbackDialogProps extends DialogProps {\n id: string;\n discarded?: boolean;\n discardedMeta?: { reason: DiscardReason; suggestedAnswer?: string };\n className?: string;\n}\n\nexport function FeedbackDialog({\n id,\n discarded,\n discardedMeta,\n open: externalOpen,\n onOpenChange: externalOnOpenChange,\n ...args\n}: FeedbackDialogProps): React.ReactNode {\n const { onDiscard, onApprove } = useConvosContext();\n const [internalOpen, setInternalOpen] = useState(false);\n const selectOpenRef = useRef<SelectOpenHandle>({ isOpen: false, close: () => {} });\n\n // Use external state if provided, otherwise use internal state\n const isOpen = externalOpen ?? internalOpen;\n const setIsOpen = externalOnOpenChange ?? setInternalOpen;\n\n const onSubmitForm = async (data: DiscardFormData) => {\n await onDiscard(id, data.reason, data.preferredAnswer).then(() => setIsOpen(false));\n };\n\n const handleApprove = async () => {\n await onApprove(id);\n };\n\n return (\n <Sheet modal={false} open={isOpen} onOpenChange={setIsOpen} {...args}>\n <SheetTrigger asChild onClick={(e) => e.stopPropagation()} onKeyUp={(e) => e.stopPropagation()}>\n <DivButton variant=\"shadowSurface\" size=\"sm\" aria-label=\"Inspect answer information\">\n <ListMagnifyingGlass className=\"text-dark-600\" /> Inspect\n </DivButton>\n </SheetTrigger>\n <SheetContent\n className=\"space-y-4 px-0\"\n onEscapeKeyDown={(e) => {\n if (selectOpenRef.current.isOpen) {\n e.preventDefault();\n selectOpenRef.current.close();\n }\n }}\n onInteractOutside={(e) => {\n if (selectOpenRef.current.isOpen) {\n e.preventDefault();\n }\n }}\n >\n <SheetHeader className=\"px-4\">\n <SheetTitle className=\"heading-sm m-0\">Answer information</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Shows answer diagnostics and allows you to provide feedback.\n </SheetDescription>\n </SheetHeader>\n\n <ScrollArea className=\"h-[calc(100vh-4rem)] pb-4\">\n <DiscardForm\n discarded={discarded}\n discardedMeta={discardedMeta}\n onSubmit={onSubmitForm}\n onApprove={handleApprove}\n selectOpenRef={selectOpenRef}\n />\n <AnswerDiagnosticsSection messageId={id} />\n </ScrollArea>\n </SheetContent>\n </Sheet>\n );\n}\n","import React from 'react';\n\nimport { Badge } from '@/components/ui/badge';\n\ninterface ConfidenceBadgeProps {\n score?: number;\n}\n\nexport const ConfidenceBadge = ({ score }: ConfidenceBadgeProps) => {\n const formattedScore = `${score}%`;\n if (!score || score > 100) {\n return <Badge variant=\"disabled\">N/A</Badge>;\n } else if (score >= 80) {\n return <Badge variant=\"success\">{formattedScore}</Badge>;\n } else if (score >= 40 && score < 80) {\n return <Badge variant=\"warning\">{formattedScore}</Badge>;\n } else {\n return <Badge variant=\"disabled\">N/A</Badge>;\n }\n};\n","export function formatDate(date: Date, locale?: string) {\n const defaultLocale = 'en-US';\n if (!locale) {\n if (typeof navigator !== 'undefined') {\n locale = navigator.language;\n } else {\n locale = defaultLocale;\n }\n }\n\n return date.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n}\n","import React from 'react';\nimport { ArrowSquareOut, UserCircle } from '@phosphor-icons/react';\n\nimport { StatusBadge } from './status-badge';\nimport { FormattedMessage } from '../markdown';\nimport { useConvosContext } from './convos';\nimport { FeedbackDialog, DiscardReason } from './feedback-dialog';\nimport { DivButton } from '../ui/div-button';\nimport { Button } from '../ui/button';\nimport { ConfidenceBadge } from './confidence-badge';\n\nimport { GeneratingStar } from '@/components/generating-star';\nimport { Item, ItemHeader, ItemContent, ItemTitle } from '@/components/ui/item';\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';\nimport { cn } from '@/lib/utils';\nimport { formatDate } from '@/lib/formatDate';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport './message.css';\n\nexport interface RelatedArticle {\n id: string;\n title: string;\n url: string;\n score: number;\n}\n\nexport enum MessageType {\n ACTION = 'action', // user action like 'Next Best Action clicks'\n FEEDBACK = 'feedback', // feedback for up/down vote\n QUESTION = 'question', // user question\n ANSWER = 'answer', // ai generated answer\n}\n\nexport enum Feedback {\n Positive = 'positive',\n Negative = 'negative',\n}\n\n// Shared base fields\ninterface BaseMessage {\n id: string;\n timestamp: Date;\n locale?: string; // only if not using en-US. For formatting dates (overrides context locale)\n isFeedbackDialogOpen?: boolean; // controlled state for feedback dialog\n onFeedbackDialogChange?: (isOpen: boolean) => void; // callback for feedback dialog state changes\n}\n\n// AI Answer - has related articles, discard info, confidence\nexport interface AIAnswerMessage extends BaseMessage {\n type: MessageType.ANSWER;\n role: 'ai';\n content: string;\n relatedArticles?: RelatedArticle[];\n discarded?: boolean;\n discardedMeta?: {\n reason: DiscardReason;\n suggestedAnswer?: string;\n };\n confidenceScore?: number;\n}\n\n// User Question\nexport interface UserQuestionMessage extends BaseMessage {\n type: MessageType.QUESTION;\n role: 'user';\n content: string;\n}\n\n// User Feedback - requires feedback field\nexport interface UserFeedbackMessage extends BaseMessage {\n type: MessageType.FEEDBACK;\n role: 'user';\n content: string; // optional comment text\n feedback: Feedback;\n}\n\n// User Action\nexport interface UserActionMessage extends BaseMessage {\n type: MessageType.ACTION;\n role: 'user';\n content: string;\n}\n\n// Union type\nexport type MessageProps = AIAnswerMessage | UserQuestionMessage | UserFeedbackMessage | UserActionMessage;\n\n// Type guards for external use\nexport const isAIAnswer = (msg: MessageProps): msg is AIAnswerMessage => msg.type === MessageType.ANSWER;\n\nexport const isUserQuestion = (msg: MessageProps): msg is UserQuestionMessage => msg.type === MessageType.QUESTION;\n\nexport const isFeedback = (msg: MessageProps): msg is UserFeedbackMessage => msg.type === MessageType.FEEDBACK;\n\nexport const isAction = (msg: MessageProps): msg is UserActionMessage => msg.type === MessageType.ACTION;\n\nfunction Message(props: MessageProps) {\n const { id, content, timestamp, locale: localeOverride, isFeedbackDialogOpen, onFeedbackDialogChange } = props;\n\n // Get locale from context, with override if provided\n const { locale: contextLocale } = useConvosContext();\n const locale = localeOverride || contextLocale;\n\n const formattedDate = formatDate(timestamp, locale);\n\n if (isAIAnswer(props)) {\n const { relatedArticles, discarded, discardedMeta, confidenceScore } = props;\n\n return (\n <li className=\"relative before-line after-line list-none\">\n <Item className=\"message-item\">\n <ItemHeader className=\"justify-start gap-0\">\n <GeneratingStar variant=\"gradient\" className=\"relative -left-[6px]\" />\n <ItemTitle className=\"text-xs font-bold\">{`Generated answer ${discarded ? '(Discarded)' : ''}`}</ItemTitle>\n </ItemHeader>\n <ItemContent\n className={cn('message-ai-content', {\n 'py-6': !relatedArticles?.length,\n 'pt-6 pb-0': relatedArticles?.length,\n })}\n >\n <div className=\"message-content-wrapper\">\n <FormattedMessage message={{ content }} />\n <div className=\"flex gap-2 justify-between mt-2 items-center\">\n <span className=\"message-timestamp\">{formattedDate}</span>\n <div className=\"flex items-center gap-2\">\n {confidenceScore && (\n <Tooltip>\n <TooltipTrigger asChild>\n <DivButton variant=\"outline\" size=\"sm\" className=\"text-xs p-1 h-auto\">\n {confidenceScore}\n </DivButton>\n </TooltipTrigger>\n <TooltipContent>\n <p>Answer score: {confidenceScore}</p>\n </TooltipContent>\n </Tooltip>\n )}\n <FeedbackDialog\n id={id}\n discarded={discarded}\n discardedMeta={discardedMeta}\n open={isFeedbackDialogOpen}\n onOpenChange={onFeedbackDialogChange}\n />\n </div>\n </div>\n </div>\n {!!relatedArticles?.length && (\n <Accordion type=\"single\" collapsible className=\"p-0 custom-dashed-border-t-dark-300 w-full\">\n <AccordionItem value=\"related-articles\">\n <AccordionTrigger className=\"px-6\">Related articles</AccordionTrigger>\n <AccordionContent>\n <ul className=\"message-article-list\">\n {relatedArticles.map((article) => (\n <li\n key={article.id}\n className=\"grid gap-2 grid-cols-[auto_1fr] items-center justify-items-start\"\n >\n <ConfidenceBadge score={Math.round(article.score * 100)} />\n <Button\n variant=\"link\"\n size=\"xs\"\n asChild\n className=\"flex items-center gap-2 min-w-0 !justify-start w-full\"\n >\n <a href={article.url} target=\"_blank\" rel=\"noopener noreferrer\">\n <span className=\"truncate\">{article.title}</span>\n <ArrowSquareOut className=\"size-4 flex-shrink-0\" weight=\"regular\" />\n </a>\n </Button>\n </li>\n ))}\n </ul>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n )}\n </ItemContent>\n </Item>\n </li>\n );\n }\n\n // User messages (Question, Feedback, Action)\n const feedback = isFeedback(props) ? props.feedback : null;\n\n return (\n <li className=\"relative list-none before-line--user after-line--user\">\n <Item className=\"message-item\">\n <ItemHeader className=\"basis-0\">\n <UserCircle weight=\"fill\" size={24} />\n </ItemHeader>\n <ItemContent className=\"message-user-content\">\n {isUserQuestion(props) && (\n <div className=\"message-header\">\n <FormattedMessage message={{ content }} />\n <span className=\"message-timestamp\">{formattedDate}</span>\n </div>\n )}\n {isFeedback(props) && feedback && (\n <>\n <div className=\"message-header\">\n <div className=\"message-feedback-text\">\n {feedback === Feedback.Positive ? 'Upvoted as helpful' : 'Downvoted as not helpful'}\n </div>\n <div className=\"message-meta\">\n <span className=\"message-timestamp-simple\">{formattedDate}</span>\n <StatusBadge variant={feedback === Feedback.Positive ? 'success' : 'destructive'}>\n {feedback === Feedback.Positive ? 'Answered' : 'Unable to help'}\n </StatusBadge>\n </div>\n </div>\n {content && <div className=\"text-base\">{content}</div>}\n </>\n )}\n {isAction(props) && (\n <div className=\"message-header\">\n <span className=\"text-subtle text-sm italic\">{content}</span>\n <div className=\"message-meta\">\n <span className=\"message-timestamp-simple\">{formattedDate}</span>\n <StatusBadge variant=\"warning\">Action</StatusBadge>\n </div>\n </div>\n )}\n </ItemContent>\n </Item>\n </li>\n );\n}\n\nexport { Message };\n","// sort the attributes by key so the important ones are at the top\n// namely id, name, email, phone, followed by the rest as is\n// return the sorted keys\nexport function sortAttributeKeys(attributes: Record<string, any>[]): string[] {\n const PRIORITY_KEYS = ['id', 'name', 'email', 'phone'];\n\n if (attributes.length === 0) {\n return [];\n }\n\n const priority = (key: string) => {\n const idx = PRIORITY_KEYS.indexOf(key);\n\n // non-important keys should be at the end, so we return Infinity\n return idx === -1 ? Infinity : idx;\n };\n\n return Object.keys(attributes[0]).sort((a, b) => priority(a) - priority(b));\n}\n","import React, { useState, useEffect } from 'react';\nimport { UserFocus } from '@phosphor-icons/react';\nimport { DialogProps } from '@radix-ui/react-dialog';\nimport { createId } from '@paralleldrive/cuid2';\n\nimport { useConvosContext } from './convos';\nimport { Table, TableBody, TableCell, TableRow, TableHeader, TableHead } from '../ui/table';\nimport { ScrollArea } from '../ui/scroll-area';\n\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet';\nimport { DivButton } from '@/components/ui/div-button';\nimport { sortAttributeKeys } from '@/lib/sortAttributeKeys';\n\nimport './attributes-dialog.css';\n\ninterface Props extends DialogProps {\n conversationId: string;\n}\n\nexport function AttributesDialog({ conversationId, open, onOpenChange, ...args }: Props) {\n const [attributes, setAttributes] = useState<Record<string, any>[]>();\n const [sortedAttributesKeys, setSortedAttributesKeys] = useState<string[]>();\n\n const { fetchAttributes } = useConvosContext();\n\n useEffect(() => {\n void fetchAttributes(conversationId)\n .then((attrs) => {\n setAttributes(attrs);\n setSortedAttributesKeys(sortAttributeKeys(attrs));\n })\n .catch(() => {\n // Error handling - could be extended with error reporting\n });\n }, [fetchAttributes, conversationId]);\n\n if (!attributes?.length) {\n return null;\n }\n\n return (\n <Sheet modal={false} open={open} onOpenChange={onOpenChange} {...args}>\n <SheetTrigger asChild onClick={(e) => e.stopPropagation()} onKeyUp={(e) => e.stopPropagation()}>\n <DivButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 [&_svg]:size-6 text-dark-900\"\n aria-label=\"Open Custom attributes dialog\"\n >\n <UserFocus size={24} />\n </DivButton>\n </SheetTrigger>\n <SheetContent className=\"space-y-4\">\n <SheetHeader>\n <SheetTitle className=\"heading-sm m-0\">Custom attributes</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Custom attributes are used to store additional information about the conversation.\n </SheetDescription>\n </SheetHeader>\n {sortedAttributesKeys && (\n <ScrollArea className=\"h-[calc(100vh-8rem)]\">\n {' '}\n {/* 8rem is an approximation, accounting for header, padding, and close button */}\n <Table className=\"bg-surface\" data-test-id=\"attributes-table\">\n <TableHeader>\n <TableRow>\n {sortedAttributesKeys.map((key) => (\n <TableHead key={key} className=\"capitalize font-bold\">\n {key}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {attributes.map((record) => (\n <TableRow key={record?.id ?? createId()} className=\"border-none\">\n {sortedAttributesKeys.map((key) => (\n <TableCell key={key} data-title={key}>\n {record[key]}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </ScrollArea>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n","import React from 'react';\nimport { Circle } from '@phosphor-icons/react';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\nimport { dark } from '@/colors/dark';\nimport { Badge } from '@/components/ui/badge';\nimport { cn } from '@/lib/utils';\n\ntype Props = React.ComponentPropsWithRef<typeof Badge> & {\n streamName: string;\n dotColor?: string; // hex code from Platform\n};\n\nexport const StreamBadge = React.forwardRef<HTMLDivElement, Props>(\n ({ className, streamName, dotColor = 'transparent', ...props }, ref) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n ref={ref}\n role=\"button\"\n className={cn('flex items-center gap-1 rounded-full p-0', className)}\n tabIndex={0}\n >\n <Badge {...props} className=\"bg-surface rounded-full border border-dark-300 text-subtle\">\n <div className=\"flex items-center gap-1\">\n <Circle\n size={8}\n weight=\"bold\"\n className=\"!size-2 rounded-full\"\n style={{ backgroundColor: dotColor }}\n color={dotColor === 'transparent' ? dark[300] : 'transparent'}\n />\n <span className=\"max-w-32 truncate inline-block\">{streamName}</span>\n </div>\n </Badge>\n </div>\n </TooltipTrigger>\n <TooltipContent>{streamName}</TooltipContent>\n </Tooltip>\n );\n },\n);\n\nStreamBadge.displayName = 'StreamBadge';\n","import React, { useState } from 'react';\nimport { intlFormatDistance } from 'date-fns';\n\nimport { StatusBadge } from './status-badge';\nimport { Message } from './message';\nimport { useConvosContext } from './convos';\nimport { AttributesDialog } from './attributes-dialog';\nimport { DivButton } from '../ui/div-button';\nimport { StreamBadge } from './stream-badge';\n\nimport { AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';\nimport { Item, ItemContent, ItemDescription, ItemTitle } from '@/components/ui/item';\nimport { cn } from '@/lib/utils';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/index';\n\ninterface Source {\n name: string;\n color?: string;\n}\n\ninterface Props {\n locale?: string; // only if not using en-US. For formatting dates (overrides context locale)\n question: string; // the initial query\n timestamp: Date; // created_at date of the conversation thread\n location?: string; // location of the user\n source?: Source; // source of the conversation, i.e. channel name and color\n status?: React.ComponentProps<typeof StatusBadge>['variant'];\n statusMessage?: string; // status of the conversation - Answered | Article not found | Partial | Unanswered, etc\n hasAttributes?: boolean; // whether the conversation has attributes\n onClick?: () => void; // handler to fetch messages when accordion is clicked\n score?: number; // score of the conversation\n}\n\nexport type ConvoProps = React.ComponentPropsWithRef<typeof AccordionItem> & Props;\n\ntype OpenDialog = 'attributes' | 'feedback' | null;\n\ntype EnrichedStatusBadgeProps = Pick<ConvoProps, 'score' | 'status' | 'statusMessage'>;\nconst EnrichedStatusBadge = ({ score, status, statusMessage }: EnrichedStatusBadgeProps) => {\n return score ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <DivButton variant=\"ghost\" size=\"sm\" className=\"p-0 h-[26px]\">\n <StatusBadge variant={status} suffix={score}>\n {statusMessage}\n </StatusBadge>\n </DivButton>\n </TooltipTrigger>\n <TooltipContent>\n <p>Conversation score: {score}</p>\n </TooltipContent>\n </Tooltip>\n ) : (\n <StatusBadge variant={status} suffix={score}>\n {statusMessage}\n </StatusBadge>\n );\n};\n\n/**\n * Convo component - A single conversation item in an accordion.\n * Displays conversation metadata and messages, with support for lazy loading.\n *\n * This is a presentational component - it receives messages and loading state as props\n * rather than managing fetching logic itself.\n */\nexport function Convo({\n locale: localeOverride,\n value: queryId,\n question,\n timestamp,\n location,\n source,\n status,\n statusMessage,\n hasAttributes,\n onClick,\n className,\n score,\n ...props\n}: ConvoProps) {\n const { getMessages, isLoading: isLoadingFromContext, locale: contextLocale } = useConvosContext();\n\n // Dialog state management\n const [openDialog, setOpenDialog] = useState<OpenDialog>(null);\n const [openFeedbackMessageId, setOpenFeedbackMessageId] = useState<string | null>(null);\n\n const handleDialogChange = (dialogType: OpenDialog, messageId?: string) => (isOpen: boolean) => {\n if (isOpen) {\n setOpenDialog(dialogType);\n if (messageId) setOpenFeedbackMessageId(messageId);\n } else {\n setOpenDialog(null);\n setOpenFeedbackMessageId(null);\n }\n };\n\n const isAnyDialogOpen = openDialog !== null;\n\n // Use locale override if provided, otherwise use context locale\n const locale = localeOverride || contextLocale;\n\n // Get messages and loading state from context\n const messages = getMessages(queryId);\n const isLoading = isLoadingFromContext(queryId);\n\n // Format date\n const formattedDateRelative = intlFormatDistance(timestamp, new Date(), { locale, style: 'short' });\n\n // Create description string: \"Nov 1, 2025, 11:00 AM • United States\"\n // Filters out undefined/null values and joins with bullet separator\n const description = [formattedDateRelative, location].filter(Boolean).join(' • ');\n\n const handleAccordionClick = (e: React.MouseEvent) => {\n // Prevent accordion from toggling if click originated from within a dialog\n if ((e.target as HTMLElement).closest('[role=\"dialog\"]')) {\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n onClick?.();\n };\n\n return (\n <AccordionItem\n value={queryId}\n className={cn(\n 'border border-dark-200 hover:border-dark-300 rounded-lg bg-dark-100 [&[data-state=\"open\"]]:bg-surface [&[data-state=\"open\"]]:border-dark-300',\n { 'shadow-md shadow-dark-300': isAnyDialogOpen },\n className,\n )}\n {...props}\n >\n <AccordionTrigger\n className=\"flex-row-reverse px-4 gap-1 items-center [&[data-state=open]]:px-6\"\n onClick={handleAccordionClick}\n >\n <Item size=\"sm\" className=\"flex-1 p-0 justify-between\">\n <ItemContent className=\"max-w-[400px]\">\n <ItemTitle className=\"text-base text-default\">{question}</ItemTitle>\n <ItemDescription className=\"text-xs text-default flex items-center gap-1\">\n {description}\n {source && <StreamBadge streamName={source.name} dotColor={source.color} />}\n </ItemDescription>\n </ItemContent>\n <div className=\"flex items-center gap-0\">\n {hasAttributes && (\n <AttributesDialog\n conversationId={queryId}\n open={openDialog === 'attributes'}\n onOpenChange={handleDialogChange('attributes')}\n />\n )}\n {/* Add tooltip to say \"Conversation score\", only when there is a score */}\n {status && <EnrichedStatusBadge score={score} status={status} statusMessage={statusMessage} />}\n </div>\n </Item>\n </AccordionTrigger>\n <AccordionContent className=\"flex flex-col gap-4 text-balance px-5\">\n {isLoading ? (\n <div className=\"text-center text-subtle py-4\">Loading messages...</div>\n ) : (\n <ul className=\"list-none space-y-4\">\n {messages.slice(1).map((message) => (\n <Message\n key={message.id}\n {...message}\n isFeedbackDialogOpen={openDialog === 'feedback' && openFeedbackMessageId === message.id}\n onFeedbackDialogChange={handleDialogChange('feedback', message.id)}\n />\n ))}\n </ul>\n )}\n </AccordionContent>\n </AccordionItem>\n );\n}\n","import React from 'react';\n\nimport { Convo, ConvoProps } from './convo';\nimport { MessageProps } from './message';\nimport { AnswerDiagnostics } from './answer-diagnostics';\nimport { DiscardReason } from './discard-form';\n\nimport { Accordion } from '@/components/ui/accordion';\n\n// Context types and implementation\ninterface ConvosContextValue {\n // Fetch functions\n fetchMessages: (conversationId: string) => Promise<MessageProps[]>;\n fetchAttributes: (conversationId: string) => Promise<Record<string, any>[]>;\n\n // Messages and loading state\n getMessages: (conversationId: string) => MessageProps[];\n isLoading: (conversationId: string) => boolean;\n handleFetchMessages: (conversationId: string) => void;\n\n // Locale for date formatting\n locale?: string;\n\n // Discard dialog functions\n fetchAnswerDiagnostics: (messageId: string) => Promise<AnswerDiagnostics>;\n onDiscard: (id: string, reason: DiscardReason, suggestedAnswer?: string) => Promise<void>;\n onApprove: (id: string) => Promise<void>;\n}\n\nconst ConvosContext = React.createContext<ConvosContextValue | undefined>(undefined);\n\nexport function useConvosContext() {\n const context = React.useContext(ConvosContext);\n if (context === undefined) {\n throw new Error('useConvosContext must be used within a ConvosProvider');\n }\n\n return context;\n}\n\ninterface ConvosProviderProps {\n children: React.ReactNode;\n value: ConvosContextValue;\n}\n\nexport function ConvosProvider({ children, value }: ConvosProviderProps) {\n return <ConvosContext.Provider value={value}>{children}</ConvosContext.Provider>;\n}\n\ninterface ConvosProps {\n convos: ConvoProps[];\n fetchMessages: (conversationId: string) => Promise<MessageProps[]>; // required fetch function for lazy loading\n fetchAttributes: (conversationId: string) => Promise<Record<string, any>[]>; // required fetch function for lazy loading\n fetchAnswerDiagnostics: (messageId: string) => Promise<AnswerDiagnostics>;\n onDiscard: (id: string, reason: DiscardReason, suggestedAnswer?: string) => Promise<void>;\n onApprove: (id: string) => Promise<void>;\n}\n\n/**\n * Convos component - Displays a list of conversations in an accordion.\n * Messages are always lazy loaded when accordion items are opened.\n *\n * @param convos - Array of conversation data\n * @param fetchMessages - Async function to fetch messages for a conversation\n */\nexport function Convos({\n convos,\n fetchMessages,\n fetchAttributes,\n fetchAnswerDiagnostics,\n onDiscard,\n onApprove,\n}: ConvosProps) {\n // Maps conversation IDs to their fetched messages\n const [messagesMap, setMessagesMap] = React.useState<Record<string, MessageProps[]>>({});\n\n // Tracks which conversations are currently loading messages\n const [loadingMap, setLoadingMap] = React.useState<Record<string, boolean>>({});\n\n // Refs used to check fetch status without causing re-renders\n // These are updated synchronously and don't trigger React re-renders\n const fetchedSetRef = React.useRef<Set<string>>(new Set());\n const loadingMapRef = React.useRef<Record<string, boolean>>({});\n\n /**\n * Handles fetching messages when an accordion item is clicked.\n * Prevents duplicate fetches by checking refs before making the request.\n * Updates both refs (for synchronous checks) and state (for UI updates).\n */\n const handleFetchMessages = React.useCallback(\n (conversationId: string) => {\n // Skip if already fetched or currently loading\n if (fetchedSetRef.current.has(conversationId) || loadingMapRef.current[conversationId]) {\n return;\n }\n\n // Set loading state in both ref (for quick checks) and state (for UI)\n loadingMapRef.current[conversationId] = true;\n setLoadingMap((prev) => ({ ...prev, [conversationId]: true }));\n\n fetchMessages(conversationId)\n .then((fetchedMessages) => {\n // Store fetched messages and mark as fetched\n setMessagesMap((prev) => ({ ...prev, [conversationId]: fetchedMessages }));\n fetchedSetRef.current.add(conversationId);\n })\n .catch(() => {\n // Error handling - could be extended with error reporting\n })\n .finally(() => {\n // Clear loading state from both ref and state\n delete loadingMapRef.current[conversationId];\n setLoadingMap((prev) => {\n const newMap = { ...prev };\n delete newMap[conversationId];\n\n return newMap;\n });\n });\n },\n [fetchMessages],\n );\n\n // Create context value - use the first convo's locale as default, or allow override\n const defaultLocale = convos[0]?.locale;\n\n const contextValue = React.useMemo(\n () => ({\n fetchMessages,\n fetchAttributes,\n getMessages: (conversationId: string) => messagesMap[conversationId] || [],\n isLoading: (conversationId: string) => loadingMap[conversationId] || false,\n handleFetchMessages,\n locale: defaultLocale,\n fetchAnswerDiagnostics: (messageId: string) => fetchAnswerDiagnostics(messageId),\n onDiscard,\n onApprove,\n }),\n [\n fetchMessages,\n fetchAttributes,\n messagesMap,\n loadingMap,\n handleFetchMessages,\n defaultLocale,\n fetchAnswerDiagnostics,\n onDiscard,\n onApprove,\n ],\n );\n\n return (\n <ConvosProvider value={contextValue}>\n <Accordion type=\"single\" collapsible className=\"w-full space-y-2\">\n {convos.map((convo) => (\n <Convo\n {...convo}\n key={convo.value}\n // Trigger fetch when accordion trigger is clicked\n onClick={() => handleFetchMessages(convo.value)}\n />\n ))}\n </Accordion>\n </ConvosProvider>\n );\n}\n"],"names":["React","DiscardReason","MessageType","Feedback"],"mappings":"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"}
1
+ {"version":3,"file":"convos.js","sources":["../../../src/components/convos/status-badge.tsx","../../../src/components/convos/answer-diagnostics.tsx","../../../src/components/convos/discard-form.tsx","../../../src/components/convos/feedback-dialog.tsx","../../../src/components/convos/confidence-badge.tsx","../../../src/lib/formatDate.ts","../../../src/components/convos/message.tsx","../../../src/lib/sortAttributeKeys.ts","../../../src/components/convos/attributes-dialog.tsx","../../../src/components/convos/stream-badge.tsx","../../../src/components/convos/convo.tsx","../../../src/components/convos/convos.tsx"],"sourcesContent":["import React from 'react';\nimport { Circle } from '@phosphor-icons/react';\n\nimport { Badge } from '@/components/ui/badge';\nimport { cn } from '@/lib/utils';\n\ntype Props = React.ComponentPropsWithRef<typeof Badge> & {\n suffix?: React.ReactNode;\n};\n\nexport const StatusBadge = React.forwardRef<HTMLDivElement, Props>(({ className, suffix, children, ...props }, ref) => {\n return (\n <div ref={ref} className={cn('flex items-center gap-1 rounded-md p-1', suffix && 'bg-dark-300', className)}>\n <Badge {...props}>\n <div className=\"flex items-center gap-1\">\n <Circle weight=\"fill\" size={8} className=\"!size-2\" />\n {children}\n </div>\n </Badge>\n {suffix && <span className=\"text-xs text-default\">{suffix}</span>}\n </div>\n );\n});\n\nStatusBadge.displayName = 'StatusBadge';\n","import React, { useEffect, useState } from 'react';\nimport { ArrowSquareOut } from '@phosphor-icons/react';\n\nimport { Spinner } from '../ui/spinner';\nimport { useConvosContext } from './convos';\nimport { Button } from '../ui/button';\n\ntype ContextSufficiency = 'Sufficient' | 'Partially Sufficient' | 'Insufficient';\ntype AnswerGenerationType = 'Direct Extraction' | 'Summarization' | 'Inference' | 'Combination' | 'Cannot Answer';\ntype QueryContextRelevance = 'High' | 'Medium' | 'Low';\ninterface EvidenceFromContext {\n supporting_quote?: string;\n url?: string;\n}\nexport type AnswerDiagnostics = {\n confidence_score: string;\n answer_generation_type?: AnswerGenerationType;\n query_context_relevance?: QueryContextRelevance;\n context_sufficiency?: ContextSufficiency;\n confidence_justification?: string;\n evidence_from_context?: EvidenceFromContext[];\n};\n\ninterface AnswerDiagnosticsProps {\n messageId: string;\n}\n\nexport function AnswerDiagnosticsSection({ messageId }: AnswerDiagnosticsProps) {\n const { fetchAnswerDiagnostics } = useConvosContext();\n const [answerDiagnostics, setAnswerDiagnostics] = useState<AnswerDiagnostics | null>(null);\n const [isLoading, setIsLoading] = useState(true); // start loading when it mounts. It will start to fetch answer diagnostics on mount\n\n useEffect(() => {\n void fetchAnswerDiagnostics(messageId)\n .then((diagnostics) => setAnswerDiagnostics(diagnostics))\n .finally(() => setIsLoading(false));\n }, [fetchAnswerDiagnostics, messageId]);\n\n return (\n <div className=\"flex flex-col gap-4 px-4 flex-shrink-0 bg-surface\" data-name=\"discard-dialog-answer-diagnostic\">\n {isLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <Spinner />\n </div>\n ) : (\n <>\n {answerDiagnostics && (\n <>\n <dl className=\"grid grid-cols-[1fr_2fr] grid-rows-2 gap-5\">\n <div className=\"flex flex-col gap-1\">\n <dt className=\"heading-xs\">Confidence</dt>\n <dd className=\"text-sm\">{answerDiagnostics.confidence_score}</dd>\n </div>\n {answerDiagnostics.answer_generation_type && (\n <div className=\"flex flex-col gap-1\">\n <dt className=\"heading-xs\">Answer Type</dt>\n <dd className=\"text-sm\">{answerDiagnostics.answer_generation_type}</dd>\n </div>\n )}\n {answerDiagnostics.query_context_relevance && (\n <div className=\"flex flex-col gap-1\">\n <dt className=\"heading-xs\">Relevance</dt>\n <dd className=\"text-sm\">{answerDiagnostics.query_context_relevance}</dd>\n </div>\n )}\n {answerDiagnostics.context_sufficiency && (\n <div className=\"flex flex-col gap-1\">\n <dt className=\"heading-xs\">Context</dt>\n <dd className=\"text-sm\">{answerDiagnostics.context_sufficiency}</dd>\n </div>\n )}\n </dl>\n {answerDiagnostics.confidence_justification && (\n <div className=\"flex flex-col gap-2\" data-name=\"diagnostic-justification\">\n <span className=\"heading-xs\">Justification</span>\n <p className=\"text-sm my-0\">{answerDiagnostics.confidence_justification}</p>\n </div>\n )}\n {answerDiagnostics.evidence_from_context && answerDiagnostics.evidence_from_context.length > 0 && (\n <div className=\"flex flex-col gap-2\" data-name=\"diagnostic-evidence\">\n <span className=\"heading-xs\">Evidence (from Knowledge Base)</span>\n {answerDiagnostics.evidence_from_context.map((evidence, index) => (\n <div key={index} className=\"flex flex-col gap-1\">\n {evidence.supporting_quote && <p className=\"text-sm my-0\">{evidence.supporting_quote}</p>}\n {evidence.url && (\n <Button variant=\"link\" size=\"sm\" className=\"flex gap-1 text-sm self-end items-center\" asChild>\n <a href={evidence.url} target=\"_blank\" rel=\"noopener noreferrer\">\n <span>Source</span>\n <ArrowSquareOut size={16} />\n </a>\n </Button>\n )}\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </>\n )}\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useForm, Controller } from 'react-hook-form';\nimport { CheckCircle, XCircle } from '@phosphor-icons/react';\n\nimport { Button } from '../ui/button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select';\nimport { Label } from '../ui/label';\nimport { Textarea } from '../ui/textarea';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\nimport { cn } from '@/lib/utils';\n\nexport enum DiscardReason {\n INCORRECT_ANSWER = 'incorrect_answer',\n HALLUCINATED_ANSWER = 'hallucinated_answer',\n OVERSHARING = 'oversharing',\n WRONG_ARTICLE_SURFACED = 'wrong_article_surfaced',\n OTHER = 'other',\n}\n\nexport const DiscardReasonLabels: Record<DiscardReason, string> = {\n [DiscardReason.INCORRECT_ANSWER]: 'Incorrect answer',\n [DiscardReason.HALLUCINATED_ANSWER]: 'Hallucinated answer',\n [DiscardReason.OVERSHARING]: 'Oversharing',\n [DiscardReason.WRONG_ARTICLE_SURFACED]: 'Wrong article surfaced',\n [DiscardReason.OTHER]: 'Other',\n};\n\nexport interface DiscardFormData {\n reason: DiscardReason;\n preferredAnswer?: string;\n}\n\nexport interface DiscardedMeta {\n reason: DiscardReason;\n suggestedAnswer?: string;\n}\n\nexport interface SelectOpenHandle {\n isOpen: boolean;\n close: () => void;\n}\n\ninterface DiscardFormProps {\n discarded?: boolean;\n discardedMeta?: DiscardedMeta;\n onSubmit: (data: DiscardFormData) => Promise<void>;\n onApprove: () => Promise<void>;\n selectOpenRef?: React.MutableRefObject<SelectOpenHandle>;\n className?: string;\n}\n\nexport function DiscardForm({\n discarded,\n discardedMeta,\n onSubmit,\n onApprove,\n selectOpenRef,\n className,\n}: DiscardFormProps): React.ReactNode {\n const [isExpanded, setIsExpanded] = useState(discarded ?? false);\n const [isSelectOpen, setIsSelectOpenState] = useState(false);\n const [isDiscarded, setIsDiscarded] = useState(discarded);\n const formRef = useRef<HTMLFormElement>(null);\n\n // Sync local state when prop changes (e.g., after server refresh)\n useEffect(() => {\n setIsDiscarded(discarded);\n if (discarded) setIsExpanded(true);\n }, [discarded]);\n\n const setIsSelectOpen = (open: boolean) => {\n setIsSelectOpenState(open);\n if (selectOpenRef) selectOpenRef.current.isOpen = open;\n };\n\n // Expose close method to parent via ref - must be in useEffect to avoid side effects during render\n useEffect(() => {\n if (selectOpenRef) {\n selectOpenRef.current.close = () => setIsSelectOpen(false);\n }\n }, [selectOpenRef]);\n\n const {\n control,\n register,\n handleSubmit,\n reset,\n formState: { isSubmitting },\n } = useForm<DiscardFormData>({\n defaultValues: {\n reason: discardedMeta?.reason,\n preferredAnswer: discardedMeta?.suggestedAnswer || '',\n },\n });\n\n useEffect(() => {\n reset({\n reason: discardedMeta?.reason,\n preferredAnswer: discardedMeta?.suggestedAnswer || '',\n });\n }, [discardedMeta, reset]);\n\n useEffect(() => {\n if (formRef.current) {\n formRef.current.inert = !isExpanded;\n }\n }, [isExpanded]);\n\n const handleCancel = () => {\n setIsExpanded(false);\n setIsSelectOpen(false);\n reset();\n };\n\n const handleApprove = async () => {\n try {\n await onApprove();\n setIsDiscarded(false);\n setIsExpanded(false);\n setIsSelectOpen(false);\n } catch (error) {\n console.error('Failed to approve:', error);\n // TODO: Consider adding error UI feedback\n }\n };\n\n const handleDiscard = async (data: DiscardFormData) => {\n try {\n await onSubmit(data);\n setIsDiscarded(true);\n setIsSelectOpen(false);\n } catch (error) {\n console.error('Failed to discard:', error);\n // TODO: Consider adding error UI feedback\n }\n };\n\n const isResolved = isDiscarded !== undefined && isDiscarded !== null;\n const showApproveButton = !isResolved || isDiscarded === false;\n const showDiscardButton = !isResolved || isDiscarded === true;\n\n return (\n <div className={cn('space-y-4', className)}>\n {/* Buttons */}\n <div className=\"flex gap-2 px-4\">\n {showApproveButton && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"shadowSurface\"\n size=\"sm\"\n className={cn('text-default !opacity-100', { 'bg-green-600 text-dark-100': isDiscarded === false })}\n disabled={isResolved}\n onClick={handleApprove}\n >\n <CheckCircle /> {isDiscarded === false ? 'Approved' : 'Approve'}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <span>Approve the answer</span>\n </TooltipContent>\n </Tooltip>\n )}\n {showDiscardButton && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"shadowSurface\"\n size=\"sm\"\n className={cn('text-default !opacity-100', { 'bg-red-600 text-dark-100': isDiscarded === true })}\n disabled={isResolved}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n <XCircle />\n {isDiscarded === true ? 'Discarded' : 'Discard'}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <span>Discard the answer</span>\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n {/* Form */}\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-300 ease-in-out',\n isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n )}\n >\n {isDiscarded ? (\n <div\n className={cn('overflow-hidden min-h-0 px-4 bg-dark-200 space-y-4', isExpanded ? 'py-4 mb-4' : 'py-0')}\n data-name=\"discard-dialog-reason\"\n >\n <div className=\"space-y-1\">\n <Label htmlFor=\"reason\" className=\"text-sm\">\n Reason\n </Label>\n <span className=\"text-sm block\">\n {discardedMeta?.reason && DiscardReasonLabels[discardedMeta.reason]}\n </span>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"preferredAnswer\" className=\"text-sm\">\n Preferred answer\n </Label>\n <span className=\"text-sm block\">{discardedMeta?.suggestedAnswer}</span>\n </div>\n </div>\n ) : (\n <form\n ref={formRef}\n onSubmit={handleSubmit(handleDiscard)}\n className={cn(\n 'overflow-hidden min-h-0 px-4 bg-dark-200 transition-all duration-300 ease-in-out',\n isExpanded ? 'py-4 mb-4' : 'py-0',\n )}\n >\n <fieldset className=\"space-y-4\" data-name=\"discard-dialog-reason\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"reason\" className=\"heading-xs\">\n Reason\n </Label>\n <Controller\n control={control}\n name=\"reason\"\n rules={{ required: true }}\n render={({ field }) => (\n <Select\n value={field.value}\n onValueChange={field.onChange}\n open={isSelectOpen}\n onOpenChange={setIsSelectOpen}\n required\n >\n <SelectTrigger className=\"border-dark-300 bg-surface\">\n <SelectValue placeholder=\"Select a reason\" />\n </SelectTrigger>\n <SelectContent>\n {Object.values(DiscardReason).map((reason) => (\n <SelectItem key={reason} value={reason}>\n {DiscardReasonLabels[reason]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n />\n <span className=\"text-xs text-subtle ml-1 hidden\">\n Give your ambient agent a descriptive name that reflects its purpose. This agent will learn from your\n content to provide personalized assistance.\n </span>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"preferredAnswer\" className=\"heading-xs\">\n Preferred answer\n </Label>\n <Textarea\n id=\"preferredAnswer\"\n required\n minLength={10}\n placeholder=\"Explain what you'd like Brainfish to do next time in this case....\"\n rows={4}\n className=\"h-52 resize-none bg-surface\"\n {...register('preferredAnswer')}\n />\n <span className=\"text-xs text-subtle ml-1 hidden\">\n Tell Brainfish why this is the incorrect answer.\n </span>\n </div>\n <div className=\"flex gap-2 !mb-1 justify-end mr-1\">\n <Button variant=\"link\" size=\"sm\" type=\"button\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"shadow\" size=\"sm\" disabled={isSubmitting}>\n {isSubmitting ? 'Submitting...' : 'Submit'}\n </Button>\n </div>\n </fieldset>\n </form>\n )}\n </div>\n </div>\n );\n}\n","import React, { useRef, useState } from 'react';\nimport { DialogProps } from '@radix-ui/react-dialog';\nimport { ListMagnifyingGlass } from '@phosphor-icons/react';\n\nimport { AnswerDiagnosticsSection } from './answer-diagnostics';\nimport { useConvosContext } from './convos';\nimport { DiscardForm, DiscardFormData, DiscardReason, SelectOpenHandle } from './discard-form';\nimport { DivButton } from '../ui/div-button';\nimport { ScrollArea } from '../ui/scroll-area';\n\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet';\n\nexport { DiscardReason } from './discard-form';\n\ninterface FeedbackDialogProps extends DialogProps {\n id: string;\n discarded?: boolean;\n discardedMeta?: { reason: DiscardReason; suggestedAnswer?: string };\n className?: string;\n}\n\nexport function FeedbackDialog({\n id,\n discarded,\n discardedMeta,\n open: externalOpen,\n onOpenChange: externalOnOpenChange,\n ...args\n}: FeedbackDialogProps): React.ReactNode {\n const { onDiscard, onApprove } = useConvosContext();\n const [internalOpen, setInternalOpen] = useState(false);\n const selectOpenRef = useRef<SelectOpenHandle>({ isOpen: false, close: () => {} });\n\n // Use external state if provided, otherwise use internal state\n const isOpen = externalOpen ?? internalOpen;\n const setIsOpen = externalOnOpenChange ?? setInternalOpen;\n\n const onSubmitForm = async (data: DiscardFormData) => {\n await onDiscard(id, data.reason, data.preferredAnswer).then(() => setIsOpen(false));\n };\n\n const handleApprove = async () => {\n await onApprove(id);\n };\n\n return (\n <Sheet modal={false} open={isOpen} onOpenChange={setIsOpen} {...args}>\n <SheetTrigger asChild onClick={(e) => e.stopPropagation()} onKeyUp={(e) => e.stopPropagation()}>\n <DivButton variant=\"shadowSurface\" size=\"sm\" aria-label=\"Inspect answer information\">\n <ListMagnifyingGlass className=\"text-dark-600\" /> Inspect\n </DivButton>\n </SheetTrigger>\n <SheetContent\n className=\"space-y-4 px-0\"\n onEscapeKeyDown={(e) => {\n if (selectOpenRef.current.isOpen) {\n e.preventDefault();\n selectOpenRef.current.close();\n }\n }}\n onInteractOutside={(e) => {\n if (selectOpenRef.current.isOpen) {\n e.preventDefault();\n }\n }}\n >\n <SheetHeader className=\"px-4\">\n <SheetTitle className=\"heading-sm m-0\">Answer information</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Shows answer diagnostics and allows you to provide feedback.\n </SheetDescription>\n </SheetHeader>\n\n <ScrollArea className=\"h-[calc(100vh-4rem)] pb-4\">\n <DiscardForm\n discarded={discarded}\n discardedMeta={discardedMeta}\n onSubmit={onSubmitForm}\n onApprove={handleApprove}\n selectOpenRef={selectOpenRef}\n />\n <AnswerDiagnosticsSection messageId={id} />\n </ScrollArea>\n </SheetContent>\n </Sheet>\n );\n}\n","import React from 'react';\n\nimport { Badge } from '@/components/ui/badge';\n\ninterface ConfidenceBadgeProps {\n score?: number;\n}\n\nexport const ConfidenceBadge = ({ score }: ConfidenceBadgeProps) => {\n const formattedScore = `${score}%`;\n if (!score || score > 100) {\n return <Badge variant=\"disabled\">N/A</Badge>;\n } else if (score >= 80) {\n return <Badge variant=\"success\">{formattedScore}</Badge>;\n } else if (score >= 40 && score < 80) {\n return <Badge variant=\"warning\">{formattedScore}</Badge>;\n } else {\n return <Badge variant=\"disabled\">N/A</Badge>;\n }\n};\n","export function formatDate(date: Date, locale?: string) {\n const defaultLocale = 'en-US';\n if (!locale) {\n if (typeof navigator !== 'undefined') {\n locale = navigator.language;\n } else {\n locale = defaultLocale;\n }\n }\n\n return date.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n}\n","import React from 'react';\nimport { ArrowSquareOut, UserCircle } from '@phosphor-icons/react';\n\nimport { StatusBadge } from './status-badge';\nimport { FormattedMessage } from '../markdown';\nimport { useConvosContext } from './convos';\nimport { FeedbackDialog, DiscardReason } from './feedback-dialog';\nimport { DivButton } from '../ui/div-button';\nimport { Button } from '../ui/button';\nimport { ConfidenceBadge } from './confidence-badge';\n\nimport { GeneratingStar } from '@/components/generating-star';\nimport { Item, ItemHeader, ItemContent, ItemTitle } from '@/components/ui/item';\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';\nimport { cn } from '@/lib/utils';\nimport { formatDate } from '@/lib/formatDate';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport './message.css';\n\nexport interface RelatedArticle {\n id: string;\n title: string;\n url: string;\n score: number;\n}\n\nexport enum MessageType {\n ACTION = 'action', // user action like 'Next Best Action clicks'\n FEEDBACK = 'feedback', // feedback for up/down vote\n QUESTION = 'question', // user question\n ANSWER = 'answer', // ai generated answer\n}\n\nexport enum Feedback {\n Positive = 'positive',\n Negative = 'negative',\n}\n\n// Shared base fields\ninterface BaseMessage {\n id: string;\n timestamp: Date;\n locale?: string; // only if not using en-US. For formatting dates (overrides context locale)\n isFeedbackDialogOpen?: boolean; // controlled state for feedback dialog\n onFeedbackDialogChange?: (isOpen: boolean) => void; // callback for feedback dialog state changes\n}\n\n// AI Answer - has related articles, discard info, confidence\nexport interface AIAnswerMessage extends BaseMessage {\n type: MessageType.ANSWER;\n role: 'ai';\n content: string;\n relatedArticles?: RelatedArticle[];\n discarded?: boolean;\n discardedMeta?: {\n reason: DiscardReason;\n suggestedAnswer?: string;\n };\n confidenceScore?: number;\n}\n\n// User Question\nexport interface UserQuestionMessage extends BaseMessage {\n type: MessageType.QUESTION;\n role: 'user';\n content: string;\n}\n\n// User Feedback - requires feedback field\nexport interface UserFeedbackMessage extends BaseMessage {\n type: MessageType.FEEDBACK;\n role: 'user';\n content: string; // optional comment text\n feedback: Feedback;\n}\n\n// User Action\nexport interface UserActionMessage extends BaseMessage {\n type: MessageType.ACTION;\n role: 'user';\n content: string;\n}\n\n// Union type\nexport type MessageProps = AIAnswerMessage | UserQuestionMessage | UserFeedbackMessage | UserActionMessage;\n\n// Type guards for external use\nexport const isAIAnswer = (msg: MessageProps): msg is AIAnswerMessage => msg.type === MessageType.ANSWER;\n\nexport const isUserQuestion = (msg: MessageProps): msg is UserQuestionMessage => msg.type === MessageType.QUESTION;\n\nexport const isFeedback = (msg: MessageProps): msg is UserFeedbackMessage => msg.type === MessageType.FEEDBACK;\n\nexport const isAction = (msg: MessageProps): msg is UserActionMessage => msg.type === MessageType.ACTION;\n\nfunction Message(props: MessageProps) {\n const { id, content, timestamp, locale: localeOverride, isFeedbackDialogOpen, onFeedbackDialogChange } = props;\n\n // Get locale from context, with override if provided\n const { locale: contextLocale } = useConvosContext();\n const locale = localeOverride || contextLocale;\n\n const formattedDate = formatDate(timestamp, locale);\n\n if (isAIAnswer(props)) {\n const { relatedArticles, discarded, discardedMeta, confidenceScore } = props;\n\n return (\n <li className=\"relative before-line after-line list-none [&_a]:break-all\">\n <Item className=\"message-item\">\n <ItemHeader className=\"justify-start gap-0\">\n <GeneratingStar variant=\"gradient\" className=\"relative -left-[6px]\" />\n <ItemTitle className=\"text-xs font-bold\">{`Generated answer ${discarded ? '(Discarded)' : ''}`}</ItemTitle>\n </ItemHeader>\n <ItemContent\n className={cn('message-ai-content', {\n 'py-6': !relatedArticles?.length,\n 'pt-6 pb-0': relatedArticles?.length,\n })}\n >\n <div className=\"message-content-wrapper\">\n <FormattedMessage message={{ content }} />\n <div className=\"flex gap-2 justify-between mt-2 items-center\">\n <span className=\"message-timestamp\">{formattedDate}</span>\n <div className=\"flex items-center gap-2\">\n {confidenceScore && (\n <Tooltip>\n <TooltipTrigger asChild>\n <DivButton variant=\"outline\" size=\"sm\" className=\"text-xs p-1 h-auto\">\n {confidenceScore}\n </DivButton>\n </TooltipTrigger>\n <TooltipContent>\n <p>Answer score: {confidenceScore}</p>\n </TooltipContent>\n </Tooltip>\n )}\n <FeedbackDialog\n id={id}\n discarded={discarded}\n discardedMeta={discardedMeta}\n open={isFeedbackDialogOpen}\n onOpenChange={onFeedbackDialogChange}\n />\n </div>\n </div>\n </div>\n {!!relatedArticles?.length && (\n <Accordion type=\"single\" collapsible className=\"p-0 custom-dashed-border-t-dark-300 w-full\">\n <AccordionItem value=\"related-articles\">\n <AccordionTrigger className=\"px-6\">Related articles</AccordionTrigger>\n <AccordionContent>\n <ul className=\"message-article-list\">\n {relatedArticles.map((article) => (\n <li\n key={article.id}\n className=\"grid gap-2 grid-cols-[auto_1fr] items-center justify-items-start\"\n >\n <ConfidenceBadge score={Math.round(article.score * 100)} />\n <Button\n variant=\"link\"\n size=\"xs\"\n asChild\n className=\"flex items-center gap-2 min-w-0 !justify-start w-full\"\n >\n <a href={article.url} target=\"_blank\" rel=\"noopener noreferrer\">\n <span className=\"truncate\">{article.title}</span>\n <ArrowSquareOut className=\"size-4 flex-shrink-0\" weight=\"regular\" />\n </a>\n </Button>\n </li>\n ))}\n </ul>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n )}\n </ItemContent>\n </Item>\n </li>\n );\n }\n\n // User messages (Question, Feedback, Action)\n const feedback = isFeedback(props) ? props.feedback : null;\n\n return (\n <li className=\"relative list-none before-line--user after-line--user\">\n <Item className=\"message-item\">\n <ItemHeader className=\"basis-0\">\n <UserCircle weight=\"fill\" size={24} />\n </ItemHeader>\n <ItemContent className=\"message-user-content\">\n {isUserQuestion(props) && (\n <div className=\"message-header\">\n <FormattedMessage message={{ content }} />\n <span className=\"message-timestamp\">{formattedDate}</span>\n </div>\n )}\n {isFeedback(props) && feedback && (\n <>\n <div className=\"message-header\">\n <div className=\"message-feedback-text\">\n {feedback === Feedback.Positive ? 'Upvoted as helpful' : 'Downvoted as not helpful'}\n </div>\n <div className=\"message-meta\">\n <span className=\"message-timestamp-simple\">{formattedDate}</span>\n <StatusBadge variant={feedback === Feedback.Positive ? 'success' : 'destructive'}>\n {feedback === Feedback.Positive ? 'Answered' : 'Unable to help'}\n </StatusBadge>\n </div>\n </div>\n {content && <div className=\"text-base\">{content}</div>}\n </>\n )}\n {isAction(props) && (\n <div className=\"message-header\">\n <span className=\"text-subtle text-sm italic\">{content}</span>\n <div className=\"message-meta\">\n <span className=\"message-timestamp-simple\">{formattedDate}</span>\n <StatusBadge variant=\"warning\">Action</StatusBadge>\n </div>\n </div>\n )}\n </ItemContent>\n </Item>\n </li>\n );\n}\n\nexport { Message };\n","// sort the attributes by key so the important ones are at the top\n// namely id, name, email, phone, followed by the rest as is\n// return the sorted keys\nexport function sortAttributeKeys(attributes: Record<string, any>[]): string[] {\n const PRIORITY_KEYS = ['id', 'name', 'email', 'phone'];\n\n if (attributes.length === 0) {\n return [];\n }\n\n const priority = (key: string) => {\n const idx = PRIORITY_KEYS.indexOf(key);\n\n // non-important keys should be at the end, so we return Infinity\n return idx === -1 ? Infinity : idx;\n };\n\n return Object.keys(attributes[0]).sort((a, b) => priority(a) - priority(b));\n}\n","import React, { useState, useEffect } from 'react';\nimport { UserFocus } from '@phosphor-icons/react';\nimport { DialogProps } from '@radix-ui/react-dialog';\nimport { createId } from '@paralleldrive/cuid2';\n\nimport { useConvosContext } from './convos';\nimport { Table, TableBody, TableCell, TableRow, TableHeader, TableHead } from '../ui/table';\nimport { ScrollArea } from '../ui/scroll-area';\n\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet';\nimport { DivButton } from '@/components/ui/div-button';\nimport { sortAttributeKeys } from '@/lib/sortAttributeKeys';\n\nimport './attributes-dialog.css';\n\ninterface Props extends DialogProps {\n conversationId: string;\n}\n\nexport function AttributesDialog({ conversationId, open, onOpenChange, ...args }: Props) {\n const [attributes, setAttributes] = useState<Record<string, any>[]>();\n const [sortedAttributesKeys, setSortedAttributesKeys] = useState<string[]>();\n\n const { fetchAttributes } = useConvosContext();\n\n useEffect(() => {\n void fetchAttributes(conversationId)\n .then((attrs) => {\n setAttributes(attrs);\n setSortedAttributesKeys(sortAttributeKeys(attrs));\n })\n .catch(() => {\n // Error handling - could be extended with error reporting\n });\n }, [fetchAttributes, conversationId]);\n\n if (!attributes?.length) {\n return null;\n }\n\n return (\n <Sheet modal={false} open={open} onOpenChange={onOpenChange} {...args}>\n <SheetTrigger asChild onClick={(e) => e.stopPropagation()} onKeyUp={(e) => e.stopPropagation()}>\n <DivButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 [&_svg]:size-6 text-dark-900\"\n aria-label=\"Open Custom attributes dialog\"\n >\n <UserFocus size={24} />\n </DivButton>\n </SheetTrigger>\n <SheetContent className=\"space-y-4\">\n <SheetHeader>\n <SheetTitle className=\"heading-sm m-0\">Custom attributes</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Custom attributes are used to store additional information about the conversation.\n </SheetDescription>\n </SheetHeader>\n {sortedAttributesKeys && (\n <ScrollArea className=\"h-[calc(100vh-8rem)]\">\n {' '}\n {/* 8rem is an approximation, accounting for header, padding, and close button */}\n <Table className=\"bg-surface\" data-test-id=\"attributes-table\">\n <TableHeader>\n <TableRow>\n {sortedAttributesKeys.map((key) => (\n <TableHead key={key} className=\"capitalize font-bold\">\n {key}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {attributes.map((record) => (\n <TableRow key={record?.id ?? createId()} className=\"border-none\">\n {sortedAttributesKeys.map((key) => (\n <TableCell key={key} data-title={key}>\n {record[key]}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </ScrollArea>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n","import React from 'react';\nimport { Circle } from '@phosphor-icons/react';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\nimport { dark } from '@/colors/dark';\nimport { Badge } from '@/components/ui/badge';\nimport { cn } from '@/lib/utils';\n\ntype Props = React.ComponentPropsWithRef<typeof Badge> & {\n streamName: string;\n dotColor?: string; // hex code from Platform\n};\n\nexport const StreamBadge = React.forwardRef<HTMLDivElement, Props>(\n ({ className, streamName, dotColor = 'transparent', ...props }, ref) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n ref={ref}\n role=\"button\"\n className={cn('flex items-center gap-1 rounded-full p-0', className)}\n tabIndex={0}\n >\n <Badge {...props} className=\"bg-surface rounded-full border border-dark-300 text-subtle\">\n <div className=\"flex items-center gap-1\">\n <Circle\n size={8}\n weight=\"bold\"\n className=\"!size-2 rounded-full\"\n style={{ backgroundColor: dotColor }}\n color={dotColor === 'transparent' ? dark[300] : 'transparent'}\n />\n <span className=\"max-w-32 truncate inline-block\">{streamName}</span>\n </div>\n </Badge>\n </div>\n </TooltipTrigger>\n <TooltipContent>{streamName}</TooltipContent>\n </Tooltip>\n );\n },\n);\n\nStreamBadge.displayName = 'StreamBadge';\n","import React, { useState } from 'react';\nimport { intlFormatDistance } from 'date-fns';\n\nimport { StatusBadge } from './status-badge';\nimport { Message } from './message';\nimport { useConvosContext } from './convos';\nimport { AttributesDialog } from './attributes-dialog';\nimport { DivButton } from '../ui/div-button';\nimport { StreamBadge } from './stream-badge';\n\nimport { AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';\nimport { Item, ItemContent, ItemDescription, ItemTitle } from '@/components/ui/item';\nimport { cn } from '@/lib/utils';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/index';\n\ninterface Source {\n name: string;\n color?: string;\n}\n\ninterface Props {\n locale?: string; // only if not using en-US. For formatting dates (overrides context locale)\n question: string; // the initial query\n timestamp: Date; // created_at date of the conversation thread\n location?: string; // location of the user\n source?: Source; // source of the conversation, i.e. channel name and color\n status?: React.ComponentProps<typeof StatusBadge>['variant'];\n statusMessage?: string; // status of the conversation - Answered | Article not found | Partial | Unanswered, etc\n hasAttributes?: boolean; // whether the conversation has attributes\n onClick?: () => void; // handler to fetch messages when accordion is clicked\n score?: number; // score of the conversation\n}\n\nexport type ConvoProps = React.ComponentPropsWithRef<typeof AccordionItem> & Props;\n\ntype OpenDialog = 'attributes' | 'feedback' | null;\n\ntype EnrichedStatusBadgeProps = Pick<ConvoProps, 'score' | 'status' | 'statusMessage'>;\nconst EnrichedStatusBadge = ({ score, status, statusMessage }: EnrichedStatusBadgeProps) => {\n return score ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <DivButton variant=\"ghost\" size=\"sm\" className=\"p-0 h-[26px]\">\n <StatusBadge variant={status} suffix={score}>\n {statusMessage}\n </StatusBadge>\n </DivButton>\n </TooltipTrigger>\n <TooltipContent>\n <p>Conversation score: {score}</p>\n </TooltipContent>\n </Tooltip>\n ) : (\n <StatusBadge variant={status} suffix={score}>\n {statusMessage}\n </StatusBadge>\n );\n};\n\n/**\n * Convo component - A single conversation item in an accordion.\n * Displays conversation metadata and messages, with support for lazy loading.\n *\n * This is a presentational component - it receives messages and loading state as props\n * rather than managing fetching logic itself.\n */\nexport function Convo({\n locale: localeOverride,\n value: queryId,\n question,\n timestamp,\n location,\n source,\n status,\n statusMessage,\n hasAttributes,\n onClick,\n className,\n score,\n ...props\n}: ConvoProps) {\n const { getMessages, isLoading: isLoadingFromContext, locale: contextLocale } = useConvosContext();\n\n // Dialog state management\n const [openDialog, setOpenDialog] = useState<OpenDialog>(null);\n const [openFeedbackMessageId, setOpenFeedbackMessageId] = useState<string | null>(null);\n\n const handleDialogChange = (dialogType: OpenDialog, messageId?: string) => (isOpen: boolean) => {\n if (isOpen) {\n setOpenDialog(dialogType);\n if (messageId) setOpenFeedbackMessageId(messageId);\n } else {\n setOpenDialog(null);\n setOpenFeedbackMessageId(null);\n }\n };\n\n const isAnyDialogOpen = openDialog !== null;\n\n // Use locale override if provided, otherwise use context locale\n const locale = localeOverride || contextLocale;\n\n // Get messages and loading state from context\n const messages = getMessages(queryId);\n const isLoading = isLoadingFromContext(queryId);\n\n // Format date\n const formattedDateRelative = intlFormatDistance(timestamp, new Date(), { locale, style: 'short' });\n\n // Create description string: \"Nov 1, 2025, 11:00 AM • United States\"\n // Filters out undefined/null values and joins with bullet separator\n const description = [formattedDateRelative, location].filter(Boolean).join(' • ');\n\n const handleAccordionClick = (e: React.MouseEvent) => {\n // Prevent accordion from toggling if click originated from within a dialog\n if ((e.target as HTMLElement).closest('[role=\"dialog\"]')) {\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n onClick?.();\n };\n\n return (\n <AccordionItem\n value={queryId}\n className={cn(\n 'border border-dark-200 hover:border-dark-300 rounded-lg bg-dark-100 [&[data-state=\"open\"]]:bg-surface [&[data-state=\"open\"]]:border-dark-300',\n { 'shadow-md shadow-dark-300': isAnyDialogOpen },\n className,\n )}\n {...props}\n >\n <AccordionTrigger\n className=\"flex-row-reverse px-4 gap-1 items-center [&[data-state=open]]:px-6\"\n onClick={handleAccordionClick}\n >\n <Item size=\"sm\" className=\"flex-1 p-0 justify-between\">\n <ItemContent className=\"max-w-[400px]\">\n <ItemTitle className=\"text-base text-default\">{question}</ItemTitle>\n <ItemDescription className=\"text-xs text-default flex items-center gap-1\">\n {description}\n {source && <StreamBadge streamName={source.name} dotColor={source.color} />}\n </ItemDescription>\n </ItemContent>\n <div className=\"flex items-center gap-0\">\n {hasAttributes && (\n <AttributesDialog\n conversationId={queryId}\n open={openDialog === 'attributes'}\n onOpenChange={handleDialogChange('attributes')}\n />\n )}\n {/* Add tooltip to say \"Conversation score\", only when there is a score */}\n {status && <EnrichedStatusBadge score={score} status={status} statusMessage={statusMessage} />}\n </div>\n </Item>\n </AccordionTrigger>\n <AccordionContent className=\"flex flex-col gap-4 text-balance px-5\">\n {isLoading ? (\n <div className=\"text-center text-subtle py-4\">Loading messages...</div>\n ) : (\n <ul className=\"list-none space-y-4\">\n {messages.slice(1).map((message) => (\n <Message\n key={message.id}\n {...message}\n isFeedbackDialogOpen={openDialog === 'feedback' && openFeedbackMessageId === message.id}\n onFeedbackDialogChange={handleDialogChange('feedback', message.id)}\n />\n ))}\n </ul>\n )}\n </AccordionContent>\n </AccordionItem>\n );\n}\n","import React from 'react';\n\nimport { Convo, ConvoProps } from './convo';\nimport { MessageProps } from './message';\nimport { AnswerDiagnostics } from './answer-diagnostics';\nimport { DiscardReason } from './discard-form';\n\nimport { Accordion } from '@/components/ui/accordion';\n\n// Context types and implementation\ninterface ConvosContextValue {\n // Fetch functions\n fetchMessages: (conversationId: string) => Promise<MessageProps[]>;\n fetchAttributes: (conversationId: string) => Promise<Record<string, any>[]>;\n\n // Messages and loading state\n getMessages: (conversationId: string) => MessageProps[];\n isLoading: (conversationId: string) => boolean;\n handleFetchMessages: (conversationId: string) => void;\n\n // Locale for date formatting\n locale?: string;\n\n // Discard dialog functions\n fetchAnswerDiagnostics: (messageId: string) => Promise<AnswerDiagnostics>;\n onDiscard: (id: string, reason: DiscardReason, suggestedAnswer?: string) => Promise<void>;\n onApprove: (id: string) => Promise<void>;\n}\n\nconst ConvosContext = React.createContext<ConvosContextValue | undefined>(undefined);\n\nexport function useConvosContext() {\n const context = React.useContext(ConvosContext);\n if (context === undefined) {\n throw new Error('useConvosContext must be used within a ConvosProvider');\n }\n\n return context;\n}\n\ninterface ConvosProviderProps {\n children: React.ReactNode;\n value: ConvosContextValue;\n}\n\nexport function ConvosProvider({ children, value }: ConvosProviderProps) {\n return <ConvosContext.Provider value={value}>{children}</ConvosContext.Provider>;\n}\n\ninterface ConvosProps {\n convos: ConvoProps[];\n fetchMessages: (conversationId: string) => Promise<MessageProps[]>; // required fetch function for lazy loading\n fetchAttributes: (conversationId: string) => Promise<Record<string, any>[]>; // required fetch function for lazy loading\n fetchAnswerDiagnostics: (messageId: string) => Promise<AnswerDiagnostics>;\n onDiscard: (id: string, reason: DiscardReason, suggestedAnswer?: string) => Promise<void>;\n onApprove: (id: string) => Promise<void>;\n}\n\n/**\n * Convos component - Displays a list of conversations in an accordion.\n * Messages are always lazy loaded when accordion items are opened.\n *\n * @param convos - Array of conversation data\n * @param fetchMessages - Async function to fetch messages for a conversation\n */\nexport function Convos({\n convos,\n fetchMessages,\n fetchAttributes,\n fetchAnswerDiagnostics,\n onDiscard,\n onApprove,\n}: ConvosProps) {\n // Maps conversation IDs to their fetched messages\n const [messagesMap, setMessagesMap] = React.useState<Record<string, MessageProps[]>>({});\n\n // Tracks which conversations are currently loading messages\n const [loadingMap, setLoadingMap] = React.useState<Record<string, boolean>>({});\n\n // Refs used to check fetch status without causing re-renders\n // These are updated synchronously and don't trigger React re-renders\n const fetchedSetRef = React.useRef<Set<string>>(new Set());\n const loadingMapRef = React.useRef<Record<string, boolean>>({});\n\n /**\n * Handles fetching messages when an accordion item is clicked.\n * Prevents duplicate fetches by checking refs before making the request.\n * Updates both refs (for synchronous checks) and state (for UI updates).\n */\n const handleFetchMessages = React.useCallback(\n (conversationId: string) => {\n // Skip if already fetched or currently loading\n if (fetchedSetRef.current.has(conversationId) || loadingMapRef.current[conversationId]) {\n return;\n }\n\n // Set loading state in both ref (for quick checks) and state (for UI)\n loadingMapRef.current[conversationId] = true;\n setLoadingMap((prev) => ({ ...prev, [conversationId]: true }));\n\n fetchMessages(conversationId)\n .then((fetchedMessages) => {\n // Store fetched messages and mark as fetched\n setMessagesMap((prev) => ({ ...prev, [conversationId]: fetchedMessages }));\n fetchedSetRef.current.add(conversationId);\n })\n .catch(() => {\n // Error handling - could be extended with error reporting\n })\n .finally(() => {\n // Clear loading state from both ref and state\n delete loadingMapRef.current[conversationId];\n setLoadingMap((prev) => {\n const newMap = { ...prev };\n delete newMap[conversationId];\n\n return newMap;\n });\n });\n },\n [fetchMessages],\n );\n\n // Create context value - use the first convo's locale as default, or allow override\n const defaultLocale = convos[0]?.locale;\n\n const contextValue = React.useMemo(\n () => ({\n fetchMessages,\n fetchAttributes,\n getMessages: (conversationId: string) => messagesMap[conversationId] || [],\n isLoading: (conversationId: string) => loadingMap[conversationId] || false,\n handleFetchMessages,\n locale: defaultLocale,\n fetchAnswerDiagnostics: (messageId: string) => fetchAnswerDiagnostics(messageId),\n onDiscard,\n onApprove,\n }),\n [\n fetchMessages,\n fetchAttributes,\n messagesMap,\n loadingMap,\n handleFetchMessages,\n defaultLocale,\n fetchAnswerDiagnostics,\n onDiscard,\n onApprove,\n ],\n );\n\n return (\n <ConvosProvider value={contextValue}>\n <Accordion type=\"single\" collapsible className=\"w-full space-y-2\">\n {convos.map((convo) => (\n <Convo\n {...convo}\n key={convo.value}\n // Trigger fetch when accordion trigger is clicked\n onClick={() => handleFetchMessages(convo.value)}\n />\n ))}\n </Accordion>\n </ConvosProvider>\n );\n}\n"],"names":["React","DiscardReason","MessageType","Feedback"],"mappings":"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"}