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

综合平台 TiaYahng/dsh-plugins

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

在设置页集中查看用量、归档、记忆与免费模型

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

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

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

状态速览

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

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

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 63 处,展示前 63 条)
  • 发起网络请求
    dsh-comprehensive-platform/client.js:398
    const response = await fetch(path, { credentials: 'same-origin', cache: 'no-store', ...options })
  • 发起网络请求
    dsh-comprehensive-platform/client.js:2624
    const response = await fetch(`${API}${path}`, { ...fetchOptions, redirect: 'error', signal: ctrl.signal })
  • 写入剪贴板
    dsh-comprehensive-platform/client.js:2750
    navigator.clipboard.writeText(text).then(() => finish(true), () => finish(legacy(text)))
  • 发起网络请求
    dsh-comprehensive-platform/client.js:6716
    const response = await fetch(SUMMARY_PATH, { method: 'GET', credentials: 'same-origin', cache: 'no-store' })
  • 执行外部命令来自配置/变量
    dsh-comprehensive-platform/free-model/server.js:97
    const child = spawn(command, args, { detached: true, stdio: 'ignore', windowsHide: true })
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/chan-relay.js:146
    const target = http.request({
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/eac-login.js:26
    response = await fetch(`${root}/auth/poll?link=${encodeURIComponent(link)}&retain=1`, {
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/eac-login.js:47
    await fetch(`${credential.base.replace(/ v1 ?$/, '')}/auth/ack?link=${encodeURIComponent(link)}`, {
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/eac-login.js:68
    const response = await fetch(`${credential.base.replace(/ v1 ?$/, '')}/auth/github/start?link=${encodeURIComponent(link)}`, {
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/eac.js:85
    if (typeof lane.fetch === 'function') return lane.fetch(url, { method, headers, body, signal })
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/eac.js:89
    const request = transport.request({
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/egress.js:105
    if (relay === null) return fetch(url, init)
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/egress.js:113
    return fetch(`http://${RELAY_HOST}:${relay.port}${target.pathname}${target.search}`, { ...init, headers })
  • 执行外部命令来自配置/变量
    dsh-comprehensive-platform/free-model/src/egress.js:162
    child = spawn(binary, ['-d', dir, '-f', configPath], { windowsHide: true, stdio: 'ignore' })
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/egress.js:287
    const outgoing = http.request({
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/egress.js:764
    const request = http.request(
  • 发起网络请求
    dsh-comprehensive-platform/free-model/src/forward.js:548
    const target = http.request({
  • 读取本地文件
    dsh-comprehensive-platform/server/memory.js:63
    const text = await readFile(settingsPath, 'utf8')
  • 写入本地文件
    dsh-comprehensive-platform/server/memory.js:118
    await writeFile(join(root, MEMORY_FILE), body, 'utf8')
  • 写入本地文件
    dsh-comprehensive-platform/server/memory.js:129
    await writeFile(agentsPath, `${text}${separator}${CONVENTION_BODY}\n`, 'utf8')
  • 删除本地文件
    dsh-comprehensive-platform/server/memory.js:141
    await unlink(agentsPath).catch(() => undefined)
  • 写入本地文件
    dsh-comprehensive-platform/server/memory.js:144
    await writeFile(agentsPath, stripped, 'utf8')
  • 写入本地文件
    dsh-comprehensive-platform/server/memory.js:306
    await writeFile(join(root, MEMORY_FILE), next, 'utf8')
  • 读取本地文件
    dsh-comprehensive-platform/server/workspace.js:42
    return await readFile(path, 'utf8')
  • 发起网络请求
    dsh-localcoding-mcp/client.js:246
    const response = await fetch(API + path, { credentials: 'same-origin', cache: 'no-store', ...options })
  • 执行外部命令固定命令
    dsh-localcoding-mcp/server/browser.js:46
    child = spawn('reg.exe', ['query', 'HKCU\\Environment', '/v', name], { windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
  • 读取密钥环境变量
    dsh-localcoding-mcp/server/browser.js:68
    const inherited = process.env.PLAYWRIGHT_MCP_EXTENSION_TOKEN
  • 读取本地文件
    dsh-localcoding-mcp/server/browser.js:122
    available: existsSync(this.entry),
  • 发起网络请求
    dsh-localcoding-mcp/server/browser.js:149
    const response = await fetch(`${this.baseUrl}/health`, { signal: AbortSignal.timeout(1_500) })
  • 读取本地文件
    dsh-localcoding-mcp/server/browser.js:159
    if (!existsSync(this.entry)) throw new Error(`Playwright MCP entry not found: ${this.entry}`)
  • 执行外部命令来自配置/变量
    dsh-localcoding-mcp/server/browser.js:186
    this.child = spawn(process.execPath, args, { env, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
  • 读取本地文件
    dsh-localcoding-mcp/server/codex.js:33
    if (existsSync(candidate)) return candidate
  • 读取本地文件
    dsh-localcoding-mcp/server/codex.js:96
    text = readFileSync(file, 'utf8')
  • 执行外部命令来自配置/变量
    dsh-localcoding-mcp/server/codex.js:119
    child = spawn(exePath, args, {
  • 执行外部命令固定命令
    dsh-localcoding-mcp/server/codex.js:183
    spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], {
  • 读取本地文件
    dsh-localcoding-mcp/server/codex.js:317
    if (!existsSync(workspace)) throw new Error(`workspace directory does not exist: ${workspace}`)
  • 发起网络请求
    dsh-localcoding-mcp/server/codex.js:404
    await fetch(url, { method: 'GET', signal: deadline, redirect: 'manual' })
  • 读取本地文件
    dsh-localcoding-mcp/server/codex.js:441
    original = readFileSync(configPath, 'utf8')
  • 写入本地文件
    dsh-localcoding-mcp/server/codex.js:448
    writeFileSync(backupPath, original, 'utf8')
  • 写入本地文件
    dsh-localcoding-mcp/server/codex.js:469
    writeFileSync(configPath, next, 'utf8')
  • 读取本地文件
    dsh-localcoding-mcp/server/codex.js:500
    entries = readdirSync(configDir)
  • 读取本地文件
    dsh-localcoding-mcp/server/codex.js:517
    writeFileSync(configPath, readFileSync(backupPath, 'utf8'), 'utf8')
  • 写入本地文件
    dsh-localcoding-mcp/server/codex.js:517
    writeFileSync(configPath, readFileSync(backupPath, 'utf8'), 'utf8')
  • 发起网络请求
    dsh-localcoding-mcp/server/mcp-client.js:113
    response = await fetch(this.endpoint, {
  • 发起网络请求
    dsh-localcoding-mcp/server/mcp-client.js:223
    await fetch(this.endpoint, {
  • 发起网络请求
    dsh-localcoding-mcp/server/process.js:25
    const response = await fetch(url, { signal: AbortSignal.timeout(2_000) })
  • 发起网络请求
    dsh-localcoding-mcp/server/process.js:45
    const response = await fetch(healthUrl, { signal: AbortSignal.timeout(1_500) })
  • 读取本地文件
    dsh-localcoding-mcp/server/process.js:169
    if (!existsSync(this.exePath)) {
  • 执行外部命令来自配置/变量
    dsh-localcoding-mcp/server/process.js:182
    this.child = spawn(this.exePath, args, {
  • 执行外部命令来自配置/变量
    dsh-localcoding-mcp/server/tunnel.js:99
    child = spawn(executable, args, {
  • 读取本地文件
    dsh-localcoding-mcp/server/tunnel.js:259
    if (!existsSync(accountsPath)) {
  • 读取本地文件
    dsh-localcoding-mcp/server/tunnel.js:265
    config = JSON.parse(readFileSync(accountsPath, 'utf8'))
  • 写入本地文件
    dsh-localcoding-mcp/server/tunnel.js:326
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    dsh-localcoding-mcp/server/tunnel.js:364
    return existsSync(this.exePath)
  • 读取本地文件
    dsh-localcoding-mcp/server/tunnel.js:509
    if (existsSync(profilePath)) {
  • 读取本地文件
    dsh-localcoding-mcp/server/tunnel.js:510
    const text = readFileSync(profilePath, 'utf8')
  • 删除本地文件
    dsh-localcoding-mcp/server/tunnel.js:530
    rmSync(pidPath, { force: true })
  • 执行外部命令来自配置/变量
    dsh-localcoding-mcp/server/tunnel.js:544
    const child = spawn(this.exePath, args, {
  • 写入本地文件
    dsh-localcoding-mcp/server/tunnel.js:554
    writeFileSync(file, String(chunk), { flag: 'a' })
  • 发起网络请求
    dsh-localcoding-mcp/server/tunnel.js:569
    const response = await fetch(`http://127.0.0.1:${healthPort}/readyz`, { signal: AbortSignal.timeout(2_000) })
  • 删除本地文件
    dsh-localcoding-mcp/server/tunnel.js:671
    rmSync(path.join(this.logDir, `tunnel-${accountId}.pid`), { force: true })
  • 发起网络请求
    dsh-localcoding-mcp/server/tunnel.js:724
    const response = await fetch(`${base}${route}`, { signal: AbortSignal.timeout(3_000) })
  • 写入本地文件
    dsh-localcoding-mcp/server/tunnel.js:789
    writeFileSync(this.runtimePath, JSON.stringify(payload, null, 2), 'utf8')
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

DSH Desktop 自制插件:综合平台(用量统计 / 归档 / 记忆 / FreeModel 四页)

README

由 DeepSeek 最新模型翻译生成
dsh-plugins DSH Harness 的自制插件。两个: | 插件 | 做什么 | | dsh-comprehensive-platform | 把自制功能收进设置里的一个页面,导航名「综合平台」 | | dsh-localcoding-mcp | 把 LocalCodingMCP 接进宿主:本地工具入表、任务出给 Codex、隧道打通网页版 ChatGPT | 综合平台(dsh-comprehensive-platform) 页面 综合平台是一个设置页、4 个页签:用量统计 / 归档历史 / 记忆系统 / FreeModel。 前三页(用量统计 / 归档历史 / 记忆系统)用本插件自己的 /dsh-desktop/ 路由,数据在本插件里。 第四页 FreeModel 不是本插件写的页面:它是 dsh-our-free-model 的设置页。做法是把它自己的代码取过来,只改必须改的地方(清单在 tools/vendor-our-free-model.mjs 的文件头与服务端阶段的注释里,每处都写了为什么),再挂成这一页的第四个页签: - 页面(前端)内嵌在 client.js 的 VENDOR 段里,十三处改动,含删掉它的「免费模型」页、去掉它自己的标题行与「公告中心」面板、EAC 挪到第三、API 指向本插件自己的前缀。
展开完整文档(README 剩余 1 节)
dsh-plugins

DSH Harness 的自制插件。两个:

| 插件 | 做什么 |
| dsh-comprehensive-platform | 把自制功能收进设置里的一个页面,导航名「综合平台」 |
| dsh-localcoding-mcp | 把 LocalCodingMCP 接进宿主:本地工具入表、任务出给 Codex、隧道打通网页版 ChatGPT |

综合平台(dsh-comprehensive-platform)

页面

综合平台是一个设置页、4 个页签:用量统计 / 归档历史 / 记忆系统 / FreeModel。

前三页(用量统计 / 归档历史 / 记忆系统)用本插件自己的 /dsh-desktop/ 路由,数据在本插件里。

第四页 FreeModel 不是本插件写的页面:它是 dsh-our-free-model 的设置页。做法是把它自己的代码取过来,只改必须改的地方(清单在 tools/vendor-our-free-model.mjs 的文件头与服务端阶段的注释里,每处都写了为什么),再挂成这一页的第四个页签:

- 页面(前端)内嵌在 client.js 的 VENDOR 段里,十三处改动,含删掉它的「免费模型」页、去掉它自己的标题行与「公告中心」面板、EAC 挪到第三、API 指向本插件自己的前缀。
- 服务端在 free-model/,提供 /api/comprehensive-platform/free-model/。
它自己的自更新、公告通道与热重载都已停用——那三样都会改写已安装的字节,而那些字节现在是本插件的;数据目录也换成自己的,避免两个插件写同一份目录。

所以这一页不依赖任何其他插件:装这一个就完整可用。那 8 个页面(白嫖模型接入 / 聚合渠道 / EAC 模型 / 省 Token / 路由 / 数据看板 / 运行日志 / 网关设置)的行为与原版一致。
来源与改动写在 free-model/NOTICE.md。

那 13 个账号渠道的包不在这个仓库里。 free-model/vendor/channel-pack/ 是第三方项目的整份拷贝,里面带着它的 Google OAuth 凭据;本仓库是公开的,推上去等于公开别人的凭据(GitHub 的推送保护也确实拦了)。
所以它 .gitignore 掉了,只留在装了它的机器上。缺了它插件照常工作:渠道列表会显示「渠道包不可用」与原因,其余页面(免费车道、EAC 模型、账本、日志、网关、省 Token、路由)不受影响——这是它自己的降级路径。
它的 LICENSE 与 NOTICE 仍然在仓库里,第三方来源有据可查。

本地编码 MCP(dsh-localcoding-mcp)

不启动任何外部程序。 工具直接实现在本插件里(Node + 宿主 ctx.tools.register),没有子进程、没有本地端口、没有需要单独编译的二进制。四个方向:

- 本地工具:宿主工具表多出 30 多个 lcm_ 工具 —— 读写改文件、目录操作、搜索与符号定位、
git 状态/差异/提交/还原、构建与测试、长驻进程会话、以及一个可撤销的改动日志
(lcm_undo_last_change)。所有路径都被限制在工作区内,越界直接拒绝。
- 对外提供 MCP:插件自己在 /mcp 上提供 MCP(streamable HTTP),和本地工具是同一批实现。Codex 用 codex mcp add dsh-localcoding --url http://127.0.0.1:19387/mcp 接进来。
- 本应用模型给 Codex 用:插件在 /v1 上提供 OpenAI 兼容端点,背后是宿主的 llm 服务。
设置页一个按钮把 ~/.codex/config.toml 改成指向它(改前自动备份,可一键还原),于是 Codex 跑的就是本应用正在用的模型 —— 不需要第三方中转、不需要单独的 API Key、不用 codex login。
- 网页版 ChatGPT → 本地:chatgpt.com 的连接器够不到 127.0.0.1,所以设置页按账号起 tunnel-client.exe(OpenAI 官方出站守护进程),它主动连 OpenAI 控制面;之后在 chatgpt.com/#settings/Connectors 里选中这条隧道,网页版 ChatGPT 就能调用上面那批工具。这是唯一不需要开放入站端口的接法。 设置页可按账号启停、看 /readyz 与 doctor 输出,并提示 /readyz 只证明进程活着 —— 真正的验收是去连接器里发一次真实工具调用。
可选的浏览器面(Playwright MCP)也走同一个连接器。

设置页显示:工具表、两个端点的地址与可直接粘贴的客户端配置、Codex 状态、隧道舰队。
sourceMode: 'external-mcp' 是给「别人已经在跑 LocalCodingMCP.exe」的场景留的只连接、不启动模式。

两个账号相关的前提本机还不满足:accounts.json 里三个账号的 organizationId 都是空的(会得到 403 tunnel_active_organization_required),隧道 ID 也可能已过期需要在 platform.openai.com/settings/organization/tunnels 重新建。控制面密钥是 DPAPI 加密串,只在内存里解开,不进日志、不进响应、不进任何配置。

安装

前置:DSH Desktop 至少启动过一次(profile 的 package.json 由它生成),PATH 上有 pnpm (corepack enable pnpm 或 npm i -g pnpm)。不需要装别的插件:四个页签的数据都在本插件里。

git clone https://github.com/TiaYahng/dsh-plugins.git
cd dsh-plugins
powershell -ExecutionPolicy Bypass -File .\install-to-profile.ps1 -Plugin dsh-comprehensive-platform

重启 DSH Desktop,插件管理里出现「综合平台」即可。脚本做四件事:把插件复制进 %APPDATA%\dsh-desktop\harness\profiles\web\plugins,在 profile 的 package.json 里注册 file: 依赖与 dsh.profile.bundles,删掉 node_modules 里的旧拷贝再 pnpm install --force (pnpm 对 file: 依赖是实体拷贝而不是链接,不删就还在跑旧代码),最后确认 cordis.patch.yml 进了 node_modules。

只想要「综合平台」就带 -Plugin dsh-comprehensive-platform。不带这个参数会装上仓库里的两个插件,而 dsh-localcoding-mcp 需要本机有编译好的 LocalCodingMCP.exe(仓库里没有),缺它跑起来是坏的。
其他参数:-DshHome / -Profile 换目标,-SkipPnpm 只复制与注册、不装依赖。

装完用这两条路由自检(宿主在跑时返回 200 即已激活):

/dsh-desktop/usage-stats/summary 综合平台 › 用量统计 /dsh-desktop/shell/archive.list 综合平台 › 归档历史

换一套 harness 数据目录时不要用这个脚本,它第 3 步的 pnpm 在那套 profile 上会把 node_modules 弄坏(原因见 docs/ENGINEERING.md)。手动三步:

$P 指向目标 profile 目录(harness home 下的 profiles\<profile>) Copy-Item -Recurse -Force "$P\plugins\<插件名>" "$P\node_modules\<插件名>"

package.json 里要有 dependencies 的 file: 条目与 dsh.profile.bundles 的行,然后在插件管理里把该 bundle 关一次再开一次,即刻生效、不用重启。
改完服务端代码仍需重启应用(Node 的 ESM 模块缓存不随开关插件清除)。

给智能体与自动化安装

宿主自带的插件通道接受四种源:npm 包名 / Git 仓库地址 / 归档链接 / 本机目录 (设置 › 插件 › 插件管理里的安装对话框,或 dsh plugin add <源>)。按这四种源看:

| 源 | 现在能用吗 | 还需要什么 |
| 本机目录 | ✅ 已验证 | 克隆仓库后跑 install-to-profile.ps1(见上)。脚本做的事与宿主通道一致,只是替你写 profile 的 package.json |
| Git 仓库地址 | ⚠️ 未验证 | 本仓库是多插件仓库,宿主按包名安装单个插件,需要指向子目录的写法;本仓库尚未按这个形态验证过 |
| 归档链接 | ⚠️ 未验证 | 同上 |
| npm 包名 | ❌ 还没有 | 插件尚未发布到 npm,且 package.json 里 private: true、没有 files 字段 |

所以今天给别的智能体的答案是本机目录那一条:克隆 → 跑脚本 → 重启应用 → 打路由自检。
要让「一条命令装上」成立,需要先把每个插件单独发布到 npm,并把 private、files、 engines.dsh、dsh-plugin 关键字补齐。

更新同一条路:git pull → 重跑脚本 → 重启应用。

上架插件列表(收录后市场就能搜到)的投稿文件与步骤在 docs/market-entry.yml:目录不是市场本地索引,而是由 awesome-dsh-plugin 仓库生成,收录要往那边提一个 PR。

更新

cd dsh-plugins
git pull
powershell -ExecutionPolicy Bypass -File .\install-to-profile.ps1 -Plugin dsh-comprehensive-platform

然后重启 DSH Desktop。前端(client.js)改动本可以靠插件管理里关一次开一次热加载,但服务端是 Node 的 ESM,模块缓存不随开关清除——不重启就还在跑旧的服务端代码,而前端已经变了,两边对不上。

内嵌的那份副本要跟上上游时:先升级 profile 里的 dsh-our-free-model,再跑

node tools\vendor-our-free-model.mjs

重新生成副本(十二处改动都记在 tools/vendor-our-free-model.mjs 里),然后跑自检、再重装本插件。

环境

- 宿主 harness 0.2.0-rc.2,peer 依赖都是宿主自带的 @deepseek-ai/
- 内嵌的上游版本:dsh-our-free-model 2.1.0(前端与服务端都在本仓库里,见 free-model/NOTICE.md)
- dsh-localcoding-mcp 需要已编译的 LocalCodingMCP.exe(0.3.0);网页版方向另需 mcp-accounts\tunnel-client.exe 与 config\accounts.json(可选 Playwright MCP 另需扩展令牌)
- Codex CLI 走的是第三方中转,codex login status 说「未登录」是预期的(中转用 bearer token,不用 OpenAI 账号登录);真正的就绪判据是插件去探中转入口能不能连通

自检

node .\test\platform-client.test.mjs .\plugins\dsh-comprehensive-platform\client.js
node .\test\archive-delete.test.mjs
node .\test\free-model-standalone.test.mjs
node .\test\schema-calls.test.mjs
node .\test\localcoding-client.test.mjs .\dsh-localcoding-mcp\client.js
node .\test\localcoding-native.test.mjs
node .\test\localcoding-process.test.mjs
node .\test\localcoding-tunnel.test.mjs
node .\test\localcoding-plugin.test.mjs
node .\test\localcoding-server.test.mjs

前两个前端自检必须带 client.js 的路径参数(只认位置参数,不吃环境变量)。
localcoding-plugin.test.mjs 默认加载 profile 里那份将要被宿主加载的副本,跑完整的 apply(),所以漏部署一个文件会在这里报错而不是在应用里。
localcoding-server.test.mjs 需要本地 MCP 服务器在跑。

不需要装依赖。实现细节、踩过的坑与未验证项见 docs/ENGINEERING.md。
预览分享卡片长什么样 ↓TiaYahng/dsh-plugins
分享 · DeepSeek Harness Hub
TiaYahng/dsh-plugins

在设置页集中查看用量、归档、记忆与免费模型

这是你的仓库?认领条目

回到顶部