🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

桌宠启动器 fm4120/dsh-pet-launcher

DeepSeek Harness
fm412012 天前有提交已提供中文文档扫描:含敏感能力

在界面浮窗里逐只启停桌宠,改配置刷新即生效

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add fm4120/dsh-pet-launcher
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · desktop
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 12 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令发起外部网络请求
查看扫描证据(共 9 处,展示前 8 条)
  • 执行外部命令来自配置/变量
    lib/index.js:208
    child = spawn(
  • 执行外部命令固定命令
    lib/index.js:345
    spawn('taskkill', ['/PID', String(pid), '/T', '/F'], {
  • 执行外部命令来自配置/变量
    lib/index.js:378
    execFileSync(
  • 执行外部命令来自配置/变量
    lib/index.js:419
    const child = spawn(
  • 执行外部命令固定命令
    lib/index.js:467
    execFileSync('taskkill', ['/PID', String(pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore', timeout: 3000 })
  • 发起网络请求
    lib/index.js:515
    const req = http.request(
  • 执行外部命令来自配置/变量
    lib/index.js:647
    child = spawn(process.env.ComSpec || 'cmd.exe', ['/c', pet.target], opts)
  • 发起网络请求
    lib/widget.js:374
    return fetch(API + pathname, {
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 桌面端的桌宠启动器浮窗:每只桌宠一行,一个按钮起/停。

README

由 DeepSeek 最新模型翻译生成
dsh-pet-launcher DSH(DeepSeek Harness)桌面端界面左下角的一块小浮窗:每只桌宠一行,一个按钮起/停。 panel - 宿主机半侧:lib/index.js(注入行 + 4 条 HTTP 路由 + spawn) - 页面半侧:lib/widget.js(注入到界面的浮窗) - 宠物定义:pets.json —— 唯一真相源,加减宠物只改这里,改完刷新面板即可,不用重装或重启 安装 把本仓库拷到任意位置(路径别带符号链接),然后 link 安装 —— 这样改代码即时生效: 先把示例配置复制成你的真实配置 Copy-Item pets.example.json pets.json link 安装到 desktop profile(<本仓库绝对路径> 换成实际路径) dsh plugin --profile desktop add link:"<本仓库绝对路径>" 装完要看到面板得托盘退出 DSH 再打开 —— 注入表是宿主启动时一次性收集的。
展开完整文档(README 剩余 1 节)
dsh-pet-launcher

DSH(DeepSeek Harness)桌面端界面左下角的一块小浮窗:每只桌宠一行,一个按钮起/停。

panel

- 宿主机半侧:lib/index.js(注入行 + 4 条 HTTP 路由 + spawn)
- 页面半侧:lib/widget.js(注入到界面的浮窗)
- 宠物定义:pets.json —— 唯一真相源,加减宠物只改这里,改完刷新面板即可,不用重装或重启

安装

把本仓库拷到任意位置(路径别带符号链接),然后 link 安装 —— 这样改代码即时生效:

先把示例配置复制成你的真实配置 Copy-Item pets.example.json pets.json

link 安装到 desktop profile(<本仓库绝对路径> 换成实际路径)
dsh plugin --profile desktop add link:"<本仓库绝对路径>"

装完要看到面板得托盘退出 DSH 再打开 —— 注入表是宿主启动时一次性收集的。

卸载:

dsh plugin --profile desktop remove dsh-pet-launcher

路由

| 方法 | 路径 | 说明 |
| GET | /pet-launcher/widget.js | 浮窗脚本(按 mtime 缓存,no-store) |
| GET | /pet-launcher/status | {ok,pets:[{id,label,enabled,kind,mode,running,pid,display,helperRunning,error}]} |
| POST | /pet-launcher/start?id=<id> | 启动 / 显示;已在跑返回 {ok,already:true,pid} |
| POST | /pet-launcher/stop?id=<id> | 结束 / 隐藏;本来就没跑返回 {ok,already:true} |

端口一律取 ctx.webServer.port,从不写死(宿主每次启动端口都会变)。

pets.json 字段

| 字段 | 适用 kind | 说明 |
| id | 全部 | 唯一标识,路由参数用它 |
| label | 全部 | 面板上显示的名字 |
| enabled | 全部 | false → 按钮灰显「已禁用」 |
| kind | 全部 | exe(直接 spawn)/ cmd(cmd /c 走批处理)/ dshpet(插件持有,只能显示/隐藏) |
| target / args / cwd | exe、cmd | 可执行文件 / 参数 / 工作目录(绝对路径) |
| detect.imageName | exe、cmd | 用来判断「是否在跑」的镜像名(pythonw.exe 这种) |
| detect.imagePath | exe、cmd | 镜像完整路径;同名的 pythonw.exe 可能有多个实例,只看镜像名会认错、误杀 |
| configFile | dshpet | dsh-pet 的用户配置(JSONC,带注释,读之前要剥) |
| apiBase | dshpet | dsh-pet 路由前缀,默认 /dsh-pet-7340 |
| helperPath | dshpet | 桌面 helper(~/.dsh/electron/electron.exe),只做只读探针 |
| hideOnHostStart | dshpet | true = 每次 DSH 启动都把它收回 none(不随 DSH 自启) |
| killOnHostExit | exe、cmd | 默认 true = 关 DSH 时把这只一起收掉;false 就让它继续留在桌面上 |

几个不显然的设计

写接口只认本机回环

这接口能起任意进程,所以 POST 必须同时满足:Host 是 localhost / 127.x / ::1;不是 Sec-Fetch-Site: cross-site;带了 Origin 就必须与 Host 同源。任一不满足 → 403。宿主自己的栅栏(connection.requestRejection)抛异常时同样 fail-closed 到 403。

Host: 127.0.0.1.evil.com 这种相似域名会被按「完整 label 比对」拒掉,不是 startsWith。

关 DSH = 关桌宠(killOnHostExit)

插件被 dispose(宿主退出)时同步收掉 spawn 型的宠物:一次 PowerShell 扫全镜像 → 按「镜像名 + 完整路径」认领 → process.kill → 还活着的用 taskkill /T /F 补刀。
必须同步:dispose 之后进程马上就走,异步的 setTimeout/await 来不及。

kind: "dshpet" 那只不在这里同步杀 —— 实测 dsh-pet 会把被杀掉的 helper 自己拉回来(8 秒内换新 pid),同步杀只会和它的重启逻辑打架。正确做法是让 dsh-pet 自己的 dispose 处理,本插件只挂一个兜底:detached 起一个 PowerShell,3 秒后如果宿主进程已经不在、helper 还赖着,才 taskkill /T /F。

kind: "cmd" 的坑

start "" my-pet.exe 这种批处理里,cmd 会立刻退出,真身是它 start 出去的 exe。所以「是否在跑」不能靠 child.pid 探活,必须靠 detect 扫进程认领;「结束」时也要先按镜像名 + 完整路径双重比对,才敢动手。

kind: "dshpet" 的语义是显示 / 隐藏

那只不是独立 exe —— 桌面窗口由 dsh-pet 插件自己拉起的 Electron helper 承载。所以按钮语义是:
1. 读 configFile(JSONC,先剥掉注释再 parse;解析失败按「未知」处理,界面显示红点 + 错误文本,绝不瞎改)
2. 取 pets[0].display,在 desktop ↔ none 之间翻转
3. PUT http://127.0.0.1:${ctx.webServer.port}${apiBase}/config,body = 改过 display 的整份配置 → dsh-pet 写回用户配置并 syncDesktop(),不用重启 DSH

hideOnHostStart: true 时,插件在自己的 apply()(= 宿主启动)里检查一次:已经是 none 就什么都不做;还是 desktop/both 就 PUT 回 none(带 0/0.7/1.8/3.5/7/12 秒重试,覆盖「本插件比 dsh-pet 先加载」那段空窗)。好处是不是藏窗口而是根本不启动:display 为 none 时 dsh-pet 连 Electron helper 都不会拉起。

测试

npm test # = node test/routes.mjs

23 项,不安装、不启动任何桌宠:把 apply() 挂到 mock 宿主上,验证注入行、4 条路由、5 种安全栅栏、参数校验(400/404/405)、JSONC 解析、路径归一化。只用 node 内置模块。

已知边界

- 宿主崩溃退出(任务管理器杀掉 / 蓝屏)时 dispose 钩子不会跑,桌宠会留在桌面上;再开 DSH 点「结束」即可。
- 进程状态靠 10 秒 TTL 的扫描缓存;起停之后会主动失效缓存(踩过「杀完仍显示在跑」)。

授权

MIT。
预览分享卡片长什么样 ↓fm4120/dsh-pet-launcher
分享 · DeepSeek Harness Hub
fm4120/dsh-pet-launcher

在界面浮窗里逐只启停桌宠,改配置刷新即生效

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部