fix: refactor cron edit payload patches
Co-authored-by: Felix Krause <869950+KrauseFx@users.noreply.github.com>
This commit is contained in:
@@ -51,12 +51,6 @@ function coerceSchedule(schedule: UnknownRecord) {
|
||||
|
||||
function coercePayload(payload: UnknownRecord) {
|
||||
const next: UnknownRecord = { ...payload };
|
||||
const kind = typeof payload.kind === "string" ? payload.kind : undefined;
|
||||
if (!kind) {
|
||||
if (typeof payload.text === "string") next.kind = "systemEvent";
|
||||
else if (typeof payload.message === "string") next.kind = "agentTurn";
|
||||
}
|
||||
|
||||
// Back-compat: older configs used `provider` for delivery channel.
|
||||
migrateLegacyCronPayload(next);
|
||||
return next;
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
import crypto from "node:crypto";
|
||||
|
||||
import { computeNextRunAtMs } from "../schedule.js";
|
||||
import type { CronJob, CronJobCreate, CronJobPatch } from "../types.js";
|
||||
import type {
|
||||
CronJob,
|
||||
CronJobCreate,
|
||||
CronJobPatch,
|
||||
CronPayload,
|
||||
CronPayloadPatch,
|
||||
} from "../types.js";
|
||||
import {
|
||||
normalizeOptionalAgentId,
|
||||
normalizeOptionalText,
|
||||
@@ -103,7 +109,7 @@ export function applyJobPatch(job: CronJob, patch: CronJobPatch) {
|
||||
if (patch.schedule) job.schedule = patch.schedule;
|
||||
if (patch.sessionTarget) job.sessionTarget = patch.sessionTarget;
|
||||
if (patch.wakeMode) job.wakeMode = patch.wakeMode;
|
||||
if (patch.payload) job.payload = patch.payload;
|
||||
if (patch.payload) job.payload = mergeCronPayload(job.payload, patch.payload);
|
||||
if (patch.isolation) job.isolation = patch.isolation;
|
||||
if (patch.state) job.state = { ...job.state, ...patch.state };
|
||||
if ("agentId" in patch) {
|
||||
@@ -112,6 +118,55 @@ export function applyJobPatch(job: CronJob, patch: CronJobPatch) {
|
||||
assertSupportedJobSpec(job);
|
||||
}
|
||||
|
||||
function mergeCronPayload(existing: CronPayload, patch: CronPayloadPatch): CronPayload {
|
||||
if (patch.kind !== existing.kind) {
|
||||
return buildPayloadFromPatch(patch);
|
||||
}
|
||||
|
||||
if (patch.kind === "systemEvent") {
|
||||
const text = typeof patch.text === "string" ? patch.text : existing.text;
|
||||
return { kind: "systemEvent", text };
|
||||
}
|
||||
|
||||
const next: CronPayload = { ...existing };
|
||||
if (typeof patch.message === "string") next.message = patch.message;
|
||||
if (typeof patch.model === "string") next.model = patch.model;
|
||||
if (typeof patch.thinking === "string") next.thinking = patch.thinking;
|
||||
if (typeof patch.timeoutSeconds === "number") next.timeoutSeconds = patch.timeoutSeconds;
|
||||
if (typeof patch.deliver === "boolean") next.deliver = patch.deliver;
|
||||
if (typeof patch.channel === "string") next.channel = patch.channel;
|
||||
if (typeof patch.to === "string") next.to = patch.to;
|
||||
if (typeof patch.bestEffortDeliver === "boolean") {
|
||||
next.bestEffortDeliver = patch.bestEffortDeliver;
|
||||
}
|
||||
return next;
|
||||
}
|
||||
|
||||
function buildPayloadFromPatch(patch: CronPayloadPatch): CronPayload {
|
||||
if (patch.kind === "systemEvent") {
|
||||
if (typeof patch.text !== "string" || patch.text.length === 0) {
|
||||
throw new Error('cron.update payload.kind="systemEvent" requires text');
|
||||
}
|
||||
return { kind: "systemEvent", text: patch.text };
|
||||
}
|
||||
|
||||
if (typeof patch.message !== "string" || patch.message.length === 0) {
|
||||
throw new Error('cron.update payload.kind="agentTurn" requires message');
|
||||
}
|
||||
|
||||
return {
|
||||
kind: "agentTurn",
|
||||
message: patch.message,
|
||||
model: patch.model,
|
||||
thinking: patch.thinking,
|
||||
timeoutSeconds: patch.timeoutSeconds,
|
||||
deliver: patch.deliver,
|
||||
channel: patch.channel,
|
||||
to: patch.to,
|
||||
bestEffortDeliver: patch.bestEffortDeliver,
|
||||
};
|
||||
}
|
||||
|
||||
export function isJobDue(job: CronJob, nowMs: number, opts: { forced: boolean }) {
|
||||
if (opts.forced) return true;
|
||||
return job.enabled && typeof job.state.nextRunAtMs === "number" && nowMs >= job.state.nextRunAtMs;
|
||||
|
||||
@@ -25,6 +25,20 @@ export type CronPayload =
|
||||
bestEffortDeliver?: boolean;
|
||||
};
|
||||
|
||||
export type CronPayloadPatch =
|
||||
| { kind: "systemEvent"; text?: string }
|
||||
| {
|
||||
kind: "agentTurn";
|
||||
message?: string;
|
||||
model?: string;
|
||||
thinking?: string;
|
||||
timeoutSeconds?: number;
|
||||
deliver?: boolean;
|
||||
channel?: CronMessageChannel;
|
||||
to?: string;
|
||||
bestEffortDeliver?: boolean;
|
||||
};
|
||||
|
||||
export type CronIsolation = {
|
||||
postToMainPrefix?: string;
|
||||
/**
|
||||
@@ -72,6 +86,7 @@ export type CronJobCreate = Omit<CronJob, "id" | "createdAtMs" | "updatedAtMs" |
|
||||
state?: Partial<CronJobState>;
|
||||
};
|
||||
|
||||
export type CronJobPatch = Partial<
|
||||
Omit<CronJob, "id" | "createdAtMs" | "state"> & { state: CronJobState }
|
||||
>;
|
||||
export type CronJobPatch = Partial<Omit<CronJob, "id" | "createdAtMs" | "state" | "payload">> & {
|
||||
payload?: CronPayloadPatch;
|
||||
state?: Partial<CronJobState>;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user