邀请客户开站,各自与 AI 员工协作办公
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add towNingtek/swarm该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 32 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/11/4) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 37 处,展示前 36 条)
- 读取本地文件platform/site_scripts/bd_hackmd.js:35
try { token = fs.readFileSync(tokenPath, 'utf8').trim(); } catch { fail('token_unreadable'); } - 读取本地文件platform/site_scripts/bd_hackmd.js:42
const read = (p) => { try { return fs.readFileSync(path.join(r.repo, p), 'utf8'); } catch { return null; } }; - 读取本地文件platform/site_scripts/bd_hackmd.js:59
cases = fs.readdirSync(caseDir).filter((f) => /^\d+.*\.md$/.test(f)).sort() - 读取本地文件platform/site_scripts/bd_hackmd.js:60
.map((f) => caseSummary(f, fs.readFileSync(path.join(caseDir, f), 'utf8'))); - 读取本地文件platform/site_scripts/bd_hackmd.js:88
try { noteId = fs.readFileSync(idFile, 'utf8').trim() || null; } catch {} - 请求外部主机api.hackmd.ioplatform/site_scripts/bd_hackmd.js:93
const res = await fetch('https://api.hackmd.io/v1' + url, { - 发起网络请求platform/site_scripts/bd_hackmd.js:93
const res = await fetch('https://api.hackmd.io/v1' + url, { - 写入本地文件platform/site_scripts/bd_hackmd.js:119
fs.writeFileSync(idFile, noteId + '\n'); - 读取本地文件platform/site_scripts/line_agent.js:37
const st = fs.statSync(full); - 读取本地文件platform/site_scripts/line_agent.js:39
const value = fs.readFileSync(full, 'utf8').trim(); - 发起网络请求platform/site_scripts/line_agent.js:48
const res = await fetch(url, { ...init, signal: ctl.signal }); - 读取本地文件plugins/synapse/build/build.mjs:14
const parser = readFileSync(join(here, 'parse-hub.mjs'), 'utf8') - 读取本地文件plugins/synapse/build/build.mjs:17
const html = readFileSync(join(here, 'template.html'), 'utf8') - 写入本地文件plugins/synapse/build/build.mjs:24
mkdirSync(dirname(OUT), { recursive: true }) - 写入本地文件plugins/synapse/build/build.mjs:25
writeFileSync(OUT, html) - 读取本地文件plugins/synapse/build/parse-hub.mjs:93
const md = readFileSync(process.argv[2] || 0, 'utf8'); - 写入本地文件plugins/synapse/lib/fetcher.js:19
writeFileSync(tmp, text, { mode: 0o600 }) - 写入本地文件plugins/synapse/lib/fetcher.js:20
renameSync(tmp, path) - 读取本地文件plugins/synapse/lib/fetcher.js:27
if (!note || !tokenFile || !existsSync(tokenFile)) return { skipped: true } - 读取本地文件plugins/synapse/lib/fetcher.js:28
const token = readFileSync(tokenFile, 'utf8').trim() - 读取本地文件plugins/synapse/lib/fetcher.js:34
try { if (JSON.parse(readFileSync(out, 'utf8')).digest === digest) return { changed: false } } catch {} - 读取本地文件plugins/synapse/lib/fetcher.js:41
if (!dir || !existsSync(dir)) return [] - 读取本地文件plugins/synapse/lib/fetcher.js:42
return readdirSync(dir, { withFileTypes: true }).filter((d) => d.isDirectory() && existsSync(join(dir, d.name, 'HIVE.md'))).map((d) => { - 读取本地文件plugins/synapse/lib/fetcher.js:42
return readdirSync(dir, { withFileTypes: true }).filter((d) => d.isDirectory() && existsSync(join(dir, d.name, 'HIVE.md'))).map((d) => { - 执行外部命令来自配置/变量plugins/synapse/lib/fetcher.js:64
return new Promise((resolve, reject) => execFile(gh, args, { timeout, maxBuffer: 32 << 20 }, (err, stdout, stderr) => { - 写入本地文件plugins/synapse/lib/fetcher.js:103
mkdirSync(dataDir, { recursive: true }) - 读取本地文件plugins/synapse/lib/index.js:68
const v = JSON.parse(readFileSync(file, 'utf8')) - 读取本地文件plugins/synapse/lib/index.js:172
try { page = readFileSync(pagePath, 'utf8') } catch (e) { logger.warn?.('synapse: page not found at %s', pagePath) } - 读取本地文件plugins/synapse/lib/index.js:173
const launcher = readFileSync(LAUNCHER, 'utf8') - 读取本地文件plugins/synapse/lib/index.js:220
try { return send(res, 200, 'application/json; charset=utf-8', head ? undefined : await readFile(join(dataDir, f), 'utf8')) } - 写入本地文件plugins/synapse/lib/index.js:234
mkdirSync(dirname(canvasFile), { recursive: true }) - 写入本地文件plugins/synapse/lib/index.js:236
writeFileSync(tmp, JSON.stringify(next), { mode: 0o600 }) - 写入本地文件plugins/synapse/lib/index.js:237
renameSync(tmp, canvasFile) - 执行外部命令来自配置/变量site/templates/relay.mjs:36
const dsh = spawn(DSH_BIN, dshArgs, { env: process.env, stdio: ["ignore", "pipe", "inherit"] }); - 发起网络请求site/templates/relay.mjs:56
const proxyReq = http.request( - 读取本地文件site/templates/test-relay-policy.mjs:59
const source = readFileSync(new URL("./relay.mjs", import.meta.url), "utf8");
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
涉及外部主机:api.hackmd.io
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 邀请客户开站
- 独立站点分配
- 按量计费用量
运营你自己的 AI 办公平台:邀请客户,给每人一个独立的 DeepSeek Harness 站点,按量计费模型用量。
README
由 DeepSeek 最新模型翻译生成Swarm
一套可以自己部署的 AI 办公室。你部署一个平台,邀请客户进来;每位客户拿到一个隔离的 DeepSeek Harness(DSH) 站点,里面已经放好办公室模板:公司、AI 员工角色、定时任务,以及存放自己密钥的地方。
运营者创建客户、发出邀请;客户激活账号、站点自动建好,在自己的站点里和 AI 一起工作
带字幕的完整视频:docs/media/demo.mp4。演示运行在一次性的测试安装上,模型是脚本,AI 的回复是预先写好的。
界面目前只有繁体中文。
功能
- 邀请制开站。 运营者在管理后台创建客户、选择办公室模板、设置每月模型额度,再发出一次性的邀请链接。用户名和密码由客户自己设置。
- 每位客户一个容器。 站点由平台自己创建:一个 DSH 容器,有自己的登录、数据和工作区,加上 nginx 路由和 DNS 记录(可选)。删除客户时这些都会一起移除。
- 带设置助手的平台首页。 客户能看到设置进度和建站状态。设置助手只根据平台实际记录的状态说明下一步,不会自己编造进度。
- 进站不用第二套密码。 点“进入我的站点”,平台会用一次性的入场票把已登录的客户交给站点。
- 平台的模型密钥不会进入站点。 每个站点有自己的起步密钥,而且只能在平台的 relay 上使用。relay 核对密钥和这个站点的每月额度,再用平台密钥转发。
- 第一次进站,办公室就在。
展开完整文档(README 剩余 1 节)
Swarm 一套可以自己部署的 AI 办公室。你部署一个平台,邀请客户进来;每位客户拿到一个隔离的 DeepSeek Harness(DSH) 站点,里面已经放好办公室模板:公司、AI 员工角色、定时任务,以及存放自己密钥的地方。 运营者创建客户、发出邀请;客户激活账号、站点自动建好,在自己的站点里和 AI 一起工作 带字幕的完整视频:docs/media/demo.mp4。演示运行在一次性的测试安装上,模型是脚本,AI 的回复是预先写好的。 界面目前只有繁体中文。 功能 - 邀请制开站。 运营者在管理后台创建客户、选择办公室模板、设置每月模型额度,再发出一次性的邀请链接。用户名和密码由客户自己设置。 - 每位客户一个容器。 站点由平台自己创建:一个 DSH 容器,有自己的登录、数据和工作区,加上 nginx 路由和 DNS 记录(可选)。删除客户时这些都会一起移除。 - 带设置助手的平台首页。 客户能看到设置进度和建站状态。设置助手只根据平台实际记录的状态说明下一步,不会自己编造进度。 - 进站不用第二套密码。 点“进入我的站点”,平台会用一次性的入场票把已登录的客户交给站点。 - 平台的模型密钥不会进入站点。 每个站点有自己的起步密钥,而且只能在平台的 relay 上使用。relay 核对密钥和这个站点的每月额度,再用平台密钥转发。 - 第一次进站,办公室就在。 工作区一开始就有办公室模板(AGENTS.md、新手指南、存放公司的文件夹)。客户之后可以接入自己的模型密钥。 - 对话分享。 每个站点都装了 dsh-share-room,客户可以邀请访客一起查看一段对话。 - 运营者总览。 一页列出每位客户的站点、额度策略和模板。客户需要人工时,运营者也在同一个后台回复。 截图 | 运营者 | 客户 | | 一览所有客户:站点、额度策略、模板 | 用邀请链接激活账号 | | 一次性邀请链接(截图已遮住) | 平台首页:站点已经建好 | 在客户自己的站点里:回复经过平台的 relay,用量计入每月额度。 在自己的站点里和 AI 工作 架构 flowchart LR browser([浏览器]) -->|"HTTPS"| nginx["nginx"] nginx -->|"platform.example.com"| platform["平台 :8210邀请、登录、平台首页、建站"] nginx -->|"platform.example.com/admin"| admin["管理后台 :8211"] nginx -->|"acme.example.com"| site["站点容器DSH + 登录 + 办公室"] platform --- db[(SQLite)] admin --- db platform -->|"docker"| site site -->|"站点密钥"| relay["站点模型 relay :8212核对密钥与额度"] relay --- db relay -->|"平台密钥"| gateway["你的 OpenAI 兼容模型 gateway"] 每个站点都在隔离的 Docker 网络里,主机上唯一能连到的是 relay,其他主机端口、内网和云 metadata 都连不到。平台本身从不执行 sudo,需要 root 的事交给两个小单元:一个管防火墙,一个应用 nginx 配置。细节见 docs/architecture.md 和 docs/security.md(英文)。 部署前请先了解 - 请使用专门给 Swarm 的主机。 平台用户在 docker 组里,等同 root。 - 容器不是虚拟机。 所有客户共用同一个内核和同一个 Docker daemon。DSH 自己的沙箱在容器里无法运行,所以隔离只靠容器、网络和防火墙。 - 站点可以访问外网。 客户的 AI 可以把该客户的数据发送到任何地方。 - 起步模型的费用由你承担。 每个站点的起步调用都经过你的 gateway、用你的密钥。每月上限会强制执行,但 token 数是估算的。 - TLS 需要自己处理。 这个仓库不处理 TLS,请在前面放 certbot、负载均衡或 tunnel。 完整清单见已知限制。 安装 需要:一台 Linux 主机(Ubuntu 22.04 或类似版本),装有 Docker 24 以上、nginx、Python 3.10 以上;站点镜像约需 2 GB 磁盘;一个 OpenAI 兼容的模型 gateway(例如 LiteLLM)。把 platform.<domain> 和 *.<domain> 指向这台主机。 sudo git clone https://github.com/towNingtek/swarm /opt/swarm cd /opt/swarm sudo python3 -m venv .venv && sudo .venv/bin/pip install -r requirements.txt sudo docker build -f site/Dockerfile -t swarm-site:latest . sudo deploy/install.sh sudo editor /etc/swarm/platform.env # 域名、origin、模型 gateway sudo editor /etc/swarm/secrets/model-key sudo cp deploy/nginx/swarm-platform.conf.example /etc/nginx/conf.d/swarm-platform.conf sudo editor /etc/nginx/conf.d/swarm-platform.conf && sudo nginx -t && sudo systemctl reload nginx sudo deploy/install.sh --start 然后打开 https://platform.<domain>/admin,用 /etc/swarm/secrets/admin-password 里的密码登录。其他设置、日志和第一位客户的创建方式见 deploy/README.md(英文)。 整套安装流程会在一次性容器里从零测试:bash deploy/tests/clean-install/run.sh。 目录 | 路径 | 内容 | | platform/ | 平台、管理后台、站点模型 relay | | site/ | 建站引擎与 DSH 站点镜像 | | office-template/ | 新站点一开就有的办公室 | | plugins/ | 放在本仓库的 DSH 插件(品牌外观) | | deploy/ | 用 systemd、Docker、nginx 在一台主机上安装 | | demo/ | 上面演示用的脚本模型和录屏脚本 | | docs/ | 架构、安全模型、HTTP API、设计记录(英文) | 开发 bash scripts/test.sh # 全部测试;Python 3.10 以上、Node 22 平台用 Python(FastAPI),页面由服务器生成。站点镜像是 DSH 加上 profile patch,不修改 DSH 本身。 名称 “一群协作的 agent”这个概念受 openai/swarm 启发。本项目独立开发,与 OpenAI 无关。 安全 发现漏洞请私下报告,见 SECURITY.md。 许可 MIT © towNingtek inc.
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
towNingtek/swarm
邀请客户开站,各自与 AI 员工协作办公
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
智能体运行框架路由HarnessRouter/harnessrouter
智能体 harness 的统一接口。
★ 3,984已汉化DSH
71.3
这是你的仓库?认领条目