@brainfish-ai/components 0.25.4 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-review.js","sources":["../../../src/scenes/knowledge-review/diff-loader.tsx","../../../src/scenes/knowledge-review/suggestions-header/suggestions-header.tsx","../../../src/lib/countSuggestions.ts","../../../src/scenes/knowledge-review/knowledge-review-panel.tsx","../../../src/scenes/knowledge-review/scene.tsx"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport type { LoadedDiffDoc } from './context';\nimport { useReviewsSelection } from './context';\n\nexport type KnowledgeReviewDiffLoaderProps = {\n /** Called when selectedItem changes. Return diff payload or null. */\n fetchDiffForItem: (itemId: string) => Promise<LoadedDiffDoc | null>;\n};\n\n/**\n * Listens to selectedItem from context and fetches diff via the provided callback.\n * Owns loading state and context updates; host (Storybook or Platform) supplies fetch logic.\n */\nexport function KnowledgeReviewDiffLoader({ fetchDiffForItem }: KnowledgeReviewDiffLoaderProps) {\n const { selectedItem, setLoadedDiffDoc, setLoadingDiff } = useReviewsSelection();\n\n const loadDiffForItem = useCallback(\n async (itemId: string, signal: AbortSignal) => {\n setLoadingDiff(true);\n setLoadedDiffDoc(null);\n\n try {\n const doc = await fetchDiffForItem(itemId);\n if (signal.aborted) return;\n setLoadedDiffDoc(doc);\n } catch (error) {\n if (signal.aborted) return;\n console.error('Failed to fetch diff:', error);\n setLoadedDiffDoc(null);\n } finally {\n if (!signal.aborted) {\n setLoadingDiff(false);\n }\n }\n },\n [fetchDiffForItem, setLoadedDiffDoc, setLoadingDiff],\n );\n\n const selectedId = selectedItem?.id;\n\n useEffect(() => {\n if (!selectedId) {\n setLoadedDiffDoc(null);\n setLoadingDiff(false);\n\n return;\n }\n\n const abortController = new AbortController();\n void loadDiffForItem(selectedId, abortController.signal);\n\n return () => {\n abortController.abort();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedId, loadDiffForItem]);\n\n return null;\n}\n","import { CaretDown, CaretUp, Backspace, CheckCircle } from '@phosphor-icons/react';\nimport * as React from 'react';\n\nimport { EditCount } from '../review-list/edit-count';\n\nimport { Button } from '@/components/ui/button';\nimport { brandShadowEffect } from '@/lib/styles';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { ButtonGroup } from '@/components/ui/button-group';\nimport { cn } from '@/lib/utils';\nimport { StatusBadge } from '@/components/convos/status-badge';\n\nexport interface SuggestionsHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n title: React.ReactNode;\n isNew: boolean;\n suggestionsCount: number;\n sourceIcon: React.ReactNode;\n sourceDescription: string | null;\n currentArticleIndex: number;\n totalArticles: number;\n displayTotalArticles?: number;\n showActionButtons?: boolean;\n onNextArticle: () => void;\n onPreviousArticle: () => void;\n onRejectAllSuggestions: () => void;\n onAcceptAllSuggestions: () => void;\n onAcceptAndPublish?: () => void;\n breadcrumb?: string;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n}\n\nexport const SuggestionsHeader = React.forwardRef<HTMLDivElement, SuggestionsHeaderProps>(function SuggestionsHeader(\n {\n title,\n isNew,\n suggestionsCount,\n sourceIcon,\n sourceDescription,\n currentArticleIndex,\n totalArticles,\n displayTotalArticles,\n showActionButtons = true,\n onNextArticle,\n onPreviousArticle,\n onRejectAllSuggestions,\n onAcceptAllSuggestions,\n onAcceptAndPublish,\n breadcrumb,\n onOpenArticleLink,\n onSourceLinkClick,\n className,\n ...props\n },\n ref,\n) {\n const splitButtonRef = React.useRef<HTMLDivElement>(null);\n const hasNextArticle = totalArticles > 0 && currentArticleIndex < totalArticles - 1;\n const hasPreviousArticle = currentArticleIndex > 0;\n const currentArticle = totalArticles === 0 ? 0 : currentArticleIndex + 1;\n const totalArticlesForDisplay = displayTotalArticles ?? totalArticles;\n const hasDisplayArticles = totalArticlesForDisplay > 0;\n\n let status: React.ReactNode | undefined;\n if (isNew) {\n status = <StatusBadge variant=\"success\">New</StatusBadge>;\n } else if (suggestionsCount) {\n status = <EditCount count={suggestionsCount} />;\n }\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-4', className)} {...props}>\n {/* Header + Navigation */}\n <div className=\"flex justify-between items-center\">\n <h1 className=\"heading-lg\">\n {title}\n {/* Breadcrumbs */}\n {onOpenArticleLink && breadcrumb && (\n <Button\n variant=\"link\"\n size=\"sm\"\n onClick={onOpenArticleLink}\n aria-label=\"Open article\"\n className=\"block px-0 text-subtle text-xs\"\n >\n {breadcrumb}\n </Button>\n )}\n </h1>\n {/* up/down carets */}\n <div className=\"flex items-center\">\n <p className=\"text-xs text-foreground\">\n <span aria-hidden=\"true\">{hasDisplayArticles ? `${currentArticle}/${totalArticlesForDisplay}` : '0'}</span>\n <span className=\"sr-only\" aria-live=\"polite\">\n {hasDisplayArticles ? `Article ${currentArticle} of ${totalArticlesForDisplay}` : 'No articles'}\n </span>\n </p>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n disabled={!hasNextArticle}\n onClick={onNextArticle}\n aria-label=\"Go to next article\"\n >\n <CaretDown aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\" bgColor=\"--bfc-foreground\" className=\"text-background\">\n Next Article\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n disabled={!hasPreviousArticle}\n onClick={onPreviousArticle}\n aria-label=\"Go to previous article\"\n >\n <CaretUp aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" bgColor=\"--bfc-foreground\" className=\"text-background\">\n Previous Article\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Status, Source + Actions */}\n <div className=\"flex-1 px-2 pb-2 flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n {status}\n {sourceDescription &&\n (onSourceLinkClick ? (\n <Button\n variant=\"link\"\n onClick={onSourceLinkClick}\n aria-label=\"Open source\"\n className=\"[&_svg]:size-4 text-xs text-subtle gap-1\"\n >\n {sourceIcon && <span className=\"shrink-0 flex items-center\">{sourceIcon}</span>}\n <span>{sourceDescription}</span>\n </Button>\n ) : (\n <span className=\"[&_svg]:size-4 flex items-center gap-1 text-xs text-subtle\">\n {sourceIcon && <span className=\"shrink-0 flex items-center\">{sourceIcon}</span>}\n {sourceDescription}\n </span>\n ))}\n </div>\n {showActionButtons && (\n <ButtonGroup orientation=\"horizontal\" rounded={false} aria-label=\"Suggestion actions\" className=\"gap-1\">\n <Button variant=\"ghost\" onClick={onRejectAllSuggestions}>\n <Backspace aria-hidden=\"true\" />\n Reject\n </Button>\n {onAcceptAndPublish ? (\n <DropdownMenu>\n <div\n ref={splitButtonRef}\n className={cn('flex items-center rounded border border-border bg-primary', brandShadowEffect)}\n >\n <Button\n variant=\"ghost\"\n className=\"gap-1 rounded-none border-0 bg-transparent shadow-none hover:bg-dark-200\"\n onClick={onAcceptAllSuggestions}\n >\n <CheckCircle aria-hidden=\"true\" />\n Accept as draft\n </Button>\n <span className=\"h-full w-px self-stretch bg-foreground\" aria-hidden=\"true\" />\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-9 rounded-none border-0 bg-transparent shadow-none hover:bg-dark-200\"\n aria-label=\"More accept options\"\n >\n <CaretDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n </div>\n <DropdownMenuContent align=\"end\" className=\"z-above-modal border-none shadow-md dark:shadow-md-invert\">\n <DropdownMenuItem onClick={onAcceptAndPublish}>\n <CheckCircle aria-hidden=\"true\" />\n Accept & publish\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <Button variant=\"shadow\" onClick={onAcceptAllSuggestions}>\n <CheckCircle aria-hidden=\"true\" />\n Accept as draft\n </Button>\n )}\n </ButtonGroup>\n )}\n </div>\n </div>\n );\n});\n","function countSuggestionsInRoot(root: Document | Element): number {\n const adjacentPairs = root.querySelectorAll('del + ins');\n const standaloneIns = root.querySelectorAll('ins:not(del + ins)');\n const allDel = root.querySelectorAll('del');\n const standaloneDel = Array.from(allDel).filter((del) => del.nextElementSibling?.tagName !== 'INS');\n\n return adjacentPairs.length + standaloneIns.length + standaloneDel.length;\n}\n\n/** Count suggestions in an HTML string (for title or raw HTML content). */\nexport const countSuggestions = (htmlString: string) => {\n if (!htmlString || typeof DOMParser === 'undefined') {\n return 0;\n }\n const parser = new DOMParser();\n const doc = parser.parseFromString(htmlString, 'text/html');\n\n return countSuggestionsInRoot(doc);\n};\n\n/** Count suggestions inside a DOM element (for rendered ReactNode body content). */\nexport const countSuggestionsInElement = (element: Element | null) => {\n if (!element) return 0;\n\n return countSuggestionsInRoot(element);\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport parse from 'html-react-parser';\nimport { HandsClapping } from '@phosphor-icons/react';\n\nimport { useReviewsSelection } from './context';\nimport { SuggestionsHeader } from './suggestions-header';\nimport type { ReviewListItemProps } from './review-list';\n\nimport { countSuggestions, countSuggestionsInElement } from '@/lib/countSuggestions';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { Spinner } from '@/components/ui/spinner';\n\nexport type KnowledgeReviewPanelProps = {\n diffTitle: string;\n items: ReviewListItemProps[];\n isLoading?: boolean;\n totalItemsCount?: number;\n showActionButtons?: boolean;\n children?: React.ReactNode;\n sourceIcon: React.ReactNode;\n sourceDescription: string | null;\n};\n\n/**\n * Panel that shows the selected diff (title + content), suggestion count, and article nav.\n * Must be used inside ReviewsSelectionProvider. Expects --knowledge-review-scroll-height\n * to be set by a parent for ScrollArea height.\n */\nexport function KnowledgeReviewPanel({\n diffTitle,\n items,\n isLoading,\n totalItemsCount,\n showActionButtons = true,\n children,\n sourceIcon,\n sourceDescription,\n}: KnowledgeReviewPanelProps) {\n const {\n selectedItem,\n setSelectedItem,\n loadedDiffDoc,\n loadingDiff,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n } = useReviewsSelection();\n\n const hasItems = items.length > 0;\n const resolvedIsLoading = isLoading ?? !hasItems;\n const isLoadingState = resolvedIsLoading && !hasItems;\n const isEmptyState = !resolvedIsLoading && !hasItems;\n\n const title = loadingDiff ? '' : parse(loadedDiffDoc?.diffTitle ?? diffTitle ?? '');\n const body = loadingDiff ? <div className=\"text-muted-foreground\">Loading diff…</div> : loadedDiffDoc?.diffContent;\n\n const titleSuggestionsCount = loadingDiff ? 0 : countSuggestions(loadedDiffDoc?.diffTitle ?? diffTitle);\n\n const bodyRef = useRef<HTMLDivElement>(null);\n const [bodySuggestionsCount, setBodySuggestionsCount] = useState(0);\n useEffect(() => {\n if (loadingDiff || !loadedDiffDoc) {\n setBodySuggestionsCount(0);\n\n return;\n }\n const el = bodyRef.current;\n if (!el) return;\n const id = requestAnimationFrame(() => {\n setBodySuggestionsCount(countSuggestionsInElement(el));\n });\n\n return () => cancelAnimationFrame(id);\n }, [loadingDiff, loadedDiffDoc]);\n\n const suggestionsCount = titleSuggestionsCount + bodySuggestionsCount;\n\n const totalArticles = items.length;\n const totalArticlesForDisplay = totalItemsCount ?? totalArticles;\n const currentArticleIndex = selectedItem\n ? Math.max(\n 0,\n items.findIndex((i) => i.id === selectedItem.id),\n )\n : 0;\n\n const onNextArticle = useCallback(() => {\n if (currentArticleIndex < totalArticles - 1) {\n setSelectedItem(items[currentArticleIndex + 1] ?? null);\n }\n }, [currentArticleIndex, items, setSelectedItem, totalArticles]);\n\n const onPreviousArticle = useCallback(() => {\n if (currentArticleIndex > 0) {\n setSelectedItem(items[currentArticleIndex - 1] ?? null);\n }\n }, [currentArticleIndex, items, setSelectedItem]);\n\n const headerSourceIcon = selectedItem?.icon ?? sourceIcon;\n const headerSourceDescription = selectedItem?.description ?? sourceDescription;\n\n return (\n <Card className=\"py-6 pl-4\" data-name=\"knowledge-reviews\">\n <ScrollArea className=\"h-[calc(var(--knowledge-review-scroll-height)-50px)] pr-8\">\n <CardHeader className=\"p-0\">\n {hasItems && (\n <CardTitle className=\"border-b border-dark-300 mb-6 pb-2 font-normal\">\n <SuggestionsHeader\n title={title}\n isNew={loadedDiffDoc?.isNew ?? false}\n suggestionsCount={suggestionsCount}\n sourceIcon={headerSourceIcon}\n sourceDescription={headerSourceDescription}\n currentArticleIndex={currentArticleIndex}\n totalArticles={totalArticles}\n displayTotalArticles={totalArticlesForDisplay}\n showActionButtons={showActionButtons}\n onNextArticle={onNextArticle}\n onPreviousArticle={onPreviousArticle}\n onRejectAllSuggestions={onRejectAllSuggestions}\n onAcceptAllSuggestions={onApproveAllSuggestions}\n onAcceptAndPublish={onAcceptAndPublish}\n onOpenArticleLink={onOpenArticleLink}\n onSourceLinkClick={onSourceLinkClick}\n breadcrumb={breadcrumb}\n />\n </CardTitle>\n )}\n </CardHeader>\n <CardContent className=\"p-0 [&_ol]:!pl-16 [&_ul]:!pl-16\">\n {/* Mount point for children (e.g. KnowledgeReviewDiffLoader). Kept in DOM so its effects run; hidden because it has no UI. */}\n <div aria-hidden=\"true\" className=\"sr-only\" hidden>\n {children}\n </div>\n {isLoadingState ? (\n <div className=\"flex flex-col items-center justify-center gap-4 text-center h-[50dvh] text-muted-foreground\">\n <Spinner className=\"size-8\" />\n <p className=\"text-base font-medium\">Loading suggestions...</p>\n </div>\n ) : isEmptyState ? (\n <div className=\"flex flex-col items-center justify-center gap-4 text-center h-[50dvh]\">\n <HandsClapping className=\"text-muted-foreground\" size={32} weight=\"fill\" />\n <p className=\"text-base font-medium text-foreground\">All up to date. Well done, mate.</p>\n </div>\n ) : (\n <div ref={bodyRef}>{body}</div>\n )}\n </CardContent>\n </ScrollArea>\n </Card>\n );\n}\n","import React, { useEffect, useImperativeHandle, useRef } from 'react';\n\nimport { useReviewsSelection } from './context';\nimport { ReviewList, ReviewListItemProps, ReviewsSelectionProvider } from './review-list';\nimport { KnowledgeReviewPanel } from './knowledge-review-panel';\n\nimport { Card, CardContent } from '@/components/ui/card';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { Spinner } from '@/components/ui/spinner';\nimport { cn } from '@/lib/utils';\n\nimport './knowledge-review.css';\n\nconst SCROLL_HEIGHT_VAR = '--knowledge-review-scroll-height';\n\nexport type KnowledgeReviewSceneHandle = {\n selectedItem: ReviewListItemProps | null;\n setSelectedItem: (item: ReviewListItemProps | null) => void;\n};\n\nexport type KnowledgeReviewSceneProps = {\n diffTitle?: string;\n children: React.ReactNode;\n items: ReviewListItemProps[];\n isLoading?: boolean;\n /** Total number of review list items available (can exceed currently loaded `items.length`). */\n totalItemsCount?: number;\n /** Controls visibility of the Reject / Accept action buttons in the review header. */\n showActionButtons?: boolean;\n className?: string;\n onApproveAllSuggestions: () => void;\n onRejectAllSuggestions: () => void;\n onAcceptAndPublish?: () => void;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n breadcrumb?: string;\n sourceIcon: React.ReactNode;\n sourceDescription: string | null;\n};\n\nconst KnowledgeReviewSceneInner = React.forwardRef<KnowledgeReviewSceneHandle, KnowledgeReviewSceneProps>(\n function KnowledgeReviewSceneInner(\n {\n diffTitle = 'Knowledge Review',\n children,\n items,\n isLoading,\n totalItemsCount,\n showActionButtons = true,\n className,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n sourceIcon,\n sourceDescription,\n ...props\n },\n ref,\n ) {\n const innerRef = useRef<HTMLDivElement>(null);\n const { selectedItem, setSelectedItem } = useReviewsSelection();\n\n useImperativeHandle(\n ref,\n () => ({\n selectedItem,\n setSelectedItem,\n }),\n [selectedItem, setSelectedItem],\n );\n\n useEffect(() => {\n const cardEl = innerRef.current;\n if (!cardEl) return;\n\n const updateHeight = () => {\n const { height } = cardEl.getBoundingClientRect();\n cardEl.style.setProperty(SCROLL_HEIGHT_VAR, `${height}px`);\n };\n\n updateHeight();\n\n if (typeof ResizeObserver !== 'function') {\n return;\n }\n\n const observer = new ResizeObserver(updateHeight);\n observer.observe(cardEl);\n\n return () => observer.disconnect();\n }, []);\n\n const resolvedIsLoading = isLoading ?? items.length === 0;\n const isLoadingItems = resolvedIsLoading && items.length === 0;\n\n return (\n <Card className={cn('h-full', className)}>\n <CardContent className=\"p-4 lg:p-8 h-full\">\n <div\n ref={innerRef}\n className=\"grid xs:max-lg:grid-cols-1 lg:grid-cols-[1fr_4fr] gap-6 min-h-96 h-full\"\n style={{ [SCROLL_HEIGHT_VAR]: '100px' } as React.CSSProperties}\n {...props}\n >\n <ScrollArea className=\"h-[calc(var(--knowledge-review-scroll-height))] min-w-80 lg:block hidden\">\n {isLoadingItems ? (\n <div className=\"flex h-full min-h-96 items-center justify-center text-muted-foreground\">\n <Spinner className=\"size-6\" />\n </div>\n ) : (\n <ReviewList items={items} />\n )}\n </ScrollArea>\n <KnowledgeReviewPanel\n diffTitle={diffTitle}\n items={items}\n isLoading={resolvedIsLoading}\n totalItemsCount={totalItemsCount}\n showActionButtons={showActionButtons}\n sourceIcon={sourceIcon}\n sourceDescription={sourceDescription}\n >\n {children}\n </KnowledgeReviewPanel>\n </div>\n </CardContent>\n </Card>\n );\n },\n);\n\nexport const KnowledgeReviewScene = React.forwardRef<KnowledgeReviewSceneHandle, KnowledgeReviewSceneProps>(\n function KnowledgeReviewScene(props, ref) {\n const {\n items,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n } = props;\n\n return (\n <ReviewsSelectionProvider\n defaultSelectedItem={items.find((m) => m.isSelected) ?? null}\n onApproveAllSuggestions={onApproveAllSuggestions}\n onRejectAllSuggestions={onRejectAllSuggestions}\n onAcceptAndPublish={onAcceptAndPublish}\n onOpenArticleLink={onOpenArticleLink}\n onSourceLinkClick={onSourceLinkClick}\n breadcrumb={breadcrumb}\n >\n <KnowledgeReviewSceneInner {...props} ref={ref} />\n </ReviewsSelectionProvider>\n );\n },\n);\n"],"names":["SuggestionsHeader","React","KnowledgeReviewSceneInner","KnowledgeReviewScene"],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-review.js","sources":["../../../src/scenes/knowledge-review/diff-loader.tsx","../../../src/scenes/knowledge-review/suggestions-header/suggestions-header.tsx","../../../src/lib/countSuggestions.ts","../../../src/scenes/knowledge-review/knowledge-review-panel.tsx","../../../src/scenes/knowledge-review/scene.tsx"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport type { LoadedDiffDoc } from './context';\nimport { useReviewsSelection } from './context';\n\nexport type KnowledgeReviewDiffLoaderProps = {\n /** Called when selectedItem changes. Return diff payload or null. */\n fetchDiffForItem: (itemId: string) => Promise<LoadedDiffDoc | null>;\n};\n\n/**\n * Listens to selectedItem from context and fetches diff via the provided callback.\n * Owns loading state and context updates; host (Storybook or Platform) supplies fetch logic.\n */\nexport function KnowledgeReviewDiffLoader({ fetchDiffForItem }: KnowledgeReviewDiffLoaderProps) {\n const { selectedItem, setLoadedDiffDoc, setLoadingDiff } = useReviewsSelection();\n\n const loadDiffForItem = useCallback(\n async (itemId: string, signal: AbortSignal) => {\n setLoadingDiff(true);\n setLoadedDiffDoc(null);\n\n try {\n const doc = await fetchDiffForItem(itemId);\n if (signal.aborted) return;\n setLoadedDiffDoc(doc);\n } catch (error) {\n if (signal.aborted) return;\n console.error('Failed to fetch diff:', error);\n setLoadedDiffDoc(null);\n } finally {\n if (!signal.aborted) {\n setLoadingDiff(false);\n }\n }\n },\n [fetchDiffForItem, setLoadedDiffDoc, setLoadingDiff],\n );\n\n const selectedId = selectedItem?.id;\n\n useEffect(() => {\n if (!selectedId) {\n setLoadedDiffDoc(null);\n setLoadingDiff(false);\n\n return;\n }\n\n const abortController = new AbortController();\n void loadDiffForItem(selectedId, abortController.signal);\n\n return () => {\n abortController.abort();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedId, loadDiffForItem]);\n\n return null;\n}\n","import { CaretDown, CaretUp, Backspace, CheckCircle, Lightbulb } from '@phosphor-icons/react';\nimport * as React from 'react';\n\nimport { EditCount } from '../review-list/edit-count';\n\nimport { Button } from '@/components/ui/button';\nimport { brandShadowEffect } from '@/lib/styles';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { ButtonGroup } from '@/components/ui/button-group';\nimport { cn } from '@/lib/utils';\nimport { StatusBadge } from '@/components/convos/status-badge';\n\nexport interface SuggestionsHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n title: React.ReactNode;\n isNew: boolean;\n suggestionsCount: number;\n sourceIcon: React.ReactNode;\n sourceDescription: string | null;\n currentArticleIndex: number;\n totalArticles: number;\n displayTotalArticles?: number;\n showActionButtons?: boolean;\n onNextArticle: () => void;\n onPreviousArticle: () => void;\n onRejectAllSuggestions: () => void;\n onAcceptAllSuggestions: () => void;\n onAcceptAndPublish?: () => void;\n breadcrumb?: string;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n suggestionReasonBody?: string;\n}\n\nexport const REASON_TITLE = 'Why is Brainfish suggesting this?';\n\nexport const SuggestionsHeader = React.forwardRef<HTMLDivElement, SuggestionsHeaderProps>(function SuggestionsHeader(\n {\n title,\n isNew,\n suggestionsCount,\n sourceIcon,\n sourceDescription,\n currentArticleIndex,\n totalArticles,\n displayTotalArticles,\n showActionButtons = true,\n onNextArticle,\n onPreviousArticle,\n onRejectAllSuggestions,\n onAcceptAllSuggestions,\n onAcceptAndPublish,\n breadcrumb,\n onOpenArticleLink,\n onSourceLinkClick,\n suggestionReasonBody,\n className,\n ...props\n },\n ref,\n) {\n const splitButtonRef = React.useRef<HTMLDivElement>(null);\n const [whyOpen, setWhyOpen] = React.useState(false);\n const hasNextArticle = totalArticles > 0 && currentArticleIndex < totalArticles - 1;\n const hasPreviousArticle = currentArticleIndex > 0;\n const currentArticle = totalArticles === 0 ? 0 : currentArticleIndex + 1;\n const totalArticlesForDisplay = displayTotalArticles ?? totalArticles;\n const hasDisplayArticles = totalArticlesForDisplay > 0;\n\n let status: React.ReactNode | undefined;\n if (isNew) {\n status = <StatusBadge variant=\"success\">New</StatusBadge>;\n } else if (suggestionsCount) {\n status = <EditCount count={suggestionsCount} />;\n }\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-4', className)} {...props}>\n {/* Header + Navigation */}\n <div className=\"flex justify-between items-center\">\n <h1 className=\"heading-lg\">\n {title}\n {/* Breadcrumbs */}\n {onOpenArticleLink && breadcrumb && (\n <Button\n variant=\"link\"\n size=\"sm\"\n onClick={onOpenArticleLink}\n aria-label=\"Open article\"\n className=\"block px-0 text-subtle text-xs\"\n >\n {breadcrumb}\n </Button>\n )}\n </h1>\n {/* up/down carets */}\n <div className=\"flex items-center\">\n <p className=\"text-xs text-foreground\">\n <span aria-hidden=\"true\">{hasDisplayArticles ? `${currentArticle}/${totalArticlesForDisplay}` : '0'}</span>\n <span className=\"sr-only\" aria-live=\"polite\">\n {hasDisplayArticles ? `Article ${currentArticle} of ${totalArticlesForDisplay}` : 'No articles'}\n </span>\n </p>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n disabled={!hasNextArticle}\n onClick={onNextArticle}\n aria-label=\"Go to next article\"\n >\n <CaretDown aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\" bgColor=\"--bfc-foreground\" className=\"text-background\">\n Next Article\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n disabled={!hasPreviousArticle}\n onClick={onPreviousArticle}\n aria-label=\"Go to previous article\"\n >\n <CaretUp aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" bgColor=\"--bfc-foreground\" className=\"text-background\">\n Previous Article\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Status, Source + Actions */}\n <div className=\"flex-1 px-2 pb-2 flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n {status}\n {sourceDescription &&\n (onSourceLinkClick ? (\n <Button\n variant=\"link\"\n onClick={onSourceLinkClick}\n aria-label=\"Open source\"\n className=\"[&_svg]:size-4 text-xs text-subtle gap-1\"\n >\n {sourceIcon && <span className=\"shrink-0 flex items-center\">{sourceIcon}</span>}\n <span>{sourceDescription}</span>\n </Button>\n ) : (\n <span className=\"[&_svg]:size-4 flex items-center gap-1 text-xs text-subtle\">\n {sourceIcon && <span className=\"shrink-0 flex items-center\">{sourceIcon}</span>}\n {sourceDescription}\n </span>\n ))}\n </div>\n {showActionButtons && (\n <ButtonGroup orientation=\"horizontal\" rounded={false} aria-label=\"Suggestion actions\" className=\"gap-1\">\n {suggestionReasonBody && (\n <Popover open={whyOpen} onOpenChange={setWhyOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"ghost\" aria-label={REASON_TITLE}>\n <Lightbulb aria-hidden=\"true\" />\n Why\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n className=\"z-above-modal shadow-md dark:shadow-md-invert border-dark-300\"\n >\n <div className=\"font-bold text-sm\">{REASON_TITLE}</div>\n <div className=\"text-sm text-subtle mt-1\">{suggestionReasonBody}</div>\n </PopoverContent>\n </Popover>\n )}\n <Button variant=\"ghost\" onClick={onRejectAllSuggestions}>\n <Backspace aria-hidden=\"true\" />\n Reject\n </Button>\n {onAcceptAndPublish ? (\n <DropdownMenu>\n <div\n ref={splitButtonRef}\n className={cn('flex items-center rounded border border-border bg-primary', brandShadowEffect)}\n >\n <Button\n variant=\"ghost\"\n className=\"gap-1 rounded-none border-0 bg-transparent shadow-none hover:bg-dark-200\"\n onClick={onAcceptAllSuggestions}\n >\n <CheckCircle aria-hidden=\"true\" />\n Accept as draft\n </Button>\n <span className=\"h-full w-px self-stretch bg-foreground\" aria-hidden=\"true\" />\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-9 rounded-none border-0 bg-transparent shadow-none hover:bg-dark-200\"\n aria-label=\"More accept options\"\n >\n <CaretDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n </div>\n <DropdownMenuContent align=\"end\" className=\"z-above-modal border-none shadow-md dark:shadow-md-invert\">\n <DropdownMenuItem onClick={onAcceptAndPublish}>\n <CheckCircle aria-hidden=\"true\" />\n Accept & publish\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <Button variant=\"shadow\" onClick={onAcceptAllSuggestions}>\n <CheckCircle aria-hidden=\"true\" />\n Accept as draft\n </Button>\n )}\n </ButtonGroup>\n )}\n </div>\n </div>\n );\n});\n","function countSuggestionsInRoot(root: Document | Element): number {\n const adjacentPairs = root.querySelectorAll('del + ins');\n const standaloneIns = root.querySelectorAll('ins:not(del + ins)');\n const allDel = root.querySelectorAll('del');\n const standaloneDel = Array.from(allDel).filter((del) => del.nextElementSibling?.tagName !== 'INS');\n\n return adjacentPairs.length + standaloneIns.length + standaloneDel.length;\n}\n\n/** Count suggestions in an HTML string (for title or raw HTML content). */\nexport const countSuggestions = (htmlString: string) => {\n if (!htmlString || typeof DOMParser === 'undefined') {\n return 0;\n }\n const parser = new DOMParser();\n const doc = parser.parseFromString(htmlString, 'text/html');\n\n return countSuggestionsInRoot(doc);\n};\n\n/** Count suggestions inside a DOM element (for rendered ReactNode body content). */\nexport const countSuggestionsInElement = (element: Element | null) => {\n if (!element) return 0;\n\n return countSuggestionsInRoot(element);\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport parse from 'html-react-parser';\nimport { HandsClapping } from '@phosphor-icons/react';\n\nimport { useReviewsSelection } from './context';\nimport { SuggestionsHeader } from './suggestions-header';\nimport type { ReviewListItemProps } from './review-list';\n\nimport { countSuggestions, countSuggestionsInElement } from '@/lib/countSuggestions';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { Spinner } from '@/components/ui/spinner';\n\nexport type KnowledgeReviewPanelProps = {\n diffTitle: string;\n items: ReviewListItemProps[];\n isLoading?: boolean;\n totalItemsCount?: number;\n showActionButtons?: boolean;\n children?: React.ReactNode;\n sourceIcon: React.ReactNode;\n sourceDescription: string | null;\n};\n\n/**\n * Panel that shows the selected diff (title + content), suggestion count, and article nav.\n * Must be used inside ReviewsSelectionProvider. Expects --knowledge-review-scroll-height\n * to be set by a parent for ScrollArea height.\n */\nexport function KnowledgeReviewPanel({\n diffTitle,\n items,\n isLoading,\n totalItemsCount,\n showActionButtons = true,\n children,\n sourceIcon,\n sourceDescription,\n}: KnowledgeReviewPanelProps) {\n const {\n selectedItem,\n setSelectedItem,\n loadedDiffDoc,\n loadingDiff,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n suggestionReasonBody,\n } = useReviewsSelection();\n\n const hasItems = items.length > 0;\n const resolvedIsLoading = isLoading ?? !hasItems;\n const isLoadingState = resolvedIsLoading && !hasItems;\n const isEmptyState = !resolvedIsLoading && !hasItems;\n\n const title = loadingDiff ? '' : parse(loadedDiffDoc?.diffTitle ?? diffTitle ?? '');\n const body = loadingDiff ? <div className=\"text-muted-foreground\">Loading diff…</div> : loadedDiffDoc?.diffContent;\n\n const titleSuggestionsCount = loadingDiff ? 0 : countSuggestions(loadedDiffDoc?.diffTitle ?? diffTitle);\n\n const bodyRef = useRef<HTMLDivElement>(null);\n const [bodySuggestionsCount, setBodySuggestionsCount] = useState(0);\n useEffect(() => {\n if (loadingDiff || !loadedDiffDoc) {\n setBodySuggestionsCount(0);\n\n return;\n }\n const el = bodyRef.current;\n if (!el) return;\n const id = requestAnimationFrame(() => {\n setBodySuggestionsCount(countSuggestionsInElement(el));\n });\n\n return () => cancelAnimationFrame(id);\n }, [loadingDiff, loadedDiffDoc]);\n\n const suggestionsCount = titleSuggestionsCount + bodySuggestionsCount;\n\n const totalArticles = items.length;\n const totalArticlesForDisplay = totalItemsCount ?? totalArticles;\n const currentArticleIndex = selectedItem\n ? Math.max(\n 0,\n items.findIndex((i) => i.id === selectedItem.id),\n )\n : 0;\n\n const onNextArticle = useCallback(() => {\n if (currentArticleIndex < totalArticles - 1) {\n setSelectedItem(items[currentArticleIndex + 1] ?? null);\n }\n }, [currentArticleIndex, items, setSelectedItem, totalArticles]);\n\n const onPreviousArticle = useCallback(() => {\n if (currentArticleIndex > 0) {\n setSelectedItem(items[currentArticleIndex - 1] ?? null);\n }\n }, [currentArticleIndex, items, setSelectedItem]);\n\n const headerSourceIcon = selectedItem?.icon ?? sourceIcon;\n const headerSourceDescription = selectedItem?.description ?? sourceDescription;\n\n return (\n <Card className=\"py-6 pl-4\" data-name=\"knowledge-reviews\">\n <ScrollArea className=\"h-[calc(var(--knowledge-review-scroll-height)-50px)] pr-8\">\n <CardHeader className=\"p-0\">\n {hasItems && (\n <CardTitle className=\"border-b border-dark-300 mb-6 pb-2 font-normal\">\n <SuggestionsHeader\n title={title}\n isNew={loadedDiffDoc?.isNew ?? false}\n suggestionsCount={suggestionsCount}\n sourceIcon={headerSourceIcon}\n sourceDescription={headerSourceDescription}\n currentArticleIndex={currentArticleIndex}\n totalArticles={totalArticles}\n displayTotalArticles={totalArticlesForDisplay}\n showActionButtons={showActionButtons}\n onNextArticle={onNextArticle}\n onPreviousArticle={onPreviousArticle}\n onRejectAllSuggestions={onRejectAllSuggestions}\n onAcceptAllSuggestions={onApproveAllSuggestions}\n onAcceptAndPublish={onAcceptAndPublish}\n onOpenArticleLink={onOpenArticleLink}\n onSourceLinkClick={onSourceLinkClick}\n breadcrumb={breadcrumb}\n suggestionReasonBody={suggestionReasonBody}\n />\n </CardTitle>\n )}\n </CardHeader>\n <CardContent className=\"p-0 [&_ol]:!pl-16 [&_ul]:!pl-16\">\n {/* Mount point for children (e.g. KnowledgeReviewDiffLoader). Kept in DOM so its effects run; hidden because it has no UI. */}\n <div aria-hidden=\"true\" className=\"sr-only\" hidden>\n {children}\n </div>\n {isLoadingState ? (\n <div className=\"flex flex-col items-center justify-center gap-4 text-center h-[50dvh] text-muted-foreground\">\n <Spinner className=\"size-8\" />\n <p className=\"text-base font-medium\">Loading suggestions...</p>\n </div>\n ) : isEmptyState ? (\n <div className=\"flex flex-col items-center justify-center gap-4 text-center h-[50dvh]\">\n <HandsClapping className=\"text-muted-foreground\" size={32} weight=\"fill\" />\n <p className=\"text-base font-medium text-foreground\">All up to date. Well done, mate.</p>\n </div>\n ) : (\n <div ref={bodyRef}>{body}</div>\n )}\n </CardContent>\n </ScrollArea>\n </Card>\n );\n}\n","import React, { useEffect, useImperativeHandle, useRef } from 'react';\n\nimport { useReviewsSelection } from './context';\nimport { ReviewList, ReviewListItemProps, ReviewsSelectionProvider } from './review-list';\nimport { KnowledgeReviewPanel } from './knowledge-review-panel';\n\nimport { Card, CardContent } from '@/components/ui/card';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { Spinner } from '@/components/ui/spinner';\nimport { cn } from '@/lib/utils';\n\nimport './knowledge-review.css';\n\nconst SCROLL_HEIGHT_VAR = '--knowledge-review-scroll-height';\n\nexport type KnowledgeReviewSceneHandle = {\n selectedItem: ReviewListItemProps | null;\n setSelectedItem: (item: ReviewListItemProps | null) => void;\n};\n\nexport type KnowledgeReviewSceneProps = {\n diffTitle?: string;\n children: React.ReactNode;\n items: ReviewListItemProps[];\n isLoading?: boolean;\n /** Total number of review list items available (can exceed currently loaded `items.length`). */\n totalItemsCount?: number;\n /** Controls visibility of the Reject / Accept action buttons in the review header. */\n showActionButtons?: boolean;\n className?: string;\n onApproveAllSuggestions: () => void;\n onRejectAllSuggestions: () => void;\n onAcceptAndPublish?: () => void;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n breadcrumb?: string;\n sourceIcon: React.ReactNode;\n sourceDescription: string | null;\n suggestionReasonBody?: string;\n};\n\nconst KnowledgeReviewSceneInner = React.forwardRef<KnowledgeReviewSceneHandle, KnowledgeReviewSceneProps>(\n function KnowledgeReviewSceneInner(\n {\n diffTitle = 'Knowledge Review',\n children,\n items,\n isLoading,\n totalItemsCount,\n showActionButtons = true,\n className,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onOpenArticleLink,\n onAcceptAndPublish,\n onSourceLinkClick,\n breadcrumb,\n sourceIcon,\n sourceDescription,\n suggestionReasonBody,\n ...props\n },\n ref,\n ) {\n const innerRef = useRef<HTMLDivElement>(null);\n const { selectedItem, setSelectedItem } = useReviewsSelection();\n\n useImperativeHandle(\n ref,\n () => ({\n selectedItem,\n setSelectedItem,\n }),\n [selectedItem, setSelectedItem],\n );\n\n useEffect(() => {\n const cardEl = innerRef.current;\n if (!cardEl) return;\n\n const updateHeight = () => {\n const { height } = cardEl.getBoundingClientRect();\n cardEl.style.setProperty(SCROLL_HEIGHT_VAR, `${height}px`);\n };\n\n updateHeight();\n\n if (typeof ResizeObserver !== 'function') {\n return;\n }\n\n const observer = new ResizeObserver(updateHeight);\n observer.observe(cardEl);\n\n return () => observer.disconnect();\n }, []);\n\n const resolvedIsLoading = isLoading ?? items.length === 0;\n const isLoadingItems = resolvedIsLoading && items.length === 0;\n\n return (\n <Card className={cn('h-full', className)}>\n <CardContent className=\"p-4 lg:p-8 h-full\">\n <div\n ref={innerRef}\n className=\"grid xs:max-lg:grid-cols-1 lg:grid-cols-[1fr_4fr] gap-6 min-h-96 h-full\"\n style={{ [SCROLL_HEIGHT_VAR]: '100px' } as React.CSSProperties}\n {...props}\n >\n <ScrollArea className=\"h-[calc(var(--knowledge-review-scroll-height))] min-w-80 lg:block hidden\">\n {isLoadingItems ? (\n <div className=\"flex h-full min-h-96 items-center justify-center text-muted-foreground\">\n <Spinner className=\"size-6\" />\n </div>\n ) : (\n <ReviewList items={items} />\n )}\n </ScrollArea>\n <KnowledgeReviewPanel\n diffTitle={diffTitle}\n items={items}\n isLoading={resolvedIsLoading}\n totalItemsCount={totalItemsCount}\n showActionButtons={showActionButtons}\n sourceIcon={sourceIcon}\n sourceDescription={sourceDescription}\n >\n {children}\n </KnowledgeReviewPanel>\n </div>\n </CardContent>\n </Card>\n );\n },\n);\n\nexport const KnowledgeReviewScene = React.forwardRef<KnowledgeReviewSceneHandle, KnowledgeReviewSceneProps>(\n function KnowledgeReviewScene(props, ref) {\n const {\n items,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n suggestionReasonBody,\n } = props;\n\n return (\n <ReviewsSelectionProvider\n defaultSelectedItem={items.find((m) => m.isSelected) ?? null}\n onApproveAllSuggestions={onApproveAllSuggestions}\n onRejectAllSuggestions={onRejectAllSuggestions}\n onAcceptAndPublish={onAcceptAndPublish}\n onOpenArticleLink={onOpenArticleLink}\n onSourceLinkClick={onSourceLinkClick}\n breadcrumb={breadcrumb}\n suggestionReasonBody={suggestionReasonBody}\n >\n <KnowledgeReviewSceneInner {...props} ref={ref} />\n </ReviewsSelectionProvider>\n );\n },\n);\n"],"names":["SuggestionsHeader","React","KnowledgeReviewSceneInner","KnowledgeReviewScene"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -302,7 +302,7 @@ declare interface AnswerAttachment {
302
302
 
303
303
  declare type AnswerBlock = MarkdownTextBlock | ActionButtonsBlock | ActionInputFormBlock;
304
304
 
305
- declare type AnswerListAction = SetAnswers | ClearAll | AppendNewAnswer | SetSearchResults | AppendAnswerChunk | SetAnswerError | SetUserFeedback | ClearUserFeedback | SetFollowUpQuestions | AppendBlock | CompleteAnswer | MarkAsUncertain | InvokeAction | GetActionInputs | AddActionButtons | NoArticlesFound;
305
+ declare type AnswerListAction = SetAnswers | ClearAll | AppendNewAnswer | SetSearchResults | AppendAnswerChunk | SetAnswerError | SetUserFeedback | ClearUserFeedback | SetFollowUpQuestions | AppendBlock | CompleteAnswer | MarkAsUncertain | InvokeAction | GetActionInputs | AddActionButtons | NoArticlesFound | SetAwaitingKnowledgeGroup | SetKnowledgeGroupSelected;
306
306
 
307
307
  declare const AnswersActions: {
308
308
  readonly SET_ANSWERS: "answers/set_answers";
@@ -321,9 +321,11 @@ declare const AnswersActions: {
321
321
  readonly GET_ACTION_INPUTS: "answers/request_action_inputs";
322
322
  readonly INVOKE_ACTION: "answers/invoke_action";
323
323
  readonly ADD_ACTION_BUTTONS: "answers/add_action_buttons";
324
+ readonly SET_AWAITING_KNOWLEDGE_GROUP: "answers/set_awaiting_knowledge_group";
325
+ readonly SET_KNOWLEDGE_GROUP_SELECTED: "answers/set_knowledge_group_selected";
324
326
  };
325
327
 
326
- declare type AnswerState = 'fetching-search-results' | 'fetching-stream' | 'streaming' | 'getting-action-inputs' | 'completed';
328
+ declare type AnswerState = 'fetching-search-results' | 'fetching-stream' | 'streaming' | 'getting-action-inputs' | 'awaiting-knowledge-group' | 'completed';
327
329
 
328
330
  declare type AppendAnswerChunk = {
329
331
  type: typeof AnswersActions.APPEND_ANSWER_CHUNK;
@@ -708,6 +710,8 @@ export declare interface ChatSearchProps {
708
710
  isSearchWidget?: boolean;
709
711
  hideCitations?: boolean;
710
712
  conversationInlineSlot?: ReactNode;
713
+ liveHumanAgentChatSlot?: ReactNode;
714
+ knowledgeSourceGroups?: KnowledgeSourceGroup[];
711
715
  }
712
716
 
713
717
  export declare const ChatSearchProvider: default_2.FC<{
@@ -1545,6 +1549,12 @@ declare const itemVariants: (props?: ({
1545
1549
 
1546
1550
  declare type JSONSchema<T> = JSONSchemaType<T>;
1547
1551
 
1552
+ export declare interface KnowledgeSourceGroup {
1553
+ id: string;
1554
+ name: string;
1555
+ collectionIds: string[];
1556
+ }
1557
+
1548
1558
  export declare const Label: React_2.ForwardRefExoticComponent<Omit<LabelPrimitive.LabelProps & React_2.RefAttributes<HTMLLabelElement>, "ref"> & VariantProps<(props?: ClassProp | undefined) => string> & React_2.RefAttributes<HTMLLabelElement>>;
1549
1559
 
1550
1560
  declare function LeftSidebar(props: ComponentProps<typeof Sidebar>): default_2.JSX.Element | null;
@@ -1783,9 +1793,10 @@ export declare type ReviewsProviderProps = {
1783
1793
  onOpenArticleLink?: () => void;
1784
1794
  onSourceLinkClick?: () => void;
1785
1795
  breadcrumb?: string;
1796
+ suggestionReasonBody?: string;
1786
1797
  };
1787
1798
 
1788
- export declare function ReviewsSelectionProvider({ children, defaultSelectedItem, onApproveAllSuggestions, onRejectAllSuggestions, onAcceptAndPublish, onOpenArticleLink, onSourceLinkClick, breadcrumb, }: ReviewsProviderProps): default_2.JSX.Element;
1799
+ export declare function ReviewsSelectionProvider({ children, defaultSelectedItem, onApproveAllSuggestions, onRejectAllSuggestions, onAcceptAndPublish, onOpenArticleLink, onSourceLinkClick, breadcrumb, suggestionReasonBody, }: ReviewsProviderProps): default_2.JSX.Element;
1789
1800
 
1790
1801
  declare type ReviewsSelectionValue = {
1791
1802
  selectedItem: ReviewListItemProps | null;
@@ -1800,6 +1811,7 @@ declare type ReviewsSelectionValue = {
1800
1811
  onOpenArticleLink?: () => void;
1801
1812
  onSourceLinkClick?: () => void;
1802
1813
  breadcrumb?: string;
1814
+ suggestionReasonBody?: string;
1803
1815
  };
1804
1816
 
1805
1817
  declare function RightSidebar({ children, scrollable }: {
@@ -1861,6 +1873,13 @@ declare type SetAnswers = {
1861
1873
  };
1862
1874
  };
1863
1875
 
1876
+ declare type SetAwaitingKnowledgeGroup = {
1877
+ type: typeof AnswersActions.SET_AWAITING_KNOWLEDGE_GROUP;
1878
+ payload: {
1879
+ index?: number;
1880
+ };
1881
+ };
1882
+
1864
1883
  /**
1865
1884
  * Save fonts to localStorage cache
1866
1885
  */
@@ -1874,6 +1893,13 @@ declare type SetFollowUpQuestions = {
1874
1893
  };
1875
1894
  };
1876
1895
 
1896
+ declare type SetKnowledgeGroupSelected = {
1897
+ type: typeof AnswersActions.SET_KNOWLEDGE_GROUP_SELECTED;
1898
+ payload: {
1899
+ index?: number;
1900
+ };
1901
+ };
1902
+
1877
1903
  declare type SetSearchResults = {
1878
1904
  type: typeof AnswersActions.SET_SEARCH_RESULTS;
1879
1905
  payload: {
@@ -55,6 +55,7 @@ export declare type KnowledgeReviewSceneProps = {
55
55
  breadcrumb?: string;
56
56
  sourceIcon: default_2.ReactNode;
57
57
  sourceDescription: string | null;
58
+ suggestionReasonBody?: string;
58
59
  };
59
60
 
60
61
  export declare type LoadedDiffDoc = {
@@ -94,9 +95,10 @@ declare type ReviewsProviderProps = {
94
95
  onOpenArticleLink?: () => void;
95
96
  onSourceLinkClick?: () => void;
96
97
  breadcrumb?: string;
98
+ suggestionReasonBody?: string;
97
99
  };
98
100
 
99
- export declare function ReviewsSelectionProvider({ children, defaultSelectedItem, onApproveAllSuggestions, onRejectAllSuggestions, onAcceptAndPublish, onOpenArticleLink, onSourceLinkClick, breadcrumb, }: ReviewsProviderProps): default_2.JSX.Element;
101
+ export declare function ReviewsSelectionProvider({ children, defaultSelectedItem, onApproveAllSuggestions, onRejectAllSuggestions, onAcceptAndPublish, onOpenArticleLink, onSourceLinkClick, breadcrumb, suggestionReasonBody, }: ReviewsProviderProps): default_2.JSX.Element;
100
102
 
101
103
  declare type ReviewsSelectionValue = {
102
104
  selectedItem: ReviewListItemProps | null;
@@ -111,6 +113,7 @@ declare type ReviewsSelectionValue = {
111
113
  onOpenArticleLink?: () => void;
112
114
  onSourceLinkClick?: () => void;
113
115
  breadcrumb?: string;
116
+ suggestionReasonBody?: string;
114
117
  };
115
118
 
116
119
  export declare function useReviewsSelection(): ReviewsSelectionValue;