diff --git a/surfsense_web/components/assistant-ui/assistant-message.tsx b/surfsense_web/components/assistant-ui/assistant-message.tsx
index 4fd2446c3..5cdd287de 100644
--- a/surfsense_web/components/assistant-ui/assistant-message.tsx
+++ b/surfsense_web/components/assistant-ui/assistant-message.tsx
@@ -4,20 +4,19 @@ import {
ErrorPrimitive,
MessagePrimitive,
useAssistantState,
+ useMessage,
} from "@assistant-ui/react";
-import { useAtom, useAtomValue, useSetAtom } from "jotai";
+import { useAtom, useAtomValue } from "jotai";
import { CheckIcon, CopyIcon, DownloadIcon, MessageSquare, RefreshCwIcon } from "lucide-react";
import type { FC } from "react";
import { useContext, useEffect, useMemo, useRef, useState } from "react";
import {
addingCommentToMessageIdAtom,
- clearTargetCommentIdAtom,
commentsCollapsedAtom,
commentsEnabledAtom,
targetCommentIdAtom,
} from "@/atoms/chat/current-thread.atom";
import { activeSearchSpaceIdAtom } from "@/atoms/search-spaces/search-space-query.atoms";
-import { BranchPicker } from "@/components/assistant-ui/branch-picker";
import { MarkdownText } from "@/components/assistant-ui/markdown-text";
import {
ThinkingStepsContext,
@@ -84,7 +83,6 @@ const AssistantMessageInner: FC = () => {
>
@@ -126,7 +124,6 @@ export const AssistantMessage: FC = () => {
// Target comment navigation - read target from global atom
const targetCommentId = useAtomValue(targetCommentIdAtom);
- const clearTargetCommentId = useSetAtom(clearTargetCommentIdAtom);
// Check if target comment belongs to this message (including replies)
const hasTargetComment = useMemo(() => {
@@ -263,6 +260,8 @@ export const AssistantMessage: FC = () => {
};
const AssistantActionBar: FC = () => {
+ const { isLast } = useMessage();
+
return (
{
-
-
-
-
-
+ {/* Only allow regenerating the last assistant message */}
+ {isLast && (
+
+
+
+
+
+ )}
);
};
diff --git a/surfsense_web/components/assistant-ui/branch-picker.tsx b/surfsense_web/components/assistant-ui/branch-picker.tsx
deleted file mode 100644
index ee4addd2a..000000000
--- a/surfsense_web/components/assistant-ui/branch-picker.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { BranchPickerPrimitive } from "@assistant-ui/react";
-import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react";
-import type { FC } from "react";
-import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
-import { cn } from "@/lib/utils";
-
-export const BranchPicker: FC = ({ className, ...rest }) => {
- return (
-
-
-
-
-
-
-
- /
-
-
-
-
-
-
-
- );
-};
diff --git a/surfsense_web/components/assistant-ui/user-message.tsx b/surfsense_web/components/assistant-ui/user-message.tsx
index 896b8c748..1ae8aef3c 100644
--- a/surfsense_web/components/assistant-ui/user-message.tsx
+++ b/surfsense_web/components/assistant-ui/user-message.tsx
@@ -4,7 +4,6 @@ import { FileText, PencilIcon } from "lucide-react";
import { type FC, useState } from "react";
import { messageDocumentsMapAtom } from "@/atoms/chat/mentioned-documents.atom";
import { UserMessageAttachments } from "@/components/assistant-ui/attachment";
-import { BranchPicker } from "@/components/assistant-ui/branch-picker";
import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
interface AuthorMetadata {
@@ -95,24 +94,47 @@ export const UserMessage: FC = () => {
)}
-
-
);
};
const UserActionBar: FC = () => {
+ const isThreadRunning = useAssistantState(({ thread }) => thread.isRunning);
+
+ // Get current message ID
+ const currentMessageId = useAssistantState(({ message }) => message?.id);
+
+ // Find the last user message ID in the thread (computed once, memoized by selector)
+ const lastUserMessageId = useAssistantState(({ thread }) => {
+ const messages = thread.messages;
+ for (let i = messages.length - 1; i >= 0; i--) {
+ if (messages[i].role === "user") {
+ return messages[i].id;
+ }
+ }
+ return null;
+ });
+
+ // Simple comparison - no iteration needed per message
+ const isLastUserMessage = currentMessageId === lastUserMessageId;
+
+ // Show edit button only on the last user message and when thread is not running
+ const canEdit = isLastUserMessage && !isThreadRunning;
+
return (
-
-
-
-
-
+ {/* Only allow editing the last user message */}
+ {canEdit && (
+
+
+
+
+
+ )}
);
};