前言¶
在 DeepSeek Harness(DSH)里做智能体或项目开发时,经常要把当前工作区目录交给本机编辑器或工具:Zap、Qoder IDE、IntelliJ IDEA、Obsidian、HBuilderX 等。DSH 自带 @deepseek-ai/dsh-host-open-in-app 控件,但其应用目录在构建期固定,外部插件无法向表里追加条目,也不能通过配置扩展列表。社区插件 dsh-open-workspace-any-app(维护者 F1yBear)在会话头部增加独立的「用其它应用打开」按钮,与内置控件并排共存,通过 YAML 声明应用,并把工作区目录交给所选应用。
这是什么¶
- 名称:
dsh-open-workspace-any-app(npm 显示名:DSH Open Workspace In Any App) - 分类:客户端插件
- 版本(package.json):0.1.0
- 许可证:MIT
- 引擎要求:
dsh>= 0.1.7-rc.1;Node ^22.19.0 或 >= 24.0.0
插件在会话头部注册自己的控件:按钮显示当前选中应用的图标,点击即可用该应用打开当前工作区目录。内置 open-in-app 与本品互不遮挡,各管一块。
与内置 open-in-app 的差异¶
内置控件的 OPEN_IN_APP_CATALOG 是模块级常量且未导出,解析依赖主机私有 internals,Config 仅含超时字段、没有应用列表。未写在官方表里的应用无法靠配置追加。
| 本插件 | 改内置白名单 | |
|---|---|---|
| 自定义编辑器出现在界面 | 独立按钮,列出你声明的全部应用 | 融进内置下拉 |
| 改动官方安装包 | 否 | 需改 asar |
| 破坏代码签名 | 否 | 是 |
| DSH 升级后 | 配置与插件保留 | 需重做 |
| 与内置菜单 | 两个控件并列 | 一个控件 |
核心功能¶
交互¶
- 按钮上直接显示应用图标,无需展开菜单才能辨认目标。
- 记住上一次选择(跨会话、跨浏览器重启);菜单中当前项带勾。
- 菜单底部「管理应用…」打开对话框:可从「发现」区一键加入已安装但未进菜单的应用;每项可移除(含
cordis.patch.yml里声明的项);已移除项可恢复。增删立即生效,无需重启 DSH。 - 对话框固定视窗(卡片最高约 520px),列表在卡片内滚动;「发现」在空搜索时默认只显示前 6 条,其余靠顶部搜索框;搜索同时过滤「菜单中 / 已移除 / 发现」三段,有关键字时不再截断。
配置与定位¶
应用列表写在 cordis.patch.yml 的 config.apps,或在 ~/.dsh/profiles/desktop/cordis.patch.yml 覆盖。
定位器按顺序尝试,第一个在本机验证通过的胜出:
| kind | 含义 | 默认启动方式 |
|---|---|---|
app |
应用程序包绝对路径 | open(macOS 用 LaunchServices) |
file |
可执行文件绝对路径 | argv |
cli |
PATH 中的命令 | argv |
app-paths |
Windows 注册表 App Paths | argv |
platforms 下某平台会整体替换该平台的 locators,而不是与默认合并。图标可用 iconBundle(从包内 .icns 转 PNG)或 iconPath;取不到图标时路由 404,菜单项仍保留。
安全与行为¶
路由先经 connection.requestRejection(Host/Origin 栅栏、浏览器认证),启动接口再校验 JSON 体:app/path 为字符串、路径为存在的绝对目录。缺少 connection 时路由返回 503。子进程环境会剔除含 KEY/PASSWORD/SECRET/TOKEN、DSH_*、NODE_OPTIONS、NODE_PATH 等变量。
SSH 会话不探测本地应用;单条定位失败不影响其它菜单项;解析有 resolveBudgetMs(默认 15s)预算,超时则返回已完成部分并可能带 truncated: true。
安装与启用¶
在 DSH 的插件页安装本包,或由 Agent 通过 plugin_manager 安装。新装的 JS 模块需要重新加载,装完后重启 DSH。
安装后机制(README 说明):
package.json的dsh.bundle.patch指向cordis.patch.yml,Profile 将其作为一层 patch 应用;- patch 的
insert把dsh-open-workspace-any-app加入 Profile; dsh.client声明让浏览器端加载exports["./client"]客户端产物。
社区目录页:SkillHub - dsh-open-workspace-any-app。该站点为独立生态目录,与 DeepSeek / 幻方无官方从属关系。
典型配置示例¶
下面在 cordis.patch.yml 或用户 profile 的 cordis.patch.yml 中声明 Zap,并设置启动观察窗:
- id: open-workspace-any-app
name: dsh-open-workspace-any-app
config:
launchWatchMs: 1000
apps:
- id: zap
label: Zap
locators:
- kind: app
paths:
- /Applications/Zap.app
- ~/Applications/Zap.app
优先 CLI、找不到再退回应用包(IntelliJ IDEA 示例):
- id: idea
label: IntelliJ IDEA
iconBundle: /Applications/IntelliJ IDEA.app
locators:
- kind: cli
command: idea
- kind: app
paths: [/Applications/IntelliJ IDEA.app]
argv 启动时:参数里没有 {path} 则把工作区目录追加到末尾;某参数含 {path} 则在该处替换。launch 省略时:app 定位器用 open,其余用 argv。
常用配置字段(默认值见 README):
| 字段 | 默认 | 含义 |
|---|---|---|
apps |
[] |
声明的应用,顺序即菜单顺序 |
probeTimeoutMs |
10000 |
单定位器解析超时 |
iconTimeoutMs |
10000 |
图标提取超时 |
launchWatchMs |
1000 |
启动早期失败观察窗 |
resolveBudgetMs |
15000 |
单次解析总预算 |
storeDir |
<DSH home>/open-workspace-any-app |
界面添加应用的存储目录 |
重复 id 在组合期会报错。
界面添加的应用与隐藏列表保存在 <DSH home>/open-workspace-any-app/apps.json;删除记为 hidden,不改写手写 YAML,可逆恢复。
适用场景与注意¶
适合:需要在 DSH 会话里一键用非内置列表中的 IDE、笔记或工具打开当前工作区;希望多机共用一份配置、只显示本机已解析到的应用;要与官方 open-in-app 并存而不改 asar。
注意:
- 插件以当前 DSH 进程权限运行,启动路由会在本机拉起子进程;安装前应在 GitHub 阅读源码与 MIT 许可证,确认可接受其行为与安全设计。
- 仅声明在配置或界面中添加、且在本机能解析成功的应用会出现在菜单中。
- 依赖面刻意收窄:除
@deepseek-ai/schemastery外,主机能力通过 cordis 上下文(webServer、connection、subprocess)获取,以降低与 Profile 版本错位导致 import 失败的风险。
维护者仓库当前 GitHub 星标为 1(以目录页线索为准);功能与细节以 README 为准。
参考链接¶
- 目录页:https://www.skillhub.cn/plugins/F1yBear/dsh-open-workspace-any-app
- 源码与文档:https://github.com/F1yBear/dsh-open-workspace-any-app