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

扁平智能体团队 whateverboy2333/dsh-flat-teams

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

跨窗口派发任务并实时查看团队进展

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/25·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 70 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 34 处,展示前 34 条)
  • 读取本地文件
    lib/index.js:19
    const manifest = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
  • 删除本地文件递归
    lib/tools-team.js:202
    await rm(join(root, teamId), { recursive: true, force: true }).catch(() => undefined);
  • 写入本地文件
    lib/relay.js:41
    await mkdir(join(root, teamId, 'inbox'), { recursive: true });
  • 写入本地文件
    lib/relay.js:42
    await appendFile(file, `${JSON.stringify(record)}\n`, 'utf8');
  • 读取本地文件
    lib/relay.js:48
    raw = await readFile(mailboxFile(root, teamId, memberName), 'utf8');
  • 写入本地文件
    lib/recorder.js:115
    await writeFile(temporary, `${JSON.stringify(snapshot, null, 2)}\n`, { encoding: 'utf8', flag: 'wx' });
  • 写入本地文件
    lib/recorder.js:117
    await rename(temporary, file);
  • 删除本地文件
    lib/recorder.js:120
    await rm(temporary, { force: true }).catch(() => undefined);
  • 写入本地文件
    lib/recorder.js:162
    await mkdir(join(root, teamId), { recursive: true });
  • 读取本地文件
    lib/registry.js:32
    if (!existsSync(legacyRoot))
  • 读取本地文件
    lib/registry.js:34
    if (existsSync(newRoot)) {
  • 写入本地文件
    lib/registry.js:39
    renameSync(legacyRoot, newRoot);
  • 写入本地文件
    lib/registry.js:89
    await writeFile(temporary, content, { encoding: 'utf8', flag: 'wx' });
  • 删除本地文件
    lib/registry.js:92
    await rm(temporary, { force: true }).catch(() => undefined);
  • 写入本地文件
    lib/registry.js:97
    await rename(temporary, file);
  • 写入本地文件
    lib/registry.js:107
    await writeFile(file, content, 'utf8');
  • 删除本地文件
    lib/registry.js:112
    await rm(temporary, { force: true }).catch(() => undefined);
  • 读取本地文件
    lib/registry.js:124
    raw = await readFile(join(root, teamId, 'team.json'), 'utf8');
  • 读取本地文件
    lib/registry.js:141
    const entries = await readdir(root, { withFileTypes: true });
  • 写入本地文件
    lib/registry.js:161
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/events.js:36
    await appendFile(join(root, teamId, 'events.jsonl'), `${JSON.stringify(event)}\n`, 'utf8');
  • 读取本地文件
    lib/events.js:60
    raw = await readFile(join(root, teamId, 'events.jsonl'), 'utf8');
  • 写入本地文件
    lib/store.js:46
    await writeFile(temporary, content, { encoding: 'utf8', flag: 'wx' });
  • 删除本地文件
    lib/store.js:49
    await rm(temporary, { force: true }).catch(() => undefined);
  • 写入本地文件
    lib/store.js:54
    await rename(temporary, file);
  • 写入本地文件
    lib/store.js:64
    await writeFile(file, content, 'utf8');
  • 删除本地文件
    lib/store.js:69
    await rm(temporary, { force: true }).catch(() => undefined);
  • 读取本地文件
    lib/store.js:81
    raw = await readFile(taskFile(root, teamId, taskId), 'utf8');
  • 读取本地文件
    lib/store.js:108
    entries = await readdir(tasksDir(root, teamId), { withFileTypes: true });
  • 写入本地文件
    lib/store.js:154
    await mkdir(tasksDir(root, teamId), { recursive: true });
  • 删除本地文件
    lib/store.js:168
    await rm(taskFile(root, teamId, task.taskId), { force: true }).catch(() => undefined);
  • 删除本地文件递归
    lib/lifecycle.js:99
    await rm(join(root, team.teamId), { recursive: true, force: true });
  • 发起网络请求
    lib/client/DashboardPanel.js:120
    const response = await fetch(STATE_URL, { cache: 'no-store' });
  • 发起网络请求
    lib/client/DashboardPanel.js:149
    const response = await fetch(url, {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-presets@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-llm@deepseek-ai/dsh-persona@deepseek-ai/dsh-session@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 跨窗口任务派发
  • 实时查看团队进展
  • 网页仪表盘

DeepSeek Harness 的无领导扁平智能体团队:跨窗口结构化任务派发、记录器服务,外加网页仪表盘

README

由 DeepSeek 最新模型翻译生成
dsh-flat-teams DeepSeek Harness(DSH)扁平团队插件:让多个独立 Agent 窗口(顶层会话)组成无队长的扁平团队,跨窗口互派结构化任务,并由内置“记录员”服务实时记账,用户在任何成员窗口都能问出真实进展。 功能 - 扁平团队:team_create 建队(可预置成员规格,编程创建新成员窗口,继承当前工作区)、已有窗口 team_join 自注册、team_leave、team_roster 查花名册(成员/领域/在线状态)。没有队长,任何成员可直接互派任务。 - 结构化任务派发:task_dispatch 按成员名或负责领域(area)派活;任务状态机 pending → delivered → claimed → in_progress → completed | failed | cancelled(+timeout 终态),每次迁移换新 attemptId 并追加事件流。 - 三段式投递不丢任务:任务先落盘 + 写收件成员邮箱(/flat-teams//inbox/),再尽力实时唤醒(在线 followup / 离线冷恢复后 followup);唤醒失败任务停在 delivered 留邮箱。 - 记录员:纯服务,不占窗口、无管理权限;订阅事件流维护 progress.json(每任务状态与结果摘要、每成员在手任务与完成数、团队时间线)。
展开完整文档(README 剩余 1 节)
dsh-flat-teams

DeepSeek Harness(DSH)扁平团队插件:让多个独立 Agent 窗口(顶层会话)组成无队长的扁平团队,跨窗口互派结构化任务,并由内置“记录员”服务实时记账,用户在任何成员窗口都能问出真实进展。

功能

- 扁平团队:team_create 建队(可预置成员规格,编程创建新成员窗口,继承当前工作区)、已有窗口 team_join 自注册、team_leave、team_roster 查花名册(成员/领域/在线状态)。没有队长,任何成员可直接互派任务。
- 结构化任务派发:task_dispatch 按成员名或负责领域(area)派活;任务状态机 pending → delivered → claimed → in_progress → completed | failed | cancelled(+timeout 终态),每次迁移换新 attemptId 并追加事件流。
- 三段式投递不丢任务:任务先落盘 + 写收件成员邮箱(/flat-teams//inbox/),再尽力实时唤醒(在线 followup / 离线冷恢复后 followup);唤醒失败任务停在 delivered 留邮箱。
- 记录员:纯服务,不占窗口、无管理权限;订阅事件流维护 progress.json(每任务状态与结果摘要、每成员在手任务与完成数、团队时间线)。它只是事件流的缓存投影,可随时从 events.jsonl 完全重建。
- 用户查询:team_status 返回记录员的结构化进展;内置提示词协议教模型:派活要自包含、接活先认领、完工必须回传、问进展先查记录员不得编造。
- Web 看板:安装到 web profile 后,浏览器右上角出现“团队看板”浮层——主表(团队列表:成员数/在线数/进行中数/沉寂标记)→ 二级(花名册/任务看板/进展时间线)。看板提供用户专属管理操作:解散团队、踢出成员(均二次确认,经 POST /plugins/flat-teams/teams//disband|kick 端点;成员 agent 无此能力)。数据来自 GET /plugins/flat-teams/state(5s 轮询)。

安装

npm(推荐,预构建产物,免构建授权)
dsh plugin --profile add dsh-flat-teams

或 git 形式(lib/ 已入库,同样免构建授权)
dsh plugin --profile add github:whateverboy2333/dsh-flat-teams

本地路径(开发调试)
dsh plugin --profile add /absolute/path/to/dsh-flat-teams

安装后重启该 profile 生效。验证:

dsh --profile --dump-config # 组合树应出现 flat-teams 行(# == dsh-flat-teams 层)

卸载:dsh plugin --profile remove dsh-flat-teams。

适配版本

- DSH 0.1.0-rc.6(@deepseek-ai/* 全栈同通道;@deepseek-ai/cordis ^4.0.1)
- Node ^22.19 或 >=24
- 插件内置运行时版本守卫:运行在不匹配的 DSH 版本上会拒绝加载并打印响亮错误,而不是静默出错

工具速查

| 工具 | 作用 |
| team_create | 建队;可选 members 规格编程创建成员窗口(name/area/persona);当前窗口自动成为首个成员 |
| team_join / team_leave / team_roster | 自注册加入 / 退出 / 查花名册(含实时在线状态) |
| task_dispatch | 派任务:to 填成员名或 area(area 多候选会报错要求指明);任务落盘 + 邮箱 + 尽力唤醒 |
| task_claim / task_complete / task_fail | 接收方驱动状态:认领(delivered→claimed→in_progress)/ 完成回传 / 失败说明 |
| task_list / task_status / task_cancel | 任务查询(状态/成员过滤)/ 单任务详情 / 取消(仅派发方,支持 attemptId 世代校验) |
| team_status | 记录员结构化进展(任务状态与摘要、成员在手、团队时间线) |
| flat_teams_ping | 插件自检 |

权限全部代码强制:身份从调用方会话反查花名册,取消仅限派发方,认领/完成仅限指定接收成员。

使用示例(自然语言)

建队并招人:

帮我建一个扁平团队「官网改版」,成员加一个小测(负责测试)和阿文(负责文档)。

派活(无需记工具名):

让小测把登录页的边界用例补全,周五前要。

接活窗口会收到 [task from … #task-…] 消息,按提示词协议先认领、干完回传。

问进展(任何成员窗口):

项目现在进展如何?有没有任务卡住了?

Agent 会调 team_status 拿记录员数据后如实回答。

已知限制(MVP)

1. 仅同进程跨会话:所有成员窗口必须在同一个 DSH 进程内(同进程内跨工作区已支持——团队状态在 DSH_HOME 级全局共享);跨进程/跨机器留 v0.2(计划文件注册表传输)。
2. 跨重启成员窗口不自动复活:编程创建的成员窗口由插件 fiber 持有,插件卸载或进程退出即销毁;成员身份与任务数据在 /flat-teams/ 持久,但窗口本身需重新创建/加入。
3. 离线投递无自动重投:目标离线且冷恢复失败时任务留在邮箱(delivered 状态可查),但没有自动重投调度,需上线后再触达(v0.2 补)。
4. 取消不撤回已投递的 turn:task_cancel 只迁移状态机,已到接收方窗口的消息不会被撤回。
5. area 不强制独占:area 只做路由参考;同一 area 允许多个成员,此时派发必须按成员名明确指定。

另有:多进程同时写 /flat-teams/ 未做防护(MVP 声明限制,v0.2 解决)。
迁移说明(v0.1.0 内):早期内部版本(开源前)团队状态存于 /.flat-teams/,已声明作废——旧目录不自动迁移、不再读写,可手动删除。

状态目录

团队状态与工作区无关,存于 DSH_HOME 级(任何工作区的窗口都能加入同一团队):

/flat-teams//
├── team.json # 花名册(磁盘为真相源) ├── tasks/.json # 任务记录(状态机 + attemptId) ├── events.jsonl # 事件流(唯一事件真相源,可重放) ├── inbox/.jsonl # 投递邮箱(持久副本) └── progress.json # 记录员缓存投影(可由 events.jsonl 完全重建)

开发

pnpm install
pnpm build # tsc(host + client)→ tsdown → lib/

注:冒烟验证脚本(scripts/)未随仓库发布;pnpm verify 仅对持有完整开发副本的贡献者可用。

License

MIT
预览分享卡片长什么样 ↓whateverboy2333/dsh-flat-teams
分享 · DeepSeek Harness Hub
whateverboy2333/dsh-flat-teams

跨窗口派发任务并实时查看团队进展

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部