diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx index d25b5fe9e..93b296000 100644 --- a/surfsense_web/components/assistant-ui/thread.tsx +++ b/surfsense_web/components/assistant-ui/thread.tsx @@ -73,6 +73,7 @@ import { useCommentsElectric } from "@/hooks/use-comments-electric"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Switch } from "@/components/ui/switch"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { useMediaQuery } from "@/hooks/use-media-query"; import { agentToolsAtom, disabledToolsAtom, @@ -562,7 +563,16 @@ const ComposerAction: FC = ({ isBlockedByOtherUser = false const mentionedDocuments = useAtomValue(mentionedDocumentsAtom); const sidebarDocs = useAtomValue(sidebarSelectedDocumentsAtom); const setDocumentsSidebarOpen = useSetAtom(documentsSidebarOpenAtom); + const setConnectorDialogOpen = useSetAtom(connectorDialogOpenAtom); const [toolsPopoverOpen, setToolsPopoverOpen] = useState(false); + const isDesktop = useMediaQuery("(min-width: 640px)"); + const [toolsScrollPos, setToolsScrollPos] = useState<"top" | "middle" | "bottom">("top"); + const handleToolsScroll = useCallback((e: React.UIEvent) => { + const el = e.currentTarget; + const atTop = el.scrollTop <= 2; + const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 2; + setToolsScrollPos(atTop ? "top" : atBottom ? "bottom" : "middle"); + }, []); const isComposerTextEmpty = useAssistantState(({ composer }) => { const text = composer.text?.trim() || ""; return text.length === 0; @@ -613,32 +623,46 @@ const ComposerAction: FC = ({ isBlockedByOtherUser = false - -
- Agent Tools - + e.preventDefault()} + > +
+ Agent Tools + {enabledCount}/{agentTools?.length ?? 0} enabled
-
+
{agentTools?.map((tool) => { const isDisabled = disabledTools.includes(tool.name); + const row = ( + + ); + if (!isDesktop) { + return
{row}
; + } return ( - + {row} {tool.description} @@ -654,6 +678,19 @@ const ComposerAction: FC = ({ isBlockedByOtherUser = false
+ {!isDesktop && ( + setConnectorDialogOpen(true)} + > + + + )} {sidebarDocs.length > 0 && (