DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Schedule View — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins

@lijian-ui/dsh-schedule-view

Schedule View

基于 Cron 的 DeepSeek Harness (dsh) 定时任务插件:纯 UI 管理、零 LLM 工具、跨会话计时器、多级通知。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add @lijian-ui/dsh-schedule-view@0.1.1
README兼容性版本

兼容性与来源证明

Schedule View 以 @lijian-ui/dsh-schedule-view 发布,当前版本为 0.1.1。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
npm
Registry 更新时间
2026/8/27

版本

0.1.1stable
2026/8/27

相关插件

正在加载相关插件…

最新版
0.1.1
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
713.9 kB
文件数
8
Surface
web
许可证
MIT
发布源
npm
GitHub
★ 0
周下载
0
最近提交
2026/9/3
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 productivity-workflow 分类下经过校验的插件。

Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Web All@linxin666/dsh-web-allDSH Web UI 全家桶聚合插件:一键安装全部功能插件(task-board / git-graph / pet / remote-web-ui / web-ui-settings / skin-center / community-plugins / compat shim)。compat 桥接层已并入本包(src/client),无需独立 compat npm 包。Agent Teams@nanmicoder/dsh-agent-teamsAgentTeams for DeepSeek Harness:通过自然语言驱动多智能体团队协作(队长、成员、具有依赖关系的任务、消息传递),并在 Web GUI 中提供树状监视器Deepseek Ipptdeepseek-ipptiPolloWork PPT Studio 及其精选幻灯片模板,作为原生 DeepSeek Harness 对话视图。

README

dsh-schedule-view · Scheduled Task Plugin

English | 中文

A cron-based scheduled task plugin for DeepSeek Harness (dsh) desktop: create / edit / delete / fire-now tasks from the settings panel, with cross-session agent follow-up and multi-level notifications. Zero LLM tools — purely human-driven scheduling.

Features

FeatureDescription
7 Schedule TypesInterval / Daily / Weekly / Monthly / Yearly / Once / Cron
Cron ExpressionFull 5-field cron with live validation and human-readable preview ("every weekday at 09:00")
Cross-Session FireTimer lives at host process level; fires even when the target session is closed
Agent Follow-upInjects a user-role prompt (请根据系统指令开始执行任务。) into the target agent via followup
Execution LifecycleTracks delivered → running → completed/failed via session/event with AI reply excerpt
Multi-Level NotificationsPage toast (8s auto-dismiss) + WebAudio chime (zero files) + Electron desktop notification + unread badge
Model SelectionPer-task provider / model override, falls back to deployment default
Working DirectoryPer-task cwd binding for context-aware execution
Catch-Up PolicySkip missed windows or run once on next tick (for app restarts / sleep)
Zero LLM ToolsNo schema overhead — purely UI-driven, no schedule_* tools registered

Background

dsh's official @deepseek-ai/dsh-schedule plugin has several limitations:

LimitationOfficialThis Plugin
Schedule granularityafter_seconds / at / every_secondsFull cron + 7 types
Session scopeSession-local onlyCross-session (host-level timer)
NotificationsIn-chat onlyToast + chime + desktop + badge
UI managementNone (pure LLM tool)Full settings panel
LLM schema cost3 tools (schedule_create/list/delete)Zero tools

Installation

Prerequisites

  • DeepSeek Harness (dsh) desktop
  • Node.js >= 18

Install

dsh plugin add @lijian-ui/dsh-schedule-view

Local Development

# Enter the plugin directory
cd extensions/dsh-schedule-view

# Install dependencies
npm install

# Build
npm run build

# Watch mode
npm run watch

# Type check
npm run typecheck

Build output goes to lib/ and is automatically synced to node_modules/@lijian-ui/dsh-schedule-view via junction. Restart the desktop app after each build to load the new bundle.

Usage

  1. Open dsh desktop
  2. Navigate to Settings → Scheduled Tasks
  3. In the task list:
    • Click New Task to create a scheduled task
    • Toggle the switch to enable/disable
    • Click Edit to modify schedule, prompt, or model
    • Click Fire Now to trigger immediately
    • Click Delete to permanently remove
    • Click Run History to view execution records

Task Fields

FieldRequiredDescription
TitleYesTask name
Schedule RuleYes7 types: interval / daily / weekly / monthly / yearly / once / cron
PromptYesInstruction injected into the target agent when fired
Target SessionYesThe session where the agent will receive the prompt
Working DirectoryNoBound cwd for the task's agent (absolute path)
ModelNoProvider/model override; falls back to deployment default
TimezoneNoLocal timezone for cron resolution (default: system tz)

Schedule Types

TypeExampleDescription
IntervalEvery 60 minutesFixed interval in minutes
Daily09:00 every dayWall-clock time
WeeklyMon, Wed, Fri at 09:00Selected weekdays
Monthly1st day of month at 09:00Day of month (1-31 or last day)
YearlyJanuary 1 at 09:00Month + day
Once2026-09-01T09:00:00One-shot, auto-disables after fire
Cron0 9 * * 1-5Full 5-field cron expression

Catch-Up Policy

When the app was closed or asleep and missed a scheduled window:

PolicyBehavior
SkipDrop the missed window, wait for next scheduled time
OnceRun once on the next tick to catch up (default for once-type tasks)

Execution Lifecycle

When a task fires:

