Narrow MCP schedule cadence handling to blank values

This commit is contained in:
Mohamed Boudra
2026-05-26 20:15:12 +07:00
parent 1d2c8b1648
commit 3eb1ba7d73
2 changed files with 13 additions and 38 deletions
@@ -1728,7 +1728,7 @@ describe("create_schedule MCP tool", () => {
); );
}); });
it("accepts blank cron placeholder when every is provided", async () => { it("accepts a blank cron field when every is provided", async () => {
const { agentManager, agentStorage } = createTestDeps(); const { agentManager, agentStorage } = createTestDeps();
const create = vi.fn(async (scheduleInput: CreateScheduleInput) => const create = vi.fn(async (scheduleInput: CreateScheduleInput) =>
createStoredSchedule(scheduleInput), createStoredSchedule(scheduleInput),
@@ -1757,17 +1757,12 @@ describe("create_schedule MCP tool", () => {
it.each([ it.each([
{ {
label: "omit cron placeholder", label: "whitespace cron field",
input: { prompt: "say hello", every: "10m", cron: "/__omit__", provider: "codex" },
cadence: { type: "every", everyMs: 600000 },
},
{
label: "whitespace cron placeholder",
input: { prompt: "say hello", every: "10m", cron: " ", provider: "codex" }, input: { prompt: "say hello", every: "10m", cron: " ", provider: "codex" },
cadence: { type: "every", everyMs: 600000 }, cadence: { type: "every", everyMs: 600000 },
}, },
{ {
label: "blank every placeholder for cron cadence", label: "blank every field for cron cadence",
input: { input: {
prompt: "say hello", prompt: "say hello",
every: "", every: "",
@@ -1777,17 +1772,7 @@ describe("create_schedule MCP tool", () => {
cadence: { type: "cron", expression: "*/10 * * * *" }, cadence: { type: "cron", expression: "*/10 * * * *" },
}, },
{ {
label: "omit every placeholder for cron cadence", label: "whitespace every field for cron cadence",
input: {
prompt: "say hello",
every: "/__omit__",
cron: "*/10 * * * *",
provider: "codex",
},
cadence: { type: "cron", expression: "*/10 * * * *" },
},
{
label: "whitespace every placeholder for cron cadence",
input: { input: {
prompt: "say hello", prompt: "say hello",
every: " ", every: " ",
@@ -1796,7 +1781,7 @@ describe("create_schedule MCP tool", () => {
}, },
cadence: { type: "cron", expression: "*/10 * * * *" }, cadence: { type: "cron", expression: "*/10 * * * *" },
}, },
])("normalizes create_schedule cadence placeholder for $label", async ({ input, cadence }) => { ])("normalizes create_schedule blank cadence input for $label", async ({ input, cadence }) => {
const { agentManager, agentStorage } = createTestDeps(); const { agentManager, agentStorage } = createTestDeps();
const create = vi.fn(async (scheduleInput: CreateScheduleInput) => const create = vi.fn(async (scheduleInput: CreateScheduleInput) =>
createStoredSchedule(scheduleInput), createStoredSchedule(scheduleInput),
@@ -1847,8 +1832,8 @@ describe("create_schedule MCP tool", () => {
input: { prompt: "say hello", provider: "codex" }, input: { prompt: "say hello", provider: "codex" },
}, },
{ {
label: "placeholder-only cadence fields", label: "blank cadence fields",
input: { prompt: "say hello", every: " ", cron: "/__omit__", provider: "codex" }, input: { prompt: "say hello", every: " ", cron: "", provider: "codex" },
}, },
])("still rejects create_schedule when $label", async ({ input }) => { ])("still rejects create_schedule when $label", async ({ input }) => {
const { agentManager, agentStorage } = createTestDeps(); const { agentManager, agentStorage } = createTestDeps();
@@ -1944,7 +1929,7 @@ describe("update_schedule MCP tool", () => {
}); });
}); });
it("accepts blank cron placeholder when updating every cadence", async () => { it("accepts a blank cron field when updating every cadence", async () => {
const { agentManager, agentStorage } = createTestDeps(); const { agentManager, agentStorage } = createTestDeps();
const stored = makeStoredSchedule(); const stored = makeStoredSchedule();
const update = vi.fn(async (_input: UpdateScheduleInput) => stored); const update = vi.fn(async (_input: UpdateScheduleInput) => stored);
@@ -1970,31 +1955,21 @@ describe("update_schedule MCP tool", () => {
it.each([ it.each([
{ {
label: "omit cron placeholder", label: "whitespace cron field",
input: { id: "schedule-1", every: "10m", cron: "/__omit__" },
cadence: { type: "every", everyMs: 600000 },
},
{
label: "whitespace cron placeholder",
input: { id: "schedule-1", every: "10m", cron: " " }, input: { id: "schedule-1", every: "10m", cron: " " },
cadence: { type: "every", everyMs: 600000 }, cadence: { type: "every", everyMs: 600000 },
}, },
{ {
label: "blank every placeholder for cron cadence", label: "blank every field for cron cadence",
input: { id: "schedule-1", every: "", cron: "*/10 * * * *" }, input: { id: "schedule-1", every: "", cron: "*/10 * * * *" },
cadence: { type: "cron", expression: "*/10 * * * *" }, cadence: { type: "cron", expression: "*/10 * * * *" },
}, },
{ {
label: "omit every placeholder for cron cadence", label: "whitespace every field for cron cadence",
input: { id: "schedule-1", every: "/__omit__", cron: "*/10 * * * *" },
cadence: { type: "cron", expression: "*/10 * * * *" },
},
{
label: "whitespace every placeholder for cron cadence",
input: { id: "schedule-1", every: " ", cron: "*/10 * * * *" }, input: { id: "schedule-1", every: " ", cron: "*/10 * * * *" },
cadence: { type: "cron", expression: "*/10 * * * *" }, cadence: { type: "cron", expression: "*/10 * * * *" },
}, },
])("normalizes update_schedule cadence placeholder for $label", async ({ input, cadence }) => { ])("normalizes update_schedule blank cadence input for $label", async ({ input, cadence }) => {
const { agentManager, agentStorage } = createTestDeps(); const { agentManager, agentStorage } = createTestDeps();
const stored = makeStoredSchedule(); const stored = makeStoredSchedule();
const update = vi.fn(async (_input: UpdateScheduleInput) => stored); const update = vi.fn(async (_input: UpdateScheduleInput) => stored);
@@ -376,7 +376,7 @@ function normalizeScheduleCadenceArg(value: string | undefined): string | undefi
} }
const trimmed = value.trim(); const trimmed = value.trim();
if (!trimmed || trimmed === "/__omit__") { if (!trimmed) {
return undefined; return undefined;
} }