@shgroup/dsh-serenity-hooks 1.56.6 → 1.56.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -49
- package/dsh.plugin.json +1 -1
- package/lib/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
> **一句话**:装上这个插件,你在电脑上给 AI 划一块自己的工作区(就是一个普通目录),
|
|
4
4
|
> AI 在里面干活时就有了**记忆、纪律、工具和边界**——中途换模型、重启电脑、第二天再来,都能接着干。
|
|
5
5
|
>
|
|
6
|
-
>
|
|
6
|
+
> 适配 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(下称 DSH)的**两条发布线**:
|
|
7
|
+
> `0.1.7-rc.1` 与 `0.2.0-rc.1`(声明为 `^0.1.7-rc.1 || ^0.2.0-rc.1`,双档并行支持)。
|
|
7
8
|
> 想了解背后的想法(为什么叫"认知容器"),看 [docs/cognitive-container-theory.md](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/docs/cognitive-container-theory.md);本文只讲**能干什么、怎么用**。
|
|
8
9
|
|
|
9
10
|
**几个词先说明白**(后面都用这几个词,不再解释):
|
|
@@ -32,7 +33,7 @@
|
|
|
32
33
|
|
|
33
34
|
## 2. 快速开始(2 分钟)
|
|
34
35
|
|
|
35
|
-
前置:Node ≥ 20(或 bun)、DSH 0.1.7
|
|
36
|
+
前置:Node ≥ 20(或 bun)、DSH 0.1.7 或 0.2.0 任一发布线。
|
|
36
37
|
|
|
37
38
|
```bash
|
|
38
39
|
# 1. 装插件(自动加入 DSH 的 web profile)
|
|
@@ -59,7 +60,7 @@ dsh plugin --profile web add link:$(pwd)/hooks/dsh-serenity-hooks
|
|
|
59
60
|
|
|
60
61
|
> ⚠️ 别用 `dsh plugin add github:...` 这种写法——那个地址指向的是仓库根目录(不是插件包本身),装上了也不会生效。用 npm 或上面的 `link:` 方式。
|
|
61
62
|
|
|
62
|
-
**安全模式**:点一下网页端胶囊里的 SAFE 滑块,`bash` 就会从 AI
|
|
63
|
+
**安全模式**:点一下网页端胶囊里的 SAFE 滑块,`bash` 就会从 AI 的工具列表里**直接消失**——它根本看不到这个工具。开关是给你用的:AI 看不见、也打不开。(机制细节见 [§3.2](#32-机械约束ai-绕不过去)。)
|
|
63
64
|
|
|
64
65
|
---
|
|
65
66
|
|
|
@@ -70,21 +71,24 @@ dsh plugin --profile web add link:$(pwd)/hooks/dsh-serenity-hooks
|
|
|
70
71
|
| 工具 | 干什么 | 什么时候用 |
|
|
71
72
|
|---|---|---|
|
|
72
73
|
| `container_fs` | 在工作区里管文件:列目录、找文件、复制、移动、新建、追加、在文件管理器里打开 | 需要看/整理工作区里的文件时 |
|
|
73
|
-
| `container_trajectory` | **一条轨迹**:它的身体(SESSION.md)+
|
|
74
|
+
| `container_trajectory` | **一条轨迹**:它的身体(SESSION.md)+ 它的时间轴。建/看/切换/原地重建之外,还能登记**未来唤醒**与**即时递话** | 任何多步骤的活儿,第一步就是它;想让 AI 未来某刻自动接着干也用它 |
|
|
74
75
|
| `dashboard` | 仪表盘:工作区健康检查(三项)、当前时间、等待 | 进工作区先自查一下;等外部服务时用 |
|
|
75
76
|
| `container_git` | git 操作:status / commit / push / log / pull / diff | 提交和推送代码;它绝不自动强推 |
|
|
76
77
|
| `msm` | 小工具执行入口:`msm("名字", ["参数"])`;名字记不全就给候选;`inspect=true` 看用法 | 调用工作区里注册的任何小工具 |
|
|
77
78
|
| `praxis` | 按需给 AI 注入四套"做事方法":输出自检(eap)、设计对齐(neat)、认知连续性(cce)、本体工程(ontology) | 要它把话说清楚 / 先对齐再动手 / 动手前先把领域结构显式化时 |
|
|
78
|
-
| `ontology` | 本体工程**引擎**(能跑的那个):读 `.ttl`
|
|
79
|
-
| `serenity-skill-creator` |
|
|
79
|
+
| `ontology` | 本体工程**引擎**(能跑的那个):读 `.ttl` 本体文件,做结构校验、生成摘要、查"声明与实况是否一致"、出语义审查提示词、出合规清单,还能写一份新本体模板 | 想给某个领域建/校验本体时。⚠️ 与 `praxis ontology` 是**同一领域的两个面**:那个给**方法文本**(怎么建模),这个**真去检查**。路径必须在工作区内 |
|
|
80
|
+
| `serenity-skill-creator` | 增强型技能标准(serenity-skill)的创建器:`guide` 编写方法 / `create` 生成骨架(基础链路径由它算)/ `check` 结构体检(三态可分辨:已建模通过 · 普通技能 · 建模了但没查成)/ `review` 逐条合规问题清单 / `index` 预览**模型实际会看到**的参考件清单 / `status` 全容器一览 | 新建或改造技能、给技能建本体、想知道"模型到底看不看得见我那些参考件"时 |
|
|
80
81
|
| `handyman` | 杂工:派一个便宜模型的助手干活。**默认模式(foreground)**= 一次串行委派、拿回结果;**background 模式**= 循环干活直到完成(完成码校验 / 轮次上限 / 自动重启 / 进度文件),也可一次派多个并行 | 大批量、重复性的活(扫描几十个技能、逐用例回归) |
|
|
81
82
|
| `localstore` | 存密钥和配置(凭据、偏好两个命名空间) | API key、密码集中放一处,不进 git |
|
|
82
83
|
| `container_admin` | 机务舱:管理子角色、管理小工具注册表、查看全部配置 | 定义"子角色"、注册新小工具、改配置时 |
|
|
83
|
-
| `im-bridge` | 给 IM 联系人发消息(目前是微信):发文本、发文件、查已配置联系人、查通道状态。每次成功发送自动进工作区的消息记录 | 想让 AI 主动给家人/同事发消息(见 §6.
|
|
84
|
-
| `acc-diag` | ACC 运行态诊断:一次调用出全报告——当前有多少会话活着、各自属于哪个工作区、唤醒时钟的武装态与 tick
|
|
85
|
-
| `diagram` | 画图:AI
|
|
84
|
+
| `im-bridge` | 给 IM 联系人发消息(目前是微信):发文本、发文件、查已配置联系人、查通道状态。每次成功发送自动进工作区的消息记录 | 想让 AI 主动给家人/同事发消息(见 §6.2)。**条件出现**:只在工作区配了微信桥时才可见 |
|
|
85
|
+
| `acc-diag` | ACC 运行态诊断:一次调用出全报告——当前有多少会话活着、各自属于哪个工作区、唤醒时钟的武装态与 tick 次数、唤醒登记表的每一条 | **ACC 维护者专用**。**条件出现**:默认对所有工作区隐藏,只有在工作区配置里点名(`exclusiveTools`)才出现 |
|
|
86
|
+
| `diagram` | 画图:AI 给一段**标签式源码**,插件**在进程内**把它画成 PNG 并**贴进对话**——不启浏览器、不截图、正常路径不落文件。坐标 = 画布像素、y 向下;写错的图元逐条报错并跳过,其余照画;自带四项体检(块重叠 / 标签溢出 / 悬空端点 / 线压字),**只告警不拦图** | 想把关系图/示意图直接放进对话时。**条件出现**:实验性 demo,**默认关**(关着时这个工具**根本不注册**,AI 看不到它、不占上下文);开关在设置面板「工具」组,拨动即时生效。中英文与常用符号都能画,是因为字体随插件内置(约 5 MB) |
|
|
86
87
|
|
|
87
|
-
>
|
|
88
|
+
> **改过名**(旧名已彻底停用,无兼容别名;老会话里看到旧名,**一律取所在那一组的末项**):
|
|
89
|
+
> `cc_fs` → `container_fs` · `cc_git` → `container_git` · `session`+`session_rebuild` → `logbook` → `trajectory` → **`container_trajectory`**(今名) ·
|
|
90
|
+
> `acc_kit` → `dashboard` · `acc_msm` → `msm`(执行)+ `container_admin`(管理) · `eap`/`neat`/`cce` → `praxis` ·
|
|
91
|
+
> `skiff_admin` → `container_admin role` · `autopilot-trajectory` → `trajectory` → **`container_trajectory`**(今名)。
|
|
88
92
|
|
|
89
93
|
### 3.2 机械约束(AI 绕不过去)
|
|
90
94
|
|
|
@@ -99,20 +103,20 @@ dsh plugin --profile web add link:$(pwd)/hooks/dsh-serenity-hooks
|
|
|
99
103
|
| **对外输出守卫** | 对外面的会话(子角色 / ACP / 重建会话)如果答出敏感词,会被打回重答,并告诉它命中了哪个词、该怎么改 | 外面的人不该看到内部机制 |
|
|
100
104
|
| **轨迹提醒** | 做久了会提醒 AI"把进度写回工作日志",并要求它回一个确认码 | 提醒是机制,不是靠自觉 |
|
|
101
105
|
| **工作日志体积提醒** | 工作日志(SESSION.md)超过 200KB 时提醒 AI"停下来重写一遍",并附四条重写原则(保留骨架 / 细节挪到附件文件 / 该合并的合并 / 其余你自己判断) | 日志越写越厚就没人读得完;重写比堆积便宜。阈值按工作区可调(`sessionKeeper.sessionMdMaxKB`,0 = 关) |
|
|
102
|
-
| **重建前交接** | 要重建上下文时,会要求 AI 先把"手头做到哪了 / 还差什么 / 下一步做什么"
|
|
106
|
+
| **重建前交接** | 要重建上下文时,会要求 AI 先把"手头做到哪了 / 还差什么 / 下一步做什么"写进**本轨迹目录下的 `REBUILD-TODO.md`**(固定文件名);重建后的它第一件事就是去读这个文件接着干 | 上下文被清空,但手头的事不能丢。这张便签是**只用一次的交界材料**:无格式义务、随时可丢;超过 10 KB 会提醒它清理(`SCRATCH PRUNE`,整份删掉都可以) |
|
|
103
107
|
|
|
104
108
|
### 3.3 对外的入口
|
|
105
109
|
|
|
106
110
|
| 入口 | 默认端口 | 给谁用 |
|
|
107
111
|
|---|---|---|
|
|
108
|
-
| DSH 主界面 | 3080 |
|
|
112
|
+
| DSH 主界面 | 3080 | 你自己在本机用(插件不碰这个端口,也不起这个监听器) |
|
|
109
113
|
| **网页登录入口** | 3081 | 外部/手机访问完整界面:登录后反向代理到 3080,可配工作区白名单 |
|
|
110
114
|
| **微信主动发送入口** | 3082(只绑 127.0.0.1) | 工作区外的脚本/集成用它给微信发消息(公网到不了,所以不需要密钥)。工作区里的 AI 不走这个端口,直接用 `im-bridge` 工具 |
|
|
111
115
|
| **子角色调试页** | 3099(只绑 127.0.0.1) | 你调试"子角色"时用,能切换工作区、看对话轨迹 |
|
|
112
116
|
| **ACP + 对外问答页** | 3100(只绑 127.0.0.1) | 程序化接入(JSON-RPC)+ 给别人用的问答页(key 认证,只返回答案,不返回内部轨迹) |
|
|
113
117
|
| **微信桥** | 无需端口(出站长轮询) | 家人在微信里直接和 AI 说话 |
|
|
114
118
|
|
|
115
|
-
>
|
|
119
|
+
> 3081 / 3099 / 3100 **默认关**(要自己开);3082 **默认开**(微信桥启用时才有意义)。默认只监听 127.0.0.1 的入口,要暴露到公网由你自己决定(隧道 / 反代 / 端口映射都行),插件不绑定任何特定做法。
|
|
116
120
|
|
|
117
121
|
### 3.4 省你一步:用 opencode 的模型
|
|
118
122
|
|
|
@@ -152,14 +156,14 @@ my-workspace/ ← 工作区根目录(放一个 .serenity
|
|
|
152
156
|
│ └── …(每个技能可以自带脚本)
|
|
153
157
|
├── AGENT_SESSIONS/ ← 工作日志库:每个目录一本 SESSION.md
|
|
154
158
|
│ └── 2026-09-08--S142--xxx/
|
|
155
|
-
│
|
|
159
|
+
│ ├── SESSION.md ← 目标 / 决定 / 进度(永远留在这里,不会被搬走)
|
|
160
|
+
│ └── REBUILD-TODO.md ← 重建前的交接便签(只在需要时存在,可随时丢)
|
|
156
161
|
└── _tmp/ ← 运行时落盘:你粘贴的图片和文件
|
|
157
162
|
├── images_from_user/
|
|
158
163
|
└── files_from_user/
|
|
159
164
|
```
|
|
160
165
|
|
|
161
|
-
> 🔴
|
|
162
|
-
> 助手看到的是**两层**:**目录那一行就带参考件文件名**(插件按文件树即时生成 ⇒ 你新增一个文件它自己就更新,**不用手写**),
|
|
166
|
+
> 🔴 **技能的两层披露**:助手看到的 skill 目录**那一行就带参考件文件名**(插件按文件树即时生成 ⇒ 你新增一个文件它自己就更新,**不用手写**);
|
|
163
167
|
> 真要用时它才去 `read` 打开正文 —— **正文不进上下文,除非它自己去取**。
|
|
164
168
|
|
|
165
169
|
---
|
|
@@ -181,7 +185,7 @@ my-workspace/ ← 工作区根目录(放一个 .serenity
|
|
|
181
185
|
| 9 | **手机/外出使用** | 浏览器打开 `http://内网地址:3081` → 输密码或 6 位验证码 → 直接用完整界面 |
|
|
182
186
|
| 10 | **粘贴资料自动处理** | 粘图片 → 自动落盘 → 视觉模型识别(快递单/截图/图表);粘 PDF/压缩包 → 自动落盘 → 提取文本/解压/读表格 |
|
|
183
187
|
| 11 | **微信里用 AI** | 面板扫一次码 → 家人在微信发消息(文字/语音/图片/文件)→ 路由到指定子角色 → 回复回到微信 |
|
|
184
|
-
| 12 | **定时自己干活** |
|
|
188
|
+
| 12 | **定时自己干活** | 给某条轨迹放一段 `continuous-re-occurrence.ts`(CRO,见 §6.5)→ 调度器每 5 分钟问它一次"现在该不该醒、醒了说什么"→ 由**程序**决定何时接着干。也可以让轨迹在每轮结束时自己排下一轮 |
|
|
185
189
|
|
|
186
190
|
**典型一天**:
|
|
187
191
|
|
|
@@ -205,7 +209,7 @@ my-workspace/ ← 工作区根目录(放一个 .serenity
|
|
|
205
209
|
```
|
|
206
210
|
外部浏览器 → http://内网IP:3081
|
|
207
211
|
→ 没登录 → 极简登录页(用户名 + 密码,或 6 位动态验证码,二选一;手机端适配)
|
|
208
|
-
→ 提交 → scrypt 校验 / TOTP 校验 + CSRF 校验 +
|
|
212
|
+
→ 提交 → scrypt 校验 / TOTP 校验 + CSRF 校验 + 账号失败锁定
|
|
209
213
|
→ 通过 → 下发 HttpOnly cookie(SameSite=Strict,24 小时滑动续期)→ 302 跳转
|
|
210
214
|
→ 已登录 → 反向代理到 127.0.0.1:3080(改写过 Host/Origin,作为信任栅栏)
|
|
211
215
|
→ 工作区列表按白名单过滤 + 新建工作区做校验
|
|
@@ -228,9 +232,7 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
|
|
|
228
232
|
- **主动发消息**(v1.31.0):用 `im-bridge` 工具,AI 自己就能发——
|
|
229
233
|
`im-bridge({channel:"weixin", action:"send", user:"yh", text:"内容"})`
|
|
230
234
|
(发文件:`action:"send-file"` + `file:"<工作区内的路径>"`,可加 `caption`)。
|
|
231
|
-
|
|
232
|
-
它**只在工作区配了微信桥时才出现在工具列表里**——没配就看不到,而不是"看得到但一调就报错"。
|
|
233
|
-
(旧办法是工作区里自己写个小工具走 3082 端口,v1.31.0 起已退役;3082 保留给工作区外的脚本。)
|
|
235
|
+
没有"目标工作区"参数,所以它**发不错容器**;发出的消息会自动被记录(可见性见 §3.1)。
|
|
234
236
|
- **让 AI 自己决定怎么回**(v1.30.10):配置 `"weixin": { "autoReplyWithLastMessage": false }`
|
|
235
237
|
后,插件不再自动把 AI 最后那段话转给用户,而是每轮告诉它"你必须自己发",并附上一条可直接照抄的 `im-bridge` 调用。
|
|
236
238
|
适合需要过程汇报、想分多条发、或者该安静就安静的角色。默认 `true`(保持原行为)。
|
|
@@ -269,7 +271,6 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
|
|
|
269
271
|
|
|
270
272
|
- **key 认证**(常量时间比较 + 失败 IP 锁定 + 可轮换)+ 容器白名单(留空 = 全部开放)
|
|
271
273
|
- **只给答案**:响应里只有 answer / answer_html / sessionId——内部轨迹、工具结果、机制信息都不出去
|
|
272
|
-
- 默认只监听 127.0.0.1;要给别人用,怎么暴露(隧道/反代/端口映射)由你决定
|
|
273
274
|
|
|
274
275
|
### 6.5 轨迹与定时唤醒(trajectory)
|
|
275
276
|
|
|
@@ -279,13 +280,12 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
|
|
|
279
280
|
|
|
280
281
|
**即时投递**:用 `container_trajectory send-now` 把一条消息**现在**就递过去,并且**不排队**——目标在内存里且**正在跑轮次**,就 `steer` **当场注入当前轮**;目标空闲就**立即起一轮**;目标不在内存里就**冷载入后投递**(**等效于直接唤醒**,但**不等调度器的 5 分钟节拍**)。它**有同步回执**(告诉你走了 live 还是冷载入),**不落注册表**(那张表专管"未来时刻")。
|
|
281
282
|
|
|
282
|
-
- 两者只差两处:**时刻**(现在 / 未来)与**回执**(有 /
|
|
283
|
+
- 两者只差两处:**时刻**(现在 / 未来)与**回执**(有 / 无)——"预约"天生是 fire-and-forget(不可回收、不回执),"递话"则是一次调用一次答复。各自语义干净,不把两种语义塞进同一个动作(🔴 更名:原名 `wake-later` / `send-message`,现名 **`send-later` / `send-now`**——族名取共享词干 `send-`,轴取 `-later`/`-now`)
|
|
283
284
|
- ⚠️ **回执只到"已注入 / 已起轮"**:它**不表示**目标已经执行或答复。要确证"目标真的动了",得看它自己的 `SESSION.md`(**不得凭回执结案**)
|
|
284
285
|
- ⚠️ **唯一的例外路径**:`steer` 不可用时**退回排队**(fail-safe:**宁可排队,不可静默丢消息**)——此时回执文案写明"steer 不可用 ⇒ 退回 followup"。**`send-later` 不受影响**:预约的本职是"到点唤起",在跑时排队不打断当前轮是它被实证验收过的行为
|
|
285
|
-
|
|
286
|
-
- **目标没打开也能唤醒**:会话不在内存里时先把它载入再投递(**冷唤醒**);载入不了则条目留在登记表里并记下原因,**不静默丢弃**
|
|
286
|
+
- **目标没打开也能唤醒**:冷载入不了则条目留在登记表里并记下原因,**不静默丢弃**
|
|
287
287
|
- **"周期"归工作区自己**:要一轮接一轮,就由**收到唤醒的那条轨迹**在每轮结束时再排一次下一轮——ACC 只提供"到点投递一条消息"这个原语,不替工作区决定节拍(焦点、节拍、偏见都由工作区自定;任意条轨迹并行、互不干扰)
|
|
288
|
-
- **轨迹可以带上 skill
|
|
288
|
+
- **轨迹可以带上 skill**(两种写法,**取并集**:容器级在前、轨迹级追加、同名去重):① **一处声明、全容器生效**——在 `.opencode/serenity.json` 写 `trajectory.skills: [名字, …]`(底座),**本工作区的每条轨迹**被绑定期间都注入这些 skill 的全文(**连子角色会话也算**);② **只给这一条**——在它的 `SESSION.md` 顶部 frontmatter 写 `skills: [名字, …]`(这条额外的)。⚠️ 是"**绑定期间一直供着**"而非"`use` 时灌一次"——改了配置或 frontmatter**立即生效**(每请求重新求值,不缓存),也不随对话压缩消失;而 `create` 只新建、**不夺走当前绑定** ⇒ 新轨迹要**显式 `use`** 才挂上。skill 名来自工作区数据,**先过安全校验才会用于拼路径**,找不到会在提示里明说"缺失"而**不静默跳过**;⚠️ **重写 `SESSION.md` 时务必原样保留顶部 frontmatter**(抹掉 = 静默撤销该轨迹的声明)
|
|
289
289
|
|
|
290
290
|
#### CRO —— 让轨迹**自己判断什么时候该被叫醒**
|
|
291
291
|
|
|
@@ -295,8 +295,8 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
|
|
|
295
295
|
|
|
296
296
|
| | 内容 |
|
|
297
297
|
|---|---|
|
|
298
|
-
| **程序放哪** |
|
|
299
|
-
| **开关** | ① **逐轨迹**:**文件在 = 启用,文件不在 = 禁用**(无 enabled 字段、无注册表)② 🔴 **总闸**:设置面板「**CRO(轨迹自编程唤起)**」(`croEnabled
|
|
298
|
+
| **程序放哪** | `<工作区根>/AGENT_SESSIONS/<轨迹目录>/continuous-re-occurrence.ts`(放**轨迹自己目录**里 ⇒ 跟随轨迹跨载体存活、天然进 git) |
|
|
299
|
+
| **开关** | ① **逐轨迹**:**文件在 = 启用,文件不在 = 禁用**(无 enabled 字段、无注册表)② 🔴 **总闸**:设置面板「**CRO(轨迹自编程唤起)**」(`croEnabled`,缺省**开**)——关掉只停 CRO,不影响 `send-later` / `send-now` / 唤醒表投递 |
|
|
300
300
|
| **谁跑它** | ACC 的唤醒调度器(既有 **5 分钟** tick) |
|
|
301
301
|
| **给它什么** | 一条 stdin 进来的 **JSON 快照**:身份 / 时间 / 轨迹身体(SESSION.md 体积与 mtime、`references/` 清单)/ 绑定与载体(绑定的、live 的、🔴 **正在跑轮次的**)/ 调度面(本轨迹在办唤醒、调度器状态) |
|
|
302
302
|
| **它给我什么** | stdout **一行 JSON**:`{"wake":true,"prompt":"…","reason":"…"}` 或 `{"wake":false}`(**缺省 = 不打扰**) |
|
|
@@ -305,16 +305,14 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
|
|
|
305
305
|
**几条设计上的硬约束**(都不是随便定的):
|
|
306
306
|
|
|
307
307
|
- 🔴 **ACC 只"起进程",从不 import 你的程序**——进程边界同时挡掉两件事:ACC 不必依赖工作区的**源码路径**(装机版在别处,两条路径就是两个真相源),以及**一个用户程序的语法错会放倒整个容器**
|
|
308
|
-
- 🔴 **半成品报错就行**:程序报错 / 超时(60 秒硬超时,超了 kill)/ 输出非法 ⇒ **记一行 +
|
|
309
|
-
- 🔴 **CRO 的任何失败都不影响既有机制**——`send-later` / `send-now` / 唤醒表投递**照常工作**(这条有实测用例钉住,不是口头承诺)
|
|
308
|
+
- 🔴 **半成品报错就行**:程序报错 / 超时(60 秒硬超时,超了 kill)/ 输出非法 ⇒ **记一行 + 跳过本轮**——任何失败都不影响既有机制(这条有实测用例钉住,不是口头承诺)
|
|
310
309
|
- 🔴 **`reason` 强烈建议填**:改成程序判定之后,"当时为什么叫了"**不再能从时间表重建**(原因在程序肚子里);不写,以后出事无法复现
|
|
311
310
|
- **程序想要记住"上次判了什么",得自己记**——写在**自己轨迹目录**里的状态文件(那是它自己的进程状态,ACC 物理上拿不到)。所以**防抖也归程序**:想"别叫太频繁"就自己记时间戳
|
|
312
311
|
- ⚠️ **它不自带自测**:指南里给的流程是**先用开发名写**(如 `continuous-re-occurrence.dev.ts`,**不会被启用**)→ 配自测跑绿 → **再改名为正式名**(因为"文件在 = 启用",**改名这个动作就是上线动作**)
|
|
313
312
|
|
|
314
|
-
>
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
> ⚠️ **历史(v1.35.0 起已退场)**:ACC 曾自带一套"**周期自唤醒 autopilot**"——插件内时钟 + 工作区配置里的 `topPrompt`/偏见脚本 + 面板「周期自唤醒」开关 + `container_admin autopilot` 三动作(status/init/generate-bias)。**v1.35.0 起整段删除**。理由:它相对当时的 `wake-later`(**今 `send-later`**)只多两样——"周期节拍"与"提示词注入",而这两样**工作区自己就能做**(见上);且后者反而更强(**支持冷会话唤醒**,而 autopilot 要求目标会话已在内存里)。老会话 / 老文档里看到 `container_admin autopilot`、`autopilot-trajectory`、`--auto` 目录后缀、`[Autopilot Trajectory · 唤起]` 等字样,**均按本条理解**:那是已删除的机制。
|
|
313
|
+
> ⚠️ **历史**:ACC 曾自带一套"周期自唤醒 autopilot",**v1.35.0 起整段退场**(机制、时钟、`container_admin autopilot` 域、面板开关一并删除)。
|
|
314
|
+
> 老会话 / 老文档里看到 `container_admin autopilot`、`autopilot-trajectory`、`--auto` 目录后缀、`[Autopilot Trajectory · 唤起]` 等字样,均为**已删除的机制**。
|
|
315
|
+
> CRO 不是它的回归:退场删掉的是**判据内容**(周期节拍 + 提示词),留下的是**调度能力**;CRO 补的是"**在没人醒着的时候判断该不该醒**"。
|
|
318
316
|
|
|
319
317
|
### 6.6 安全模型
|
|
320
318
|
|
|
@@ -333,12 +331,13 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
|
|
|
333
331
|
|
|
334
332
|
| 层 | 位置 | 放什么 |
|
|
335
333
|
|---|---|---|
|
|
336
|
-
| DSH 原生设置 | DSH 的 settings.yaml |
|
|
334
|
+
| DSH 原生设置 | DSH 的 settings.yaml(就是设置面板那几项) | 开关与阈值:网关总开关、重建阈值、子角色开关与调试端口、ACP 与问答页开关、**CRO 总闸(`croEnabled`,默认为开)**、**无人值守代理回复(`unattendedEnabled`,默认为关)**、**图工具总闸(默认关)** |
|
|
337
335
|
| 插件全局文件 | `~/.dsh/serenity-hooks.json`(权限 0600) | 网关账号(scrypt + TOTP)、监听地址与端口、工作区白名单、cookie 安全开关、问答页 key |
|
|
338
|
-
| 工作区配置 | `.opencode/serenity.json` |
|
|
336
|
+
| 工作区配置 | `.opencode/serenity.json` | 助手模型白名单、日志阈值、安全模式黑名单、子角色、**轨迹级 skill 供给(`trajectory.skills`)**、微信(账号/路由/开关) |
|
|
339
337
|
| 工作区凭据 | `localstore.json` | 密钥与本地偏好;微信机器人 token 也在这一层 |
|
|
340
338
|
|
|
341
339
|
> 原则:**插件是全局的,工作区是具体的**——账号、开关、阈值归插件层;角色、凭据、本地偏好归工作区层。
|
|
340
|
+
> 「重建总开关」与「周期自唤醒」这两个旧开关**已砍掉**(超限重建恒开;周期节拍改由工作区/ CRO 自己决定),旧配置里若还留着它们,会被**静默忽略**。
|
|
342
341
|
|
|
343
342
|
---
|
|
344
343
|
|
|
@@ -349,7 +348,7 @@ AI 一次能"记住"的内容有上限。满了不用你手动开新会话:
|
|
|
349
348
|
| 机制 | 说人话 |
|
|
350
349
|
|---|---|
|
|
351
350
|
| **工作日志(SESSION.md)** | AI 的"笔记本",永远留在原地。目标、决定、进度都写这儿 |
|
|
352
|
-
| **原地重建(container_trajectory rebuild)** | 快满时它会提示 AI 主动重建:把这一轮对话清空,但重新注入"你是谁 + 继续 S### 的工作"
|
|
351
|
+
| **原地重建(container_trajectory rebuild)** | 快满时它会提示 AI 主动重建:把这一轮对话清空,但重新注入"你是谁 + 继续 S### 的工作"——**载体换了,活儿接着干**。重建前它会把"手头做到哪了"写进同目录的 `REBUILD-TODO.md`,重建后的它先去读那张便签 |
|
|
353
352
|
| **进度提醒** | 做久了会按计分提醒 AI 把进度写回日志,并要求它回确认码 |
|
|
354
353
|
| **沉淀纪律** | 重建前如果产生了有价值的认知,先把它写进相关技能(而不是丢掉) |
|
|
355
354
|
|
|
@@ -359,19 +358,19 @@ AI 一次能"记住"的内容有上限。满了不用你手动开新会话:
|
|
|
359
358
|
|
|
360
359
|
```bash
|
|
361
360
|
pnpm typecheck # 类型检查(node + 浏览器端两套)
|
|
362
|
-
pnpm test #
|
|
361
|
+
pnpm test # 全量测试(vitest;文件数与用例数看运行时输出,本文不写死)
|
|
363
362
|
pnpm build # 打包(lib/index.js + client.js)
|
|
364
363
|
```
|
|
365
364
|
|
|
366
365
|
- **开发用小工具**:`scripts/dsh-develop.ts`——typecheck / test / build / status / commit / push / version / bump / deploy / **lockfile** / **host-upgrade** / restart-web / publish / pack-check / github-push 一条龙。
|
|
367
366
|
`lockfile` = 重生成锁文件 + 用 `--frozen-lockfile` 自检(CI 的 `Install (hooks)` 同款判定);
|
|
368
367
|
`pack-check` 会在发布前核对打包产物是否完整(曾经踩过"发到 npm 少了文件"的坑);`scripts/dsh-crash-investigate.ts` 用来查崩溃(只读)。
|
|
369
|
-
⚠️ **改完 `package.json` 依赖后必须跑 `lockfile` 并提交锁文件** ——
|
|
370
|
-
- **宿主类型基准 = devDependencies
|
|
371
|
-
-
|
|
372
|
-
-
|
|
368
|
+
⚠️ **改完 `package.json` 依赖后必须跑 `lockfile` 并提交锁文件** —— 曾漏过这一步,CI 从此一直红(红在"测试根本没跑",见 CHANGELOG)
|
|
369
|
+
- **宿主类型基准 = devDependencies**:`tsconfig.json` / `client/tsconfig.json` 的 `paths` 指向**仓库内** `node_modules/@deepseek-ai/*`,由精确钉版的 devDependencies 提供 → **新增 paths 条目必须同时加 devDependency**(否则 tsc 静默回落 node_modules = 假绿,CI 的 typecheck 也就形同虚设)。机械闸门见 `tests/compliance.test.ts`;升级宿主时只改 `package.json` 一处 + 重跑 `lockfile`
|
|
370
|
+
- **升级宿主**:`dsh-develop host-upgrade <版本|dist-tag>` 全局升级 DSH CLI(包名硬编码 `@deepseek-ai/dsh`、默认官方源、`--dry-run` 预览)→ 把 `package.json` 的 peer/devDeps 基准抬到同一版本 + 重跑 `lockfile`(`compliance.test.ts` 与 `host-manifest.test.ts` 会强制各声明面同步,漏一处必红)→ `restart-web` → `dashboard health` 看 `dshVersion`
|
|
371
|
+
- **诊断会话打不开**:`dsh-develop session-doctor` —— 会话日志体检(**只读**)。
|
|
373
372
|
`--probe` 走宿主**真实读取路径**判定(`msm("dsh-develop", ["session-doctor","--probe","--summary"])` 可全量跑)。
|
|
374
|
-
⚠️ 两个易误读点:①
|
|
373
|
+
⚠️ 两个易误读点:① 存储层读**不走格式迁移** ⇒ 它对历史世代报 "no upgrade path" 属**正常现象**,不是损坏证据;判断"用户能不能打开"要看应用面 ② 本工具修的两个真实缺陷见 CHANGELOG(`rebuild` 写的事件缺字段 ⇒ 会话**永久打不开**;会话文件清理不认某些后缀 ⇒ 静默失效)
|
|
375
374
|
- **架构**:Cordis 原生插件,用 DSH 的正式接口注册工具和拦截点——**从不修改 DSH 本体**
|
|
376
375
|
- **代码地图**:[docs/codebase-overview-v1.22.md](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/docs/codebase-overview-v1.22.md)
|
|
377
376
|
- **设计决策**:见 [CHANGELOG.md](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/CHANGELOG.md) 和维护技能 `dsh-serenity-plugin-development`
|
|
@@ -386,7 +385,7 @@ pnpm build # 打包(lib/index.js + client.js)
|
|
|
386
385
|
| 跑在 | OpenCode | DeepSeek Harness |
|
|
387
386
|
| 实现 | 独立 | **独立**(不复用源码,但遵循同一套标准) |
|
|
388
387
|
| 系统提示词 | `system.transform` | `systemPrompt.section`,平台无关的部分逐字对齐 |
|
|
389
|
-
| 工具 | msm / container_fs / logbook 等 | container_fs / container_trajectory / dashboard / container_git / msm / praxis / ontology / handyman / localstore / container_admin + 三个条件出现的(`im-bridge` / `acc-diag` / `diagram`) |
|
|
388
|
+
| 工具 | msm / container_fs / logbook 等 | container_fs / container_trajectory / dashboard / container_git / msm / praxis / ontology / serenity-skill-creator / handyman / localstore / container_admin + 三个条件出现的(`im-bridge` / `acc-diag` / `diagram`) |
|
|
390
389
|
|
|
391
390
|
**同一个工作区可以随时换运行时**:`.serenity` 标记、`.opencode/skills/`、配置、`AGENT_SESSIONS/` 的文件格式都一致;
|
|
392
391
|
差别只在平台层(工具名、注入方式),换过去以后 AI 收到的约束是一样的。
|
|
@@ -399,10 +398,10 @@ pnpm build # 打包(lib/index.js + client.js)
|
|
|
399
398
|
先确认你进的是带 `.serenity` 标记的目录。不是工作区的话,插件完全不介入。进去后输入 `dashboard health` 看三项检查。
|
|
400
399
|
|
|
401
400
|
**Q:bash 怎么不见了?**
|
|
402
|
-
安全模式开着——这是设计,不是 bug
|
|
401
|
+
安全模式开着——这是设计,不是 bug。关掉胶囊里的 SAFE 滑块就回来了(机制见 §3.2)。
|
|
403
402
|
|
|
404
403
|
**Q:3081 登录被锁了?**
|
|
405
|
-
连续失败 5 次锁 15
|
|
404
|
+
连续失败 5 次锁 15 分钟起(指数退避,上限 4 小时)。等锁过期,或检查账号的验证码绑定状态。
|
|
406
405
|
|
|
407
406
|
**Q:上下文快满了怎么办?**
|
|
408
407
|
先让 AI 把进度写回 SESSION.md,然后按提示调用 `container_trajectory rebuild`。轨迹会自动接续,不用手动开新会话。
|
|
@@ -411,7 +410,7 @@ pnpm build # 打包(lib/index.js + client.js)
|
|
|
411
410
|
不会。只返回答案本身,内部轨迹和工具结果都不出去。
|
|
412
411
|
|
|
413
412
|
**Q:微信桥里,AI 的回复是怎么发出去的?**
|
|
414
|
-
默认由插件自动把它的最后一段话转发给你。如果配了 `autoReplyWithLastMessage: false`,插件就不转了,改由 AI
|
|
413
|
+
默认由插件自动把它的最后一段话转发给你。如果配了 `autoReplyWithLastMessage: false`,插件就不转了,改由 AI 自己发——所以这时候它如果没发,你就收不到消息(除非另外开了 `fallbackOnNoSend` 让插件兜底)。
|
|
415
414
|
|
|
416
415
|
**Q:主动发的微信消息会被记录吗?**
|
|
417
416
|
会。和工作区里配的 `weixin.hook` 记录脚本走同一条路,事件里标 `source: "proactive"`;自动回复标 `source: "reply"`。
|
|
@@ -422,7 +421,7 @@ pnpm build # 打包(lib/index.js + client.js)
|
|
|
422
421
|
|
|
423
422
|
- **这套东西的想法从哪来**:[docs/cognitive-container-theory.md](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/docs/cognitive-container-theory.md)——认知容器是什么、认知的"发生/存储/再发生"、轨迹与载体
|
|
424
423
|
- **权威标准**:[serenity-acc-specs](https://github.com/tellmewhattodo/serenity-acc-specs)——理论根基、注入规范、不变量
|
|
425
|
-
- **改了什么**:[CHANGELOG.md](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/CHANGELOG.md)
|
|
424
|
+
- **改了什么**:[CHANGELOG.md](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/CHANGELOG.md)——每个版本做了什么、为什么这么做,**当前版本号也看这里**
|
|
426
425
|
|
|
427
426
|
---
|
|
428
427
|
|
|
@@ -430,4 +429,5 @@ pnpm build # 打包(lib/index.js + client.js)
|
|
|
430
429
|
|
|
431
430
|
MIT(见 [LICENSE](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/LICENSE))
|
|
432
431
|
|
|
433
|
-
>
|
|
432
|
+
> **前置**:DSH `^0.1.7-rc.1 || ^0.2.0-rc.1`(双档)| Node ≥ 20 或 bun。
|
|
433
|
+
> **当前版本 / 工具数 / 测试规模**均不写死在此 —— 版本看 [CHANGELOG.md](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/CHANGELOG.md),运行态看设置面板与 `dashboard health`。
|
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-serenity-hooks",
|
|
3
|
-
"version": "1.56.
|
|
3
|
+
"version": "1.56.7",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"description": "宁静号 ACC harness(Native Cordis 插件):给 DSH 装一个「AI 工作区」——14 个工具(container_fs/container_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/handyman/localstore/container_admin;另三个 im-bridge/acc-diag/diagram 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫)+ 轨迹日志与原地重建 + 网页登录入口/微信桥/子角色/对外问答页/trajectory 唤醒注册表。适配 DSH 0.1.7-rc.1 与 0.2.0-rc.1(双档,deepseek-ai/deepseek-harness)。",
|
|
6
6
|
"engines": {
|
package/lib/index.js
CHANGED
|
@@ -3443,7 +3443,7 @@ function toolsBlock() {
|
|
|
3443
3443
|
" container_fs — container filesystem operations (15 subcommands: root/resolve/exists/list/tree/relative/mkdir/rm/mv/cp/touch/append/reveal/info/find)",
|
|
3444
3444
|
" container_trajectory — one trajectory: its persistent body (SESSION.md) + its timeline. Lifecycle: list (inventory + stats) / show / create / use (activate; inline integrity check — silent when fine) / rebuild (clear-and-rebuild this conversation in place, Ship of Theseus); delivery: send-now (deliver one message RIGHT NOW; live target injected immediately, non-live cold-resumed like a direct wake — returns a synchronous receipt) / send-later (one future instant + one message to any trajectory; fire-and-forget — no receipt, no recall) / cro-guide (the CRO programming guide: how to give THIS trajectory its own program that decides when it should be woken)",
|
|
3445
3445
|
" dashboard — always-on container instruments: health (CCC three-principle check + registry integrity) / time (now) / wait (N seconds)",
|
|
3446
|
-
" container_git— git operations (status/commit/push/log)",
|
|
3446
|
+
" container_git— git operations (status/commit/push/log/pull/diff)",
|
|
3447
3447
|
" msm — execute a registered CCC MSM: msm(name, args); partial name returns candidates; inspect=true shows usage",
|
|
3448
3448
|
" praxis — actionable theory injection: praxis (index) / praxis eap / praxis neat / praxis cce / praxis ontology",
|
|
3449
3449
|
" ontology — ontology engineering ENGINE (executable): init (write template) / check (M1-M10 structural; level=strict adds L1-L5 hints) / explain (summary) / verify (V1-V4 runtime compliance) / review (semantic-review prompt) / compliance (axiom-vs-skill checklist). Sibling of `praxis ontology` — that one is the METHOD TEXT, this one RUNS it. path must stay inside the container; the receipt carries the engine exit code (0/1/2/4) and the engine text verbatim, so read it rather than assuming success",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shgroup/dsh-serenity-hooks",
|
|
3
|
-
"version": "1.56.
|
|
3
|
+
"version": "1.56.7",
|
|
4
4
|
"description": "宁静号 ACC harness(Native Cordis 插件)——给 DeepSeek Harness 装一个「AI 工作区」:14 个工具(container_fs/container_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/handyman/localstore/container_admin;另三个 im-bridge/acc-diag/diagram 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫/对外输出守卫)+ 工作日志与原地重建 + 网页登录入口/微信桥/子角色/对外问答页/trajectory 唤醒注册表。适配 DSH 0.1.7-rc.1 与 0.2.0-rc.1(双档)。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|