Files
pikasTech-HWLAB/web/hwlab-cloud-web/scripts/workbench-message-projection-budget.test.ts

80 lines
3.2 KiB
TypeScript

// SPEC: pikasTech/HWLAB#2351 Workbench JSON parse/projection merge cost reduction.
// Responsibility: Regression tests for bounded Workbench message projection refresh planning.
import assert from "node:assert/strict";
import test from "node:test";
import type { ChatMessage } from "../src/types/index.ts";
import { boundedProjectionMessageLimit, mergeBoundedProjectionMessages, selectProjectionMessageWindow, traceProjectionIsTerminalSealed } from "../src/stores/workbench-message-projection-budget.ts";
test("projection window keeps only bounded tail for automatic session refresh", () => {
const messages = Array.from({ length: 8 }, (_, index) => message(`msg_${index}`, `trc_${index}`));
const selected = selectProjectionMessageWindow(messages, { limit: 3 });
assert.deepEqual(selected.map((item) => item.id), ["msg_5", "msg_6", "msg_7"]);
});
test("projection window keeps active trace outside the bounded tail", () => {
const messages = Array.from({ length: 8 }, (_, index) => message(`msg_${index}`, `trc_${index}`));
const selected = selectProjectionMessageWindow(messages, { traceId: "trc_2", limit: 3 });
assert.deepEqual(selected.map((item) => item.id), ["msg_2", "msg_5", "msg_6", "msg_7"]);
});
test("bounded projection merge updates window messages without dropping history", () => {
const existing = [
message("msg_1", "trc_1", { text: "old one" }),
message("msg_2", "trc_2", { text: "old two" }),
message("msg_3", "trc_3", { text: "old three" })
];
const incoming = [
message("msg_2", "trc_2", { text: "new two" }),
message("msg_4", "trc_4", { text: "new four" })
];
const merged = mergeBoundedProjectionMessages(existing, incoming);
assert.deepEqual(merged.map((item) => item.id), ["msg_1", "msg_2", "msg_3", "msg_4"]);
assert.equal(merged[0]?.text, "old one");
assert.equal(merged[1]?.text, "new two");
assert.equal(merged[3]?.text, "new four");
});
test("bounded projection merge replaces optimistic agent row by trace when message ids differ", () => {
const existing = [message("msg_optimistic", "trc_same", { text: "optimistic" })];
const incoming = [message("msg_canonical", "trc_same", { text: "canonical" })];
const merged = mergeBoundedProjectionMessages(existing, incoming);
assert.equal(merged.length, 1);
assert.equal(merged[0]?.id, "msg_canonical");
assert.equal(merged[0]?.text, "canonical");
});
test("terminal sealed trace skips redundant message projection refresh", () => {
const sealed = message("msg_terminal", "trc_terminal", {
status: "completed",
text: "final answer",
finalResponse: { text: "final answer" }
});
const unsealed = message("msg_unsealed", "trc_unsealed", { status: "completed", text: "" });
assert.equal(traceProjectionIsTerminalSealed("trc_terminal", [sealed, unsealed]), true);
assert.equal(traceProjectionIsTerminalSealed("trc_unsealed", [sealed, unsealed]), false);
assert.equal(boundedProjectionMessageLimit(0, 5), 5);
});
function message(id: string, traceId: string, extra: Partial<ChatMessage> = {}): ChatMessage {
return {
id,
messageId: id,
role: "agent",
title: "Code Agent",
text: "",
status: "running",
traceId,
createdAt: "2026-07-02T00:00:00.000Z",
...extra
};
}