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

鲸鱼整合包 Miyazawai/dsh-whale

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

三界面一键切换,17 组件开箱即用的整合发行版

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · ui
装得上吗
实装验证未通过(dependency_conflict),装前请到仓库确认最近更新与 issue
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 79 天前
档位由哪些信号合成

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(dependency_conflict · 2026/9/25) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 103 处,展示前 91 条)
  • 读取本地文件
    desktop/after-pack.cjs:17
    if (!existsSync(runtimeSrc)) {
  • 删除本地文件递归
    desktop/after-pack.cjs:21
    rmSync(dst, { recursive: true, force: true })
  • 删除本地文件递归
    desktop/after-pack.cjs:28
    rmSync(nmJunction, { recursive: true, force: true })
  • 执行外部命令固定命令
    desktop/after-pack.cjs:29
    const res = spawnSync('cmd', ['/c', 'mklink', '/J', nmJunction, nmTarget], { stdio: 'pipe' })
  • 读取本地文件
    desktop/after-pack.cjs:33
    if (!existsSync(join(nmJunction, '@deepseek-ai', 'dsh-tools'))) {
  • 写入本地文件
    desktop/main.js:16
    appendFileSync(p, `\n===== ${new Date().toISOString()} dsh-whale start =====\n`)
  • 写入本地文件
    desktop/main.js:22
    if (logStream) { try { appendFileSync(logStream, line + '\n') } catch { } }
  • 读取本地文件
    desktop/main.js:34
    if (existsSync(p)) return p
  • 读取本地文件
    desktop/main.js:38
    if (existsSync(withNm)) return withNm
  • 写入本地文件
    desktop/main.js:47
    mkdirSync(base, { recursive: true })
  • 写入本地文件
    desktop/main.js:77
    mkdirSync(targetRoot, { recursive: true })
  • 读取本地文件
    desktop/main.js:81
    if (!existsSync(dst) && existsSync(src)) cpSync(src, dst, { recursive: true })
  • 执行外部命令来自配置/变量
    desktop/main.js:88
    const child = spawn(process.execPath, ['--expose-internals', DSH_CLI, 'plugin', '--profile', 'web', 'add', source], {
  • 读取本地文件
    desktop/main.js:108
    if (existsSync(markerPath)) {
  • 读取本地文件
    desktop/main.js:109
    const m = JSON.parse(readFileSync(markerPath, 'utf8'))
  • 读取本地文件
    desktop/main.js:117
    if (!existsSync(bundlesPath)) return
  • 写入本地文件
    desktop/main.js:137
    try { writeFileSync(markerPath, JSON.stringify({ version: '1', ok: [...done], time: Date.now() })) } catch { }
  • 执行外部命令来自配置/变量
    desktop/main.js:208
    dshChild = spawn(process.execPath, ['--expose-internals', DSH_CLI, '--profile', 'web', '--port', '0'], {
  • 读取本地文件
    plugins/sidebar/src/git-workspace.ts:20
    if (!existsSync(cwd) || !statSync(cwd).isDirectory()) {
  • 读取本地文件
    plugins/sidebar/src/git-workspace.ts:20
    if (!existsSync(cwd) || !statSync(cwd).isDirectory()) {
  • 读取本地文件
    plugins/sidebar/src/preferences-server.ts:36
    JSON.parse(await readFile(path, 'utf8')) as unknown,
  • 写入本地文件
    plugins/sidebar/src/preferences-server.ts:98
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    plugins/sidebar/src/preferences-server.ts:100
    await writeFile(temporary, `${JSON.stringify(preferences, undefined, 2)}\n`, {
  • 写入本地文件
    plugins/sidebar/src/preferences-server.ts:104
    await rename(temporary, path)
  • 删除本地文件
    plugins/sidebar/src/preferences-server.ts:106
    await unlink(temporary).catch(() => {})
  • 读取本地文件
    plugins/skins/src/preferences-server.ts:39
    const parsed = parseSkinPreferences(JSON.parse(await readFile(path, 'utf8')) as unknown)
  • 写入本地文件
    plugins/skins/src/preferences-server.ts:98
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    plugins/skins/src/preferences-server.ts:100
    await writeFile(temporary, `${JSON.stringify(preferences, undefined, 2)}\n`, { mode: 0o600 })
  • 写入本地文件
    plugins/skins/src/preferences-server.ts:102
    await rename(temporary, path)
  • 删除本地文件
    plugins/skins/src/preferences-server.ts:106
    await unlink(temporary).catch(() => {})
  • 写入本地文件
    plugins/skins/src/preferences-server.ts:109
    await copyFile(temporary, path)
  • 删除本地文件
    plugins/skins/src/preferences-server.ts:110
    await unlink(temporary)
  • 读取本地文件
    plugins/skins/src/tui-adapter.ts:49
    return JSON.parse(readFileSync(path, 'utf8')) as unknown
  • 写入本地文件
    plugins/skins/src/tui-adapter.ts:56
    mkdirSync(dirname(path), { recursive: true, mode: 0o700 })
  • 写入本地文件
    plugins/skins/src/tui-adapter.ts:58
    writeFileSync(temporary, `${JSON.stringify(value, undefined, 2)}\n`, { mode: 0o600 })
  • 写入本地文件
    plugins/skins/src/tui-adapter.ts:60
    renameSync(temporary, path)
  • 删除本地文件
    plugins/skins/src/tui-adapter.ts:64
    rmSync(temporary, { force: true })
  • 写入本地文件
    plugins/skins/src/tui-adapter.ts:67
    copyFileSync(temporary, path)
  • 删除本地文件
    plugins/skins/src/tui-adapter.ts:68
    rmSync(temporary, { force: true })
  • 写入本地文件
    plugins/skins/src/tui-adapter.ts:99
    mkdirSync(directory, { recursive: true, mode: 0o700 })
  • 执行外部命令来自配置/变量
    src/cli.ts:152
    const child = spawn(spec.command, spec.args, {
  • 读取本地文件
    src/data-root.ts:106
    return lstatSync(path)
  • 读取本地文件
    src/data-root.ts:115
    return statSync(path)
  • 写入本地文件
    src/data-root.ts:171
    mkdirSync(destination, { recursive: true, mode: sourceStat.mode & 0o777 })
  • 读取本地文件
    src/data-root.ts:177
    for (const entry of readdirSync(source)) {
  • 写入本地文件
    src/data-root.ts:190
    mkdirSync(dirname(destination), { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/data-root.ts:192
    copyFileSync(source, destination, fsConstants.COPYFILE_EXCL)
  • 写入本地文件
    src/data-root.ts:200
    mkdirSync(dirname(destination), { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/data-root.ts:209
    copyFileSync(source, destination, fsConstants.COPYFILE_EXCL)
  • 写入本地文件
    src/data-root.ts:235
    mkdirSync(destination, { recursive: true, mode: 0o700 })
  • 读取本地文件
    src/data-root.ts:242
    for (const entry of readdirSync(source)) {
  • 读取本地文件
    src/data-root.ts:256
    if (!existsSync(marker)) writeFileSync(marker, 'complete\n', { mode: 0o600 })
  • 读取本地文件
    src/data-root.ts:271
    if (existsSync(migrationMarker(input.ohDshHome, DESKTOP_MIGRATION))) {
  • 写入本地文件
    src/main.ts:157
    mkdirSync(workspaceRoot, { recursive: true })
  • 读取本地文件
    src/main.ts:158
    if (!existsSync(paths.nodeBinary)) {
  • 读取本地文件
    src/main.ts:161
    if (!existsSync(paths.cliEntry)) {
  • 写入本地文件
    src/main.ts:184
    mkdirSync(workspaceRoot, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/main.ts:185
    mkdirSync(temporary, { recursive: true, mode: 0o700 })
  • 读取本地文件
    src/main.ts:186
    if (!existsSync(paths.nodeBinary)) throw new Error(`packaged Node runtime is missing: ${paths.nodeBinary}`)
  • 读取本地文件
    src/main.ts:187
    if (!existsSync(paths.cliEntry)) throw new Error(`packaged DSH CLI is missing: ${paths.cliEntry}`)
  • 读取本地文件
    src/main.ts:190
    const launcher = process.platform === 'darwin' && existsSync(sandbox)
  • 读取本地文件
    src/main.ts:237
    if (existsSync(packaged)) return packaged
  • 写入本地文件
    src/main.ts:625
    mkdirSync(workingDirectory, { recursive: true, mode: 0o700 })
  • 写入剪贴板
    src/main.ts:780
    clipboard.writeText([
  • 写入本地文件
    src/main.ts:857
    mkdirSync(electronDataRoot, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/main.ts:889
    mkdirSync(logsDir, { recursive: true })
  • 发起网络请求
    src/marketplace-tools.ts:133
    const response = await fetch(credentials.url, {
  • 读取本地文件
    src/profile.ts:80
    const parsed: unknown = JSON.parse(readFileSync(path, 'utf8'))
  • 写入本地文件
    src/profile.ts:89
    writeFileSync(temporary, JSON.stringify(value, undefined, 2) + '\n', { mode: 0o600 })
  • 写入本地文件
    src/profile.ts:90
    renameSync(temporary, path)
  • 写入本地文件
    src/profile.ts:135
    mkdirSync(profileDir, { recursive: true, mode: 0o700 })
  • 读取本地文件
    src/profile.ts:137
    const manifest = existsSync(manifestPath)
  • 读取本地文件
    src/profile.ts:154
    if (!existsSync(manifestPath) || JSON.stringify(next) !== JSON.stringify(manifest)) {
  • 读取本地文件
    src/profile.ts:165
    if (!existsSync(path)) writeFileSync(path, contents, { mode: 0o600 })
  • 写入本地文件
    src/profile.ts:165
    if (!existsSync(path)) writeFileSync(path, contents, { mode: 0o600 })
  • 写入本地文件
    src/profile.ts:167
    mkdirSync(dirname(join(dshHome, 'sessions', '.keep')), { recursive: true, mode: 0o700 })
  • 执行外部命令来自配置/变量
    src/runtime.ts:80
    const child = spawn(command, args, {
  • 执行外部命令来自配置/变量
    src/runtime.ts:156
    const child = spawn(options.nodeBinary, [options.cliEntry, ...args], {
  • 读取本地文件
    src/tui.ts:240
    : existsSync(stagedNode)
  • 读取本地文件
    src/tui.ts:244
    if (!existsSync(paths.nodeBinary)) {
  • 读取本地文件
    src/tui.ts:247
    if (!existsSync(paths.cliEntry)) {
  • 读取本地文件
    src/tui.ts:253
    if (!existsSync(cwd)) throw new UsageError(`workspace directory does not exist: ${cwd}`)
  • 写入本地文件
    src/tui.ts:254
    mkdirSync(dataRoot, { recursive: true, mode: 0o700 })
  • 读取本地文件
    src/update-manager.ts:141
    const packageType = (await readFile(join(resourcesPath, 'package-type'), 'utf8')).trim()
  • 执行外部命令固定命令
    src/version.ts:24
    const result = spawnSync('git', [
  • 读取本地文件
    src/version.ts:46
    const manifest = JSON.parse(readFileSync(path, 'utf8')) as { version?: unknown }
  • 执行外部命令来自配置/变量
    src/web.ts:162
    const child = spawn(command, args, { detached: true, stdio: 'ignore' })
  • 读取本地文件
    src/web.ts:222
    : existsSync(stagedNode)
  • 读取本地文件
    src/web.ts:226
    if (!existsSync(paths.nodeBinary)) {
  • 读取本地文件
    src/web.ts:229
    if (!existsSync(paths.cliEntry)) {
  • 写入本地文件
    src/web.ts:233
    mkdirSync(dataRoot, { recursive: true, mode: 0o700 })
扫描于 2026/11/3(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 三界面一键切换
  • 17组件开箱即用
  • 模型与预设联动

README

由 DeepSeek 最新模型翻译生成
简体中文 · 🐳 dsh-whale(鲸鱼包) DSH 傻瓜整合包 —— 开箱即用的 DeepSeek Harness 发行版外壳。 核心 17 组件开箱即用,三种界面(webui / gui / tui)一个安装包切换,Windows 小白双击即用。 下载最新版 选品清单 架构决策 以 Oh-DSH 发行层为基座(一次性源码级 fork,独立演进)。把社区插件精选、去重、兼容性修复后打包成一个发行版,"核心包"只是默认组合——遵循 DSH"一切皆插件"哲学,所有组件都可随时插入与拆除。 ✨ 特色 - 三界面一包:webui(浏览器)/ gui(Electron 桌面壳)/ tui(终端,dsh-TUI),共享同一份会话与配置,启动时自选 - 核心 17 组件开箱即用:每功能一实现(功能唯一性 > 资源开销 > 包体积) - 模型↔预设联动:换 flash 模型自动启用思维路由(Router Standard),换 pro 自动启用锚定式预设(Anchored Standard)——设置页一键开关,想关就关 - 可插拔:任何插件可用官方 dsh plugin 机制移除;可选 17 组件默认关闭、一键开启 - 自带运行时:无需安装 Node/pnpm,自带固定版本 DSH runtime 🚀 快速开始
展开完整文档(README 剩余 1 节)
简体中文 ·

🐳 dsh-whale(鲸鱼包) DSH 傻瓜整合包 —— 开箱即用的 DeepSeek Harness 发行版外壳。
核心 17 组件开箱即用,三种界面(webui / gui / tui)一个安装包切换,Windows 小白双击即用。

下载最新版

选品清单

架构决策

以 Oh-DSH 发行层为基座(一次性源码级 fork,独立演进)。把社区插件精选、去重、兼容性修复后打包成一个发行版,"核心包"只是默认组合——遵循 DSH"一切皆插件"哲学,所有组件都可随时插入与拆除。

✨ 特色

- 三界面一包:webui(浏览器)/ gui(Electron 桌面壳)/ tui(终端,dsh-TUI),共享同一份会话与配置,启动时自选
- 核心 17 组件开箱即用:每功能一实现(功能唯一性 > 资源开销 > 包体积)
- 模型↔预设联动:换 flash 模型自动启用思维路由(Router Standard),换 pro 自动启用锚定式预设(Anchored Standard)——设置页一键开关,想关就关
- 可插拔:任何插件可用官方 dsh plugin 机制移除;可选 17 组件默认关闭、一键开启
- 自带运行时:无需安装 Node/pnpm,自带固定版本 DSH runtime

🚀 快速开始

1. 从 Releases 下载 dsh-whale Setup x.x.x.exe(Windows 安装包,约 94MB,自带 Node/DSH runtime,无需预装任何环境)
2. 双击安装 → 桌面出现 dsh-whale(鲸鱼包) 快捷方式
3. 启动后三选一:
- GUI:双击桌面图标(Electron 窗口)
- Web:安装目录下运行 bin\ohdsh web(或 GUI 内操作)
- TUI:在终端运行 bin\ohdsh tui

核心 17 组件开箱即用;可选组件在设置页一键开启;模型↔预设联动默认开启(换 flash/pro 自动切换路由/锚定预设),可在设置关闭。

🔒 与已有 DSH 共存(完全隔离)

鲸鱼包是独立的 DSH 实例,与你已装的 dsh 零冲突,可同时运行:

| 项 | 你现有的 dsh | 鲸鱼包 |
| 程序 | 系统安装/npx 的 dsh | 安装目录内置拷贝(自带 Node runtime) |
| 数据目录 | ~/.dsh | %APPDATA%\dsh-whale\dsh-home |
| 端口 | 默认 3080 | 随机空闲端口(永不撞车) |
| 插件/预设 | 你的 profile | 自己的 profile + 内置 4 预设 |
| 卸载 | 不受影响 | 只删自己的目录 |

⚠️ 注意:
- 鲸鱼包不共享 ~/.dsh 的 API Key / 会话 / 凭据——首次使用需在鲸鱼包内重新配置一次 DeepSeek API Key(隔离的代价,也是不碰你现有数据的保证)。
- 请通过桌面图标/安装器启动;若在安装目录手动敲 dsh 命令,记得设 DSH_HOME(否则会回落到 ~/.dsh)。

📦 核心组件(默认启用,17 个)

| 功能 | 插件 | 来源 |
| 费用/计费 | dsh-cost-meter | Han-1413141/dsh-cost-meter |
| 生成式 UI | dsh-genui | omdsh-dev/dsh-genui |
| 文件引用 | dsh-at-file | omdsh-dev/dsh-at-file |
| 文件上传 | dsh-file-uploads | l541402398/dsh-file-uploads |
| 会话折叠 | dsh-web-archive | renat3u/dsh-web-archive |
| 导航条 | dsh-navbar | vlln/dsh-navbar |
| 路径可点 | dsh-file-mentions | a903067276-rgb/dsh-file-mentions |
| 消息编辑 | dsh-message-edit | Moeblack/dsh-message-edit |
| 文档读取 | dsh-plugin-anydoc | beancookie/dsh-plugin-anydoc |
| Web 通知 | dsh-session-notification | dingyi222666/dsh-session-notification |
| 主题 | dsh-theme-gallery | wsxwj123/dsh-plugins(theme-gallery 子包) |
| CSV 工具 | dsh-tool-csv | omdsh-dev/dsh-tool-csv |
| Skill 管理 | dsh-skill-viewer | Fishquito7/dsh-skill-viewer |
| 视觉工具 | dsh-vision-toolkit | Anionex/dsh-vision-toolkit |
| 插件说明 | dsh-plugin-description | MysaDC/dsh-plugin-description |
| 桌宠 | dsh-dafeiyu | QCYTSN/dsh-dafeiyu |
| 运行时注入 | dsh-super-injector | yjh051108/dsh-routing-suite(dsh-super-injector) |

🎛️ 预设(随包安装,模型联动)

| 预设 | 绑定模型 | 来源 |
| Anchored Standard(含 Zero-Anchored / Whoami 变体) | pro | xiaobright/dsh-anchored-standard |
| Router Standard | flash | yjh051108/dsh-routing-suite(dsh-router-standard) |

🧩 可选组件(默认关闭,一键开启)

| 功能 | 插件 | 来源 |
| 多维仪表盘 | dsh-spend | nonewind/dsh-spend |
| 自由 HTML 卡片 | dsh-visualize | Nagi-ovo/dsh-visualize |
| 拖拽真实路径 | dsh-drag-and-drop | omdsh-dev/dsh-drag-and-drop |
| 摘要 tab | dsh-focus-chat | dingyi222666/dsh-focus-chat |
| 文档写/MCP | dsh-cowork | Jesse-njx/dsh-cowork |
| 工作区回滚 | dsh-turn-rewind | Anionex/dsh-turn-rewind |
| Windows 通知 | dsh-notify-windows | SeverusZh/dsh-notify-windows |
| 多引擎搜索 | modsearch | liustack/modsearch |
| 便签 | dsh-sticky-note | Meredith2328/dsh-sticky-note |
| 注意力徽章 | dsh-web-attention-badge | Luaphes/dsh-web-attention-badge |
| HUD 状态面板 | dsh-hud | a903067276-rgb/dsh-hud |
| 状态文案 | ui-status-label | alingalingling/ui-status-label |
| 技能导入 | dsh-skillport | Jesse-njx/dsh-skillport |
| 内置开关 | dsh-builtin-toggles | Starfie1d1272/dsh-builtin-toggles |
| 批注 | dsh-annotation | omdsh-dev/dsh-annotation |
| 跨会话消息 | dsh-crosstalk | Jesse-njx/dsh-crosstalk |
| 浏览器操控 | dsh-browser(Chrome 扩展,独立安装) | Lum1104/dsh-browser |

🙏 致谢

本项目是社区生态的组合产物,站在以下项目的肩膀上(均为开源):

- hust-open-atom-club/oh-dsh —— 发行层基座(三形态统一、Pinned runtime、分层分发)
- ccch1mneyyy/dsh-TUI —— 终端界面(TUI)
- omdsh-dev/DSH-better-sidebar —— 侧边栏工作台(PTY/文件/Git)
- xiaobright/dsh-anchored-standard —— 锚定式预设(pro 模型绑定)
- yjh051108/dsh-routing-suite —— 思维路由预设 + 超级注入器(flash 模型绑定)
- 以及上表中全部核心/可选组件仓库与 awesome-dsh-plugin 生态

🔗 相关

- 选品清单:docs/selection.md | 架构决策:docs/adr/0001 | 调研底稿:docs/overlap-map.md
- 术语表:CONTEXT.md | 补丁簿:docs/patch-book.md | 调研档案:research/、research_output/
预览分享卡片长什么样 ↓Miyazawai/dsh-whale
分享 · DeepSeek Harness Hub
Miyazawai/dsh-whale

三界面一键切换,17 组件开箱即用的整合发行版

这是你的仓库?认领条目

回到顶部