EP Agent Jobs
EP Agent Jobs runs AI agents on a schedule, from your site, whether or not anyone is at a computer. You define a job — when it runs, what to ask, which model, what it is allowed to touch, where the answer goes, and what it may cost — and the site takes it from there.
It rides the EP Cron heartbeat, so it needs no visitor traffic to fire and nothing stops when you close your laptop.
Published by ElmsPark Studio.
Overview
Section titled “Overview”Use cases:
- A Monday morning digest. Summarise last week’s bookings or orders and email it before you sit down.
- A watchdog. Check something daily and only speak up when it looks wrong.
- A recurring content chore. Draft the thing you rewrite every month, ready for editing rather than starting blank.
How it works
Section titled “How it works”- You create a job: schedule, timezone, prompt, model, allowed site actions, delivery channel and monthly budget.
- The EP Cron heartbeat wakes the scheduler and asks which jobs are due.
- Due jobs run, up to the per-heartbeat limit and the wall-clock limit per run.
- The result is delivered by email, Telegram or Buzz.
- The run is recorded, with history kept for as long as you choose.
Requirements
Section titled “Requirements”- PageMotor 0.9 or later
- EP Cron, providing the heartbeat that drives the scheduler
- EP Suite base class (bundled with the plugin)
- An Anthropic API key, and credentials for whichever delivery channel you use
Installation
Section titled “Installation”- Install and configure EP Cron first, and confirm its heartbeat is actually arriving. A scheduler with no heartbeat is silent rather than noisy — nothing runs and nothing complains.
ep-agent-jobs.zipcomes with an EP Suite licence — ElmsPark supplies it directly (see EP Suite plugins); after install it updates through your site’s Updates screen.- Upload via Plugins → Manage Plugins. Activate.
- Open Plugin Settings → EP Agent Jobs.
Settings
Section titled “Settings”| Setting | What it does |
|---|---|
| What site actions may an agent run? | The ceiling on what any job can do to your site. Set this deliberately; it is the main safety control. |
| Default email recipient | Where results go when a job does not name someone else. |
| Telegram chat ID / Buzz channel, relay URL, room | Credentials for the non-email delivery channels. |
| Default timezone for new jobs | So “9am” means what you expect. Each job can override it. |
| Jobs per heartbeat | How many due jobs may start per beat. Keeps a backlog from stampeding. |
| Wall-clock limit per run | Caps a single run that would otherwise hang. |
| Keep run history for | How long finished runs are retained. |
| Pause all agent jobs | A single stop switch for every job at once. |
The action ceiling is the setting that matters
Section titled “The action ceiling is the setting that matters”“What site actions may an agent run?” decides what an agent is permitted to do, not merely what you meant it to do. A prompt is not a permission boundary: an agent that misreads its instructions is still limited by this setting and by nothing else. Start restrictive and widen only when a job genuinely needs it.
Budgets
Section titled “Budgets”Each job carries a monthly budget, and the settings page shows the month’s spend so far. A job that has spent its budget stops rather than continuing quietly, which is the behaviour you want from something that runs unattended.
Troubleshooting
Section titled “Troubleshooting”Nothing ever runs. Almost always the heartbeat. Check EP Cron is active and its last heartbeat is recent; the plugin’s dashboard card reports a missing or stale pulse rather than assuming one.
Jobs run at the wrong time. Check the job’s timezone rather than the default, and remember that the schedule is evaluated when a heartbeat arrives, so a sparse heartbeat makes every job late.
A job stopped mid-month. Check its budget and the wall-clock limit before assuming a failure.
Changelog
Section titled “Changelog”- A busy or rate-limited Anthropic no longer fails a run so easily. When Anthropic says it is overloaded, too busy or limiting requests, a run now tries up to three times instead of two, and waits as long as Anthropic asks before trying again instead of a fixed three seconds.
- A run never waits past its own time limit. If Anthropic asks for a longer wait than the run has left, the run stops at once and its log says how long Anthropic asked to wait.
- Every other error is worded as before.
- Safer web fetching. When a job reads a web page, it now connects only to the address that passed the safety check, so a domain cannot switch to an address inside your own network halfway through.
- A clear warning when agents may change your site. While “What site actions may an agent run?” is set to Producer or Admin, the settings screen explains the extra care needed for jobs that also read web pages.
- Nothing to do after updating.
- Security fix: your keys and tokens are now stored encrypted. The Anthropic key, Telegram bot token, Buzz key and crawl token are encrypted on your site. Ones you saved earlier are encrypted the next time you open the admin. Nothing else changes.
- Settings language menu. The language menu in this plugin’s settings now lists only the languages it is actually translated into, plus English, so you can no longer pick a language that changes nothing.
- Section status. Each settings section shows whether that feature is switched on. On a site that also runs an older EP plugin, the section shows its plain title instead.
- Removes a function call that PHP 8.5 reports as deprecated, so it no longer fills your error log.
- Corrects the PageMotor 0.11.3 preparation shipped in 0.1.4. That release grouped this plugin’s API and MCP actions into families, but in a shape PageMotor 0.11.3 does not accept. On 0.11.3 the plugin would have registered none of its actions, and nothing on screen would have said so.
- This version uses the shape 0.11.3 expects, and keeps the earlier shape for sites still on an older PageMotor. One build serves both, so there is no order you have to update things in.
- Safe to install now. Nothing you can see changes.
- Prepares the plugin for PageMotor 0.11.3, which requires every plugin to group its API and MCP actions into named families. On that release an action declaring no family is refused silently, so without this update the plugin’s actions would stop being offered with nothing on screen to say why.
- Families exist so that an AI working on your site sees the related actions together instead of stopping at the first one it tries.
- Safe to install on your current PageMotor. No behaviour changed.
Fixes “Your session has expired. Please reload to ensure your security.” on PageMotor 0.11, which affected this plugin’s admin screens through the shared suite header’s language selector and brand-colour picker. Anonymous visitors were never affected.
The cause was one header attached twice rather than a real session problem. PageMotor 0.10 attached the CSRF header automatically for fetch and jQuery but not for a raw XMLHttpRequest, so the suite attached it by hand; 0.11 added a patch that attaches it for raw requests too. Attaching appends rather than overwrites, so the token went out doubled and never matched, and core answered before the handler ran. The fix reads core’s own marker on the request instead of comparing version strings, so the header is attached exactly once on either core. Nothing else changed.
PageMotor 0.11 hardening for the job action ceiling. Scheduled runs inject a token whose access tier comes from the action-ceiling setting, stored using the old read-only name. PageMotor 0.11 renamed that floor tier to open with no alias, and although 0.11 fails closed by coercing an unrecognised tier to open, jobs were working by coercion rather than by contract.
The dispatcher now reads the running core’s actual tier ladder and translates the stored name when the core uses the new vocabulary, rather than comparing version strings. Behaviour is identical on both cores and your stored settings are untouched.
Dashboard card readiness. The status pill now reads the real heartbeat timestamp rather than merely confirming the cron class loaded, so it shows red when no heartbeat has arrived and amber when one is stale.