@gehennawu/dsh-service
Service
DSH Web 运维面板:安全重启、健康监控、备份和 Linux 权限维护。
插件会安装到这里;不确定时保持 web。
npx -y @deepseek-ai/dsh plugin --profile web add @gehennawu/dsh-service@1.9.2



@gehennawu/dsh-service
DSH Web 运维面板:安全重启、健康监控、备份和 Linux 权限维护。
插件会安装到这里;不确定时保持 web。
npx -y @deepseek-ai/dsh plugin --profile web add @gehennawu/dsh-service@1.9.2







Service 以 @gehennawu/dsh-service 发布,当前版本为 1.9.2。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。
DeepSeek Harness (DSH) Web 服务控制与运维插件
A service-control & operations plugin for DeepSeek Harness (DSH) Web.
功能 • 架构 • 安装 • 自动重启配置 • 平台支持 • 安全设计 • 常见问题 FAQ • 参与贡献 • 许可证
DSH Web 服务控制与运维插件:安全重启、版本管理与一键升级、健康诊断、模型用量统计、额度查询、备份管理、任务通知、技能管理、会话管理与 Linux 文件权限维护。
设置页「服务控制」面板六页导航:概览 · 模型统计 · 额度查询 · 健康诊断 · 维护 · 配置;其中「维护」聚合 会话管理 · 技能 · 子代理 · 备份维护 · 重启 五个子页,「配置」聚合 功能开关 · 任务通知 · 设置栏标签 三个子页。重启、额度查询、会话管理可另行开启设置页左列快捷入口(默认关闭;技能与子代理的左列入口已撤销)。
「插件 → 插件配置」提供十二个宿主级开关:健康诊断、模型统计、额度查询、备份维护、任务通知、技能管理、子代理模型、会话管理、移动端适配、模型厂家图标、右栏文件编辑、/healthz 探活(除移动端适配外默认开启)。全部热生效:关闭即隐藏界面、停止轮询并让宿主拒绝对应能力;概览与重启固定保留。
$DSH_HOME/dsh-service-config.json(多设备同步、启动自动拉取,本地缓存兜底),即时生效(服务控制面板永久锁定显示防锁死);额度卡的排序与显隐走同一份配置(quotaCards 区块,进入额度页时拉取)$DSH_HOME/dsh-service-config.json 单一文件(原子写入、0600),按功能分区块隔离——修改或清除某一区块绝不影响其他区块;大缓存(使用统计索引等)与加密凭据不在此文件内/restart 也可触发;检测到运行中工作时自动拒绝/restart 触发的重启同样自动刷新(页面加载时记下进程身份,重连后比对 instanceId,新进程上线即刷新)$DSH_HOME/dsh-service-config.json 的 quotaCards 区块(多设备同步、本地缓存兜底,区块间互不影响)| 供应商 | 数据来源 |
|---|---|
| DeepSeek 开放平台 | 官方余额 + 峰谷时段提示(忙/闲色带、换挡倒计时;高峰=周一至周五 09:00–12:00、14:00–18:00 UTC+8,不含中国法定节假日,周末与法定节假日全天空闲) |
| 智谱 GLM Coding Plan | 官方端点:5 小时滚动 / 每周 / MCP 月度三窗口 + 峰谷时段提示(忙/闲色带、换挡倒计时;高峰=周一至周五 14:00–18:00 UTC+8) |
| OpenCode Go | {baseURL}/usage(内置渠道未写 baseURL 时用注册表默认端点 https://opencode.ai/zen/go/v1) |
| OpenRouter | credits 已用百分比 |
| Kimi / 硅基流动 | 人民币余额 |
| StepFun 余额 | 官方 GET /v1/accounts(API key,com/ai 双域) |
| StepFun Step Plan | 控制台 BFF 订阅额度(Oasis-Token 登录令牌;5 小时/周窗口与 Credit 月池自动识别) |
| 小米 MiMo Token Plan | 控制台同源套餐额度(网页登录态 Cookie) |
| Command Code(command-goat) | 官方账号额度面 api.commandcode.ai/alpha/*(同 key 复用:余额 + 本周期花费 + 套餐 + 5 小时/周窗口) |
| CLIProxyAPI 部署 | 各 OAuth 上游账号官方剩余额度 |
$DSH_HOME/.credentials.yaml,热生效):普通适配填 API key,CLIProxyAPI 填管理密钥,小米填控制台 Cookie,StepFun Step Plan 填控制台令牌(Oasis-Token,Oasis-Webid 由令牌自动派生无需手填);Command Code 额度面与推理面同一把 key,无需另配备份记录列表为两行轻行(文件名主行 + 体积 · 时间次行,分隔线布局;会话管理列表同款)
创建会话、配置与插件 profile 清单的 .tar.gz 归档;会话经持久化层稳定快照(活跃 agent 写入不再导致失败),创建过程以单条连续进度条分阶段显示(复制/打包/校验/发布,带步骤号 1/4–4/4,复制阶段为真实百分比)
导出下载 / 导入上传 / 删除(两段式确认);不限份数、不自动清理;导入归档必须先通过与恢复相同的完整性检查
完整性检查:恢复前校验 gzip/tar、路径与条目类型,只接受 sessions、三份允许配置和 profiles/<name>/package.json;拒绝越界路径、链接、特殊文件、未知内容、损坏归档与非法 profile 清单
恢复预检:先生成 5 分钟有效的一次性计划,展示会话整体替换、配置覆盖/移除和 profile manifest 覆盖清单;最终确认前再次校验归档 SHA-256 与当前目标指纹,发生漂移则拒绝执行
恢复提交使用事务日志和回滚目录:会话整体替换,配置按快照精确替换,profile 只更新 package.json 并保留 node_modules/凭据/附件;成功后托管环境自动重启,手动启动环境提示用户手动重启
disable-model-invocation / user-invocable),约 200ms 热生效reasoning.efforts[].id),等级 ID 对宿主不透明;无等级声明的模型禁用下拉并提示子代理:cpa/gpt-5.6-luna (xhigh) · opencode-go/deepseek-v4-flash (max)——含回退命中、显式路由与继承来源,可直接核对自定义路由是否生效。行挂官方 conversation.composer.dock 槽位,独占官方统计行的下一行、不与统计胶囊/上下文圆环同行挤占;20s 刷新,不依赖回合数据(会话发生 compaction 折叠工具调用也照常显示),由宿主派发记录兜底,任何视图都能看到;可在 维护 → 子代理 页用独立开关关闭。记录存宿主内存(页面刷新不丢、进程重启即清),官方「指派子代理模型」开关关闭与否都不影响本功能$DSH_HOME/dsh-service-subagent-route.json(原子写入、0600),可一键重置MarkdownText,与聊天界面观感一致:代码块/列表/表格/数学公式、默认拒原始 HTML 与危险链接;老版本 DSH 未提供该渲染器时自动回落纯文本),连续系统事件与工具消息各自默认折叠为计数块(工具消息 = tool/call、tool/result 等 tool/* 事件,以及通篇只有工具调用的 assistant 消息——这类消息占真实长会话的多数,工具参数不会再铺满详情页),点击折叠行展开明细、再点收起;搜索命中落在折叠块内时该块自动展开并保持命中高亮origin=subagent 产品分类为准,delegationDepth 派生深度兜底老日志;仅 parentSession 的普通 fork 血统不算子代理);搜索行「仅子代理」复选框聚焦(与「仅搜归档」同行同款控件;正交于全部 / 仅归档叠加过滤,已删除视图不显示、切换视图时状态保留),批量选择态提供「选中子代理」一键把当前可见的子代理会话并入选择集(不清既有选择;视图里没有子代理行时该按钮隐藏),配合批量归档 / 删除快速清理;老版本插件宿主不下发该标志时列表照常,勾选筛选会明示「宿主较旧、未携带子代理标志」而非留一份无解释的空列表$DSH_HOME/dsh-service-sessions-deleted.json(原子写入、0600,仅标题/时间,不含内容、不可恢复)@container (width<=360px) 那条收起规则在 428~440px 机型上永远不会触发,故显式对齐官方窄容器形态left:0),挂在头部右侧动作槽上会整体右移出屏(实测 320100vw − 32px 封顶,两缘各留 16px;桌面 ≥1024px 官方几何逐字不变Accept-Encoding 自动 gzip/brotli),长会话历史首屏提速viewport-fit=cover 避让刘海、禁双击缩放、输入框 ≥16px 防 iOS 聚焦放大?dshsvc-mobile-debug=1 显示浮动诊断条(仅调试)ant-ling、radius 无对应品牌图形,走默认图标),并补充 ollama、vLLM、LM Studio、Perplexity、Cohere、火山引擎、豆包、混元、元宝、阶跃、商汤、百川、零一万物、Fal、Replicate、Midjourney 等常用渠道,共 62 张图形 / 76 条渠道映射;区域与计费变体(如 xiaomi-token-plan-*、qwen-token-plan-*)共用同一品牌图形opencode-goo → opencode、openrouter-f → openrouter、zai-coding-cn → 智谱、xiaomi-token-plan-cn → 小米、command-goat → Command Code 等;识别不到的(如 cpa 这类没有公开品牌图形的中转)自动回落官方默认图标cpa 还是自定义名都一样);撤销适配立即回落官方默认图标@1.95.0);小米图标取自 CC0 的 Simple Icons 纯 mi 标(LobeHub 那份是「Xiaomi / MIMO」两行文字组合标,15px 下糊成一团)。品牌图形版权归各厂商,正式对外使用前请查阅对应厂商的品牌条款Ctrl/Cmd + S 保存、「重新加载」「撤销保存」,以及一键「预览」返回官方渲染器.md、.js 等官方有专属渲染器的后缀默认仍是官方预览(Markdown / 代码…);只有官方没有专属渲染器、本来落到「纯文本」的后缀(如 .txt、.log、.conf)才默认进编辑器。官方预览未挂载(旧版 DSH)时整块静默不出现dsh-resource://file/session/<会话>/<路径> 资源地址,会话与工作区根由宿主解析,不接受自由路径;保存携带读取时的版本号,磁盘已被 Agent 或其他窗口改过就拒绝覆盖,由你选「重新加载(丢弃修改)」或「用我的内容覆盖」;只读沙箱会话只能预览GET / HEAD /healthz 返回空 200,其他方法返回 405插件是 Cordis 双半结构:Host 端(index.js) 承担一切能力与数据访问,Client 端(client.js) 只在浏览器渲染界面;两侧经 Typert JSON-RPC 通信,通道为单层绝对路径 /dsh-service,authority 一律 loopback。
flowchart TB
subgraph Client["🌐 Client 浏览器端 (client.js)"]
UI["设置页「服务控制」面板(六页导航 + 快捷入口)<br/>额度圆环 · 通知铃铛 · 移动端适配"]
end
subgraph Host["⚙️ Host 服务端 (index.js)"]
RPC["Loopback RPC · /dsh-service<br/>version / check-update / restart / quota / skills / backup"]
SPAWN["受控 spawn<br/>chmod / chown / npm 升级"]
end
subgraph DSH["🚀 DSH 核心运行时(只读消费)"]
CORE["agents · jobs · terminals · sessions<br/>sessionQuery · skills · credentials"]
WEB["webServer 路由<br/>GET/HEAD /healthz"]
end
subgraph OS["💾 宿主机与外部"]
PM["进程管理器<br/>Docker / systemd / pm2"]
FS["$DSH_HOME<br/>配置 / 备份 / 凭据 / 技能索引"]
REG["npm registry"]
QUOTA["上游额度 API"]
end
UI -- "Typert JSON-RPC(loopback)" --> RPC
RPC --> CORE
RPC --> SPAWN
RPC --> REG
RPC --> QUOTA
RPC -- "process.exit(42)" --> PM
SPAWN --> FS
MON["外部监控<br/>Uptime Kuma / Docker / K8s"] -- "GET /healthz" --> WEB
关键契约:
/dsh-service loopback channel 暴露;webServer 路由只返回不含信息量的状态码process.exit(42):插件只发退出信号,由外层进程管理器拉起;没有管理器时重启无保障| 方式 | 命令 |
|---|---|
| npm(推荐) | dsh plugin --profile web add @gehennawu/dsh-service |
| GitHub | dsh plugin --profile web add github:gehennawu/dsh-service |
| 本地开发 | dsh plugin --profile web add link:/path/to/dsh-service |
安装或更新后重启 DSH Web:
dsh web
打开 DSH Web 设置页,进入服务控制。
插件只发送退出信号,不负责拉起进程;没有进程管理器时重启会直接停止 DSH Web。
插件以被动信号(环境变量、/.dockerenv、/proc/1/cgroup、终端 TTY)判断进程管理器:检测到 Docker/systemd/pm2/supervisord/Kubernetes 时照常自动重启;都没有且 stdin/stdout 为交互终端时视为「疑似手动启动」——健康诊断黄色标注、一键升级改为保持运行并提示手动重启。启发式无法覆盖输出重定向、NSSM/WinSW 等场景,可用 DSH_SERVICE_RUNTIME_ENV=managed|manual 显式声明。
services:
dsh:
restart: unless-stopped
[Service]
ExecStart=/usr/local/bin/dsh web --host 127.0.0.1
Restart=on-failure
RestartSec=2
pm2 start "dsh web --host 127.0.0.1" --name dsh-web
| 环境 | 插件功能 | 重启后自动拉起 | 验证状态 |
|---|---|---|---|
| Linux + Docker Compose | 支持 | 配置 restart policy 后支持 | 已验证 |
| Linux + systemd / pm2 | 预期支持 | 由进程管理器负责 | 未单独验证 |
| macOS / Windows + pm2 等 | 代码未限制 | 由进程管理器负责 | 未验证 |
直接运行 dsh web | 支持 | 不支持 | 预期行为 |
运行要求:Node.js >=22,DSH Web 能加载 Host 与 Client 两半插件。更新检查需访问 registry.npmjs.org;网络失败不影响其他功能。
DSH 适配口径:已适配 DSH 0.1.6-alpha.2——会话格式 V3(system/message 入史、旧 PTC 词汇更名,详情视图自动归档系统事件)、sessionPersistence handle 化(用量增量、标题缓存、诊断计数全部按新公共面 list/open/read/close 走)、官方右栏替代详情列(移动端右缘手势直接驱动 ctx.layout.openRightbar/closeRightbar)、官方 turn-process 对象化(子代理回合认领双形态兼容)、移动端底行触发钮双哈希兼容、子代理回合尾模型行 list 槽位自适应兼容、新插件管理页 plugins.bundle.config 槽位注入、会话详情打开接入 uiWorkspace 降级链路。旧版 DSH(>=0.1.1-rc.2)保持兼容:新旧两套 persistence/布局 seam 按运行时能力探测双形态走,旧宿主上针对新结构的适配项天然不生效(纯展示,无功能损失)。注意:升级后以 V3 格式写入的会话日志无法被旧版 DSH 读取——备份不可跨版本降级恢复。版本卡常驻显示「适配 DSH 0.1.1-rc.2 ~ 0.1.6-alpha.2」,越界运行版本(≥0.1.6-alpha.3)标红警示。
| 领域 | 边界 |
|---|---|
| 输入 | 浏览器不能传入 URL、包名、命令或文件路径。唯一例外:右栏文件编辑只接受 dsh-resource://file/session/<会话>/<路径> 资源地址(逐段解码、拒绝其他形态),会话与工作区根一律宿主侧解析,写盘再经会话沙箱策略围栏 |
| 网络 | 更新检查只访问固定 npm registry 地址 |
| RPC | 仅接受 loopback 调用,数据不出本机 |
| 数据 | 用量索引不保存消息、Prompt、工具参数或凭据;API key 只在宿主进程内使用 |
| 操作 | 破坏性操作(重启、删除、修复权限)均需两段式确认 |
| 凭据 | 写入 DSH 凭据库($DSH_HOME/.credentials.yaml),只发往固定端点 |
插件只发送退出信号,重新拉起由进程管理器负责(见「自动重启配置」)。面板标注「疑似手动启动」时,直接运行 dsh web 的终端进程会被退出;请改用 Docker Compose / systemd / pm2 托管。
这是「疑似终端手动启动」的检测结果,说明当前没有检测到进程管理器。若实际由 NSSM/WinSW 或输出重定向等场景托管,可用 DSH_SERVICE_RUNTIME_ENV=managed 显式声明消除。
点击卡片上的内联表单写入凭据:普通适配填 API key,CLIProxyAPI 填管理密钥(不是代理 key),小米 Token Plan 填控制台 Cookie。写入 DSH 凭据库后自动强制刷新;被进程环境变量遮蔽时宿主会拒绝写入,需改环境变量本身。
推理面和额度面共用同一把 key(user_* 前缀,Studio 的 API keys 页生成)。卡片显示该错误说明 key 被上游判为无效:到 commandcode.ai 的 Studio 重新生成或复制 key,点卡片「填写 API 密钥」粘贴即可。若渠道 baseURL 指向的是自建中转而非 api.commandcode.ai,额度面仍固定查官方账号面——中转 key 查不到官方额度。
网页登录态过期了。重新登录 platform.xiaomimimo.com,从任意 /api/v1/tokenPlan/ 请求复制 Cookie: 头,点卡片「填写控制台 Cookie」重新粘贴。
Step Plan 订阅没有 API-key 形态的查询接口,需要网页登录态令牌。登录 platform.stepfun.com,按 F12 打开开发者工具 → Application → Cookies → platform.stepfun.com,复制 Oasis-Token 的完整值(形如 xxx...yyy,两个小圆点分隔是令牌格式本身的一部分,不要拆分),点卡片「填写控制台令牌(Oasis-Token)」粘贴即可;Oasis-Webid 由宿主从令牌自动派生,无需手填。
令牌过期了(官方常见报错 oasis-token is embezzled 即令牌与 web_id 不匹配)。重新登录 platform.stepfun.com 后从 Cookies 复制新的 Oasis-Token 完整值再粘贴;从控制台复制时若自带 Oasis-Token= 或 Cookie: 前缀会被自动剥离,不影响。
先做完整性检查并展示恢复预检计划,再由用户最终确认。提交前宿主会复检备份 SHA-256、当前目标指纹与运行中工作;任何变化都会中止,不会部分覆盖或重启。提交成功后会话目录整体替换,允许的配置文件按快照精确替换,profile 只覆盖 package.json(node_modules、凭据、附件不动)。受 Docker/systemd/pm2 等托管时自动重启;疑似终端手动启动时显示手动重启指引。删除备份同样需要两段式确认。
该技能来自内置(bundled)只读目录。只有 project-* 与 user-* 来源的技能支持双向开关。
并发保护生效:SKILL.md 刚被外部编辑器改动(版本比对失败)。点击「刷新」获取最新状态后重试即可。
不会。更新检查只是访问 npm registry 的只读请求,失败静默忽略,其余功能不受影响。
欢迎提交 Issue 与 Pull Request。开发路线与技术约定见仓库内 AGENTS.md;发布规范见 AGENTS.md「发布」一节。