dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
这是会话内的延迟发送功能,不是单次自动化任务。消息保存到插件自己的持久化队列,到期后通过 DSH 普通会话发送接口提交原始文本。
不调用 Schedule,不创建自动化任务,不发送 [SCHEDULE REMINDER] 包装。 开发阶段不读取、不迁移、不清理旧版 Schedule 数据。
00:05、01:30。消息到期、编辑、取消和立即发送共享串行操作队列,避免相互竞争产生重复提交。编辑期间若消息已经到期提交,界面保留编辑草稿,但不能把已提交消息改回未发送状态。
0–8760,分钟 0–59,只接受数字;无效或越界输入不会写入。1:5 → 01:05。↑/↓ 调整当前段,到边界停止;左右方向键切换段。00:00 不可发送,不会退化成立即发送。先按 DSH 原流程选择工作区,使新会话输入框可编辑。第一条消息即可直接延迟发送,无需先发送即时消息。
入队后立即发布摘要标题(延迟 · 消息摘要),保存会话创建记录并同步原生 engagement 状态;同时后台发起一次专用的 session-title 模型请求,生成正式标题。该辅助请求只生成标题,不提交普通聊天消息、不执行问题、不伪造轮次,也不阻塞消息入队。优先沿用会话已有请求的模型配置,否则使用当前默认模型;失败或超过 6 秒保留摘要标题。
已有标题不覆盖;生成期间手动改名会优先保留用户标题。该会话不会继续作为“新会话”占位被复用;取消消息、刷新或重连后仍保持已创建状态。
适用于已检查的 DSH 0.2.0-rc.2,不再依赖 Schedule bundle。同时支持两种运行形态,二者插件完全一致,只是配置互相独立:
desktop,目录 %USERPROFILE%\.dsh\profiles\desktop。dsh web):配置名 web,目录 %USERPROFILE%\.dsh\profiles\web。插件服务端只用 webServer 与 connection,没有桌面专属依赖;客户端依赖 dsh-client-ui-conversation、dsh-client-ui-renderer、dsh-client-ui-session,三者都由 @deepseek-ai/dsh-web-app 提供。因此装到哪个配置就在哪个形态生效:只装 desktop 时 dsh web 里不会出现延迟功能,反之亦然。
开发目录中的 Host ESM 模块可能被运行时缓存,停用/启用并不保证重新导入修改后的源码,插件页显示的版本号也不代表正在执行的代码。更新请直接重新安装本次 tgz,而不是仅切换开关。
独立队列改用 /api/wait-minute/outbox-v1,不回退到旧接口。响应包含 X-Wait-Minute-Engine: standalone-outbox-v1 和运行版本标识。客户端在任何修改前先做只读校验;旧实现、缺失标识或错误路径将被阻止,不继续创建消息或自动化任务。实际验证必须检查运行接口标识,不能仅查看源码或 bundle 版本。
在 DSH 插件安装入口选择最新 Release 的附件 dsh-wait-minute-<版本>.tgz(当前为 dsh-wait-minute-1.0.2.tgz),或输入项目绝对目录(例如 C:\code\wait-minute)。如果安装工具返回 restart-required,必须完全退出并重新打开 DSH,不能只刷新网页。安装包包含客户端构建产物,无需第三方安装脚本。
启动成功后,GET /.well-known/wait-minute 返回只读的引擎、运行版本和 ready: true,不包含消息、会话、令牌或其他私有信息。该端点在两个存储单元成功打开后才注册,可用于真实启动核验。私有 /api 请求会先被统一身份认证拦截,未经认证的 401 不能证明某条路由存在或后端版本已更新。
dsh plugin --profile <配置名> <参数...> 会把参数原样转发给该配置目录里的 pnpm,因此 add、remove、install、why 都可用。把下面命令里的 desktop 换成 web,就是给浏览器版安装。
# 首次安装或升级到新版本:按标签定位附件
dsh plugin --profile desktop add https://github.com/TZDXF/dsh-wait-minute/releases/download/v1.0.2/dsh-wait-minute-1.0.2.tgz
dsh plugin --profile web add https://github.com/TZDXF/dsh-wait-minute/releases/download/v1.0.2/dsh-wait-minute-1.0.2.tgz
# 重复安装或回退同一版本:先下载附件,再按本地文件安装(可反复执行)
Invoke-WebRequest -Uri https://github.com/TZDXF/dsh-wait-minute/releases/download/v1.0.2/dsh-wait-minute-1.0.2.tgz -OutFile "$env:LOCALAPPDATA\dsh-wait-minute\dsh-wait-minute-1.0.2.tgz"
dsh plugin --profile desktop add "file:$env:LOCALAPPDATA\dsh-wait-minute\dsh-wait-minute-1.0.2.tgz"
# 开发调试:直接从项目目录安装(link)
dsh plugin --profile desktop add C:\code\wait-minute
# 查看当前安装来源与版本,以及卸载
dsh plugin --profile desktop why dsh-wait-minute
dsh plugin --profile desktop remove dsh-wait-minute
安装或更新后必须完全退出并重新打开:桌面应用要完全退出后重开,dsh web 要停掉原进程重新启动。插件页显示的版本号不代表运行时已重新导入新代码。已经装好的配置只需 dsh plugin --profile <配置名> install 核对,正常输出 Already up to date。
地址必须带版本标签,不要写成 releases/latest/download/...。 附件文件名含版本号,latest 只在「文件名里的版本恰好就是当前最新版」时可用:本仓库现在 latest/download/dsh-wait-minute-1.0.2.tgz 返回 200,而 latest/download/dsh-wait-minute-1.0.1.tgz 直接 ERR_PNPM_FETCH_404。一旦发布 v1.0.3,任何写死 latest/...1.0.2.tgz 的命令都会失效;而没有版本号的固定地址又永远命中同一 specifier,add/update 都只回 Already up to date,无法升级。按标签取地址则两者都成立。
已知问题:缓存的附件地址无法被重新解析。 pnpm 11.7.0 在该地址已进入本地 store 缓存时(输出里的
reused 1, downloaded 0)会产出不带integrity的解析结果,随后报ERR_PNPM_MISSING_TARBALL_INTEGRITY;--force、store prune都无效(pnpm store prune保留仍被配置引用的条目)。触发条件是当前配置需要全新解析一个已缓存的地址:全新配置装同一版本、或remove后再add都会失败,而已装好的配置重复执行add/install会先命中Already up to date、不受影响。升级到新版本是全新地址,必然真正下载,因此始终正常。受影响的场景请用上面的本地附件方式。
wait_minute_outbox,会话创建记录位于 wait_minute_created_sessions,不出现在自动化任务管理中。^[a-z][a-z0-9_]*$。插件采用合法的单元名称,并显式等待 storage.backend.json 注册就绪。src/outbox.js:独立持久化消息队列、到期计时、编辑/取消/立即发送及失败恢复。src/index.js:通过 DSH Connection 鉴权保护的 JSON API。scripts/build.mjs:无第三方构建依赖的客户端打包器。使用 DSH 普通 sessionController.prompt,以 mode: queue 发送 {type: text, text: 原文}。当前运行时缺少公开的 pre-submit/delayed-engagement 接口,因此 composer 拦截和客户端 engagement 桥接按已检查版本固定;不修改 DSH 安装文件,其他版本需重新验证。
node scripts/build.mjs
node --test test/*.test.mjs
126 项自动测试覆盖独立队列不访问 Schedule、原文发送、到期/立即发送竞争去重、编辑时刻、取消、持久化故障、重启恢复、会话隔离、内联编辑、分段时间、原生队列式折叠与行操作、侧栏状态汇总及过期响应保护、即时标题与后台生成/超时/改名保护。测试使用模拟存储、时钟、消息接收接口和 UI 事件,不等同于真实浏览器点击与实际模型执行的完整端到端测试。
v* 版本标签时校验标签与 package.json 版本一致,再构建、测试、打包 dsh-wait-minute-<版本>.tgz,上传构建产物并创建 GitHub Release。标签与 package.json 的 version 必须一致(v1.0.2 ↔ 1.0.2),标签提交还必须位于 master 历史中;否则发布在构建前失败,且不产生 Release。接口回显的运行版本号直接读取 package.json,因此发布时只需修改包版本。完整步骤、版本号规则与失败处理见 .github/RELEASE.md。
本项目使用 MIT 许可证,完整条款见 LICENSE。