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

自用部署管理 xsoc1/dsh-selfuse

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

管理桌面端与私网入口的部署配置和脚本

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 108 处,展示前 99 条)
  • 启用终端会话(PTY)
    community-plugins/DSH-better-sidebar/src/agent-pty.ts:214
    const pty = nodePty.spawn(this.shell, shellSpawnArgs(), {
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/bundle-route.ts:51
    const info = await stat(path)
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/bundle-route.ts:56
    const etag = `"${shortHash(await readFile(path))}"`
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/bundle-route.ts:107
    const body = await readFile(join(chunkDir, `client-${name}.js`))
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/fs-tree.ts:43
    level = await opendir(path)
  • 执行外部命令固定命令
    community-plugins/DSH-better-sidebar/src/git.ts:97
    const child = spawn('git', full, {
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/index.ts:137
    const info = await stat(path).catch((error: unknown) => {
  • 写入本地文件
    community-plugins/DSH-better-sidebar/src/index.ts:225
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    community-plugins/DSH-better-sidebar/src/index.ts:226
    await writeFile(tmp, content, 'utf8')
  • 写入本地文件
    community-plugins/DSH-better-sidebar/src/index.ts:227
    await rename(tmp, path)
  • 删除本地文件
    community-plugins/DSH-better-sidebar/src/index.ts:229
    await rm(tmp, { force: true }).catch(() => {})
  • 发起网络请求
    community-plugins/DSH-better-sidebar/src/index.ts:390
    let response = await fetch(parsed, { method: 'HEAD', redirect: 'follow', signal: controller.signal })
  • 发起网络请求
    community-plugins/DSH-better-sidebar/src/index.ts:394
    response = await fetch(parsed, { method: 'GET', redirect: 'follow', signal: controller.signal })
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/index.ts:566
    const info = await stat(path)
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/index.ts:571
    const body = await readFile(path)
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/index.ts:627
    const info = await stat(absolute)
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/index.ts:632
    const body = await readFile(absolute)
  • 写入本地文件
    community-plugins/DSH-better-sidebar/src/pty-manager.ts:37
    if (existsSync(helper)) chmodSync(helper, 0o755)
  • 读取本地文件
    community-plugins/DSH-better-sidebar/src/pty-manager.ts:37
    if (existsSync(helper)) chmodSync(helper, 0o755)
  • 启用终端会话(PTY)
    community-plugins/DSH-better-sidebar/src/pty-manager.ts:122
    pty: nodePty.spawn(this.shell, shellSpawnArgs(), {
  • 读取本地文件
    community-plugins/dsh-backup/lib/index.js:232
    dirents = await readdir(root, { withFileTypes: true });
  • 读取本地文件
    community-plugins/dsh-backup/lib/index.js:242
    size = (await fsStat(`${root}/${d.name}`)).size;
  • 写入本地文件
    community-plugins/dsh-backup/lib/index.js:252
    await mkdir(dirname(p), { recursive: true });
  • 写入本地文件
    community-plugins/dsh-backup/lib/index.js:253
    await writeFile(p, content, 'utf8');
  • 读取本地文件
    community-plugins/dsh-backup/lib/index.js:270
    const info = await fsStat(absPath);
  • 读取本地文件
    community-plugins/dsh-backup/lib/index.js:274
    const bytes = await readFile(absPath);
  • 写入本地文件
    community-plugins/dsh-backup/lib/index.js:370
    await mkdir(syncDir, { recursive: true });
  • 读取本地文件
    community-plugins/dsh-backup/lib/index.js:372
    const hasGit = await fsStat(`${syncDir}/.git`).then(() => true, () => false);
  • 读取本地文件
    community-plugins/dsh-backup/lib/index.js:408
    entries = await readdir(syncDir, { withFileTypes: true });
  • 写入本地文件
    community-plugins/dsh-backup/lib/index.js:424
    await copyFile(`${root}/${b.name}`, `${syncDir}/${b.name}`);
  • 写入本地文件
    community-plugins/dsh-backup/lib/index.js:425
    await copyFile(`${root}/${b.name}.sha256`, `${syncDir}/${b.name}.sha256`);
  • 发起网络请求
    community-plugins/dsh-undo-plugin-fixed/lib/client.js:243
    return fetch(path, {
  • 读取本地文件
    community-plugins/dsh-undo-plugin-fixed/lib/index2.js:70
    const hasScoped = existsSync(join(scoped, 'auto')) || existsSync(join(scoped, 'manual'));
  • 读取本地文件
    community-plugins/dsh-undo-plugin-fixed/lib/index2.js:71
    const hasFlat = existsSync(join(LEGACY_ROOT, 'auto')) || existsSync(join(LEGACY_ROOT, 'manual'));
  • 读取本地文件
    community-plugins/dsh-undo-plugin-fixed/lib/index2.js:174
    const j = JSON.parse(readFileSync(SPEC_PATH, 'utf8').replace(/^ FEFF/, ''));
  • 读取本地文件
    community-plugins/dsh-undo-plugin-fixed/lib/index2.js:570
    const j = JSON.parse(readFileSync(SETTINGS_FILE, 'utf8').replace(/^ FEFF/, ''));
  • 执行外部命令固定命令
    community-plugins/dsh-undo-plugin-fixed/lib/index2.js:1216
    execFile('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令固定命令
    community-plugins/dsh-undo-plugin-fixed/lib/index2.js:1239
    execFile('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令固定命令
    community-plugins/dsh-undo-plugin-fixed/lib/index2.js:1254
    execFile('powershell', ['-NoProfile', '-NonInteractive', '-Command', parts.join(' ')], {
  • 读取本地文件
    community-plugins/dsh-undo-plugin-fixed/lib/index2.js:1743
    if (!existsSync(dir)) return;
  • 发起网络请求
    community-plugins/dsh-wsl-workspace/lib/client.js:30
    response = await fetch(ENDPOINT, {
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/lib/fs.js:45
    await lstat(destPath);
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/fs.js:49
    await rename(tempPath, destPath);
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/fs.js:59
    await rename(tempPath, destPath);
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/lib/fs.js:165
    async lstat(path, opts, signal) {
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:343
    if (statSync(`${letter}:\\`).isDirectory()) entries.push({
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:356
    const entries = readdirSync(winPath !== null ? winPath : joinUnc(distro, linuxPath), { withFileTypes: true }).slice(0, 1e3).map((dirent) => {
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:391
    isDirectory: statSync(readPath).isDirectory()
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:456
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:457
    writeFileSync(join(dir, "agent.cordis.yml"), transformed, "utf8");
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:465
    if (!existsSync(srcFile)) continue;
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:466
    mkdirSync(dirname(join(dir, rowFile)), { recursive: true });
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:467
    copyFileSync(srcFile, join(dir, rowFile));
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:469
    const content = readFileSync(srcFile, "utf8");
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:484
    const meta = readFileSync(join(dirname(preset.path), "preset.yml"), "utf8");
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:492
    writeFileSync(join(dir, "preset.yml"), `name: ${yamlScalar(name)}\n` + orderLine + `description: ${yamlScalar(variantDescription(preset.id))}\n`, "utf
  • 删除本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:498
    rmSync(join(userRoot, entry.name), {
  • 删除本地文件
    community-plugins/dsh-wsl-workspace/lib/index.js:505
    if (!generated.has(entry.name)) rmSync(join(userRoot, entry.name), {
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/lib/wsl-CW3VPEIA.js:24
    const parsed = JSON.parse(readFileSync(storePath(), "utf8"));
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/wsl-CW3VPEIA.js:67
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/wsl-CW3VPEIA.js:68
    writeFileSync(path, JSON.stringify(store, null, 2) + "\n", "utf8");
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/wsl-CW3VPEIA.js:91
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/lib/wsl-CW3VPEIA.js:92
    writeFileSync(path, JSON.stringify(store, null, 2) + "\n", "utf8");
  • 执行外部命令固定命令
    community-plugins/dsh-wsl-workspace/lib/wsl-CW3VPEIA.js:193
    const value = execFileSync("reg.exe", [
  • 执行外部命令固定命令
    community-plugins/dsh-wsl-workspace/lib/wsl-CW3VPEIA.js:201
    const name = execFileSync("reg.exe", [
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/src/fs.ts:93
    await lstat(destPath)
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/src/fs.ts:99
    await rename(tempPath, destPath)
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/src/fs.ts:110
    await rename(tempPath, destPath)
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/src/fs.ts:220
    override async lstat(path: string, opts?: { cwd?: string }, signal?: AbortSignal): Promise<FsPathInfo | undefined> {
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:228
    const info = statSync(`${letter}:\\`)
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:238
    const dirents = readdirSync(readPath, { withFileTypes: true })
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:279
    const info = statSync(readPath)
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:368
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:369
    writeFileSync(join(dir, 'agent.cordis.yml'), transformed, 'utf8')
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:381
    if (!existsSync(srcFile)) continue
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:382
    mkdirSync(dirname(join(dir, rowFile)), { recursive: true })
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:383
    copyFileSync(srcFile, join(dir, rowFile))
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:385
    const content = readFileSync(srcFile, 'utf8')
  • 读取本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:403
    const meta = readFileSync(join(dirname(preset.path), 'preset.yml'), 'utf8')
  • 写入本地文件
    community-plugins/dsh-wsl-workspace/src/index.ts:419
    writeFileSync(
  • 删除本地文件递归
    community-plugins/dsh-wsl-workspace/src/index.ts:432
    rmSync(join(userRoot, entry.name), { recursive: true, force: true })
  • 删除本地文件递归
    community-plugins/dsh-wsl-workspace/src/index.ts:436
    if (!generated.has(entry.name)) rmSync(join(userRoot, entry.name), { recursive: true, force: true })
  • 读取本地文件
    plugins/desktop-remote/index.mjs:197
    assert.ok((await stat(config.stateDirectory)).isDirectory(), 'Create and protect stateDirectory before boot');
  • 删除本地文件
    plugins/desktop-remote/index.mjs:208
    await unlink(join(config.stateDirectory, file)).catch(error => { if (error.code !== 'ENOENT') throw error; });
  • 写入本地文件
    plugins/desktop-remote/index.mjs:216
    await writeFile(temp, JSON.stringify(state, null, 2) + '\n', { mode: 0o600 });
  • 写入本地文件
    plugins/desktop-remote/index.mjs:217
    await rename(temp, filename);
  • 写入本地文件
    plugins/desktop-remote/index.mjs:223
    await writeFile(join(config.stateDirectory, 'connect.html'), `<!doctype html><html lang="zh-CN"><meta charset="utf-8"><title>DSH 私有连接</title>
  • 发起网络请求
    plugins/dsh-memory-panel/lib/client.js:24
    return fetch('/memory' + suffix).then(function (r) { return r.json(); }).then(unwrap);
  • 发起网络请求
    plugins/dsh-memory-panel/lib/client.js:28
    return fetch('/memory' + suffix, {
  • 写入本地文件
    plugins/dsh-memory-panel/lib/index.js:83
    await mkdir(dir, { recursive: true })
  • 读取本地文件
    plugins/dsh-memory-panel/lib/index.js:84
    const entries = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    plugins/dsh-memory-panel/lib/index.js:91
    const st = await stat(p)
  • 读取本地文件
    plugins/dsh-memory-panel/lib/index.js:108
    content = await readFile(safePath(kind, f.id), 'utf8')
  • 写入本地文件
    plugins/dsh-memory-panel/lib/index.js:181
    await mkdir(kindDir('pages'), { recursive: true })
  • 写入本地文件
    plugins/dsh-memory-panel/lib/index.js:182
    await mkdir(kindDir('notes'), { recursive: true })
  • 读取本地文件
    plugins/dsh-memory-panel/lib/index.js:213
    content = await readFile(safePath('pages', r.id), 'utf8')
  • 读取本地文件
    plugins/dsh-memory-panel/lib/index.js:230
    const content = await readFile(p, 'utf8')
  • 读取本地文件
    plugins/dsh-memory-panel/lib/index.js:244
    content = await readFile(safePath('notes', r.id), 'utf8')
  • 写入本地文件
    plugins/dsh-memory-panel/lib/index.js:287
    await writeFile(safePath('notes', id), content, 'utf8')
扫描于 2026/11/4(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-credentials@deepseek-ai/dsh-fs@deepseek-ai/dsh-fs-local@deepseek-ai/dsh-llm@deepseek-ai/dsh-settings@deepseek-ai/dsh-shell@deepseek-ai/dsh-storage-domain@deepseek-ai/dsh-timeout@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 管理部署配置
  • 管理部署脚本
  • 一键安装器

本地 DeepSeek Harness 自用管理仓库:插件、技能、脚本、配置和一键安装器

README

由 DeepSeek 最新模型翻译生成
dsh-selfuse DeepSeek Harness 自用部署的管理仓。本机入口为 F 盘官方 Windows Desktop 0.2.0-rc.2,新专用远程入口通过 Tailscale 私网 HTTPS 访问同一个 Desktop Host。旧 WSL Web、控制台和看门狗保持退役。Windows 旧会话归档在 F 盘,WSL 原会话保留。当前部署见 部署说明,历史迁移过程见 桌面版评估。 用户最新选择为tailnet 直接访问:固定根地址无需额外 DSH 登录,原生鉴权由小型中继在服务端完成;网络规则允许到达入口的 tailnet 设备拥有现有 Host 权限。桌面本地鉴权、仅私网 Serve 和无关配置保留。旧二维码登录属于可回退的历史模式,不再是当前首连要求。 2026-10-03 清除遗留强制 DERP 调试项后,iPad 恢复直连、实测延迟明显改善,用户确认「效果非常好」,授权将此方案上云;发布后补充「手机我已验收」。iPad 与手机实际验收均按用户反馈确认,长期换网仍单列。方案、诊断/回退脚本和匿名配置模板已发布。重建前读连接稳定性与旧调试项,真实 state/凭据/设备地址/日志仅保留本机。 桌面端默认端口冲突通过独立的 Desktop profile 模板 修复;初始化使用官方 standard,之后保留用户预设选择。
展开完整文档(README 剩余 1 节)
dsh-selfuse

DeepSeek Harness 自用部署的管理仓。本机入口为 F 盘官方 Windows Desktop 0.2.0-rc.2,新专用远程入口通过 Tailscale 私网 HTTPS 访问同一个 Desktop Host。旧 WSL Web、控制台和看门狗保持退役。Windows 旧会话归档在 F 盘,WSL 原会话保留。当前部署见 部署说明,历史迁移过程见 桌面版评估。

用户最新选择为tailnet 直接访问:固定根地址无需额外 DSH 登录,原生鉴权由小型中继在服务端完成;网络规则允许到达入口的 tailnet 设备拥有现有 Host 权限。桌面本地鉴权、仅私网 Serve 和无关配置保留。旧二维码登录属于可回退的历史模式,不再是当前首连要求。

2026-10-03 清除遗留强制 DERP 调试项后,iPad 恢复直连、实测延迟明显改善,用户确认「效果非常好」,授权将此方案上云;发布后补充「手机我已验收」。iPad 与手机实际验收均按用户反馈确认,长期换网仍单列。方案、诊断/回退脚本和匿名配置模板已发布。重建前读连接稳定性与旧调试项,真实 state/凭据/设备地址/日志仅保留本机。

桌面端默认端口冲突通过独立的 Desktop profile 模板 修复;初始化使用官方 standard,之后保留用户预设选择。WSL fork 仅供开发,不再作为运行服务。源码退役与原生适配已发布到 fork 固定提交,本仓 vendor/deepseek-harness pin 对齐该提交;云端源码、官方签名程序、现用配置及功能验收分别记录,不能相互替代。

从云端取回

git clone --recurse-submodules https://github.com/xsoc1/dsh-selfuse.git
cd dsh-selfuse
git submodule status vendor/deepseek-harness

完整的当前目录关系和验收边界见 当前部署说明;旧远程链路仅作为历史记录保留在 Safari/Tailscale 手册。组件索引见 manifest.json,历次维护见 docs/maintenance.md。

用户已授权接入并清理:manager-owned relay 通过原生 CLI 安装,真实 HTTPS 隔离 26 项、现行正式只读 44 项通过,iPad 与手机均已由用户实际确认验收。RustDesk 专属规则、程序/配置已精确退役并可恢复归档。当前方法以专用部署为准,历史选型与报错保留在原调研和RustDesk 记录,不作为活跃安装入口。源码和方法已发布至 main,35 份文件远端读回一致;完整证据和未验收范围见维护记录。

install.ps1、旧 config/ 和旧 plugins/ 属于早期部署快照,不应覆盖 Desktop DSH_HOME。当前 Desktop profile 先以官方 bundle 为基线,只合并必要的本机补丁;API Key、登录凭据、会话、记忆和模型文件不入库。

本地开发层的旧设置/社区/skins/all 已按用户选择归档;SSH、任务板、MinerU、undo 与闲置 SDK 随后也获准归档,优先官方原生功能。正式 Desktop 已通过官方 CLI 安装十个保留包,并补齐 F 盘外置依赖和原生记忆目录解析。2026-10-03 正常退出后更新记忆包,旧包可恢复、五份 profile 配置哈希不变;新实例九个 Host 激活、五个 Client 资源通过,用户确认设置面板已找到。隔离记忆保存读回通过,正式模型和 GitHub HTTPS 备份恢复未重新验收。重建方法见安装与运行验收,归档和证据见原生 UI 精简及维护记录。
预览分享卡片长什么样 ↓xsoc1/dsh-selfuse
分享 · DeepSeek Harness Hub
xsoc1/dsh-selfuse

管理桌面端与私网入口的部署配置和脚本

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