refactor(frontend): 四生成 hook 结束后额外返回产物(AC-3 留痕前置)

useRefine.refine/recommunicate→RefineVersion|null、useContinue.generate→string|null、
useChapterRewrite.send→RewriteVersion|null、useGenerator.generate→GeneratorArtifact|null。
向后兼容(既有调用忽略返回值不受影响);各 hook 成功用例补返回值断言。
面板据此 if(artifact) 才 append,空候选/错误路径不留痕。
This commit is contained in:
Yaojia Wang
2026-07-09 17:15:49 +02:00
parent ddf7fa061a
commit 59f2f60a7e
8 changed files with 66 additions and 25 deletions

View File

@@ -55,8 +55,9 @@ describe("useGenerator", () => {
});
const { result } = renderHook(() => useGenerator());
let returned: { outputKind: string; rawPreview: unknown } | null = null;
await act(async () => {
await result.current.generate("p1", "idea", { brief: "脑洞" });
returned = await result.current.generate("p1", "idea", { brief: "脑洞" });
});
expect(result.current.genStatus).toBe("preview");
@@ -65,6 +66,9 @@ describe("useGenerator", () => {
expect(result.current.preview?.kind).toBe("IdeaListResult");
expect(result.current.preview?.items[0]?.heading).toBe("废柴逆袭");
expect(toast).not.toHaveBeenCalled();
// 追加断言generate 返回本次产物(供 GeneratorRunner 结束后留痕)。
expect(returned?.outputKind).toBe("IdeaListResult");
expect(returned?.rawPreview).toEqual(preview);
});
it("生成后端返回 errorgenStatus=error 且弹错误 toast", async () => {

View File

@@ -16,6 +16,13 @@ import type { ToolGenerateRequest } from "@/lib/api/types";
export type GenStatus = "idle" | "generating" | "preview" | "error";
export type IngestStatus = "idle" | "ingesting" | "conflict" | "done" | "error";
// 一次生成的产物(供调用方在结束后留痕;与 hook state 同源)。
export interface GeneratorArtifact {
preview: PreviewModel;
rawPreview: Record<string, unknown> | undefined;
outputKind: string;
}
export interface UseGenerator {
genStatus: GenStatus;
preview: PreviewModel | null;
@@ -30,7 +37,7 @@ export interface UseGenerator {
projectId: string,
toolKey: string,
body: ToolGenerateRequest,
) => Promise<void>;
) => Promise<GeneratorArtifact | null>;
// 入库选中行acknowledge 用于过 409已查看冲突后重发
ingest: (
projectId: string,
@@ -74,15 +81,22 @@ export function useGenerator(): UseGenerator {
if (error || !data) {
setGenStatus("error");
toast(generationErrorMessage(error), "error");
return;
return null;
}
setPreview(mapPreview(data.output_kind, data.preview));
const mapped = mapPreview(data.output_kind, data.preview);
setPreview(mapped);
setRawPreview(data.preview);
setOutputKind(data.output_kind);
setGenStatus("preview");
return {
preview: mapped,
rawPreview: data.preview,
outputKind: data.output_kind,
};
} catch {
setGenStatus("error");
toast("生成请求异常,请检查网络。", "error");
return null;
}
},
[toast],