
























@@ -91,6 +91,13 @@ function requirePersistedJob(jobs: Array<Record<string, unknown>>, index: number
9191return job;
9292}
939394+function requireRecord(value: unknown, label: string): Record<string, unknown> {
95+if (!value || typeof value !== "object" || Array.isArray(value)) {
96+throw new Error(`expected ${label}`);
97+}
98+return value as Record<string, unknown>;
99+}
100+94101describe("maybeRepairLegacyCronStore", () => {
95102it("repairs legacy cron store fields and migrates notify fallback to webhook delivery", async () => {
96103const storePath = await makeTempStorePath();
@@ -110,19 +117,16 @@ describe("maybeRepairLegacyCronStore", () => {
110117expect(job.jobId).toBeUndefined();
111118expect(job.id).toBe("legacy-job");
112119expect(job.notify).toBeUndefined();
113-expect(job.schedule).toMatchObject({
114-kind: "cron",
115-expr: "0 7 * * *",
116-tz: "UTC",
117-});
118-expect(job.delivery).toMatchObject({
119-mode: "webhook",
120-to: "https://example.invalid/cron-finished",
121-});
122-expect(job.payload).toMatchObject({
123-kind: "systemEvent",
124-text: "Morning brief",
125-});
120+const schedule = requireRecord(job.schedule, "cron schedule");
121+expect(schedule.kind).toBe("cron");
122+expect(schedule.expr).toBe("0 7 * * *");
123+expect(schedule.tz).toBe("UTC");
124+const delivery = requireRecord(job.delivery, "cron delivery");
125+expect(delivery.mode).toBe("webhook");
126+expect(delivery.to).toBe("https://example.invalid/cron-finished");
127+const payload = requireRecord(job.payload, "cron payload");
128+expect(payload.kind).toBe("systemEvent");
129+expect(payload.text).toBe("Morning brief");
126130127131expect(noteSpy).toHaveBeenCalledWith(
128132expect.stringContaining("Legacy cron job storage detected"),
@@ -296,10 +300,9 @@ describe("maybeRepairLegacyCronStore", () => {
296300const jobs = await readPersistedJobs(storePath);
297301const job = requirePersistedJob(jobs, 0);
298302expect(job.notify).toBeUndefined();
299-expect(job.delivery).toMatchObject({
300-mode: "webhook",
301-to: "https://example.invalid/cron-finished",
302-});
303+const delivery = requireRecord(job.delivery, "cron delivery");
304+expect(delivery.mode).toBe("webhook");
305+expect(delivery.to).toBe("https://example.invalid/cron-finished");
303306});
304307305308it("repairs legacy root delivery threadId hints into delivery", async () => {
@@ -336,12 +339,11 @@ describe("maybeRepairLegacyCronStore", () => {
336339expect(job.channel).toBeUndefined();
337340expect(job.to).toBeUndefined();
338341expect(job.threadId).toBeUndefined();
339-expect(job.delivery).toMatchObject({
340-mode: "announce",
341-channel: "telegram",
342-to: "-1001234567890",
343-threadId: "99",
344-});
342+const delivery = requireRecord(job.delivery, "cron delivery");
343+expect(delivery.mode).toBe("announce");
344+expect(delivery.channel).toBe("telegram");
345+expect(delivery.to).toBe("-1001234567890");
346+expect(delivery.threadId).toBe("99");
345347});
346348347349it("rewrites stale managed dreaming jobs to the isolated agentTurn shape", async () => {
@@ -377,16 +379,14 @@ describe("maybeRepairLegacyCronStore", () => {
377379const persisted = JSON.parse(await fs.readFile(storePath, "utf-8")) as {
378380jobs: Array<Record<string, unknown>>;
379381};
380-const [job] = persisted.jobs;
381-expect(job).toMatchObject({
382-sessionTarget: "isolated",
383-payload: {
384-kind: "agentTurn",
385-message: "__openclaw_memory_core_short_term_promotion_dream__",
386-lightContext: true,
387-},
388-delivery: { mode: "none" },
389-});
382+const job = requirePersistedJob(persisted.jobs, 0);
383+expect(job.sessionTarget).toBe("isolated");
384+const payload = requireRecord(job.payload, "cron payload");
385+expect(payload.kind).toBe("agentTurn");
386+expect(payload.message).toBe("__openclaw_memory_core_short_term_promotion_dream__");
387+expect(payload.lightContext).toBe(true);
388+const delivery = requireRecord(job.delivery, "cron delivery");
389+expect(delivery.mode).toBe("none");
390390expect(noteSpy).toHaveBeenCalledWith(expect.stringContaining("managed dreaming job"), "Cron");
391391expect(noteSpy).toHaveBeenCalledWith(
392392expect.stringContaining("Rewrote 1 managed dreaming job"),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。