dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
会话全部结束、后台任务也安静下来后自动执行电源动作(关机 / 重启 / 休眠 / 睡眠 / 锁定 / 注销):插件每秒采样进程内会话,运行中的会话始终算「在忙」;后台任务检测是可配置项 considerJobs(默认开启,设置页直接显示当前计数);确认窗口后进入可取消倒计时,右下角浮窗卡片显示当前阶段与剩余秒数并支持拖动;开关不会随宿主重启保留(重启后一律回到关闭),任何会话新启动或点取消都会中止倒计时;拿不到 agents 服务时一律按「在忙」处理,绝不触发。仅支持 Windows(使用系统自带 shutdown / rundll32),其他平台除 none 外均降级为 none。
DSH 插件:开启后,等所有会话都结束(没有任何 Agent 在跑)并保持空闲,自动执行关机(也可选重启 / 休眠 / 睡眠 / 锁定 / 注销)。
English README: README.en.md
dsh plugin add liaoyuqing/dsh-shutdown-idle或从源码安装:
dsh plugin add link:/path/to/dsh-shutdown-idle空闲确认 秒,再进入 倒计时 秒。右上角(浮层右下角)在开启后会常驻一张小卡片,显示当前阶段与剩余秒数,并带「取消」按钮。按住卡片标题即可拖动:松手后位置写进浏览器 localStorage(键 dsh.shutdown-idle.pill.position),下次打开停在原处;拖动过程始终夹在视口内(留 8px 可见),窗口变小也会自动收回视野。从「取消」按钮上按下不会误触发拖动。
ctx.get('agents').list() 里存在 status === 'running' 的 Agent(与 dshmarket 的更新守卫同一判据)。这一条固定生效,不可关闭。ctx.get('jobs') 中 status === 'running' 的作业(含各存活会话名下的作业),即 DSH 界面里的「后台任务」;由配置项 considerJobs 决定是否检测,关掉后完全不再统计。agents 服务时按 不空闲 处理:宁可不执行,也不误关机。参数 · 默认 · 说明 动作 · shutdown · shutdown / restart / hibernate / sleep / lock / logoff / none(none = 只记录不执行) 空闲确认 · 20 秒 · 全部空闲后先确认这么久,避免回合间隙被误判为结束 倒计时 · 60 秒 · 可取消的执行前倒计时 必须观察到会话运行过 · 是 · 防止刚开启就执行 后台任务也算占用(considerJobs) · 是 · 关掉后完全不再检测后台任务(shell 作业)
设置页把这几项收在「什么算『还在忙』」区块里:会话在跑固定算忙,下面两个复选框是配置项。
初始值来自本包 cordis.patch.yml 的行 config;界面改动写入 /dsh-shutdown-idle/settings.json 并优先生效(删除该文件即回落到 patch 初始值)。
开关状态不持久化:宿主重启后一律是「关闭」,避免开机即误关机。
方法 · 路径 · 说明 GET · /dsh-shutdown/api/state · 开关、阶段、倒计时、运行中会话/作业 POST · /dsh-shutdown/api/config · { enabled?, action?, settleSeconds?, countdownSeconds?, requireActivity?, considerJobs? } POST · /dsh-shutdown/api/cancel · 取消倒计时并关闭开关 GET · /dsh-shutdown · 客户端半不可用时的兜底页面
动作命令是 Windows 自带的 shutdown / rundll32。非 Windows 平台上,除 none 外的动作会被降级为 none 并在界面标注,不会执行命令。
host.mjs — Host 半:状态机、HTTP 接口、命令派发、兜底页面。client.js — 浏览器半:设置页分区 + shell.overlay 浮层卡片(可拖动,useDraggable 负责指针捕获、边界夹取与位置持久化)。cordis.patch.yml — bundle 补丁:插入插件行与初始配置。升级宿主半代码后就地改 host.mjs 并同步 package.json 的 main / exports:config-only 热重载不会重新加载同一路径的模块,改完需要让 Loader 重新 import(重启该 profile,或临时改补丁行里该条目的 id 再改回)。