Unverified 提交 46cb7ca5 authored 作者: Will Chen's avatar Will Chen 提交者: GitHub

redo reverts code (when possible) (#75)

上级 5fc49231
......@@ -53,6 +53,7 @@ import {
TooltipTrigger,
} from "../ui/tooltip";
import { useNavigate } from "@tanstack/react-router";
import { useVersions } from "@/hooks/useVersions";
const showTokenBarAtom = atom(false);
......@@ -61,6 +62,8 @@ export function ChatInput({ chatId }: { chatId?: number }) {
const [inputValue, setInputValue] = useAtom(chatInputValueAtom);
const textareaRef = useRef<HTMLTextAreaElement>(null);
const { settings, updateSettings, isAnyProviderSetup } = useSettings();
const appId = useAtomValue(selectedAppIdAtom);
const { refreshVersions } = useVersions(appId);
const { streamMessage, isStreaming, setIsStreaming, error, setError } =
useStreamChat();
const [showError, setShowError] = useState(true);
......@@ -162,6 +165,7 @@ export function ChatInput({ chatId }: { chatId?: number }) {
} finally {
setIsApproving(false);
setIsPreviewOpen(true);
refreshVersions();
// Keep same as handleReject
refreshProposal();
......
......@@ -9,6 +9,9 @@ import { selectedChatIdAtom } from "@/atoms/chatAtoms";
import { useAtom, useAtomValue } from "jotai";
import { RefreshCw } from "lucide-react";
import { Button } from "@/components/ui/button";
import { useVersions } from "@/hooks/useVersions";
import { selectedAppIdAtom } from "@/atoms/appAtoms";
import { showError } from "@/lib/toast";
interface MessagesListProps {
messages: Message[];
......@@ -17,6 +20,8 @@ interface MessagesListProps {
export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
function MessagesList({ messages, messagesEndRef }, ref) {
const appId = useAtomValue(selectedAppIdAtom);
const { versions, revertVersion } = useVersions(appId);
const { streamMessage, isStreaming, error, setError } = useStreamChat();
const { isAnyProviderSetup } = useSettings();
const selectedChatId = useAtomValue(selectedChatIdAtom);
......@@ -39,11 +44,42 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
<Button
variant="ghost"
size="sm"
onClick={() => {
onClick={async () => {
if (!selectedChatId) {
console.error("No chat selected");
return;
}
// The last message is usually an assistant, but it might not be.
const lastVersion = versions[0];
const lastMessage = messages[messages.length - 1];
let reverted = false;
if (
lastVersion.oid === lastMessage.commitHash &&
lastMessage.role === "assistant"
) {
if (versions.length < 2) {
showError("Cannot retry message; no previous version");
return;
}
const previousAssistantMessage =
messages[messages.length - 3];
if (
previousAssistantMessage?.role === "assistant" &&
previousAssistantMessage?.commitHash
) {
console.debug("Reverting to previous assistant version");
await revertVersion({
versionId: previousAssistantMessage.commitHash,
});
reverted = true;
} else {
console.debug("Reverting to previous version");
await revertVersion({
versionId: versions[1].oid,
});
}
}
// Find the last user message
const lastUserMessage = [...messages]
.reverse()
......@@ -52,10 +88,15 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
console.error("No user message found");
return;
}
// If we reverted, we don't need to mark "redo" because
// the old message has already been deleted.
const redo = !reverted;
console.debug("Streaming message with redo", redo);
streamMessage({
prompt: lastUserMessage.content,
chatId: selectedChatId,
redo: true,
redo,
});
}}
>
......
......@@ -494,6 +494,7 @@ export function registerAppHandlers() {
_,
{ appId, previousVersionId }: { appId: number; previousVersionId: string }
) => {
logger.log(`Reverting to version ${previousVersionId} for app ${appId}`);
return withLock(appId, async () => {
const app = await db.query.apps.findFirst({
where: eq(apps.id, appId),
......
......@@ -41,6 +41,7 @@ export interface Message {
role: "user" | "assistant";
content: string;
approvalState?: "approved" | "rejected" | null;
commitHash?: string | null;
}
export interface Chat {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论