

























@@ -29,6 +29,14 @@ function createRetryingSend() {
2929return { send, prompts, waitForSecondAttempt };
3030}
313132+function createCollectSendRecorder() {
33+const calls: AnnounceQueueItem[] = [];
34+const send = vi.fn(async (item: AnnounceQueueItem) => {
35+calls.push(item);
36+});
37+return { calls, send };
38+}
39+3240describe("subagent-announce-queue", () => {
3341afterEach(() => {
3442vi.useRealTimers();
@@ -122,6 +130,82 @@ describe("subagent-announce-queue", () => {
122130expect(sender.prompts[1]).toContain("queued item two");
123131});
124132133+it("splits collect-mode batches when target authorization context changes", async () => {
134+const sender = createCollectSendRecorder();
135+const settings = { mode: "collect", debounceMs: 0 } as const;
136+const origin = { channel: "slack", to: "channel:C123", accountId: "acct-1" };
137+138+enqueueAnnounce({
139+key: "announce:test:collect-auth-split",
140+item: {
141+prompt: "first child completed",
142+enqueuedAt: Date.now(),
143+sessionKey: "agent:main:slack:thread:a",
144+ origin,
145+},
146+ settings,
147+send: sender.send,
148+});
149+enqueueAnnounce({
150+key: "announce:test:collect-auth-split",
151+item: {
152+prompt: "second child completed",
153+enqueuedAt: Date.now(),
154+sessionKey: "agent:main:slack:thread:b",
155+ origin,
156+},
157+ settings,
158+send: sender.send,
159+});
160+161+await vi.waitFor(() => {
162+expect(sender.send).toHaveBeenCalledTimes(2);
163+});
164+expect(sender.calls.map((call) => call.sessionKey)).toEqual([
165+"agent:main:slack:thread:a",
166+"agent:main:slack:thread:b",
167+]);
168+expect(sender.calls[0]?.prompt).toContain("first child completed");
169+expect(sender.calls[0]?.prompt).not.toContain("second child completed");
170+expect(sender.calls[1]?.prompt).toContain("second child completed");
171+});
172+173+it("keeps one collect-mode batch when target authorization context matches", async () => {
174+const sender = createCollectSendRecorder();
175+const settings = { mode: "collect", debounceMs: 0 } as const;
176+const origin = { channel: "slack", to: "channel:C123", accountId: "acct-1" };
177+178+enqueueAnnounce({
179+key: "announce:test:collect-auth-match",
180+item: {
181+prompt: "first child completed",
182+enqueuedAt: Date.now(),
183+sessionKey: "agent:main:slack:thread:a",
184+ origin,
185+},
186+ settings,
187+send: sender.send,
188+});
189+enqueueAnnounce({
190+key: "announce:test:collect-auth-match",
191+item: {
192+prompt: "second child completed",
193+enqueuedAt: Date.now(),
194+sessionKey: "agent:main:slack:thread:a",
195+ origin,
196+},
197+ settings,
198+send: sender.send,
199+});
200+201+await vi.waitFor(() => {
202+expect(sender.send).toHaveBeenCalledTimes(1);
203+});
204+expect(sender.calls[0]?.sessionKey).toBe("agent:main:slack:thread:a");
205+expect(sender.calls[0]?.prompt).toContain("first child completed");
206+expect(sender.calls[0]?.prompt).toContain("second child completed");
207+});
208+125209it("waits until a busy parent session becomes idle before draining", async () => {
126210vi.useFakeTimers();
127211vi.setSystemTime(new Date("2026-01-01T00:00:00.000Z"));
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。