Files
writing-agent/tests/message-branch.test.ts
T
chenmoranzhiandCursor a6be5f7f62 仅在有快照或检查点时允许重出一版。
避免无上下文可复用时误点重跑。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 01:14:33 +08:00

125 lines
3.3 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
createMessageBranchState,
createUserVariantMessage,
ensureBranchForEdit,
recordPreMessageCheckpoint,
switchBranchVariant,
canAttemptRefresh,
isRefreshableMessage,
} from "../src/server/message-branch.js";
import { createSession } from "../src/runtime/phase-machine.js";
describe("message-branch", () => {
it("switchBranchVariant restores alternate user text", () => {
const state = createMessageBranchState();
const checkpoint = {
runtimeSession: createSession("default"),
blackboardItems: [],
};
const messages = [
createUserVariantMessage("版本 A", "g1", 0),
{ id: "w1", role: "system" as const, text: "回复 A", createdAt: "1" },
];
messages[0].branchGroupId = "g1";
messages[0].branchIndex = 0;
messages[0].branchTotal = 2;
state.branches.g1 = {
anchorIndex: 0,
groupId: "g1",
activeIndex: 1,
variants: [
{
messages: [messages[0], messages[1]],
checkpoint,
},
{
messages: [
createUserVariantMessage("版本 B", "g1", 1),
{ id: "w2", role: "system" as const, text: "回复 B", createdAt: "2" },
],
checkpoint,
},
],
};
const switched = switchBranchVariant(state, messages, "g1", -1);
expect(switched?.messages[0].text).toBe("版本 A");
expect(switched?.messages[1].text).toBe("回复 A");
expect(state.branches.g1.activeIndex).toBe(0);
});
it("ensureBranchForEdit captures first variant", () => {
const state = createMessageBranchState();
const messages = [
createUserVariantMessage("首句", "u1", 0),
];
recordPreMessageCheckpoint(state, 0, {
runtimeSession: createSession("default"),
blackboardItems: [],
});
const branch = ensureBranchForEdit(state, messages, 0, state.preMessageCheckpoints[0]!);
expect(branch.variants).toHaveLength(1);
expect(branch.variants[0].messages[0].text).toBe("首句");
});
});
describe("canAttemptRefresh", () => {
const output = {
id: "w1",
role: "system" as const,
text: "场面",
createdAt: "1",
kind: "worker_output",
actor: "world-simulator",
};
it("rejects user bubbles", () => {
expect(
isRefreshableMessage({
id: "u1",
role: "user",
text: "行动",
createdAt: "1",
kind: "user_input",
}),
).toBe(false);
expect(
canAttemptRefresh(
{
id: "u1",
role: "user",
text: "行动",
createdAt: "1",
kind: "user_input",
},
{
lastWorkerId: "world-simulator",
hasLastWorkerSnapshot: true,
hasMessageCheckpoint: true,
},
),
).toBe(false);
});
it("allows worker output when a snapshot exists", () => {
expect(
canAttemptRefresh(output, {
lastWorkerId: "world-simulator",
hasLastWorkerSnapshot: true,
hasMessageCheckpoint: false,
}),
).toBe(true);
});
it("rejects worker output with no snapshot and no checkpoint", () => {
expect(
canAttemptRefresh(output, {
hasLastWorkerSnapshot: false,
hasMessageCheckpoint: false,
}),
).toBe(false);
});
});