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

浮窗助手 18840024879/dsh-float

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

置顶悬浮对话面板,框选屏幕截图直接提问

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · desktop
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 52 处,展示前 52 条)
  • 读取本地文件
    lib/index.js:65
    return electronCandidates().find((value) => existsSync(value)) ?? null
  • 执行外部命令固定命令
    lib/index.js:70
    execFile(
  • 写入本地文件
    lib/index.js:127
    mkdirSync(ELECTRON_ROOT, { recursive: true })
  • 读取本地文件
    lib/index.js:137
    if (!existsSync(join(staging, 'electron.exe')) || !existsSync(join(staging, 'ffmpeg.dll'))) {
  • 删除本地文件递归
    lib/index.js:140
    rmSync(ELECTRON_DIR, { recursive: true, force: true })
  • 写入本地文件
    lib/index.js:141
    renameSync(staging, ELECTRON_DIR)
  • 删除本地文件
    lib/index.js:142
    rmSync(zip, { force: true })
  • 删除本地文件递归
    lib/index.js:144
    rmSync(staging, { recursive: true, force: true })
  • 删除本地文件
    lib/index.js:145
    rmSync(zip, { force: true })
  • 发起网络请求
    lib/index.js:185
    return fetch(`http://127.0.0.1:${ready.port}/bridge`, {
  • 读取本地文件
    lib/index.js:420
    if (!existsSync(HELPER_MAIN)) {
  • 执行外部命令来自配置/变量
    lib/index.js:432
    const proc = spawn(electron, [HELPER_MAIN], {
  • 读取本地文件
    lib/index.js:541
    return JSON.parse(readFileSync(join(PLUGIN_ROOT, 'package.json'), 'utf8')).version
  • 读取本地文件
    lib/chat.js:236
    if (!existsSync(full)) throw fail('IMAGE_INVALID', '截图文件不存在。')
  • 读取本地文件
    lib/chat.js:237
    const stat = statSync(full)
  • 读取本地文件
    lib/chat.js:241
    const bytes = new Uint8Array(readFileSync(full))
  • 读取本地文件
    lib/chat.js:263
    if (full.startsWith(SHOT_DIR + sep) && existsSync(full)) unlinkSync(full)
  • 删除本地文件
    lib/chat.js:263
    if (full.startsWith(SHOT_DIR + sep) && existsSync(full)) unlinkSync(full)
  • 读取本地文件
    lib/config.js:28
    if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true })
  • 写入本地文件
    lib/config.js:28
    if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true })
  • 读取本地文件
    lib/config.js:33
    if (!existsSync(file)) return fallback
  • 读取本地文件
    lib/config.js:34
    const value = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    lib/config.js:63
    writeFileSync(tmp, JSON.stringify(value, null, 2), 'utf8')
  • 写入本地文件
    lib/config.js:64
    renameSync(tmp, file)
  • 写入本地文件
    runtime/electron-helper/capture.js:233
    fs.mkdirSync(SHOT_DIR, { recursive: true })
  • 执行外部命令固定命令
    runtime/electron-helper/capture.js:258
    execFile(
  • 写入本地文件
    runtime/electron-helper/capture.js:331
    fs.writeFileSync(out, cropped.toPNG())
  • 删除本地文件
    runtime/electron-helper/capture.js:570
    fs.unlinkSync(temp)
  • 写入本地文件
    runtime/electron-helper/debug.js:12
    fs.mkdirSync(path.dirname(DEBUG_LOG), { recursive: true })
  • 读取本地文件
    runtime/electron-helper/debug.js:14
    if (fs.statSync(DEBUG_LOG).size > MAX_LOG_BYTES) fs.writeFileSync(DEBUG_LOG, '')
  • 写入本地文件
    runtime/electron-helper/debug.js:18
    fs.appendFileSync(DEBUG_LOG, `${new Date().toISOString()} ${message}\n`)
  • 读取密钥环境变量
    runtime/electron-helper/main.js:38
    const PREFERRED_HOTKEY = process.env.DSH_FLOAT_HOTKEY || 'Alt+Space'
  • 读取本地文件
    runtime/electron-helper/main.js:133
    const dataUrl = `data:image/png;base64,${fs.readFileSync(file).toString('base64')}`
  • 发起网络请求
    runtime/electron-helper/main.js:150
    const data = await bridge.request(method, payload?.params || {})
  • 发起网络请求
    runtime/electron-helper/main.js:210
    .request('chat.send', { text: 'selftest' })
  • 发起网络请求
    runtime/electron-helper/main.js:214
    void bridge.request('chat.abort', { chatId: ack.chatId }).catch(() => {})
  • 发起网络请求
    runtime/electron-helper/main.js:225
    const catalog = await bridge.request('models.list')
  • 发起网络请求
    runtime/electron-helper/main.js:233
    await bridge.request('helper.quit').catch(() => {})
  • 发起网络请求
    runtime/electron-helper/main.js:316
    void bridge.request('config.set', { hotkey: registered }).catch(() => {})
  • 删除本地文件
    runtime/electron-helper/mock-host.js:89
    fs.unlinkSync(imagePath)
  • 读取本地文件
    runtime/electron-helper/pet-watch.js:20
    ].find((file) => fs.existsSync(file)) || null
  • 读取本地文件
    runtime/electron-helper/pet-watch.js:26
    source = fs.readFileSync(SOURCE, 'utf8')
  • 读取本地文件
    runtime/electron-helper/pet-watch.js:35
    if (fs.existsSync(exe)) {
  • 写入本地文件
    runtime/electron-helper/pet-watch.js:48
    fs.mkdirSync(BIN_DIR, { recursive: true })
  • 执行外部命令来自配置/变量
    runtime/electron-helper/pet-watch.js:55
    execFile(
  • 删除本地文件
    runtime/electron-helper/pet-watch.js:63
    fs.unlinkSync(exe)
  • 读取本地文件
    runtime/electron-helper/pet-watch.js:70
    if (!fs.existsSync(exe)) {
  • 执行外部命令来自配置/变量
    runtime/electron-helper/pet-watch.js:93
    child = spawn(exe, [], {
  • 读取本地文件
    runtime/electron-helper/window.js:21
    const value = JSON.parse(fs.readFileSync(BOUNDS_FILE, 'utf8'))
  • 写入本地文件
    runtime/electron-helper/window.js:37
    fs.mkdirSync(DATA_DIR, { recursive: true })
  • 写入本地文件
    runtime/electron-helper/window.js:38
    fs.writeFileSync(BOUNDS_FILE, JSON.stringify(bounds), 'utf8')
  • 发起网络请求
    runtime/ui/app.js:45
    const result = await api.request(method, params)
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 的 Windows 桌面悬浮助手

README

由 DeepSeek 最新模型翻译生成
dsh-float 豆包风格的 DeepSeek Harness 桌面助手:常驻置顶的独立对话面板,面板可自由缩放,框选屏幕区域直接提问。使用 dsh 里已经配置好的模型与账号,不需要另外填 API Key。 仅支持 Windows 10/11 x64。English: README.en.md 功能 - 双击桌宠打开:安装了 dsh-pet 时,双击桌宠本体打开/隐藏面板(两次点击需在系统双击间隔内、位置基本不变),单击或拖动桌宠不会误触;不装桌宠也能用 Alt+Space 或托盘菜单。 - 面板可拖动标题栏移动,拖右边缘、底边或右下角缩放;位置与大小自动记忆。 - 流式回答、停止生成、模型选择、新对话、历史保留最近 8 轮。 - 回答里的 LaTeX 公式($...$、$$...$$、\(...\)、\[...\])用本地 KaTeX 渲染,内置 KaTeX 字体,效果与豆包悬浮窗一致;Markdown 的标题、有序/无序列表、表格、分隔线、引用、代码块、粗体与行内代码也会正常显示,不再出现 ##、- 、--- 之类的原始符号。 - 截图提问:框选屏幕区域,图片作为附件发送;发送过的截图会以缩略图留在对话历史里,重新打开面板也能看到。遮罩窗口常驻预热,悬停相机按钮时就开始取屏幕流,因此点下去很快出现选区;遮罩等截图画面绘好后才淡入,不会先黑一下再显示。
展开完整文档(README 剩余 1 节)
dsh-float

豆包风格的 DeepSeek Harness 桌面助手:常驻置顶的独立对话面板,面板可自由缩放,框选屏幕区域直接提问。使用 dsh 里已经配置好的模型与账号,不需要另外填 API Key。

仅支持 Windows 10/11 x64。English: README.en.md

功能

- 双击桌宠打开:安装了 dsh-pet 时,双击桌宠本体打开/隐藏面板(两次点击需在系统双击间隔内、位置基本不变),单击或拖动桌宠不会误触;不装桌宠也能用 Alt+Space 或托盘菜单。
- 面板可拖动标题栏移动,拖右边缘、底边或右下角缩放;位置与大小自动记忆。
- 流式回答、停止生成、模型选择、新对话、历史保留最近 8 轮。
- 回答里的 LaTeX 公式($...$、$$...$$、\(...\)、\[...\])用本地 KaTeX 渲染,内置 KaTeX 字体,效果与豆包悬浮窗一致;Markdown 的标题、有序/无序列表、表格、分隔线、引用、代码块、粗体与行内代码也会正常显示,不再出现 ##、- 、--- 之类的原始符号。
- 截图提问:框选屏幕区域,图片作为附件发送;发送过的截图会以缩略图留在对话历史里,重新打开面板也能看到。遮罩窗口常驻预热,悬停相机按钮时就开始取屏幕流,因此点下去很快出现选区;遮罩等截图画面绘好后才淡入,不会先黑一下再显示。
- 文本模型遇到图片时,会自动寻找可用的 modlens 视觉路由;找不到会明确报错,不会静默丢图。
- 默认快捷键 Alt+Space;被占用时自动降级为 Ctrl+Alt+Space,托盘菜单也可打开/截图/退出。
- 关闭 dsh 后 Helper 自动退出,不留后台进程。

安装

从命令行安装(普通用户)

dsh plugin --profile desktop add dsh-float

装完重启 DeepSeek Harness。Helper 是独立的 Electron 进程:会依次查找 DSH_FLOAT_ELECTRON_PATH、DSH_PET_ELECTRON_PATH、插件自带依赖、~\.dsh\electron\electron.exe,都没有时首次启动会下载 Electron 43.3.0 到 ~\.dsh\dsh-float\electron\(约 110 MB,仅一次;优先 npmmirror,失败回退 GitHub)。想复用现成的运行时,设置 DSH_FLOAT_ELECTRON_PATH 即可跳过下载。

本地开发安装

插件目录:%USERPROFILE%\.dsh\plugins\dsh-float,profile:%USERPROFILE%\.dsh\profiles\desktop。

1. 登记依赖:在 profile 的 package.json 中加

"dsh-float": "link:C:/path/to/dsh-float"

并在 dsh.profile.bundles 数组末尾加 "dsh-float"。

2. 安装链接(使用 dsh 自带运行时):

NODE="$HOME/.dsh/dsh-runtimes/dsh-primary-runtime/dependencies/node/bin/node.exe"
PNPM="$HOME/.dsh/dsh-runtimes/dsh-primary-runtime/dependencies/pnpm/bin/pnpm.cjs"
cd "$HOME/.dsh/profiles/desktop"
"$NODE" "$PNPM" install --offline --no-frozen-lockfile

若提示缺包,去掉 --offline 再执行一次。确认 node_modules/dsh-float 指向插件目录。

3. 重启 DeepSeek Harness。启动成功时 dsh 日志会出现 [dsh-float] loaded 和 helper ready on 127.0.0.1:…。

卸载

从 profile package.json 删除依赖与 dsh.profile.bundles 里的 dsh-float,重新执行 pnpm install,或直接删除 node_modules/dsh-float 链接,然后重启 dsh。

使用

- 双击 dsh-pet 桌宠打开面板;再次双击、按 Esc 或点右上角「—」隐藏。拖动桌宠时不会打开。
- 拖动面板标题栏移动位置;拖右边缘 / 底边 / 右下角调整大小(最小 320×420,超出屏幕会自动限制)。
- Enter 发送,Shift+Enter 换行;回答中可点停止按钮。
- 左下角相机按钮进入框选:拖拽选区,松开完成,Esc 取消。
- 面板顶部的模型名可打开模型列表;「跟随 dsh 默认」表示使用 dsh 当前会话模型。
- 托盘图标:显示/隐藏、截图提问、退出;Alt+Space 同样可切换面板。

数据与配置

都在 ~\.dsh\dsh-float\:

| 文件 | 内容 |
| config.json | 快捷键、system prompt、模型偏好、历史轮数、autoVision |
| history.json | 最近 40 条对话(面板显示最近 12 条) |
| window.json | 面板上次的位置与大小 |

截图先保存在系统临时目录 %TEMP%\dsh-float\shot-*.png,发送后由宿主删除。

config.json 示例:

{
"hotkey": "Alt+Space",
"systemPrompt": "你是一个常驻桌面的 AI 助手……", "model": null, "maxHistoryRounds": 8, "autoVision": true, "opacity": 1 }

model: null 跟随 dsh 默认;也可以写成 {"provider": "...", "model": "..."}。删除该文件即恢复默认配置。

视觉(看图)

图片会经过两层检查:

1. 当前模型 inputModalities 含 image → 直接发送。
2. 否则在已安装的 provider 中找含 image 能力、且模型名匹配的视觉路由(优先 modlens),自动切换并提示。
3. 都没有 → 报 VISION_UNAVAILABLE,提示安装或启用 modlens,或者手动选择视觉模型。

文本模型不会对图片报错,而是把图片静默替换成占位文本,所以不能靠「发送成功」判断视觉能力。

排障

- 面板打不开 / 双击桌宠没反应:确认 dsh-pet 正在运行,且双击的是宠物本体(不是气泡里的按钮);两次点击要在系统双击间隔内、位置基本不变(拖拽桌宠不算双击)。确认 dsh 日志里有 [dsh-float] loaded。点击监听器首次运行时会用系统自带 .NET Framework 的 csc.exe 编译到 ~\.dsh\dsh-float\bin\,失败会写入 helper-debug.log,此时仍可用 Alt+Space 或托盘打开。
- 找不到 Electron / 下载失败:Helper 会在首次启动时自动下载;若下载失败(网络或代理),设置 DSH_FLOAT_ELECTRON_PATH 指向现成的 electron.exe,或安装 dsh-pet 复用它的 ~\.dsh\electron。下载与查找过程写入 helper-debug.log。
- 快捷键无效:被其他软件占用会降级并提示;以托盘菜单为准,提示文字会显示实际快捷键。
- 回答报「上一条回答还没结束」:先停止上一条;Helper 重启期间请求会超时,稍候重试。
- Helper 崩溃:宿主会自动重启,750ms 起指数退避,最多 12 次;约每 3 分钟稳定运行后重置计数。
- 截图是黑屏/失败:先升级显卡驱动;Helper 优先用屏幕流取帧,不可用时自动回退到 desktopCapturer,再失败则用 PowerShell 截屏。
- 截图遮罩没出现:Helper 会等画面绘好再显示遮罩,并在显示失败时重试;60 秒未选择区域会自动取消并恢复面板。诊断日志在 ~\.dsh\dsh-float\helper-debug.log(超过 256 KB 自动清空),其中 capture start / stream frame / overlay revealed / capture finish 记录了各阶段耗时。
- 想彻底重置:退出 dsh,删除 ~\.dsh\dsh-float\,重启。

开发与自测

语法检查
node --check runtime/electron-helper/main.js
node --check runtime/electron-helper/pet-watch.js
node --check runtime/electron-helper/window.js
node --check lib/index.js

离线预览(不碰 dsh,使用内置假模型)
env -u ELECTRON_RUN_AS_NODE "$HOME/.dsh/electron/electron.exe" \
runtime/electron-helper/main.js --mock

宿主 ↔ Helper 桥接自测:鉴权、epoch、流式、中止、退出
node tools/mock-host.mjs

渲染进程开启 contextIsolation、关闭 nodeIntegration;脚本侧使用严格 CSP(script-src 'self',无 'unsafe-inline' / 'unsafe-eval'),因为 KaTeX HTML 输出依赖行内样式,style-src 允许内联但仍禁止外部样式。模型输出逐节点构建 DOM,只有 KaTeX 生成的转义标记经 innerHTML 插入(trust: false);宿主只接受白名单临时目录里的 PNG/JPEG/WebP 截图。

截图用的屏幕流只在鼠标悬停相机按钮或开始截图时打开,取到一帧后立即关闭;选区图像只写入 %TEMP%\dsh-float,由宿主发送后删除。遮罩页使用独立 CSP(img-src data: blob:),除本地 overlay.js 外不加载任何脚本。
预览分享卡片长什么样 ↓18840024879/dsh-float
分享 · DeepSeek Harness Hub
18840024879/dsh-float

置顶悬浮对话面板,框选屏幕截图直接提问

这是你的仓库?认领条目

回到顶部