dsh-subagent-panel
Verified@brucecheung666/dsh-subagent-panel · v0.1.3 · MIT · Web UI
DeepSeek Harness 插件:对话区左侧可收起的子 Agent 面板,只整合当前会话的 subagent 谱系(根会话/自己/子 agent)。
Install
dsh plugin add @brucecheung666/dsh-subagent-panel Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-subagent-panel
DeepSeek Harness(DSH)插件:对话区左侧可收起的子 Agent 面板。只整合当前会话的 subagent 谱系(根会话 / 自己 / 子 agent),点击切换会话;附带会话状态点、后台任务徽标 和只读团队任务区。
本仓库就是一个可安装的 DSH bundle(package.json 的 dsh.bundle.patch +
dsh.client 双端声明),不需要构建步骤。
兼容性
- 在 DeepSeek Harness 0.2.1-rc.3(Web / Desktop)上开发与验证。
engines.dsh: >=0.2.0-0 <0.3.0-0:DSH 安装器会在启用前检查这个范围,运行时版本 不满足会拒绝安装/启用(详见 DSH 的 plugin compatibility 检查)。这表示接受整个 0.2.x 系列(含 0.2.x 的 RC 预发布,如 0.2.1-rc.3),但拒绝 0.3.0 及其预发布。 两端都带-0是 semver 的写法:不带-0时>=0.2.0会排除 0.2.0 的 RC,<0.3.0又会把0.3.0-rc.*算进来。- 纯 ESM JavaScript,无构建、无运行时依赖;React 由 DSH 客户端在运行时提供。
- 依赖的 Client 服务与宿主锚点列在 工作原理与数据契约, 上游改版时需要复核。
功能
- 会话谱系列表:列表锚定在当前会话所在 subagent 链的最顶层根会话,
行 = 根 + 它的 subagent 子树(递归,子女按
updatedAt新到旧)。 当前会话只靠高亮和「当前」chip 区分;点开某个子会话只移动高亮,不把列表根换成它, 兄弟 subagent 不会消失。fork不参与整合:不挂在来源会话下,来源会话也不作为 祖先出现。 - 会话状态点:读
ctx.uiSession.sessionStatus,按「等你处理 > 运行中 > 新完成未看 > 无标记」取一档。颜色对齐 DSHStateDot:warning琥珀 = 等你处理、ongoing灰转圈 = 运行中、done绿 = 新完成未看、idle灰点 = 待办。 - 后台任务徽标:读
ctx.jobs.state,只统计running/stopping的 job, 在会话行末尾显示「转圈 + 数量」;hover 显示 job 的 label 与已运行时长。 - 团队任务区:面板底部只读一节,数据取自树根(Lead)会话的
agentTeam投影 (Agent Teams 实验性功能)。按「进行中 → 可开始的待办 → 被依赖阻塞 → 已完成」 排序,显示状态点、task-N、标题(最多两行)、负责人、依赖数、写入范围重叠警告和 投影的 failure;鼠标悬停单个任务弹出详情卡片(完整描述、负责人、依赖、写入范围、 警告),卡片宽度约为面板的两倍(576px,窄窗口按视口收窄,并始终夹在浏览器边界内), 描述不再按行数截断,内容超出视口时可在卡片内滚动、选中复制;鼠标移到卡片上 不会让它消失,移开才收起,卡片本身始终不透底。任务不能在这里编辑;没有任务或投影 未加载时整节不渲染。 - 形态与开合:对话列左侧 gutter 里的一块浮层。展开时面板占据整个左缘 (默认 300px,可拖右缘在 220–460px 间调宽);收起后只剩一个 40px 图标按钮 (列表图标 + 会话数徽标),点它展开。展开态的收缩按钮是面板头部最左侧的按钮, 与收起态按钮同一尺寸、同一角落,开合都点这个位置;面板头部最右侧是固定按钮。
- 材质与透明度:面板和收起态图标按钮平时沿用 DSH 的半透明菜单材质(会透出背后的 对话文字),鼠标在面板/按钮上时变为不透底,移开恢复半透明;任务详情卡片只在悬停任务 时出现,所以始终不透底。
- 自动折叠与固定:未固定时,以下任一情况会把面板自动折叠(不写偏好,条件解除 后恢复展开):① 右侧边栏打开;② gutter 放不下最小面板宽度(220px)。未固定时点 左缘图标可以「仅本次」临时展开(不写入偏好,空间不足时以覆盖方式展开;下一次自动 折叠条件触发或刷新页面后回到偏好状态)。点面板头部右上角的固定按钮后,这两种 情况都不再自动折叠面板——右栏打开时保持展开,空间不足时改为覆盖展开;固定状态持久化。 取消固定后恢复自动折叠。
- 窄屏:gutter 放不下最小宽度时,未固定 → 自动折叠,但点图标仍可临时覆盖展开 (「仅本次」);固定 → 一直覆盖展开(宽度按视口收缩,最低 160px)。窗口太矮 (可用高度 < 120px)时整块隐藏。
- 偏好:开合、宽度与固定状态存 localStorage
subagent-panel:v1。
安装
前置:已有一个运行中的 DSH profile(Desktop 或 dsh CLI)。
从 npm 安装(推荐):
// 在带 plugin_manager 的 DSH 会话里
plugin_manager({ action: 'install_bundle', target: '@brucecheung666/dsh-subagent-panel' })
# 或用 CLI
dsh plugin --profile <profile> install @brucecheung666/dsh-subagent-panel
也可以从 GitHub 或本地路径安装:
plugin_manager({ action: 'install_bundle', target: '/path/to/dsh-subagent-panel' })
dsh plugin --profile <profile> install /path/to/dsh-subagent-panel
dsh plugin --profile <profile> install github:BruceCheung666/dsh-subagent-panel
安装后:
- 「设置 → 插件」里出现 子 Agent 面板 / Subagent panel,可启用/禁用/卸载;
- 打开一个对话(conversation 主面板、内容已进入 active 阶段)后,对话区左缘出现面板 或它的图标按钮。
更新 / 卸载:
plugin_manager({ action: 'remove_bundle', target: '@brucecheung666/dsh-subagent-panel' })
plugin_manager({ action: 'install_bundle', target: '@brucecheung666/dsh-subagent-panel' })
使用
- 收起态点左缘的 40px 图标按钮:未固定时是仅本次的临时展开(不记住,空间不足时 覆盖展开),固定时是正常展开并记住;展开态点面板头部左上角同位置的按钮收起。
- 拖动面板右缘调整宽度(220–460px);开合与宽度会记住。
- 点击会话行切换到该会话;列表只显示当前会话的 subagent 谱系,不列出全部会话。
- 行末尾的状态点/任务徽标只作提示,点击行仍然是「切换会话」。
- 右侧边栏打开、或 gutter 放不下最小宽度时,未固定的面板会自动收起(空间恢复后 自动展开)。点面板头部右上角的固定按钮可以固定——固定后这两种情况都不再 自动折叠(空间不足时覆盖展开),固定状态会记住;取消固定后恢复联动。
工作原理与数据契约
注册与渲染
- Client 半注册在 frame 级
shell.overlay槽(id: subagent-panel,order: 50), 渲染一个position: fixed的点击穿透层;面板/按钮自己恢复 pointer-events。 - Host 半
index.js是空apply():它只负责让这个包成为 Host Loader 里的一行, Client 半通过package.json的dsh.client+exports["./client"]被发现和下发。 - 一律只用
--dsw-*主题 token,不写死颜色(图标除外);文案走ctx.locale.register('subagent-panel', 'en'|'zh', …)。
注入的 Client 服务
| 服务 | 用途 |
|---|---|
ctx.sessions.list(快照 store) |
会话目录:当前会话判定、谱系行、状态/时间 |
ctx.uiSession.sessionStatus |
行状态点(等你处理 / 运行中 / 新完成未看) |
ctx.jobs(state + watchRows) |
行上的后台任务徽标 |
ctx.uiWorkspace.openSession(id) |
点击行切换会话 |
inject: ['slots', 'locale', 'sessions', 'uiWorkspace', 'uiSession', 'jobs']。
数据契约(半公开,上游改版先查这些)
sessions.list的行字段:id、parentId、origin === 'subagent'、retainedBy.mainView(当前会话判定)、title/displayTitle、cwd、blank、running、updatedAt;当前会话取retainedBy.mainView > 0的那一行。uiSession.sessionStatus:running/pendingInteraction/completionUnread。jobs.state:{ rows: Record<sessionId, JobView[]> },JobView 用到status(running/stopping)、label、kind、startedAt。agentTeam投影:树根(Lead)会话上的{ members, tasks, failure? }, 实验性投影,只在启用 Agent Teams 的 profile 有数据;任务字段用到id、subject、description、status、ready、ownerName、blockedBy、writeScopes、writeScopeWarnings。- 宿主 DOM 锚点:
[data-conversation-region="chat"](含data-content-phase)、[data-composer-card]、[data-rightbar-col]及 frame 的data-rightbar-collapsed/fullscreen属性。位置靠ResizeObserver+MutationObserver+ rAF 实时测量,属原型手段。
几何
- 横向:区域左缘
chat 区域 left + 8px;gutter 右边界是输入卡左缘减 12px。 gutter ≥ 220px 时面板就近放进 gutter(不遮对话)。gutter < 220px 时:未固定则 自动折叠(点图标可仅本次临时覆盖展开);固定则一直覆盖展开,宽度按视口收缩, 最低 160px。 - 纵向:
chat 区域 top + 8px到输入卡顶部减 12px;低于 120px 时整块隐藏。 - 面板只会在 conversation 内容处于
active阶段时出现(hero/settling 等阶段测量 锚点没有意义)。
已知边界与妥协
- 只显示当前会话的 subagent 谱系:没有「全部会话」视图,也不在面板里 fork / 归档 / 重命名(这些仍在 DSH 侧栏)。
fork不进树:fork 出来的会话不会挂在来源会话下,来源会话也不会成为祖先。- 团队任务区只读:创建/认领/完成由 agent 工具完成,面板不写回。
- 位置依赖宿主 DOM 锚点 + 浮层,不是真正的左列;覆盖展开时会遮住一部分对话内容。
- Client 半在槽位里抛运行时错误会导致该条目被 DSH 的槽位错误边界移除(面板消失, 看浏览器 Console);改完代码用 remove + install 重新加载模块。
开发
client.js Client 半(全部 UI、交互与几何测量)
index.js Host 半(空实现:Loader 行载体)
cordis.patch.yml bundle 层:向 profile 插入 id=subagent-panel 的插件行
locale/ 插件管理页标题/描述与面板文案(en/zh)
icon.svg 插件列表图标
- 无构建:改完在 DSH 里
remove_bundle+install_bundle(或重启)加载新模块代际。 - 校验:
node --check client.js;本仓库没有额外脚本。DSH 侧可用cordis_inspect_query查 live 槽(Slots.listSubTree的shell.overlayoccupants) 确认注册是否生效。 - 样式只用主题 token;不要改
document.body,不要读别的插件的 DOM/样式。
常见问题
面板完全没出现?
- 当前主面板不是 conversation,或对话内容处于 hero/settling 阶段(只有
active才显示);窗口太矮(可用高度 < 120px)也会整块隐藏。 - 插件未启用或被卸载:「设置 → 插件」里确认「子 Agent 面板」处于启用状态。
展开后看不到面板、只有图标按钮?
- 收起态本来就只有 40px 图标按钮;点它展开。
- 未固定且 gutter 放不下最小宽度(220px)时会被自动折叠,但点图标仍可临时覆盖展开 (仅本次,不写偏好);想一直保持展开就点面板头部右上角的固定按钮,或者把输入区 拖窄/放大窗口让出足够的 gutter。
行状态点/任务徽标不出现?
- 状态点只在会话有对应状态时显示;任务徽标只统计未结束(
running/stopping)的 job。 - 团队任务区需要启用 Agent Teams 的 profile,且树根会话上有
agentTeam投影。
开合/宽度/固定偏好没保留?
- 偏好存在 localStorage
subagent-panel:v1;隐私模式或清站点数据后会回到默认值。
版本
见 CHANGELOG.md。
致谢
本插件的灵感来自 kadhygh/AgentMonitorOverlay 项目——感谢作者 @kadhygh 与贡献者的开源工作。
License
MIT © 2026 BruceCheung666