cs-bots 0.7.5 → 0.9.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/CHANGELOG.md +294 -0
- package/README.md +47 -174
- package/docs/01-/346/236/266/346/236/204/346/226/207/346/241/243.md +14 -13
- package/docs/02-/351/234/200/346/261/202/350/247/204/346/240/274/344/271/246.md +3 -3
- package/docs/03-/350/257/246/347/273/206/350/256/276/350/256/241.md +3 -3
- package/docs/04-/346/223/215/344/275/234/346/211/213/345/206/214.md +2 -2
- package/docs/CONTRACT-/345/215/207/347/272/24709-Boss/344/275/223/351/252/214.md +280 -0
- package/docs//345/215/207/347/272/24708-/346/216/245/347/273/255/344/270/216/345/233/236/346/273/232.md +298 -0
- package/package.json +2 -2
- package/src/api.js +1105 -8
- package/src/board.js +104 -11
- package/src/client.js +731 -96
- package/src/dispatcher.js +70 -11
- package/src/index.js +8 -1
- package/src/kernel.js +15 -0
- package/src/room.js +160 -9
- package/src/roster.js +54 -0
- package/src/settings.js +2 -2
- package/src/teams.js +386 -4
- package/src/tools.js +124 -3
package/CHANGELOG.md
CHANGED
|
@@ -13,6 +13,300 @@
|
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
+
## [0.9.0] - 2026-11-11
|
|
17
|
+
|
|
18
|
+
> 第 1 批 = 定向唤醒 / kind 字段 / attachRoom(止血)
|
|
19
|
+
> 第 2 批 = `bot_team_route` 跨团队路由 / 环路防护 / 指标埋点 / 文档校验(补欠账)
|
|
20
|
+
|
|
21
|
+
### Added · 第 2 批:跨团队桥本体 `bot_team_route`
|
|
22
|
+
|
|
23
|
+
**这是「大团队 = 跨团队桥」的第一块实体。** 此前 42 个工具里**没有任何一个**
|
|
24
|
+
能让 Bot 表达「我要找另一个团队」—— 桥是断的。
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
bot_team_route({ fromTeam?, toTeam?, toBot?, taskId, text, hop? })
|
|
28
|
+
// 成功: { ok:true, decision:'delivered', to:{kind:'team',id,leadId,name}, hop, wake }
|
|
29
|
+
// 被拒: { ok:false, decision:'refused', reason:'ROUTE_HOP_EXCEEDED'|... }
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
三条设计约束:
|
|
33
|
+
1. **只唤醒对方 `leadId`**,不唤醒全部成员(测试断言 `delivered.length === 1`)
|
|
34
|
+
2. **先落 route 事件再投递**(intent-first)——「记了没投」可重试;「投了没记」会绕过环路统计
|
|
35
|
+
3. 失败一律返回可读 `refused + reason`,**绝不静默**
|
|
36
|
+
|
|
37
|
+
**为什么 `toBot` 在 cs-bots 团队里找,不去 DSH 原生 `agentTeam` 找**:
|
|
38
|
+
实测 `grep -n "agentTeam|TeamId" src/teams.js` → 除新代码外**零命中**。
|
|
39
|
+
`teams.jsonl` 存 `{id, name, leadId, type, kind, members}`,而原生 team 是 `teamId = root.id`——
|
|
40
|
+
**两套人模型无 id 交集**。混用恰恰是 Boss 这次要区分的那个错误。
|
|
41
|
+
|
|
42
|
+
### Added · 环路防护(两道闸)
|
|
43
|
+
|
|
44
|
+
1. `hop > 3` ⇒ `ROUTE_HOP_EXCEEDED`(实测 hop 0–3 放行,hop 4 拒绝)
|
|
45
|
+
2. **复用 dispatcher 的 `dedupKey`**(没另造一套):键 = `route:<from>:<to>:<taskId>`,
|
|
46
|
+
**刻意不含 hop** —— 这样 A→B(hop0) 与 A→B(hop2) 是同一个键,
|
|
47
|
+
dispatcher 的 `IdempotencySet` 判 `dedup-hit`,第 3 跳自然被拦。
|
|
48
|
+
|
|
49
|
+
> 为什么不把 hop 放进键:放进去就"每一跳都是新消息",去重永远命不中,环路防护形同虚设。
|
|
50
|
+
|
|
51
|
+
### Fixed · route 审计记录重启后全丢(真 bug)
|
|
52
|
+
|
|
53
|
+
`hydrate()` 里 `if (!ev || typeof ev.id !== 'string')` 把 route 事件当残缺数据跳过 ——
|
|
54
|
+
**但 route 事件本来就没有 `id`**(它不改团队实体,只是审计记录)。
|
|
55
|
+
|
|
56
|
+
后果:`listRoutes` 重启后返回 0 条,而**环路防护和成本核算都依赖这份历史** —— 等于失效。
|
|
57
|
+
修法:回放时对 `action === 'route'` 单独放行。
|
|
58
|
+
|
|
59
|
+
### Added · 指标埋点补全(欠账2)
|
|
60
|
+
|
|
61
|
+
**之前 256 条 metrics 全是 `turn_end`** —— 因为只有 `index.js` 在回合结束自动记,
|
|
62
|
+
认领/完成/验收这些**真正该测的动作从没被记过**。PDCA 页面因此看不到验收通过率。
|
|
63
|
+
|
|
64
|
+
修法:在 `commit()` 埋点(**所有状态变更的唯一出口**,埋这里才不会漏):
|
|
65
|
+
| board 动作 | 指标 kind |
|
|
66
|
+
|---|---|
|
|
67
|
+
| `claim` | `task_claim` |
|
|
68
|
+
| `complete` | `task_complete` |
|
|
69
|
+
| `block` | `task_blocked` |
|
|
70
|
+
| `accept(pass)` | `accept_pass` |
|
|
71
|
+
| `accept(reject)` | `accept_reject` |
|
|
72
|
+
|
|
73
|
+
**装配顺序坑**:`index.js` 里 board 在 L130 装配、metrics 在 L276 装配。
|
|
74
|
+
若只接受实例,board 装配时 metrics 还是 undefined ⇒ 埋点永久静默失效。
|
|
75
|
+
⇒ 改成接受**取值函数** `metrics: () => services.metrics`,规避顺序耦合。
|
|
76
|
+
|
|
77
|
+
**纪律**:埋点全包在 `try{}catch{}` 里 —— 指标是旁路,**绝不能**让业务动作失败。
|
|
78
|
+
|
|
79
|
+
### Added · 文档一致性校验(欠账3)
|
|
80
|
+
|
|
81
|
+
`test/docs-consistency.test.mjs`(5 项,随 `run-all.sh` 自动跑):
|
|
82
|
+
① 主文档版本声明 == `package.json` version
|
|
83
|
+
② 文档里的「NNN 项测试」不得低于基线
|
|
84
|
+
③ 文档里的工具数 == `TOOL_NAMES.length`
|
|
85
|
+
④ 历史快照必须保留「勿引用/已过期」标记
|
|
86
|
+
⑤ `reports/` 交付报告必须存在
|
|
87
|
+
|
|
88
|
+
**它上线当天就抓出真失真**:
|
|
89
|
+
```
|
|
90
|
+
docs/02-03-04 声明 v0.7.3,实际 0.8.0
|
|
91
|
+
5 处写 1108 项测试,实际 1263
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**刻意不做的事**:
|
|
95
|
+
- 不改历史叙述(`01-架构文档.md` 里「0.7.3 已部署重启」是当时事实,改写就是伪造历史)
|
|
96
|
+
- 不校验 CHANGELOG(它本来就按版本分段记历史)
|
|
97
|
+
- 测试数用**下限**而非精确相等(否则每加一个用例就红一次,最后会被人 disable —— 比没有还糟)
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## [Unreleased] - bots04 第 1 批「止血」
|
|
102
|
+
|
|
103
|
+
大团队语义澄清后的第一批落地。**核心是止血**:修掉一个已经在烧 token 的实测缺陷。
|
|
104
|
+
|
|
105
|
+
### Fixed · 唤醒风暴(实测已在烧钱)
|
|
106
|
+
|
|
107
|
+
**改造前实测**(`~/.dsh/cs-bots/wakes.jsonl`):
|
|
108
|
+
```
|
|
109
|
+
room-msg:m-1:ui → failed ← 居然去唤醒 Boss 自己
|
|
110
|
+
room-msg:m-1:bot-6b65… → failed
|
|
111
|
+
room-msg:m-1:bot-df1c… → failed
|
|
112
|
+
```
|
|
113
|
+
一条房间消息 = 3 次唤醒尝试,**3 次全失败**。
|
|
114
|
+
|
|
115
|
+
**两个根因**:
|
|
116
|
+
1. `relay` 的 `targets` 缺省 = 「除发送者外全部成员」⇒ 一条消息 N 个成员 = N 次模型调用;
|
|
117
|
+
2. 人类身份(`ui`/`user`/`person`)被当成普通成员 ⇒ **去唤醒人**,这没有任何意义。
|
|
118
|
+
|
|
119
|
+
**修法**(`src/room.js`):
|
|
120
|
+
- `DEFAULT_SETTINGS` 新增 `mentionOnly: true` —— **缺省安静**,要广播必须显式打开
|
|
121
|
+
- 新增 `HUMAN_IDS` + `isHumanId()`,**任何模式**下 human id 都不被唤醒
|
|
122
|
+
- `relay()` 重写为四档 `targetSource`:
|
|
123
|
+
| 档 | 行为 |
|
|
124
|
+
|---|---|
|
|
125
|
+
| `explicit` | 显式 targets 原样;混入 human 剔除 + warn |
|
|
126
|
+
| `mention` | @ 到谁只唤醒谁 |
|
|
127
|
+
| `mention-only-no-target` | **没 @ ⇒ `relayed:0` 且不抛错**(止血核心) |
|
|
128
|
+
| `broadcast` | `mentionOnly:false` 才回退全员,且仍排除 human |
|
|
129
|
+
|
|
130
|
+
**为什么缺省是 `true` 而不是 `false`**:安全的默认值必须落在「少打扰」这一侧。
|
|
131
|
+
要广播是少数场景,让它多打一次字,比让每条消息都烧 N 次调用更划算。
|
|
132
|
+
|
|
133
|
+
### Added · 团队归属标识 `kind`
|
|
134
|
+
|
|
135
|
+
`teams.jsonl` 新增 `kind: 'human' | 'agent'`:
|
|
136
|
+
- `by ∈ {ui, user, person}` ⇒ **强制 `'human'`**
|
|
137
|
+
- 其他 ⇒ **强制 `'agent'`**
|
|
138
|
+
- 显式传入与推导矛盾 ⇒ **抛 `TEAM_KIND_MISMATCH`**
|
|
139
|
+
|
|
140
|
+
**为什么必须服务层强制推导、不信任入参**:`createdBy` 是可冒用的字符串。
|
|
141
|
+
Bot 传 `by:'ui'` 就能自称「Boss 建的团队」—— 那两个方向的伪造都得拦:
|
|
142
|
+
Bot 谎称 Boss 建(骗信任)、Boss 谎称 Bot 建(掩盖归属)。
|
|
143
|
+
|
|
144
|
+
**与 `type(big|small)` 的关系**:`type` 保留但**降级为规模提示**,不再承载「谁建的」语义。
|
|
145
|
+
历史数据缺 `kind` ⇒ 前端按 `createdBy` 兜底,不显示 undefined。
|
|
146
|
+
|
|
147
|
+
UI 徽标:**`👤 Boss建设`** / **`🤖 智能体建设`**。
|
|
148
|
+
> 文案纪律:**不用「人建」**(Boss:「不太好听」)。连注释里也不许出现。
|
|
149
|
+
|
|
150
|
+
### Fixed · 桥断了:`bot_teams_add` 不建房间
|
|
151
|
+
|
|
152
|
+
`attachRoom` 只在 API 层(`src/api.js:1555`)有,**工具层没有** ⇒
|
|
153
|
+
智能体用 `bot_teams_add` 加人后团队与房间脱钩,**跨团队消息发不出去**。
|
|
154
|
+
这是「大团队这座桥是断的」的直接原因。
|
|
155
|
+
|
|
156
|
+
**修法**(`src/tools.js`):加成员后若 `team.roomId` 存在则自动 `room.join`;
|
|
157
|
+
失败**不阻断**团队编辑,返回 `{ok:true, team, roomError}` 留痕。
|
|
158
|
+
|
|
159
|
+
**过程教训**:初版在工具 `run` 里调 `warn(...)`,但 `warn` 只是 `installTools` 的**形参**、
|
|
160
|
+
不在工具闭包作用域内 ⇒ `ReferenceError: warn is not defined` 导致工具整体失败。
|
|
161
|
+
工具闭包里只能拿到 `ctx`,拿不到安装期的形参。
|
|
162
|
+
|
|
163
|
+
### Added · 测试(+22,基线 1241 → 1263)
|
|
164
|
+
|
|
165
|
+
| 文件 | 新增 |
|
|
166
|
+
|---|---|
|
|
167
|
+
| `test/room.test.mjs` | +6(mention 定向、无 @ 静默、human 排除、显式 targets 剔除、settings 白名单、回放持久) |
|
|
168
|
+
| `test/teams.test.mjs` | +5(Boss⇒human、Bot⇒agent、矛盾抛错、事件流持久、与 type 并存) |
|
|
169
|
+
| `test/tools.test.mjs` | +3(自动入房、无房间不报错、join 失败不阻断) |
|
|
170
|
+
| `test/client-t38.test.mjs` | 新增 7 项(徽标文案、不置灰、@ 提示) |
|
|
171
|
+
|
|
172
|
+
**变异验证**(确认断言不是摆设):
|
|
173
|
+
| 变异 | 结果 |
|
|
174
|
+
|---|---|
|
|
175
|
+
| `mentionOnly: true` → `false` | 5 用例转红 |
|
|
176
|
+
| `derivedKind` 硬编码 `'agent'` | 4 用例转红 |
|
|
177
|
+
| 关掉 auto-attach 分支 | 2 用例转红 |
|
|
178
|
+
|
|
179
|
+
### 认知纠正(记录在案,避免后人重踩)
|
|
180
|
+
|
|
181
|
+
旧调研 `design/大团队-可行性调研-v1.md`(11-06)把大团队定位成「组织层 / 聚合视图」,
|
|
182
|
+
**这个定位错了**。Boss 2026-11-11 正式澄清:大团队是**跨团队沟通的桥梁**(路由层)。
|
|
183
|
+
|
|
184
|
+
> **小团队是「谁干活」,大团队是「谁跟谁说话」。**
|
|
185
|
+
|
|
186
|
+
另外调研里「小团队:Lead 自动 spawn,人不进去」也**不准确** ——
|
|
187
|
+
官方 `dsh-experimental-client-ui-agent-team/README.zh.md` L34/L91/L184 证实:
|
|
188
|
+
用户**能**点进 active teammate 会话发言,走 addressed-subagent 路径。
|
|
189
|
+
正确表述是「人可以进,只是不常进」。
|
|
190
|
+
|
|
191
|
+
### 已知限制
|
|
192
|
+
|
|
193
|
+
- 「Boss 发言同步给 DSH 原生团队 leader」**本批未做**。3 条硬限制:
|
|
194
|
+
① 官方无「Bot→Lead 发 peer 消息」公开工具;
|
|
195
|
+
② teammate 投递需 Lead-to-child edge 授权,sibling 消息不能伪装成 Lead;
|
|
196
|
+
③ cs-bots 当前无法读取 `agentTeam` 投影(只在 `compat.js:150` 探测服务存在)。
|
|
197
|
+
⇒ 需单独立项 2–3 天,硬做只能走「伪装成 Lead」,违反官方不变量。
|
|
198
|
+
- 跨团队定向请求(`bot_team_route`)未实现,属第 2 批。
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## [0.8.0] - 2026-11-10
|
|
203
|
+
|
|
204
|
+
改造09「Boss 体验 + 任务可管理性 + 升级接续」。
|
|
205
|
+
一句话:**把「你」从界面里清干净,把准主权还给 Boss,把升级风险压到可回滚。**
|
|
206
|
+
|
|
207
|
+
测试:1191 → **1242 项**(新增 51 条:后端 40、前端 11),`bash test/run-all.sh` exit 0。
|
|
208
|
+
|
|
209
|
+
### Added · Boss 能直接动手(需求5)
|
|
210
|
+
|
|
211
|
+
- **`TaskBossActions`**(`src/client.js`):任务详情内联五类操作 ——
|
|
212
|
+
改优先级/截止/复杂度档位(T0–T3)/是否付费、改目标与边界(`description`/`writeScopes`)、
|
|
213
|
+
换负责人/收回/重新派发、阻塞/解阻塞/关闭归档、编辑长任务阶段清单。
|
|
214
|
+
**为什么**:此前这些只能靠 Bot/Lead 改,Boss 想看「这活卡住了」想自己挪一下都做不到。
|
|
215
|
+
实测 48 条唤醒记录里 12 条失败,Boss 没有手边手段介入 —— 这是最直接的体验断裂。
|
|
216
|
+
- **`TaskPhasePanel`**(`src/client.js`):任务详情直接列**每个阶段的产物**,
|
|
217
|
+
四态徽标(已完成/卡住/进行中/未开始),路径可预览、URL 可打开。
|
|
218
|
+
**为什么**:过程产物原本埋在 `task-meta.jsonl` 里,Boss 只能看到最终 `artifacts`。
|
|
219
|
+
「活干到哪了」是长任务最常被问的问题,答案必须在一屏内。
|
|
220
|
+
- **`bot_task_phase`**(`src/tools.js`,工具数 41 → **42**):智能体按阶段回报产出物。
|
|
221
|
+
**为什么**:没有这个工具,阶段进度只能靠 Lead 手工转述 —— 转述即失真。
|
|
222
|
+
新工具严格是**纯增量**,38 个既有工具契约一字未改。
|
|
223
|
+
- `progressBy` / `progressAt`(`src/board.js`):进度写入者与时间。
|
|
224
|
+
**为什么**:Boss 和队长都会改进度,页面必须能说清「这个百分比是谁填的」,
|
|
225
|
+
否则 Boss 改完被队长估算覆盖,会以为自己的操作没生效。
|
|
226
|
+
|
|
227
|
+
### Changed · 一套口径 + 一个任务栏(需求1、2)
|
|
228
|
+
|
|
229
|
+
- **全站「Boss」单一口径**:`HUMAN_LABEL='Boss'` / `HUMAN_SELF_LABEL='Boss(你)'`,
|
|
230
|
+
`humanizeBy()` 把 `ui`/`user`/`human`/`boss`/`anyone` 统一显示 `Boss`,历史 `(ui)` → `(Boss)`。
|
|
231
|
+
**为什么**:此前「你 / 用户 / 派活方 / (ui)」四种叫法混用,Boss 原话是
|
|
232
|
+
「界面里到处是『你』,我不知道说的是我还是别人」。机器标识(`by:'ui'`)保留在技术字段里,
|
|
233
|
+
但凡**人眼可见**的字符串一律 `Boss`。
|
|
234
|
+
- **工作区页签改名《任务栏》**,默认**全量**:请求 `GET /tasks` 不带 `attention`、不带 `source`;
|
|
235
|
+
只有《智能体任务》子页签带 `source=ai`。
|
|
236
|
+
**为什么**:原「只看我管的 / 看全部」开关是**替 Boss 决定他该看什么** ——
|
|
237
|
+
默认藏任务是最糟的默认值。Boss 要的是打开就看到全部。
|
|
238
|
+
- **进度可编辑且标来源**:`当前完成度 N%(队长估算|Boss 设定)`,
|
|
239
|
+
`estimate` 单独一行「预估工作量 X(队长估的投入,跟完成度不是一回事)」。
|
|
240
|
+
**为什么**:原先把「估的工时」和「完成百分比」挤在一句里,Boss 明确说过看不懂。
|
|
241
|
+
|
|
242
|
+
### Changed · 团队与房间打通(需求3)
|
|
243
|
+
|
|
244
|
+
- **建团队自动建议事厅**:`` `${team.name} · 议事厅` ``,成员 `[leadId, ...members]`,
|
|
245
|
+
`adminId = leadId`,`teams.attachRoom()` 把 `roomId` 持久化到团队事件流。
|
|
246
|
+
**为什么**:建完团队还要手工建房间、手工拉人,是纯粹的重复劳动;
|
|
247
|
+
更糟的是 `attachRoom` 实现了却**没导出**,导致 `roomId` 永远不落盘 ——
|
|
248
|
+
dsh-web 一重启房间关联就丢,这正是「历史会话不显示房间」的根因之一。
|
|
249
|
+
|
|
250
|
+
### Changed · 派活失败可见可救(需求6)
|
|
251
|
+
|
|
252
|
+
- **`GET /tasks/diagnose`**(`src/api.js`)+ **「诊断这个任务」**按钮(`src/client.js`):
|
|
253
|
+
一次性给出 verdict / advice / 会话是否在线 / 预设 / 最近唤醒记录。
|
|
254
|
+
**为什么**:Boss 报的真实故障是「核实专员已多次指派,subagent 持续失败,无产出」——
|
|
255
|
+
48 条唤醒记录里 12 条 `agent-not-live`,但界面上**什么原因都不显示**,
|
|
256
|
+
Boss 只能反复重试。失败必须说人话。
|
|
257
|
+
|
|
258
|
+
### Changed · 租约退场(需求8)
|
|
259
|
+
|
|
260
|
+
- 删掉「高级:租约」Section 与「延长 5 分钟」按钮;`defaultLeaseMs` 文案改「任务占用默认时长」。
|
|
261
|
+
**为什么**:Boss 原话「不用给我展示租约,我希望随时发送信息就可以激活,不需要点击」。
|
|
262
|
+
改为**发消息即自动激活**(`/tasks/note`、`/tasks/wake` 内 `autoActivate`:
|
|
263
|
+
进行中 ⇒ 心跳,待领 ⇒ 自动接活),失败不阻断唤醒、只把原因回给页面。
|
|
264
|
+
|
|
265
|
+
### Added · 升级接续(需求9)
|
|
266
|
+
|
|
267
|
+
- **`GET /upgrade/preflight`**:只读体检(一个字节都不写),给出 counts / willDo / risks / backupHint。
|
|
268
|
+
- **`POST /upgrade/migrate`**:幂等迁移 —— 补 `bossTouched`、为「已完成长任务但无 phase 行」按总产出物回填末阶段产物,
|
|
269
|
+
既有 phase 行不动。**先备份**,备份失败则一个字节不动。
|
|
270
|
+
- **`docs/升级08-接续与回滚.md`**:怎么装 / 怎么验 / 怎么退回 0.7.5。
|
|
271
|
+
|
|
272
|
+
**为什么必须「逐条合并」而不是重写整个 board 文件**:
|
|
273
|
+
`board.jsonl` 是 CAS 幂等键与 `rev` 语义的真相源。整体覆盖重写只要漏一个字段,
|
|
274
|
+
任务的 `rev` 就和前端手里的对不上 —— Boss 需求「任务原样存活」当场破功,
|
|
275
|
+
而且**症状是隐性的**:页面照常打开,只是任务状态悄悄回退。
|
|
276
|
+
|
|
277
|
+
### Fixed · 三个真 bug(都是这轮改出来的,都带回归测试)
|
|
278
|
+
|
|
279
|
+
1. **任务抽屉白屏(P0)**:`TaskDrawer` 在组件体顶层读 `task.progressBy`,
|
|
280
|
+
首渲染时 `data` 还没到、`task` 是 `undefined` ⇒ `TypeError`,**整个抽屉白屏**。
|
|
281
|
+
改为 `task?.progressBy`。**为什么非改不可**:这不是测试问题,是任何任务点开就白屏的线上故障。
|
|
282
|
+
2. **同一秒内备份路径碰撞(数据风险)**:`backupState` 用秒级 `_tsLabel()` 拼目录名,
|
|
283
|
+
同一次迁移里 `board.jsonl` 与 `task-meta.jsonl` 的备份若落在同一秒,
|
|
284
|
+
`cpSync(force:true)` 会**互相覆盖 —— 回滚点丢一个**。
|
|
285
|
+
修法:备份 tag 带上 `Date.now()`,保证同一秒内两次备份必不同名。
|
|
286
|
+
3. **`/tasks/wake` 幂等键漂移(R15 回归)**:§7.2 的 `autoActivate` 会 bump `rev`,
|
|
287
|
+
若先激活再算 `task-wake:<id>:<rev>`,`force:false` 的重试键就会跟着漂,
|
|
288
|
+
契约「同一任务同一 rev 的重试只唤醒一次」被破坏。
|
|
289
|
+
修法:**先算 dedupKey(用激活前的 rev),再 autoActivate**;§7.2 自动心跳本身保留。
|
|
290
|
+
|
|
291
|
+
### Security / 稳健性
|
|
292
|
+
|
|
293
|
+
- **迁移绝不静默半残**:`store.migrate` 在 `current === to` 时不调 `migrateFn`,
|
|
294
|
+
导致「首次迁移后新建的 Boss 任务永远补不上 `bossTouched`」。
|
|
295
|
+
`src/api.js` 内绕过版本门控自行原子写回(`tmp → rename`),
|
|
296
|
+
并在返回里**如实标注** `schema.bypassedVersionGate: true` —— 隐藏这个事实比绕行本身更危险。
|
|
297
|
+
- **产出物超限拒绝而非截断**:单条 > 2000 字直接报错。
|
|
298
|
+
理由写在 `normalizePhaseArtifacts` 注释里:**产出物是证据,悄悄丢掉一条比拒绝写入更糟**。
|
|
299
|
+
|
|
300
|
+
### 已知限制(如实记录,别让后人误判)
|
|
301
|
+
|
|
302
|
+
- 「发消息激活 + 唤醒失败回滚」的**组合路径只有单测**,没有集成测试。
|
|
303
|
+
- 需求6 的派活失败**根因在宿主侧**(session 生命周期/懒加载),cs-bots 做的是
|
|
304
|
+
「让失败可见 + 可诊断 + 不静默」,不是修复宿主。
|
|
305
|
+
- `docs/ARCHITECTURE.md` 是 v0.6 历史快照(文首标「勿引用」),本轮**故意不动**,
|
|
306
|
+
现状以 `docs/01-架构文档.md` 实测为准。
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
16
310
|
## [0.7.5] - 2026-11-10
|
|
17
311
|
|
|
18
312
|
精简发布说明(≤50 字)。
|
package/README.md
CHANGED
|
@@ -1,220 +1,93 @@
|
|
|
1
1
|
# cs-bots
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
分层记忆与纪律、可独立工作目录的 Bot 注册表,以及待办/便签/提示词/AI 自审一整套协作设施。
|
|
3
|
+
DSH 多智能体协作平台:跨会话任务板、房间群聊、分层记忆/纪律、Bot 注册表、待办/便签/提示词/AI 自审。
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
> **零第三方运行时依赖**:不依赖 `my-free-model` / `dsh-memory-evolve` / `cs-bot-bea` / `ds-bot` 等任何其他插件。
|
|
9
|
-
> 只依赖 DSH 本体自带的官方包(随 DSH 安装,不算第三方)。
|
|
5
|
+
**零第三方依赖**:仅依赖 DSH 本体官方包。
|
|
10
6
|
|
|
11
7
|
---
|
|
12
8
|
|
|
13
9
|
## 安装
|
|
14
10
|
|
|
15
|
-
### 通道 1:git(github,**0.4.0 的推荐通道**)
|
|
16
|
-
|
|
17
11
|
```bash
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
> ⚠️ **为什么这版不推荐 npm**:npm registry 上的 `cs-bots` 仍停在 **0.1.1**,
|
|
22
|
-
> 本轮**没有 npm 发布凭据**(`npm whoami` → ENEEDAUTH),npm 不是 0.4.0 的发布通道。
|
|
23
|
-
> 用 `dsh plugin --profile web add cs-bots` 会装到旧版。
|
|
12
|
+
# 推荐:git 通道(npm 版本可能滞后)
|
|
13
|
+
dsh plugin --profile web add github:7358716/cs-bots#v0.8.0
|
|
24
14
|
|
|
25
|
-
|
|
15
|
+
# 或离线包
|
|
16
|
+
dsh plugin --profile web add ./cs-bots-0.8.0.tgz
|
|
26
17
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
dsh plugin --profile web add ./cs-bots-0.4.0.tgz
|
|
18
|
+
# 自检(强烈建议)
|
|
19
|
+
bash install.sh --channel git --ref v0.8.0
|
|
30
20
|
```
|
|
31
21
|
|
|
32
|
-
> ⚠️
|
|
33
|
-
> 若 git 通道失败:先重试一次,仍失败则改用离线包通道。
|
|
34
|
-
|
|
35
|
-
### 一条命令装 + 自检(强烈建议)
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
bash install.sh --channel git --ref v0.4.0 # git 通道(install.sh 支持 npm|git)
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**自检为什么必要**:`link:` 断链或 bundle 未进 `dsh.profile.bundles` 时,DSH **只打一行
|
|
42
|
-
`skipping profile bundle` 就静默跳过**——页面照常 HTTP 200,功能全失效。
|
|
43
|
-
`install.sh` 用 `dsh --profile <p> --dump-config` 验证**装配树里真有本插件的行**,
|
|
44
|
-
并检查 `agent-team.maxMembers` 是否已解封、状态目录是否可写。
|
|
45
|
-
|
|
46
|
-
退出码:`0`=装好且自检通过;`1`=安装失败;**`2`=装了但自检不通过**(最危险,必须处理)。
|
|
47
|
-
|
|
48
|
-
#### ⚠️ 一个必踩的坑:**bundle 层序**
|
|
49
|
-
|
|
50
|
-
`dsh plugin add` 只往 `dsh.profile.bundles` **末尾追加**。而 bundle patch 按 **bundles 顺序**依次应用,
|
|
51
|
-
之后才是 profile 自己的 patch。
|
|
52
|
-
|
|
53
|
-
⇒ **本插件必须排在 `@deepseek-ai/dsh-experimental-agent-team-profile` 之后**,
|
|
54
|
-
否则我们对 `agent-team.maxMembers` 的**覆盖会在目标行还不存在时执行 → 被静默跳过**(`entry not found`)。
|
|
55
|
-
|
|
56
|
-
**实测复现**(2026-11-02):先装 `cs-bots`、后装 `agent-team-profile` → `maxMembers` 仍是 `8`。
|
|
57
|
-
|
|
58
|
-
`install.sh` 会**检测并自动重排**(备份为 `package.json.bak-cs-bots-order`),
|
|
59
|
-
然后以 **exit=2** 提示「需重启 DSH 后重跑自检」。
|
|
60
|
-
|
|
61
|
-
手动安装时请**先启用 agent-team,再装本插件**;或装完跑一次 `install.sh --check-only` 让它修正。
|
|
62
|
-
|
|
63
|
-
#### 另一个坑:**不要用 npm 装 agent-team-profile**
|
|
64
|
-
|
|
65
|
-
`dsh plugin add @deepseek-ai/dsh-experimental-agent-team-profile` 会从 registry 拉到**另一个版本**
|
|
66
|
-
(实测拉到 `0.1.5-alpha.2`,而 dsh 自带的是 `0.2.1-rc.2`)。
|
|
67
|
-
正确做法:**只在 `dsh.profile.bundles` 里按名引用**(不装包),它会从 dsh 安装目录解析,版本天然对齐。
|
|
22
|
+
> ⚠️ **bundle 层序**:本插件需排在 `@deepseek-ai/dsh-experimental-agent-team-profile` 之后,否则 `maxMembers` 覆盖失效。`install.sh` 会自动检测并重排。
|
|
68
23
|
|
|
69
24
|
---
|
|
70
25
|
|
|
71
|
-
##
|
|
26
|
+
## 核心能力
|
|
72
27
|
|
|
73
|
-
**28 个模型可见工具**(`bot_`
|
|
28
|
+
**28 个模型可见工具**(`bot_` 前缀):
|
|
74
29
|
|
|
75
30
|
### 任务板(跨会话)
|
|
76
31
|
| 工具 | 用途 |
|
|
77
32
|
|---|---|
|
|
78
|
-
| `bot_task_create` |
|
|
33
|
+
| `bot_task_create` | 建任务(依赖 DAG、优先级、`sourceSeq` 幂等) |
|
|
79
34
|
| `bot_task_list` | 列任务 |
|
|
80
|
-
| `bot_task_ready` | **就绪任务**(依赖全完成的 pending
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
|
|
84
|
-
|
|
35
|
+
| `bot_task_ready` | **就绪任务**(依赖全完成的 pending) |
|
|
36
|
+
| `bot_task_get` | 读任务详情 |
|
|
37
|
+
| `bot_task_update` | 改任务(CAS) |
|
|
38
|
+
| `bot_task_phase` | 边做边交阶段产物 |
|
|
39
|
+
| `bot_task_accept` | 验收(pass/reject) |
|
|
40
|
+
| `bot_task_subscribe` | 任务订阅房间消息 |
|
|
41
|
+
|
|
42
|
+
### 团队与房间
|
|
85
43
|
| 工具 | 用途 |
|
|
86
44
|
|---|---|
|
|
87
|
-
| `
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
|
91
|
-
|
|
92
|
-
| `
|
|
93
|
-
| `bot_roster_list` | 列出(可选含已退役) |
|
|
94
|
-
| `bot_roster_manage` | `rename`/`retire`/`setCwd`/`claim`/`release`/`heartbeat` |
|
|
45
|
+
| `bot_teams_create` | 建团队(big/small) |
|
|
46
|
+
| `bot_teams_list` | 列团队 |
|
|
47
|
+
| `bot_teams_add` | 加成员 |
|
|
48
|
+
| `bot_room_create` | 建房间 |
|
|
49
|
+
| `bot_room_post` | 发言 |
|
|
50
|
+
| `bot_room_read` | 读消息 |
|
|
95
51
|
|
|
96
|
-
###
|
|
52
|
+
### Bot 注册表
|
|
97
53
|
| 工具 | 用途 |
|
|
98
54
|
|---|---|
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
101
|
-
| `
|
|
102
|
-
| `bot_room_body` | 取长正文全文(长消息自动落旁路文件) |
|
|
55
|
+
| `bot_roster_create` | 注册 Bot(指定 cwd、preset) |
|
|
56
|
+
| `bot_roster_list` | 列 Bot |
|
|
57
|
+
| `bot_roster_manage` | claim/release/心跳/退役 |
|
|
103
58
|
|
|
104
|
-
###
|
|
59
|
+
### 记忆与纪律
|
|
105
60
|
| 工具 | 用途 |
|
|
106
61
|
|---|---|
|
|
107
|
-
| `bot_memory_add` |
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
110
|
-
| `bot_task_notes` | 拉某任务的全部 L4 任务笔记(跨会话交接用,倒序) |
|
|
62
|
+
| `bot_memory_add/context/search` | 分层记忆 |
|
|
63
|
+
| `bot_discipline_list/resolve` | 合并纪律 |
|
|
64
|
+
| `bot_suggestion_list/propose` | 建议确认队列 |
|
|
111
65
|
|
|
112
|
-
###
|
|
66
|
+
### 待办与 PDCA
|
|
113
67
|
| 工具 | 用途 |
|
|
114
68
|
|---|---|
|
|
115
|
-
| `bot_todo_add
|
|
116
|
-
| `
|
|
117
|
-
| `bot_prompt_list` / `bot_prompt_get` | 提示词库(模板含 `{{date}}`/`{{time}}`) |
|
|
69
|
+
| `bot_todo_add/list/update` | 四象限待办 |
|
|
70
|
+
| `bot_cycle_start/advance/check/review` | PDCA 复盘 |
|
|
118
71
|
|
|
119
|
-
###
|
|
72
|
+
### 度量
|
|
120
73
|
| 工具 | 用途 |
|
|
121
74
|
|---|---|
|
|
122
|
-
| `
|
|
123
|
-
| `bot_suggestion_propose` / `bot_suggestion_list` | **建议确认制**:模型只能提议,人点采纳才真正落库 |
|
|
75
|
+
| `bot_metrics_record/aggregate` | 指标记录/聚合 |
|
|
124
76
|
|
|
125
77
|
---
|
|
126
78
|
|
|
127
|
-
##
|
|
128
|
-
|
|
129
|
-
| 页签 | 子视图 | 管什么 |
|
|
130
|
-
|---|---|---|
|
|
131
|
-
| **任务** | 协作看板 / 我的待办 / 便签 | 要做的活(三者是一条漏斗:想到就记 → 决定要做 → 交给谁做) |
|
|
132
|
-
| **Bot** | — | 谁来做(档案:人格/边界/纪律/技能/预制记忆) |
|
|
133
|
-
| **房间** | — | 在哪商量(群聊、长消息全文、归档、角色) |
|
|
134
|
-
| **记忆** | 事实与偏好 / 纪律与要求 / 提示词 | AI 该知道什么 |
|
|
135
|
-
| **技能库** | — | 怎么做(自建/用户级/项目级/系统自带,可导入目录) |
|
|
136
|
-
| **工作流库** | — | 按什么步骤做 |
|
|
137
|
-
| **设置** | — | 平台怎么跑(记忆自审间隔、系统体检) |
|
|
79
|
+
## 文档
|
|
138
80
|
|
|
139
|
-
|
|
140
|
-
|
|
81
|
+
- [架构总览](docs/ARCHITECTURE.md)
|
|
82
|
+
- [页签结构 ADR-001](docs/adr/ADR-001-页签结构回到七页.md)
|
|
83
|
+
- [改造08-Boss 决策留痕](docs/改造08-Boss决策留痕与Mandate授权机制.md)
|
|
84
|
+
- [改造09-Boss 体验](docs/CONTRACT-改造09-Boss体验与任务管控.md)
|
|
85
|
+
- [交付说明](docs/交付说明.md)
|
|
141
86
|
|
|
142
87
|
---
|
|
143
88
|
|
|
144
|
-
##
|
|
145
|
-
|
|
146
|
-
- **API 鉴权围栏**:公网路径必须带有效会话(无 cookie 的 `curl` 直接 401),
|
|
147
|
-
另有同源校验防 CSRF;关掉宿主校验时对**经代理**请求 fail-closed。
|
|
148
|
-
- **受保护区**:状态目录、`~/.ssh`、`~/.dsh` 等不可被 `fs/mkdir|rename` 触碰。
|
|
149
|
-
- **建议确认制**:模型改不了长期记忆,只能提建议,人采纳才落库。
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## 设计要点(为什么这样)
|
|
154
|
-
|
|
155
|
-
### 1. 为什么持久 Bot 不走官方 `spawn_teammate`
|
|
156
|
-
|
|
157
|
-
**实测硬事实**:官方 `SpawnTeammateRequest` 只有 6 个字段(`name`/`description`/`prompt`/`context`/`provider`/`signal`)——**没有 `cwd`**;
|
|
158
|
-
子会话由 `childSessionMeta()` 强制继承父会话 cwd;而 **cwd 同时就是 fs 写入边界**。
|
|
159
|
-
⇒ 一支官方 Team 的全体成员共享同一目录、会互相覆盖文件。
|
|
160
|
-
|
|
161
|
-
**本平台的解法**:持久 Bot 走 `ctx.agents.create({ meta: { cwd } })`(官方唯一能指定目录的路径),
|
|
162
|
-
拿独立写入边界;`spawnTeammate` 只用于同目录的轻量分工。
|
|
163
|
-
|
|
164
|
-
### 2. 为什么自建任务板
|
|
165
|
-
|
|
166
|
-
官方 Agent Teams 的任务板 **`TeamId = SessionId`**(每会话一块),且 roster 是 **flat immutable**
|
|
167
|
-
(无改名、无删除、名字永不复用)。⇒ 跨会话统一任务板与可维护的 Bot 注册表都必须自建。
|
|
168
|
-
|
|
169
|
-
### 3. 为什么禁 `ask_user_question`
|
|
170
|
-
|
|
171
|
-
在多智能体结构里,**同步等用户的提问工具会堵死整条投递链**
|
|
172
|
-
(依据:`ds-bot` 源码注释 —— *"every message from another Bot or a group round queues behind it"*)。
|
|
173
|
-
本平台对 Bot 会话双层移除:`tools.guard` 同步闸门 + `agent/created` 时 `restrict({deny})`。
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## 开发
|
|
89
|
+
## 测试
|
|
178
90
|
|
|
179
91
|
```bash
|
|
180
|
-
bash test/run-all.sh
|
|
181
|
-
bash test/ci-zero-dep.sh # 只跑零依赖 CI(4 项机械检查)
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**零依赖 CI 四项检查**(防止依赖悄悄长回来):
|
|
185
|
-
1. `src/` 下除 `kernel.js` 外,任何文件不得**真实 import** `@deepseek-ai/*`(注释里的字面量不算)
|
|
186
|
-
2. `package.json` 的 `dependencies` 必须不存在或为空
|
|
187
|
-
3. `cordis.patch.yml` 每个 `name` 只能是本包或官方包
|
|
188
|
-
4. 覆盖官方行时必须列全 `config` 字段(漏字段会让整个 profile 起不来)
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
## 状态目录
|
|
193
|
-
|
|
194
|
-
```
|
|
195
|
-
$DSH_HOME/cs-bots/
|
|
196
|
-
├── board.jsonl 任务板事件流(真相源)
|
|
197
|
-
├── board.snap.json 任务板快照
|
|
198
|
-
├── roster.jsonl Bot 注册表事件流
|
|
199
|
-
├── roster.snap.json
|
|
200
|
-
├── wakes.jsonl 唤醒审计(终态记录)
|
|
201
|
-
├── rooms/<roomId>/log.jsonl 房间消息(不截断)
|
|
202
|
-
├── rooms/<roomId>/bodies/*.txt 长正文旁路
|
|
203
|
-
├── memory.jsonl 记忆事件流
|
|
204
|
-
├── memory.snap.json
|
|
205
|
-
├── memory-fts.db FTS5 检索索引(派生缓存,可重建)
|
|
206
|
-
├── discipline.jsonl 分级纪律事件流
|
|
207
|
-
├── todo.jsonl 待办事件流
|
|
208
|
-
├── prompts.jsonl 提示词库事件流
|
|
209
|
-
├── suggestions.jsonl 建议确认队列
|
|
210
|
-
├── reviewer.jsonl 自审调度
|
|
211
|
-
├── scratch/<scope>.md 便签
|
|
212
|
-
└── library-skill-dirs.json 登记的技能来源目录
|
|
92
|
+
bash test/run-all.sh # 1242 项(v0.8.0),exit 0 才通过
|
|
213
93
|
```
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## 许可
|
|
218
|
-
|
|
219
|
-
MIT。设计上借鉴了 `ds-bot`(Apache-2.0)的 work 树/投递漏斗、`cs-bot-bea`(MIT)的惰性获取/
|
|
220
|
-
原子写/ErrorBoundary 等工程做法,均为**思路与模式借鉴**,未复制其运行时代码。
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# cs-bots 架构总览(改造07 · 分层架构 + 改造08 · 人机分治)
|
|
2
2
|
|
|
3
|
-
> 版本:v0.
|
|
4
|
-
> 日期:2026-11-
|
|
5
|
-
>
|
|
3
|
+
> 版本:v0.9.0(改造07 分层 + 改造08 需求1–5 + 改造09 Boss 体验/任务可管理性/升级接续)
|
|
4
|
+
> 日期:2026-11-10
|
|
5
|
+
> 状态:改造09 进行中 —— 套件规模 1190 项,截至 2026-11-10 有 6 项失败待修(详见 `docs/CONTRACT-升级09-Boss体验.md` §10)。改完前**不要**把本文当作「全绿」依据。
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
│ │
|
|
51
51
|
│ ┌──────────────────────────────────────────────────────┐ │
|
|
52
52
|
│ │ AI 智能体调用接口(机器友好、可审计) │ │
|
|
53
|
-
│ │
|
|
53
|
+
│ │ 43 个 bot_* 工具 + HTTP API │ │
|
|
54
54
|
│ └──────────────────────────────────────────────────────┘ │
|
|
55
55
|
└─────────────────────────────────────────────────────────────┘
|
|
56
56
|
```
|
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
| 后端运行时 | Node.js ≥22.5,ESM,零第三方运行时依赖 |
|
|
142
142
|
| HTTP API | 宿主 `webServer.register`(前缀路由 `/cs-bots/api`) |
|
|
143
143
|
| 前端 | React 18,宿主模块加载器 `window.__ModuleLoader__.load` |
|
|
144
|
-
| 模型工具 | 宿主 `tools.register`,
|
|
144
|
+
| 模型工具 | 宿主 `tools.register`,43 个 `bot_*` 工具 |
|
|
145
145
|
| 持久化 | JSONL 事件流 + 原子快照,SQLite 不引入 |
|
|
146
146
|
| 安全 | 会话鉴权围栏 + 同源校验 + 受保护区 + CSRF 防护 |
|
|
147
147
|
|
|
@@ -212,7 +212,7 @@ src/subscription.js 任务订阅 + 房间扇出(改造07 新增)
|
|
|
212
212
|
src/routing/ 复杂度路由
|
|
213
213
|
src/store.js 存储原语(jsonl + 快照 + 幂等集 + 原子写)
|
|
214
214
|
src/kernel.js 宿主桥(唯一可引用宿主包的文件)
|
|
215
|
-
src/tools.js
|
|
215
|
+
src/tools.js 43 个模型工具
|
|
216
216
|
src/index.js 装配入口
|
|
217
217
|
```
|
|
218
218
|
|
|
@@ -227,7 +227,7 @@ src/index.js 装配入口
|
|
|
227
227
|
| 房间→任务 | 无连接 | Subscription 扇出 |
|
|
228
228
|
| Bot 开工 | 无准备步骤 | prepare command |
|
|
229
229
|
| 底层可见性 | 无(黑盒) | 穿透面板(7 区块) |
|
|
230
|
-
| 工具数 | 38 个 | 41 个 |
|
|
230
|
+
| 工具数 | 38 个 | 41 个 | **43 个**(改造09 新增 `bot_task_phase`,bots04 新增 `bot_team_route`) |
|
|
231
231
|
| 测试数 | 949 项 | 1036 项 |
|
|
232
232
|
|
|
233
233
|
---
|
|
@@ -252,9 +252,10 @@ src/index.js 装配入口
|
|
|
252
252
|
| 改造07 借鉴 Super-agent 的 3/4/5 项能力 | 用户指定 | 2026-11-08 |
|
|
253
253
|
| cs-bots 零第三方运行时依赖 | cs-bots README + package.json | 2026-11-08 |
|
|
254
254
|
| 改造07 工具数 41 个 | `src/tools.js` 的 `TOOL_NAMES` | 2026-11-08 |
|
|
255
|
+
| 改造09 工具数 42 个 | `src/tools.js` 的 `TOOL_NAMES`(新增 `bot_task_phase`) | 2026-11-10 |
|
|
255
256
|
| 改造07 测试数 1036 项 | `bash test/run-all.sh` | 2026-11-08 |
|
|
256
257
|
| 改造09 准入闸 + Mandate 授权留痕 + WIP 并发槽位 + 结构化 Report | 用户指定 | 2026-11-09 |
|
|
257
|
-
| 当前测试数
|
|
258
|
+
| 当前测试数 1242 项(改造09 后) | `bash test/run-all.sh` | 2026-11-10 |
|
|
258
259
|
|
|
259
260
|
---
|
|
260
261
|
|
|
@@ -270,11 +271,11 @@ src/index.js 装配入口
|
|
|
270
271
|
|
|
271
272
|
| | 改前 | 改后 |
|
|
272
273
|
|---|---|---|
|
|
273
|
-
|
|
|
274
|
-
| 智能体任务 | 混在同一个列表里翻 |
|
|
274
|
+
| 任务栏 | 人和智能体的任务混在一起 | **全量**(不带 `attention`、不带 `source`) |
|
|
275
|
+
| 智能体任务 | 混在同一个列表里翻 | 单独的「智能体任务」页签,仍带 `source=ai` |
|
|
275
276
|
|
|
276
277
|
- 后端 `GET /tasks?source=human|ai` 早已支持(`src/board.js` 里 `source` 字段),这次是**前端把它用起来**。
|
|
277
|
-
-
|
|
278
|
+
- **改造09 起,任务栏页不再有「只看需要我处理的」开关**:删掉开关与 `attentionOnly`,任务栏默认全量;只有「智能体任务」子页签仍带 `source=ai`。见契约 §1。
|
|
278
279
|
|
|
279
280
|
### 需求2 · 派活后能追踪进度、看到产出物、看到对话
|
|
280
281
|
|
|
@@ -349,8 +350,8 @@ src/index.js 装配入口
|
|
|
349
350
|
```
|
|
350
351
|
test/kernel-conversation.test.mjs 8 项 ✅
|
|
351
352
|
test/client-anchor.test.mjs 39 项 ✅
|
|
352
|
-
全套 node --test test/*.test.mjs →
|
|
353
|
-
bash test/run-all.sh →
|
|
353
|
+
全套 node --test test/*.test.mjs → 1190 项(改造09 进行中:6 项失败待修)
|
|
354
|
+
bash test/run-all.sh → ⏳ 修复进行中(exit 1,见 §改造09)
|
|
354
355
|
dsh-plugins.sh precheck → OK cs-bots -> src/client.js
|
|
355
356
|
dsh web 重启 → 启动图端到端校验 PASS
|
|
356
357
|
|