openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
47 lines (46 loc) • 2.99 kB
JavaScript
import { o as asDateTimestampMs } from "./number-coercion-CkhMiRw8.mjs";
import { t as parseAbsoluteTimeMs } from "./parse-B3paXGEX.mjs";
import { s as resolveCronSessionTargetSessionKey } from "./session-target-D2XKEs9p.mjs";
import { t as computeNextRunAtMs } from "./schedule-CklyWfJr.mjs";
//#region src/cron/service/one-shot-schedule.ts
/** Authored one-shot occurrence ownership across manual runs and scheduling. */
/** Only explicit conversation continuations can rearm a one-shot through next_check. */
function isCronOneShotContinuationJob(job) {
return job.schedule.kind === "at" && job.payload.kind === "agentTurn" && resolveCronSessionTargetSessionKey(job.sessionTarget) !== void 0;
}
/** A manual run may retain the authored one-shot even while it has no runnable slot. */
function resolveForcePreservedOneShotAtMs(job) {
const preserved = job.state.forcePreservedNextRunAtMs;
return job.schedule.kind === "at" && asDateTimestampMs(preserved) !== void 0 && preserved === parseAbsoluteTimeMs(job.schedule.at) ? preserved : void 0;
}
/** Only future occurrences are borrowed; retry or pacing slots take precedence. */
function resolveManualOneShotOccurrenceAtMs(job, ownershipAtMs) {
const occurrenceAtMs = job.schedule.kind === "at" ? job.state.nextRunAtMs ?? computeNextRunAtMs(job.schedule, ownershipAtMs) : void 0;
return occurrenceAtMs !== void 0 && occurrenceAtMs > ownershipAtMs ? occurrenceAtMs : void 0;
}
/** Reservation owns this provenance before an enablement edit can make completion stale. */
function retainManualOneShotOccurrence(job, ownershipAtMs) {
job.state.forcePreservedNextRunAtMs = resolveManualOneShotOccurrenceAtMs(job, ownershipAtMs) ?? job.state.forcePreservedNextRunAtMs;
}
/** Retained authored occurrences can recompute a missing runnable slot after enablement. */
function clearInvalidForcePreservedNextRun(job) {
const preserved = job.state.forcePreservedNextRunAtMs;
const retainsAuthoredOccurrence = job.state.nextRunAtMs === void 0 && resolveForcePreservedOneShotAtMs(job) !== void 0;
if (preserved !== void 0 && !retainsAuthoredOccurrence && (asDateTimestampMs(preserved) === void 0 || preserved !== job.state.nextRunAtMs)) {
job.state.forcePreservedNextRunAtMs = void 0;
return true;
}
return false;
}
function computeOneShotNextRunAtMs(job, lastRunStatus) {
const preserved = resolveForcePreservedOneShotAtMs(job);
if (preserved !== void 0) return preserved;
const atMs = job.schedule.kind === "at" ? parseAbsoluteTimeMs(job.schedule.at) : null;
if (lastRunStatus === "ok" && job.state.lastRunAtMs) {
if (atMs !== null && Number.isFinite(atMs) && atMs > job.state.lastRunAtMs) return atMs;
return;
}
return atMs !== null && Number.isFinite(atMs) ? atMs : void 0;
}
//#endregion
export { resolveManualOneShotOccurrenceAtMs as a, resolveForcePreservedOneShotAtMs as i, computeOneShotNextRunAtMs as n, retainManualOneShotOccurrence as o, isCronOneShotContinuationJob as r, clearInvalidForcePreservedNextRun as t };