fix(create): 文本生成任务 - 恢复终态正文并停止错误的生成中状态

This commit is contained in:
dlh
2026-08-19 23:25:03 +08:00
parent 35dee568c9
commit d7a7397d28
4 changed files with 109 additions and 10 deletions

View File

@@ -8,7 +8,8 @@ import { switchUserStorageScope } from "../src/lib/user-session";
import { canvasCinematicContinuationEntryAdapters } from "../src/components/canvas/canvas-assistant-panel";
import { activeGenerationConsumerController, beginGenerationConsumer, runGenerationConsumer } from "../src/services/generation-consumer-lifecycle";
import { createCanvasGenerationLiveProjectAdapter, persistCanvasCinematicSessionContinuationEffect, persistCanvasGenerationEffect, registerCanvasGenerationLiveProject } from "../src/services/canvas-generation-consumer";
import { CREATION_CONVERSATIONS_KEY, loadCreationConversations, pendingCreationTaskIds, saveCreationConversations } from "../src/services/creation-conversation-store";
import { CREATION_CONVERSATIONS_KEY, loadCreationConversations, pendingCreationTaskIds, pendingCreationTaskKey, saveCreationConversations } from "../src/services/creation-conversation-store";
import { recoverCreationTextTask } from "../src/services/creation-text-task-recovery";
import { ASSET_STORE_KEY, flushAssetStorePersistence, useAssetStore, type Asset, type NewAsset } from "../src/stores/use-asset-store";
import { withGenerationAssetStorageLock } from "../src/services/generation-asset-repository";
import { CANVAS_STORE_KEY, flushCanvasStorePersistence, useCanvasStore, withCanvasStorePersistenceLock, withCanvasStorePersistenceSuppressed, type CanvasProject } from "../src/stores/canvas/use-canvas-store";
@@ -16,6 +17,46 @@ import { CanvasNodeType, type CanvasAssistantSession, type CanvasConnection, typ
import { deleteAssetWithRemoteSync, resetRemoteUserDataSync, syncRemoteUserData, withRemoteUserDataSyncPaused } from "../src/services/user-data-sync";
import { apiClient } from "../src/services/api/request";
test("creation recovery observes streaming text tasks after reload", () => {
const conversations = [{
id: "conversation-text-recovery",
messages: [
{ id: "text-streaming", role: "assistant" as const, mode: "text", status: "streaming", taskIds: ["task-text"] },
{ id: "text-done", role: "assistant" as const, mode: "text", status: "done", taskIds: ["task-text-done"] },
{ id: "image-pending", role: "assistant" as const, mode: "image", status: "pending", taskIds: ["task-image"] },
],
}];
expect(pendingCreationTaskIds(conversations)).toEqual(["task-text", "task-image"]);
expect(pendingCreationTaskKey(conversations)).toContain("conversation-text-recovery:text-streaming:task-text");
});
test("creation recovery restores completed text and terminal status", () => {
const message = { mode: "text", status: "streaming", content: "", taskIds: ["task-text"] };
const baseTask = {
id: "task-text",
type: "canvas_text",
prompt: "写一篇小说",
attempts: 1,
createdAt: "2026-08-19T22:47:51.000Z",
updatedAt: "2026-08-19T22:48:39.000Z",
};
expect(recoverCreationTextTask(message, [{ ...baseTask, status: "running" }])).toBeNull();
expect(recoverCreationTextTask(message, [{ ...baseTask, status: "succeeded", resultJson: JSON.stringify({ mode: "text", text: "恢复后的正文" }) }])).toEqual({
status: "done",
content: "恢复后的正文",
error: undefined,
taskIds: ["task-text"],
});
expect(recoverCreationTextTask(message, [{ ...baseTask, status: "failed", error: "渠道请求失败" }])).toEqual({
status: "error",
content: "生成失败",
error: "渠道请求失败",
taskIds: ["task-text"],
});
});
function generatedAsset(title: string): NewAsset {
return {
kind: "image",