test(FN-5135): lock deletedAt SSE payload contract

Fusion-Task-Id: FN-5135
Fusion-Task-Lineage: 182c496e-4e3a-4353-be53-86dd4cc5ba19
This commit is contained in:
Fusion (runfusion.ai)
2026-05-19 07:14:55 -07:00
committed by gsxdsm
parent 95d5c08c23
commit ee92b71533
3 changed files with 27 additions and 3 deletions

View File

@@ -1262,7 +1262,7 @@ describe("useTasks", () => {
const { result } = renderHook(() => useTasks({ projectId: "proj-1" }));
expect(result.current.tasks.map((task) => task.id)).toEqual(["FN-AAA", "FN-DELETED"]);
expect(result.current.tasks.map((task) => task.id)).toEqual(["FN-AAA"]);
});
});

View File

@@ -0,0 +1,17 @@
import { describe, expect, it } from "vitest";
import { stripTaskListHeavyFields } from "../sse";
describe("stripTaskListHeavyFields", () => {
it("preserves deletedAt on slim SSE payloads", () => {
const payload = {
id: "FN-123",
title: "soft deleted task",
deletedAt: "2026-05-19T00:00:00.000Z",
log: [{ action: "[timing] step in 5ms" }],
};
const slimmed = stripTaskListHeavyFields(payload);
expect(slimmed.deletedAt).toBe("2026-05-19T00:00:00.000Z");
});
});

View File

@@ -134,7 +134,7 @@ function safeWrite(res: Response, data: string): SafeWriteResult {
}
}
function stripTaskListHeavyFields<T>(task: T): T {
export function stripTaskListHeavyFields<T>(task: T): T {
if (!task || typeof task !== "object" || Array.isArray(task)) {
return task;
}
@@ -156,7 +156,14 @@ function stripTaskListHeavyFields<T>(task: T): T {
? existingTimed
: sumTimedLogEntries(candidate.log);
return { ...task, log: [], timedExecutionMs, tokenUsage: candidate.tokenUsage, workflowStepResults: candidate.workflowStepResults } as T;
return {
...task,
// FN-5105/FN-5135: preserve deletedAt in SSE slim payloads for soft-delete suppression.
log: [],
timedExecutionMs,
tokenUsage: candidate.tokenUsage,
workflowStepResults: candidate.workflowStepResults,
} as T;
}
function sumTimedLogEntries(log: unknown): number {