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

任意打开 xl0223/dsh-open-any

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

右键对话文件,用本机任意应用打开

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · chat
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 8 处,展示前 8 条)
  • 读取本地文件
    lib/index.js:100
    const stats = await stat(hostPath)
  • 执行外部命令来自配置/变量
    lib/index.js:142
    const child = spawn(command, args, { detached: true, stdio: 'ignore', windowsHide })
  • 写入本地文件
    lib/index.js:192
    await appendFile(DIAG_LOG, `${text.trim()}\n`, 'utf8')
  • 写入本地文件
    lib/index.js:343
    writeFileSync(target, `${JSON.stringify(out, null, 2)}\n`, 'utf8')
  • 读取本地文件
    src/host.js:99
    const stats = await stat(hostPath)
  • 执行外部命令来自配置/变量
    src/host.js:141
    const child = spawn(command, args, { detached: true, stdio: 'ignore', windowsHide })
  • 写入本地文件
    src/host.js:191
    await appendFile(DIAG_LOG, `${text.trim()}\n`, 'utf8')
  • 写入本地文件
    src/host.js:342
    writeFileSync(target, `${JSON.stringify(out, null, 2)}\n`, 'utf8')
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

在 DSH 对话里右键文件选「打开方式」,可调出系统 OpenAs 对话框,用任意本地应用打开,包括未注册文件关联的应用。

README

由 DeepSeek 最新模型翻译生成
dsh-open-any 给 DeepSeek Harness(DSH)的对话界面加「文件右键 → 打开方式」:对话里出现的文件,右键就能用本机任意应用打开。 ┌──────────────────────────────┐ 右键 a.ts │ a.ts │ ──────▶ │ 用 VS Code 打开 │ │ 在文件资源管理器中打开 │ ← 一级菜单,不用展开 │ 打开方式 ▸ │──▶ VS Code / Cursor / Windows Terminal │ ───────────────────────── │ │ 其他应用…(系统对话框) │ ← 本插件独有:可选出未注册关联的应用 │ ───────────────────────── │ │ 复制路径 │ └──────────────────────────────┘ 它能做什么 | 菜单项 | 行为 | | 用 <默认应用> 打开 | 用系统默认关联程序打开文件 | | 在文件资源管理器中打开 | 一级菜单项;在文件管理器中定位该文件(Windows 用此措辞,macOS 为「在访达中显示」) | | 打开方式 ▸ | 列出本机为该文件类型注册过关联的编辑器 / 终端(带真实图标与「(默认)」标记) | | 其他应用…
展开完整文档(README 剩余 1 节)
dsh-open-any

给 DeepSeek Harness(DSH)的对话界面加「文件右键 → 打开方式」:对话里出现的文件,右键就能用本机任意应用打开。

┌──────────────────────────────┐
右键 a.ts │ a.ts │ ──────▶ │ 用 VS Code 打开 │ │ 在文件资源管理器中打开 │ ← 一级菜单,不用展开 │ 打开方式 ▸ │──▶ VS Code / Cursor / Windows Terminal │ ───────────────────────── │ │ 其他应用…(系统对话框) │ ← 本插件独有:可选出未注册关联的应用 │ ───────────────────────── │ │ 复制路径 │ └──────────────────────────────┘

它能做什么

| 菜单项 | 行为 |
| 用 <默认应用> 打开 | 用系统默认关联程序打开文件 |
| 在文件资源管理器中打开 | 一级菜单项;在文件管理器中定位该文件(Windows 用此措辞,macOS 为「在访达中显示」) |
| 打开方式 ▸ | 列出本机为该文件类型注册过关联的编辑器 / 终端(带真实图标与「(默认)」标记) |
| 其他应用…(系统对话框) | 唤起 Windows 原生「打开方式」对话框,可选未注册文件关联的应用(例如 Visual Studio) |
| 复制路径 | 复制绝对路径 |

识别范围:

| 元素 | DOM 特征 | 路径来源 |
| Markdown 文件链接 | button.fileLink | title 属性 |
| 输入框 / 消息里的 @文件 引用 | [data-ref-chip="file"] | title(@路径) |
| 路径标签(PathLabel) | [data-path-label] | title |
| 其它带 title 的元素(兜底) | 任意祖先的 title | title,仅当它「看着就是路径」时命中 |

