mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-17 07:00:49 +00:00
49 lines
1.7 KiB
TypeScript
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 };
|
|
}
|