cs-bots 0.7.4 → 0.8.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 CHANGED
@@ -13,6 +13,120 @@
13
13
 
14
14
  ---
15
15
 
16
+ ## [0.8.0] - 2026-11-10
17
+
18
+ 改造09「Boss 体验 + 任务可管理性 + 升级接续」。
19
+ 一句话:**把「你」从界面里清干净,把准主权还给 Boss,把升级风险压到可回滚。**
20
+
21
+ 测试:1191 → **1242 项**(新增 51 条:后端 40、前端 11),`bash test/run-all.sh` exit 0。
22
+
23
+ ### Added · Boss 能直接动手(需求5)
24
+
25
+ - **`TaskBossActions`**(`src/client.js`):任务详情内联五类操作 ——
26
+ 改优先级/截止/复杂度档位(T0–T3)/是否付费、改目标与边界(`description`/`writeScopes`)、
27
+ 换负责人/收回/重新派发、阻塞/解阻塞/关闭归档、编辑长任务阶段清单。
28
+ **为什么**:此前这些只能靠 Bot/Lead 改,Boss 想看「这活卡住了」想自己挪一下都做不到。
29
+ 实测 48 条唤醒记录里 12 条失败,Boss 没有手边手段介入 —— 这是最直接的体验断裂。
30
+ - **`TaskPhasePanel`**(`src/client.js`):任务详情直接列**每个阶段的产物**,
31
+ 四态徽标(已完成/卡住/进行中/未开始),路径可预览、URL 可打开。
32
+ **为什么**:过程产物原本埋在 `task-meta.jsonl` 里,Boss 只能看到最终 `artifacts`。
33
+ 「活干到哪了」是长任务最常被问的问题,答案必须在一屏内。
34
+ - **`bot_task_phase`**(`src/tools.js`,工具数 41 → **42**):智能体按阶段回报产出物。
35
+ **为什么**:没有这个工具,阶段进度只能靠 Lead 手工转述 —— 转述即失真。
36
+ 新工具严格是**纯增量**,38 个既有工具契约一字未改。
37
+ - `progressBy` / `progressAt`(`src/board.js`):进度写入者与时间。
38
+ **为什么**:Boss 和队长都会改进度,页面必须能说清「这个百分比是谁填的」,
39
+ 否则 Boss 改完被队长估算覆盖,会以为自己的操作没生效。
40
+
41
+ ### Changed · 一套口径 + 一个任务栏(需求1、2)
42
+
43
+ - **全站「Boss」单一口径**:`HUMAN_LABEL='Boss'` / `HUMAN_SELF_LABEL='Boss(你)'`,
44
+ `humanizeBy()` 把 `ui`/`user`/`human`/`boss`/`anyone` 统一显示 `Boss`,历史 `(ui)` → `(Boss)`。
45
+ **为什么**:此前「你 / 用户 / 派活方 / (ui)」四种叫法混用,Boss 原话是
46
+ 「界面里到处是『你』,我不知道说的是我还是别人」。机器标识(`by:'ui'`)保留在技术字段里,
47
+ 但凡**人眼可见**的字符串一律 `Boss`。
48
+ - **工作区页签改名《任务栏》**,默认**全量**:请求 `GET /tasks` 不带 `attention`、不带 `source`;
49
+ 只有《智能体任务》子页签带 `source=ai`。
50
+ **为什么**:原「只看我管的 / 看全部」开关是**替 Boss 决定他该看什么** ——
51
+ 默认藏任务是最糟的默认值。Boss 要的是打开就看到全部。
52
+ - **进度可编辑且标来源**:`当前完成度 N%(队长估算|Boss 设定)`,
53
+ `estimate` 单独一行「预估工作量 X(队长估的投入,跟完成度不是一回事)」。
54
+ **为什么**:原先把「估的工时」和「完成百分比」挤在一句里,Boss 明确说过看不懂。
55
+
56
+ ### Changed · 团队与房间打通(需求3)
57
+
58
+ - **建团队自动建议事厅**:`` `${team.name} · 议事厅` ``,成员 `[leadId, ...members]`,
59
+ `adminId = leadId`,`teams.attachRoom()` 把 `roomId` 持久化到团队事件流。
60
+ **为什么**:建完团队还要手工建房间、手工拉人,是纯粹的重复劳动;
61
+ 更糟的是 `attachRoom` 实现了却**没导出**,导致 `roomId` 永远不落盘 ——
62
+ dsh-web 一重启房间关联就丢,这正是「历史会话不显示房间」的根因之一。
63
+
64
+ ### Changed · 派活失败可见可救(需求6)
65
+
66
+ - **`GET /tasks/diagnose`**(`src/api.js`)+ **「诊断这个任务」**按钮(`src/client.js`):
67
+ 一次性给出 verdict / advice / 会话是否在线 / 预设 / 最近唤醒记录。
68
+ **为什么**:Boss 报的真实故障是「核实专员已多次指派,subagent 持续失败,无产出」——
69
+ 48 条唤醒记录里 12 条 `agent-not-live`,但界面上**什么原因都不显示**,
70
+ Boss 只能反复重试。失败必须说人话。
71
+
72
+ ### Changed · 租约退场(需求8)
73
+
74
+ - 删掉「高级:租约」Section 与「延长 5 分钟」按钮;`defaultLeaseMs` 文案改「任务占用默认时长」。
75
+ **为什么**:Boss 原话「不用给我展示租约,我希望随时发送信息就可以激活,不需要点击」。
76
+ 改为**发消息即自动激活**(`/tasks/note`、`/tasks/wake` 内 `autoActivate`:
77
+ 进行中 ⇒ 心跳,待领 ⇒ 自动接活),失败不阻断唤醒、只把原因回给页面。
78
+
79
+ ### Added · 升级接续(需求9)
80
+
81
+ - **`GET /upgrade/preflight`**:只读体检(一个字节都不写),给出 counts / willDo / risks / backupHint。
82
+ - **`POST /upgrade/migrate`**:幂等迁移 —— 补 `bossTouched`、为「已完成长任务但无 phase 行」按总产出物回填末阶段产物,
83
+ 既有 phase 行不动。**先备份**,备份失败则一个字节不动。
84
+ - **`docs/升级08-接续与回滚.md`**:怎么装 / 怎么验 / 怎么退回 0.7.5。
85
+
86
+ **为什么必须「逐条合并」而不是重写整个 board 文件**:
87
+ `board.jsonl` 是 CAS 幂等键与 `rev` 语义的真相源。整体覆盖重写只要漏一个字段,
88
+ 任务的 `rev` 就和前端手里的对不上 —— Boss 需求「任务原样存活」当场破功,
89
+ 而且**症状是隐性的**:页面照常打开,只是任务状态悄悄回退。
90
+
91
+ ### Fixed · 三个真 bug(都是这轮改出来的,都带回归测试)
92
+
93
+ 1. **任务抽屉白屏(P0)**:`TaskDrawer` 在组件体顶层读 `task.progressBy`,
94
+ 首渲染时 `data` 还没到、`task` 是 `undefined` ⇒ `TypeError`,**整个抽屉白屏**。
95
+ 改为 `task?.progressBy`。**为什么非改不可**:这不是测试问题,是任何任务点开就白屏的线上故障。
96
+ 2. **同一秒内备份路径碰撞(数据风险)**:`backupState` 用秒级 `_tsLabel()` 拼目录名,
97
+ 同一次迁移里 `board.jsonl` 与 `task-meta.jsonl` 的备份若落在同一秒,
98
+ `cpSync(force:true)` 会**互相覆盖 —— 回滚点丢一个**。
99
+ 修法:备份 tag 带上 `Date.now()`,保证同一秒内两次备份必不同名。
100
+ 3. **`/tasks/wake` 幂等键漂移(R15 回归)**:§7.2 的 `autoActivate` 会 bump `rev`,
101
+ 若先激活再算 `task-wake:<id>:<rev>`,`force:false` 的重试键就会跟着漂,
102
+ 契约「同一任务同一 rev 的重试只唤醒一次」被破坏。
103
+ 修法:**先算 dedupKey(用激活前的 rev),再 autoActivate**;§7.2 自动心跳本身保留。
104
+
105
+ ### Security / 稳健性
106
+
107
+ - **迁移绝不静默半残**:`store.migrate` 在 `current === to` 时不调 `migrateFn`,
108
+ 导致「首次迁移后新建的 Boss 任务永远补不上 `bossTouched`」。
109
+ `src/api.js` 内绕过版本门控自行原子写回(`tmp → rename`),
110
+ 并在返回里**如实标注** `schema.bypassedVersionGate: true` —— 隐藏这个事实比绕行本身更危险。
111
+ - **产出物超限拒绝而非截断**:单条 > 2000 字直接报错。
112
+ 理由写在 `normalizePhaseArtifacts` 注释里:**产出物是证据,悄悄丢掉一条比拒绝写入更糟**。
113
+
114
+ ### 已知限制(如实记录,别让后人误判)
115
+
116
+ - 「发消息激活 + 唤醒失败回滚」的**组合路径只有单测**,没有集成测试。
117
+ - 需求6 的派活失败**根因在宿主侧**(session 生命周期/懒加载),cs-bots 做的是
118
+ 「让失败可见 + 可诊断 + 不静默」,不是修复宿主。
119
+ - `docs/ARCHITECTURE.md` 是 v0.6 历史快照(文首标「勿引用」),本轮**故意不动**,
120
+ 现状以 `docs/01-架构文档.md` 实测为准。
121
+
122
+ ---
123
+
124
+ ## [0.7.5] - 2026-11-10
125
+
126
+ 精简发布说明(≤50 字)。
127
+
128
+ ---
129
+
16
130
  ## [0.7.4] - 2026-11-10
