Files
openclaw/src/auto-reply/reply/get-reply-run-queue.ts
2026-04-06 19:31:20 +01:00

49 lines
1.7 KiB
TypeScript

import { logVerbose } from "../../globals.js";
import type { ReplyPayload } from "../types.js";
import type { ActiveRunQueueAction } from "./queue-policy.js";
import type { QueueSettings } from "./queue.js";
export type ReplyRunQueueBusyState = {
activeSessionId: string | undefined;
isActive: boolean;
isStreaming: boolean;
};
export async function resolvePreparedReplyQueueState(params: {
activeRunQueueAction: ActiveRunQueueAction;
activeSessionId: string | undefined;
queueMode: QueueSettings["mode"];
sessionKey: string | undefined;
sessionId: string;
abortActiveRun: (sessionId: string) => boolean;
waitForActiveRunEnd: (sessionId: string) => Promise<unknown>;
refreshPreparedState: () => Promise<void>;
resolveBusyState: () => ReplyRunQueueBusyState;
}): Promise<
{ kind: "continue"; busyState: ReplyRunQueueBusyState } | { kind: "reply"; reply: ReplyPayload }
> {
if (params.activeRunQueueAction !== "run-now" || !params.activeSessionId) {
return { kind: "continue", busyState: params.resolveBusyState() };
}
if (params.queueMode === "interrupt") {
const aborted = params.abortActiveRun(params.activeSessionId);
logVerbose(
`Interrupting active run for ${params.sessionKey ?? params.sessionId} (aborted=${aborted})`,
);
}
await params.waitForActiveRunEnd(params.activeSessionId);
await params.refreshPreparedState();
const refreshedBusyState = params.resolveBusyState();
if (refreshedBusyState.isActive) {
return {
kind: "reply",
reply: {
text: "⚠️ Previous run is still shutting down. Please try again in a moment.",
},
};
}
return { kind: "continue", busyState: refreshedBusyState };
}