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

多实例启动器 MarcoG-h/DSH-Launcher

DeepSeek Harnessv0.3.5
MarcoG-h45 天前有提交已提供中文文档扫描:含敏感能力

最全面的DeepSeek Harness🐋启动器 首创多实例管理中枢 | 多开并行 | 整合包下载 | 安全保护 |…

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

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

自动兼容检查未通过:仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add MarcoG-h/DSH-Launcher
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · desktop
装得上吗
静态安装检查未通过,可能需要源码安装
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 45 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-launcher @ 0.3.5
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 15:35:49

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 168 处,展示前 104 条)
  • 读取本地文件
    src/main/balance.ts:24
    const raw = readFileSync(join(instanceDshHome(getActiveInstance()), '.credentials.yaml'), 'utf8')
  • 发起网络请求
    src/main/balance.ts:41
    const res = await net.fetch(DEEPSEEK_BALANCE_URL, { headers: { Authorization: `Bearer ${key}` } })
  • 执行外部命令固定命令
    src/main/browser-guard.ts:22
    const ps = spawn(
  • 执行外部命令固定命令
    src/main/browser-guard.ts:37
    spawn('taskkill', ['/F', '/T', '/PID', m[1]], { windowsHide: true, stdio: 'ignore' }).unref()
  • 读取本地文件
    src/main/config.ts:10
    return candidates.find(c => c && existsSync(resolve(c))) ?? candidates.find(c => c) ?? ''
  • 读取本地文件
    src/main/config.ts:20
    installMode: existsSync(harnessRepo) ? 'source' : 'bundled',
  • 写入本地文件
    src/main/config.ts:123
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/main/config.ts:124
    writeFileSync(file(), JSON.stringify(cfg, null, 2), 'utf8')
  • 读取本地文件
    src/main/config.ts:133
    const raw = readFileSync(file(), 'utf8')
  • 发起网络请求
    src/main/dsh-status.ts:178
    const res = await net.fetch(`http://127.0.0.1:${port}/api/host.describe`, {
  • 发起网络请求
    src/main/dsh-status.ts:197
    const res = await net.fetch(`http://127.0.0.1:${port}/api/session.list`, {
  • 读取本地文件
    src/main/fs-safe.ts:56
    if (!lstatSync(path).isSymbolicLink()) return 'not-link'
  • 删除本地文件
    src/main/fs-safe.ts:57
    unlinkSync(path)
  • 读取本地文件
    src/main/fs-safe.ts:71
    entries = readdirSync(dir, { withFileTypes: true }) as Dirent[]
  • 读取本地文件
    src/main/fs-safe.ts:83
    const st = lstatSync(p)
  • 删除本地文件
    src/main/fs-safe.ts:92
    unlinkSync(p)
  • 读取本地文件
    src/main/fs-safe.ts:109
    if (!existsSync(dir)) return { ok: true }
  • 读取本地文件
    src/main/fs-safe.ts:112
    if (link === 'ok' || (link === 'error' && !existsSync(dir))) return { ok: true }
  • 删除本地文件递归
    src/main/fs-safe.ts:120
    await rm(dir, { recursive: true, force: true })
  • 读取本地文件
    src/main/fs-safe.ts:125
    if (!existsSync(dir)) return { ok: true }
  • 删除本地文件递归
    src/main/fs-safe.ts:142
    rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 200 })
  • 删除本地文件递归
    src/main/fs-safe.ts:148
    rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    src/main/harness.ts:225
    return existsSync(abs) ? abs : a
  • 读取本地文件
    src/main/harness.ts:234
    if (!existsSync(p)) return null
  • 读取本地文件
    src/main/harness.ts:235
    return String((JSON.parse(readFileSync(p, 'utf8')) as { version?: unknown }).version ?? '')
  • 读取本地文件
    src/main/harness.ts:321
    if (inst.dshHome != null && !existsSync(home)) {
  • 读取本地文件
    src/main/harness.ts:340
    if (!existsSync(profileDirPath)) {
  • 读取本地文件
    src/main/harness.ts:363
    if (cfg.installMode === 'source' && (!plan.cwd || !existsSync(plan.cwd))) {
  • 执行外部命令来自配置/变量
    src/main/harness.ts:408
    proc = spawn(plan.cmd, plan.args, {
  • 执行外部命令固定命令
    src/main/harness.ts:581
    const proc = spawn('netstat', ['-ano', '-p', 'tcp'], { windowsHide: true, stdio: ['ignore', 'pipe', 'ignore'] })
  • 执行外部命令固定命令
    src/main/harness.ts:601
    const proc = spawn('powershell', ['-NoProfile', '-NonInteractive', '-Command', `(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").CommandLine
  • 执行外部命令固定命令
    src/main/harness.ts:621
    const k = spawn('taskkill', ['/F', '/T', '/PID', String(pid)], { windowsHide: true, stdio: 'ignore' })
  • 执行外部命令固定命令
    src/main/harness.ts:733
    const kill = spawn('taskkill', ['/F', '/T', '/PID', String(pid)], { windowsHide: true, stdio: 'ignore' })
  • 执行外部命令固定命令
    src/main/harness.ts:800
    spawn('taskkill', ['/F', '/T', '/PID', String(proc.pid)], { windowsHide: true, stdio: 'ignore' }).unref()
  • 读取本地文件
    src/main/index.ts:37
    if (existsSync(p)) return p
  • 写入本地文件
    src/main/index.ts:129
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    src/main/instances.ts:68
    if (!existsSync(file)) return false
  • 读取本地文件
    src/main/instances.ts:71
    raw = readFileSync(file, 'utf8')
  • 写入本地文件
    src/main/instances.ts:77
    writeFileSync(file, raw.slice(1), 'utf8')
  • 写入本地文件
    src/main/instances.ts:96
    mkdirSync(home, { recursive: true })
  • 读取本地文件
    src/main/instances.ts:126
    for (let n = 2; existsSync(profileDir(home, name)); n++) name = `${base}-${n}`
  • 写入本地文件
    src/main/instances.ts:137
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    src/main/instances.ts:139
    if (!existsSync(manifestPath)) {
  • 写入本地文件
    src/main/instances.ts:141
    writeFileSync(manifestPath, JSON.stringify(manifest, undefined, 2) + '\n')
  • 读取本地文件
    src/main/instances.ts:144
    if (!existsSync(patchPath)) writeFileSync(patchPath, PROFILE_PATCH_TEMPLATE)
  • 写入本地文件
    src/main/instances.ts:144
    if (!existsSync(patchPath)) writeFileSync(patchPath, PROFILE_PATCH_TEMPLATE)
  • 读取本地文件
    src/main/instances.ts:146
    if (!existsSync(workspacePath)) writeFileSync(workspacePath, PROFILE_PNPM_WORKSPACE)
  • 写入本地文件
    src/main/instances.ts:146
    if (!existsSync(workspacePath)) writeFileSync(workspacePath, PROFILE_PNPM_WORKSPACE)
  • 发起网络请求
    src/main/market-1024.ts:87
    res = await net.fetch(`${API_B}/api/v2/plugins?${params}`)
  • 发起网络请求
    src/main/market-dshfind.ts:45
    const res = await net.fetch(`${API_C}/api/plugins-data`)
  • 发起网络请求
    src/main/market.ts:30
    const res = await net.fetch(`${API}${path}`, {
  • 发起网络请求
    src/main/market.ts:145
    res = await net.fetch(`${API}/repos/${encodeURIComponent(o)}/${encodeURIComponent(r)}/readme`, {
  • 读取本地文件
    src/main/plugins.ts:21
    const raw = readFileSync(file, 'utf8').replace(/^ FEFF/, '')
  • 读取本地文件
    src/main/plugins.ts:66
    const parsed = yaml.load(readFileSync(file, 'utf8'), { schema: ENTRY_LIST_SCHEMA })
  • 写入本地文件
    src/main/plugins.ts:79
    writeFileSync(file, header + yaml.dump(patches, { schema: ENTRY_LIST_SCHEMA, noRefs: true }) + '\n')
  • 读取本地文件
    src/main/plugins.ts:235
    if (storeDir && existsSync(storeDir)) {
  • 读取本地文件
    src/main/plugins.ts:312
    raw = readFileSync(file, 'utf8').replace(/^ FEFF/, '')
  • 读取本地文件
    src/main/plugins.ts:344
    if (!existsSync(file)) return false
  • 读取本地文件
    src/main/plugins.ts:348
    let text = readFileSync(file, 'utf8')
  • 写入本地文件
    src/main/plugins.ts:356
    writeFileSync(file, text, 'utf8')
  • 写入本地文件
    src/main/plugins.ts:579
    if (changed) writeFileSync(path, text)
  • 写入本地文件
    src/main/plugins.ts:648
    writeFileSync(path, lines.join(eol))
  • 请求外部主机registry.npmmirror.com
    src/main/plugins.ts:748
    const res = await fetch(`https://registry.npmmirror.com/${regName}`, { signal: AbortSignal.timeout(8000) })
  • 发起网络请求
    src/main/plugins.ts:748
    const res = await fetch(`https://registry.npmmirror.com/${regName}`, { signal: AbortSignal.timeout(8000) })
  • 写入本地文件
    src/main/plugins.ts:898
    writeFileSync(file, JSON.stringify(manifest, null, 2), 'utf8')
  • 写入本地文件
    src/main/plugins.ts:929
    writeFileSync(file, JSON.stringify(manifest, null, 2), 'utf8')
  • 执行外部命令固定命令
    src/main/plugins.ts:1511
    execFileSync('cmd', ['/c', 'mklink', '/J', link, fallback])
  • 发起网络请求
    src/main/plugins.ts:1568
    const indexRes = await fetch(toCdn(MARKET_INDEX_URL), { signal: AbortSignal.timeout(8000) })
  • 发起网络请求
    src/main/plugins.ts:1573
    const res = await fetch(toCdn(pack.sourceUrl), { signal: AbortSignal.timeout(8000) })
  • 执行外部命令固定命令
    src/main/plugins.ts:1758
    p = spawn('git', ['--version'], { windowsHide: true, stdio: ['ignore', 'ignore', 'ignore'] })
  • 删除本地文件递归
    src/main/plugins.ts:1814
    if (existsSync(gitDir)) rmSync(gitDir, { recursive: true, force: true })
  • 删除本地文件递归
    src/main/plugins.ts:1817
    rmSync(stage, { recursive: true, force: true })
  • 发起网络请求
    src/main/plugins.ts:1925
    const res = await net.fetch(
  • 读取本地文件
    src/main/pnpm-compat.ts:35
    if (!existsSync(join(profileDirPath, 'pnpm-workspace.yaml'))) return pluginArgs
  • 读取本地文件
    src/main/popup.ts:24
    if (existsSync(p)) return p
  • 读取本地文件
    src/main/preload.ts:14
    if (existsSync(p)) return p
  • 读取本地文件
    src/main/runtime.ts:62
    const parsed = existsSync(file) ? (yaml.load(readFileSync(file, 'utf8')) as unknown) : null
  • 读取本地文件
    src/main/runtime.ts:62
    const parsed = existsSync(file) ? (yaml.load(readFileSync(file, 'utf8')) as unknown) : null
  • 读取本地文件
    src/main/runtime.ts:71
    let changed = !existsSync(file)
  • 写入本地文件
    src/main/runtime.ts:81
    writeFileSync(file, yaml.dump(doc, { noRefs: true, lineWidth: -1 }), 'utf8')
  • 读取本地文件
    src/main/runtime.ts:88
    return existsSync(nodeExe()) ? nodeExe() : null
  • 读取本地文件
    src/main/runtime.ts:92
    return existsSync(dshBin()) ? dshBin() : null
  • 读取本地文件
    src/main/runtime.ts:111
    if (existsSync(p)) {
  • 执行外部命令来自配置/变量
    src/main/runtime.ts:292
    const p = spawn(nodeExe(), ['-v'], { windowsHide: true, stdio: ['ignore', 'pipe', 'ignore'] })
  • 写入本地文件
    src/main/runtime.ts:321
    const file = createWriteStream(dest)
  • 写入本地文件
    src/main/runtime.ts:470
    mkdirSync(root, { recursive: true })
  • 写入本地文件
    src/main/runtime.ts:476
    mkdirSync(pluginDir, { recursive: true })
  • 写入本地文件
    src/main/runtime.ts:512
    mkdirSync(stage, { recursive: true })
  • 写入本地文件
    src/main/runtime.ts:522
    renameSync(inner, dir)
  • 删除本地文件递归
    src/main/runtime.ts:523
    rmSync(stage, { recursive: true, force: true })
  • 删除本地文件
    src/main/runtime.ts:524
    rmSync(zip, { force: true })
  • 读取本地文件
    src/main/security.ts:88
    raw = readFileSync(src.file, 'utf8')
  • 删除本地文件
    src/main/security.ts:112
    rmSync(src.file, { force: true })
  • 写入本地文件
    src/main/security.ts:146
    writeFileSync(filePath, lines, 'utf8')
  • 读取本地文件
    src/main/security.ts:161
    const raw = readFileSync(whitelistFilePath(), 'utf8')
  • 读取本地文件
    src/main/security.ts:175
    if (!existsSync(p)) writeFileSync(p, '# 白名单 = 忽略检测的内容。每行一个工具名,名单内的工具即使携带密钥也不告警。\n# 留空 = 检测所有非官方第三方工具。\n# 例:\n# my-http-proxy\n', 'utf8')
  • 写入本地文件
    src/main/security.ts:175
    if (!existsSync(p)) writeFileSync(p, '# 白名单 = 忽略检测的内容。每行一个工具名,名单内的工具即使携带密钥也不告警。\n# 留空 = 检测所有非官方第三方工具。\n# 例:\n# my-http-proxy\n', 'utf8')
  • 读取本地文件
    src/main/security.ts:241
    const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'))
  • 写入本地文件
    src/main/security.ts:245
    writeFileSync(pkgPath, JSON.stringify(pkg, null, 2), 'utf8')
  • 读取本地文件
    src/main/shortcuts.ts:26
    if (existsSync(join(app.getPath('userData'), SENTINEL))) return
  • 执行外部命令固定命令
    src/main/shortcuts.ts:55
    const child = spawn('powershell', ['-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-Command', script], {
  • 写入本地文件
    src/main/shortcuts.ts:68
    writeFileSync(join(app.getPath('userData'), SENTINEL), 'ok\n')
  • 执行外部命令来自配置/变量
    src/main/task.ts:53
    child = spawn(cmd, args, {
  • 执行外部命令固定命令
    src/main/task.ts:126
    spawn('taskkill', ['/pid', String(child.pid), '/t', '/f'], { windowsHide: true })
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
涉及外部主机:registry.npmmirror.com

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

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

界面预览

6 张 · 点击查看大图

功能亮点

  • 多实例管理中枢
  • 多开并行
  • 整合包下载

README

由 DeepSeek 最新模型翻译生成
DSH Launcher V3 — 鲸罗棋布 不用装 Node.js,不用源码,一键部署便携运行环境; DSH Web 直接内嵌在客户端窗口里。 从「启动器」升级为「多实例管理中枢」 —— 一套客户端并行运行多套独立的 DSH 环境,每个环境自由搭配不同的插件组合;配合推荐整合包一键装机与带分类筛选的插件市场,把插件生态的灵活性变成普通用户也能随手使用的能力。 特别感谢社区作者 @baihejiangnan的倾力相助 主界面多实例管理 V3版本 新功能亮点 | 亮点 | 说明 | | 多实例并行 | 支持多开DSH,每一套DSH实例可自由配置不同插件组合 | | 内置整合包 | 为新手提供多套已优化的插件组合,上手即用 | | 安全监测 | 安全审计时间轴 + 泄露检测,守护账号与会话数据安全 | | 插件市场 | 分类快速找到想要的插件,内置三种插件源 | | 本地插件管理 | 系统全新升级,适配多实例,避免重复下载插件 | | 一键部署 | 内置独立环境 , 无需准备 , 全程一键,离线可用 | | 客户端界面 | DSH Web 直接内嵌在原生窗口,多开更丝滑 | | 桌面体验 | 系统托盘三态状态灯 + 悬浮球 + 开屏动画 | ->V3版本介绍<- 内核零改动:DSH Launcher 直接运行官方 dsh,完整保留「一切皆插件」架构与全部官方能力。
展开完整文档(README 剩余 1 节)
DSH Launcher V3 — 鲸罗棋布

不用装 Node.js,不用源码,一键部署便携运行环境; DSH Web 直接内嵌在客户端窗口里。

从「启动器」升级为「多实例管理中枢」 —— 一套客户端并行运行多套独立的 DSH 环境,每个环境自由搭配不同的插件组合;配合推荐整合包一键装机与带分类筛选的插件市场,把插件生态的灵活性变成普通用户也能随手使用的能力。

特别感谢社区作者 @baihejiangnan的倾力相助

主界面多实例管理

V3版本 新功能亮点

| 亮点 | 说明 |
| 多实例并行 | 支持多开DSH,每一套DSH实例可自由配置不同插件组合 |
| 内置整合包 | 为新手提供多套已优化的插件组合,上手即用 |
| 安全监测 | 安全审计时间轴 + 泄露检测,守护账号与会话数据安全 |
| 插件市场 | 分类快速找到想要的插件,内置三种插件源 |
| 本地插件管理 | 系统全新升级,适配多实例,避免重复下载插件 |
| 一键部署 | 内置独立环境 , 无需准备 , 全程一键,离线可用 |
| 客户端界面 | DSH Web 直接内嵌在原生窗口,多开更丝滑 |
| 桌面体验 | 系统托盘三态状态灯 + 悬浮球 + 开屏动画 |

->V3版本介绍<-

内核零改动:DSH Launcher 直接运行官方 dsh,完整保留「一切皆插件」架构与全部官方能力。
数据目录(DSH_HOME)与 CLI 完全兼容:默认共享已有目录,已有会话 / API Key 直接生效;也可为实例创建全新独立目录,会话、插件、凭据与其余实例彻底隔离。

下载安装

GitHub Releases(推荐)

| 文件 | 说明 | 大小 |
| 标准版 exe | NSIS 安装到系统,自动创建桌面 / 开始菜单快捷方式 | ~100 MB |
| 简单版 exe | 不带多实例的极简版本,适合只需单个 DSH 的用户 | ~100 MB |
| 专业版Launcher | 多实例系统,轻量化,新手不推荐(适配Win/linux/mac) | ~ 20 MB |
更多版本见 Releases 页面。

📺 快速上手视频教程:BiliBili

安装版数据目录在 %APPDATA%\dsh-launcher;DSH 会话数据默认沿用 ~\.dsh(DSH_HOME)。
想强制指定 DSH 配置目录?启动前设置环境变量 DSH_HOME 即可(与 dsh 命令行行为一致)。

首次使用:

1. 双击安装,安装完成后启动 DSH Launcher,显示开屏动画。
2. 进入「设置 → 快速离线部署」点击「快速离线部署」,自动安装便携 Node + pnpm + dsh 运行环境,部署完成自动切换为内置模式并回填路径。
3. 回到「控制台」点击「启动」,就绪后自动进入 DSH 界面,即可开始使用。
4. 如尚未配置 API Key,在 DSH 界面填写即可。

快速离线部署 · 一键下载便携环境

升级部署:

- 覆盖安装新版安装包即可,数据不会丢失;安装器会自动结束运行中的旧进程。
- 「更新内置 dsh」只升级内置配套插件,不会覆盖 ~\.dsh 里的第三方插件与 cordis.patch.yml 手动条目。

新功能介绍

多实例

- 一套客户端并行运行多个互不干扰的 DSH 实例,每个实例拥有独立配置与端口
- 可以给「写代码」「日常聊天」「跑测试」各建一个实例,切换实例 = 切换整套插件环境
- 新建实例模式:(原理详见:DSH_HOME 隔离)

「共享」——沿用现有数据目录(共享会话记录,预设,设置选项等等)

「独立」——创建全新数据目录(会话、插件、等其他实例彻底隔离)

- 每个实例可单独从客户端控制,独立开启
- 对于使用「共享」模式的实例,不能同时在一个会话工作

多实例管理

推荐整合包

- 不用自己挑选插件 —— 内置两个精选整合包,一键下载、自动建实例、自动装齐
- 下载过程显示进度条,整合包内插件均独立下载,相互隔离
- 对于第三方插件,常有插件之间的兼容性问题,整合包加入补丁修复兼容问题(详见:插件包)

安全系统

- 通过dsh-audit探针来只读监测dsh核心数据流变化
- 审计日志时间轴:以时间轴形式清晰呈现关键安全操作与事件记录,一眼掌握状态变化

安全审计时间轴

- 泄露检测:自动监测 API 凭据 / 数据是否泄露,发现风险及时预警

泄露检测

新版插件市场

- 分类标签:按分类标签快速找到感兴趣的功能,卡片上直接显示命中分类,点击即可反向筛选
- 集成插件下载源:Github,Deepseek1024,dshfind 提供多元化下载渠道(插件中文简介)

- 插件详情内嵌预览,一键安装并归档到本地插件库

插件市场

新版本地插件管理

- 采用矩阵式管理:清晰看见每个插件在每个实例的启用情况,一键管理

插件矩阵

其余功能

- 余额小部件
- 控制台 启动/重启/关闭
- 新增液态玻璃风格外观,可自定义背景图片
- 系统托盘常驻 + 托盘三态状态灯、全屏沉浸 + 悬浮球、开屏动画、关闭至托盘
- 悬浮球,开屏动画

余额与日志

如果您有任何想要的新功能,欢迎来找我交流!QQ交流群:957159489

QQ 交流群

系统要求

- Windows 10/11(x64)
- 内置版无需预装 Node.js 或任何其他运行时
- 4GB+ 内存(推荐)

从源码构建

pnpm install # 首次需要下载 Electron,网络慢时可在 .npmrc 配置 electron_mirror
pnpm dev # 开发模式(HMR)
pnpm build # 构建 main / preload / renderer 到 out/
pnpm dist # electron-vite build + electron-builder --win → release/

网络受限时:Electron 镜像 $env:ELECTRON_MIRROR='https://npmmirror.com/mirrors/electron/'。

架构

┌──────────────────────────────────────────────────┐
│ Electron 壳(main process) │ │ · 单实例锁 / 窗口 / 托盘 / 悬浮球 / 快捷方式维护 │ │ · 多实例 harness 生命周期(启动/停止/重启/超时保护) │ │ · 整合包装机 / 插件市场(分类筛选) / 余额 │ └──────────────┬───────────────────────────────────┘ │ spawn node dsh/lib/bin.js <profile>
│ (DSH_HOME=<共享或独立数据目录>)
▼
内置 node.exe + @deepseek-ai/dsh 输出 "dsh web: http://127.0.0.1:<port>" │ 就绪探测(HTTP 200)后加载 ▼ WebContentsView 内嵌 DSH UI(单窗口,仅本机回环)

贡献

- @MarcoG-h — 项目发起者与维护者
- @baihejiangnan — 整合包dsh-plugin-pack发起者与维护者;灵感提供者

许可证

MIT。基于 deepseek-ai/deepseek-harness(MIT)。
预览分享卡片长什么样 ↓MarcoG-h/DSH-Launcher
分享 · DeepSeek Harness Hub
MarcoG-h/DSH-Launcher

最全面的DeepSeek Harness🐋启动器 首创多实例管理中枢 | 多开并行 | 整合包下载 | 安全保护 |…

回到顶部