17
131
 
18
132
  「修复 Bot 工具面 + 投递留痕 + 准入闸落地」版。v0.7.3 之后累计 14 个提交,
package/README.md CHANGED
@@ -1,220 +1,93 @@
1
1
  # cs-bots
2
2
 
3
- **DSH 多智能体协作平台**——一个自足的插件:装上它,你就有了跨会话任务板、房间群聊、
4
- 分层记忆与纪律、可独立工作目录的 Bot 注册表,以及待办/便签/提示词/AI 自审一整套协作设施。
3
+ DSH 多智能体协作平台:跨会话任务板、房间群聊、分层记忆/纪律、Bot 注册表、待办/便签/提示词/AI 自审。
5
4
 
6
- > 设计文档:**[架构总览](docs/ARCHITECTURE.md)** · [页签结构决策 ADR-001](docs/adr/ADR-001-页签结构回到七页.md)
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
- dsh plugin --profile web add github:7358716/cs-bots#v0.4.0
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
- ### 通道 2:离线包(github 不可达时的兜底)
15
+ # 或离线包
16
+ dsh plugin --profile web add ./cs-bots-0.8.0.tgz
26
17
 
27
- ```bash
28
- # 先拿到 cs-bots-0.4.0.tgz(发布产物 / 主管本机),再:
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
- > ⚠️ **已知环境事实**:`github.com:443` 在某些网络下**间歇不可达**(DNS 正常、TCP 超时)。
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` | 建任务(支持依赖 DAG、优先级、`sourceSeq` 幂等) |
33
+ | `bot_task_create` | 建任务(依赖 DAG、优先级、`sourceSeq` 幂等) |
79
34
  | `bot_task_list` | 列任务 |
