Files
openclaw/src/agents/pi-embedded-runner/run/compaction-timeout.ts
Michael Verrilli e6f67d5f31 fix(agent): prevent session lock deadlock on timeout during compaction (#9855)
Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 64a28900f1
Co-authored-by: mverrilli <816450+mverrilli@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-02-14 14:24:20 -05:00

55 lines
1.4 KiB
TypeScript

import type { AgentMessage } from "@mariozechner/pi-agent-core";
export type CompactionTimeoutSignal = {
isTimeout: boolean;
isCompactionPendingOrRetrying: boolean;
isCompactionInFlight: boolean;
};
export function shouldFlagCompactionTimeout(signal: CompactionTimeoutSignal): boolean {
if (!signal.isTimeout) {
return false;
}
return signal.isCompactionPendingOrRetrying || signal.isCompactionInFlight;
}
export type SnapshotSelectionParams = {
timedOutDuringCompaction: boolean;
preCompactionSnapshot: AgentMessage[] | null;
preCompactionSessionId: string;
currentSnapshot: AgentMessage[];
currentSessionId: string;
};
export type SnapshotSelection = {
messagesSnapshot: AgentMessage[];
sessionIdUsed: string;
source: "pre-compaction" | "current";
};
export function selectCompactionTimeoutSnapshot(
params: SnapshotSelectionParams,
): SnapshotSelection {
if (!params.timedOutDuringCompaction) {
return {
messagesSnapshot: params.currentSnapshot,
sessionIdUsed: params.currentSessionId,
source: "current",
};
}
if (params.preCompactionSnapshot) {
return {
messagesSnapshot: params.preCompactionSnapshot,
sessionIdUsed: params.preCompactionSessionId,
source: "pre-compaction",
};
}
return {
messagesSnapshot: params.currentSnapshot,
sessionIdUsed: params.currentSessionId,
source: "current",
};
}