




















@@ -338,6 +338,8 @@ async function loadFreshFollowupRunnerModuleForTest() {
338338vi.doMock("./queue.js", () => ({
339339clearFollowupQueue: clearFollowupQueueForFollowupTest,
340340enqueueFollowupRun: enqueueFollowupRunForFollowupTest,
341+isFollowupRunAborted: (run: Pick<FollowupRun, "abortSignal">) =>
342+run.abortSignal?.aborted === true,
341343refreshQueuedFollowupSession: refreshQueuedFollowupSessionForFollowupTest,
342344}));
343345vi.doMock("./session-run-accounting.js", () => ({
@@ -583,6 +585,61 @@ describe("createFollowupRunner runtime config", () => {
583585expect(call.config).toBe(runtimeConfig);
584586});
585587588+it("skips aborted queued room-event followups", async () => {
589+const abortController = new AbortController();
590+abortController.abort();
591+const onBlockReply = vi.fn(async () => {});
592+const runner = createFollowupRunner({
593+opts: { onBlockReply },
594+typing: createMockTypingController(),
595+typingMode: "instant",
596+defaultModel: "openai/gpt-5.4",
597+});
598+599+await runner(
600+createQueuedRun({
601+currentTurnKind: "room_event",
602+abortSignal: abortController.signal,
603+run: {
604+provider: "openai",
605+model: "gpt-5.4",
606+sourceReplyDeliveryMode: "message_tool_only",
607+},
608+}),
609+);
610+611+expect(runEmbeddedPiAgentMock).not.toHaveBeenCalled();
612+expect(onBlockReply).not.toHaveBeenCalled();
613+});
614+615+it("passes queued room-event abort signals into followup agent runs", async () => {
616+const abortController = new AbortController();
617+runEmbeddedPiAgentMock.mockResolvedValueOnce({
618+payloads: [],
619+meta: {},
620+});
621+const runner = createFollowupRunner({
622+typing: createMockTypingController(),
623+typingMode: "instant",
624+defaultModel: "openai/gpt-5.4",
625+});
626+627+await runner(
628+createQueuedRun({
629+currentTurnKind: "room_event",
630+abortSignal: abortController.signal,
631+run: {
632+provider: "openai",
633+model: "gpt-5.4",
634+sourceReplyDeliveryMode: "message_tool_only",
635+},
636+}),
637+);
638+639+const call = requireLastMockCallArg(runEmbeddedPiAgentMock, "run embedded pi agent");
640+expect(call.abortSignal).toBe(abortController.signal);
641+});
642+586643it("resolves queued embedded followups before preflight helpers read config", async () => {
587644const sourceConfig: OpenClawConfig = {
588645skills: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。