openclaw/src/agents/pi-embedded-runner/run/compaction-timeout.ts

73 lines
1.9 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 function resolveRunTimeoutDuringCompaction(params: {
isCompactionPendingOrRetrying: boolean;
isCompactionInFlight: boolean;
graceAlreadyUsed: boolean;
}): "extend" | "abort" {
if (!params.isCompactionPendingOrRetrying && !params.isCompactionInFlight) {
return "abort";
}
return params.graceAlreadyUsed ? "abort" : "extend";
}
export function resolveRunTimeoutWithCompactionGraceMs(params: {
runTimeoutMs: number;
compactionTimeoutMs: number;
}): number {
return params.runTimeoutMs + params.compactionTimeoutMs;
}
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",
};
}