cloudhjx7k downloadsEmbedded DeepSeek Harness(DSH) Web GUI, one‑click installation, automatic startup, silent background operation, ready to use right away.内嵌 DeepSeek Harness Web GUI,一键安装、自动启动、静默后台运行,即开即用。
Status: released · Desktop only(Windows / macOS)· English · 中文
Embed the native DSH Web UI into your vault — one-click setup, silent operation, a two-way bridge between your notes and DSH, and it keeps working as DSH evolves.
**把 DSH 原生 Web UI 无痕嵌入 Obsidian:一键配置、静默运行、笔记与 DSH 双向桥接,随 DSH 版本演进持续可用。
An Obsidian desktop plugin that embeds the native DeepSeek Harness (DSH) Web UI directly into your vault — a seamless graft of two open-source tools: no DSH source is touched (connected through DSH's official extension seam), so it keeps working as DSH evolves. The plugin talks to DSH only over localhost; DSH itself makes outbound requests (e.g. AI model APIs) when you use it.
Features & Usage
Ctrl+; for properties) still work while focus is inside the DSH panel; it auto-reads your hotkey settings.@deepseek-ai/dsh for the global CLI, @deepseek-ai/dsh-root for a source checkout). Third-party same-named community packages on npm (e.g. @x1a0f3n9/dsh-web-app, dsh-workspace, which share the official 0.1.5-rc.x number space: 0.1.5-rc.3 exists in both — official on 2026-09-22, third-party rc.3/4/5 on 09-18~09-20) are never mistaken for DSH; when a version can't be verified, it is displayed but not used for a verdict or a dialog.test) while the desktop app keeps its own (typical: web on 3080). The plugin creates the profile from the web template, installs its bridge into it, launches it on its own port, and restarts only what it launched — foreign DSH instances are never killed.cordis.patch.yml fails to parse and the whole plugin layer never loads; ③ a plugin package is missing or left behind by an uninstall (cannot find module / MODULE_NOT_FOUND); ④ a bundle-layer plugin installed via dsh plugin add breaks startup (out of reach of patch-layer disables); ⑤ safe-mode leftovers disabled the bridge or client modules (blank panel, client.js did not export the bootstrap module face, selection injection silently dead); ⑥ the process answers on the port but the page lacks the boot injection. That list also sits behind the inline "What it can fix" link, keeping the row itself to one short description. Not for: unreadable sessions (use the Session repair button), model or credential configuration, or an unsupported DSH version.Performance
--no-open support) are cached and reused, so repeated starts skip the slow probe and the panel opens faster.Requirements
Install: Obsidian → Settings → Community plugins → Browse → search "DeepSeek Harness" → Install. Build from source is also supported.
Credits: Thanks to the DeepSeek and Obsidian open-source teams — the open, shared spirit of the internet is what makes tools like this possible. And thank you to Claudian (an AI coding-agent plugin for Obsidian), whose design inspired this plugin's select-and-send interaction.
一个把 DeepSeek Harness(DSH)原生 Web UI 无痕嫁接到 Obsidian 的桌面插件。不改 DSH 一行源码(走官方扩展机制),DSH 升级即可用。插件与 DSH 之间仅走本机回环;DSH 使用时会自行发起外网请求(如调用 AI 模型 API)。
省心接入
原生体验
cordis.patch.yml 解析报错、插件层整体加载不了;③插件包缺失或卸载残留(cannot find module / MODULE_NOT_FOUND);④经 dsh plugin add 安装的 bundle 层插件拖垮启动(补丁层管不到的那一类);⑤安全模式残留把桥接或客户端模块禁掉(面板白屏、client.js did not export the bootstrap module face、框选注入静默失效);⑥进程在端口上应答但页面缺启动引导注入。这份清单也做成设置页 AED 行内的「适用症状说明」链接,点开即看,不占正文。不适用:会话打不开(用「会话修复」)、模型与凭据配置、DSH 版本本身不适配兼容与修复
@deepseek-ai/dsh,源码仓库根为 @deepseek-ai/dsh-root)。npm 上的第三方同名社区包(如 @x1a0f3n9/dsh-web-app、dsh-workspace,与官方共用 0.1.5-rc.x 号段(官方 0.1.5-rc.3 发布于 2026-09-22;第三方同名 rc.3/rc.4/rc.5 发布于 09-18~09-20),同一版本串可能是两个不同程序)不会被当成本体;来源无法核验时只展示版本、不做适配判定也不弹窗dsh web authentication required隐私可控
平台支持:Windows / macOS(仅桌面端)
--no-open 支持)缓存复用,避免每次启动重复耗时探测,面板打开更快感谢 DeepSeek 与 Obsidian 开源团队——开放、共享的互联网精神,让这样的工具得以诞生。向所有开源贡献者致敬;感谢 Claudian(Obsidian 内的 AI 编码 agent 插件)——本插件的「框选发送」交互正源自其设计灵感。
| Setting | Default | Description |
|---|---|---|
| Interface language | Follow Obsidian | Chinese / English; any other system language falls back to English |
| Service port | 3080 | Port the DSH Web GUI listens on |
| Startup command / working directory | empty | Customize how dsh web starts (supports the {port} placeholder) |
| Auto-start when offline | on | Start the service if the port has none when the panel opens |
| Detached persistent process | on | Keep DSH running after Obsidian exits |
| One-click install DSH | button | Auto-install dependencies → clone (live percentage) → install dependencies (progress bar) → auto-configure |
| Auto-check updates | on | After startup the plugin checks DSH on the selected update channel (at most once per 24h by default) and only asks before installing — it never updates silently |
| DSH update channel | Follow pushed | Stable only / follow the pushed version (rc & beta, default) / include alpha. DSH currently ships only pre-releases, so "stable only" means no updates |
| DSH profile | web | Pick an existing profile from the dropdown or type a new name to create one (asks first, since it rebuilds the service). Non-web profiles are created from the web template, get their own bridge install, start as dsh --profile <name> on their own port and coexist with the desktop app; built-in template names (acp / headless / sdk / sdk-minimal) are rejected |
| Current compatibility | row | Shows the detected DSH version and the verdict (supported ✓ / known-incompatible ✗ / outdated or newer than verified ⚠ / bridge missing / version unverifiable), with a "re-check now" button on the same row; the plugin info row states the verified DSH range. Text only — no dialogs |
| Check for updates | button | Manual check; falls back to a read-only mirror if the official source fails |
| Session format repair | button (label: Session repair) | Scan every session with DSH's own format chain and report readability; back up and repair the ones the current format rejects. Sessions on an older format than your DSH are left untouched — DSH migrates those itself the first time you open them (read-only scan; rewriting requires an explicit click) |
| Plugin info | row | Shows the installed plugin version; the in-app changelog modal + a DSH version compatibility modal (verified range, per-range verdicts, how the bridge is judged, and your current verdict) + "check plugin updates" (opens the official Obsidian store page) + GitHub repo URL (feedback & issues welcome) |
| Bottom padding | 20px | Empty space below the panel (0–30px) when the Obsidian status bar covers the panel bottom |
| Shortcut passthrough | on | Obsidian global shortcuts still work while focus is inside the DSH panel (auto-reads your hotkey settings) |
| Bridge Obsidian → DSH chat | on | Select text in a note and right-click to send it to the DSH chat; the DSH panel opens automatically after sending |
| Bridge DSH chat → Obsidian | on | Readable files generated by DSH inside your vault open in Obsidian with one click |
| Changelog | link | Open the DSH GitHub Releases page (for DSH itself) to read per-version changes; the plugin's own changelog opens in an in-app modal |
| AED for DSH | button + info link | Downloads and runs dsh-fix (a standalone npm global CLI the plugin keeps up to date, with a mirror fallback when the official registry is unreachable) and starts DSH in safe mode; instruct DSH to self-repair, then use "Exit safe mode" on the same row to restore every plugin. The inline "What it can fix" link opens a popup listing the breakages AED rescues: plugin conflicts, an unparseable patch layer, missing or leftover plugin packages, bundle-layer plugins, safe-mode leftovers disabling the bridge, and a page without the boot injection |
| Update mirror URL | empty | Custom update mirror; empty auto-falls back to gh-proxy |
| Install URL | official repo | Clone URL; switch to a proxy mirror on restricted networks |
| Diagnostics | log | Startup timing log (last 5 runs): plugin load → service probe → service start → panel ready |
baseURL supports OpenAI-completions/Responses, Anthropic-messages and other protocols — including a local model such as Ollama/vLLM, in which case data never leaves your machine). Vault index, session history and API keys stay on your machine (local credentials store).| Symptom / error | Cause | Fix |
|---|---|---|
| Panel won't open | Wrong working directory, pnpm not on PATH, port taken |
The error view shows the reason + a copy-paste manual startup command |
spawn dsh ENOENT / "dsh not found" |
Windows .cmd shim not resolvable by Node |
Plugin already wraps npm-style commands via cmd.exe; reload the plugin (fully restart Obsidian) |
EADDRINUSE / port 3080 taken |
A stale DSH process holds the port | Settings → Quick actions → Restart service |
| "Bridge not ready, sent directly instead" | Bridge script not yet injected into the panel | Settings → Quick actions → Restart service (after updating the plugin, fully restart Obsidian before restarting the DSH service) |
koffi.node EBUSY during CLI update |
The running DSH locks its native module | The plugin stops the service before updating the CLI; otherwise stop DSH manually and retry |
| Chat history missing or a session won't open after a DSH upgrade | Session format drift between DSH versions — early releases kept the header version at 0 so no upgrade was ever gated, and from 0.1.5 each format change also renames the live file (session.v3.jsonl.zstd, then session.v4.jsonl.zstd on 0.1.7), leaving older files frozen |
Settings → Quick actions → Session format repair → "Back up and repair". The report separates the two cases: sessions on an older format than your DSH are listed as "left for DSH to migrate" — just open one, DSH upgrades it on the spot; only sessions rejected by the current format are repaired here |
DeepSeek request extension preparation failed (only the DeepSeek provider fails; other providers work) |
An older bridge installed as a loose module in the profile directory, whose owning manifest has no version |
Update the plugin (2.4.0+ installs the bridge as its own package); if it persists, run the repair checker |
dsh web authentication required after upgrading or restarting DSH |
The launch token is generated per process; the plugin cached the previous one | 2.4.0+ reloads the panel with the new credential automatically; otherwise Settings → Quick actions → Restart service |
Could not resolve host / update fails |
github.com blocked or flaky | Use the update mirror URL, or check the network |
| npm global install hangs at the end | Known npm behavior on this package | Verify by reading the installed package's package.json version, not the console |
src/
├── main.ts # Plugin entry: commands, menus, bridge wiring, profiler
├── service-manager.ts # DSH service probe / spawn / restart (kill port owner)
├── bridge.ts # DSH official extension seam: patch entry + packaged bridge plugin (profile/dsh-obsidian-bridge/)
├── session-repair.ts # Session format drift: precheck + backed-up repair (zstd multi-frame, DSH catalog validation)
├── session-repair-modal.ts # Repair modal (read-only scan → back up and repair → re-check)
├── dsh-api.ts # Local RPC client (session.list/prompt/history) over 127.0.0.1
├── startup-profiler.ts # Startup timing log (phases → data.json)
├── installer.ts # One-click install: deps (winget/npm/mirror) + clone + build + CLI
├── updater.ts # Update check (official + mirror), stable-version gate
├── aed.ts # dsh-fix safe-mode recovery
├── view.ts # Embedded panel (iframe) with error view
├── settings.ts # Settings tab (language / bridge / diagnostics)
├── changelog.ts # In-app plugin changelog modal (+ changelog-data.ts)
├── i18n.ts # Chinese / English dictionary
└── win-exec.ts # Windows .cmd wrapper for npm-style commands
npm run dev # esbuild watch mode
npm run build # production build + install
npm test # unit tests
npm run typecheck # tsc --noEmit
npm run release:check # full release gate (tests + lint + typecheck + review-style checks)
Verification harnesses (optional, require an isolated DSH install — see the scripts' headers):
node scripts/verify-embed.mjs <dsh-bin.js> <isolated-home> auth # panel embedding auth matrix
node scripts/verify-session-repair.mjs <isolated-home> <dsh-package-dir> # session drift repair end-to-end
python scripts/sandbox_ui_test.py # real iframe UI checks (Playwright + system Chrome)
方式一:商店安装(推荐) Obsidian → 设置 → 第三方插件 → 浏览 → 搜索 「DeepSeek Harness」 → 安装。无需 GitHub 链接。
方式二:本机已有 DSH 启用插件后,在设置中点「一键检测配置」即可自动识别并填充。
cd "07 coding project/dsh-obsidian"
npm install
npm run build # 自动安装到 .obsidian/plugins/dsh-harness/
| 设置 | 默认 | 说明 |
|---|---|---|
| 界面语言 | 跟随 Obsidian | 中文 / English,其他系统语言自动英文 |
| 服务端口 | 3080 | DSH Web GUI 监听端口 |
| DSH Profile(配置档) | web | 下拉选择本机已有 profile,或输入新名「新建并切换」(切换前弹确认框)。设为非 web(如 test)时插件自动基于 web 代建、把桥接装入该 profile、启动命令改用 dsh --profile <名> 形态并在独立端口拉起,与桌面版等外部实例跨端口共存(会话存储本机共享);DSH 内置档名(acp / headless / sdk / sdk-minimal)会被拦下,不可代建 |
| 启动命令 / 工作目录 | 空 | 自定义 dsh web 启动方式(支持 {port} 占位) |
| 离线时自动启动 | 开 | 打开面板时若无服务自动拉起 |
| 进程独立常驻 | 开 | 关闭 Obsidian 后 DSH 继续运行 |
| 一键安装 DSH 本体 | 按钮 | 自动装依赖 → 克隆(实时百分比)→ 装依赖(进度条)→ 自动配置 |
| 自动检查更新 | 开 | 启动后按「DSH 更新通道」自动检测新版(默认 24 小时至多一次;有新版才弹确认框,可查看 GitHub 更新内容或立即更新,绝不静默安装) |
| DSH 更新通道 | 跟随主推 | 仅正式版 / 跟随主推(含 rc、beta,默认)/ 含 alpha。DSH 目前只发布预发布版本,选「仅正式版」等于不更新 |
| 当前适配状态 | 行 | 显示本机 DSH 版本与判定(已适配 ✓ / 已知不兼容 ✗ / 旧版或新版本 ⚠ / 桥接未安装或未生效 / 版本未能核验),同行按钮可「重新检查适配」就地重读;本机高于实测上界时行尾自动追加只读触点自检结论(v2.8.8,开机后台跑一次,按版本缓存);「插件信息」栏标注插件实测适配的 DSH 区间。只呈现文字,不弹窗 |
| 检查 DSH 更新 | 按钮 | 手动检查;官方源失败自动走只读镜像 |
| 会话格式修复 | 按钮(文案:会话修复) | 用 DSH 自带格式链逐会话体检并报告可读性,对当前格式判定不可读的先备份再修复;格式低于当前 DSH 的旧会话不改写,首次打开时由 DSH 自行迁移(检查只读;不改写必须显式点击) |
| 插件信息 | 行 | 显示插件已安装版本;更新日志弹窗 + DSH版本适配说明弹窗(实测适配区间、各版本段结论、桥接判定依据与本机当前判定)+ 「检查插件更新」(打开 Obsidian 官方商店页)+ GitHub 主页网址原文链接(使用反馈欢迎留言) |
| 底部垫高 | 20px | 面板底部留白(0–30px):Obsidian 状态栏遮挡面板底部时使用 |
| 快捷键透传 | 开 | 光标聚焦在 DSH 面板内时 Obsidian 全局快捷键仍可响应(自动读取你的快捷键设置) |
| Obsidian 桥接到 DSH 聊天框 | 开 | 框选笔记文字自动发送(隐式信息行);发送后自动打开 DSH 面板查看处理 |
| DSH 聊天框桥接到 Obsidian | 自动发送 | 三选项:取消 / 自动发送 / 右键发送;非「取消」时 DSH 生成的库内可阅读文件(如产物路径)点击即在 Obsidian 内打开阅读 |
| 更新日志 | 链接 | 打开 DSH(本体)GitHub Releases 页,查看各版本更新内容;插件自身的更新日志为内置弹窗 |
| AED for DSH | 按钮 + 说明链接 | 下载并运行 dsh-fix(独立 npm 全局命令行工具,插件自动装到最新、官方源不通走镜像)并以安全模式启动 DSH;请在 DSH 进入安全模式后命令 DSH 自我修复,完事点同行「退出安全模式」恢复全部插件。行内「适用症状说明」链接点开可见它能抢救哪些崩溃状态(插件冲突、补丁层解析失败、插件包缺失或卸载残留、bundle 层插件、安全模式残留禁掉桥接、页面缺启动引导注入) |
| 更新镜像地址 | 空 | 自定义更新镜像;留空自动用 gh-proxy 兜底 |
| 安装地址 | 官方仓库 | 克隆地址,网络受限可换代理镜像 |
| 诊断 | 日志 | 启动耗时记录(最近 5 次):插件加载 → 服务探测 → 服务启动 → 面板就绪 |
dsh web);插件与 DSH 之间仅通过本机回环(127.0.0.1)通信;插件自身发起的外网请求只有你主动触发的(克隆 DSH、检查更新)。无遥测。baseURL 支持 OpenAI-completions/Responses、Anthropic-messages 等协议——可指向本地模型如 Ollama/vLLM,此时数据不出本机)。Vault 索引、会话记录与 API key 凭证均存于本机(本地凭证库)。| 症状 / 报错原文 | 原因 | 修复 |
|---|---|---|
| 面板打不开 | 工作目录不对、pnpm 不在 PATH、端口被占用 |
错误视图会给出原因与手动启动命令(复制即用) |
spawn dsh ENOENT / 「找不到 dsh」 |
Windows 下 npm 系 .cmd shim 无法被 Node 直接执行 |
插件已内置 cmd.exe 包装;重载插件(彻底重启 Obsidian) |
EADDRINUSE / 端口 3080 被占用 |
残留 DSH 进程占着端口 | 设置 →「快捷操作」→「重启服务」 |
| 「桥接未就绪,改为直接发送」 | 桥接脚本尚未注入面板 | 设置 →「快捷操作」→「重启服务」(插件更新后请先彻底重启 Obsidian 再重启 DSH 服务) |
更新 CLI 时 koffi.node EBUSY |
运行中的 DSH 锁住了原生模块 | 插件更新前会先停服务;否则手动停 DSH 后重试 |
| DSH 升级后聊天记录缺失 / 某个会话打不开 | DSH 各版本间的会话格式漂移——早期 header 版本号恒为 0,升级/降级都不被拦;0.1.5 起 header 带版本号,且每次换格式连活文件名一起换(session.v3.jsonl.zstd,0.1.7 起 session.v4.jsonl.zstd),旧文件就此冻结 |
设置 →「快捷操作」→「会话格式修复」→「备份并修复」;预检里标为「格式低于当前 DSH」的那批不用修,直接打开该会话由 DSH 自行迁移即可 |
DeepSeek request extension preparation failed(只有 DeepSeek 官方 provider 挂、换 provider 正常) |
旧版桥接以「松散模块」装在 profile 目录,而它归属的清单缺 version |
升级插件(2.4.0 起桥接为独立插件包);仍出现则跑一次「会话格式修复」 |
升级/重启后 dsh web authentication required |
启动 token 每进程重新生成,插件缓存了旧凭证 | 2.4.0 起会自动按新凭证重载面板;否则 设置 →「快捷操作」→「重启服务」 |
Could not resolve host / 更新失败 |
github.com 被墙或不稳定 | 检查网络;或换用「更新镜像地址」 |
| npm 全局安装收尾挂起 | 该包的已知 npm 行为 | 以安装后 package.json 的版本为准验证,而非控制台输出 |
src/
├── main.ts # 插件入口:命令/菜单/桥接接线/打点
├── service-manager.ts # DSH 服务探活/启动/重启(清理端口占用)
├── bridge.ts # DSH 官方扩展缝:补丁条目 + 独立包的桥接插件(profile/dsh-obsidian-bridge/)
├── session-repair.ts # 会话格式漂移:只读预检 + 带备份修复(zstd 多帧切分,DSH catalog 复验)
├── session-repair-modal.ts # 修复弹窗(只读体检 → 备份并修复 → 自动复检)
├── dsh-api.ts # 本机 RPC 客户端(session.list/prompt/history,走 127.0.0.1)
├── startup-profiler.ts # 启动耗时打点(各阶段 → data.json)
├── installer.ts # 一键安装:依赖(winget/npm/镜像)+ 克隆 + 构建 + CLI
├── updater.ts # 更新检查(官方+镜像),仅正式版门禁
├── aed.ts # dsh-fix 安全模式抢救
├── view.ts # 内嵌面板(iframe)+ 错误视图
├── settings.ts # 设置页(语言/桥接/诊断)
├── changelog.ts # 插件更新日志弹窗(+ changelog-data.ts 数据)
├── i18n.ts # 中英双语词典
└── win-exec.ts # Windows npm 系命令的 cmd.exe 包装
npm run dev # esbuild 监听模式
npm run build # 生产构建并安装
npm test # 单元测试
npm run typecheck # 类型检查(tsc --noEmit)
npm run release:check # 发布前全量门禁(测试+lint+类型检查+审核风格校验)
验证脚本(可选,需要一个隔离的 DSH 安装;用法见脚本头部注释):
node scripts/verify-embed.mjs <dsh-bin.js> <隔离 home> auth # 面板嵌入认证矩阵
node scripts/verify-session-repair.mjs <隔离 home> <DSH 安装包目录> # 会话漂移修复端到端
python scripts/sandbox_ui_test.py # 真实 iframe UI 检查(Playwright + 系统 Chrome)