fix(cron): narrow manual run execution state

This commit is contained in:
Peter Steinberger
2026-02-22 20:16:28 +01:00
parent 9cf445e37c
commit 7e83e7b3a7

View File

@@ -241,17 +241,18 @@ export async function run(state: CronServiceState, id: string, mode?: "due" | "f
if (!prepared.ran) { if (!prepared.ran) {
return prepared; return prepared;
} }
if (!prepared.executionJob || typeof prepared.startedAt !== "number") {
return { ok: false } as const;
}
const executionJob = prepared.executionJob;
const startedAt = prepared.startedAt;
const jobId = prepared.jobId;
let coreResult: let coreResult: Awaited<ReturnType<typeof executeJobCore>>;
| Awaited<ReturnType<typeof executeJobCore>>
| {
status: "error";
error: string;
};
const configuredTimeoutMs = const configuredTimeoutMs =
prepared.executionJob.payload.kind === "agentTurn" && executionJob.payload.kind === "agentTurn" &&
typeof prepared.executionJob.payload.timeoutSeconds === "number" typeof executionJob.payload.timeoutSeconds === "number"
? Math.floor(prepared.executionJob.payload.timeoutSeconds * 1_000) ? Math.floor(executionJob.payload.timeoutSeconds * 1_000)
: undefined; : undefined;
const jobTimeoutMs = const jobTimeoutMs =
configuredTimeoutMs !== undefined configuredTimeoutMs !== undefined
@@ -267,7 +268,7 @@ export async function run(state: CronServiceState, id: string, mode?: "due" | "f
let timeoutId: NodeJS.Timeout | undefined; let timeoutId: NodeJS.Timeout | undefined;
try { try {
return await Promise.race([ return await Promise.race([
executeJobCore(state, prepared.executionJob, runAbortController?.signal), executeJobCore(state, executionJob, runAbortController?.signal),
new Promise<never>((_, reject) => { new Promise<never>((_, reject) => {
timeoutId = setTimeout(() => { timeoutId = setTimeout(() => {
runAbortController?.abort(new Error("cron: job execution timed out")); runAbortController?.abort(new Error("cron: job execution timed out"));
@@ -281,7 +282,7 @@ export async function run(state: CronServiceState, id: string, mode?: "due" | "f
} }
} }
})() })()
: await executeJobCore(state, prepared.executionJob); : await executeJobCore(state, executionJob);
} catch (err) { } catch (err) {
coreResult = { status: "error", error: String(err) }; coreResult = { status: "error", error: String(err) };
} }
@@ -289,7 +290,7 @@ export async function run(state: CronServiceState, id: string, mode?: "due" | "f
await locked(state, async () => { await locked(state, async () => {
await ensureLoaded(state, { skipRecompute: true }); await ensureLoaded(state, { skipRecompute: true });
const job = state.store?.jobs.find((entry) => entry.id === prepared.jobId); const job = state.store?.jobs.find((entry) => entry.id === jobId);
if (!job) { if (!job) {
return; return;
} }
@@ -298,7 +299,7 @@ export async function run(state: CronServiceState, id: string, mode?: "due" | "f
status: coreResult.status, status: coreResult.status,
error: coreResult.error, error: coreResult.error,
delivered: coreResult.delivered, delivered: coreResult.delivered,
startedAt: prepared.startedAt, startedAt,
endedAt, endedAt,
}); });
@@ -313,7 +314,7 @@ export async function run(state: CronServiceState, id: string, mode?: "due" | "f
deliveryError: job.state.lastDeliveryError, deliveryError: job.state.lastDeliveryError,
sessionId: coreResult.sessionId, sessionId: coreResult.sessionId,
sessionKey: coreResult.sessionKey, sessionKey: coreResult.sessionKey,
runAtMs: prepared.startedAt, runAtMs: startedAt,
durationMs: job.state.lastDurationMs, durationMs: job.state.lastDurationMs,
nextRunAtMs: job.state.nextRunAtMs, nextRunAtMs: job.state.nextRunAtMs,
model: coreResult.model, model: coreResult.model,