跳到主内容

web-app/harness/packages/bundle/web-app

15Star3Fork1Issue0Watching

把 DeepSeek Harness 装进浏览器:作为 dsh --profile web 的 profile bundle,提供 webserver、前端 dist 服务、浏览器插件名单、命令行参数解析与 web-runtime 粘合逻辑。

机审证据5/5方法论数据来源安装命令持续维护DSH 版本风险扫描
机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科

ⓘ 此插件是大仓库 WJZ-P/deepseek-harness-desktop 的子包,星数与活跃度统计的是整个仓库。

语言
TypeScript
License
MIT
分支
main
dsh-plugin

安装

命令web profile
$ dsh plugin --profile web add @deepseek-ai/dsh-web-app

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 WJZ-P/deepseek-harness-desktop/harness/packages/bundle/web-app:先查看仓库 https://github.com/WJZ-P/deepseek-harness-desktop 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

这是 DSH 的"浏览器表层"profile bundle:把 dsh-base 之上的 Web 界面(HTTP 服务 + 前端 dist + 浏览器侧插件名单 + 命令行参数 + 模型可见的 web-surface 提示词)一次性组装起来,让 dsh --profile web 一条命令就能在浏览器里跑出完整的 Harness GUI。

核心能力

  • 启动 Web GUI:安装后用 dsh --profile web 启动一个监听本地端口的 HTTP 服务,把前端 dist 通过 frontend-static 兜底席位喂给浏览器
  • 解析命令行参数:自带 commander 命令,支持 --host / --port / 可重复的 --trusted-host 与 --help
  • 拼装浏览器插件名单:在 patch 里一次性挂载约 30 个客户端插件(布局、侧栏、对话、工具、规划、子代理、技能、模型选择、目标、轨迹、主题、设置等)以及它们的 node 端宿主行
  • 暴露 /api 信任栅栏:把 LAN IPv4 字面量与 --trusted-host 参数拼成 trustedHosts 列表,交给浏览器 fetch/SSE 客户端作为反 DNS-rebinding 边界
  • 注册模型可见的 Web 上下文:向系统提示词注入 harness:source 和 app:web-surface 两段,并向受管 bash 环境注入 DSH_WEB_URL 变量,让模型知道"this page 指的是这个 GUI"
  • 打印就绪 URL:boot 完成后在控制台打印 dsh web: http://127.0.0.1:<port>(必要时附带 LAN 地址)
  • 关闭 agent 平面的工具行:把 base 里默认挂在 host 平面的工具(bash、文件、子代理、工作流等)整体关掉,让每个 session 通过 agent-preset 自己挂,避免重复注册

技术实现

  • 语言: TypeScript(ESM,"type": "module")
  • 关键依赖: commander(命令行解析)、@deepseek-ai/cordis(插件运行时)、@deepseek-ai/schemastery(config schema 校验)、@deepseek-ai/dsh-app-boot(注册 harness-source 提示词段)
  • 架构模式: Cordis profile bundle —— 包根目录 cordis.patch.yml 在 package.json#dsh.bundle.patch 声明,作为 dsh --profile web 的 patch 层叠加在 dsh-base 之上;运行时由一个 function 插件(src/index.ts,导出 name/inject/Config/apply,无默认导出)和一个命令解析插件(src/startup.ts,导出 webStartup 服务)组成
  • 入口文件: src/index.ts(web-runtime 粘合插件)、src/startup.ts(命令行 provider)、cordis.patch.yml(patch 层)、src/invariant.ts(invariant companion)

适用场景

本 bundle 是给"想用浏览器而不是终端交互 DSH"的人准备的:装上之后 dsh --profile web 一行命令就能在 127.0.0.1 启起一个完整的 Harness GUI,适合团队 demo、内网共享、或在桌面端长跑一个持久会话的场景。它和 dsh-headless 互斥——headless 是一次性 CLI 任务模式,本 bundle 是带 Web 表层的常驻模式,两者都基于同一个 dsh-base。

前置依赖与兼容性

依赖最低版本说明
DSH0.1.0-rc.5+本 bundle 版本 0.1.0-rc.5;必须叠加在 dsh-base 之上,不能单独挂载
Node.js>=22.19.0 或 >=24.0.0来自仓库根 package.json#engines(Harness 整体要求)
平台跨平台本 bundle 未声明平台限制;Windows 上需注意 dsh-base 里 bash 栈是 disabled、pwsh 栈启用
原生模块无本 bundle 自身不引入原生模块;底层 sqlite 走 :memory:,不依赖本地库

启动前必须先构建前端 dist,否则激活时会以 "frontend dist not built; run pnpm run build from the repository root first" 报错。

安装方式

dsh plugin --profile web add github:WJZ-P/deepseek-harness-desktop/harness/packages/bundle/web-app

配置项

