🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

多用户 Web 工作台 darker2016/WebDSH

DeepSeek Harness
darker201680 天前有提交已提供中文文档扫描:含敏感能力

把 dsh 变成团队共用的多用户 Web 服务器

28.7/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add darker2016/WebDSH
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · security
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 80 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/6) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 39 处,展示前 37 条)
  • 写入本地文件
    gate/src/audit.ts:28
    mkdirSync(join(dataRoot, "audit"), { recursive: true });
  • 写入本地文件
    gate/src/audit.ts:35
    appendFileSync(this.file, `${line}\n`, "utf8");
  • 读取本地文件
    gate/src/config.ts:55
    const existing = readFileSync(file, "utf8").trim();
  • 写入本地文件
    gate/src/config.ts:61
    mkdirSync(dataRoot, { recursive: true });
  • 写入本地文件
    gate/src/config.ts:62
    writeFileSync(file, secret, { mode: 0o600 });
  • 写入本地文件
    gate/src/config.ts:72
    for (const p of [dataRoot, usersRoot, sharedRoot, reposRoot]) mkdirSync(p, { recursive: true });
  • 写入本地文件
    gate/src/db.ts:91
    mkdirSync(dataRoot, { recursive: true });
  • 发起网络请求
    gate/src/dsh-rpc.ts:32
    const res = await fetch(`http://127.0.0.1:${info.port}/api/${method}`, {
  • 写入本地文件
    gate/src/repos.ts:125
    mkdirSync(dirname(snapshotPath(user_id)), { recursive: true });
  • 写入本地文件
    gate/src/repos.ts:126
    writeFileSync(snapshotPath(user_id), JSON.stringify(snapshot, null, 2));
  • 执行外部命令固定命令
    gate/src/repos.ts:150
    return execFileSync("git", args, { cwd, encoding: "utf8", maxBuffer: 16 * 1024 * 1024 }).trim();
  • 写入本地文件
    gate/src/repos.ts:159
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    gate/src/repos.ts:169
    mkdirSync(dirname(wt), { recursive: true });
  • 写入本地文件
    gate/src/repos.ts:185
    mkdirSync(dirname(wt), { recursive: true });
  • 读取本地文件
    gate/src/server.ts:246
    ? createHttpsServer({ cert: readFileSync(cfg.tlsCert), key: readFileSync(cfg.tlsKey) }, requestHandler)
  • 读取本地文件
    gate/src/supervisor.ts:47
    portMap = JSON.parse(readFileSync(portFile, "utf8")) as Record<string, number>;
  • 写入本地文件
    gate/src/supervisor.ts:53
    writeFileSync(portFile, JSON.stringify(portMap, null, 2));
  • 读取本地文件
    gate/src/supervisor.ts:82
    const text = readFileSync(file, "utf8");
  • 发起网络请求
    gate/src/supervisor.ts:100
    const res = await fetch(`http://127.0.0.1:${port}/`);
  • 执行外部命令来自配置/变量
    gate/src/supervisor.ts:117
    return spawn(DSH_BIN, ["--profile", "web", "--port", String(info.port)], {
  • 读取本地文件
    gate/src/supervisor.ts:153
    const existingPatch = existsSync(patchFile) ? readFileSync(patchFile, "utf8") : "";
  • 读取本地文件
    gate/src/supervisor.ts:153
    const existingPatch = existsSync(patchFile) ? readFileSync(patchFile, "utf8") : "";
  • 写入本地文件
    gate/src/supervisor.ts:156
    mkdirSync(dirname(patchFile), { recursive: true });
  • 写入本地文件
    gate/src/supervisor.ts:157
    writeFileSync(patchFile, renderUserPatch({ user, role, home, sharedRoot: cfg.sharedRoot }));
  • 读取本地文件
    gate/src/supervisor.ts:165
    entries = readdirSync(cfg.pluginDir, { withFileTypes: true })
  • 读取本地文件
    gate/src/supervisor.ts:174
    if (!existsSync(pkgPath)) continue;
  • 写入本地文件
    gate/src/supervisor.ts:188
    mkdirSync(dirname(target), { recursive: true });
  • 写入本地文件
    gate/src/supervisor.ts:204
    mkdirSync(home, { recursive: true });
  • 发起网络请求
    gate/src/supervisor.ts:271
    const res = await fetch(`http://127.0.0.1:${info.port}/`);
  • 读取本地文件
    plugin/dsh-filexplore/lib/index.js:150
    entries = await readdir(dir, { withFileTypes: true });
  • 读取本地文件
    plugin/dsh-filexplore/lib/index.js:165
    st = await stat(join(dir, entry.name));
  • 写入本地文件
    plugin/dsh-filexplore/lib/index.js:213
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    plugin/dsh-filexplore/lib/index.js:222
    await writeFile(target, bytes);
  • 读取本地文件
    plugin/dsh-filexplore/lib/index.js:245
    entries = await readdir(dir, { withFileTypes: true });
  • 读取本地文件
    plugin/dsh-filexplore/lib/index.js:260
    st = await stat(full);
  • 读取本地文件
    plugin/dsh-filexplore/lib/index.js:287
    await stat(probe);
  • 读取本地文件
    plugin/dsh-filexplore/lib/index.js:296
    await stat(candidate);
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 多用户Web服务器
  • 每用户独立进程隔离
  • 工作空间分享

把 DeepSeek Harness(dsh)改造成多用户 Web 服务器:认证前门 + 每用户独立进程与隔离 + 工作空间分享 + Git 仓库分支开发。覆盖层方案,不 fork 官方包。

README

由 DeepSeek 最新模型翻译生成
WebDSH —— 把 DeepSeek Harness 改造成公司内部多用户 Web 服务器 目标:让 dsh(DeepSeek Harness)以 Web 服务器形态运行在公司内网/公网服务器上,用户用浏览器(含手机)远程访问;同一台服务器服务多个用户,各用户数据隔离;工作空间可在用户之间共享。改造以覆盖层(overlay)形态进行,不 fork 官方包,可跟随 @deepseek-ai/dsh 升级。 🤖 面向 AI 代理/协作者的开工入口见 AGENTS.md(文档地图、当前状态、已核实事实、常用命令、部署目标、工作约定)。 产品愿景 一支团队、一套服务器上的代码、各自的开发分支。 多用户可以共享服务器上同一套代码仓库进行开发:仓库 → 分支 → 对话 三层组织;共享分支团队协作,个人分支(命名自由、仅本人可见)各自开发、互不干扰;用户登录后自动匹配其代码平台的凭据,提交与推送按人归因。
展开完整文档(README 剩余 1 节)
WebDSH —— 把 DeepSeek Harness 改造成公司内部多用户 Web 服务器

目标:让 dsh(DeepSeek Harness)以 Web 服务器形态运行在公司内网/公网服务器上,用户用浏览器(含手机)远程访问;同一台服务器服务多个用户,各用户数据隔离;工作空间可在用户之间共享。改造以覆盖层(overlay)形态进行,不 fork 官方包,可跟随 @deepseek-ai/dsh 升级。

🤖 面向 AI 代理/协作者的开工入口见 AGENTS.md(文档地图、当前状态、已核实事实、常用命令、部署目标、工作约定)。

产品愿景

一支团队、一套服务器上的代码、各自的开发分支。
多用户可以共享服务器上同一套代码仓库进行开发:仓库 → 分支 → 对话 三层组织;共享分支团队协作,个人分支(命名自由、仅本人可见)各自开发、互不干扰;用户登录后自动匹配其代码平台的凭据,提交与推送按人归因。

功能特性

| # | 特性 | 说明 |
| F1 | 服务器端运行 | dsh web 天然是 Web 服务器(HTTP + WebSocket + React 前端),改造后常驻服务器 |
| F2 | 手机远程访问 | 浏览器(含手机)经 HTTPS 远程访问;登录后全功能可用 |
| F3 | 同一服务器多用户 | 每用户独立进程 + 独立 $DSH_HOME,会话/设置/凭据/文件互不可见 |
| F4 | 工作空间分享 | 普通目录工作空间按 ACL 分享(读/写/撤销),见 docs/05 |
| F5 | 代码仓库工作区与分支开发(新增) | 工作区可对应 Git 代码仓库;UI 自动呈现 仓库 → 分支 → 对话 层级;用户自选展示哪些分支;分支下挂各自的对话;共享分支团队协作 + 个人开发分支;用户凭据绑定代码平台账号,见 docs/09 |

文档导航

| 文档 | 内容 |
| docs/01-现状分析.md | 现有架构盘点:dsh web 今天是什么、能力与差距(含代码位置) |
| docs/02-目标架构.md | 目标架构总览:子域路由 + 每用户独立 dsh 进程 + 认证前门 |
| docs/03-认证与安全设计.md | 认证、会话 token、信任模型、特权方法门禁 |
| docs/04-多用户数据面与隔离.md | 每用户 DSH_HOME、进程模型、OS 级隔离选项与取舍 |
| docs/05-工作空间分享设计.md | 分享 ACL、双注册表同步、并发控制 |
| docs/06-覆盖层实现方案.md | 不 fork 的实现:新包清单、patch 插入点、RPC 门禁表 |
| docs/07-分阶段实施计划.md | Phase 0–4 任务分解与验收标准 |
| docs/08-部署与运维.md | Caddy/TLS、systemd、备份、审计、配额、监控、升级 |
| docs/09-代码仓库工作区与分支开发.md | 仓库化工作区:分支模型、凭据绑定、分支 UI、权限与并发 |
| docs/10-实施日志与Phase0验证.md | 实施日志:Phase 0 技术验证结论(含 R1 设计修订)、移动端实测清单 |

决策记录

第一轮(2026-08-15,与用户确认)

| 决策项 | 结论 |
| 部署场景 | 公司/组织内部(多人、统一管理)→ 需要用户账号、审计、配额 |
| 隔离强度 | 每用户独立进程(方案 A),数据面按用户隔离;OS 级隔离作为阶段 2+ 的强化项 |
| 改造形态 | 覆盖层:新插件 + profile patch,不 fork @deepseek-ai/dsh |

第二轮(2026-08-15,新增 F5 仓库工作区)

| 决策项 | 结论 |
| 仓库存储模型 | 服务器端每仓库一个 bare 主库 + 按分支的 git worktree(git worktree add),不同分支可并行开发;worktree 目录即官方 workspace(cwd 绑定),会话自动落在分支下 |
| 分支模型 | 共享分支(团队可见)+ 个人分支(名称由用户设定,gate 记录 owner,仅本人/被授权者可见,可一键提升为共享、不改名);受保护分支(main/develop)只读,变更走 Codeup MR 评审 |
| 凭据绑定 | 用户登录后按代码平台账号绑定凭据(gate 加密保管);添加工作区时选仓库 + 凭据;提交/推送按人归因(worktree 注入 user.name/email + credential.helper) |
| 分支 UI | 新增客户端插件 @webdsh/ui-repos(走官方 client 插件 roster insert)呈现 仓库→分支→对话 层级与分支显隐开关——官方包仍零改动,但"前端零改动"原则对该特性让位于"官方包零改动 + 新增客户端插件" |
| 与分享的关系 | 仓库成员(repo_members)是仓库级 ACL;分支 worktree 目录复用 F4 的 workspace 分享机制,两层叠加 |

第三轮(2026-08-15,F5 细节确认,用户答复)

| 决策项 | 结论 |
| 代码平台 | 阿里云 Codeup;HTTPS + 个人访问令牌优先,SSH key 备选 |
| 受保护分支 | 走 MR 评审:dsh 在受保护分支上只读(只读 worktree + 只读沙箱),合入一律经 Codeup MR(含 admin);拒绝逻辑由 Codeup 分支保护承担 |
| 共享分支并发 | 不做单写者强约束,靠团队约定(pull --rebase 等写入规范) |
| 个人分支命名 | 由用户设定;"个人"是分支属性(gate branches 表记录 owner),不靠 / 前缀推断 |

一句话结论
dsh web 今天已经是一个真正的 Web 服务器(HTTP + WebSocket + React 前端 + 多会话),
缺的三块是:认证(完全没有,--host 0.0.0.0 被硬编码拦截)、多用户数据面($DSH_HOME 单根,会话/工作空间/设置/凭据全部混在一起)、工作空间分享(workspace 记录没有 owner/ACL)。三块都能在不 fork 的前提下以覆盖层实现;在此基础上再叠加 F5 仓库化工作区:仓库 → 分支 → 对话 三层组织,让团队共享一套服务器代码、各自开分支开发。详见各文档。

目录结构(本仓库)

WebDSH/
├── README.md # 本文件 └── docs/ # 方案文档集 ├── 01-现状分析.md ├── 02-目标架构.md ├── 03-认证与安全设计.md ├── 04-多用户数据面与隔离.md ├── 05-工作空间分享设计.md ├── 06-覆盖层实现方案.md ├── 07-分阶段实施计划.md ├── 08-部署与运维.md └── 09-代码仓库工作区与分支开发.md

实施阶段开始后,本仓库将新增 gate/(认证前门服务)、plugin/(dsh 覆盖层插件,含 ui-repos 客户端插件)两个源码目录,目录结构届时更新。
预览分享卡片长什么样 ↓darker2016/WebDSH
分享 · DeepSeek Harness Hub
darker2016/WebDSH

把 dsh 变成团队共用的多用户 Web 服务器

这是你的仓库?认领条目

回到顶部