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

隧道远程访问 ddtcorex/dsh-maestro-remote

DeepSeek Harnessv0.6.0
ddtcorex21 天前有提交已提供中文文档扫描:含敏感能力

通过 cloudflared 隧道加代理远程访问 DeepSeek Harness,带 PIN 认证和 Telegram 通知。

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @ddtcorex/dsh-maestro-remote
npm 源 · @ddtcorex/dsh-maestro-remote 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/10/28·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 21 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包@ddtcorex/dsh-maestro-remote @ 0.6.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 06:05:36

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 110 处,展示前 96 条)
  • 读取本地文件
    lib/vendor/store.js:14
    const st = await stat(path);
  • 读取本地文件
    lib/vendor/store.js:71
    return fingerprint(parseDoc(readFileSync(storePath({ dshHome: home }), 'utf8')));
  • 写入本地文件
    lib/vendor/store.js:148
    mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/vendor/store.js:213
    await rename(lockPath, aside);
  • 读取本地文件
    lib/vendor/store.js:219
    const moved = await stat(aside);
  • 删除本地文件
    lib/vendor/store.js:227
    await rm(aside, { force: true }).catch(() => { });
  • 写入本地文件
    lib/vendor/store.js:231
    await mkdir(dirname(path), { recursive: true, mode: DIR_MODE });
  • 读取本地文件
    lib/vendor/store.js:251
    const st = await stat(lockPath);
  • 读取本地文件
    lib/vendor/store.js:272
    if ((await readFile(lockPath, 'utf8')) === token)
  • 删除本地文件
    lib/vendor/store.js:273
    await unlink(lockPath);
  • 读取本地文件
    lib/vendor/store.js:290
    raw = await readFile(path, 'utf8');
  • 写入本地文件
    lib/vendor/store.js:311
    await mkdir(dirname(path), { recursive: true, mode: DIR_MODE });
  • 写入本地文件
    lib/vendor/store.js:314
    await writeFile(tmp, JSON.stringify(doc, null, 2) + '\n', { mode: FILE_MODE });
  • 写入本地文件
    lib/vendor/store.js:315
    await rename(tmp, path);
  • 删除本地文件
    lib/vendor/store.js:320
    await rm(tmp, { force: true }).catch(() => { });
  • 读取本地文件
    lib/remote-proxy.js:463
    if (existsSync(join(dir, 'package.json')))
  • 读取本地文件
    lib/remote-proxy.js:579
    const body = await readFile(join(loginAssetsDir, asset.file));
  • 读取本地文件
    lib/access-log.js:30
    size = (await stat(path)).size;
  • 写入本地文件
    lib/access-log.js:41
    await rename(from, to);
  • 读取本地文件
    lib/access-log.js:64
    entries = await readdir(dir);
  • 读取本地文件
    lib/access-log.js:74
    const info = await stat(full);
  • 删除本地文件
    lib/access-log.js:76
    await unlink(full);
  • 写入本地文件
    lib/access-log.js:86
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/access-log.js:93
    await appendFile(path, `${JSON.stringify({ time: new Date().toISOString(), ...entry })}\n`);
  • 读取本地文件
    client/build.mjs:15
    if (existsSync(join(workspaceCheckout, 'package.json'))) return workspaceCheckout
  • 写入本地文件
    lib/cloudflared-fetch.js:88
    const out = createWriteStream(dest);
  • 读取本地文件
    lib/cloudflared-fetch.js:92
    const rs = createReadStream(file);
  • 写入本地文件
    lib/cloudflared-fetch.js:120
    await pipeline(Readable.fromWeb(res.body), createWriteStream(dest));
  • 写入本地文件
    lib/cloudflared-fetch.js:135
    await pipeline((async function* () { yield probeBody; })(), createWriteStream(dest));
  • 写入本地文件
    lib/cloudflared-fetch.js:139
    await pipeline(Readable.fromWeb(restRes.body), createWriteStream(dest, { flags: 'a' }));
  • 删除本地文件
    lib/cloudflared-fetch.js:143
    await rm(dest, { force: true }).catch(() => { });
  • 删除本地文件
    lib/cloudflared-fetch.js:146
    await rm(dest, { force: true }).catch(() => { });
  • 写入本地文件
    lib/cloudflared-fetch.js:165
    await pipeline(Readable.fromWeb(res.body), createWriteStream(part.file));
  • 删除本地文件
    lib/cloudflared-fetch.js:170
    await Promise.all(parts.map((p) => rm(p.file, { force: true }).catch(() => { })));
  • 读取本地文件
    lib/cloudflared-fetch.js:205
    const info = await stat(tmpFile);
  • 删除本地文件
    lib/cloudflared-fetch.js:213
    await rm(tmpFile, { force: true }).catch(() => { });
  • 写入本地文件
    lib/cloudflared-fetch.js:222
    await rename(tmpFile, binPath).catch(async () => { await rm(binPath, { force: true }).catch(() => { }); await import('node:fs/promises').then((fs) =>
  • 删除本地文件
    lib/cloudflared-fetch.js:222
    await rename(tmpFile, binPath).catch(async () => { await rm(binPath, { force: true }).catch(() => { }); await import('node:fs/promises').then((fs) =>
  • 读取本地文件
    lib/cloudflared-fetch.js:231
    if ((await stat(direct).then((s) => s.isFile()).catch(() => false)))
  • 读取本地文件
    lib/cloudflared-fetch.js:238
    if ((await stat(candidate).then((s) => s.isFile()).catch(() => false))) {
  • 删除本地文件
    lib/cloudflared-fetch.js:247
    await rename(found, binPath).catch(async () => { await rm(binPath, { force: true }).catch(() => { }); await import('node:fs/promises').then((fs) => fs
  • 执行外部命令来自配置/变量
    lib/cloudflared-fetch.js:271
    execSync(process.platform === 'win32' ? 'where cloudflared' : 'command -v cloudflared', { stdio: 'ignore' });
  • 读取本地文件
    lib/config-store.js:20
    return JSON.parse(await readFile(runtimeStatePath(dshHome), 'utf8'));
  • 写入本地文件
    lib/config-store.js:29
    await mkdir(dirname(path), { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/config-store.js:30
    await writeFile(path, JSON.stringify(merged, null, 2), { encoding: 'utf-8', mode: 0o600 });
  • 写入本地文件
    lib/config-store.js:31
    await chmod(path, 0o600);
  • 写入本地文件
    lib/pin-store.js:20
    await mkdir(dirname(path), { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/pin-store.js:21
    await writeFile(path, pin, { encoding: 'utf-8', mode: 0o600 });
  • 写入本地文件
    lib/pin-store.js:22
    await chmod(path, 0o600);
  • 读取本地文件
    lib/pin-store.js:28
    const existing = (await readFile(pinPath(dshHome), 'utf-8')).trim();
  • 读取本地文件
    lib/pin-store.js:41
    const existing = (await readFile(lanPinPath(dshHome), 'utf-8')).trim();
  • 执行外部命令来自配置/变量
    lib/tunnel.js:47
    const child = spawn(bin, ['tunnel', '--url', `http://127.0.0.1:${port}`, '--protocol', 'http2', '--no-autoupdate'], { stdio: ['ignore', 'pipe', 'pipe'
  • 写入本地文件
    lib/tunnel.js:114
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/tunnel.js:115
    await writeFile(path, content, 'utf-8');
  • 执行外部命令固定命令
    lib/tunnel.js:169
    const child = spawn('cloudflared', namedTunnelArgs(configPath, tunnelId), { stdio: ['ignore', 'pipe', 'pipe'] });
  • 读取本地文件
    lib/tunnel.js:273
    const content = await readFile(p, 'utf8');
  • 读取本地文件
    src/host/access-log.ts:39
    size = (await stat(path)).size
  • 写入本地文件
    src/host/access-log.ts:48
    await rename(from, to)
  • 读取本地文件
    src/host/access-log.ts:78
    entries = await readdir(dir)
  • 读取本地文件
    src/host/access-log.ts:86
    const info = await stat(full)
  • 删除本地文件
    src/host/access-log.ts:87
    if (now - info.mtimeMs > maxAgeMs) await unlink(full)
  • 写入本地文件
    src/host/access-log.ts:97
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    src/host/access-log.ts:104
    await appendFile(path, `${JSON.stringify({ time: new Date().toISOString(), ...entry })}\n`)
  • 写入本地文件
    src/host/cloudflared-fetch.ts:113
    const out = createWriteStream(dest)
  • 读取本地文件
    src/host/cloudflared-fetch.ts:117
    const rs = createReadStream(file)
  • 写入本地文件
    src/host/cloudflared-fetch.ts:149
    await pipeline(Readable.fromWeb(res.body as never), createWriteStream(dest))
  • 写入本地文件
    src/host/cloudflared-fetch.ts:166
    createWriteStream(dest),
  • 写入本地文件
    src/host/cloudflared-fetch.ts:170
    await pipeline(Readable.fromWeb(restRes.body as never), createWriteStream(dest, { flags: 'a' }))
  • 删除本地文件
    src/host/cloudflared-fetch.ts:174
    await rm(dest, { force: true }).catch(() => {})
  • 删除本地文件
    src/host/cloudflared-fetch.ts:176
    await rm(dest, { force: true }).catch(() => {})
  • 写入本地文件
    src/host/cloudflared-fetch.ts:193
    await pipeline(Readable.fromWeb(res.body as never), createWriteStream(part.file))
  • 删除本地文件
    src/host/cloudflared-fetch.ts:197
    await Promise.all(parts.map((p) => rm(p.file, { force: true }).catch(() => {})))
  • 读取本地文件
    src/host/cloudflared-fetch.ts:238
    const info = await stat(tmpFile)
  • 删除本地文件
    src/host/cloudflared-fetch.ts:244
    await rm(tmpFile, { force: true }).catch(() => {})
  • 写入本地文件
    src/host/cloudflared-fetch.ts:256
    await rename(tmpFile, binPath).catch(async () => { await rm(binPath, { force: true }).catch(() => {}); await import('node:fs/promises').then((fs) => f
  • 删除本地文件
    src/host/cloudflared-fetch.ts:256
    await rename(tmpFile, binPath).catch(async () => { await rm(binPath, { force: true }).catch(() => {}); await import('node:fs/promises').then((fs) => f
  • 读取本地文件
    src/host/cloudflared-fetch.ts:264
    if ((await stat(direct).then((s) => s.isFile()).catch(() => false))) found = direct
  • 读取本地文件
    src/host/cloudflared-fetch.ts:270
    if ((await stat(candidate).then((s) => s.isFile()).catch(() => false))) { found = candidate; break }
  • 删除本地文件
    src/host/cloudflared-fetch.ts:275
    await rename(found, binPath).catch(async () => { await rm(binPath, { force: true }).catch(() => {}); await import('node:fs/promises').then((fs) => fs.
  • 执行外部命令来自配置/变量
    src/host/cloudflared-fetch.ts:300
    execSync(process.platform === 'win32' ? 'where cloudflared' : 'command -v cloudflared', { stdio: 'ignore' })
  • 读取本地文件
    src/host/config-store.ts:52
    return JSON.parse(await readFile(runtimeStatePath(dshHome), 'utf8')) as Record<string, unknown>
  • 写入本地文件
    src/host/config-store.ts:64
    await mkdir(dirname(path), { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/host/config-store.ts:65
    await writeFile(path, JSON.stringify(merged, null, 2), { encoding: 'utf-8', mode: 0o600 })
  • 写入本地文件
    src/host/config-store.ts:66
    await chmod(path, 0o600)
  • 写入本地文件
    src/host/pin-store.ts:25
    await mkdir(dirname(path), { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/host/pin-store.ts:26
    await writeFile(path, pin, { encoding: 'utf-8', mode: 0o600 })
  • 写入本地文件
    src/host/pin-store.ts:27
    await chmod(path, 0o600)
  • 读取本地文件
    src/host/pin-store.ts:34
    const existing = (await readFile(pinPath(dshHome), 'utf-8')).trim()
  • 读取本地文件
    src/host/pin-store.ts:47
    const existing = (await readFile(lanPinPath(dshHome), 'utf-8')).trim()
  • 读取本地文件
    src/host/remote-proxy.ts:599
    if (existsSync(join(dir, 'package.json'))) return dir
  • 读取本地文件
    src/host/remote-proxy.ts:722
    const body = await readFile(join(loginAssetsDir, asset.file))
  • 执行外部命令来自配置/变量
    src/host/tunnel.ts:72
    const child = spawn(bin, ['tunnel', '--url', `http://127.0.0.1:${port}`, '--protocol', 'http2', '--no-autoupdate'], { stdio: ['ignore', 'pipe', 'pipe'
  • 写入本地文件
    src/host/tunnel.ts:147
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    src/host/tunnel.ts:148
    await writeFile(path, content, 'utf-8')
  • 执行外部命令固定命令
    src/host/tunnel.ts:214
    const child = spawn('cloudflared', namedTunnelArgs(configPath, tunnelId), { stdio: ['ignore', 'pipe', 'pipe'] })
  • 读取本地文件
    src/host/tunnel.ts:392
    const content = await readFile(p, 'utf8')
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

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

功能亮点

  • PIN认证
  • Telegram通知
v0.6.12026-10-28
· 已修复 · BlockAssembler 恢复补丁会修补打包后的 dsh 运行时。在打包安装中,@deepseek-ai/dsh-llm 位于运行时自己的 node_modules 里,不在 link: 插件的 require 依赖图内,因此工具调用 id/name 的恢复逻辑落到了 checkout 源码路径上,修补的是智能体循环从不使用的模块实例。现在优先从正在运行的 dsh 入口解析 dsh-llm,并在启动时记录所用路径([maestro-patch] BlockAssembler restore installed via ...),解析不到类时给出警告。 · 变更内容 · chore:跟进 maestro-reviewer 改名 · fix(remote):修补打包后 dsh 运行时的 BlockAssembler · chore(release):0.6.1 完整变更日志:
v0.6.02026-10-10
· 已移除 · 过时的 quickTarget 配置项。隧道和代理都不读它。'webhook' 值、配置字段、校验器检查、Settings RPC 白名单条目都已删除。内置的键映射表仍列着这个键,所以存下的值会被直接忽略。 · 无用的 assembler 补丁候选。补丁不再探测 lib/assembler.js(构建后的 harness 把类打包进了 lib/index.js),也不再探测相对插件的路径,那条路径从未匹配过真实布局。 · 旧版 PIN 回退。PIN 存储不再读取或迁移旧的 token 和 token-lan 文件。机器上只有这些旧文件、没有 pin / pin-lan 时,首次读取会生成新 PIN。已有的 pin 和 pin-lan 文件不受影响,旧文件原样留在磁盘上。 · 已修复 · 连接行注入 webStartup。DSH 0.2.1-alpha.x 移除了 webRuntime 服务;连接条目仍在注入它,就会等待一个永不挂载的服务,dsh web 永远起不来。 · 变更内容 · docs(remote):记录依赖要求、固定版本和随包发布的连接补丁 · chore(remote):移除旧版 PIN 回退和无用代码 · docs(remote):注明包名 assembler 路径尚未验证 · 兼容 DSH 0.2.1:在连接行注入 webStartup · chore(release):0.6.0 完整变更日志:
v0.5.32026-10-07
· 已修复 · RPC 行在 DSH 0.2.x 上激活。bundle 补丁在连接条目上声明 webServer,因此调用 rpc.handle 的行不再因缺少 inject 而报 cannot get property "webServer",其通道也不再返回 405。 · 设置 RPC 可达。remote-rpc 行等待 maestroTunnel,修复了设置 > Maestro Remote 上的 HTTP 405。 · PIN 登录可用。隧道通过嵌套 inject 读取连接,因此正确的 PIN 能签发 dsh cookie,而不是返回 401。 · 变更内容 · fix(remote):在连接条目上声明 webServer · chore(release):0.5.3 完整变更日志:
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
@ddtcorex/dsh-maestro-remote DeepSeek Harness 的远程访问插件:一条 Cloudflare 隧道(quick 或 named),外加一个局域网远程代理,让 DSH 会话可以从本机之外访问,由第二道 PIN 把关,并支持二维码下发。 属于 Maestro Harness 套件(dsh-maestro-*)。三行 Cordis 补丁: dsh-maestro-remote-rpc(回环 RPC)、dsh-maestro-tunnel(隧道与局域网代理服务商)以及 maestro-patch(从 dsh-maestro-patch 吸收来的零 fork 补丁垫片)。 提供什么 - 隧道生命周期(maestroTunnel 服务):启动/停止/查看 cloudflared quick 隧道,或 named 隧道,后者只有一条入口指向带 PIN 的远程代理,该代理对 /hooks/gitlab-mr 和 /hooks/gitlab-mr/trigger 免 PIN,好让 GitLab 能投递 webhook;开机时自动恢复之前运行中的 named 隧道。 - 远程代理:隧道目标的请求处理器,带 PIN 认证(常量时间比较),配置可重载。 - cloudflared 获取器:从 PATH 解析二进制,或把它装进缓存目录。
展开完整文档(README 剩余 1 节)
@ddtcorex/dsh-maestro-remote

DeepSeek Harness 的远程访问插件:一条 Cloudflare 隧道(quick 或 named),外加一个局域网远程代理,让 DSH 会话可以从本机之外访问,由第二道 PIN 把关,并支持二维码下发。

属于 Maestro Harness 套件(dsh-maestro-*)。三行 Cordis 补丁: dsh-maestro-remote-rpc(回环 RPC)、dsh-maestro-tunnel(隧道与局域网代理服务商)以及 maestro-patch(从 dsh-maestro-patch 吸收来的零 fork 补丁垫片)。

提供什么

- 隧道生命周期(maestroTunnel 服务):启动/停止/查看 cloudflared quick 隧道,或 named 隧道,后者只有一条入口指向带 PIN 的远程代理,该代理对 /hooks/gitlab-mr 和 /hooks/gitlab-mr/trigger 免 PIN,好让 GitLab 能投递 webhook;开机时自动恢复之前运行中的 named 隧道。
- 远程代理:隧道目标的请求处理器,带 PIN 认证(常量时间比较),配置可重载。
- cloudflared 获取器:从 PATH 解析二进制,或把它装进缓存目录。

设置

配置通过内嵌设置存储持久化:一份提交进仓库、带哈希封条的 dsh-maestro-core 存储副本(src/host/vendor/store.ts),经扁平的 MaestroUserConfig 适配器读写共享的命名空间文档 ~/.dsh/dsh-maestro-config/settings.json,见 src/host/config-store.ts。本包不依赖任何已发布的设置库。机器运行时状态(lastTunnelRunning)刻意放在本包自己的 sidecar (~/.dsh/dsh-maestro-remote/runtime.json),这样改设置永远不会悄悄翻转隧道状态。

环境要求

- Node.js ^22.19.0 || >=24.0.0 和 pnpm 11+。默认用 Node 20 的 shell 会报 No such built-in module: node:sqlite;运行 dsh 或 pnpm 之前,先把 Node 22 的 bin 放到 PATH 最前面。
- DSH 0.1.x 或 0.2.x(peer 范围 <0.3.0-0)。

安装

dsh plugin --profile web add @ddtcorex/dsh-maestro-remote

本包自带 cordis.patch.yml,会自动应用。其中有一条 connection 条目声明了 webServer,DSH 0.2.x 需要它,rpc.handle 才能注册通道。别把它复制进配置档补丁,也别手动加这些行(id 重复会让加载器崩溃)。安装后重启 dsh web。

想要精确的发布版本,而不是包管理器解析出来的版本,就锁定它: dsh plugin --profile web add @ddtcorex/dsh-maestro-remote@<version>。

从检出目录用 link: 安装?每次 git pull 之后,跑 pnpm install && pnpm build
(lib/ 已被 gitignore)并重启 dsh web。

把 PIN 挡在隧道前面

代理默认监听端口 3081(设置存储里的 proxyPort;该端口被占用时会往上找,最多试 9 个端口)。named 隧道的入口如果仍指向原始的 dsh web 端口,就会绕过 PIN,所以要把隧道的 service: 指向代理端口。
8 位 PIN 保存在 ~/.dsh/dsh-maestro-remote/pin(首次使用时创建);在 Settings > Maestro Remote 里轮换。PIN cookie 的有效期由 pinSessionTtlHours 决定。

开发

pnpm install
pnpm verify # tsc --noEmit
pnpm test # vitest run
pnpm build # tsc host + tsc client + esbuild bundle -> lib/ and lib/client.js

隧道相关的改动必须实机验证(真实启动/停止 + 代理往返),不能只跑单元测试——详见 AGENTS.md。

许可证

MIT
预览分享卡片长什么样 ↓ddtcorex/dsh-maestro-remote
分享 · DeepSeek Harness Hub
ddtcorex/dsh-maestro-remote

通过 cloudflared 隧道加代理远程访问 DeepSeek Harness,带 PIN 认证和 Telegram 通知。

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