dsh-team-rooms 1.0.0
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/ARCHITECTURE.md +127 -0
- package/LICENSE +201 -0
- package/README-es.md +248 -0
- package/README-hi.md +248 -0
- package/README-pt.md +248 -0
- package/README-zh.md +248 -0
- package/README.md +248 -0
- package/THIRD_PARTY_NOTICES.md +41 -0
- package/cordis.patch.yml +34 -0
- package/lib/client.js +4713 -0
- package/lib/index.js +6580 -0
- package/lib/types/audit.d.ts +80 -0
- package/lib/types/client/TeamRoomsSection.d.ts +33 -0
- package/lib/types/client/index.d.ts +41 -0
- package/lib/types/client/room-locales.d.ts +61 -0
- package/lib/types/client/room-presenter.d.ts +67 -0
- package/lib/types/facts.d.ts +66 -0
- package/lib/types/inbound.d.ts +282 -0
- package/lib/types/index.d.ts +125 -0
- package/lib/types/room/commands.d.ts +23 -0
- package/lib/types/room/domain.d.ts +72 -0
- package/lib/types/room/events.d.ts +105 -0
- package/lib/types/room/hub.d.ts +243 -0
- package/lib/types/room/projection.d.ts +388 -0
- package/lib/types/room/schema.d.ts +550 -0
- package/lib/types/room/tools.d.ts +34 -0
- package/lib/types/vocabulary.d.ts +20 -0
- package/package.json +170 -0
- package/src/audit.ts +113 -0
- package/src/client/TeamRoomsSection.module.css +272 -0
- package/src/client/TeamRoomsSection.tsx +369 -0
- package/src/client/css-modules.d.ts +5 -0
- package/src/client/index.ts +215 -0
- package/src/client/room-locales.ts +115 -0
- package/src/client/room-presenter.ts +126 -0
- package/src/facts.ts +127 -0
- package/src/inbound.ts +440 -0
- package/src/index.ts +309 -0
- package/src/room/commands.ts +278 -0
- package/src/room/domain.ts +38 -0
- package/src/room/events.ts +116 -0
- package/src/room/hub.ts +1022 -0
- package/src/room/projection.ts +267 -0
- package/src/room/schema.ts +153 -0
- package/src/room/tools.ts +603 -0
- package/src/vocabulary.ts +20 -0
package/README-zh.md
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🏠 dsh-team-rooms
|
|
4
|
+
- **1024 商店渠道**:先执行一次 `npm i -g dsh1024`,然后 `dsh1024 plugin --profile web add dsh-team-rooms`(计入 [deepseek1024.com](https://deepseek1024.com) 的安装榜)。
|
|
5
|
+
|
|
6
|
+
**面向 DeepSeek Harness 的持久化跨会话多 agent 团队房间 —— 成员、消息总线、共享任务板与共享时间线,重启后依然存活。**
|
|
7
|
+
|
|
8
|
+
*每个成员都是一个独立的 DSH 会话;房间是它们之间共享的持久对象。*
|
|
9
|
+
|
|
10
|
+
[](LICENSE)
|
|
11
|
+
[](https://github.com/topics/dsh-plugin)
|
|
12
|
+
[](#)
|
|
13
|
+
|
|
14
|
+
[English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
|
|
15
|
+
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
> **自 [`dsh-background-agents`](https://github.com/PerryLink/dsh-background-agents) 0.9.6 拆分而来。** 该插件的后台代理部分(`background_agent` 与五个 `bg_*` 工具)已被 DSH 原生的可续聊子代理取代;团队房间部分没有原生等价物,因此作为独立包继续存在。0.9.6 写入的存储域、会话日志与设置项全部继续可用 —— 见「兼容性」。
|
|
21
|
+
|
|
22
|
+
## 兼容性
|
|
23
|
+
|
|
24
|
+
宿主 `0.1.2-alpha.2` 及之后版本对会话事件词表 fail-closed,因此本插件不再在那里写入仅日志的事实事件(`team-room/fact`):事实改走 logger/面板通道,`teamRoom` 投影退化为空折叠。较早的 rc 线(直至 `0.1.1-rc.2`)仍保持 `ignorable` 标记纪律。客户端半部使用当前客户端包(`dsh-api-session-controller`、`dsh-client-ui-slots`、`dsh-client-ui-settings`、`dsh-client-locale`、`dsh-client-web`)。
|
|
25
|
+
|
|
26
|
+
**与 `dsh-background-agents` 0.9.6 的数据兼容是硬性规则。** 以下字符串与 0.9.6 逐字节一致,永不改名:存储域 `team_rooms`、`teamRoom` 投影键、`team-room/fact` 会话事件类型、以及 `team-rooms` 设置槽 id。因此替换插件后,既有 profile 的房间、成员日志与设置页都会原样保留。
|
|
27
|
+
|
|
28
|
+
| 界面 | 状态 |
|
|
29
|
+
|---|---|
|
|
30
|
+
| Harness | DeepSeek Harness `dsh-v0.1.5-rc.2`(GitHub tag,2026-09-11 验证;dev 与运行时钉 `0.1.5-rc.2`,peer 为 `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0`) |
|
|
31
|
+
| Node | `^22.19.0 \|\| >=24.0.0` |
|
|
32
|
+
| 平台 | 全平台(宿主工具;设置页需要 Web 客户端半部与存储域能力) |
|
|
33
|
+
| 模型 | 任意(房间不携带模型路由 —— 成员就是普通会话) |
|
|
34
|
+
|
|
35
|
+
## 你能获得什么
|
|
36
|
+
|
|
37
|
+
`dsh-team-rooms` 把多个独立会话变成一个协同的团队:
|
|
38
|
+
|
|
39
|
+
1. **`/room` 命令族** —— `create`、`join`、`leave`、`list`、`send`、`tasks`、`task add|assign|claim|done|delete`。房间有名字、有属主,并用稳定的房间 id 寻址,可以直接粘贴到另一个会话。
|
|
40
|
+
2. **八个 `room_*` 工具** —— `room_list_rooms`、`room_post`、`room_read`、`room_list_tasks`、`room_create_task`、`room_claim_task`、`room_transfer_task`、`room_complete_task`。模型在自己的会话内操作共享任务板与总线;跨成员交接(`room_transfer_task`)会先请求审批。
|
|
41
|
+
3. **持久房间存储** —— 成员、消息总线(定向或广播)、任务板与时间线存放在 `team_rooms` 存储域(SQLite 或 JSONL 后端,由部署决定;插件不新增任何服务),并在 DSH 重启后恢复。
|
|
42
|
+
4. **Web 设置页** —— Team Rooms 设置区显示当前会话所属每个房间的成员状态、任务板与时间线:读取自 `teamRoom` 会话投影,写回则通过宿主 `/room` 命令。
|
|
43
|
+
|
|
44
|
+
## 快速开始
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
# 1. 将 bundle 安装到你的 profile
|
|
48
|
+
dsh plugin --profile web add "github:PerryLink/dsh-team-rooms#main"
|
|
49
|
+
|
|
50
|
+
# 或从 npm 安装(已发布版本)
|
|
51
|
+
dsh plugin --profile web add dsh-team-rooms
|
|
52
|
+
|
|
53
|
+
# 2. 重启并验证该行
|
|
54
|
+
dsh --profile web --dump-config | grep -A4 'id: team-rooms'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
bundle 补丁带有插件行;没有任何必填 Config 键。仓库提交了构建产物(`lib/`),因此 git 安装无需构建步骤。只要组合了存储域(`@deepseek-ai/dsh-storage-domain`,每个 `@deepseek-ai/dsh-base` profile 都有),房间就会挂载;没有它时 `/room` 命令与 `room_*` 工具保持休眠,其余功能照常加载。
|
|
58
|
+
|
|
59
|
+
然后,在任意会话中:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
/room create release-prep
|
|
63
|
+
/room send <roomId> kickoff: I own the changelog, who takes the docs?
|
|
64
|
+
/room task add <roomId> draft the migration note
|
|
65
|
+
/room task claim <roomId> <taskId>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
把打印出的房间 id 粘贴到另一个会话并 `/room join <roomId>` —— 该会话即成为成员,会像普通消息一样收到房间投递,并看到同一块任务板。
|
|
69
|
+
|
|
70
|
+
## 安装与卸载
|
|
71
|
+
|
|
72
|
+
- **git 渠道**(最新 `main`):`dsh plugin --profile web add "github:PerryLink/dsh-team-rooms#main"` —— 已提交 `lib/`,无需 `prepare` 或 `allowBuilds` 步骤。
|
|
73
|
+
- **npm 渠道**(已发布版本):`dsh plugin --profile web add dsh-team-rooms`。
|
|
74
|
+
- **tarball 渠道**:在本仓库执行 `pnpm pack`,然后 `dsh plugin --profile web add ./dsh-team-rooms-<version>.tgz`。
|
|
75
|
+
- **卸载**:`dsh plugin --profile web remove dsh-team-rooms`(或从 profile 补丁中删除该行)。你的房间仍留在 `team_rooms` 存储域中,重新安装即可回来。
|
|
76
|
+
- ⚠️ **不要与 `dsh-background-agents` 同时挂载。** 废弃窗口期内两个包都在发布,而它们注册的是同样的八个 `room_*` 工具、同一个 `settings.section` 槽位 id(`team-rooms`)与同一个 `team_rooms` 存储域 —— 两个 room 半边会互相冲突。若你已在运行 `dsh-background-agents`,请先卸载它(`dsh plugin --profile web remove dsh-background-agents`)。无论哪种情况房间都不会丢:它们存在存储域里,不在插件里。
|
|
77
|
+
|
|
78
|
+
## 配置
|
|
79
|
+
|
|
80
|
+
每个可调项都是经过校验的 Schemastery `Config` 字段 —— 在 cordis.yml 中修改,绝不在代码中修改。没有任何必填项。
|
|
81
|
+
|
|
82
|
+
| 键 | 默认值 | 含义 |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| `maxRooms` | `16` | 整个 profile 内团队房间的硬上限 |
|
|
85
|
+
| `maxMembersPerRoom` | `8` | 每个房间成员的硬上限(`>= 2`) |
|
|
86
|
+
| `maxRoomsPerMember` | `4` | 一个成员会话可加入的房间数上限 |
|
|
87
|
+
| `busRetention` | `200` | 每个房间保留的总线消息数 |
|
|
88
|
+
| `timelineRetention` | `500` | 每个房间保留的时间线事件数 |
|
|
89
|
+
| `taskRetention` | `50` | 每个房间保留的已完成任务数 |
|
|
90
|
+
| `maxMessageChars` | `4000` | 单条房间消息文本的硬上限(超限直接拒绝,绝不截断) |
|
|
91
|
+
| `injectRoomBrief` | `true` | 向成员会话注入简短房间简介(加入 + 恢复时) |
|
|
92
|
+
| `roomOpenTimeoutMs` | `15000` | `team_rooms` 存储域打开的最长等待时间;超时后所有房间操作以 `store-unavailable` 明确失败,而不是永久挂起 |
|
|
93
|
+
| `allowUnmarkedFacts` | `false` | 强制在丢弃 `ignorable` 标记的宿主上写入仅日志的 `team-room/fact` 事件(危险:未标记事件会让会话在其他宿主上无法恢复);默认自动探测并跳过 |
|
|
94
|
+
| `inbound.enabled` | `false` | 开启面向外部代理运行时(OpenAI Agents SDK / CrewAI)的 stdio JSON-RPC 入站桥接;默认关闭(fail-closed) |
|
|
95
|
+
| `inbound.command` | *(无)* | 外部运行时启动命令;开启且存在时插件会 spawn 它并监听换行分隔的 JSON-RPC 通知;缺失/无法 spawn = 桥接保持休眠(记日志) |
|
|
96
|
+
|
|
97
|
+
## 工具与界面
|
|
98
|
+
|
|
99
|
+
| 界面 | 类型 | 说明 |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| `/room` | command | `create\|join\|leave\|list\|send\|tasks\|task add\|assign\|claim\|done\|delete` |
|
|
102
|
+
| `room_list_rooms` | tool | 本会话所属的每个房间:id、名称、成员名册、任务计数 |
|
|
103
|
+
| `room_post` | tool | 向总线发帖(广播,或用 `to` 定向) |
|
|
104
|
+
| `room_read` | tool | 从某个 seq 游标读取一个房间的总线历史 |
|
|
105
|
+
| `room_list_tasks` | tool | 某个房间的共享任务板 |
|
|
106
|
+
| `room_create_task` | tool | 新增一行任务(可选直接指派) |
|
|
107
|
+
| `room_claim_task` | tool | 由本会话认领一行(指派者 + 进行中) |
|
|
108
|
+
| `room_transfer_task` | tool | 把一行交给其他成员 —— **需审批**,未获批即 fail-closed |
|
|
109
|
+
| `room_complete_task` | tool | 把一行标为 `done` |
|
|
110
|
+
| `teamRoom` 投影 | session projection | 从本成员自己日志中的 `team-room/fact` 事件折叠出的房间视图 |
|
|
111
|
+
| Web 设置页 | client | 成员状态、任务板、时间线与房间操作;槽 id 为 `team-rooms` |
|
|
112
|
+
|
|
113
|
+
以上是 **八个** `room_*` 工具,在存储域组合后全部注册。
|
|
114
|
+
|
|
115
|
+
## 工作原理 —— 以及它为何能在重启后存活
|
|
116
|
+
|
|
117
|
+
房间存储是跨会话的权威;会话投影是每个成员自己重建的副本。两类写入同时进行且保持一致:
|
|
118
|
+
|
|
119
|
+
- **每次房间变更**(create、join、leave、post、任务流转)都排在唯一的 hub 写链上 —— `team_rooms` 域的唯一写链就是排序权威,因此并发发帖绝不会交错读-改-写,总线 seq 严格按提交顺序铸造。
|
|
120
|
+
- **模型可见 ⟺ 已记录**:投递的房间消息走官方收件箱(`agent.followup` 唤醒在线成员;`agent.inject` 在该成员下次启动时交付其积压),因此它会作为持久的 `user/message` 落在该成员自己的会话日志中。
|
|
121
|
+
- **共享时间线**以仅日志的 `team-room/fact` 事件镜像到每个成员的日志,携带规范的存储 `timelineSeq`;`teamRoom` 投影折叠每个成员自己的日志,因此视图在每次重开后无需读取存储即可重建。
|
|
122
|
+
- **投递至少一次且有序**:每成员游标(`lastDeliveredSeq`、`lastFactSeq`)只在投递落地后才推进,因此提交与投递之间崩溃会在追赶时重投,而不是丢消息。
|
|
123
|
+
|
|
124
|
+
`Session.append` 早于 `ignorable` 标记的宿主(直至 `0.1.0-rc.8` 的每条已发布 rc 线、`0.1.1-rc.2` 线,以及仅为已存日志读兼容保留该信封字段的 `0.1.2-rc` 线)会在首次追加前被探测出来(先做 peer 版本预检,再对返回信封做一次探测),随后跳过事实追加并给出一次性警告:持久存储、API 界面与模型可见投递照常工作,`teamRoom` 退化为空折叠。`allowUnmarkedFacts: true` 可选回写 —— 故意危险。
|
|
125
|
+
|
|
126
|
+
## 这不是本插件
|
|
127
|
+
|
|
128
|
+
| 项目 | 它做什么 | 边界 |
|
|
129
|
+
|---|---|---|
|
|
130
|
+
| [titanwings/dsh-automation](https://github.com/titanwings/dsh-automation) | 在全新 agent 会话中执行定时编码任务 | 它负责任务**何时**运行(调度)。本插件负责多个会话共同操作的**共享对象** —— 没有调度接缝,没有 cron。 |
|
|
131
|
+
| [YYTbit/dsh-plugin-agent-dashboard](https://github.com/YYTbit/dsh-plugin-agent-dashboard) | 多 agent 仪表盘技能 | 面向展示、以读为主。本插件的房间是**可写的协同状态**:一条总线、一块任务板、需审批的交接,并持久化在 harness 自己的存储中。 |
|
|
132
|
+
| `dsh-background-agents` | 后台代理(此前还带团队房间) | 该包的 `bg_*` 部分已被 DSH 原生可续聊子代理取代;它的房间部分就是本包。不要同时挂载两个房间半部。 |
|
|
133
|
+
|
|
134
|
+
## 权限与数据
|
|
135
|
+
|
|
136
|
+
- **权限**:workshop 清单声明 `session:append` 与 `tools:register`。房间从不 spawn 子代理,因此本插件不申请任何 `subagent:*` 权限,也不声明子代理依赖。
|
|
137
|
+
- **数据**:房间存放在 `team_rooms` 存储域(SQLite 或 JSONL —— 零额外服务)。没有独立数据库,没有网络。
|
|
138
|
+
- **会话日志**:`team-room/fact` 事件在尊重该标记的宿主上以信封的 `ignorable: true` 标记追加(早于标记的宿主会被探测并跳过事实追加 —— 见 `allowUnmarkedFacts`);模型可见的房间投递是真实的 `user/message` 记录。
|
|
139
|
+
|
|
140
|
+
## 安全边界
|
|
141
|
+
|
|
142
|
+
- **需审批的交接。** `room_transfer_task` 走官方审批接缝;未组合审批服务或无人批准时 fail-closed —— 被拒时什么都不变。
|
|
143
|
+
- **模型可见 ⟺ 已记录。** 每条投递的房间消息都是成员自己日志中的持久 `user/message`;共享时间线以仅日志的 `team-room/fact` 事件镜像。房间消息绝不可能不记录就到达模型。
|
|
144
|
+
- **成员身份即授权边界。** 每个 `room_*` 工具都按调用会话自身的成员身份授权;非成员会收到稳定的拒绝,而不是部分写入。
|
|
145
|
+
- **保留窗口有界。** 总线、时间线与已完成任务的窗口在每次写入时强制执行,因此长期存活的房间不会无限增长。
|
|
146
|
+
- **无调度、无跨机器成员。** 成员是本部署的进程内会话。
|
|
147
|
+
|
|
148
|
+
## 跨生态入站(P2)
|
|
149
|
+
|
|
150
|
+
外部代理运行时 —— OpenAI Agents SDK、CrewAI 等 —— 可以通过一个极简的 **stdio 换行分隔 JSON-RPC 2.0 桥接** 发布到团队房间。这是 JSON-RPC 直连最小集,不是官方 ACP 线协议:完整 ACP 兼容要等上游接缝。
|
|
151
|
+
|
|
152
|
+
用两个 Config 字段启用,并把 `inbound.command` 指向一个在 stdout 上每行输出一条 JSON 通知的启动器:
|
|
153
|
+
|
|
154
|
+
```yaml
|
|
155
|
+
# cordis.yml(插件行)
|
|
156
|
+
inbound:
|
|
157
|
+
enabled: true
|
|
158
|
+
command: "python external_runtime.py --room <room-id>"
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
运行时会发出三类通知;`method` 是事件名,`params.name` 是外部 agent 的显示名:
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{"jsonrpc":"2.0","method":"agent_started","params":{"name":"researcher","room":"<room-id>","traceId":"t-1"}}
|
|
165
|
+
{"jsonrpc":"2.0","method":"agent_message","params":{"name":"researcher","room":"<room-id>","traceId":"t-1","message":"found the failing test"}}
|
|
166
|
+
{"jsonrpc":"2.0","method":"agent_finished","params":{"name":"researcher","room":"<room-id>","traceId":"t-1","status":"ok","usage":{"inputTokens":100,"outputTokens":40}}}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
每条都映射到房间已有的界面:`agent_started` 开一张任务板卡片,`agent_message` 往消息总线发帖,`agent_finished` 关闭卡片并发布结果。非法消息 fail-closed —— 直接丢弃并向 stdin 写回 JSON-RPC 错误。外部运行时不是 DSH 会话,因此由房间属主的成员会话充当发送者;没有属主成员的房间会丢弃该事件。启动与停止由插件 fiber 通过 disposer 持有;无法 spawn 的 `inbound.command` 退化为一条日志警告(桥接保持休眠,其余不受影响)。
|
|
170
|
+
|
|
171
|
+
## 已知限制
|
|
172
|
+
|
|
173
|
+
- 房间需要组合存储域;没有 `@deepseek-ai/dsh-storage-domain` 时,`/room` 命令与 `room_*` 工具不可用。
|
|
174
|
+
- 房间至少需要两个成员才有意义,成员名册受 `maxMembersPerRoom` 限制;成员身份按会话计,而不是按用户计。
|
|
175
|
+
- 没有跨机器成员:每个成员都是本部署的进程内会话。
|
|
176
|
+
- `room_transfer_task` 需要审批应答者。没有时会按设计 fail-closed,因此想要自动化交接的 profile 必须组合一个审批服务。
|
|
177
|
+
- 成本/用量核算不在这里(那属于后台代理半部);房间界面报告的是结构,不是开销。
|
|
178
|
+
|
|
179
|
+
## 开发
|
|
180
|
+
|
|
181
|
+
```sh
|
|
182
|
+
pnpm install # 仅工具链;harness 包解析到同级 checkout
|
|
183
|
+
pnpm run typecheck # 严格 TS,node + client 两个程序
|
|
184
|
+
pnpm test # vitest:单元、房间 hub、投影与 jsdom 面板测试
|
|
185
|
+
pnpm run build # lib/index.js(node 半部)+ lib/client.js(Web 客户端包)
|
|
186
|
+
pnpm run verify:artifacts && pnpm run check:readmes
|
|
187
|
+
pnpm run gen-aliases # checkout 移动后重新映射 harness 包路径
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
`pnpm run pack:smoke` 会构建、打包,并在设置了 `DSH_HARNESS_ROOT` 时把 tarball 安装进一次性 profile,断言组合后的行。
|
|
191
|
+
|
|
192
|
+
## 主题
|
|
193
|
+
|
|
194
|
+
`dsh`、`dsh-plugin`、`deepseek-harness`、`team-rooms`、`multi-agent`、`message-bus`、`task-board`、`collaboration`、`cross-session`
|
|
195
|
+
|
|
196
|
+
## 贡献者
|
|
197
|
+
|
|
198
|
+
- [@PerryLink](https://github.com/PerryLink) —— 创建者与维护者:团队房间 hub 及其写链、投递游标、`teamRoom` 投影、Web 设置页、文档、CI/CD 与发布。
|
|
199
|
+
|
|
200
|
+
## PerryLink DSH 插件家族
|
|
201
|
+
|
|
202
|
+
本项目是 [PerryLink](https://github.com/PerryLink) 维护的 [36 个 DeepSeek Harness 插件](https://github.com/PerryLink) 之一。如果这个对你有用,其他的多半也有用:
|
|
203
|
+
|
|
204
|
+
| 插件 | 一句话 |
|
|
205
|
+
|---|---|
|
|
206
|
+
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | 审批链上的第二模型自动复核,默认 fail-closed | |
|
|
207
|
+
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | DeepSeek Harness 的成本治理:预算、碳排与延迟一屏呈现 | |
|
|
208
|
+
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind 等价物:快照、会话分叉、一键还原 | |
|
|
209
|
+
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 把 Claude Code 的会话、记忆、技能与 CLAUDE.md 迁入 DSH | |
|
|
210
|
+
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | DeepSeek Harness 的跨平台原生桌面控制 —— Windows 优先 | |
|
|
211
|
+
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Web 输入框的终端式历史:方向键、Ctrl+R 搜索 | |
|
|
212
|
+
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 数据集质量检查与引用交叉核对 | |
|
|
213
|
+
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | DeepSeek Harness 的提示注入、越狱与密钥泄露防御 | |
|
|
214
|
+
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | 工程纪律守卫:需求拷问、测试门禁、对手复核 | |
|
|
215
|
+
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | DeepSeek Harness 的统一静态图像生成路由 | |
|
|
216
|
+
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | DeepSeek Harness 的只读性能诊断 | |
|
|
217
|
+
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | 中国公募基金确定性研究报告 | |
|
|
218
|
+
| **[dsh-github](https://github.com/PerryLink/dsh-github)** | DSH 的 GitHub PR/issue 集成,每次写入都需审批 | |
|
|
219
|
+
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | 行业研究编排,交付物经本插件的 `ctx.researchReport.assemble` 封存 | |
|
|
220
|
+
| **[dsh-library](https://github.com/PerryLink/dsh-library)** | DeepSeek Harness 的本地文档知识库 | |
|
|
221
|
+
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | DeepSeek Harness 的本地模型(Ollama)集成 | |
|
|
222
|
+
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | 基于语言服务器的 LSP 诊断、格式化、补全、代码操作与重命名 | |
|
|
223
|
+
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII 脱敏中间件:模型边界匿名化,展示层还原 | |
|
|
224
|
+
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | 只读 MCP 运行时面板:/mcp 命令 + 带状态、工具与错误的设置页 | |
|
|
225
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | 需审批的跨会话记忆:ctx.memory 接缝 + SQLite + memory 工具 | |
|
|
226
|
+
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | DeepSeek Harness 的 OpenTelemetry 与 Langfuse 可观测导出 | |
|
|
227
|
+
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles 等价的运行时风格切换 | |
|
|
228
|
+
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code 风格的声明式 allow/deny/ask 权限规则与审计 | |
|
|
229
|
+
| **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | 个人指令注入器,带顶栏开关(框架版) | |
|
|
230
|
+
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | 按需加载的插件开发知识库技能 | |
|
|
231
|
+
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 多渠道审批/提问桥:微信/Telegram/飞书,会话控制台 | |
|
|
232
|
+
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | 可验证的研究报告引擎:内容寻址证据账本与封存版本 | |
|
|
233
|
+
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | DeepSeek Harness 插件的多维质量评分 | |
|
|
234
|
+
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 在 Web 侧栏固定会话并保持持久顺序 | |
|
|
235
|
+
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | DeepSeek Harness 的跨设备会话同步 —— 会话存储的专用 git 镜像 | |
|
|
236
|
+
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | 安全审计技能包:密钥扫描、依赖与供应链复核 | |
|
|
237
|
+
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | DeepSeek Harness 的语音优先会话循环:说给它听,听它回答 | |
|
|
238
|
+
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | DeepSeek Harness 插件的隔离安装与冒烟测试驱动 | |
|
|
239
|
+
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/滴答清单任务桥:会话头部面板 + 11 个工具 | |
|
|
240
|
+
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | DeepSeek Harness 的厂商参数翻译与确定性 JSON 修复 | |
|
|
241
|
+
|
|
242
|
+
### 从 DSH Desktop 市场安装
|
|
243
|
+
|
|
244
|
+
所有 PerryLink 插件都能在内置的 DSH Desktop 市场中浏览:**Market → Sources → add source → 粘贴** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ 选中它**。安装仍会经过市场的 npm 身份校验与你的确认。
|
|
245
|
+
|
|
246
|
+
## 许可证
|
|
247
|
+
|
|
248
|
+
[Apache License 2.0](LICENSE) © 2026 dsh-team-rooms contributors
|
package/README.md
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🏠 dsh-team-rooms
|
|
4
|
+
- **1024 store channel**: `npm i -g dsh1024` once, then `dsh1024 plugin --profile web add dsh-team-rooms` (counts toward the [deepseek1024.com](https://deepseek1024.com) install ranking).
|
|
5
|
+
|
|
6
|
+
**Persistent, cross-session multi-agent team rooms for DeepSeek Harness — members, a message bus, a shared task board, and a shared timeline that survive restarts.**
|
|
7
|
+
|
|
8
|
+
*Each member is an independent DSH session; the room is the shared durable object between them.*
|
|
9
|
+
|
|
10
|
+
[](LICENSE)
|
|
11
|
+
[](https://github.com/topics/dsh-plugin)
|
|
12
|
+
[](#)
|
|
13
|
+
|
|
14
|
+
[English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
|
|
15
|
+
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
> **Extracted from [`dsh-background-agents`](https://github.com/PerryLink/dsh-background-agents) 0.9.6.** The background-agent half of that plugin (`background_agent` and the five `bg_*` tools) is superseded by DSH's native continuable subagents; the team-room half had no native equivalent and lives on here as its own package. Storage domains, session logs, and settings written by 0.9.6 keep working unchanged — see *Compatibility*.
|
|
21
|
+
|
|
22
|
+
## Compatibility
|
|
23
|
+
|
|
24
|
+
Host `0.1.2-alpha.2` and later fails closed on the session event vocabulary, so this plugin no longer writes its log-only fact events (`team-room/fact`) there: facts route to the logger/panel channel instead and the `teamRoom` projection degrades to an empty fold. Older rc lines (through `0.1.1-rc.2`) keep the ignorable-marker discipline. The client half rides the current client packages (`dsh-api-session-controller`, `dsh-client-ui-slots`, `dsh-client-ui-settings`, `dsh-client-locale`, `dsh-client-web`).
|
|
25
|
+
|
|
26
|
+
**Data compatibility with `dsh-background-agents` 0.9.6 is a hard rule.** These strings are byte-identical to 0.9.6 and must never be renamed: the storage domain `team_rooms`, the `teamRoom` projection key, the `team-room/fact` session event type, and the `team-rooms` settings-slot id. An existing profile therefore keeps its rooms, its member logs, and its settings page when you swap the plugin.
|
|
27
|
+
|
|
28
|
+
| Surface | Status |
|
|
29
|
+
|---|---|
|
|
30
|
+
| Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (GitHub tag, verified 2026-09-11; dev and runtime pins `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0`) |
|
|
31
|
+
| Node | `^22.19.0 \|\| >=24.0.0` |
|
|
32
|
+
| Platforms | All (host tools; the settings page needs the Web client half and the storage-domain capability) |
|
|
33
|
+
| Model | Any (rooms carry no model route — members are ordinary sessions) |
|
|
34
|
+
|
|
35
|
+
## What you get
|
|
36
|
+
|
|
37
|
+
`dsh-team-rooms` turns several independent sessions into one coordinated team:
|
|
38
|
+
|
|
39
|
+
1. **The `/room` command family** — `create`, `join`, `leave`, `list`, `send`, `tasks`, `task add|assign|claim|done|delete`. Rooms are named, owned, and addressed by a stable room id you can paste into another session.
|
|
40
|
+
2. **Eight `room_*` tools** — `room_list_rooms`, `room_post`, `room_read`, `room_list_tasks`, `room_create_task`, `room_claim_task`, `room_transfer_task`, `room_complete_task`. The model works the shared board and the bus from inside its own session; `room_transfer_task` asks for approval before a cross-member handoff.
|
|
41
|
+
3. **A durable room store** — members, the message bus (directed or broadcast), the task board, and the timeline live in the `team_rooms` storage domain (SQLite or JSONL backend — the deployment chooses; the plugin adds no service of its own) and recover across DSH restarts.
|
|
42
|
+
4. **A Web settings page** — the Team Rooms settings section shows member status, the task board, and the timeline of every room the current session belongs to, read from the `teamRoom` session projection and written back through the host `/room` command.
|
|
43
|
+
|
|
44
|
+
## Quick start
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
# 1. install the bundle into your profile
|
|
48
|
+
dsh plugin --profile web add "github:PerryLink/dsh-team-rooms#main"
|
|
49
|
+
|
|
50
|
+
# or from npm (published releases)
|
|
51
|
+
dsh plugin --profile web add dsh-team-rooms
|
|
52
|
+
|
|
53
|
+
# 2. restart and verify the row
|
|
54
|
+
dsh --profile web --dump-config | grep -A4 'id: team-rooms'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The bundle patch carries the plugin row; no Config key is required. The repo commits its build output (`lib/`), so git installs need no build step. Rooms mount wherever the storage domain is composed (`@deepseek-ai/dsh-storage-domain`, part of every `@deepseek-ai/dsh-base` profile); without it the `/room` command and the `room_*` tools stay dormant while everything else still loads.
|
|
58
|
+
|
|
59
|
+
Then, inside any session:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
/room create release-prep
|
|
63
|
+
/room send <roomId> kickoff: I own the changelog, who takes the docs?
|
|
64
|
+
/room task add <roomId> draft the migration note
|
|
65
|
+
/room task claim <roomId> <taskId>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Paste the printed room id into another session and `/room join <roomId>` — that session is now a member, receives room deliveries as ordinary messages, and sees the same board.
|
|
69
|
+
|
|
70
|
+
## Install & uninstall
|
|
71
|
+
|
|
72
|
+
- **git channel** (latest `main`): `dsh plugin --profile web add "github:PerryLink/dsh-team-rooms#main"` — committed `lib/`, no `prepare` or `allowBuilds` step.
|
|
73
|
+
- **npm channel** (published releases): `dsh plugin --profile web add dsh-team-rooms`.
|
|
74
|
+
- **tarball channel**: `pnpm pack` in this repo, then `dsh plugin --profile web add ./dsh-team-rooms-<version>.tgz`.
|
|
75
|
+
- **uninstall**: `dsh plugin --profile web remove dsh-team-rooms` (or remove the row from the profile patch). Your rooms stay in the `team_rooms` storage domain and come back if you reinstall.
|
|
76
|
+
- ⚠️ **Do not mount this and `dsh-background-agents` at the same time.** While the deprecation window is open both packages are published, and both register the same eight `room_*` tools, the same `settings.section` slot id (`team-rooms`) and the same `team_rooms` storage domain — so the two room halves collide. If you already run `dsh-background-agents`, remove it first (`dsh plugin --profile web remove dsh-background-agents`). Your rooms survive either way: they live in the storage domain, not in the plugin.
|
|
77
|
+
|
|
78
|
+
## Configuration
|
|
79
|
+
|
|
80
|
+
Every tunable is a validated Schemastery `Config` field — change it in cordis.yml, never in code. Nothing is required.
|
|
81
|
+
|
|
82
|
+
| Key | Default | Meaning |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| `maxRooms` | `16` | Hard cap on team rooms across the profile |
|
|
85
|
+
| `maxMembersPerRoom` | `8` | Hard cap on members per room (`>= 2`) |
|
|
86
|
+
| `maxRoomsPerMember` | `4` | Hard cap on rooms one member session may join |
|
|
87
|
+
| `busRetention` | `200` | Bus messages kept per room |
|
|
88
|
+
| `timelineRetention` | `500` | Timeline events kept per room |
|
|
89
|
+
| `taskRetention` | `50` | Completed tasks kept per room |
|
|
90
|
+
| `maxMessageChars` | `4000` | Hard cap on one room message's text (rejected above, never truncated) |
|
|
91
|
+
| `injectRoomBrief` | `true` | Inject the short room brief into member sessions (join + resume) |
|
|
92
|
+
| `roomOpenTimeoutMs` | `15000` | How long the `team_rooms` storage-domain open may take before every room operation fails loud (`store-unavailable`) instead of hanging |
|
|
93
|
+
| `allowUnmarkedFacts` | `false` | Force log-only `team-room/fact` events on hosts that drop the `ignorable` marker (dangerous: unmarked facts make sessions unresumable elsewhere); default is detect-and-skip |
|
|
94
|
+
| `inbound.enabled` | `false` | Enable the stdio JSON-RPC inbound bridge for external agent runtimes (OpenAI Agents SDK / CrewAI). Disabled by default (fail-closed). |
|
|
95
|
+
| `inbound.command` | *(none)* | External runtime launch command; when enabled and present, the plugin spawns it and listens for newline-delimited JSON-RPC notifications. Absent/unspawnable = the bridge stays dormant (logged). |
|
|
96
|
+
|
|
97
|
+
## Tools & surfaces
|
|
98
|
+
|
|
99
|
+
| Surface | Kind | Notes |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| `/room` | command | `create\|join\|leave\|list\|send\|tasks\|task add\|assign\|claim\|done\|delete` |
|
|
102
|
+
| `room_list_rooms` | tool | Every room this session belongs to: ids, names, rosters, task counts |
|
|
103
|
+
| `room_post` | tool | Post to the bus (broadcast, or directed with `to`) |
|
|
104
|
+
| `room_read` | tool | Read the bus history of one room, from a seq cursor |
|
|
105
|
+
| `room_list_tasks` | tool | The shared task board of one room |
|
|
106
|
+
| `room_create_task` | tool | Add a board row (optionally assigned) |
|
|
107
|
+
| `room_claim_task` | tool | Claim a row for this session (assignee + in-progress) |
|
|
108
|
+
| `room_transfer_task` | tool | Hand a row to another member — **approval-gated**, fails closed |
|
|
109
|
+
| `room_complete_task` | tool | Mark a row `done` |
|
|
110
|
+
| `teamRoom` projection | session projection | The room view folded from `team-room/fact` events in this member's own log |
|
|
111
|
+
| Web settings page | client | Member status, the task board, the timeline, and the room actions; slot id `team-rooms` |
|
|
112
|
+
|
|
113
|
+
That is **eight** `room_*` tools, all registered once the storage domain is composed.
|
|
114
|
+
|
|
115
|
+
## How it works — and why it survives restarts
|
|
116
|
+
|
|
117
|
+
The room store is the cross-session authority; the session projection is each member's own reconstructed copy. Two writes run at once and stay consistent:
|
|
118
|
+
|
|
119
|
+
- **Every room mutation** (create, join, leave, post, task transitions) queues on ONE hub write chain — the `team_rooms` domain's single write chain is the ordering authority, so concurrent posters can never interleave a read-modify-write and bus seqs mint strictly in commit order.
|
|
120
|
+
- **Model-visible ⟺ recorded**: a delivered room message is an official inbox delivery (`agent.followup` wakes a live member; `agent.inject` hands an offline member its backlog on the next start), so it lands as a durable `user/message` in that member's own session log.
|
|
121
|
+
- **The shared timeline** mirrors into every member's log as log-only `team-room/fact` events carrying the canonical store `timelineSeq`; the `teamRoom` projection folds each member's own log, so the view reconstructs on every reopen without reading the store.
|
|
122
|
+
- **Delivery is at-least-once and ordered**: per-member cursors (`lastDeliveredSeq`, `lastFactSeq`) advance only after a delivery lands, so a crash between commit and delivery re-delivers on catch-up rather than losing the message.
|
|
123
|
+
|
|
124
|
+
Hosts whose `Session.append` predates the `ignorable` marker (every released rc line through `0.1.0-rc.8` and the `0.1.1-rc.2` line, and the `0.1.2-rc` line, which keeps the envelope field for stored-log read compatibility only) are detected before the first append (peer-version pre-check, then a probe of the returned envelope) and fact appends are skipped with a one-time warning: the durable store, the API surfaces, and the model-visible deliveries keep working, and `teamRoom` degrades to an empty fold. `allowUnmarkedFacts: true` opts back in — deliberately dangerous.
|
|
125
|
+
|
|
126
|
+
## Not this plugin
|
|
127
|
+
|
|
128
|
+
| Project | What it does | The boundary |
|
|
129
|
+
|---|---|---|
|
|
130
|
+
| [titanwings/dsh-automation](https://github.com/titanwings/dsh-automation) | Scheduled coding tasks in fresh agent sessions | It owns **when** tasks run (scheduling). This plugin owns the **shared object** several sessions work on — no scheduler seam, no cron. |
|
|
131
|
+
| [YYTbit/dsh-plugin-agent-dashboard](https://github.com/YYTbit/dsh-plugin-agent-dashboard) | Multi-agent dashboard skill | Display-oriented and read-mostly. This plugin's rooms are **writable coordination state**: a bus, a board, and approval-gated handoffs, persisted in the harness's own storage. |
|
|
132
|
+
| `dsh-background-agents` | Background agents plus (previously) team rooms | That package's `bg_*` half is superseded by DSH's native continuable subagents; its room half is this package. Do not mount both room halves at once. |
|
|
133
|
+
|
|
134
|
+
## Permissions & data
|
|
135
|
+
|
|
136
|
+
- **Permissions**: the workshop manifest declares `session:append` and `tools:register`. Rooms never spawn a subagent, so the plugin asks for no `subagent:*` permission and declares no subagent dependency.
|
|
137
|
+
- **Data**: rooms live in the `team_rooms` storage domain (SQLite or JSONL — zero extra services). No separate database, no network.
|
|
138
|
+
- **Session log**: `team-room/fact` events are appended with the envelope's `ignorable: true` marker on hosts that honor it (pre-marker hosts are detected and fact appends are skipped — see `allowUnmarkedFacts`); the model-visible room deliveries are real `user/message` records.
|
|
139
|
+
|
|
140
|
+
## Security boundaries
|
|
141
|
+
|
|
142
|
+
- **Approval-gated handoffs.** `room_transfer_task` routes through the official approval seam and fails closed when no approval service is composed or no answerer grants it — nothing changes on a refusal.
|
|
143
|
+
- **Model-visible ⟺ logged.** Every delivered room message is a durable `user/message` in the member's own log; the shared timeline mirrors as log-only `team-room/fact` events. A room message can never reach a model without being recorded.
|
|
144
|
+
- **Membership is the authorization boundary.** Every `room_*` tool authorizes against the calling session's own membership; a non-member gets a stable rejection, not a partial write.
|
|
145
|
+
- **Retention is bounded.** Bus, timeline, and done-task windows are enforced on every write, so a long-lived room cannot grow without limit.
|
|
146
|
+
- **No scheduling, no cross-machine members.** A member is a process-local session of this deployment.
|
|
147
|
+
|
|
148
|
+
## Cross-ecosystem inbound (P2)
|
|
149
|
+
|
|
150
|
+
External agent runtimes — OpenAI Agents SDK, CrewAI, and similar — can publish into a team room through a minimal **newline-delimited JSON-RPC 2.0 bridge over stdio**. This is a JSON-RPC direct-connect minimal set, not the official ACP wire protocol: full ACP compatibility waits for the upstream seam.
|
|
151
|
+
|
|
152
|
+
Enable it with two Config fields and point `inbound.command` at a launcher that emits one JSON notification per line on stdout:
|
|
153
|
+
|
|
154
|
+
```yaml
|
|
155
|
+
# cordis.yml (plugin row)
|
|
156
|
+
inbound:
|
|
157
|
+
enabled: true
|
|
158
|
+
command: "python external_runtime.py --room <room-id>"
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The runtime emits three notification kinds; `method` is the event name and `params.name` is the external agent's display name:
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{"jsonrpc":"2.0","method":"agent_started","params":{"name":"researcher","room":"<room-id>","traceId":"t-1"}}
|
|
165
|
+
{"jsonrpc":"2.0","method":"agent_message","params":{"name":"researcher","room":"<room-id>","traceId":"t-1","message":"found the failing test"}}
|
|
166
|
+
{"jsonrpc":"2.0","method":"agent_finished","params":{"name":"researcher","room":"<room-id>","traceId":"t-1","status":"ok","usage":{"inputTokens":100,"outputTokens":40}}}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Each maps onto the room's existing surfaces: `agent_started` opens a task-board card, `agent_message` posts to the message bus, and `agent_finished` completes the card and posts the outcome. Invalid messages fail closed — they are dropped and a JSON-RPC error is written back. External runtimes are not DSH sessions, so the room owner's member session stands in as the sender; a room with no owner member drops the event. Start and stop are owned by the plugin fiber through a disposer; an unspawnable `inbound.command` degrades to a logged warning (the bridge stays dormant, nothing else is affected).
|
|
170
|
+
|
|
171
|
+
## Known limitations
|
|
172
|
+
|
|
173
|
+
- Rooms require the storage domain to be composed; without `@deepseek-ai/dsh-storage-domain`, the `/room` command and the `room_*` tools are disabled.
|
|
174
|
+
- A room needs at least two members to be interesting, and the roster is bounded by `maxMembersPerRoom`; membership is per session, not per user.
|
|
175
|
+
- There is no cross-machine membership: every member is a process-local session of this deployment.
|
|
176
|
+
- `room_transfer_task` needs an approval answerer. Without one it fails closed by design, so automated profiles that want handoffs must compose an approval service.
|
|
177
|
+
- Cost/usage accounting is out of scope here (that lived in the background-agent half); the room surfaces report structure, not spend.
|
|
178
|
+
|
|
179
|
+
## Development
|
|
180
|
+
|
|
181
|
+
```sh
|
|
182
|
+
pnpm install # tooling only; harness packages resolve against a sibling checkout
|
|
183
|
+
pnpm run typecheck # strict TS, node + client programs
|
|
184
|
+
pnpm test # vitest: unit, room-hub, projection, and jsdom panel tests
|
|
185
|
+
pnpm run build # lib/index.js (node half) + lib/client.js (web client bundle)
|
|
186
|
+
pnpm run verify:artifacts && pnpm run check:readmes
|
|
187
|
+
pnpm run gen-aliases # re-map harness package paths after the checkout moves
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
`pnpm run pack:smoke` builds, packs, and (with `DSH_HARNESS_ROOT` set) installs the tarball into a throwaway profile to assert the composed row.
|
|
191
|
+
|
|
192
|
+
## Topics
|
|
193
|
+
|
|
194
|
+
`dsh`, `dsh-plugin`, `deepseek-harness`, `team-rooms`, `multi-agent`, `message-bus`, `task-board`, `collaboration`, `cross-session`
|
|
195
|
+
|
|
196
|
+
## Contributors
|
|
197
|
+
|
|
198
|
+
- [@PerryLink](https://github.com/PerryLink) — creator and maintainer: the team-room hub and its write chain, the delivery cursors, the `teamRoom` projection, the Web settings page, docs, CI/CD and releases.
|
|
199
|
+
|
|
200
|
+
## PerryLink DSH Plugin Family
|
|
201
|
+
|
|
202
|
+
This project is one of the [36 DeepSeek Harness plugins](https://github.com/PerryLink) maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
|
|
203
|
+
|
|
204
|
+
| Plugin | One-liner |
|
|
205
|
+
|---|---|
|
|
206
|
+
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
|
|
207
|
+
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
|
|
208
|
+
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore | |
|
|
209
|
+
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH | |
|
|
210
|
+
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
|
|
211
|
+
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
|
|
212
|
+
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here) | |
|
|
213
|
+
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | |
|
|
214
|
+
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard: requirements grill, test gates, adversary review | |
|
|
215
|
+
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | |
|
|
216
|
+
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Read-only performance diagnostics for DeepSeek Harness. | |
|
|
217
|
+
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Deterministic research reports for Chinese public mutual funds | |
|
|
218
|
+
| **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issues integration for DSH, every write gated by approval | |
|
|
219
|
+
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry research orchestration that seals its deliverables through this plugin's `ctx.researchReport.assemble` | |
|
|
220
|
+
| **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base for DeepSeek Harness. | |
|
|
221
|
+
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local-model (Ollama) integration for DeepSeek Harness. | |
|
|
222
|
+
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions and rename over language servers | |
|
|
223
|
+
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking middleware: anonymize at the model boundary, restore at the display layer | |
|
|
224
|
+
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors | |
|
|
225
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool | |
|
|
226
|
+
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse observability exporter for DeepSeek Harness. | |
|
|
227
|
+
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching | |
|
|
228
|
+
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
|
|
229
|
+
| **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Personal directive injector with top-bar toggle (framework edition) | |
|
|
230
|
+
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
|
|
231
|
+
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console | |
|
|
232
|
+
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
|
|
233
|
+
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
|
|
234
|
+
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | |
|
|
235
|
+
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store. | |
|
|
236
|
+
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack: secret scan, dependency and supply-chain review | |
|
|
237
|
+
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop for DeepSeek Harness: talk to it, hear it answer. | |
|
|
238
|
+
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
|
|
239
|
+
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools |
|
|
240
|
+
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
|
|
241
|
+
|
|
242
|
+
### Install from the DSH Desktop Market
|
|
243
|
+
|
|
244
|
+
All PerryLink plugins are browsable in the built-in DSH Desktop Market: **Market → Sources → add source → paste** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ select it**. Installation still goes through the Market's npm-identity verification and your confirmation.
|
|
245
|
+
|
|
246
|
+
## License
|
|
247
|
+
|
|
248
|
+
[Apache License 2.0](LICENSE) © 2026 dsh-team-rooms contributors
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Third-Party Notices
|
|
2
|
+
|
|
3
|
+
`dsh-background-agents` is licensed under the Apache License 2.0 ([LICENSE](./LICENSE)).
|
|
4
|
+
It ships with the following third-party software:
|
|
5
|
+
|
|
6
|
+
## zod
|
|
7
|
+
|
|
8
|
+
- Source: https://github.com/colinhacks/zod
|
|
9
|
+
- License: MIT
|
|
10
|
+
- Copyright (c) 2020 Colin McDonnell
|
|
11
|
+
|
|
12
|
+
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
> of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
> in the Software without restriction, including without limitation the rights
|
|
15
|
+
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
> copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
> furnished to do so, subject to the following conditions:
|
|
18
|
+
>
|
|
19
|
+
> The above copyright notice and this permission notice shall be included in
|
|
20
|
+
> all copies or substantial portions of the Software.
|
|
21
|
+
>
|
|
22
|
+
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
28
|
+
> THE SOFTWARE.
|
|
29
|
+
|
|
30
|
+
zod is bundled (inlined) into both the node half (`lib/index.js`) and the
|
|
31
|
+
client bundle (`lib/client.js`).
|
|
32
|
+
|
|
33
|
+
## Development-only tooling
|
|
34
|
+
|
|
35
|
+
The following are used only to build and test this repository and are not
|
|
36
|
+
part of the shipped artifacts: TypeScript (Apache-2.0), tsdown (MIT),
|
|
37
|
+
vitest (MIT), lightningcss (MPL-2.0), and the `@types/*` stubs (MIT).
|
|
38
|
+
The test suite's scripted LLM adapter (`tests/mock-adapter.ts`) follows the
|
|
39
|
+
pattern of DeepSeek Harness's own agent-loop test adapter
|
|
40
|
+
(`packages/core/agent-loop/tests/mock-adapter.ts`), used under the same
|
|
41
|
+
Apache-2.0 terms as the harness.
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# dsh-team-rooms bundle patch: mount the persistent team-room plugin.
|
|
2
|
+
#
|
|
3
|
+
# Rooms persist through the harness's storage domain (SQLite or JSONL backend
|
|
4
|
+
# — the deployment chooses; zero extra services). Every shipped profile
|
|
5
|
+
# (web/headless/sdk/acp) composes the storage stack (storage + storage-json +
|
|
6
|
+
# storage-domain) through the dsh-base bundle, so the patch must NOT insert
|
|
7
|
+
# those rows again: a same-id insert makes the profile refuse to boot
|
|
8
|
+
# (`duplicate loader entry id: storage`). The patch mounts only the plugin row;
|
|
9
|
+
# a bare profile without dsh-base composes the storage stack itself, and until
|
|
10
|
+
# it does the room_* tools plus the /room command stay dormant.
|
|
11
|
+
#
|
|
12
|
+
# There is deliberately NO `provider` key here: that key belongs to
|
|
13
|
+
# dsh-background-agents (it named the subagent provider its `background_agent`
|
|
14
|
+
# tool started children with), and team rooms never spawn a subagent. Rooms
|
|
15
|
+
# deliver through the official agent inbox instead.
|
|
16
|
+
#
|
|
17
|
+
# Configure the room limits per profile by overriding the `team-rooms` row.
|
|
18
|
+
#
|
|
19
|
+
# Install (lib/ is committed, so no build step or allowBuilds is needed):
|
|
20
|
+
# dsh plugin --profile <name> add "github:PerryLink/dsh-team-rooms#v1.0.0"
|
|
21
|
+
- insert:
|
|
22
|
+
- id: team-rooms
|
|
23
|
+
name: dsh-team-rooms
|
|
24
|
+
config:
|
|
25
|
+
# ── room policy (schema defaults shown for reference) ──────────────
|
|
26
|
+
# maxRooms: 16 # hard cap on rooms across the profile
|
|
27
|
+
# maxMembersPerRoom: 8 # hard cap on members per room
|
|
28
|
+
# maxRoomsPerMember: 4 # hard cap on rooms one session may join
|
|
29
|
+
# busRetention: 200 # bus messages kept per room (retention window)
|
|
30
|
+
# timelineRetention: 500 # timeline events kept per room
|
|
31
|
+
# taskRetention: 50 # completed tasks kept per room
|
|
32
|
+
# maxMessageChars: 4000 # hard cap on one message's text
|
|
33
|
+
# injectRoomBrief: true # one-line role statement brief on join/resume
|
|
34
|
+
# roomOpenTimeoutMs: 15000 # store-open deadline before store-unavailable
|