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

多智能体编排 TimYuann/orchestra-dsh

DeepSeek Harnessv0.6.1
TimYuann30 天前有提交已提供中文文档扫描:含敏感能力

orchestra — DSH 多智能体编排

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add orchestra-dsh
npm 源 · orchestra-dsh 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · market
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 30 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包orchestra-dsh @ 0.6.1
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 01:46:07

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 23 处,展示前 23 条)
  • 发起网络请求
    lib/client.js:36
    return fetch(STATE_URL, { cache: "no-store" }).then((res) => {
  • 读取本地文件
    lib/orchestra-topology.js:1499
    const info = await nodeStat(directory);
  • 读取本地文件
    lib/orchestra-topology.js:1502
    const entries = await readdir(directory, { withFileTypes: true });
  • 读取本地文件
    lib/orchestra-topology.js:1511
    read: () => (options.globalReadFile ?? ((path) => readFile(path, "utf8")))(join(directory, entry.name)),
  • 读取本地文件
    lib/orchestra-topology.js:1689
    await nodeStat(target);
  • 写入本地文件
    lib/orchestra-topology.js:1699
    await mkdir(root, { recursive: true });
  • 写入本地文件
    lib/orchestra-topology.js:1700
    await writeFile(target, JSON.stringify(topology, null, 2), "utf8");
  • 读取本地文件
    lib/orchestra-role-presets.js:686
    const info = await stat(path);
  • 读取本地文件
    lib/orchestra-role-presets.js:696
    return { path, trust: "user", source: "global", text: await readFile(path, "utf8") };
  • 写入本地文件
    lib/orchestra-role-presets.js:704
    await writeFile(path, text, { encoding: "utf8", flag: "wx" });
  • 写入本地文件
    lib/orchestra-role-presets.js:715
    await mkdir(directory, { recursive: true });
  • 读取本地文件
    lib/orchestra-role-presets.js:718
    const existing = await readFile(path, "utf8").catch(() => undefined);
  • 写入本地文件
    lib/orchestra-role-presets.js:724
    await writeFile(path, migrated, "utf8");
  • 读取本地文件
    lib/team-change-bus.js:112
    if (fs.existsSync(reportsDir)) {
  • 读取本地文件
    lib/team-change-bus.js:113
    initialReportFiles = new Set(fs.readdirSync(reportsDir));
  • 读取本地文件
    lib/team-change-bus.js:119
    if (fs.existsSync(reportsDir)) {
  • 读取本地文件
    lib/team-change-bus.js:120
    const currentFiles = fs.readdirSync(reportsDir);
  • 读取本地文件
    lib/orchestration-principles.js:7
    export const PRESET_AUTHORING_SKILL_CONTENT = readFileSync(new URL("../skills/orchestra-preset-authoring/SKILL.md", import.meta.url), "utf8");
  • 发起网络请求
    lib/client/index.js:6
    return fetch(STATE_URL, { cache: "no-store" }).then((res) => {
  • 读取本地文件
    lib/orchestra-preferences.js:139
    const text = await readFile(join(cwd, PREFERENCES_FILE_PATH), "utf8");
  • 读取本地文件
    lib/orchestra-preferences.js:169
    const text = await readFile(globalPath, "utf8");
  • 写入本地文件
    lib/orchestra-preferences.js:197
    await mkdir(dirname(targetPath), { recursive: true });
  • 写入本地文件
    lib/orchestra-preferences.js:198
    await writeFile(targetPath, content, "utf8");
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cordis-plugin-group@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/cordis-plugin-timer@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-preset@deepseek-ai/dsh-agent-preset-registry@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-atomic-write@deepseek-ai/dsh-attachment@deepseek-ai/dsh-client-ui-renderer
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
v0.6.12026-09-30
· orchestra-dsh v0.6.1 兼容 DSH 0.2.0-rc.2,并修复 A2A 会话后端的一个问题。 · 为什么 0.6.0 在当前 DSH 上装不上、也起不来 宿主侧的 bundle 校验(@deepseek-ai/dsh-app-boot)会拿运行中的 DSH 版本去比对 @deepseek-ai/dsh* 的 peer 范围,遇到精确锁定版本就直接拒绝。0.6.0 把 18 个 peer 精确锁在 0.1.7-alpha.1,于是在 0.2.0-rc.2 上: · dsh plugin add 拒绝安装(什么都没装上),而且 · 就算手动装 tgz,启动时也会被拦下——整个 bundle 层被跳过(跳过配置档 bundle「orchestra-dsh」),所以没有任何 A2A 工具注册成功。 0.6.1 改成声明范围:dsh-* 包用 >=0.1.7-alpha.1 <0.3.0,cordis 系列用 ^4.0.3 / ^1.0.8 / ^1.1.5 / ^1.0.4,另加 @deepseek-ai/cordis-plugin-group: ^1.0.4(角色预设里的 cordis:group 行需要它)。devDependencies 升到 0.2.0-rc.2。 · 已修复:a2a_create(execution="session") 在标准部署上失败 报错:published permission "custom" does not match blueprint "workspace-write" 每个新建会话在应用权限预设后都会被钉成 approval: never(D2-a),而宿主会从实时开关状态推导出实际生效的预设名——于是任何声明了 approval: ask 的预设(标准部署里的 read-only / workspace-write)都对应不上表项。轻量 blueprint 拿这个推导名去比选中的预设,而受管路径早就做了实际值的兼容处理。这次提交改为校验声明的开关(声明的 sandbox 加上钉住的 approval),并显式写入声明的 sandbox,因为宿主只在开关与部署默认值不同时才写入。 这个缺陷早就存在(不是 rc.2 引入的回归),是本轮实机验证时发现的。 · 验证 · tsc 干净(宿主 + 客户端);299/299 测试通过——新增 4 个回归测试,不打补丁时全红。 · npm pack:81 个文件,@deepseek-ai/* 从不进入 dependencies(只有 js-yaml)。 · 对 0.2.0-rc.2 做契约检查(npm 包 + 随包发布的 app bundle):所有导入符号、全部 15 个 ctx.get 服务、三个事件、SESSION_FORMAT_VERSION(两边都是 4)均未变;cordis 系列运行时 JS 在版本升级前后逐字节一致。 · 在隔离配置档里对 DSH 0.2.0-rc.2 实机验证:无头子代理往返(A2A-PONG)、无头会话往返(A2A-SESSION-PONG)、web 配置档在 4602 端口启动且 orchestra-dsh/client.js 出现在启动模块图里、GUI 驱动的会话往返(A2A-WEB-OK)。 · 本次发布范围 按要求只动 A2A。团队 / 交付层未改,仍是草案计划;重启后存活的角色身份和 Windows 本轮未验证。详情见 UPDATE-v0.6.1.md。
v0.5.02026-09-16
· orchestra-dsh v0.5.0 —— 精简通道协作与多角色编排 npm 上上一版是 0.3.0 —— 0.4.0 / 0.4.1 从未发布到 npm,所以 npm 用户直接跨到了 0.5.0。完整说明见 UPDATE-v0.5.0.md。 · 新增 · a2a_stop —— 取消目标会话正在运行的回合,并清空它待处理的收件箱(真正的 agent.cancel,即 Composer 的停止按钮) · a2a_list —— 按你的 cwd 和最近活动排序,支持查询关键词过滤、角色和相对 lastActivity · a2a_read —— 反向渐进披露:默认读最近 1–2 个回合,按需放宽 · orchestra_dispatch / orchestra_wait —— 把任务派发到通道;等待已提交的写入(或 20 分钟心跳),而不是轮询 · 用一句普通回复即可批准(启动 / 可以 / ok);/team approve @ 仍然可用 · 变更 · 插件记录从会话日志移到 /orchestra/ 文件(ADR-0002)。自定义会话事件类型会让整个日志在重启后无法读取;插件碰过的会话现在又能原生回放了。 · Orchestra 变成精简的通道引擎:节点之间直接通过 A2A 交接硬事实,一线循环最多 2 轮,驱动由报告唤醒,不再充当图书记员。 · 五个内置任务拓扑的协议块(循环 / 关卡 / 交接 / 收尾)保留为经过校验的声明式资产;v0.5 运行时不再把它们当状态机来驱动。 · 移除(破坏性) · 微状态机工具面 —— 16 个工具:orchestra_loop_start、orchestra_attempt_start、orchestra_verdict、orchestra_handoff、orchestra_gate_open、orchestra_gate_fallback、orchestra_graph、orchestra_graph_reconcile、orchestra_reconcile、orchestra_decision、orchestra_document、orchestra_charters、orchestra_close、orchestra_apply_amendment、orchestra_freeze、orchestra_spawn。 · 你自己的拓扑 / 预设 orchestraTools 列表里残留的旧工具名会被静默过滤,不再导致团队创建失败。 · 控制点不变:orchestra_create 仍然拒绝任何没有用户批准产生的 frozenRef 的调用。 · 验证 · 223/223 测试通过;类型检查和构建干净。 · 从干净目录重新消费了 tarball(注册 17 个工具:7 个 A2A + 10 个 orchestra),并在隔离的兼容配置档上冷启动 —— 组合行存在,orchestra-dsh/client.js 已声明并提供服务,带 settings.section 注册。 · 发布的 tarball 与验证过的本地产物逐字节一致(shasum 42ac1bb3,73 个文件)。 · 如实未运行清单和外部验收入口:UPDATE-v0.5.0.md §4/§5。 DSH 兼容性:0.1.5-rc.2 · 许可证:MIT
v0.3.02026-08-19
· orchestra-dsh v0.3.0 — 编排即协作章程 本次发布把 orchestra-dsh 从「角色模板」升级成完整的编排层:一次编排就是一份协作章程——谁做什么、每项决策归谁、活干完往哪送、有争议找谁、循环何时结束、由谁宣布团队完工。 · 亮点 · 🎼 编排 = 协作章程 · 拓扑 schema v0.1:controller + roles[](preset / sandbox / runtime / maxRounds / welcome)+ protocol.{ownership, routes, completion}。 · 对插件能证明的部分做硬校验(角色 id 唯一、ownership/routes 引用有效、sandbox 合法、runtime 参数成对、preset 可解析);自然语言约束留在角色提示词里——不做脆弱的文本解析,也不引入工作流引擎。 · 驱动引导升级:任何方案都必须通过六项完整性测试(可达性、权力唯一、产出有消费者、循环有出口、争议有去处、收尾只有一个负责人)。角色数量完全由任务决定。 · 📦 preset 系统(Bug #4 根因修复) · 内置行为包:orchestra-implementer、orchestra-reviewer、orchestra-oracle(人设 + 工具组合)。 · 内置拓扑:duo、trio、oracle,以及新增的 four-role-dev(实现 ⇄ 评审主循环 + 按需升级 oracle)。 · 插件首次运行时在 ~/.dsh/orchestra/ 播种(绝不覆盖用户内容);查找顺序:项目 .orchestra/ > 全局 > DSH 原生 > 内置。 · 🔄 团队生命周期与恢复 · team.json v1.1:teamId / status / controller / controllerHistory / topologyRef / mission / sessionHistory / reports;rounds → reportCount。 · orchestra_dismiss:不可变归档 + 状态清理 + 向在线角色发归档通知(角色会话保持存活)。 · orchestra_activate(archive_id):按角色分别 reused / resumed / replaced / failed,记录替换并附恢复包,controller 接管,部分失败时降级。 · orchestra_team 始终返回 {team, archives}。 · ✉️ 诚实的投递回执 · a2a_send / a2a_reply 返回 {message_id, target_session_id, accepted_at_ms, delivery_mode},取值为 live_inbox | durable_inbox | resumed_inbox。 · 不可靠的「排队即成功」假象已移除:真正冷的目标先恢复——恢复失败则调用失败。 · a2a_list 渐进披露:先列你的 cwd,归档默认折叠,支持 limit/offset,带 current_cwd_team 标注,轻量(无团队)模式下返回完整列表。 · 🐛 修复 · 冷投递可靠性(P0):恢复失败不丢待处理项,不再有内存队列承诺。 · 归档激活:已 dismiss 的快照能正确解析;orchestra_team schema 接受已填充的 report 列表。 · 内置 preset/拓扑播种现在对全局配置根绕过 workspace-write 围栏。 · /team 气泡:命令渲染为普通 /team 气泡,只向模型发一条折叠通知(不再有带方括号前缀的用户消息,也不再拆成多轮)。 · 兼容性 · 旧版 team.json / 归档 / 拓扑透明解析(归一化为 v1.1)。 · 纯 A2A 用户(无团队痕迹)不受 cwd 过滤影响。 · 旧版 /orchestra/topologies/ 位置不再读取——把自定义模板移到 .orchestra/topologies/。 · @deepseek-ai/* 仍只作 peerDependencies(由宿主提供;双重加载保护不变)。 · 验证 · 16 条单元断言(拓扑校验 / 团队归一化 / slug)+ 4 次无头 E2E 运行,覆盖完整生命周期(创建 → 报告 → dismiss → 激活)、恢复、团队 schema 和 a2a_list 契约——在 minimax-cn / MiniMax-M3 上全部通过。 · 见 scripts/test-v0.3.0.mjs。 完整设计规范:仓库内 repo
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
orchestra — DSH 多智能体编排 把 DSH 实例变成一支乐队:角色默认使用平级完整会话,适合的任务也可显式选择原生 continuable 子代理。 Turn your DSH instance into an orchestra: roles use first-class sessions by default, with native continuable subagents available for compatible tasks. orchestra-dsh 是 DeepSeek Harness(DSH)的多智能体编排插件。一个 driver 会话带着团队朝目标推进,角色各自拥有独立上下文(默认是平级会话,显式选择时用原生子代理),整轮运行——从 onboarding 到 review 再到 archiving——都靠对话协调。它分两层交付:一层是 A2A transport,负责任意会话之间的点对点消息传递;另一层是编排层,负责项目范围内的团队、角色与拓扑。 Why — the idea(设计理念) 编排 = 协作宪章(orchestration is a collaboration charter),不是固定流水线。
展开完整文档(README 剩余 1 节)
orchestra — DSH 多智能体编排

把 DSH 实例变成一支乐队:角色默认使用平级完整会话,适合的任务也可显式选择原生 continuable 子代理。
Turn your DSH instance into an orchestra: roles use first-class sessions by default, with native continuable subagents available for compatible tasks.

orchestra-dsh 是 DeepSeek Harness(DSH)的多智能体编排插件。一个 driver 会话带着团队朝目标推进,角色各自拥有独立上下文(默认是平级会话,显式选择时用原生子代理),整轮运行——从 onboarding 到 review 再到 archiving——都靠对话协调。它分两层交付:一层是 A2A transport,负责任意会话之间的点对点消息传递;另一层是编排层,负责项目范围内的团队、角色与拓扑。

Why — the idea(设计理念)

编排 = 协作宪章(orchestration is a collaboration charter),不是固定流水线。创建任何团队之前,宪章必须先回答七个问题:

1. 谁做什么;
2. 每个决策归谁(每个决策只有一个最终负责人);
3. 工作完成后交到哪里;
4. 交接必须带上什么;
5. 争议去哪里解决;
6. 循环何时结束;
7. 谁宣布团队完工。

driver 针对你的目标提出一份宪章,你批准之后,角色才会创建。插件只校验它能证明的部分(角色存在、归属引用能解析、每个目录只有一个团队),其余交给角色自律——不做脆弱的文本解析,也不上工作流引擎。

传统智能体用 plan mode:在同一个上下文里切换模式——计划和执行搅在一起,上下文越滚越大。Orchestra 用 A2A 取而代之:

- 讨论即计划(Discussion is the plan)——和一个思考型角色(比如 oracle)在交互式 a2a 对话里把难题聊透。每条消息都可观察、可回放。
- 计划即任务(The plan is the task)——讨论收敛后,结论原样作为自包含任务发给执行者。
- 计划与执行彻底分离(Plan and execution contexts stay separate)。

Quick start(快速开始)

环境要求:DSH(DeepSeek Harness),Node ≥ 22。v0.6.1 支持 DSH >=0.1.7-alpha.1 <0.3.0(这是声明的 peer 范围;已在 0.1.7-alpha.1 和 0.2.0-rc.2 上做过端到端验证)。精确锁定版本会被宿主的 bundle 兼容性检查拒掉,所以这里故意用范围——见 0.6.1 发布说明。可选的宿主投递层目前仍是一份 v2 实现计划,尚未交付。
检查点(2026-09-30,v0.6.1): 类型检查干净,295/295 项维护测试通过,npm pack 各道关卡全绿,A2A 路径已在 DSH 0.2.0-rc.2 上实测跑通(在隔离的无头配置档里完成 a2a_create → a2a_read 往返;web 配置档 4602 能带着插件启动,其客户端 bundle 也在启动模块图里)。本轮尚未验证的部分:团队/交付层(本轮明确不在范围内)、重启后仍存活的角色身份,以及在没有预设注册表的无头配置档下执行 a2a_create(execution="session")。交付层 v2 文档仍是草稿,记录了九个阻塞项;图循环/关卡仍是声明。

1. 从 npm 安装,在你的 DSH 配置档目录里操作(先 cd ~/.dsh/profiles/<your-profile>):

| 包管理器 | 命令 | 说明 |
| npm(推荐) | npm install orchestra-dsh | npm ≥7 会自动安装 peer 依赖 —— 改用 npm install --legacy-peer-deps orchestra-dsh;不要指望 pnpm 的 auto-install-peers 设置来配置 npm。 |
| pnpm | pnpm add orchestra-dsh | 如果紧跟发版之后安装(24 小时 minimumReleaseAge 策略),把 orchestra-dsh@<version> 加进 pnpm-workspace.yaml → minimumReleaseAgeExclude。 |
| yarn | yarn add orchestra-dsh | Yarn 会自动安装 peer 依赖 —— 安装后跑一遍下面的安全检查。 |
| bun | bun add orchestra-dsh | Bun 会自动安装 peer 依赖 —— 安装后跑一遍下面的安全检查。 |

安全检查(所有包管理器) —— 本插件的 @deepseek-ai/ 是 peerDependencies,由 DSH 宿主提供。如果你的包管理器自己装了一份副本,插件会重复加载,每次工具调用都会崩:

ls node_modules | grep '^@deepseek-ai' # expect no output (a .dup-bak leftover is fine)

如果出现了核心副本,先停下来查清它们的解析路径,再动手改任何东西;不要删掉整个 scope,里面可能有无关的包。关键检查点是:插件和宿主解析到的 DSH 核心服务必须指向同一份安装。只装 npm 依赖并不会选中 bundle:要通过 DSH 的 bundle/插件管理器启用它,并确认已激活。

2. 重启 DSH,打开新会话。

Use it(用法)

直接说就行 —— 用自然语言,或者 /team 斜杠命令:

/team 在当前工作目录实现一个 TypeScript 工具库 + 单测 + README

driver 会跑引导协议(目标 → 约束 → 上下文 → 拓扑提案 → 你批准 → 执行),给出协作方案,只有你批准之后,它才会创建角色会话并派发自包含任务。这道关卡没有捷径:orchestra_create 需要 frozenRef,而只有你批准草稿才会生成它 —— 只给目标和模板去调用,按设计会返回 approval_required。批准方式就是用大白话回一句(启动 / 可以 / ok);/team approve <draftId>@<revision> 也行,但从来不是必须的。
先定规模:driver 可以直接干活,也可以委派一个有边界的原生子进程,或者先用彼此独立的会话,等确有需要再引入共享团队。新任务可以变成当前团队的新泳道,复用已有的合适成员。新的角色组合由可发现的 orchestra-preset-authoring 手册指导;在 DSH 0.1.7 上不需要做 preset-root 初始化。

轻量模式:一次性的协作根本不需要团队——A2A 工具(a2a_list / a2a_create / a2a_send / a2a_reply / a2a_read / a2a_stop / a2a_status)可以在主机上任意会话之间独立使用。

Core concepts(核心概念)

四类对象彼此独立;各自拥有自己的事实,其他对象只引用它们:

| 概念 | 是什么 | 存在哪里 |
| Topology(拓扑) | 某一类团队如何协作:角色、归属、路由、完成条件。一个可以实例化的模板。 | .orchestra/topologies/<id>.json(项目) · ~/.dsh/orchestra/topologies/(全局) · 内置 |
| Preset(预设) | 某个角色如何行事:人设、工具、纪律。拓扑通过 preset id 引用它。 | .orchestra/presets/<id>/(项目) · ~/.dsh/orchestra/presets/(全局) · 内置 |
| Mission(任务) | 这个团队要做什么:目标、范围、约束、验收标准。 | 传给 orchestra_create |
| Runtime State(运行时状态) | 这个团队已经做了什么:会话、报告、生命周期。 | orchestra/state/team.json + orchestra/archive/ |

目录约定:项目级 .orchestra/ 优先于全局 ~/.dsh/orchestra/,后者优先于内置。插件首次运行时,会把内置预设和拓扑写入全局根目录(用户改动永远不会被覆盖)。运行时状态位于 <cwd>/orchestra/ 下(state / reports / archive),按工作目录区分。

Built-in topologies(内置模板)

v0.3 legacy templates(继续可读,不静默替换):

| 模板 | 生成的角色 | 用途 |
| duo | reviewer(只读) | 最小闭环:driver + 有针对性的两轮评审。 |
| trio | implementer + reviewer(只读) | 面向正经开发任务的实现–评审闭环。 |
| oracle | oracle(只读) | 深度讨论伙伴:对话 → 把结论变成任务。 |
| four-role-dev | implementer + reviewer + oracle(reviewer/oracle 只读) | 实现 ⇄ 评审主循环,外加一条按需升级的 oracle 通道。 |

v0.4 task topologies(schemaVersion 1;protocol 里的 typed handoffs / bounded Loop / Human Gate / single Closure owner 在 v0.5 中保留为声明式资产——校验器仍然检查、角色 welcome 仍然携带,但运行时不再用状态机工具去驱动它们):

| 模板 | 生成的角色 | 用途 |
| feature-development | implementer + verifier + reviewer(verifier/reviewer 只读) | 已批准的任务 → 有边界、经过测试、经过评审的代码交付。Loop implementation-review(最多 2 次尝试),gate feature-closure-approval。 |
| bug-diagnosis-and-fix | investigator + implementer + verifier + reviewer(除 implementer 外均为只读) | 先复现 + 定位根因,再做最小修复并附回归证据。循环 diagnosis-fix-review,门禁 bug-fix-acceptance。 |
| architecture-decision | researcher + architect + reviewer(全部只读) | 给出有证据支撑的决策简报,并让用户直接选择。循环 decision-validation,门禁 architecture-decision-approval(reviewer PASS ≠ 用户批准)。 |
| refactor-and-migration | architect + implementer + verifier + reviewer | 按声明的切片做行为基线迁移,并附回滚证据。循环 migration-validation,门禁 migration-compatibility-approval。 |
| audit-and-hardening | hardening-auditor + investigator + implementer + verifier + reviewer | 有边界的安全审计 → 最小修复 → 复扫证据。循环 hardening-remediation,门禁 security-risk-acceptance(缺少复扫不能 PASS)。 |

每个模板都带一个 protocol 块:ownership(每项决策归谁)、routes(默认消息流向)、completion(谁宣布团队完成),外加 v0.4 的 loops / gates / handoffs / closure 声明。validator 会检查引用,但当前 lazy-dispatch 路径不会带上完整的 protocol 开场消息。这些声明并不能证明运行时真的会约束 payload、尝试次数、门禁或 closure。九个 v0.4 角色预设(orchestra-v04--v1,含 planner 和 oracle)都是完整可挂载的组合(persona + tools + agent-instructions),不是只有 persona 的文本。

编排在设计上就是灵活的:driver 可以挑任意数量的角色(3 个或 10 个)——它必须定义 routes 和 ownership,但阵容取决于任务。角色名与某个模板角色相同时,会继承该模板的 sandbox 和 preset。还可以提议新角色,并通过 orchestra_add_lanes 加入正在运行的团队(plan → 用户同意 → confirm:true)。新增的席位记录在 team.addedLanes,不算对原始 charter 的修订。orchestra_spawn 已不存在。

Tools(工具一览)

A2A transport(独立使用,不需要团队):a2a_list(先列你的 cwd,按最近活动排序,query 关键词过滤,archived 折叠,role + 相对 lastActivity)· a2a_create(开启一个轻量协作者;execution: "session" | "subagent")· a2a_send / a2a_reply(投递回执:live_inbox / durable_inbox / resumed_inbox —— accepted ≠ processed)· a2a_read(反向渐进披露:默认只读最近 1–2 轮,按需放宽)· a2a_stop(取消目标正在运行的轮次,并清空它待处理的 inbox —— 相当于 Composer 的 Stop 按钮)· a2a_status(只报告有对应 Session 事件真正证明的生命周期事实)。
Orchestra 泳道: orchestra_draft(只追加的计划草稿;按角色渲染的蓝图预览以 Markdown 表格呈现;inlineTopology 让 driver 从角色预设 COMPOSE 出图,而不是借用现成的一张)· 你的批准(一句简单的 yes —— 启动 / 可以 / ok —— 记录到最近一次展示给你的那个草稿修订版上;只有真正的用户发言才算数,/team approve <draftId>@<revision> 也可以)· orchestra_create(预留已批准的计划;需要批准产出的 frozenRef,且不创建任何会话)· orchestra_dispatch(把任务派发到某条泳道;角色的会话在第一次派发时才实体化,实体化失败会报出角色及其固定模型,并回退到 reserved,让下一次派发重试)· orchestra_add_lanes(把新目标嫁接到 RUNNING 状态的团队上,作为另一条泳道 —— 先出计划,用户同意后再 confirm: true;每个目录一个团队依然成立)· orchestra_report(托管写入通道 —— 只读角色唯一能做的持久写入)· orchestra_send(按 teamId+roleId 派发给受治理的角色)· orchestra_team(目标看板:角色会话、存活状态、报告数量、最近报告路径、批准后新增的泳道)· orchestra_dismiss / orchestra_activate(归档与复活)· orchestra_topologies(项目/全局/内置目录,附带角色库)· orchestra_wait(仅用于无头/脚本循环 —— 交互式 driver 直接结束自己的回合,由角色的回复唤醒)。

v0.5 移除 —— 微型状态机接口: orchestra_loop_start、orchestra_attempt_start、orchestra_verdict、orchestra_handoff、orchestra_gate_open、orchestra_gate_fallback、orchestra_graph、orchestra_graph_reconcile、orchestra_reconcile、orchestra_decision、orchestra_document、orchestra_charters、orchestra_close、orchestra_apply_amendment、orchestra_freeze、orchestra_spawn —— 共 16 个工具,外加 orchestra_create 里那次一次性全名单校验,规范那份 17 项瘦身清单也点了它的名。driver 不再是图管理员:节点之间直接通过 A2A 交接硬事实,两轮上限是角色纪律,而不是宿主强制的上限,报告会尝试唤醒 driver,不再要求轮询。orchestra_create 拒绝任何没有批准产出的 frozenRef 的调用,所以控制点没有变化。

设置标签页: DSH 设置面板里的「orchestra」页面展示模板(带协议)和团队实例(带 mission/status/archives)。

Team lifecycle(团队生命周期)

none ─[orchestra_create]→ active ─[orchestra_dismiss]→ archived ─[orchestra_activate]→ active
- dismiss 请求取消/排空,尝试发出退役通知,在 orchestra/archive/ 下写入不可变快照,并用归档标记替换活动状态。持久化的角色会话会保留;这不代表它们的轮次会继续运行。停止失败和成功结果 schema 不匹配仍是已知缺陷。
- activate 从归档 id 恢复团队:活跃会话直接复用,持久化的会话恢复运行,权威缺失的会话被替换(记录到 sessionHistory,并发放恢复包);部分失败时团队进入 degraded,而不是假装成功。
- 每个工作目录只能有一个活动团队。

Development(开发)

npm run typecheck && npm run build # host tsc + client tsc + tsdown → lib/
scripts/dev-instance.sh # dev instance on :4600

开发实例几秒内即可重启,且绝不碰主实例。端口 4600 和 dev 配置档与另一个项目的设置共用:该配置档除了本插件,还带着那个项目的 bundle,所以同步新构建时绝不要清理它的 bundle 列表或依赖。本地交接文件(AGENTS.md、STATE.md、DSH-INTEGRATION.md)、会话日志和运行时状态按仓库忽略规则留在 Git 之外。docs/ 下部分设计和评审文档纳入版本跟踪;它们不包含在 npm 包里。

Roadmap(路线图)

- v0.5.0 ✅(2026-09-16) — lean-lane 重构。16 个微状态机工具没了:driver 不再扮演图管理员,节点之间直接交接硬事实,前线循环最多 2 轮,driver 由角色自己的回复唤醒(响应式收件箱),不再轮询 —— orchestra_wait 现在只是无头专用工具,因为为了心跳阻塞 driver 的轮次,正是角色回复排成「待处理消息」的原因。插件记录从 Session 日志迁到 <cwd>/orchestra/ 文件(ADR-0002)—— 自定义 Session 事件类型让整个日志重读时无法阅读,所以这次迁移才让插件接触的每个会话重新可以原生回放。A2A 新增 a2a_stop(真正的 agent.cancel())、按活动排序并支持关键词搜索的 a2a_list,以及反向窗口的 a2a_read。审批就是普通用户回复(ADR-0006)。222/222 测试全绿;完整生命周期(draft → approval → team → implement → review FAIL → targeted fix → review PASS → dismiss)已在 :4600 的真实开发实例上跑通。
- v0.4.1 ✅(2026-09-12) — 兼容 DSH 0.1.5-rc.2。依赖从 0.1.0-rc.6 升级(20 处宿主类型错误,全是机械性改动),另有一处类型检查器看不出来的运行时回归:DSH 0.1.5 把槽位注册改成了声明式门控,所以客户端插件必须用 ctx.slots.inject("settings.section", () => ctx.slots.register(...)) —— 裸调 register() 会让整个插件加载失败。142/142 测试通过;在真实开发实例上做了端到端验证(设置面板能渲染拓扑目录;实时会话能成功调用 orchestra_topologies)。
- v0.4.0 ✅(2026-08-25 主线闭环) — 活的编排文档(章程草案 → /team approve → 冻结 → 修订)、有界图运行时(循环/尝试/裁决/门控/闭包,带类型的交接,上限耗尽)、事务式供给、七个 v0.4 角色预设、五种任务拓扑、会话标题三段式方案、驱动节点里程碑通知、提案蓝图表格、恢复加固(归档校验、三分支激活、控制器接管)。本地验证:18 个测试文件 / 142 个测试通过。真实全流程端到端没有由开发团队跑过 —— 外部验证清单见 UPDATE-v0.4.0.md。
- v0.5.1 ✅(2026-09-19) — 自适应团队与诚实的失败路径。团队现在是动态的:orchestra_add_lanes 把新目标作为另一条泳道嫁接到运行中的图上(计划 → 一次用户确认 → 应用),于是一个目录始终只有一个团队、一个闭包负责人,同时又不限制它能承载多少工作。对已有活跃团队的目录执行 /team,总会说明现状并给出唯一一个二选一(继续旧目标,或归档旧目标再开新目标)—— force-archive 这条逃生通道按设计已移除。orchestra_create 变成只做预留:角色在首次派发前只是席位,物化失败时会报告角色、失败原因以及章程钉定的模型,然后把角色退回 reserved,下次派发重建它,而不是投递到一个从未存在过的会话里。模型路由不再回退到内置阶梯:偏好文件只在存在时才读取,否则用部署自身的默认模型。两个角色加入库(planner、orchestra-v04-oracle-v1),阶段/泳道引用会做交叉校验。文档和工具描述已与代码重新同步(v0.5.0 评审里「文档教人用一个已经不存在的工具」这类缺陷又出现了)。
- 0.8.0 — 已规划,未发布:批次 2 加入宿主采集的证据、冻结候选、worktree/租约、合并 CAS 和决策记录;批次 3 加入恢复胶囊、治理和可观测性。2026-09-22 评审指出了前置生命周期和设计上的修正。跨 worktree 的仓库级团队身份是目标,不是当前行为。
- UI 候选(不属于当前交付承诺)——侧边栏实时拓扑图与 GUI 操控;当前设置页仅供展示。
- 后续——product-or-ui-design / frontend-designer / documenter 拓扑(目录中标记为 Deferred)。

Coexistence(与官方 Agent Teams 共存)

DSH 提供一个可选启用的实验性 Agent Teams 分组(@deepseek-ai/dsh-experimental-agent-team 及其同组包)。Orchestra 不使用它,也不依赖它(实验性包在该分组之外无法作为依赖安装),并且没有占用该分组的任何工具名——send_message、list_agents、interrupt_agent、spawn_teammate、wait_agent、team_task_。Orchestra 自己的工具都带 orchestra_ / a2a_ 命名空间,所以两者可以同时挂载。

License

MIT © 2026 TimYuann. DeepSeek Harness(DSH)是独立项目;其许可协议请见该项目自身说明。
预览分享卡片长什么样 ↓TimYuann/orchestra-dsh
分享 · DeepSeek Harness Hub
TimYuann/orchestra-dsh

orchestra — DSH 多智能体编排

这是你的仓库?认领条目

回到顶部