dsh-open-workspace-any-app:在会话头部用任意应用打开工作区

前言

在 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 升级后 配置与插件保留 需重做
与内置菜单 两个控件并列 一个控件

核心功能

交互

  1. 按钮上直接显示应用图标,无需展开菜单才能辨认目标。
  2. 记住上一次选择(跨会话、跨浏览器重启);菜单中当前项带勾。
  3. 菜单底部「管理应用…」打开对话框:可从「发现」区一键加入已安装但未进菜单的应用;每项可移除(含 cordis.patch.yml 里声明的项);已移除项可恢复。增删立即生效,无需重启 DSH。
  4. 对话框固定视窗(卡片最高约 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 说明):

  1. package.json 的 dsh.bundle.patch 指向 cordis.patch.yml,Profile 将其作为一层 patch 应用;
  2. patch 的 insert 把 dsh-open-workspace-any-app 加入 Profile;
  3. 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。

注意:

  1. 插件以当前 DSH 进程权限运行,启动路由会在本机拉起子进程;安装前应在 GitHub 阅读源码与 MIT 许可证,确认可接受其行为与安全设计。
  2. 仅声明在配置或界面中添加、且在本机能解析成功的应用会出现在菜单中。
  3. 依赖面刻意收窄:除 @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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