✨ feat(vscode): 重写注释时在卡片下展示模型过程

This commit is contained in:
cruldra committed 2026-10-03 03:22:20 +08:00
1 parent 08fb04e3fd
commit 5e8e7b65ee
15 files changed
+369 -83

No files matched your search

@@ -0,0 +1,59 @@
import type { RewriteRuns } from './rewriteRun'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { rewriteEnd, rewriteProgress, startRewrite } from './rewriteRun'
import { ANSWER_FRAME_MS } from './useQa'
import { onMessage, postMessage } from './vscode'
/** 按注释规范重写:过程只在这一页上,按块的记号记。不写入问答,刷新或关掉预览就没了。 */
export function useRewrite(): { runs: RewriteRuns, onRewrite: (anchor: string) => void, onStop: (anchor: string) => void } {
const [runs, setRuns] = useState<RewriteRuns>(() => new Map())
/** 动作里读眼下的过程(这块是不是已经在重写) */
const current = useRef(runs)
current.current = runs
useEffect(() => {
/** 攒着没画的进展:anchor → 最新的一份 */
const pending = new Map<string, { question: string, text: string, activity?: string }>()
let timer: ReturnType<typeof setTimeout> | undefined
const flush = (): void => {
timer = undefined
setRuns((prev) => {
let next = prev
for (const [anchor, progress] of pending)
next = rewriteProgress(next, anchor, progress.question, progress.text, progress.activity)
return next
})
pending.clear()
}
const off = onMessage((msg) => {
if (msg.type === 'rewriteProgress') {
pending.set(msg.anchor, { question: msg.question, text: msg.text, ...(msg.activity !== undefined && { activity: msg.activity }) })
timer ??= setTimeout(flush, ANSWER_FRAME_MS)
return
}
if (msg.type === 'rewriteEnd') {
pending.delete(msg.anchor)
if (pending.size === 0) {
clearTimeout(timer)
timer = undefined
}
setRuns(prev => rewriteEnd(prev, msg.anchor, msg.status, msg.error))
}
})
return () => {
clearTimeout(timer)
off()
}
}, [])
const onRewrite = useCallback((anchor: string) => {
if (current.current.get(anchor)?.status === 'running')
return
setRuns(prev => startRewrite(prev, anchor))
postMessage({ type: 'rewriteComment', anchor })
}, [])
const onStop = useCallback((anchor: string) => {
postMessage({ type: 'stopRewrite', anchor })
}, [])
return useMemo(() => ({ runs, onRewrite, onStop }), [runs, onRewrite, onStop])
}