oh-dsh

255Star22Fork23Issue4Watching

同一套 DSH 运行时分别打包出 Electron 桌面、浏览器 Web 和终端 TUI 三种界面,共享会话、皮肤、插件市场和本地工作台,无需各自安装环境。

语言
TypeScript
License
MIT
分支
main
ai-agentcordisdshdsh-plugindsh-plugins

安装

$ 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)、pnpm 11(插件工作空间管理)
  • 架构模式: 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
macOS12.0+(arm64/x64)提供 DMG 与 zip,自动更新支持;首次启动需到「设置 → 通用」放行未签名
Windowsx64提供 NSIS 安装包与便携版;自动更新支持
Linuxx64提供 AppImage 与 deb;AppImage 支持自动更新
原生模块electron, node-pty, electron-updaterDesktop 端通过 Electron 加载;非 Desktop 端不依赖
pnpm11.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 / --langzhenTUI 初始界面语言由上游 TUI 决定
DSH_OH_TUI_FULLSCREEN / --fullscreen / --inline布尔TUI 是否使用 alternate screenfullscreen 开启
DSH_OH_TUI_PRESET / --preset字符串TUI 启动时使用的 Agent 预设standard
DSH_OH_TUI_SESSION_ID / --resume会话 IDTUI 恢复已存在的会话新建会话
ZHIPUAI_API_KEY / DASHSCOPE_API_KEY环境变量视觉工具(@oh-dsh/vision)调用的云端 key无(默认走 Zhipu)
~/.ohdsh/settings.yaml 中的 oh-dsh-visionYAML切换视觉后端地址、模型、超时、最大图片字节、最大重试次数见 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:macdist:linuxdist:windist:webdist: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 强制 SIGTERMsrc/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