配置类型说明默认值
printUrl布尔启动就绪后是否在控制台打印 dsh web: http://... URL 行(附带 LAN 地址),用于脚本与监控判定服务可用true
surfaceContext布尔是否向系统提示词注入 app:web-surface 段(说明"this page 指的是这个 GUI")以及向受管 bash 环境注入 DSH_WEB_URL 变量true
trustedHosts字符串数组浏览器 /api 信任栅栏接受的额外 Host 或 host:port 字面量(防 DNS rebinding),按命令行 --trusted-host 出现顺序累加[]
--host <host>(CLI)字符串webserver 绑定地址;写 0.0.0.0 会被 CLI 主动拒绝127.0.0.1
--port <port>(CLI)数字webserver 监听端口;写 0 让 OS 分配空闲端口;非数字会报 usage 错误3080
--trusted-host <authority...>(CLI)字符串数组重复追加信任栅栏接受的主机字面量(host 或 host:port),最终并入 trustedHosts 配置无
DSH_TOOLS_MODE(环境变量)native | code | both临时开关:把整个 dsh 进程切换到 Code Mode;待 Web UI 上线"按会话选工具展示"后会移除未设置(沿用 schema 默认 native)

常见问题

Q: 启动时怎么指定端口和绑定地址?

A: 用命令行参数 --port 和 --host,例如 dsh --profile web --port 8080;不指定时使用 schema 默认(127.0.0.1:3080)。

Q: 启动报 "frontend dist not built" 怎么办?

A: 在仓库根目录先跑 pnpm run build 编出前端 dist;本 bundle 直接 require.resolve('@deepseek-ai/dsh-web-frontend/dist/index.html'),找不到就报错并提示这条命令,没有从源码临时服务的兜底。

Q: 局域网里别的设备怎么访问这个 GUI?

A: 当前 CLI 主动拒绝 --host 0.0.0.0,因为会把远程代码执行暴露到网络(见 src/startup.ts:69-71)。需要内网访问建议在 127.0.0.1 上跑本 bundle,外面套反向代理并把代理用的主机名通过 --trusted-host 加入信任栅栏。

Q: --trusted-host 是做什么的?什么时候必须加?

A: 它把额外的 Host / host:port 加入浏览器到 /api 的信任栅栏,防 DNS rebinding。当浏览器用非 127.0.0.1 的 Host header 访问(比如反向代理、自定义 hostname、端口映射)时必须配置;可重复,按书写顺序追加。

Q: 控制台打印的 dsh web: http://127.0.0.1:3080 后面的 LAN 地址是怎么来的?

A: 当且仅当 webserver bind 到 0.0.0.0 时,bundle 会在 boot 那一刻用 node:os 的 networkInterfaces() 采样一次非内部 IPv4 字面量,挑第一个拼到 URL 行后面。但 --host 0.0.0.0 当前被 CLI 拒绝,所以这条分支在默认配置下走不到。

Q: 模型在 bash 工具里看到的 DSH_WEB_URL 是什么?

A: 这是 bundle 在 surfaceContext=true 时向受管 shell 环境注册的变量,存当前会话对应的 GUI 本地 URL,让 bash 工具知道"this page 指的是这个 GUI"。关掉 surfaceContext 之后模型既看不到 app:web-surface 提示词段,也读不到这个变量。

Q: 怎么关掉启动时打印的 URL 行?

A: 在你的 cordis.patch.yml 里把 web-runtime row 的 printUrl 设为 false,或在非交互脚本里直接覆盖该 row。这是给"批处理 + 健康检查"用的关停开关,URL 仍然可以从 webServer 服务读到。

Q: 怎么从 profile 移除这个 bundle?

A: 在 profile 的 dsh.profile.bundles 列表里删掉 web-app 条目即可。注意 dsh-base 假设 web-app 在其之上叠加,单独拆掉 web-app 会让 base 里 host 平面的 agent 工具回到默认状态(bash / 文件 / 子代理等会重新挂到 host),需要的话用你自己的 patch 把它们显式 disabled。

上手难度

入门 — 命令就是 dsh --profile web,最多再加一个 --port;安装后只需确保 pnpm run build 已跑过一次前端 dist,剩下的事 patch 全包办了。

已知问题与限制

  • 前端 dist 必须先构建:激活时通过 require.resolve 拿 dist,找不到会立即报错并提示 pnpm run build from the repository root first;没有从源码临时服务的兜底(README Known Limitations)
  • LAN 地址是 boot 期快照:bundle 在 apply 时采样一次 networkInterfaces();启动后网卡变化不会重新公告,打印的 LAN URL 始终等于 boot 期信任栅栏(README Known Limitations)
  • HMR 当前禁用:cordis.patch.yml:21-23 的 TODO 标注"Re-enable shared HMR for Web after its reload lifecycle is tested",目前 hmr row 处于 disabled: true,改客户端插件不会触发无刷新热更新
  • DSH_TOOLS_MODE 是临时整进程开关:cordis.patch.yml:38-42 的注释明确写"TEMPORARY workaround",用于在 Web UI 尚未提供"按会话选工具展示"能力前通过环境变量强制 Code Mode;待 UI 上线后移除
  • --host 0.0.0.0 被主动拒绝:源码注释说"intentionally not supported yet for safety: it would expose remote code execution to the network",内网/局域网暴露请走反向代理 + --trusted-host

查看使用指南 →

该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/WJZ-P/deepseek-harness-desktop/harness/packages/bundle/web-app)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录