

























@@ -96,6 +96,110 @@ describe("followup queue collect routing", () => {
9696expect(calls[0]?.originatingTo).toBe("channel:A");
9797});
989899+it("collects compatible items after one cross-channel drain", async () => {
100+const key = `test-collect-after-cross-${Date.now()}`;
101+const calls: FollowupRun[] = [];
102+const done = createDeferred<void>();
103+const runFollowup = async (run: FollowupRun) => {
104+calls.push(run);
105+if (calls.length >= 2) {
106+done.resolve();
107+}
108+};
109+const settings: QueueSettings = {
110+mode: "collect",
111+debounceMs: 0,
112+cap: 50,
113+dropPolicy: "summarize",
114+};
115+116+enqueueFollowupRun(
117+key,
118+createRun({
119+prompt: "first route",
120+originatingChannel: "slack",
121+originatingTo: "channel:A",
122+}),
123+settings,
124+);
125+enqueueFollowupRun(
126+key,
127+createRun({
128+prompt: "second route one",
129+originatingChannel: "slack",
130+originatingTo: "channel:B",
131+}),
132+settings,
133+);
134+enqueueFollowupRun(
135+key,
136+createRun({
137+prompt: "second route two",
138+originatingChannel: "slack",
139+originatingTo: "channel:B",
140+}),
141+settings,
142+);
143+144+scheduleFollowupDrain(key, runFollowup);
145+await done.promise;
146+147+expect(calls).toHaveLength(2);
148+expect(calls[0]?.prompt).toBe("first route");
149+expect(calls[1]?.prompt).toContain("[Queued messages while agent was busy]");
150+expect(calls[1]?.prompt).toContain("Queued #1\nsecond route one");
151+expect(calls[1]?.prompt).toContain("Queued #2\nsecond route two");
152+expect(calls[1]?.originatingChannel).toBe("slack");
153+expect(calls[1]?.originatingTo).toBe("channel:B");
154+});
155+156+it("collects unresolved-origin items with an otherwise single route", async () => {
157+const key = `test-collect-unresolved-origin-${Date.now()}`;
158+const calls: FollowupRun[] = [];
159+const done = createDeferred<void>();
160+const runFollowup = async (run: FollowupRun) => {
161+calls.push(run);
162+done.resolve();
163+};
164+const settings: QueueSettings = {
165+mode: "collect",
166+debounceMs: 0,
167+cap: 50,
168+dropPolicy: "summarize",
169+};
170+171+enqueueFollowupRun(key, createRun({ prompt: "unresolved origin" }), settings);
172+enqueueFollowupRun(
173+key,
174+createRun({
175+prompt: "keyed one",
176+originatingChannel: "slack",
177+originatingTo: "channel:B",
178+}),
179+settings,
180+);
181+enqueueFollowupRun(
182+key,
183+createRun({
184+prompt: "keyed two",
185+originatingChannel: "slack",
186+originatingTo: "channel:B",
187+}),
188+settings,
189+);
190+191+scheduleFollowupDrain(key, runFollowup);
192+await done.promise;
193+194+expect(calls).toHaveLength(1);
195+expect(calls[0]?.prompt).toContain("[Queued messages while agent was busy]");
196+expect(calls[0]?.prompt).toContain("Queued #1\nunresolved origin");
197+expect(calls[0]?.prompt).toContain("Queued #2\nkeyed one");
198+expect(calls[0]?.prompt).toContain("Queued #3\nkeyed two");
199+expect(calls[0]?.originatingChannel).toBe("slack");
200+expect(calls[0]?.originatingTo).toBe("channel:B");
201+});
202+99203it("collects ordinary user-request followups with current turn kind", async () => {
100204const key = `test-collect-user-request-kind-${Date.now()}`;
101205const calls: FollowupRun[] = [];
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。