Mission Control · 任务驾驶舱
DeepSeek Harness 的 Agent Teams 插件:任务级人数上限、上下文哨兵自动交接、驾驶舱广播、蜂巢模式开关,以及一个实时进度悬浮窗。
Mission Control 让一个 Lead 会话把多个工蜂组织成一场「任务(Mission)」:会话头部一键开启蜂巢模式并锁定人数上限,运行中持续测量每个工蜂的上下文压力并在将满时自动换人续接,人类在会话里说的话立即扇出给全体成员,所有进度集中显示在每个主会话独立、可拖动、可折叠的悬浮窗里;结束时自动收集结果文件、归档子会话并提示 Lead 汇总。所有检测都在 Host 侧完成,不消耗任何会话的模型 token。
功能特性
四个工具
| 工具 | 作用 |
|---|---|
mission_start |
在本会话声明一个任务,记录任务目标与并发工蜂上限 workers;之后才允许 spawn_teammate,超出上限的创建请求会被直接拒绝。 |
mission_report |
工蜂自报工作概括:current(此刻在做什么)与 completed(刚做完什么),每行一句短中文,驾驶舱面板据此显示人话进度。 |
mission_status |
只读地读取任务实时状态:每个工蜂的运行状态、上下文 token 占窗口比例、当前承担的任务。 |
mission_stop |
结束本会话上的任务:清除人数上限并停止上下文哨兵。 |
也可以不用
mission_start:会话头部的「蜂巢模式开关」会按defaultCap建一个占位任务(目标为「等待任务…」,待 Lead 说明后再分配)。
支撑机制
人数上限守卫(Workers Cap)
mission_start(或头部开关)用workers设定硬上限;ctx.tools.guard在每次spawn_teammate前检查当前任务中处于running/provisioning的成员数,超限即拒绝,避免任务失控复制会话。上下文哨兵与自动交接(Context Sentinel & Handoff) 哨兵按
pollIntervalMs定时用tokenMeter测量每个工蜂的上下文占用(分母取会话的contextWindow,取不到时退回fallbackContextWindow)。比例达到handoffRatio时:- 中断该成员;
- 生成一份交接摘要(任务目标、任务板现状、前任最近 4 条进展记录、续任职责);
- 以
fresh上下文新建续任者<name>-rN,接手原成员未完成的工作。
驾驶舱广播(Cockpit Broadcast) 任务进行中,人类在本会话发出的
user/message会被立即包装成[驾驶舱广播] ...扇出给当前任务的全部工蜂,不必等 Lead 跑一轮模型再转述。暂停时不下发,但子会话仍继续工作。蜂巢模式开关与子会话管理(Hive Mode) 会话头部注入一个开关(
普通 / 蜂巢 / 已暂停)+ 人数上限选择(2–10)+ 「子会话」管理弹窗:- 开启:建任务(或恢复暂停),主会话消息开始下发;
- 关闭(暂停):子会话继续工作,但主会话消息不再下发给子会话;
- 「子会话」弹窗:列出该会话下所有子会话(名称、状态、描述),勾选后停止并归档(从侧边栏移除),可选删除其日志。
实时进度悬浮窗(Dashboard)
dashboard.js在 Web 客户端注入悬浮层(shell.overlay),每 2 秒轮询/mission-dashboard-v2.json,每个主会话渲染一个独立悬浮窗:- 可拖动、可折叠,位置与折叠状态按会话分别保存在
localStorage,多窗口默认错开不重叠; - 标题显示会话标题(来自
sessionTitle服务,取不到则回退「会话 <id 尾号>」); - 显示工蜂状态徽标、上下文占用进度条(绿 → 黄 → 红)、当前任务、已完成任务、产出文件、暂停状态;
- 「结束任务」按钮会先确认,再
POST /mission-end-v1执行完整收尾;结束后弹出可拖动、可关闭的结束提示卡片,15 秒后自动消失。
另外,任务进行中会通过
systemPrompt.section注入一段「工作汇报」引导,促使工蜂主动调用mission_report;没有任务时不注入任何内容。- 可拖动、可折叠,位置与折叠状态按会话分别保存在
结束任务(完整收尾)
点击「结束任务」或调用 /mission-end-v1 后,插件会依次:
- 中断该会话下所有子会话(不只本任务创建的成员);
- 只清理
cleanupGlobs匹配的临时文件与cleanupDirs目录(结果文件不动); - 归档(关闭)所有子会话,让侧边栏不再堆积历史工蜂;若
deleteSessionLogs: true则同时删除其日志文件; - 收集本次任务产出的结果文件:从各成员
write/edit工具调用的参数里提取路径,再兜底扫描任务开始后修改过的文件; - 向 Lead 会话投递一条「【蜂巢任务已结束】」提示,要求 Lead 输出最终结果汇总并
present交付物。
安装与启用
本插件以 profile 本地链接(link) 方式安装,不依赖 npm 发包。它强依赖 DSH 实验性智能体团队插件,安装前需先准备好该依赖。
前置依赖
本插件在 package.json 的 peerDependencies 中声明了:
@deepseek-ai/dsh-experimental-agent-team(提供agentTeams服务,必需)@deepseek-ai/cordis(DSH 宿主底座)
由于采用 link: 安装时包管理器不会自动补装 peer 依赖,请显式把聚合包 @deepseek-ai/dsh-experimental-agent-team-profile(内含核心 + 工具 + 客户端 UI)加入 profile 的 dependencies 与 bundles。
步骤
克隆仓库到本地:
git clone https://github.com/Psychologist-jpg/dsh_mission-control.git在 DSH profile 的
package.json(通常位于~/.dsh/profiles/<profile>/package.json)里加入依赖与 bundle:{ "dependencies": { "@deepseek-ai/dsh-experimental-agent-team-profile": "0.2.2-rc.1", "@local/mission-control": "link:C:/path/to/mission-control" }, "dsh": { "profile": { "bundles": [ // ... 其他官方 bundle "@deepseek-ai/dsh-experimental-agent-team-profile", "@local/mission-control" ] } } }让 profile 重新安装依赖(
pnpm install或由 DSH 桌面端触发)并重载客户端。启动新会话后,会话头部出现蜂巢模式开关,页面右下角出现「蜂巢任务」悬浮窗,
mission_start/mission_report/mission_status/mission_stop四个工具也在工具列表中。
依赖 Agent Teams:本插件读取
agentTeams(由@deepseek-ai/dsh-experimental-agent-team提供)、agents、sessions、tokenMeter、systemPrompt、webServer、workingDirectory、workspaceRegistry、sessionController等服务;若你的 profile 已由其他 bundle 提供同名服务,可省略上面的 profile 聚合包,但必须保证agentTeams服务可用。
配置
插件通过 bundle patch 声明并在激活时传入配置,默认配置见 cordis.patch.yml 与 index.js 顶部的 DEFAULT_CONFIG:
| 配置项 | 默认值 | 说明 |
|---|---|---|
pollIntervalMs |
15000 |
上下文哨兵轮询间隔(毫秒,最小钳制到 2000)。 |
warnRatio |
0.65 |
预警阈值,用于 mission_start 返回文案中的提示。 |
handoffRatio |
0.85 |
触发自动交接的上下文占用比例。 |
defaultCap |
3 |
默认人数上限(头部开关建任务时使用;mission_start 以显式 workers 为准)。 |
fallbackContextWindow |
131072 |
拿不到真实上下文窗口大小时使用的分母。 |
freshProvider |
"spawn" |
交接时创建续任者使用的 provider 参数。 |
deleteSessionLogs |
false |
结束任务 / 删除子会话时是否物理删除其日志文件(默认仅归档,不删记录)。 |
cleanupGlobs |
*.tmp、*.temp、*.log、*.bak、*.orig、*.rej、*.swp、*.swo、*~、.DS_Store、Thumbs.db |
「结束任务」时删除的临时文件模式(仅按文件名匹配)。 |
cleanupDirs |
[".mission-control/tmp"] |
「结束任务」时整个删除的临时目录(相对工作目录)。 |
cleanupMaxFiles |
500 |
单次清理删除文件数的上限。 |
示例:
- insert:
- id: mission-control
name: '@local/mission-control'
config:
pollIntervalMs: 15000
warnRatio: 0.65
handoffRatio: 0.85
defaultCap: 3
freshProvider: spawn
deleteSessionLogs: false
HTTP 接口
插件通过 webServer 注册以下端点,均不消耗模型 token:
| 方法与路径 | 用途 |
|---|---|
GET /mission-dashboard-v2.json |
驾驶舱快照:任务目标、人数上限、暂停状态、每个工蜂的状态 / token / 窗口 / 占用比例 / 工作概括,以及任务板的 pending / in_progress / completed 计数。 |
POST /mission-end-v1 |
结束任务:中断所有子会话、归档、收集结果文件、清理临时文件,并提示 Lead 汇总。请求体可选 { "sessionId": "...", "cleanup": true };不传 sessionId 时结束全部任务。响应含 interrupted、cleanup、resultFiles、closed、leadNotified 等字段。 |
POST /mission-mode-v1 |
蜂巢模式开关:{ "sessionId": "...", "enabled": true, "workers": 3 }。开启时按需建任务或恢复暂停;关闭时暂停(子会话继续工作,广播停止);workers 被钳制到 2–10。 |
GET /mission-children-v1?sessionId=... |
列出该会话下的所有子会话(id / 名称 / 状态 / 描述),供界面勾选删除。 |
POST /mission-delete-v1 |
删除指定子会话:{ "sessionId": "...", "childIds": [...], "deleteLogs": false },执行停止 → 归档 →(可选)删日志。 |
目录结构
mission-control/
├── index.js # Host 侧插件:工具注册、人数守卫、上下文哨兵、广播、蜂巢模式、HTTP 路由、结果收集与清理
├── dashboard.js # Web 客户端:会话头部蜂巢开关 + 子会话管理弹窗 + 悬浮窗(DSH ModuleLoader + React)
├── cordis.patch.yml # 插件 bundle patch(插入插件并给出默认配置)
├── locale/
│ ├── en.json # 英文标题与描述
│ └── zh.json # 中文标题与描述
├── icon.svg # 插件图标
└── package.json # 包元数据(含 peerDependencies 强依赖声明)与 dsh.bundle / dsh.client 声明
使用流程
- Lead 开启会话头部的蜂巢模式开关(或调用
mission_start),给出任务目标与并发工蜂上限。 - 用
spawn_teammate创建工蜂;超过上限会被拒绝。 - 工蜂在共享任务板上创建 / 认领任务,并随时用
mission_report汇报进度。 - Lead 与人类可随时查看悬浮窗或调用
mission_status;需要让子会话安静但继续工作时,可切换为「已暂停」。 - 工蜂上下文将满时,哨兵自动中断并创建
<name>-rN续任者,继承结构化摘要继续工作。 - 结束时调用
mission_stop,或在悬浮窗点击「结束任务」执行完整收尾(停子会话 + 归档 + 收集结果文件 + 清理临时文件),随后按提示向用户汇总并present交付物。
注意事项
- 清理有边界:「结束任务」只会删除
cleanupGlobs匹配的文件与cleanupDirs指定的目录,且永远跳过node_modules与.git;但如果你把cleanupGlobs配得过宽,仍可能误删工作文件,请谨慎配置。 - 日志删除默认关闭:
deleteSessionLogs默认false,结束 / 删除子会话时只归档、不删日志;如需物理删除,显式设为true。 - 暂停语义:暂停只停止「主会话 → 子会话」的消息下发,子会话本身继续运行,哨兵仍会监控并交接。
- 续任者命名:交接产生的续任者形如
team-name-r1、team-name-r2,任务板上原有的归属不会自动迁移,续任者需自行认领未完成任务。 - 界面文案:悬浮窗与开关目前以中文展示状态与字段。
- 隐私:插件只读取 Host 侧会话元数据(事件类型、token 计数、任务板内容、工具调用参数中的路径),不会把会话正文发送到外部。
No comments yet. Be the first to write one.