80
- | `bot_task_ready` | **就绪任务**(依赖全完成的 pending),领活用 |
81
- | `bot_task_update` | CAS 推进:`claim`/`heartbeat`/`release`/`complete`/`reopen`/`block`/`unblock`/`delete`/`set` |
82
- | `bot_task_accept` | 验收(`pass`/`reject`)——官方**没有**这个动作 |
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
- | `bot_wake` | 定向唤醒会话(`dedupKey` 去重,防唤醒风暴) |
88
-
89
- ### Bot 注册表(**独立工作目录**)
90
- | 工具 | 用途 |
91
- |---|---|
92
- | `bot_roster_create` | 建持久 Bot(`cwd` 独立,**cwd 同时是它的写入边界**) |
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
- | `bot_room_create` | 建房间 |
100
- | `bot_room_post` | 发言(**确定性写入**:直接落盘,不经模型转手) |
101
- | `bot_room_read` | 读消息(带 `seq` 游标,可断点续传) |
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` | 写入(L0–L5 六层;`explicit:true` 受保护) |
108
- | `bot_memory_search` | 检索(FTS5 trigram,缺则退化字面匹配) |
109
- | `bot_memory_context` | 取常驻注入文本(L0–L3,可按 `cwd` 取当前项目口径) |
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` / `bot_todo_list` / `bot_todo_update` | 四轨待办(生活/工作/项目/每日)+ 四象限 + 智能视图 |
116
- | `bot_scratch_read` / `bot_scratch_write` | 便签(随手记,单文件原子写) |
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
- | `bot_discipline_list` / `bot_discipline_resolve` | 分级纪律(全局/工作区/房间/Bot),`resolve` 取「我实际要遵守哪些」 |
123
- | `bot_suggestion_propose` / `bot_suggestion_list` | **建议确认制**:模型只能提议,人点采纳才真正落库 |
75
+ | `bot_metrics_record/aggregate` | 指标记录/聚合 |
124
76
 
