fix(canvas): 文本生成 - 修复分镜超时并贯通 Agent 与创作页流式返回

This commit is contained in:
ddCat
2026-08-27 22:39:30 +08:00
parent 21b69d8bc7
commit 474f21d56b
18 changed files with 944 additions and 44 deletions

View File

@@ -0,0 +1,27 @@
import { describe, expect, test } from "bun:test";
import { consumeTaskTextStream, createTaskTextStreamParser, type TaskTextStreamEvent } from "../src/services/api/task-text-stream";
describe("task text SSE parser", () => {
test("reassembles split frames and keeps event ids for reconnect cursors", () => {
const parser = createTaskTextStreamParser();
const events: TaskTextStreamEvent[] = [];
const stream = `: connected\n\nevent: progress\ndata: {"status":"running","stage":"生成中","progress":30}\n\nid: 8\nevent: delta\ndata: {"sequence":8,"content":"第一段"}\n\nid: 9\nevent: delta\ndata: {"sequence":9,"content":"第二段"}\n\nevent: terminal\ndata: {"status":"succeeded","complete":true,"finalText":"第一段第二段"}\n\n`;
consumeTaskTextStream(parser, stream.slice(0, 73), (event) => events.push(event));
consumeTaskTextStream(parser, stream.slice(73), (event) => events.push(event), true);
expect(events.map((event) => [event.event, event.id])).toEqual([
["progress", undefined],
["delta", 8],
["delta", 9],
["terminal", undefined],
]);
expect(events[2]?.data).toEqual({ sequence: 9, content: "第二段" });
});
test("rejects malformed JSON instead of silently dropping task output", () => {
const parser = createTaskTextStreamParser();
expect(() => consumeTaskTextStream(parser, "event: delta\ndata: {broken}\n\n", () => undefined)).toThrow("任务文本流返回了无效数据");
});
});