Merge remote-tracking branch 'upstream/dev' into refactor/indexing-pipelines

This commit is contained in:
Anish Sarkar 2026-03-27 22:36:34 +05:30
commit 17091edb77
104 changed files with 4944 additions and 1319 deletions

View file

@ -28,16 +28,14 @@ export const InlineCitation: FC<InlineCitationProps> = ({ chunkId, isDocsChunk =
url=""
isDocsChunk={isDocsChunk}
>
<span
<button
type="button"
onClick={() => setIsOpen(true)}
onKeyDown={(e) => e.key === "Enter" && setIsOpen(true)}
className="text-[10px] font-bold bg-primary/80 hover:bg-primary text-primary-foreground rounded-full min-w-4 h-4 px-1 inline-flex items-center justify-center align-super cursor-pointer transition-colors ml-0.5"
title={`View source chunk #${chunkId}`}
role="button"
tabIndex={0}
>
{chunkId}
</span>
</button>
</SourceDetailPanel>
);
};

View file

@ -47,6 +47,7 @@ interface InlineMentionEditorProps {
disabled?: boolean;
className?: string;
initialDocuments?: MentionedDocument[];
initialText?: string;
}
// Unique data attribute to identify chip elements
@ -96,6 +97,7 @@ export const InlineMentionEditor = forwardRef<InlineMentionEditorRef, InlineMent
disabled = false,
className,
initialDocuments = [],
initialText,
},
ref
) => {
@ -115,6 +117,29 @@ export const InlineMentionEditor = forwardRef<InlineMentionEditorRef, InlineMent
}
}, [initialDocuments]);
useEffect(() => {
if (!initialText || !editorRef.current) return;
// Insert the text and add trailing line breaks for typing space
editorRef.current.innerText = initialText;
editorRef.current.appendChild(document.createElement("br"));
editorRef.current.appendChild(document.createElement("br"));
setIsEmpty(false);
onChange?.(initialText, Array.from(mentionedDocs.values()));
// Place cursor at the end of the content
editorRef.current.focus();
const sel = window.getSelection();
const range = document.createRange();
range.selectNodeContents(editorRef.current);
range.collapse(false);
sel?.removeAllRanges();
sel?.addRange(range);
// Scroll to cursor via a temporary anchor element
const anchor = document.createElement("span");
range.insertNode(anchor);
anchor.scrollIntoView({ block: "end" });
anchor.remove();
}, [initialText]); // eslint-disable-line react-hooks/exhaustive-deps
// Focus at the end of the editor
const focusAtEnd = useCallback(() => {
if (!editorRef.current) return;

View file

@ -225,17 +225,13 @@ function ThreadListItemComponent({
onDelete,
}: ThreadListItemComponentProps) {
return (
<div
<button
type="button"
className={cn(
"group flex items-center gap-2 rounded-lg px-3 py-2 transition-colors cursor-pointer",
"group flex w-full items-center gap-2 rounded-lg px-3 py-2 transition-colors cursor-pointer text-left",
isActive ? "bg-accent text-accent-foreground" : "hover:bg-muted/50"
)}
onClick={onClick}
onKeyDown={(e) => {
if (e.key === "Enter" || e.key === " ") onClick();
}}
role="button"
tabIndex={0}
>
<MessageSquareIcon className="size-4 shrink-0 text-muted-foreground" />
<div className="flex-1 min-w-0">
@ -274,7 +270,7 @@ function ThreadListItemComponent({
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
</button>
);
}

View file

@ -306,6 +306,13 @@ const Composer: FC = () => {
const aui = useAui();
const hasAutoFocusedRef = useRef(false);
const [quickAskText, setQuickAskText] = useState<string | undefined>();
useEffect(() => {
window.electronAPI?.getQuickAskText().then((text) => {
if (text) setQuickAskText(text);
});
}, []);
const isThreadEmpty = useAuiState(({ thread }) => thread.isEmpty);
const isThreadRunning = useAuiState(({ thread }) => thread.isRunning);
@ -512,6 +519,7 @@ const Composer: FC = () => {
onDocumentRemove={handleDocumentRemove}
onSubmit={handleSubmit}
onKeyDown={handleKeyDown}
initialText={quickAskText}
className="min-h-[24px]"
/>
</div>

View file

@ -30,7 +30,7 @@ const UserAvatar: FC<AuthorMetadata> = ({ displayName, avatarUrl }) => {
alt={displayName || "User"}
width={32}
height={32}
className="size-8 rounded-full object-cover select-none"
className="size-8 rounded-full object-cover"
referrerPolicy="no-referrer"
onError={() => setHasError(true)}
unoptimized