deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
zhengjy01/dsh-task-dispatcher
Task dispatcher for DeepSeek Harness: use TickTick (滴答清单) as the daily task dispatcher — a cordis timer pulls today's due tasks, writes them to the task file, and notifies (WeChat via ClawBot / flomo / macOS); optional auto-execute with result receipts
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:zhengjy01/dsh-task-dispatcher
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
Use TickTick (滴答清单) as DSH's daily task dispatcher: a cordis timer pulls today's due tasks from the configured source list (default In progress), writes them to today's task file, and notifies via WeChat (ClawBot), flomo, or macOS (configurable). The agent reads the file, works through the items, and writes results back to TickTick with ticktick_complete.
Reuses the already-installed
dsh-ticktickplugin (its data layer + OAuth credentials in~/.dsh/dsh-ticktick.json) — no duplicate configuration.
ctx.interval polls every minute and dispatches when the configured interval (minutes) has elapsed; 0 disables the timer; dispatcher_run dispatches manually anytime.In progress list (projectName / projectId configurable); dueMode=today pulls due-today/overdue + undated, dueMode=all pulls all incomplete.~/.dsh/dsh-task-dispatcher/today-tasks.md).notifyResult, on by default): every auto-executed task pushes a SHORT outcome message (OK/FAIL + title + a one-line result, or the failure reason such as a worker timeout) as soon as its worker settles, plus a compact batch tally when a pass runs more than one task - a run reports back by itself instead of relying on the worker calling dispatcher_report. The summary is the worker's stdout final answer (progress/reasoning go to stderr), stripped of ANSI and the DONE marker and capped at 220 characters.notifyWechat (WeChat, relayed through the local DSH-WeChatClawBot gateway; the recipient is auto-detected) + notifyFlomo (reuses ~/.dsh/dsh-flomo.json) + notifyMac (osascript); a repeated pull with no new tasks stays silent./send (default http://127.0.0.1:51235), which relays it to the WeChat account that scanned the QR code. The plugin never talks to WeChat directly and stores no WeChat credentials. The recipient defaults to the userId recorded in the ClawBot state dir (~/.dsh-wechat, override with DSH_WECHAT_HOME) under accounts/<botId>.json, or can be set explicitly with wechatTo; long bodies are split into 1200-character chunks. An unavailable channel only marks that channel as failed — it never fails the dispatch.dsh --profile headless session (serial, one task per session); success writes back to TickTick via ticktick_complete; failed tasks wait out the retry cooldown.dispatcher_config / the settings panel. It used to be a hardcoded 10 minutes, which killed long-but-healthy tasks and reported them as failures.cheapMode, off by default): when on, auto-execution only starts during DeepSeek's off-peak (discounted) hours; during peak it queues tasks to the next off-peak start (cheapStrategy=wait) or skips the round (skip). The gate sits strictly before a worker is spawned — pull cadence, filtering and serial execution are untouched; off means 100% legacy behaviour. Official schedule (peak/off-peak pricing since 2026-08-17): peak = Mon–Fri 09:00–12:00 and 14:00–18:00 Beijing time; everything else is off-peak (~half price). The windows are not hardcoded: cheapPreset (official-2026 / legacy-utc old UTC 16:30–00:30 / custom) + peakWindows + cheapTimezone. Queued tasks and nextCheapStartAt are persisted, so a DSH restart loses nothing; dispatcher_run honours cheap mode by default and accepts ignoreCheapMode: true to bypass it. Notifications distinguish “queued for the HH:MM off-peak window” from a normal run.~/.dsh/storages/workspace.json); empty = home dir.idleMinutes), per-session top-level cap, and the launchd check interval - and shows the queue, the whole-harness idle time, timer state and the last flush result. Buttons: save thresholds, flush now, force flush, reload timer. The control plane only reads the queue file and drives the script/timer; the writing itself stays in the standalone script + launchd, so a flush still happens while DSH is closed, and no write logic is duplicated between the two halves. Routes: GET /api/dsh-task-dispatcher/deferred, POST .../deferred/{config,flush,timer}.dispatcher_status / dispatcher_config / dispatcher_run / dispatcher_report + a Web settings panel.Requires DeepSeek Harness ≥ 0.1.5-rc.1 (declared as dsh.engines.dsh in the package manifest, so the DSH plugin marketplace can report it) and is verified against 0.1.5-rc.1. This build carries the DSH 0.1.5 adaptations: the strict tool-result contract (lossless-JSON snapshot, additionalProperties: false schema validation, and output.render returning ContentBlock[]) plus executable resolution that survives a launchd-started host whose PATH is only /usr/bin:/bin.
# from npm (published package)
dsh plugin --profile web add dsh-task-dispatcher
# or local development
dsh plugin --profile web add link:/path/to/dsh-task-dispatcher
# restart dsh web to activate
Current release: v0.5.0 (CHANGELOG · Releases · npm).
pnpm install
pnpm build && node tests/smoke.mjs
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。