DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Open In App — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
O

dsh-open-in-app

Open In App

从 dsh Web UI 的会话标题栏中使用已安装的应用程序(Finder、Terminal、VS Code、Ghostty、Zed……)打开当前工作区文件夹

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:trewvip-arch/dsh-open-in-app#9745f7ce54022ee72007eefa705bf0e409d93650
README兼容性版本

兼容性与来源证明

Open In App 以 dsh-open-in-app 发布,当前版本为 0.1.1。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/8/20

版本

0.1.1stable
2026/8/20

相关插件

正在加载相关插件…

最新版
0.1.1
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 developer-tools 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Sdk Minimal@deepseek-ai/dsh-sdk-minimal独立的最小 SDK 配置包:JSON-RPC、一个 DeepSeek 适配器、持久化 Shell 和 JSONL 会话Sdk App@deepseek-ai/dsh-sdk-appdsh SDK 配置包:基于 dsh-base 提供 stdio JSON-RPC 服务和进程生命周期管理Subagent Codex@deepseek-ai/dsh-subagent-codex基于官方 app-server 协议的一次性 Codex 子代理提供程序

README

dsh-open-in-app

A DeepSeek Harness (dsh) plugin for the web UI: a button in the top-right corner of the chat window that opens the current session's workspace folder with an installed application. The menu is curated to a whitelist of terminal emulators and popular IDEs/editors, grouped under "Terminals" and "Editors & IDEs".

What it does

  • Adds a Codex-style split control to the session header's utility row (right side of the chat window header), styled as a pill capsule matching the "Session log" header button (32px, 1px border, 18px radius, hover fill) with a hairline divider between the two segments:
    • the folder button opens the workspace with one click — in the app you last chose for this workspace (remembered per cwd in localStorage, its icon shown on the button), falling back to the default editor (the most preferred installed editor — VS Code → Cursor → Windsurf → Zed → IntelliJ IDEA → … — then the system default);
    • the chevron opens the menu with a pinned "Last used" entry for the workspace, a "System default app" entry (the built-in host.openPath behavior; Finder on macOS) plus the whitelisted terminals and editors installed on the host, each with its app icon (read from the app bundle at 32px, delivered as a data: URL; apps whose icon cannot be resolved show their name only). The "System default app" row shows the default folder handler's real icon (Finder on macOS, File Explorer on Windows, the xdg-mime default file manager on Linux), falling back to a folder glyph when unresolvable.
  • Picking an app from the menu opens the current workspace folder with it:
PlatformApp discoveryOpen commandIcons
macOS/Applications, /System/Applications (+ Utilities), ~/Applicationsopen -a "<app>" <path>bundle .icns → 32px PNG via sips; qlmanage fallback for bundles without an icns
Windows%ProgramFiles%, %ProgramFiles(x86)%, %LOCALAPPDATA%\Programs (top-level *.exe)cmd /c start "" <exe> <path>embedded exe icon via PowerShell [System.Drawing.Icon]::ExtractAssociatedIcon
Linux/usr/share/applications, /usr/local/share/applications, ~/.local/share/applications (*.desktop)gtk-launch <id> <path> (falls back to xdg-open)freedesktop Icon= value: absolute path, hicolor theme (128→16), scalable svg, pixmaps

The whitelist

Matching is case-insensitive against the enumerated app name (.app basename on macOS, .exe basename on Windows, desktop Name on Linux). Only installed apps that match appear in the menu.

Terminals — Terminal, iTerm2, Ghostty, Warp, Alacritty, kitty, WezTerm, Hyper, Tabby, Rio, Contour, Foot, Tilix, Terminator, Konsole, GNOME Terminal, xterm, mintty, Windows Terminal, PowerShell, Cmder, ConEmu.

IDEs & editors — Visual Studio Code, Cursor, Windsurf, Zed, Xcode, Android Studio, IntelliJ IDEA, PyCharm, WebStorm, GoLand, CLion, PhpStorm, RubyMine, Rider, DataGrip, DataSpell, RustRover, Fleet, Aqua, Visual Studio, Eclipse, NetBeans, Sublime Text, Nova, BBEdit, TextMate, CodeRunner, MacVim, Neovide, Emacs, Lite XL, HBuilderX.

To add or drop entries, edit the WHITELIST array in lib/apps.js — each entry is { id, category, match, exact? }, where id is the canonical display name (also what the native open command must find), match aliases are substring-tested, and exact aliases are whole-name-tested (used for short names like code that would otherwise match CodeRunner). Windows JetBrains launchers (idea64, pycharm64, …) and Code.exe are covered by aliases.

Architecture

  • Host half (lib/index.js): a Cordis plugin registering one Typert Remote service openInApp (discovered by the Typert Gateway's source-mode fallback — no generated TYPERT manifest needed):
    • openInApp/listApps → { apps, defaultIcon? }: whitelisted installed apps (with display icons) plus the default folder handler's icon
    • openInApp/openWith(path, appId) → open the folder with one app
    • openInApp/openDefault(path) → open the folder with the system default
    • openInApp/openDefaultEditor(path) → open the folder with the default editor (see EDITOR_PRIORITY in lib/apps.js)
  • Icons (lib/icons.js): resolves one data:image/* icon per app AND for the system default folder handler (Finder / Explorer / xdg-mime default), best-effort per platform (see the table above), cached per source path + mtime so repeated menu opens are cheap; failures cache as absent, never error. On macOS the icns named after the app wins over file-type icns (Zed.icns over Document.icns in Zed.app). The enumerated source path rides along as a non-enumerable property (lib/apps.js) so JSON transports never see it.
  • Client half (lib/client.js): a dsh.client web module that mounts the Remote endpoints via ctx.remote.$mount(...) and registers conversation.session.header.utilities entry open-in-app. The mount runs in a nested plugin fiber that declares only remote: the api-gateway registers each namespace as a dotted cordis service (remote.openInApp), and a fiber that both mounts and injects its own namespace would deadlock the loader. Consumption therefore reads the namespace through the documented non-strict store access (ctx.reflect.get("remote.openInApp", false)).
  • Bundle (cordis.patch.yml): one loader row that activates the host half; the profile tooling picks the package up as a profile bundle.

Install

From the directory containing this package:

dsh plugin --profile web add ./dsh-open-in-app

Then restart the web app (dsh web) — the loader and the client module graph are composed at boot, there is no live reload for newly added plugins. After the restart, the folder button appears next to the session title and a menu shows the installed applications.

Security notes

  • The Remote endpoints are not in the privileged-method list, so they sit behind the same browser-trust fence as the rest of the /api surface (loopback / configured trusted hosts only).
  • Opening a path spawns a native process on the host. The folder path comes from the session's own cwd, which the agent already operates on.
  • Icon resolution only reads inside the enumerated app paths (the standard application roots) plus the freedesktop icon theme dirs; buffers are capped at 256 KB and the native conversions (sips, qlmanage, PowerShell) run with an optional abort signal.
  • Command failure (open exit codes, missing app) surfaces as an error row in the menu instead of throwing.

Development

  • lib/apps.js and lib/icons.js are pure Node (no dsh imports) — testable standalone (node -e 'import("./lib/icons.js").then(m => m.listAppsWithIcons()).then(console.log)').
  • The client bundle must stay self-contained: it only requires the platform seed words (react, react/jsx-runtime, @deepseek-ai/dsh-client-ui-primitives).
  • To rebuild nothing: there is no build step — lib/ is shipped as-is.