1010 * 状态机);重生成沿用本次策略档位(overrideFromInfo——首版与
1111 * 重生成同档位,不回退全局默认)。
1212 */
13- import { useCallback , useRef , useState } from "react" ;
13+ import { useCallback , useState } from "react" ;
1414import { invoke } from "@tauri-apps/api/core" ;
1515import { useAiTaskPolling } from "../hooks/useAiTaskPolling" ;
1616import type { AiRefineResult , AiTaskState } from "../types" ;
@@ -49,7 +49,6 @@ export default function NoteAiDialog({
4949 const [ result , setResult ] = useState < AiRefineResult | null > ( null ) ;
5050 const [ showWorkbench , setShowWorkbench ] = useState ( false ) ;
5151 const [ msg , setMsg ] = useState ( "" ) ;
52- const taskIdRef = useRef < number | null > ( null ) ;
5352
5453 const handleState = useCallback ( async ( st : AiTaskState , tid : number | null ) => {
5554 if ( st === "Succeeded" ) {
@@ -58,6 +57,10 @@ export default function NoteAiDialog({
5857 setResult ( r ) ;
5958 setRunning ( false ) ;
6059 setShowWorkbench ( true ) ;
60+ } else {
61+ // v0.17.1 防御:结果取回失败不得静默卡住(提示可重试)
62+ setMsg ( "任务已完成但结果取回失败——可关闭后到 AI 对话页「AI 任务」查看或重试" ) ;
63+ setRunning ( false ) ;
6164 }
6265 } else if ( typeof st === "object" && st !== null && "Failed" in st ) {
6366 setMsg ( `精修失败:${ JSON . stringify ( st . Failed . reason ?? { } ) } ` ) ;
@@ -67,8 +70,11 @@ export default function NoteAiDialog({
6770 }
6871 } , [ ] ) ;
6972
70- const { startPolling, stopPolling } = useAiTaskPolling ( handleState , ( ) => {
71- setMsg ( "任务 30 秒无进展(可能未启动或后台卡住)——请查看日志后重试" ) ;
73+ // v0.17.1 修复:hook 的 taskIdRef 由调用方设置(事件通道过滤 + 派发参数
74+ // 数据源)——此前误用本地自建 ref → 轮询以 taskId=null 派发 → 结果取回
75+ // 失败被吞 → running 永不翻转(用户报障"长时间卡在处理页面")
76+ const { taskIdRef, startPolling, stopPolling } = useAiTaskPolling ( handleState , ( ) => {
77+ setMsg ( "任务 30 秒无进展(可能未启动或后台卡住)——请查看 tauri 终端 [refine-task] 日志后重试" ) ;
7278 setRunning ( false ) ;
7379 } ) ;
7480
0 commit comments