v0.25.1
Gate commands for scheduled tasks
Scheduled cron items can now carry a deterministic gate — a shell command that runs before each cycle spawns a thread, so cycles with "nothing to do" are skipped without burning an agent turn.
- Contract: exit
0fires the agent; any clean non-zero exit skips the cycle entirely (no thread, no message, no LLM call) while the schedule still advances. - Output piping: on a fire, the gate's stdout replaces a
{{gateOutput}}placeholder in the prompt (or is appended as aGate output:block, truncated to ~8 KB). - Config:
gateCommand(+ optionalgateTimeoutSeconds, default 30 / cap 120, andgateFailOpen, defaulttrue) onCronCreate; set/clear later viaCronUpdate(gateCommand/gateTimeoutSeconds/gateFailOpen/clearGate). - Fail-open: if the gate can't be evaluated (timeout or spawn error) it fires anyway by default, so a broken check never blackholes a real cron. Set
gateFailOpen: falseto fail closed. - Env: gate runs in the item's
cwdwithCRON_LAST_RUN_MS,CRON_ITEM_ID,CRON_ITEM_NAME. - Observability: skip reasons surface via
lastSkipReasoninCronList; Settings → Scheduled tasks flags gated items inline (e.g. "Every 5 minute(s) · gated"). - Desktop only (inert on mobile, where a configured gate simply fires).
Shipped in #362.
Full Changelog: v0.25.0...v0.25.1