






























@@ -4,6 +4,7 @@ import type { OpenClawConfig } from "../config/config.js";
44import { resolveMainSessionKey } from "../config/sessions/main-session.js";
55import { isCronSystemEvent } from "./heartbeat-events-filter.js";
66import {
7+consumeSelectedSystemEventEntries,
78consumeSystemEventEntries,
89drainSystemEventEntries,
910enqueueSystemEvent,
@@ -120,6 +121,20 @@ describe("system events (session routing)", () => {
120121expect(peekSystemEvents(key)).toEqual(["second"]);
121122});
122123124+it("consumes selected inspected entries and preserves unselected queued events", () => {
125+const key = "agent:main:test-consume-selected";
126+enqueueSystemEvent("first", { sessionKey: key, contextKey: "event:first" });
127+enqueueSystemEvent("second", { sessionKey: key, contextKey: "event:second" });
128+enqueueSystemEvent("third", { sessionKey: key, contextKey: "event:third" });
129+const selected = peekSystemEventEntries(key).filter((event) => event.text !== "second");
130+131+expect(consumeSelectedSystemEventEntries(key, selected).map((entry) => entry.text)).toEqual([
132+"first",
133+"third",
134+]);
135+expect(peekSystemEvents(key)).toEqual(["second"]);
136+});
137+123138it("matches consumed delivery contexts through normalized route identity", () => {
124139const key = "agent:main:test-consume-route-context";
125140enqueueSystemEvent("first", {
@@ -211,6 +226,32 @@ describe("system events (session routing)", () => {
211226expect(peekSystemEvents(key)).toEqual([]);
212227});
213228229+it("leaves exec completion events queued for the dedicated heartbeat", async () => {
230+const key = "agent:main:test-exec-completion-filter";
231+enqueueSystemEvent("Exec failed (abc12345, signal SIGTERM) :: browser auth timed out", {
232+sessionKey: key,
233+trusted: false,
234+});
235+236+const result = await drainFormattedEvents(key);
237+expect(result).toBeUndefined();
238+expect(peekSystemEvents(key)).toEqual([
239+"Exec failed (abc12345, signal SIGTERM) :: browser auth timed out",
240+]);
241+});
242+243+it("drains generic events without consuming pending exec completions", async () => {
244+const key = "agent:main:test-exec-completion-prefix";
245+enqueueSystemEvent("Model switched to gpt-5.5", { sessionKey: key });
246+enqueueSystemEvent("Exec finished (gateway id=abc12345, code 0)", { sessionKey: key });
247+enqueueSystemEvent("Node connected", { sessionKey: key });
248+249+const result = await drainFormattedEvents(key);
250+expect(result).toContain("Model switched to gpt-5.5");
251+expect(result).toContain("Node connected");
252+expect(peekSystemEvents(key)).toEqual(["Exec finished (gateway id=abc12345, code 0)"]);
253+});
254+214255it("prefixes every line of a multi-line event", async () => {
215256const key = "agent:main:test-multiline";
216257enqueueSystemEvent("Post-compaction context:\nline one\nline two", { sessionKey: key });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。