DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

Quiet Hours — DeepSeek Harness 插件(DSH Plugin)
← Plugins
Q

dsh-quiet-hours

Quiet Hours

DSH 插件:将每次模型调用暂停,直到配置的暂停时间窗口结束,使工作自动暂停并恢复。

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

npx -y @deepseek-ai/dsh plugin --profile web add github:Samuel-Ku/dsh-quiet-hours#4d40858c13232d5aa2a90ac254967f0a26cdb461
README兼容性版本

兼容性与来源证明

Quiet Hours 以 dsh-quiet-hours 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
github
Registry 更新时间
2026/9/29

版本

0.1.0stable
2026/9/29

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
any
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/16
查看源码 ↗
README Badge

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

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

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

认领这个 Plugin →
报告问题
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录

相关插件

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

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 包。Deepseek Ipptdeepseek-ipptiPolloWork PPT Studio 及其精选幻灯片模板,作为原生 DeepSeek Harness 对话视图。Codex Ui@michengai/dsh-codex-uiDSH Codex UI — 为 DeepSeek Harness Web 提供 Codex 风格侧栏、工作区会话树、全局搜索和轮次导航Remotedsh-remoteDeepSeek Harness 的远程工作助手:连接 SSH(密码/密钥/代理/键盘交互/代理跳转),选择远程工作区,使用 22 个 rw_* 工具操作该工作区(包括 rw_edit/rw_stat/rw_mkdir/rw_remove/rw_move/rw_forward),具备冲突感知的镜像 sy

README

dsh-quiet-hours

A DeepSeek Harness plugin that parks every model call until a configured pause window is over, so a long task stops itself during expensive hours and continues on its own when off-peak starts.

Nothing is restarted and nothing is spent while parked: the turn stays open, the request has not been sent, and the task resumes from exactly the same place when the window ends.

How it hooks in

The gate sits on the llm/stream waterfall — the hook @deepseek-ai/dsh-llm describes as the "waterfall around every streaming model call (retry, replay, routing)". During a pause window the listener returns an async generator that does not start the underlying request until the window is over.

One contract detail is easy to get wrong, and this plugin is built around it: the listener must return an AsyncIterable<StreamChunk> synchronously, because the caller consumes the waterfall result without awaiting it. A promise there would break every model call. That is why the wait lives inside the generator body rather than in the listener, and test/probe.test.mjs asserts it directly.

function handler(options, next) {
  if (!inPauseWindow(Date.now(), config)) return next();
  return (async function* parked() {
    await waitUntilResume(config, options.signal);
    yield* next();
  })();
}

Tools are not gated. They cost no tokens, and the model call that would consume their output is parked anyway — gating them would only risk interrupting a half-finished side effect.

Windows

A window is a wall-clock interval in an IANA timezone, evaluated through Intl, so DST is the platform's problem rather than offset arithmetic's:

windows:
  - days: [mon, tue, wed, thu, fri]   # the day the window STARTS on
    from: "01:00"
    to: "04:00"
  • from < to — a same-day window; the start is inclusive, the end exclusive.
  • from > to — spans midnight and belongs to the day it starts on, so a Friday 22:00–06:00 window covers Saturday 00:00–06:00 and nothing on Sunday.
  • from == to — rejected at load; a zero-length window is always a mistake.

An unknown timezone, a malformed HH:MM, or an unknown weekday name fails the plugin mount with a message naming the offending entry, rather than silently never pausing.

Configuration

FieldTypeDefaultMeaning
enabledbooleantruefalse = never park
timezonestringUTCIANA zone the windows are written in
windowslist[]pause windows; empty means never park
maxSleepChunkMsnumber60000wake-up cadence while parked (keeps the plugin responsive to clock jumps and aborts)
scanCapMsnumber21 dayshow far the resume search looks before giving up and re-checking
auditFilestring~/.dsh/logs/quiet-hours.jsonlJSONL trail of park/resume events

Peak-pricing example — work parks during peak and resumes the instant off-peak starts:

- id: quiet-hours
  name: dsh-quiet-hours
  config:
    enabled: true
    timezone: UTC
    windows:
      - days: [mon, tue, wed, thu, fri]
        from: "01:00"
        to: "04:00"
      - days: [mon, tue, wed, thu, fri]
        from: "06:00"
        to: "10:00"
    auditFile: /home/me/.dsh/logs/quiet-hours.jsonl

Install

dsh plugin --profile web add /path/to/dsh-quiet-hours

The bundle's cordis.patch.yml inserts the quiet-hours entry; override its config by id in the profile's cordis.patch.yml (do not re-insert it — that fails with duplicate loader entry id).

For a path or link: install, keep the checkout under $DSH_HOME/profiles/ so Node resolves the @deepseek-ai/* peers from $DSH_HOME/profiles/node_modules.

A new plugin module only mounts on a DSH restart; afterwards config edits reload live under patchReload: live.

Audit trail

One JSONL line per park and per resume, at auditFile:

{"time":1790422374944,"event":"pause","resumeAt":1790433600000,"provider":"example-provider","model":"example-model","pauseWindows":"mon,tue,wed,thu,fri 01:00-04:00 | mon,tue,wed,thu,fri 06:00-10:00 (UTC)"}
{"time":1790433600012,"event":"resume","parkedMs":11225068,"provider":"example-provider","model":"example-model"}

event is pause, then resume (with parkedMs) or cancelled when the turn was aborted while parked.

Tests

npm install
npm test

25 tests in two layers:

  • test/logic.test.mjs — clock parsing, config validation, window containment across timezones, weekends, same-day and overnight windows, the resume search, and the wait loop driven by an injected clock so hours pass instantly.
  • test/probe.test.mjs — mounts the plugin on a real Cordis context and drives the llm/stream waterfall the way LlmRuntime.stream() does. It asserts pass-through outside a window, parking inside one, the "AsyncIterable, not a promise" contract, release on abort, gate removal on unload, and a loud mount failure on a bad timezone.

The devDependencies exist only so the tests run from a bare clone; at runtime the plugin resolves its @deepseek-ai peers from the DSH install.

Caveats

  • A parked call is a live promise, not durable state: restarting DSH, or ending the session, discards it. The task does not resume by itself after a restart.
  • Approvals and auto-answered questions go through the same waterfall, so a judge call raised during a pause is parked too. In practice that is consistent — a parked agent raises no new requests — but it is worth knowing.
  • The longest park is bounded only by your windows; the wake-up cadence means the plugin re-checks the clock once a minute, so a wall-clock change is noticed promptly.

License

MIT — see LICENSE.