# dsh-offpeak-job 🌙
English · 简体中文
**DeepSeek Harness 的谷时调度插件**——把对话留到更便宜的时段再跑,峰时可选先停,侧栏里还能一眼看到还在等的任务。 ## 📸 截图 | | | |---|---| |
| **⚙️ 峰谷设置** —— 按提供方配置:自定义谷时、峰时到了怎么办、夜里挂机时提权怎么处理 |
---
## ✨ 功能导览
### ⚙️ 按提供方配置峰谷
- 入口在 **设置 → 模型** 的每个提供方卡片里
- DeepSeek 可用[官方峰谷](https://api-docs.deepseek.com/zh-cn/quick_start/pricing/);也可自建多段谷时(每天 / 工作日 / 周末),支持跨夜(如 18:00–09:00)
- 不需要等待时,可整段关掉峰谷
- 可选:**进入峰时暂停,下一段谷时继续**——或让已开跑的任务穿过峰时跑完
- 可选:谷时提权策略——拒绝后继续 / 等你来批 / 自动同意(仅「谷时运行」会话)
### 💬 按会话选择运行时机
- 输入栏控件:**谷时运行** / **立即运行**(样式同访问模式;可在提供方峰谷设置里隐藏)
- 不在谷时窗口里时,消息先排着,会话保持空闲,不会一直转圈
- 等待条上的 **现在开始** 会立刻放出排队任务,但不会把会话改回「立即运行」
- 待发与待续在 Host 重启后仍会保留
### 📋 谷时总览
- 侧栏 Settings 上方的入口(全部提供方都关掉峰谷时会隐藏)
- 跨会话看板:等待谷时、暂停待续、需要你处理、会话不可用
- 有人在等窗口时,可在这里统一 **现在开始** 或放弃
---
## 一览
| | |
|---|------|
| 🧩 插件类型 | Cordis 插件——服务端路由 + Web 客户端,纯增量(不替换任何官方插件) |
| 🌙 管什么 | 「谷时运行」会话的发送准入;可选在窗口结束时暂停 |
| 💬 对话体验 | 会话内等待条;输入栏运行时机控件 |
| 📡 状态看板 | 侧栏谷时总览,角标标出需要留意的项 |
| 💾 状态存储 | `$DSH_HOME/offpeak-job/`(提供方时段、会话开关、待发/待续队列) |
| 🎨 界面 | TypeScript + React(宿主 external)+ CSS,跟宿主观感一致 |
---
## 快速开始
1. **安装**(二选一):
**A · 一行命令(推荐)** —— 直接安装 GitHub Release 的安装包,无需 Git:
```bash
dsh plugin --profile web add "https://github.com/ganningniang/dsh-offpeak-job/releases/latest/download/dsh-offpeak-job.tgz"
```
**B · 本地克隆(想改源码用)** —— `link:` 只接受本地绝对路径(路径不要带空格):
```bash
git clone https://github.com/ganningniang/dsh-offpeak-job.git
cd dsh-offpeak-job
npm install && npm run build
dsh plugin --profile web add "link:<克隆出来的 dsh-offpeak-job 仓库目录的绝对路径>"
# 例:克隆到 D:\tools 后 → dsh plugin --profile web add "link:D:/tools/dsh-offpeak-job"
```
两种方式 `add` 都会把 `dsh-offpeak-job` 注册进 profile 的 bundle 列表(写入 `~/.dsh`,可能需要授权确认);若提示找不到 `dsh` 命令,用 `npx @deepseek-ai/dsh` 代替。
2. **重启** DSH web 进程并刷新界面
3. **配置提供方**:**设置 → 模型** → 编辑某提供方 → **峰谷设置** → 选时段 / 结束策略 / 提权策略 → **保存**
4. **在会话里用**:输入栏选 **谷时运行**,正常发送即可——到下一段谷时再跑(等不及就点 **现在开始**)
---
## 架构
一个包同时包含**宿主 Cordis 插件**与 **Web 客户端**:
- **宿主**:`/api/offpeak-job/*` 路由——健康检查、提供方/会话配置、总览、放出 / 放弃 / 续跑冲突处理;在发送路径上拦住「谷时运行」任务,使其可以排队等待而不开成忙碌回合
- **客户端**:注入模型页的峰谷面板、输入栏运行时机、会话等待条、侧栏总览
- **持久化**:时段与排队写在 `$DSH_HOME/offpeak-job/`;Host 重启后恢复队列,并在会话 agent 再次可用时重新挂上到点放出
---
## 开发与测试
```bash
cd dsh-offpeak-job
npm install
npm run build # lib/index.js + lib/client.js
npm run check
npm run test:offpeak
```
- 请在本包目录内构建——产物是与 `cordis.patch.yml` 同级的 `lib/`
- 测试覆盖时段计算、等待落盘、提权策略、总览与文案冻结
---
## 常见问题
**Q:想重装 / 升到最新版?**
重跑安装命令(永远装最新 Release),装完重启 dsh web 并刷新:
```bash
dsh plugin --profile web add "https://github.com/ganningniang/dsh-offpeak-job/releases/latest/download/dsh-offpeak-job.tgz"
```
排队与峰谷配置在 `$DSH_HOME/offpeak-job/`,重装插件一般不会清掉它们。
**Q:运行时机控件是灰的 / 不见了?**
这个提供方关掉了峰谷(或选了「不限制」),或峰谷面板里关了「会话显示运行时机」。打开峰谷并保存;需要输入栏控件时再打开显示开关。
**Q:到了谷时,任务怎么没跑?**
电脑和 DeepSeek Harness 还得开着。合盖休眠、关掉 web 进程,排队不会自己醒来。重启之后,会话可用时,等待条 / 总览里一般还能看到原来的排队。
**Q:峰时暂停之后,长工具会从断点精确接着吗?**
不会。续跑是下一段谷时「继续这个任务」,不是把工具做到一半的现场完整冻住。你自己点了 **停止**,也不会自动续跑。
---
## 已知限制
- **谷时要真正跑起来,Host 必须还在线**
- 暂停再继续是跟进续跑,不是 mid-tool 断点快照
- 默认提权是 **拒绝后继续**(可按提供方改成等你审批或自动同意)
- 只有 **谷时运行** 会话守日历与谷时提权策略;**立即运行** 走平时流程
- 有待续时又发新消息,会先问你:先完成待续,还是丢掉待续
- 独立插件:不改 DeepSeek Harness 本体;宿主扩展点不够时,在插件内绕过或写明缺口
---
## 隐私
无遥测。配置与排队只落在本机 `$DSH_HOME/offpeak-job/`。除 DeepSeek Harness 本身的模型调用外,本插件不向外部上报。
---
## License
MIT