125
77
  ---
126
78
 
127
- ## 页面结构(7 个页签,与原架构一致)
128
-
129
- | 页签 | 子视图 | 管什么 |
130
- |---|---|---|
131
- | **任务** | 协作看板 / 我的待办 / 便签 | 要做的活(三者是一条漏斗:想到就记 → 决定要做 → 交给谁做) |
132
- | **Bot** | — | 谁来做(档案:人格/边界/纪律/技能/预制记忆) |
133
- | **房间** | — | 在哪商量(群聊、长消息全文、归档、角色) |
134
- | **记忆** | 事实与偏好 / 纪律与要求 / 提示词 | AI 该知道什么 |
135
- | **技能库** | — | 怎么做(自建/用户级/项目级/系统自带,可导入目录) |
136
- | **工作流库** | — | 按什么步骤做 |
137
- | **设置** | — | 平台怎么跑(记忆自审间隔、系统体检) |
79
+ ## 文档
138
80
 
139
- > **为什么不多开页签**:新增能力若没有独立生命周期、不需要多方引用、没有可点进去的详情,
140
- > 就只能做子视图。判据与背景见 [ADR-001](docs/adr/ADR-001-页签结构回到七页.md)。
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 # 单入口:零依赖 CI + 全部单测,任一失败退出码非 0
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.7.3(改造07 分层 + 改造08 需求1–5)
4
- > 日期:2026-11-09
5
- > 状态:已实现,1108 项测试全通过(`bash test/run-all.sh` exit 0)
3
+ > 版本:v0.8.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
- │ │ 41 个 bot_* 工具 + HTTP API │ │
53
+ │ │ 42 个 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`,41 个 `bot_*` 工具 |
144
+ | 模型工具 | 宿主 `tools.register`,42 个 `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 41 个模型工具
215
+ src/tools.js 42 个模型工具
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 个 | 42 个(改造09 新增 `bot_task_phase`) |
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
- | 当前测试数 1108 项 | `bash test/run-all.sh` | 2026-11-09 |
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
- | 「我的任务」页 | 人和智能体的任务混在一起 | 只显示 `source=human`(你自建的任务) |
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 → 1108 / 1108 pass, 0 fail
353
- bash test/run-all.sh → ✅ 全部通过(exit 0)
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