delivered → running → completed/failed
StageTriggerWhat happens
Deliveredagent.followup succeedsHistory record created, desktop notification sent
Runninguser/message event matches injected messageIdAI reply excerpt captured, duration tracked
Completedturn/end eventFinal status, endReason, toast + chime notification
Failedturn/end with errorStatus marked failed, persistent toast, error chime
SkippedAgent not live at fire timeNo followup, skipped notification, history marked skipped

Technical Architecture

Directory Structure

extensions/dsh-schedule-view/
├── src/
│   ├── index.ts                    # Host entry (install settings section + start timer)
│   ├── remote.ts                   # Host RPC methods (list/create/update/delete/fireNow)
│   ├── timer-runtime.ts            # Core timer engine (cron parsing + tick polling + fire)
│   ├── schedule-core.ts            # Schedule computation (next-fire calculation)
│   ├── lifecycle-tracker.ts        # Session/event listener for run lifecycle
│   ├── notify.ts                   # Multi-level notifications (toast + chime + desktop)
│   ├── guarded.ts                  # Fault isolation wrapper (try-catch for all callbacks)
│   ├── types.ts                    # TimerTask, RunRecord, TaskSchedule types
│   ├── schema.ts                   # Config schema (schemastery)
│   └── client/
│       ├── index.ts                # Client entry (settings section registration)
│       ├── TimerSettingsSection.tsx # Main settings UI (list + form + history)
│       ├── client-i18n.ts          # i18n (zh/en)
│       ├── config-api.ts           # Client-side RPC wrapper
│       ├── model-catalog.ts        # Model selection UI
│       └── chime.ts                # WebAudio chime synthesis
├── lib/                            # Build output
├── cordis.patch.yml                # Bundle patch declaration
├── package.json
└── tsdown.config.ts

Host Side (src/)

ModuleResponsibility
index.tsPlugin bootstrap: install settings section, start timer, sync on config change
remote.tsRPC API: list / create / update / delete / fireNow / runs
timer-runtime.tsCron parsing, tick polling, agent followup injection, lifecycle tracking
lifecycle-tracker.tsListens to session/event, matches injected messageId, updates run status
notify.tsToast (React portal) + chime (WebAudio) + desktop notification (Electron IPC)
guarded.tsWraps all callbacks in try-catch; plugin failure never crashes the host
schema.tsConfig validation via schemastery

Client Side (src/client/)

ModuleResponsibility
index.tsRegisters settings section via ctx.slots.inject
TimerSettingsSection.tsxReact component: task list, create/edit form, run history panel
client-i18n.tsChinese / English translations
config-api.tsRPC client wrapper for host methods
model-catalog.tsModel selection dropdown UI
chime.tsWebAudio dual-tone chime synthesis (zero audio files)

Persistence

DataStorageNotes
Task definitionsdsh-settingsUI-editable, revision conflict protection
Execution historydsh-storage-domainStructured KV, capped at 500 records

Tick Polling Strategy

Uses setInterval tick polling (default 15s) rather than per-task setTimeout:

  • Avoids setTimeout's 2^31 - 1 ms (~24.8 days) ceiling
  • Restart recovery: recalculates nextFireMap from persisted tasks
  • Missed windows: caught on first tick after restart, handled by catch-up policy
  • Trigger precision: bounded by tickSeconds (acceptable for scheduled tasks)

Known Issues & Solutions

Session ID collision after restart

Issue: After desktop restart, the persisted sessionId in task config may collide with existing agent sessions, causing agents.create to fail with "session already exists".

Root Cause: sessionId was persisted to settings; on restore, the old ID clashes with the agent's own session log on disk.

Our Solution: sessionId is not persisted. On each fire, a fresh session is created via agents.create with a new UUID. The sessionId in config is transient — only used to track the live agent handle during a session's lifetime.

Stale agent handle after agent disposal

Issue: Agent is disposed externally (e.g. user closes session), but the runtime still holds a stale handle.

Our Solution: ensureAgent checks if the handle is stale (disposed or not in agents.list()). If stale, it disposes the handle and rotates the sessionId to create a fresh session.

ENOENT when session log file is deleted

Issue: User deletes the session log file while the agent is still alive; agent can't write logs.

Our Solution: agent/error listener detects ENOENT → disposes agent → rotates sessionId → creates a new session.

Archived sessions

Issue: dsh archives sessions by marking archivedSessionIds but doesn't dispose the agent. agents.get() still returns the agent, and followup executes normally but the user can't see it in the UI.

Our Solution: ensureAgent checks workspaceRegistry.archivedSessionIds. If archived, it disposes the agent and rotates sessionId to create a fresh session.

Model selection without preset mount

Issue: agents.create without a setup callback doesn't mount the standard preset, so the agent has no tools and the prompt assembly can't resolve {{provider}} / {{model}} variables.

Our Solution: All agents.create / agents.resume calls include a setup callback that mounts agentPresets ('standard') and installs model selection before the agent is published.

Internationalization

Supports Chinese and English. Translation files are in src/client/client-i18n.ts. Language follows the dsh desktop language setting.

Tech Stack

  • Language: TypeScript
  • Build: tsdown (rolldown)
  • Frontend: React 18
  • Cron Parsing: cron-parser (~30KB)
  • Human-Readable Cron: cronstrue
  • Config Schema: @deepseek-ai/schemastery
  • Settings Persistence: @deepseek-ai/dsh-settings
  • Storage: @deepseek-ai/dsh-storage-domain

License

MIT

Related Links

  • DeepSeek Harness (dsh)
  • Design Document