同一套 DSH 运行时分别打包出 Electron 桌面、浏览器 Web 和终端 TUI 三种界面,共享会话、皮肤、插件市场和本地工作台,无需各自安装环境。
- 语言
- TypeScript
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add github:hust-open-atom-club/oh-dsh在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
一句话定位
把 DeepSeek Harness、Node 运行时和本地开发工具打包成可安装的 Desktop、Web、TUI 三种发行版:三端共享同一个 DSH 运行时、会话、皮肤和插件市场,同时各自保留独立的 Profile 与界面。
核心能力
- 用同一个
ohdsh命令启动 Desktop(Electron 桌面)、Web(浏览器外壳) 或 TUI(终端),三种界面共享会话、凭据、皮肤选择与插件缓存 - 三个端共用
~/.ohdsh数据根作为会话、配置、皮肤、插件和凭据的存放位置;通过OH_DSH_HOME统一换目录,不用为每个端单独配置 - 内置本地开发工作台:Workspace、PTY 终端、浏览器面板、文件浏览、Side chat 和 Trajectory 都被组织成可折叠、停靠、分屏的面板
- 提供 Git Review:在工作区查看改动与 commit diff,给代码行加 review comment,并在同一侧栏完成分支、提交和推送
- 共享插件市场:Desktop、Web、TUI 都能搜索、预览、安装、卸载和回滚插件;同一个事务管理器让 UI 操作和 Agent 操作的安装流程一致
- 提供跨端皮肤
@oh-dsh/skins:Desktop 用 CSS 主题、Web 用 DSH 主题 token、TUI 用/theme切换 palette;同一组皮肤 ID 在三端表现一致 - 内置
view_image视觉工具(@oh-dsh/vision):对 workspace 本地图片、HTTP(S) 图片或 image data URL 做 OCR、看图和界面诊断,默认调用 Zhipu glm-4.6v-flash,可切换到本地 Ollama 模型
技术实现
- 语言: TypeScript(严格 ESM,TypeScript 6.0+)+ Node.js 子进程编排
- 关键依赖:
electron(Desktop 桌面包装)、electron-updater(自动更新)、@deepseek-ai/dsh-base+@deepseek-ai/dsh-web-app(pinned DSH runtime)、pnpm11(插件工作空间管理) - 架构模式: Cordis 插件补丁机制(
cordis.patch.yml)把@oh-dsh/desktop、@oh-dsh/skins、@oh-dsh/sidebar、@oh-dsh/panel-controls、@oh-dsh/pinned-summary、@oh-dsh/plugin-marketplace、@oh-dsh/vision、@oh-dsh/better-sidebar-runtime八个宿主/客户端插件叠加在 DSH 之上;通过ohDshSurface服务(plugins/shared/surface.ts)让每个插件按 desktop/web/tui 形态适配 - 入口文件:
src/cli.ts(统一 CLI 启动器)、src/main.ts(Electron 主进程)、src/web.ts(Web 启动)、src/tui.ts(TUI 启动)、src/plugin.ts(Desktop Host 侧插件)
适用场景
希望用同一份配置在桌面、浏览器、终端里都能使用 DSH 的开发者,尤其需要 CLI/IDE 编辑器之外的 IDE 风格工作台(带侧栏、底部面板、分屏视图)和原生桌面交互(系统菜单、快捷键、自动更新)的用户。适合作为本地长期主力工具:自动迁移旧版数据、按端拆分发行包避免 Electron 拖累纯终端/服务器环境。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| Node.js | >=24 | 不需要用户单独安装,发行版自带固定版本的 Node runtime |
| macOS | 12.0+(arm64/x64) | 提供 DMG 与 zip,自动更新支持;首次启动需到「设置 → 通用」放行未签名 |
| Windows | x64 | 提供 NSIS 安装包与便携版;自动更新支持 |
| Linux | x64 | 提供 AppImage 与 deb;AppImage 支持自动更新 |
| 原生模块 | electron, node-pty, electron-updater | Desktop 端通过 Electron 加载;非 Desktop 端不依赖 |
| pnpm | 11.20 | 内部构建与插件事务使用,发行版自带 |
安装方式
dsh plugin --profile web add github:hust-open-atom-club/oh-dsh
配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
OH_DSH_HOME | 环境变量 | 统一更换 Desktop/Web/TUI 三端共享的数据根目录 | ~/.ohdsh |
DSH_OH_WEB_HOST / --host | 字符串 | Web 启动后的监听地址 | 127.0.0.1(仅回环) |
DSH_OH_WEB_PORT / --port | 整数 | Web 监听端口;0 随机选择 | 3080 |
DSH_OH_WEB_OPEN / --open / --no-open | 布尔 | 启动后是否自动打开浏览器 | 交互式终端默认打开 |
--trusted-host | 字符串(可重复) | 当 Web 监听非回环地址时必须列出的受信主机源 | 空 |
DSH_OH_WEB_HOME / DSH_OH_TUI_HOME / --data | 路径 | 单独为 Web 或 TUI 指定数据根 | 继承 OH_DSH_HOME |
OH_DSH_SURFACES | 逗号分隔列表 | 限制当前发行版可用的界面(desktop/web/tui) | 三端全开 |
DSH_OH_TUI_LANG / --lang | zh 或 en | TUI 初始界面语言 | 由上游 TUI 决定 |
DSH_OH_TUI_FULLSCREEN / --fullscreen / --inline | 布尔 | TUI 是否使用 alternate screen | fullscreen 开启 |
DSH_OH_TUI_PRESET / --preset | 字符串 | TUI 启动时使用的 Agent 预设 | standard |
DSH_OH_TUI_SESSION_ID / --resume | 会话 ID | TUI 恢复已存在的会话 | 新建会话 |
ZHIPUAI_API_KEY / DASHSCOPE_API_KEY | 环境变量 | 视觉工具(@oh-dsh/vision)调用的云端 key | 无(默认走 Zhipu) |
~/.ohdsh/settings.yaml 中的 oh-dsh-vision | YAML | 切换视觉后端地址、模型、超时、最大图片字节、最大重试次数 | 见 docs/usage.md |
常见问题
Q: 安装 oh-dsh 后还需要单独安装 Node 或 DSH 运行时吗?
A: 不需要。每个发行版都自带固定版本的 Node 与 DSH 运行时,解压即可运行,不会要求用户预先安装运行环境。
Q: Desktop、Web、TUI 三端的数据是互通的吗?
A: 互通。三个端默认共用 ~/.ohdsh 目录存放会话、凭据、皮肤、插件缓存和插件状态;设置 OH_DSH_HOME 可以统一更换数据根。
Q: 我能把 oh-dsh Web 暴露给局域网里的其他人访问吗?
A: 可以,但必须显式加入 --trusted-host。Web 默认只监听 127.0.0.1;改用 0.0.0.0 而不带 trusted-host 会被 parseLaunchArgs 拒绝启动。
Q: 在 TUI 模式下能安装插件吗?
A: 安装事务在三个端都能落地,但只有声明支持 TUI 的插件会在 TUI 实际生效。TUI 下的插件管理通过 /plugins 命令或 Ctrl+M 进入。
Q: 插件申请安装和 Agent 帮我在终端安装插件走的是同一个流程吗?
A: 是的。人类和 Agent 共享同一个事务管理器,包含预览、风险审批、应用、回滚四个阶段;Agent 不能绕过审批直接改动当前 Profile。
Q: 我能把旧的 Oh-DSH-Desktop 数据迁移到新版共享目录吗?
A: 第一次启动新版的 Desktop 或 Web 时,会自动从旧的 Oh-DSH-Desktop 应用数据目录或 ~/.oh-dsh-web/dsh 把会话、插件、皮肤偏好复制到 ~/.ohdsh;旧目录不改动,可回滚。
Q: 同时开两个 oh-dsh 进程会冲突吗?
A: 不会破坏数据,但只有一个进程能写 ~/.ohdsh,写锁通过 tryAcquireRuntimeLock 协商;其它进程会进入只读模式查看历史,期间不能写入活动会话;写锁释放后会自动恢复可写。
Q: oh-dsh 怎么处理图片识别?
A: 三端共用内置的 @oh-dsh/vision 插件,提供 view_image 工具,对 workspace 内图片、HTTP(S) 图片或 image data URL 做 OCR、看图和界面诊断;默认调用 Zhipu glm-4.6v-flash,可在 ~/.ohdsh/settings.yaml 切换为本地 Ollama / LM Studio 模型。
Q: macOS arm64 和 Windows x64 都支持吗?
A: 支持。发行版覆盖 macOS arm64/x64、Linux x64 和 Windows x64;packaging 脚本 dist:mac、dist:linux、dist:win、dist:web、dist:tui 对应不同形态。
Q: 哪里可以查看版本号和发行日志?
A: 所有界面统一显示的版本号来自仓库 tag(src/version.ts 解析最近可达 tag);详细的 macOS、Windows、Linux、Web 打包步骤和签名要求在 docs/usage.md。
上手难度
入门 — 三端共享同一份数据,已经用过 DSH 用户可直接用 ohdsh desktop|web|tui 启动;只有定制的视觉后端、跨域暴露 Web 等场景才需要改 settings.yaml 或环境变量。
已知问题与限制
- 在非回环地址上启动 Web 必须在命令行显式声明
--trusted-host,否则会被parseLaunchArgs拒绝(src/web.ts:200-208) - TUI 只能在真正交互式终端中运行:若 stdin/stdout 不是 TTY,会被
tui.ts:233-236直接报错退出 - 桌面端在 macOS 上首次启动可能因未签名触发「无法验证开发者」提示,需要在「设置 → 通用」放行(见
docs/usage.md) - Windows 上未签名安装包同样会触发 SmartScreen,需要选择「更多信息 → 仍要运行」(见
docs/usage.md:59-61) - Web 端运行时若 60 秒内没有打印
dsh web: <url>行,会被DshRuntimeSupervisor强制SIGTERM(src/runtime.ts:123-127) - 自动更新依赖签名后的打包版本;缺少 macOS/Windows 签名凭证时,CI 流程会回退为 ad-hoc 签名/未签名的安装包,并禁用自动更新(见
docs/usage.md:333-347) - 在桌面端的 isolated preview(
OH_DSH_MARKETPLACE_PREVIEW=1)和只读查看模式(OH_DSH_READ_ONLY=1)下,插件市场 Host 会被显式禁用(plugins/plugin-marketplace/src/index.ts:46-58) - 旧版
Oh-DSH-Desktop与~/.oh-dsh-web/dsh的数据迁移是非破坏性的,旧目录保留以便回滚,但同源已存在的共享条目不会被覆盖(src/data-root.ts:262-350)
简体中文 · English
Oh-DSH
一套 DSH runtime,Desktop、Web 与 TUI 三种开发体验。
把 AI Agent、Workspace、本地工具与插件生态带到你习惯的界面。
Oh-DSH 将 DeepSeek Harness、Node.js、本地开发工具和内置插件打包为可安装的 Desktop、Web 与 TUI 发行版。模型服务仍可按需运行在云端;Workspace、终端、 Git Review、浏览器、文件、会话与插件状态由本地工作台统一组织。
主要能力
🖥️ 三种交互界面使用同一个 |
🧰 本地开发工作台内置 Workspace、PTY 终端、浏览器、文件浏览、Side chat 与 Trajectory;面板可以折叠、固定、分屏或全屏展开。 |
🔍 Git Review查看工作区改动与 commit diff,在代码行上添加 review comment,并在同一个侧边栏完成分支、提交和推送操作。 |
🧩 插件市场Desktop、Web 与 TUI 都能检索、预览和安装插件,并共享同一套交易与恢复状态。目录会标明插件实际生效的界面:安装可能在所有终端都成功,但某些插件只在 Web 或 Desktop 生效、在 TUI 不生效,界面上会明确区分。 |
🎨 跨端皮肤
|
📦 可拆分发行按需安装完整版、Web-only 或 TUI-only。每种发行都自带固定版本的 DSH 与 Node runtime,不要求单独安装运行环境。 |
下载与安装
从 GitHub Releases 选择需要的发行形态:
| 发行形态 | 包含内容 | 适合场景 |
|---|---|---|
| 完整版 | Oh-DSH Desktop、Web、TUI、Node runtime 和内置插件 | 本地开发工作台 |
| Web-only | Oh-DSH Web、Node runtime 和内置 Web 插件,不含 Electron | 浏览器、服务器或轻量安装 |
| TUI-only | Oh-DSH TUI、Node runtime 和终端插件,不含 Electron | SSH 与纯终端环境 |
- **macOS:**打开 DMG,将 Oh-DSH Desktop 拖入 Applications。
- **Windows:**运行安装包,或解压便携版后启动。
- **Linux:**直接运行 AppImage,或使用
apt安装 deb。
Web-only 与 TUI-only 包解压后即可运行:
# Web UI,默认监听 http://127.0.0.1:3080
./bin/ohdsh web
# Terminal UI
./bin/ohdsh tui
Windows 使用 bin\ohdsh.cmd web 或 bin\ohdsh.cmd tui。
安装统一命令
macOS 完整版可将应用内的启动器加入 PATH:
sudo ln -sf \
"/Applications/Oh-DSH Desktop.app/Contents/Resources/bin/ohdsh" \
/usr/local/bin/ohdsh
Web-only 与 TUI-only 包可直接运行 ./bin/ohdsh,也可以把它加入 PATH。
使用
ohdsh desktop # 启动 Oh-DSH Desktop
ohdsh gui # Desktop 的启动别名
ohdsh web # 启动 Oh-DSH Web
ohdsh web --port 3080 # 指定 Web 端口
ohdsh tui # 启动 Oh-DSH TUI
三端默认共同使用 ~/.ohdsh 存放缓存、配置、会话、凭据与插件状态。
设置 OH_DSH_HOME 可以统一更换数据目录;运行 ohdsh web --help 或
ohdsh tui --help 可以查看界面专属选项。
内置的 @oh-dsh/vision 为三端提供同一个 view_image 工具,让用户对 Workspace
内的本地图片、HTTP(S) 图片或 image data URL 做 OCR、读图与界面诊断。图片复制、
粘贴、缩略图和提交继续由 DSH 原生 attachment rail 负责;插件在 Host 的最终图片
能力校验处放行 DeepSeek V4,并在固定的 text-only 适配器序列化同一轮请求前,通过
配置的视觉后端描述原生附件。不另加输入栏气泡或引用协议。TUI 通过 Workspace
图片路径或 URL 使用同一能力。
凭据与后端配置见图片识别使用说明;云端/本地 Key 与 Vision
设置也可以在原生“设置 → 插件 → 插件配置 → Vision”卡片中修改。
从源码运行
需要 Node.js、pnpm 和平台构建工具:
git submodule update --init --recursive
pnpm install
pnpm run build:dsh
pnpm run build
pnpm run stage:dsh
export PATH="$PWD/bin:$PATH"
ohdsh desktop
ohdsh web
ohdsh tui
打包完整版使用对应平台的 dist:mac、dist:linux 或 dist:win;只打包
Web 使用 pnpm run dist:web;只打包 TUI 使用 pnpm run dist:tui。
更多界面
插件市场

Oh-DSH 皮肤

文档
插件推荐
| 推荐项目 | 说明 |
|---|---|
| DeepSeek Harness | DSH runtime、会话与插件加载器 |
| dsh-TUI | Oh-DSH TUI 的直接上游插件,提供终端渲染、交互和命令体系 |
| DSH-better-sidebar | Git Review、文件与 PTY Host 能力 |
| dsh-vision | 跨 Desktop、Web 与 TUI 的 view_image 视觉工具参考实现 |
| dshfind | DSH 插件超市与学习社区,提供插件、生态与 DeepSeek Harness 周边推荐 |
Oh-DSH 保留上游实现与署名,并在其上提供统一启动器、Profile、数据目录、 跨端皮肤、界面适配和发行打包。详细边界见设计文档。