

























@@ -847,6 +847,60 @@ describe("OpenClaw SDK", () => {
847847}
848848});
849849850+it("uses cumulative text for the first replayed chat projection", async () => {
851+const transport = new FakeTransport({});
852+const oc = new OpenClaw({ transport });
853+const runId = "run_chat_delta_text_replay";
854+let text = "";
855+let iterator: AsyncIterator<OpenClawEvent> | undefined;
856+857+try {
858+await oc.connect();
859+const observedLast = (async () => {
860+for await (const event of oc.events(
861+(event) => event.raw?.event === "chat" && event.raw.seq === 501,
862+)) {
863+return event;
864+}
865+throw new Error("expected final replay setup event");
866+})();
867+868+for (let index = 0; index <= 500; index += 1) {
869+const deltaText = index === 0 ? "hello" : ` ${index}`;
870+text += deltaText;
871+transport.emit({
872+event: "chat",
873+seq: index + 1,
874+payload: {
875+ runId,
876+sessionKey: "chat-delta-text-replay",
877+state: "delta",
878+ deltaText,
879+message: {
880+role: "assistant",
881+content: [{ type: "text", text }],
882+timestamp: 1_777_000_000_300 + index,
883+},
884+},
885+});
886+}
887+888+await observedLast;
889+const run = await oc.runs.get(runId);
890+iterator = run.events()[Symbol.asyncIterator]();
891+const first = await iterator.next();
892+expect(first.done).toBe(false);
893+if (first.done !== false) {
894+throw new Error("expected first replayed chat projection event");
895+}
896+expect(first.value.type).toBe("assistant.delta");
897+expect(first.value.data).toEqual({ text: "hello 1", delta: "hello 1" });
898+} finally {
899+await iterator?.return?.();
900+await oc.close();
901+}
902+});
903+850904it("creates a session and sends a message as a run", async () => {
851905const transport = new FakeTransport({
852906"sessions.create": { key: "session-main", label: "Main" },
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。