import { expect, test } from "@playwright/test"; import { clearClawdRequestState, startClawdRequestState, updateClawdRequestState, } from "@/components/canvas/chat-panel/clawd-request-state"; test.describe("OpenClaw request state isolation", () => { test("keeps progress and completion scoped to the originating chat", () => { let state = startClawdRequestState({}, "chat-a", "message-a", "处理中 A"); state = startClawdRequestState(state, "chat-b", "message-b", "处理中 B"); state = updateClawdRequestState( state, "chat-a", "message-a", (currentState) => ({ ...currentState, progressEvents: ["A 第一步"], }) ); expect(state["chat-a"]?.progressEvents).toEqual(["A 第一步"]); expect(state["chat-b"]?.progressEvents).toEqual([]); state = clearClawdRequestState(state, "chat-a", "message-a"); expect(state["chat-a"]).toBeUndefined(); expect(state["chat-b"]?.hint).toBe("处理中 B"); }); test("ignores stale callbacks from an older request in the same chat", () => { let state = startClawdRequestState({}, "chat-a", "old-message", null); state = startClawdRequestState(state, "chat-a", "new-message", "新任务"); const afterStaleUpdate = updateClawdRequestState( state, "chat-a", "old-message", (currentState) => ({ ...currentState, progressEvents: ["旧任务进度"], }) ); const afterStaleClear = clearClawdRequestState( afterStaleUpdate, "chat-a", "old-message" ); expect(afterStaleClear).toBe(state); expect(afterStaleClear["chat-a"]).toEqual({ userMessageId: "new-message", hint: "新任务", progressEvents: [], }); }); });