




















@@ -47,34 +47,29 @@ describe("normalizeStoredCronJobs", () => {
4747const result = normalizeStoredCronJobs(jobs);
48484949expect(result.mutated).toBe(true);
50-expect(result.issues).toMatchObject({
51-jobId: 1,
52-legacyScheduleCron: 1,
53-legacyTopLevelPayloadFields: 1,
54-legacyTopLevelDeliveryFields: 1,
55-});
50+expect(result.issues.jobId).toBe(1);
51+expect(result.issues.legacyScheduleCron).toBe(1);
52+expect(result.issues.legacyTopLevelPayloadFields).toBe(1);
53+expect(result.issues.legacyTopLevelDeliveryFields).toBe(1);
56545755const [job] = jobs;
5856expect(job?.jobId).toBeUndefined();
5957expect(job?.id).toBe("legacy-job");
60-expect(job?.schedule).toMatchObject({
61-kind: "cron",
62-expr: "*/5 * * * *",
63-tz: "UTC",
64-});
58+const schedule = job?.schedule as Record<string, unknown> | undefined;
59+expect(schedule?.kind).toBe("cron");
60+expect(schedule?.expr).toBe("*/5 * * * *");
61+expect(schedule?.tz).toBe("UTC");
6562expect(job?.message).toBeUndefined();
6663expect(job?.provider).toBeUndefined();
67-expect(job?.delivery).toMatchObject({
68-mode: "announce",
69-channel: "telegram",
70-to: "12345",
71-threadId: "77",
72-});
73-expect(job?.payload).toMatchObject({
74-kind: "agentTurn",
75-message: "say hi",
76-model: "openai/gpt-5.5",
77-});
64+const delivery = job?.delivery as Record<string, unknown> | undefined;
65+expect(delivery?.mode).toBe("announce");
66+expect(delivery?.channel).toBe("telegram");
67+expect(delivery?.to).toBe("12345");
68+expect(delivery?.threadId).toBe("77");
69+const payload = job?.payload as Record<string, unknown> | undefined;
70+expect(payload?.kind).toBe("agentTurn");
71+expect(payload?.message).toBe("say hi");
72+expect(payload?.model).toBe("openai/gpt-5.5");
7873});
79748075it("normalizes payload provider alias into channel", () => {
@@ -94,16 +89,13 @@ describe("normalizeStoredCronJobs", () => {
94899590expect(result.mutated).toBe(true);
9691expect(result.issues.legacyPayloadProvider).toBe(1);
97-expect(jobs[0]?.payload).toMatchObject({
98-kind: "agentTurn",
99-message: "ping",
100-});
10192const payload = jobs[0]?.payload as Record<string, unknown> | undefined;
93+expect(payload?.kind).toBe("agentTurn");
94+expect(payload?.message).toBe("ping");
10295expect(payload?.provider).toBeUndefined();
103-expect(jobs[0]?.delivery).toMatchObject({
104-mode: "announce",
105-channel: "slack",
106-});
96+const delivery = jobs[0]?.delivery as Record<string, unknown> | undefined;
97+expect(delivery?.mode).toBe("announce");
98+expect(delivery?.channel).toBe("slack");
10799});
108100109101it("rewrites legacy OpenAI Codex model refs in cron payloads", () => {
@@ -122,12 +114,11 @@ describe("normalizeStoredCronJobs", () => {
122114123115expect(result.mutated).toBe(true);
124116expect(result.issues.legacyPayloadCodexModel).toBe(1);
125-expect(job.payload).toMatchObject({
126-kind: "agentTurn",
127-message: "ping",
128-model: "openai/gpt-5.5",
129-fallbacks: ["anthropic/claude-opus-4.6", "openai/gpt-5.4-mini"],
130-});
117+const payload = job.payload as Record<string, unknown>;
118+expect(payload.kind).toBe("agentTurn");
119+expect(payload.message).toBe("ping");
120+expect(payload.model).toBe("openai/gpt-5.5");
121+expect(payload.fallbacks).toEqual(["anthropic/claude-opus-4.6", "openai/gpt-5.4-mini"]);
131122});
132123133124it("does not report legacyPayloadKind for already-normalized payload kinds", () => {
@@ -181,8 +172,12 @@ describe("normalizeStoredCronJobs", () => {
181172182173expect(result.mutated).toBe(true);
183174expect(result.issues.legacyPayloadKind).toBe(2);
184-expect(jobs[0]?.payload).toMatchObject({ kind: "agentTurn", message: "ping" });
185-expect(jobs[1]?.payload).toMatchObject({ kind: "systemEvent", text: "pong" });
175+const firstPayload = jobs[0]?.payload as Record<string, unknown> | undefined;
176+expect(firstPayload?.kind).toBe("agentTurn");
177+expect(firstPayload?.message).toBe("ping");
178+const secondPayload = jobs[1]?.payload as Record<string, unknown> | undefined;
179+expect(secondPayload?.kind).toBe("systemEvent");
180+expect(secondPayload?.text).toBe("pong");
186181});
187182188183it("normalizes isolated legacy jobs without mutating runtime code paths", () => {
@@ -322,12 +317,9 @@ describe("normalizeStoredCronJobs", () => {
322317});
323318324319expect(result.mutated).toBe(true);
325-expect(job.schedule).toEqual(
326-expect.objectContaining({
327-kind: "cron",
328-expr: "0 */2 * * *",
329-}),
330-);
320+const schedule = job.schedule as Record<string, unknown>;
321+expect(schedule.kind).toBe("cron");
322+expect(schedule.expr).toBe("0 */2 * * *");
331323expect(job.sessionTarget).toBe("main");
332324expect(job.wakeMode).toBe("now");
333325expect(job.payload).toEqual({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。