Per-project scheduled prompts run as fresh headless agent sessions, with one-time, interval, and cron schedules plus durable run history.
Install
# from npm (prebuilt)
dsh plugin --profile web add @opendsh/dsh-plugin-scheduled-tasks
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:Ceelog/dsh-plugins#path:/src/plugins/dsh-plugin-scheduled-tasks
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
DSH web plugin: per-project scheduled tasks with prompts. Create a task in the sidebar (⏰ 定时任务), give it a prompt, and the plugin runs that prompt on schedule — as a fresh headless agent session in the project directory — then records the outcome as durable run history.

What it does
- Project-scoped tasks — each task belongs to a project directory (a DSH workspace). The panel lists tasks for the selected workspace.
- Three schedule kinds
at— run once at an absolute time (strict RFC 3339 instant, or a local date/time with an explicit IANA time zone; DST gaps are rejected, overlaps pick the earlier instant).every— run on a fixed creation-anchored interval (≥ 5 minutes); missed intervals are never replayed, only the latest due occurrence runs.cron— run on a cron calendar rule (five/six/seven-field expression, e.g.0 9 * * 1-5, evaluated in an explicit IANA time zone, DST-aware).
- Prompt execution — on schedule, a brand-new agent session is created in
the project directory with the task's prompt and driven to quiescence (the
same drive pattern as
dsh --profile headless). The run session appears in the project's conversation list with a pinned title (⏰ <task name>) and stays resumable; the final assistant text is also captured into the run record. - Run history — status (
running/completed/failed), start/finish times, output (truncated at 20 KB), error messages; newest first, capped at 20 records per task (configurable). - Manual run-now — runs a task immediately without touching its schedule.
- Lifecycle semantics
- Runs only while the DSH web process is alive. After a restart, overdue
one-shots run once and are marked
overdue; overdueeverytasks run only their latest due occurrence. - One-shot
attasks finish after their single run;everytasks stay active and advance to the next anchor-aligned target.
- Runs only while the DSH web process is alive. After a restart, overdue
one-shots run once and are marked
Architecture
A dual-face npm package installed into the web profile:
| Half | Entry | Role |
|---|---|---|
| Server | lib/index.js |
Cordis plugin: opens the scheduled_tasks storage domain (ctx.storageDomain), mounts the task store, the scheduler (bounded timers, clock-rollback-safe wakes), the headless executor, and the ctx.tasks typert service. |
| Protocol | lib/typert.js |
Host TYPERT face (tasks/* endpoints), auto-registered by dsh-typert-loader. |
| Browser | lib/client.js |
React panel mounted into the sidebar.footer.action slot; calls the host through the installed remote.tasks namespace. |
The client↔server channel is the DSH typert protocol (the same mechanism
dsh-commands uses): strict zod codecs validate every argument and result on
both sides, and no session needs to exist for the panel to work.
Install
dsh plugin --profile web add @opendsh/dsh-plugin-scheduled-tasks
Development
pnpm --dir src/plugins/dsh-plugin-scheduled-tasks typecheck # tsc (TypeScript 7)
pnpm --dir src/plugins/dsh-plugin-scheduled-tasks test # vitest
pnpm --dir src/plugins/dsh-plugin-scheduled-tasks build # tsc emit + tsdown client bundle + loader wrapper
After changing sources, rebuild and re-sync the profile copy
(pnpm install inside the profile re-copies file: dependencies), then
restart dsh web — the plugin has no HMR channel.
Configuration
| Key | Default | Meaning |
|---|---|---|
maxConcurrentRuns |
2 |
Maximum concurrently running agent sessions across all tasks. |
keepRunsPerTask |
20 |
Run-history records retained per task (oldest pruned beyond the cap). |
Troubleshooting
Tool calls that fail with “Interrupted: interrupted” (underlying error
Cannot read properties of undefined (reading 'prepare')) are almost always a
duplicate @deepseek-ai/dsh-tools copy caused by declaring DSH packages in
dependencies instead of peerDependencies. See
docs/troubleshooting.md for the full write-up.
Limitations
- Schedules fire only while the web process is running (same posture as
dsh-schedule); there is no external wake-up when the process is down. - Each run consumes model tokens with the current default model — the panel says so explicitly.
- Run history is refreshed by polling while the panel is open (10 s interval); push updates are deferred work.
Links
More in this category
NanmiCoder/dsh-agent-teams★ 263
AgentTeams multi-agent teams.
icetomoyo/dsh_workflow★ 54
UltraCode-style multi-agent orchestration: a generatable, savable, governable, observable, resumable workflow layer.
btspoony/mstar-harness★ 43
Skill-driven harness/loop engineering workflow agent plugin.
titanwings/dsh-automation★ 32
Scheduled coding runs in fresh agent sessions with auditable history.
whyihaveyou/dsh-suite#plugin-team-board★ 19
Shared multi-agent task board (create/claim/transition/query) over a Cordis service key.
omdsh-dev/dsh-deep-research★ 10
Adaptive deep-research orchestrator built on the official workflow engine.