Files
openclaw/src/cron/heartbeat-policy.ts
2026-03-02 22:30:21 +00:00

49 lines
1.2 KiB
TypeScript

import { stripHeartbeatToken } from "../auto-reply/heartbeat.js";
export type HeartbeatDeliveryPayload = {
text?: string;
mediaUrl?: string;
mediaUrls?: string[];
};
export function shouldSkipHeartbeatOnlyDelivery(
payloads: HeartbeatDeliveryPayload[],
ackMaxChars: number,
): boolean {
if (payloads.length === 0) {
return true;
}
const hasAnyMedia = payloads.some(
(payload) => (payload.mediaUrls?.length ?? 0) > 0 || Boolean(payload.mediaUrl),
);
if (hasAnyMedia) {
return false;
}
return payloads.some((payload) => {
const result = stripHeartbeatToken(payload.text, {
mode: "heartbeat",
maxAckChars: ackMaxChars,
});
return result.shouldSkip;
});
}
export function shouldEnqueueCronMainSummary(params: {
summaryText: string | undefined;
deliveryRequested: boolean;
delivered: boolean | undefined;
deliveryAttempted: boolean | undefined;
suppressMainSummary: boolean;
isCronSystemEvent: (text: string) => boolean;
}): boolean {
const summaryText = params.summaryText?.trim();
return Boolean(
summaryText &&
params.isCronSystemEvent(summaryText) &&
params.deliveryRequested &&
!params.delivered &&
params.deliveryAttempted !== true &&
!params.suppressMainSummary,
);
}