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

桌面智能体工作空间 lencx/Minke

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

基于 DeepSeek Harness 的本地优先桌面智能体工作空间

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

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

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add lencx/Minke
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · platform
装得上吗
作者未把包发布到 npm,只能用源码安装
插件本身没问题,是分发方式不同
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成

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

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

engines.node 要求 >=24,不满足 Node 22.19.0;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✗npm 包minke(未发布到 npm,仅可源码安装)
✗Node 引擎要求 >=24 · 基线 Node 22.19 不满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/3 09:17:08

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 96 处,展示前 82 条)
  • 读取本地文件
    config/path-aliases.mts:63
    return statSync(candidate).isFile();
  • 写入本地文件
    desktop/main/app-data-paths.ts:20
    mkdirSync(dataPath, { recursive: true, mode: 0o700 });
  • 发起网络请求
    desktop/main/app-update-runtime.ts:232
    this.#downloadSession.fetch(input, {
  • 读取本地文件
    desktop/main/app-update-runtime.ts:333
    const root = await lstat(join(this.#options.userDataPath, "updates"));
  • 读取本地文件
    desktop/main/app-update-runtime.ts:340
    const directory = await lstat(cached.directory);
  • 写入本地文件
    desktop/main/app-update-runtime.ts:369
    await chmod(path, 0o700);
  • 写入本地文件
    desktop/main/app-update-runtime.ts:391
    await mkdir(updatesRoot, {
  • 读取本地文件
    desktop/main/app-update-runtime.ts:395
    const updatesRootDetails = await lstat(updatesRoot);
  • 写入本地文件
    desktop/main/app-update-runtime.ts:404
    await chmod(updatesRoot, 0o700);
  • 写入本地文件
    desktop/main/app-update-runtime.ts:408
    await chmod(downloadRoot, 0o700);
  • 写入本地文件
    desktop/main/app-update-runtime.ts:422
    await rename(downloadRoot, cached.directory);
  • 删除本地文件
    desktop/main/app-update-runtime.ts:425
    await rm(downloadRoot, {
  • 删除本地文件
    desktop/main/app-update-runtime.ts:439
    await rm(download.directory, {
  • 读取本地文件
    desktop/main/app-update.ts:276
    (async (path) => await readFile(path, "utf8")),
  • 读取本地文件
    desktop/main/app-update.ts:450
    const pathDetails = await lstat(path);
  • 读取本地文件
    desktop/main/application.ts:283
    existsSync(minkeConfig.path) ? () => shortcutStore.read() : undefined,
  • 读取本地文件
    desktop/main/application.ts:292
    const hasLegacyTerminalSettings = existsSync(minkeConfig.path);
  • 发起网络请求
    desktop/main/application.ts:645
    telegramNetworkSession.fetch(
  • 发起网络请求
    desktop/main/application.ts:669
    discordNetworkSession.fetch(
  • 写入剪贴板
    desktop/main/application.ts:705
    writeText: (value) => clipboard.writeText(value),
  • 写入本地文件
    desktop/main/crash-report.ts:33
    await mkdir(directory, { recursive: true, mode: 0o700 });
  • 写入本地文件
    desktop/main/crash-report.ts:41
    await writeFile(path, report, { mode: 0o600, flag: "wx" });
  • 读取本地文件
    desktop/main/crash-report.ts:43
    const names = (await readdir(directory)).filter(name => REPORT_NAME.test(name)).sort();
  • 删除本地文件
    desktop/main/crash-report.ts:44
    for (const name of names.slice(0, Math.max(0, names.length - 10))) await unlink(join(directory, name));
  • 读取本地文件
    desktop/main/data-home-migration.ts:152
    const details = await lstat(path);
  • 读取本地文件
    desktop/main/data-home-migration.ts:173
    linkTarget: await readlink(path),
  • 读取本地文件
    desktop/main/data-home-migration.ts:190
    for await (const chunk of createReadStream(entry.absolutePath)) {
  • 读取本地文件
    desktop/main/data-home-migration.ts:207
    return await readFile(entry.absolutePath);
  • 读取本地文件
    desktop/main/data-home-migration.ts:237
    await lstat(destination);
  • 写入本地文件
    desktop/main/data-home-migration.ts:244
    await rename(stagedPath, destination);
  • 写入本地文件
    desktop/main/data-home-migration.ts:255
    await writeFile(stagedPath, entry.content, {
  • 写入本地文件
    desktop/main/data-home-migration.ts:263
    await copyFile(
  • 写入本地文件
    desktop/main/data-home-migration.ts:269
    await chmod(stagedPath, entry.mode & 0o777);
  • 写入本地文件
    desktop/main/data-home-migration.ts:291
    await rename(stagedPath, destination);
  • 读取本地文件
    desktop/main/data-home-migration.ts:295
    return (await readdir(path))
  • 写入本地文件
    desktop/main/data-home-migration.ts:646
    await mkdir(targetParent, {
  • 删除本地文件递归
    desktop/main/data-home-migration.ts:713
    await rm(stagingRoot, { recursive: true, force: true });
  • 删除本地文件
    desktop/main/data-home-migration.ts:1005
    await rm(temporaryPath, { force: true });
  • 读取本地文件
    desktop/main/data-home-structured-merge.ts:329
    await realpath(current),
  • 读取本地文件
    desktop/main/data-home.ts:112
    return (await stat(path)).isDirectory();
  • 读取本地文件
    desktop/main/harness-launch.ts:24
    await readFile(join(runtimeRoot, "dsh-runtime.json"), "utf8"),
  • 发起网络请求
    desktop/main/harness-permission-policy.ts:98
    void Promise.resolve().then(() => microphone.request()).then(
  • 读取本地文件
    desktop/main/harness-runtime.ts:236
    access(layout.entryPath),
  • 读取本地文件
    desktop/main/harness-runtime.ts:237
    access(layout.pnpmEntry),
  • 读取本地文件
    desktop/main/harness-runtime.ts:238
    access(layout.runtimeBin),
  • 读取本地文件
    desktop/main/harness-runtime.ts:239
    access(layout.productPatch),
  • 写入本地文件
    desktop/main/harness-runtime.ts:241
    await mkdir(this.#options.dshHome, { recursive: true });
  • 执行外部命令来自配置/变量
    desktop/main/harness-runtime.ts:248
    const child = spawn(
  • 读取本地文件
    desktop/main/local-model-command.ts:131
    await access(
  • 读取本地文件
    desktop/main/local-model-command.ts:135
    return (await stat(path)).isFile();
  • 执行外部命令来自配置/变量
    desktop/main/local-model-status.ts:20
    execFile(command, args, {
  • 执行外部命令来自配置/变量
    desktop/main/login-shell-environment.ts:90
    const child = spawn(shell, ["-ilc", DUMP], {
  • 执行外部命令固定命令
    desktop/main/macos-quarantine.ts:12
    execFile(
  • 发起网络请求
    desktop/main/main-window.ts:186
    (url, init) => this.#surfaceSession.fetch(url, init));
  • 读取本地文件
    desktop/main/minke-config.ts:168
    JSON.parse(await readFile(this.path, "utf8")),
  • 写入本地文件
    desktop/main/minke-config.ts:398
    await mkdir(dirname(this.path), {
  • 写入本地文件
    desktop/main/minke-config.ts:406
    await writeFile(
  • 写入本地文件
    desktop/main/minke-config.ts:414
    await rename(temporaryPath, this.path);
  • 删除本地文件
    desktop/main/minke-config.ts:416
    await rm(temporaryPath, { force: true });
  • 删除本地文件
    desktop/main/plugin-cache.ts:14
    await rm(legacyPluginCatalogCacheFilePath(userDataPath), {
  • 读取本地文件
    desktop/main/profile-migration.ts:84
    try { return await readFile(path, "utf8"); }
  • 读取本地文件
    desktop/main/profile-migration.ts:107
    const saved = JSON.parse(await readFile(marker, "utf8")) as { version?: number };
  • 写入本地文件
    desktop/main/shortcut-persistence.ts:29
    await mkdir(userData, { recursive: true, mode: 0o700 });
  • 写入本地文件
    desktop/main/shortcut-persistence.ts:32
    await writeFile(temporary, raw, { mode: 0o600, flag: "wx" });
  • 写入本地文件
    desktop/main/shortcut-persistence.ts:33
    await rename(temporary, path);
  • 删除本地文件
    desktop/main/shortcut-persistence.ts:34
    } finally { await unlink(temporary).catch(error => { if (error.code !== "ENOENT") throw error; }); }
  • 读取本地文件
    desktop/main/shortcut-persistence.ts:38
    try { return await readFile(path, "utf8"); }
  • 读取本地文件
    desktop/main/windows-quarantine.ts:35
    await readFile(streamPath, "utf8"),
  • 发起网络请求
    packages/im-discord/src/rest.ts:612
    response = await this.#fetch(
  • 读取本地文件
    packages/im-gateway/src/sqlite-mailbox.ts:490
    if (!existsSync(directory)) {
  • 写入本地文件
    packages/im-gateway/src/sqlite-mailbox.ts:491
    mkdirSync(directory, { mode: 0o700, recursive: true });
  • 写入本地文件
    packages/im-gateway/src/sqlite-mailbox.ts:495
    chmodSync(directory, 0o700);
  • 写入本地文件
    packages/im-gateway/src/sqlite-mailbox.ts:2643
    if (existsSync(path)) chmodSync(path, 0o600);
  • 读取本地文件
    packages/im-gateway/src/sqlite-mailbox.ts:2643
    if (existsSync(path)) chmodSync(path, 0o600);
  • 发起网络请求
    packages/im-telegram/src/network.ts:415
    const response = await this.#fetch(
  • 发起网络请求
    packages/im-weixin/src/network.ts:633
    const response = await this.#fetch(options.url, {
  • 发起网络请求
    packages/model-runtime/src/core.ts:320
    const response = await host.fetch(url, {
  • 执行外部命令来自配置/变量
    packages/remote-access/src/cloudflare.ts:91
    return spawnChild(command, [...args], options);
  • 读取本地文件
    packages/remote-access/src/discovery.ts:141
    await access(
  • 读取本地文件
    packages/remote-access/src/discovery.ts:145
    return (await stat(path)).isFile();
  • 执行外部命令来自配置/变量
    packages/remote-access/src/tailscale.ts:91
    execFile(
  • 执行外部命令来自配置/变量
    packages/remote-access/src/tailscale.ts:121
    return spawnChild(command, [...args], options);
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-client-shortcuts@deepseek-ai/dsh-client-ui-settings-general@deepseek-ai/dsh-client-ui-sidebar-browser@deepseek-ai/dsh-typert-protocol
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

6 张 · 点击查看大图

功能亮点

  • 本地优先桌面工作空间

README

由 DeepSeek 最新模型翻译生成
Minke 基于 DeepSeek Harness 的本地优先桌面智能体工作空间 English · 简体中文 Minke 是基于 DeepSeek Harness 的本地优先桌面智能体工作空间,将对话、文件、终端和浏览器整合在一起,支持 macOS、Windows 和 Linux。会话和配置保存在本机。 Minke 是独立社区项目,正在持续开发中;已发布安装包可能与当前源码有所不同。 核心亮点 - 浏览器共同操作 — Agent 在可见的网页中执行任务,你可以随时接管,并将页面标注发回对话。 - 一体化工作空间 — 并排使用对话、文件和终端,通过分屏与底栏组织工作,直接编辑文件、预览文档和审阅修改。 - 跨设备访问 — 从手机或其他电脑通过 Web / PWA 访问工作空间,也可以通过微信、Telegram 和 Discord 发起任务。 - 云端与本地模型 — 使用云端模型或自定义接口,自动发现 LM Studio、Ollama 模型,并按需启动本地服务。 - 智能体与插件扩展 — 使用 DSH 的预设、技能、子代理和定时任务,通过原生插件管理扩展能力。 从其他设备远程访问 Minke 的远程访问是由 Minke Host 支撑的响应式 Web 客户端,并不是 Electron 窗口的视频流或触控投影。
展开完整文档(README 剩余 1 节)
Minke

基于 DeepSeek Harness 的本地优先桌面智能体工作空间

English · 简体中文

Minke 是基于 DeepSeek Harness 的本地优先桌面智能体工作空间,将对话、文件、终端和浏览器整合在一起,支持 macOS、Windows 和 Linux。会话和配置保存在本机。

Minke 是独立社区项目,正在持续开发中;已发布安装包可能与当前源码有所不同。

核心亮点

- 浏览器共同操作 — Agent 在可见的网页中执行任务,你可以随时接管,并将页面标注发回对话。
- 一体化工作空间 — 并排使用对话、文件和终端,通过分屏与底栏组织工作,直接编辑文件、预览文档和审阅修改。
- 跨设备访问 — 从手机或其他电脑通过 Web / PWA 访问工作空间,也可以通过微信、Telegram 和 Discord 发起任务。
- 云端与本地模型 — 使用云端模型或自定义接口,自动发现 LM Studio、Ollama 模型,并按需启动本地服务。
- 智能体与插件扩展 — 使用 DSH 的预设、技能、子代理和定时任务,通过原生插件管理扩展能力。

从其他设备远程访问

Minke 的远程访问是由 Minke Host 支撑的响应式 Web 客户端,并不是 Electron 窗口的视频流或触控投影。你可以在手机上继续对话、启动智能体任务、管理项目文件,并使用实际运行在 Minke 电脑上的终端。

Minke 在手机与桌面上的远程工作空间

[!NOTE]
Tailscale Serve HTTPS、Tailscale Direct IP 和 Cloudflare Access 均已完成端到端测试回归,目前都可以使用。

- Tailscale Serve HTTPS(推荐) — 适合已经加入同一 tailnet 的设备,提供安全的 HTTPS 地址,并支持安装 PWA。
- Tailscale Direct IP(高级) — 仅绑定当前设备的 Tailscale IPv4。流量仍由 Tailscale 端到端加密,但访问地址是 HTTP,不属于浏览器安全上下文。
- Cloudflare Access — 通过受身份策略保护的 Named Tunnel 从公网访问,手机无需安装 Tailscale;使用前需配置 Cloudflare Tunnel、Access 应用和允许访问的身份。

推荐方案:Tailscale Serve

Minke 可以通过 Tailscale Serve 私密地提供响应式 Web 界面。Harness 仍然只监听本机回环地址,不会暴露到局域网,也不会启用公开的 Tailscale Funnel。

1. 在运行 Minke 的电脑和手机上安装 Tailscale,登录同一个 tailnet,并确认电脑已连接。
2. 打开 Minke 的 连接 → 设备访问 → 远程访问,选择 HTTPS Serve 并启用远程访问。Minke 会在后台连接,无需重启应用。
3. 在手机上打开界面显示的 https://…ts.net 地址。

安装为 PWA

通过 Tailscale Serve 或 Cloudflare Access 的 HTTPS 地址打开远程页面,点击侧边栏中的 安装 Minke,并接受浏览器的安装提示。在 iPhone 或 iPad 上,请使用 分享 → 添加到主屏幕。
安装后会以独立应用模式启动;网络较差时会展示连接中或离线状态,而不是静默展示缓存的工作空间内容。

Minke 同一时间只启用一条远程链路,并只在应用运行期间持有前台代理,退出时会将其停止。远程页面能够启动 Agent 任务,并使用 Minke 已授权的本机工具,因此请只允许可信的 tailnet 成员或 Cloudflare Access 身份访问。

安装

请仅从 Minke 官方 GitHub Releases 页面下载安装包。

| 平台 | 架构 | 安装包 |
| macOS | Apple Silicon(arm64) | .dmg |
| macOS | Intel(x64) | .dmg |
| Windows | x64 | .exe |
| Linux | Debian / Ubuntu(x64) | .deb |
| Linux | Fedora / RHEL(x64) | .rpm |
| Linux | x64(便携 AppImage) | .AppImage |

打包后的 macOS、Windows 和 Linux 版本都会自动检查稳定更新。Minke 会为当前系统选择名称固定的 DMG、EXE、DEB、RPM 或 AppImage,校验 GitHub 不可变 Release、下载地址链、精确大小、SHA-256 和系统可用的来源属性,再询问是否打开。可在 设置 → Minke → 偏好设置 → 软件更新 中关闭后台下载;关闭后必须先确认“下载更新”。
也可随时在 关于 Minke → 检查更新 中手动触发。安装过程始终需要用户明确确认。
用户操作和各平台行为见桌面应用更新说明。

macOS

1. 下载并打开 .dmg 文件。
2. 将 Minke.app 拖入“应用程序”目录。
3. 当前预发布版本尚未经过 Apple 公证。请先尝试在 系统设置 → 隐私与安全性 中使用 Apple 提供的“仍要打开”流程。
4. 仅当你明确接受风险且系统流程不可用时,才对已安装应用的精确路径移除 quarantine:

xattr -dr com.apple.quarantine "/Applications/Minke.app"

5. 从“应用程序”目录打开 Minke。

[!CAUTION]
移除 quarantine 属性会绕过一项 macOS 安全检查。Minke 更新器绝不会自动执行该命令。请仅将它作为最后手段,对从官方 Releases 页面下载的 Minke.app 使用,并且不要把路径替换为宽泛目录。

在 macOS 上授权凭据存储

Minke 仅在你打开连接并点击授权凭据访问后请求钥匙串权限。如果 macOS 弹出系统窗口,请输入 Mac 登录密码并选择始终允许;如果拒绝了访问,点击 重新请求授权即可。

如果凭据存储仍不可用,一种可能原因是应用签名无效或被修改,导致 macOS 无法识别 Minke 的钥匙串身份。先校验应用:

codesign --verify --deep --strict --verbose=2 "/Applications/Minke.app"

如果可信的旧预发布构建校验失败,并且不便重新安装,请先完全退出 Minke,再修复签名并重新打开:

/usr/bin/codesign --force --deep --sign - --timestamp=none "/Applications/Minke.app" \
&& /usr/bin/codesign --verify --deep --strict --verbose=2 "/Applications/Minke.app" \
&& /usr/bin/open "/Applications/Minke.app"

[!WARNING]
临时重签会替换已安装应用的现有签名。不要对具有有效 Developer ID 签名且经过 Apple 公证的版本执行;请改为重新安装官方构建。不要删除 ~/.minke/secrets 或“钥匙串访问”中的 Minke Safe Storage 项,已有通道凭据依赖这些数据。

Windows

1. 下载 Windows x64 .exe 安装程序。
2. 运行安装程序,并按照界面提示完成安装。
3. 新发布的预览版本可能触发 Windows 信誉安全提示。请先确认安装程序来自 Minke 官方 Releases 页面,再决定是否继续。

Linux

根据发行版下载对应安装包,可以通过图形化软件管理器打开,也可以在终端中安装。

Debian / Ubuntu:

sudo apt install "/path/to/minke-package.deb"

Fedora / RHEL:

sudo dnf install "/path/to/minke-package.rpm"

请将示例路径替换为实际下载的安装包路径。

从源码构建

请在与目标安装包相同的操作系统和 CPU 架构上构建 Minke。构建产物位于 out/make,本项目不支持在单一宿主机上进行跨平台打包。

当前源码使用 DSH v0.2.1-rc.2。源码提交和应用的补丁记录在 runtime 配置中;功能变化和迁移事项见 DSH 升级说明。

macOS 和 Linux 下,Minke 启动时会读取一次登录 shell 的环境,让工具、模型服务和插件命令使用其中的 PATH 与代理设置。每次 shell 尝试限时 10 秒,失败后尝试其他系统 shell,全部失败则沿用启动环境;可通过 MINKE_LOGIN_SHELL_TIMEOUT_MS 设置毫秒数。已选 Data Home 和 Minke 的运行时参数保持不变。

环境依赖:

- 支持 submodule 的 Git,并确保已检出 vendor/deepseek-harness 子模块。
- Node.js 24 或更高版本。
- pnpm 11.28.5;执行脚本前需已安装仓库依赖。
- macOS:Apple Silicon 或 Intel Mac,并安装 Xcode Command Line Tools;.dmg 只能在 macOS 上构建。
- Windows:Windows x64;如果原生依赖需要在本地编译,可能还需要安装 Visual Studio 2022 Build Tools,并选择 Desktop development with C++ 工作负载。
- Linux:Linux x64,并安装原生编译工具链、fakeroot、dpkg,以及 rpm 或 rpm-build。

首次检出源码并安装仓库依赖后,先准备 Harness runtime:

pnpm run harness:stage

该命令会安装并构建项目固定版本的 DeepSeek Harness 源码,然后将可复用的桌面 runtime 生成到 runtime/host。首次检出源码,或固定的 Harness 源码及 runtime 契约发生变化后,需要执行一次。

使用开发模式启动 Minke:

pnpm start

pnpm start 会刷新已准备 runtime 中的 Minke 集成,并启动开发应用。校验通过且内容无变化时,会跳过产品包构建和 runtime 刷新;构建产物有修改或缺失时会重新构建或修复。

开发版将桌面设置和浏览器数据存入 work/development/electron,Harness 数据存入 work/development/harness,与正式版数据隔离;这些目录已被 Git 忽略。显式设置 DSH_HOME 可以覆盖开发版 Harness 目录,建议指定独立测试目录。

为当前平台生成安装包:

pnpm make

pnpm make 会先重新执行一次完整的 runtime 准备流程,再将当前平台的安装包生成到 out/make。

macOS 可选:使用同一个签名证书打包,可减少升级后的钥匙串重复授权提示:

MINKE_MACOS_SIGN_IDENTITY="Developer ID Application: …" pnpm make
预览分享卡片长什么样 ↓lencx/Minke
分享 · DeepSeek Harness Hub
lencx/Minke

基于 DeepSeek Harness 的本地优先桌面智能体工作空间

回到顶部