✨ feat(vscode): 问 AI 收起再展开、重启后接着这块最近的会话问;代码改了对不上的问答不再显示

This commit is contained in:
cruldra committed 2026-09-26 21:25:22 +08:00
1 parent cbe447ade8
commit f0a3ad80e1
16 files changed
+82 -211

No files matched your search

+2 -28
View File
@@ -1,10 +1,10 @@
import type { KeyboardEvent, ReactElement } from 'react'
import type { Ask } from './qa'
import type { QaEntryView, QaThreadView } from './types'
import type { QaEntryView } from './types'
import { ChevronDown, ChevronRight, CircleStop, LoaderCircle, SendHorizontal, Sparkles, Trash2, TriangleAlert } from 'lucide-react'
import { useState } from 'react'
import { renderMarkdown, renderMarkdownOnce } from './markdown'
import { answerPreview, relativeTime, whereLabel } from './qa'
import { answerPreview, relativeTime } from './qa'
/** 问过的一次,灰字:问题、时间、「已理解,删除」,下面回答的前两行;点问题或预览展开整段回答(照样灰字,按 Markdown 排) */
function HistoryItem({ entry, now, onDelete }: { entry: QaEntryView, now: number, onDelete: () => void }): ReactElement {
@@ -170,29 +170,3 @@ export function AskThread({ history, asks, open, now = Date.now(), onAsk, onStop
</section>
)
}
/** 预览顶上的灰字一栏:代码改动后找不到原来位置的问答,写着原来在哪,照样能看、能删 */
export function OrphanThreads({ threads, kindName, now = Date.now(), onDelete }: {
threads: QaThreadView[]
kindName: (kind: string) => string
now?: number
onDelete: (anchor: string, entryId: string) => void
}): ReactElement {
const [expanded, setExpanded] = useState(true)
const Chevron = expanded ? ChevronDown : ChevronRight
const count = threads.reduce((sum, thread) => sum + thread.entries.length, 0)
return (
<section className="cr-qa-orphans" aria-label="代码改动后找不到原来位置的问答">
<button type="button" className="cr-qa-summary" aria-expanded={expanded} onClick={() => setExpanded(value => !value)}>
<Chevron size={12} strokeWidth={1.8} aria-hidden />
{`代码改动后找不到原来位置的问答 · ${count} 条`}
</button>
{expanded && threads.map(thread => (
<div key={thread.anchor} className="cr-qa">
<div className="cr-qa-where">{`原来在:${whereLabel(thread.where, kindName)}`}</div>
{thread.entries.map(entry => <HistoryItem key={entry.id} entry={entry} now={now} onDelete={() => onDelete(thread.anchor, entry.id)} />)}
</div>
))}
</section>
)
}