相对路径会按当前正在查看的会话的工作目录补全成绝对路径(Host 侧只用进程 cwd 解析相对路径,所以必须在浏览器侧补全)。非文件位置右键仍弹浏览器原生菜单。

与同类插件的区别(诚实说明)

DSH 插件市场里已有几个同类插件(dsh-file-link-menu、dsh-right-click-menu、dsh-file-menu 等),本插件不是能力最全的那个。它只主张两件事:

1. 「其他应用…(系统对话框)」:走 rundll32 shell32.dll,OpenAs_RunDLL,能选没有注册文件类型关联的应用。只列 workspacePathApplications 的插件永远够不到这类程序(例如 Visual Studio 不在 DSH 的应用目录里时)。
2. 不拖垮启动的工程约束:client 插件在 apply 阶段绝不抛异常、绝不等待服务就绪,factory 外层还有一个永不抛错的兜底 apply。DSH 的 web boot 把任何非 active 的条目当致命错误(web boot: N entry did not activate),实测会让整个 GUI 打不开——本插件为此付出的是「服务全部延迟到事件发生时惰性解析」的设计。

如果你需要超链接右键、另存为、复制文件内容、文件树右键等能力,请直接用上表里更全的插件,不要重复造这个轮子。

安装

从 GitHub 安装(推荐)

在 DSH 的「设置 → 插件」或插件管理器的添加框里填:

github:xl0223/dsh-open-any

或用 DSH 自带命令行(把 <profile> 换成你的配置档名,例如 desktop):

dsh plugin --profile <profile> add github:xl0223/dsh-open-any

装完重启 DSH:client bundle 按文件 mtime 生成 rev 并版本化缓存,不重启不会重载。

本地源码调试

dsh plugin --profile <profile> add link:C:\path\to\dsh-open-any

改完 src/ 必须重新 node scripts/build.mjs(DSH 加载的是 lib/);改 lib/client.js 刷新页面即可,改 host 半侧要重启。

卸载

dsh plugin --profile <profile> remove dsh-open-any

或手工从配置档的 package.json 里删掉 dsh.profile.bundles 与 dependencies 中的 dsh-open-any,重启。

兼容性

| 项 | 状态 |
| DSH 版本 | 0.2.0-rc.2 上完成真机验证(菜单、应用列表、打开、文案) |
| DSH 0.2.1-rc.2 | 已静态确认:外壳冻结的模块基座表里仍有 @deepseek-ai/dsh-client-ui-primitives(它被打包进外壳,不再有独立包目录);未做真机重验 |
| 平台 | Host 侧用 rundll32 / explorer / open / xdg-open,三平台都有实现,但只在 Windows 11 上实测过 |
| Node | 构建需要 Node ≥ 20;运行时只用 DSH 自带能力 |

开发

node scripts/build.mjs # 语法 + 契约校验 → lib/
node --test scripts/verify-client.test.mjs scripts/verify-host.test.mjs # 离线单测
node tools/check-host-contract.mjs # 与真实 app.asar 的模块/路由契约
node tools/probe-open-in-app.mjs # 真机探测:本机会列出哪些应用

一条命令跑全部:npm run check。

验证报告(真实执行)

平台:Windows 11;DSH D:\Ai_Agent\DeepSeek Harness(0.2.0-rc.2 真机 / 0.2.1-rc.2 静态)。
以下命令与数字均为实际执行结果。

1. 构建

$ node scripts/build.mjs
built ...\lib\client.js 34339 bytes sha256=f94b6dc6edee8545…
built ...\lib\index.js 15049 bytes sha256=131c5ddbfd27fb3f…

2. 离线单测:30 / 30 通过

覆盖:路径识别与清理、会话 cwd 补全、菜单模型(加载中 / 有应用 / 失败)、平台措辞、Session Remote 请求体、host 路由回退、词典命中/未命中、host 路由的栅栏与方法/媒体类型边界、假 DOM 端到端(右键 → 菜单 → 选「用 Cursor 打开」→ 断言请求体)、以及一组崩溃回归测试(apply 在六种恶劣上下文下必须不抛错且完成挂载)。

ℹ tests 30 ℹ pass 30 ℹ fail 0

3. 宿主契约(对真实 app.asar)

