feat(coding): add conversation archive and first-message titles

This commit is contained in:
2026-09-20 12:43:51 +08:00
parent d61226532a
commit fd0293fe3d
22 changed files with 698 additions and 69 deletions

View File

@@ -9,15 +9,7 @@ import {
Square,
} from 'lucide-react';
import { Button } from '@/components/ui/button';
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { CodingConversationRenameDialog } from './CodingConversationRenameDialog';
import { cn } from '@/lib/utils';
import { useSettingsStore } from '@/stores/settings';
import { TITLEBAR_LOGO_WIDTH, WINDOWS_TITLEBAR_CONTROLS_WIDTH } from '@/components/layout/titlebar-metrics';
@@ -75,7 +67,6 @@ export function CodingConversationHeader({
const [busyAction, setBusyAction] = useState<string | null>(null);
const [actionError, setActionError] = useState<LocalActionError | null>(null);
const [renameOpen, setRenameOpen] = useState(false);
const [titleDraft, setTitleDraft] = useState(conversation?.title ?? '');
const runStatus = snapshot?.run.status ?? 'preparing';
const running = ['queued', 'running', 'retrying', 'compacting', 'aborting'].includes(runStatus);
@@ -122,7 +113,6 @@ export function CodingConversationHeader({
className="no-drag group flex max-w-full items-center gap-1.5 rounded-md text-left"
disabled={!conversation}
onClick={() => {
setTitleDraft(conversation?.title ?? '');
setRenameOpen(true);
}}
>
@@ -204,27 +194,8 @@ export function CodingConversationHeader({
</p>
)}
<Dialog open={renameOpen} onOpenChange={setRenameOpen}>
<DialogContent>
<DialogHeader>
<DialogTitle></DialogTitle>
<DialogDescription></DialogDescription>
</DialogHeader>
<Input value={titleDraft} maxLength={160} aria-label="对话标题" onChange={(event) => setTitleDraft(event.target.value)} />
<DialogFooter>
<Button type="button" variant="outline" className="min-h-10 rounded-xl" onClick={() => setRenameOpen(false)}></Button>
<Button
type="button"
className="min-h-10 rounded-xl"
disabled={!titleDraft.trim() || Boolean(busyAction)}
onClick={() => perform('rename', async () => {
await onRename(titleDraft.trim());
setRenameOpen(false);
})}
></Button>
</DialogFooter>
</DialogContent>
</Dialog>
{renameOpen && conversation && <CodingConversationRenameDialog
title={conversation.title} onSave={onRename} onClose={() => setRenameOpen(false)} />}
</>
);
}