























1+import { beforeEach, describe, expect, it, vi } from "vitest";
2+import type { TaskRecord } from "../tasks/task-registry.types.js";
3+import {
4+buildActiveMediaGenerationTaskPromptContextForSession,
5+findActiveMediaGenerationTaskForSession,
6+findDuplicateGuardMediaGenerationTaskForSession,
7+listActiveMediaGenerationTasksForSession,
8+MEDIA_GENERATION_DELIVERING_COMPLETION_PROGRESS,
9+resetRecentMediaGenerationDuplicateGuardsForTests,
10+} from "./media-generation-task-status-shared.js";
11+12+const taskRuntimeInternalMocks = vi.hoisted(() => ({
13+listFreshTasksForOwnerKey: vi.fn(),
14+}));
15+16+vi.mock("../tasks/runtime-internal.js", () => taskRuntimeInternalMocks);
17+18+function makeTask(overrides: Partial<TaskRecord> = {}): TaskRecord {
19+const now = Date.now();
20+return {
21+taskId: "task-1",
22+runtime: "cli",
23+taskKind: "video-generate",
24+sourceId: "video-generate:byteplus",
25+requesterSessionKey: "session/A",
26+ownerKey: "session/A",
27+scopeKind: "session",
28+runId: "run-1",
29+task: "generate clip 01",
30+status: "running",
31+deliveryStatus: "not_applicable",
32+notifyPolicy: "silent",
33+createdAt: now,
34+startedAt: now,
35+lastEventAt: now,
36+ ...overrides,
37+};
38+}
39+40+beforeEach(() => {
41+resetRecentMediaGenerationDuplicateGuardsForTests();
42+taskRuntimeInternalMocks.listFreshTasksForOwnerKey.mockReset();
43+});
44+45+describe("media generation delivery-phase prompt guard", () => {
46+it("does not warn about a task waiting only for completion delivery", () => {
47+taskRuntimeInternalMocks.listFreshTasksForOwnerKey.mockReturnValue([
48+makeTask({ progressSummary: MEDIA_GENERATION_DELIVERING_COMPLETION_PROGRESS }),
49+]);
50+51+expect(
52+buildActiveMediaGenerationTaskPromptContextForSession({
53+sessionKey: "session/A",
54+taskKind: "video-generate",
55+sourcePrefix: "video-generate",
56+nounLabel: "video",
57+toolName: "video_generate",
58+completionLabel: "video",
59+}),
60+).toBeUndefined();
61+});
62+63+it("still warns while media generation is running", () => {
64+taskRuntimeInternalMocks.listFreshTasksForOwnerKey.mockReturnValue([
65+makeTask({ progressSummary: "Generating video" }),
66+]);
67+68+expect(
69+buildActiveMediaGenerationTaskPromptContextForSession({
70+sessionKey: "session/A",
71+taskKind: "video-generate",
72+sourcePrefix: "video-generate",
73+nounLabel: "video",
74+toolName: "video_generate",
75+completionLabel: "video",
76+}),
77+).toContain("Do not call `video_generate` again for the same request");
78+});
79+80+it("keeps delivery-phase tasks available to duplicate/status lookups", () => {
81+const task = makeTask({ progressSummary: MEDIA_GENERATION_DELIVERING_COMPLETION_PROGRESS });
82+taskRuntimeInternalMocks.listFreshTasksForOwnerKey.mockReturnValue([task]);
83+84+expect(
85+listActiveMediaGenerationTasksForSession({
86+sessionKey: "session/A",
87+taskKind: "video-generate",
88+sourcePrefix: "video-generate",
89+}),
90+).toEqual([task]);
91+expect(
92+findActiveMediaGenerationTaskForSession({
93+sessionKey: "session/A",
94+taskKind: "video-generate",
95+sourcePrefix: "video-generate",
96+}),
97+).toEqual(task);
98+});
99+100+it("blocks the same prompt while allowing a distinct prompt", () => {
101+const task = makeTask({
102+task: "generate clip 01",
103+progressSummary: MEDIA_GENERATION_DELIVERING_COMPLETION_PROGRESS,
104+});
105+taskRuntimeInternalMocks.listFreshTasksForOwnerKey.mockReturnValue([task]);
106+107+expect(
108+findDuplicateGuardMediaGenerationTaskForSession({
109+sessionKey: "session/A",
110+taskKind: "video-generate",
111+sourcePrefix: "video-generate",
112+taskLabel: "generate clip 01",
113+maxAgeMs: 120_000,
114+}),
115+).toEqual(task);
116+expect(
117+findDuplicateGuardMediaGenerationTaskForSession({
118+sessionKey: "session/A",
119+taskKind: "video-generate",
120+sourcePrefix: "video-generate",
121+taskLabel: "generate clip 02",
122+maxAgeMs: 120_000,
123+}),
124+).toBeUndefined();
125+});
126+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。