$ node tools/check-host-contract.mjs
基座模块: react/jsx-runtime, react-dom, react-dom/client, @deepseek-ai/cordis, @tanstack/react-virtual, @deepseek-ai/dsh-client-store, @deepseek-ai/dsh-client-ui-slots, @deepseek-ai/dsh-client-ui-primitives, @deepseek-ai/dsh-client-ui-dockkit, react, zod 契约检查通过:所有 require 与导出名都存在。

4. 真机验证(0.2.0-rc.2)

右键对话里的文件链接 → 菜单弹出 → 应用列表来自本机 → 选应用后文件被打开;「其他应用…(系统对话框)」唤起 Windows 原生选择器(用 rundll32 实测进程出现)。

已知限制

- 0.2.1-rc.2 未真机重验:只确认了模块基座表,没有实际重启安装测试。
- 「其他应用…」仅 Windows 实现(OpenAs_RunDLL);macOS / Linux 会返回 501。
- 图片类 Markdown 链接(有缩略图浮层、无 title)不命中。
- 只复制绝对路径,没有相对路径 / 文件名 / 文件内容 / 另存为。
- 不处理超链接、不处理文件树(侧边栏)内的右键。
- 未做 canOpenWorkspacePath 预检:文件不在工作区时,菜单仍会弹出、操作会失败并提示。

踩坑记录(给后来者)

1. client 插件的 apply 绝不能抛异常,也不能等任何服务。 DSH 的 web boot 把非 active 条目当致命错误。静态 inject 会让 fiber 永远 pending;apply 里同步调 ctx.effect(...) + locale.register(...) 抛错则让 fiber failed —— 两者都会让整个 GUI 打不开(crash-*-web-boot.log: web boot: 1 entry did not activate / <插件>: failed)。正确姿势:factory 先挂一个 no-op exports.apply,真实实现包在 try 里;apply 只做 DOM/React,服务延迟到事件发生时惰性读取。
2. ctx.inject 要一个一个注。 把 ["slots","remote","sessions","locale"] 一次性交给一个 ctx.inject,只要有一个名字对不上就永远不回调,整条链路静默失效且不报错。改成每个服务一条 ctx.inject([name], cb) 后立刻正常。
3. locale.bind(ns)(key) 未命中时会原样返回 key。 照单全收就会把 open.default 这种裸 key 显示到菜单里。必须判断 返回值 !== key 再采用,否则回退内置字典。
4. GUI 页面的 origin 是 dsh-app://app,不是 http://127.0.0.1:<port>。浏览器侧对相对路径的 fetch 不一定到得了 host 路由,排查时以 host 半侧写盘的证据为准。
5. Host 侧路径必须先是绝对路径(它用 path.resolve 按进程 cwd 解析),相对路径要在浏览器侧按会话 cwd 补全。

文件结构

dsh-open-any/
├── package.json # bundle 清单:dsh.bundle.patch + dsh.client(platform: web) ├── cordis.patch.yml # 组合层:插入 open-any 这一行 ├── icon.svg # 插件卡片图标 ├── src/ │ ├── client.js # 浏览器半侧:右键监听 + 菜单 + Session Remote / host 路由调用 │ └── host.js # host 半侧:4 条带信任围栏的路由 ├── lib/ # 构建产物(DSH 实际加载,随仓库提交) ├── scripts/ │ ├── build.mjs # 构建:语法 + 契约校验 │ ├── verify-client.test.mjs │ └── verify-host.test.mjs ├── tools/ │ ├── check-host-contract.mjs # 对真实 app.asar 校验模块与导出名 │ └── probe-open-in-app.mjs # 真机探测本机应用目录 ├── README.md / PROGRESS.md / AGENTS.md └── LICENSE (MIT)

Host 侧路由(全部先过 connection.requestRejection 信任栅栏,再校验方法、媒体类型、64 KiB 请求体上限与路径存在性):

| 路由 | 用途 |
| POST /dsh-open-any/open-as | 唤起系统「打开方式」对话框 |
| POST /dsh-open-any/open-file | 用系统默认应用打开(Session Remote 不可用时的后备) |
| POST /dsh-open-any/reveal | 在文件管理器中定位 |
| POST /dsh-open-any/diag | 诊断上报落盘(%TEMP%\dsh-open-any-diag.log) |

License

MIT
预览分享卡片长什么样 ↓xl0223/dsh-open-any
分享 · DeepSeek Harness Hub
xl0223/dsh-open-any

右键对话文件,用本机任意应用打开

这是你的仓库?认领条目

回到顶部