Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions scripts/release.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
"wangpuv@hotmail.com": "wangpuv",
"202622897+ticketclosed-wontfix@users.noreply.github.com": "ticketclosed-wontfix",
"wuxuebin1993@gmail.com": "victorGPT",
"teixeira.zeus@gmail.com": "teixeirazeus",
"211828103+julio-cloudvisor@users.noreply.github.com": "julio-cloudvisor",
"17778+kweiner@users.noreply.github.com": "kweiner",
"223516181+faisfamilytravel@users.noreply.github.com": "faisfamilytravel",
Expand Down
30 changes: 24 additions & 6 deletions tools/cronjob_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -446,9 +446,16 @@ def cronjob(
normalized = (action or "").strip().lower()

if normalized == "create":
if not schedule:
return tool_error("schedule is required for create", success=False)
canonical_skills = _canonical_skills(skill, skills)
if not schedule:
return tool_error(
"schedule is required for create. schedule must be a non-empty string "
"(e.g. '30m', 'every 2h', '0 9 * * *', or an ISO timestamp). "
f"Received: action=create, schedule={schedule!r}, "
f"prompt={prompt!r}, skills={canonical_skills!r} "
"— review your tool call and ensure schedule is included.",
success=False,
)
_no_agent = bool(no_agent)
# Job-shape validation differs by mode:
# - no_agent=True → script is the job; prompt/skills are optional
Expand Down Expand Up @@ -704,19 +711,30 @@ def cronjob(
"properties": {
"action": {
"type": "string",
"description": "One of: create, list, update, pause, resume, remove, run. When action=create, the 'schedule' and 'prompt' fields are REQUIRED."
"description": "One of: create, list, update, pause, resume, remove, run. "
"REQUIRED PARAMETERS per action: "
"create => schedule (REQUIRED) + prompt (unless skills is set); "
"list => no extra params needed; "
"update => schedule (REQUIRED) + job_id (REQUIRED); "
"pause/resume/remove/run => job_id (REQUIRED). "
"Always include schedule when action is create or update."
},
"job_id": {
"type": "string",
"description": "Required for update/pause/resume/remove/run"
},
"prompt": {
"type": "string",
"description": "For create: the full self-contained prompt. If skills are also provided, this becomes the task instruction paired with those skills."
"description": "REQUIRED for create (unless skills is set). The full self-contained prompt. If skills are also provided, this becomes the task instruction paired with those skills."
},
"schedule": {
"type": "string",
"description": "REQUIRED for action=create. For create/update: '30m', 'every 2h', '0 9 * * *', or ISO timestamp. Examples: '30m' (every 30 minutes), 'every 2h' (every 2 hours), '0 9 * * *' (daily at 9am), '2026-06-01T09:00:00' (one-shot). You MUST include this field when action=create."
"description": "REQUIRED for create/update (ALWAYS include this when action is create or update). "
"'30m', 'every 2h', '0 9 * * *', or ISO timestamp. "
"Examples: '30m' (every 30 minutes), 'every 2h' (every 2 hours), "
"'0 9 * * *' (daily at 9am), '2026-06-01T09:00:00' (one-shot). "
"CRITICAL: If you omit schedule on a create or update call, "
"the tool will reject the request."
},
"name": {
"type": "string",
Expand All @@ -733,7 +751,7 @@ def cronjob(
"skills": {
"type": "array",
"items": {"type": "string"},
"description": "Optional ordered list of skill names to load before executing the cron prompt. On update, pass an empty array to clear attached skills."
"description": "Optional ordered list of skill names to load before executing the cron prompt. On create, at least one of prompt or skills is required. On update, pass an empty array to clear attached skills."
},
"model": {
"type": "object",
Expand Down
Loading