dsh-team 0.2.6 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -114
- package/dist/client.js +4071 -6454
- package/dist/client.js.map +1 -1
- package/dist/client.ts.map +1 -1
- package/dist/index.d.ts +12 -6
- package/dist/index.js +114 -44
- package/dsh-manifest.json +2 -2
- package/package.json +48 -34
package/README.md
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# dsh-team
|
|
4
|
+
|
|
5
|
+
**给 DeepSeek Harness 加一支能看见的 agent 团队**
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/dsh-team)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+

|
|
2
10
|
|
|
3
11
|

|
|
4
12
|
|
|
5
|
-
|
|
13
|
+
</div>
|
|
6
14
|
|
|
7
|
-
|
|
15
|
+
在会话里输入一行 `/agent-teams <目标>`,主会话就会拉起一支队伍:每位队友有自己的名字、会话和记忆,能互发消息、认领共享任务、往共享黑板写结论;「Agent 团队」页签把这一切画成一间 2.5D 办公室,谁在干活一目了然。
|
|
8
16
|
|
|
9
17
|
## 安装
|
|
10
18
|
|
|
@@ -14,148 +22,87 @@ npm 预构建包,一行装配:
|
|
|
14
22
|
dsh plugin --profile web add dsh-team
|
|
15
23
|
```
|
|
16
24
|
|
|
17
|
-
|
|
25
|
+
或者从源码构建安装:
|
|
18
26
|
|
|
19
27
|
```sh
|
|
20
28
|
git clone https://github.com/huxint/dsh-team.git
|
|
21
|
-
cd dsh-team
|
|
22
|
-
pnpm install
|
|
23
|
-
pnpm run build
|
|
29
|
+
cd dsh-team && pnpm install && pnpm run build
|
|
24
30
|
dsh plugin --profile web add link:$PWD
|
|
25
31
|
```
|
|
26
32
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
验证装配与启动:
|
|
33
|
+
装完即生效。卸载:
|
|
30
34
|
|
|
31
35
|
```sh
|
|
32
|
-
dsh --profile web
|
|
33
|
-
dsh --profile web
|
|
36
|
+
dsh plugin --profile web remove dsh-team
|
|
34
37
|
```
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
## 用法
|
|
40
|
+
|
|
41
|
+
想让一件事由一支队伍来完成时,在输入框输入:
|
|
37
42
|
|
|
38
|
-
```
|
|
39
|
-
|
|
43
|
+
```
|
|
44
|
+
/agent-teams 把鉴权模块迁移到新 SDK
|
|
40
45
|
```
|
|
41
46
|
|
|
42
|
-
|
|
47
|
+
斜杠后面的内容就是给团队的目标,可以带图。也可以不敲命令,直接跟主会话说"组个团队把这件事做了"——它会自己决定需要几个队友、分别做什么。
|
|
43
48
|
|
|
44
|
-
|
|
45
|
-
- **成员邮箱**:`team_send` 把消息变成收件人的下一个 turn;投递由 leader 权威执行,队友之间的转发有会话预算。
|
|
46
|
-
- **共享任务列表**:`team_task` 建 / 改 / 结案,`team_list` 看花名册、任务与最近流量。
|
|
47
|
-
- **虚拟工作区**:共享黑板 + 每人一块私有便笺(`team_note` / `team_board`),落进 storage domain,跨重启、不占 turn。
|
|
48
|
-
- **协作室页签**:会话视图环里的第三个页签,实时展示成员座位、走动、消息流、工作区与任务板。
|
|
49
|
+
队伍跑起来之后:
|
|
49
50
|
|
|
50
|
-
|
|
51
|
+
- 队友各自领任务干活,进展自动回到你的会话;
|
|
52
|
+
- 想看现场,点开「Agent 团队」页签进协作室;
|
|
53
|
+
- 想让谁收工、或整个队伍解散,跟主会话说一声即可。
|
|
51
54
|
|
|
52
|
-
|
|
55
|
+
## 它能做什么
|
|
53
56
|
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
- **工具作用域**:leader 的 6 个工具在 `agent/created` 时注册进该 agent 自己的 ctx;队友侧在 `registerContinuableSetup` 的未发布组装窗口里注册 `team_send` / `team_list` 与身份提示段落。
|
|
57
|
+
- **常驻队友**:每个队友有名字、角色和自己的记忆,随叫随到,不用反复交代背景。
|
|
58
|
+
- **成员邮箱**:队友之间可以直接互相沟通,不必事事经过你。
|
|
59
|
+
- **共享任务列表**:全队认领同一份清单,谁在做哪件事清清楚楚。
|
|
60
|
+
- **共享工作区**:一块全队共用的黑板,外加每人一本别人看不见的私有便笺;写下来的东西重启后还在。
|
|
61
|
+
- **协作室页签**:一间实时更新的办公室,队伍的一切尽收眼底。
|
|
62
|
+
- **安全边界**:队友之间的对话有轮数上限,不会绕着圈停不下来;发给主会话的消息永远畅通。
|
|
61
63
|
|
|
62
|
-
##
|
|
64
|
+
## 团队协作室
|
|
63
65
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
每个写操作的工具卡片都有自己的标题(`Spawn teammate Alice` / `Alice joined the team` / `Message Alice` / `New task: …` / `Team disbanded`),失败时直接把拒绝原因写在卡片上;写操作一律 `isConcurrencySafe: () => false`,不会被并行调度打散。
|
|
78
|
-
|
|
79
|
-
## 模型与思考强度
|
|
80
|
-
|
|
81
|
-
- `model`:走 `AgentOptions.model`,只影响这一个队友;省略则继承 leader 的模型。
|
|
82
|
-
- `reasoning_effort`:不是 `AgentOptions` 的字段(它是请求头状态),所以队友作用域里挂一个 `agent/request` waterfall,把 `reasoningEffort` 钉在**这个队友自己的**每次请求上。派生时就用 `ctx.llm.resolveModelInfo()` 校验该模型是否提供这个强度,**当场失败**而不是等到队友第一次发请求。
|
|
83
|
-
- 强度记在成员事实里(随折叠持久化),冷恢复后仍然生效——subagent descriptor 本身不存这个字段。
|
|
84
|
-
|
|
85
|
-
## 团队协作室(视图页签)
|
|
86
|
-
|
|
87
|
-
团队协作室是**会话视图环里的第三个页签**:`对话 / 轨迹 / Agent 团队`(`src/client/`)。点开是一间**占满整个标签页的 2.5D 办公室**——一个能望进去的盒子:后墙加两面侧墙围着一块向远端收窄的地板,天花板上垂下一盏吊灯;家具都有顶、正、侧三个面。每个成员有自己的工位、自己的电脑,坐在自己的椅子上;要跟谁说话就**站起来走过去**。消息流、共享工作区、任务板收在**右侧竖排的三扇门(dock)**后面,点开哪扇,哪份账本就以一块**磨砂玻璃抽屉**盖在房间右侧展开。
|
|
88
|
-
|
|
89
|
-
- **有团队才有页签**:客户端跟随器发现当前会话的 `team` 投影里有成员,才把这一条 `conversation.view` 注册进去;团队解散就把注册撤回(未知的 view id 会回落到对话页,撤回不会把读者卡住)。普通会话的视图环完全不变。
|
|
90
|
-
- **房间就是整个页面**:协作室在屏幕上时,插件在 `conversation.composer` 链的**最后一位**交出一个空的输入区——房间不跟一张输入卡片分屏,也就不需要什么"剧场模式"。座位是引用计数的:离开页签立刻还回去,两次挂载重叠也只占一个。
|
|
91
|
-
- **平面与透视分离**:`room.ts` 只认识一张 0–100 的**纯几何平面**——桌位、家具占位、寻路、休息角全在上面,**不量 DOM**,画面只是持久状态的一个函数。`stagecraft.ts` 把这层平面投进一个透视盒子(地板向远端收窄、越远越挤、越远越小),外墙的五个面和每个投影点读的是**同一组常数**,墙和地板永远对得齐。移动家具,绕行路线跟着走;换一个投影,布局原地不变。
|
|
92
|
-
- **每张桌子都是一整套**:带木纹的**桌面 + 前裙板 + 侧挡板 + 挡腿板**,上面放着键盘、该席位强调色的马克杯、一沓纸、一盆小植物,桌后立着**显示器**(加大号的屏幕、支架、底座),桌前一把**办公椅**(SVG 画的网面椅背、腰靠、座垫、气杆、五爪脚轮,还会偶尔轻轻上下落一下)。全部是 token 画出来的形状,没有一张贴图。
|
|
93
|
-
- **屏幕在左肩,人在中间**:显示器立在工位后侧、屏幕面向读者;成员背对房间坐在桌前,工作时不需要看清谁的脸。图层从近到远是**椅背 → 坐着的成员 → 桌面和显示器**——显示器站在成员左肩外侧,再大也不会挡住人,人也正好夹在桌子和椅子之间。成员一旦站起来走路、去休息角、或者正在跟人说话,才转过身来露脸。
|
|
94
|
-
- **人是戴海兽头套的人**:一具人形(鞋、裤子、衬衫、两条胳膊)+ 一头**侧面**的鲸鱼或鲨鱼当兜帽——只有侧着才像它。衣服按席位轮流换**衬衫 / T恤 / 毛衣 / Polo / 卫衣 / 束腰外衣 / 马甲 / 外套 / 条纹 / 背带裤**,鞋也轮流换**运动鞋 / 短靴 / 乐福鞋 / 高帮 / 凉鞋**(带鞋带与鞋底边),头发轮流换**刘海 / 丸子头 / 卷发 / 短寸 / 马尾 / 板寸**(发色与肤色各有几档,不跟强调色走),再各带一件小物(眼镜 / 耳机 / 围巾 / 工牌 / 背包)。leader 戴蓝鲸(喷水),队友按席位轮流拿到虎鲸(背鳍 + 白眼斑)、座头鲸(长鳍 + 头瘤)、独角鲸(长牙)、白鲸(额隆)、抹香鲸(方头)、鲨鱼(背鳍 + 鳃裂)。强调色是**品牌 token 旋转出来的**(`hue-rotate`),不写死颜色。背身时头套朝另一边、后脑勺有头发、腿收进椅子里。
|
|
95
|
-
- **走路是真的走**:`routeBetween` 在**家具占位构成的可见性图**上求最短路——每个障碍矩形外扩一圈净空,只在这些角上转弯,所以走的是真的绕行而不是两条写死的通道;`smooth` 再把转角削成小弧线,急转弯变圆角。`walk.ts` 用一个 rAF 循环按**弧长**推进整趟行程:起步加速、收尾减速(而不是每条腿各自匀速),步态相位跟着走过的距离走——走得快摆得快,走得慢摆得慢;朝向除了左右还分**正身 / 背身**。位置直接写在 DOM 节点上,只有转弯和停步才触发 React 渲染,一屋子人同时走也就每帧几次样式写入。
|
|
96
|
-
- **传消息 = 走过去说**:最新一条投递会让发信人从自己的座位**走到收信人桌边**(站在旁边一步,谁也不挡谁),**到了才开口**(头顶一句截短的话),收信人转头听(`···`);这趟差事过去之后它再走回自己的位置。走的是本人,不是复制体——房间里每个成员永远只有一个。
|
|
97
|
-
- **站在哪儿,就是它此刻在做什么**:
|
|
98
|
-
|
|
99
|
-
| 成员的状态 | 房间里的样子 |
|
|
100
|
-
|---|---|
|
|
101
|
-
| 正在跑一个 turn | 坐在自己桌前,屏幕亮着它那份预设画面 |
|
|
102
|
-
| 刚收到一条消息 | 留在自己桌前读(屏幕上就是这条消息) |
|
|
103
|
-
| 自己刚汇报完、名下没有未完成任务 | 起身去休息角(沙发、茶几、绿植、饮水机) |
|
|
104
|
-
| 闲着没事 | 坐着打盹(`zZ`) |
|
|
105
|
-
|
|
106
|
-
- **屏幕上放的是预设画面**:每个席位固定一种——leader 看**仪表盘**,队友轮流拿到**代码、文档、邮件、表格、终端**——像素条全部由主题 token 混出来。它此刻在做的那件事(进行中任务标题,或最近一条发给它的消息)也写在屏幕上;没活干的屏幕是暗的。
|
|
107
|
-
- **不标区域,靠家具说话**:后墙上有**带窗洞进深、能看见云和海**的两扇窗、铝框白板(笔槽里躺着三支笔和一块板擦、贴着两张便利贴、还有没擦干净的旧字迹)、挂钟(秒针真的在走)、一组**高矮不一的**书墙架(配小盆栽和一座奖杯)、海报和月历;左边服务墙上放着打印机、咖啡机和文件柜;右手边是休息角的地毯、沙发、落地灯与饮水机(水桶里的气泡会上浮),门口偶尔还有一只猫路过。房间里没有一个"工作区""休息区"的字牌——看得出来就不用写。
|
|
108
|
-
- **绿植是一个家族**:休息角、书架、窗台和桌上放的都是 SVG 真画的植物——龟背竹、虎尾兰、绿萝(从墙上垂下来)、仙人掌、琴叶榕、棕榈,各有叶脉、明暗两层叶片、上釉陶盆和托盘;每片叶子都铰在着生点上,错开相位轻轻摆动。
|
|
109
|
-
- **闲着会自己找事做**:没事干的成员过一会儿会起身去接水、走到窗边看海、或在植物旁伸懒腰(leader 永远守着第一张桌)。两个成员在同一处站定会自动分开一点,不会叠成一个人。
|
|
110
|
-
- **名字在脚下**:名牌贴在成员脚边的地面上(不会飘到别人桌子上),未完成任务数挂在肩上,运行状态点在身侧。
|
|
111
|
-
- **右侧三扇门,各有计数**:信箱 / 工作区 / 任务板各带一枚数字徽标(消息条数、笔记条数、**未完成**任务数);抽屉关着的时候来了新投递,信箱那扇门会**亮起呼吸圈**,打开即消。同一时刻只开一扇,再点一次或点抽屉的 × 就收回去。整个房间的 sprite 被关在自己的 stacking context 里,dock 和抽屉永远浮在它们上面——哪怕有成员走到休息角,也不会挡住消息流的按钮或抽屉内容。
|
|
112
|
-
- **信箱是日志,不是聊天**(信箱抽屉里):顶上一条**花名册**,每人**一行**——头像、名字、此刻在跑还是闲着、以及它最新的一句话(截短);下面是流量本身,一条一行、越新越靠下,长内容截到一行、整句挂在 `title` 上。全队都写在**同一侧**:右边属于读者,而读者不在这里发言。`汇报` 走成功色边条,`已收工` 虚线弱化,第 3 跳起的 `hop` 徽标变警告色。鼠标停在一行上,对应成员的工位会亮起——**同一份状态的两种投影互相指认**,玻璃抽屉正好让你同时看见两边。
|
|
113
|
-
- **共享工作区是软木板**(工作区抽屉里):每条笔记是一张钉着图钉的便签,微微歪着,鼠标停上去才摆正;作者一栏带着它的小头像,悬停同样点亮本人;标题旁边写着这份快照的时间。
|
|
114
|
-
- **任务是泳道**(任务板抽屉里):待办 / 进行中 / 已完成三条泳道,道头一枚状态色圆点;卡片上指派人带小头像,结案备注跟在旁边。
|
|
115
|
-
- 点任何一个成员开对应 transcript(走 durable 的 subagent 地址,目录没拉取过就刷新后重试),点 leader 回主会话,`aria-current` 标出你正在看的那个。
|
|
116
|
-
- **解散就关灯**:不带参数的 `team_dismiss` 折叠出 `ended`,团队视图折成空,房间和页签一起收走——你此刻正读着某个队友的 transcript 也一样。
|
|
117
|
-
- **全部动效在 `prefers-reduced-motion` 下关闭**(走路的成员直接站到终点、云不飘、猫不路过、气泡不冒,抽屉直接出现)。
|
|
118
|
-
|
|
119
|
-
导航进队友会话时页签不会消失:跟随器认得"当前会话是这支团队的成员",只把"你在这儿"的标记挪过去,同时改订 **leader 的 `team` 投影**——被读的那个队友自己折不出团队,只有盯着 leader,房间才既是活的、又能在团队解散的那一刻关掉。leader 本身没加载时,房间保留它最后看到的样子。
|
|
120
|
-
|
|
121
|
-
## 配置(`cordis.patch.yml` 可覆写)
|
|
66
|
+
点开「Agent 团队」页签,是一间占满整页的 2.5D 办公室:
|
|
67
|
+
|
|
68
|
+
- 每位成员有自己的工位和电脑;要说话就真的站起来走到对方桌边,说完再走回自己的座位。
|
|
69
|
+
- 谁在埋头干活、谁闲着打盹、谁刚交完差去休息角喝咖啡,看姿势就知道。
|
|
70
|
+
- 右侧三扇门分别是**信箱 / 工作区 / 任务板**:信箱是全队的消息流水,工作区是一块钉满便签的软木板,任务板是待办 / 进行中 / 已完成三条泳道。
|
|
71
|
+
- 关着抽屉来了新消息,信箱那扇门会亮一圈呼吸灯。
|
|
72
|
+
- 点任何一位成员可以翻开它的对话记录,点 leader 回主会话。
|
|
73
|
+
- 解散团队时,房间和页签一起熄灯。
|
|
74
|
+
- 系统开启"减少动态效果"时,所有动画自动关闭。
|
|
75
|
+
|
|
76
|
+
## 配置
|
|
77
|
+
|
|
78
|
+
以下选项都有默认值,不加任何配置也能直接用(写在 `cordis.patch.yml` 里覆写):
|
|
122
79
|
|
|
123
80
|
| 键 | 默认 | 含义 |
|
|
124
81
|
|---|---|---|
|
|
125
|
-
| `provider` | `spawn` |
|
|
126
|
-
| `maxTeammates` | `8` |
|
|
127
|
-
| `maxRecentMessages` | `50` |
|
|
128
|
-
| `maxChainHops` | `4` |
|
|
129
|
-
| `maxChainRoundTrips` | `2` |
|
|
130
|
-
| `maxWorkspaceEntries` | `32` |
|
|
131
|
-
| `maxNoteChars` | `4000` |
|
|
82
|
+
| `provider` | `spawn` | 队友的创建方式,保持默认即可 |
|
|
83
|
+
| `maxTeammates` | `8` | 一支队伍最多几名队友 |
|
|
84
|
+
| `maxRecentMessages` | `50` | 信箱保留多少条最近消息 |
|
|
85
|
+
| `maxChainHops` | `4` | 队友之间一次对话最多转手几次 |
|
|
86
|
+
| `maxChainRoundTrips` | `2` | 同两个队友之间一轮最多来回几条 |
|
|
87
|
+
| `maxWorkspaceEntries` | `32` | 工作区每个区域最多放多少条笔记 |
|
|
88
|
+
| `maxNoteChars` | `4000` | 单条笔记最长多少字 |
|
|
132
89
|
|
|
133
90
|
## 已知限制
|
|
134
91
|
|
|
135
|
-
-
|
|
136
|
-
-
|
|
137
|
-
-
|
|
138
|
-
-
|
|
139
|
-
-
|
|
140
|
-
-
|
|
141
|
-
- **Code Mode 下的团队调用不入折叠**:折叠读的是团队工具自己的 `tool/result`;`run_code` 里的嵌套调用不产生这些行(base bundle 默认不含 Code Mode)。
|
|
142
|
-
- **工具成功但结果没落日志**(极端故障)会留下一个孤儿成员:活的花名册有、折叠没有,重启后消失。
|
|
143
|
-
- 不嵌套:队友不能再开自己的团队(`NESTED_TEAM`)。
|
|
92
|
+
- 队友之间互相聊了什么,只有当事成员自己知道;你能看到的是与你相关的流量。
|
|
93
|
+
- 共享任务清单由主会话记账,队友通过汇报交付结果。
|
|
94
|
+
- 协作室里的共享黑板显示的是主会话最后一次读写时的快照。
|
|
95
|
+
- 整队解散后,各队友的历史记录仍可在 harness 的子代理面板里翻阅——这是设计使然。
|
|
96
|
+
- 主会话不在线时新加入的队友暂时拿不到团队工具,等它回来即恢复。
|
|
97
|
+
- 队友不能再开自己的队伍。
|
|
144
98
|
|
|
145
99
|
## 开发
|
|
146
100
|
|
|
147
|
-
改完源码重跑 `pnpm run build`:宿主行要重启 dsh,客户端 bundle 刷新页面即可。
|
|
148
|
-
|
|
149
101
|
```sh
|
|
150
|
-
pnpm run
|
|
151
|
-
pnpm run test # 折叠 / 投影 / 服务授权矩阵 / 工具契约 / 队友组装 / 会话预算 / 虚拟工作区 / 房间几何与走路 / 客户端跟随与页签 / 协作室与抽屉
|
|
152
|
-
pnpm run build # 宿主 ESM + 浏览器闭包工厂(构建期强制客户端 bundle 纯净性),产物进 dist/
|
|
153
|
-
pnpm run check # 三件一起
|
|
102
|
+
pnpm run check # 类型检查 + 测试 + 构建
|
|
154
103
|
```
|
|
155
104
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
构建与类型针对 npm 上的 `@deepseek-ai/dsh@0.1.1-rc.2`。遵循 harness 的插件纪律:注册即 effect、能力缝三角色、事件全 JSON 整值、模型可见即落日志、配置无硬编码。
|
|
105
|
+
改完源码重跑构建:宿主侧需要重启 dsh,页面刷新即可看到新的客户端效果。构建产物 `dist/` 随仓库提交。
|
|
159
106
|
|
|
160
107
|
## License
|
|
161
108
|
|