mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-07 19:51:22 +00:00
fix (auto-reply/queue): preserve queued items on drain retries
This commit is contained in:
@@ -9,6 +9,26 @@ import {
|
||||
import { isRoutableChannel } from "../route-reply.js";
|
||||
import { FOLLOWUP_QUEUES } from "./state.js";
|
||||
|
||||
function previewQueueSummaryPrompt(queue: {
|
||||
dropPolicy: "summarize" | "old" | "new";
|
||||
droppedCount: number;
|
||||
summaryLines: string[];
|
||||
}): string | undefined {
|
||||
return buildQueueSummaryPrompt({
|
||||
state: {
|
||||
dropPolicy: queue.dropPolicy,
|
||||
droppedCount: queue.droppedCount,
|
||||
summaryLines: [...queue.summaryLines],
|
||||
},
|
||||
noun: "message",
|
||||
});
|
||||
}
|
||||
|
||||
function clearQueueSummaryState(queue: { droppedCount: number; summaryLines: string[] }): void {
|
||||
queue.droppedCount = 0;
|
||||
queue.summaryLines = [];
|
||||
}
|
||||
|
||||
export function scheduleFollowupDrain(
|
||||
key: string,
|
||||
runFollowup: (run: FollowupRun) => Promise<void>,
|
||||
@@ -29,11 +49,12 @@ export function scheduleFollowupDrain(
|
||||
//
|
||||
// Debug: `pnpm test src/auto-reply/reply/queue.collect-routing.test.ts`
|
||||
if (forceIndividualCollect) {
|
||||
const next = queue.items.shift();
|
||||
const next = queue.items[0];
|
||||
if (!next) {
|
||||
break;
|
||||
}
|
||||
await runFollowup(next);
|
||||
queue.items.shift();
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -58,16 +79,17 @@ export function scheduleFollowupDrain(
|
||||
|
||||
if (isCrossChannel) {
|
||||
forceIndividualCollect = true;
|
||||
const next = queue.items.shift();
|
||||
const next = queue.items[0];
|
||||
if (!next) {
|
||||
break;
|
||||
}
|
||||
await runFollowup(next);
|
||||
queue.items.shift();
|
||||
continue;
|
||||
}
|
||||
|
||||
const items = queue.items.splice(0, queue.items.length);
|
||||
const summary = buildQueueSummaryPrompt({ state: queue, noun: "message" });
|
||||
const items = queue.items.slice();
|
||||
const summary = previewQueueSummaryPrompt(queue);
|
||||
const run = items.at(-1)?.run ?? queue.lastRun;
|
||||
if (!run) {
|
||||
break;
|
||||
@@ -98,30 +120,42 @@ export function scheduleFollowupDrain(
|
||||
originatingAccountId,
|
||||
originatingThreadId,
|
||||
});
|
||||
queue.items.splice(0, items.length);
|
||||
if (summary) {
|
||||
clearQueueSummaryState(queue);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
const summaryPrompt = buildQueueSummaryPrompt({ state: queue, noun: "message" });
|
||||
const summaryPrompt = previewQueueSummaryPrompt(queue);
|
||||
if (summaryPrompt) {
|
||||
const run = queue.lastRun;
|
||||
if (!run) {
|
||||
break;
|
||||
}
|
||||
const next = queue.items[0];
|
||||
if (!next) {
|
||||
break;
|
||||
}
|
||||
await runFollowup({
|
||||
prompt: summaryPrompt,
|
||||
run,
|
||||
enqueuedAt: Date.now(),
|
||||
});
|
||||
queue.items.shift();
|
||||
clearQueueSummaryState(queue);
|
||||
continue;
|
||||
}
|
||||
|
||||
const next = queue.items.shift();
|
||||
const next = queue.items[0];
|
||||
if (!next) {
|
||||
break;
|
||||
}
|
||||
await runFollowup(next);
|
||||
queue.items.shift();
|
||||
}
|
||||
} catch (err) {
|
||||
queue.lastEnqueuedAt = Date.now();
|
||||
defaultRuntime.error?.(`followup queue drain failed for ${key}: ${String(err)}`);
|
||||
} finally {
|
||||
queue.draining = false;
|
||||
|
||||
Reference in New Issue
Block a user