DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
S

dsh-shutdown-hook

Shutdown Hook

dsh 统一退出屏障插件:唯一 SIGTERM/SIGINT 拦截点,其他插件注册退出前检查(drain/flush/落盘),退出时统一并行调度,全部完成才 process.exit。解决重启/停止时异步投递丢消息问题。

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

npx -y @deepseek-ai/dsh plugin --profile web add github:fatatalia/dsh-shutdown-hook#66a516379f01e5cd3ac44f010f34b07fd67accef
README兼容性版本

兼容性与来源证明

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

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

版本

0.1.0stable
2026/10/18

相关插件

正在加载相关插件…

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

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

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

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

认领这个 Plugin →
报告问题

相关插件

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

MarketdshmarketDeepSeek Harness 内的可视化插件市场——浏览、搜索并一键安装社区插件。· DSH 可视化插件市场:浏览、搜索并一键安装社区插件。Better Sidebardsh-better-sidebarBetter Sidebar for DSH — 在一列中提供文件树、编辑器、变更、任务和侧边聊天,并为每个对话单独显示。同时提供服务,供其他插件注册侧边栏标签页和文件查看器。Client Ui Git Graph@linxin666/dsh-client-ui-git-graph外部 dsh Web GUI 插件:空会话 Git 分支选择器和 Git 图,包含实际的主机端 Git 操作与防护,作为 dsh 配置文件包Ssh@linxin666/dsh-sshdsh Web GUI 的远程 SSH 操作:主机配置存储(~/.dsh/dsh-ssh.json,可从 ~/.ssh/config 导入)、支持跳板主机的持久化 ssh2 连接池、exec / PTY Web 终端 / SFTP 传输 / 本地端口转发隧道 / 集群执行

README

dsh-shutdown-hook

dsh 统一退出屏障插件:唯一 SIGTERM/SIGINT 拦截点,其他插件注册"退出前检查"(drain / flush / 落盘),进程退出时统一并行调度,全部完成才 process.exit(0)。

解决的问题

dsh 中 agent 回复经 iMessage 等渠道是异步投递的(assistant/message 事件 → 排队 → imsg 子进程)。进程被杀(重启 / 停止)时,未完成的投递直接丢失——表现为 Web 会话可见消息,但 iMessage 收不到。

本插件在进程层强制"退出前等投递完成":由插件统一拦截信号并调度检查,不依赖模型自觉调用工具、不依赖 agent 纪律。

工作原理

launchctl kickstart / stop / Ctrl+C
        │  SIGTERM / SIGINT
        ▼
┌─────────────────────────────────────────┐
│  dsh-shutdown-hook(唯一信号拦截点)       │
│  ┌─────────────────────────────────────┐ │
│  │ 检查注册表: name → { fn, timeoutMs }│ │
│  │  imessage-drain ← dsh-imessage 注册 │ │
│  │  xxx-flush       ← 未来插件注册     │ │
│  └─────────────────────────────────────┘ │
│  并行执行所有检查(各自超时 + 全局兜底)   │
│  记录耗时/超时/失败 → process.exit(0)     │
└─────────────────────────────────────────┘

用法(其他插件)

硬依赖模式(服务必在,shutdown-hook 缺失时插件不激活):

export const inject = ["shutdownHook"];  // cordis 保证本插件先加载

ctx.shutdownHook.register("imessage-drain", async () => {
  await core.drain();  // 等投递链清空
}, { timeoutMs: 5000 });

软依赖模式(推荐:独立插件不强绑,服务缺失时优雅降级,延迟加载/重载自动补注册):

// 不要 inject "shutdownHook"
let registered = false;
const register = (barrier) => {
  if (registered || !barrier) return;
  barrier.register("imessage-drain", async () => { await core.drain(); }, { timeoutMs: 5000 });
  registered = true;
};
register(ctx.get("shutdownHook"));  // 立即尝试(可能尚未加载)
ctx.on("internal/service", (name, value) => {  // 服务出现/注销事件
  if (name !== "shutdownHook") return;
  if (value) register(value);
  else registered = false;
});

服务 API:

方法说明
register(name, fn, { timeoutMs })注册退出前检查(超时默认 5000ms)
unregister(name)注销检查
list()当前已注册的检查名列表

调度逻辑

收到 SIGTERM/SIGINT
  → 幂等检查(多次信号只执行一次)
  → 并行执行所有检查(Promise.allSettled,互不阻塞)
  → 每个检查独立超时(默认 5s),全局 10s 兜底
  → 记录每个检查的耗时/超时/失败([sh] 日志)
  → process.exit(0)

边界

  • SIGKILL(kill -9)/ 进程崩溃:无法保证(进程直接死,任何方案都保证不了)
  • 检查超时:超时强制继续退出,避免进程悬挂
  • dsh 未来版本:若 dsh 核心自己注册 SIGTERM handler 并立即退出,本插件拦截会失效(当前 dsh 版本无)

已注册检查

插件检查名作用
dsh-imessageimessage-drain等 iMessage 投递链清空(重启不丢消息)

实战验证

  • 2026-08-28:两次 launchctl kickstart -k 重启均被拦截,imessage-drain 正常执行,重启前消息完整送达,新进程 2 秒内恢复。

日志示例

[2026-08-28 16:21:27] [sh] 收到 SIGTERM,执行 1 个退出前检查...
[2026-08-28 16:21:27] [sh] 检查完成: imessage-drain(17ms)
[2026-08-28 16:21:27] [sh] 退出前检查完成 1/1,总耗时 85ms,退出