@shgroup/dsh-serenity-hooks 1.32.0 → 1.34.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/README.md +11 -11
- package/dsh.plugin.json +5 -5
- package/experiments/autopilot-trajectory/SKILL.md +12 -12
- package/experiments/autopilot-trajectory/scripts/autopilot-trajectory.ts +69 -45
- package/lib/autopilot-script.d.ts +40 -0
- package/lib/autopilot-trajectory.d.ts +29 -0
- package/lib/{ccc-DAsSHsub.js → ccc-eu_IPF94.js} +17 -1
- package/lib/ccc.d.ts +20 -0
- package/lib/client.js +28 -8
- package/lib/diag-ops.d.ts +61 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +3192 -3182
- package/lib/invariant.d.ts +5 -1
- package/lib/invariant.js +7 -3
- package/lib/json.d.ts +1 -1
- package/lib/msm-ops.d.ts +2 -2
- package/lib/output-guard-seam.d.ts +1 -1
- package/lib/rebuild.d.ts +4 -3
- package/lib/seams/guards.d.ts +27 -0
- package/lib/seams/keeper.d.ts +3 -3
- package/lib/{settings-section-Bm-xG-NR.js → settings-section-BuPGQv_H.js} +5 -6
- package/lib/settings-section.d.ts +15 -8
- package/lib/skiff-core.d.ts +1 -1
- package/lib/{skiff-debug-K2k1JnGj.js → skiff-debug-D83-Njy7.js} +7 -7
- package/lib/{skiff-role-BYvNnwv1.js → skiff-role-DAfPb6YQ.js} +1 -1
- package/lib/tools/acc-diag.d.ts +22 -0
- package/lib/tools/container-admin.d.ts +1 -1
- package/lib/tools/{session.d.ts → trajectory.d.ts} +32 -16
- package/lib/{session-bound-NHozeLFc.js → trajectory-bound-C8DUxi6_.js} +21 -276
- package/lib/{session-bound.d.ts → trajectory-bound.d.ts} +2 -2
- package/lib/{session-ops.d.ts → trajectory-ops.d.ts} +24 -28
- package/lib/wake-registry-D0Vj0WXb.js +270 -0
- package/lib/wake-scheduler.d.ts +41 -2
- package/lib/{weixin-route-wWk4AIwV.js → weixin-route-D1ND823E.js} +1 -1
- package/package.json +2 -2
- package/lib/tools/autopilot-trajectory.d.ts +0 -25
package/README.md
CHANGED
|
@@ -65,23 +65,23 @@ dsh plugin --profile web add link:$(pwd)/hooks/dsh-serenity-hooks
|
|
|
65
65
|
|
|
66
66
|
## 3. 装完之后你多了什么
|
|
67
67
|
|
|
68
|
-
### 3.1
|
|
68
|
+
### 3.1 十一个工具(其中两个按条件出现)
|
|
69
69
|
|
|
70
70
|
| 工具 | 干什么 | 什么时候用 |
|
|
71
71
|
|---|---|---|
|
|
72
72
|
| `container_fs` | 在工作区里管文件:列目录、找文件、复制、移动、新建、追加、在文件管理器里打开 | 需要看/整理工作区里的文件时 |
|
|
73
|
-
| `
|
|
73
|
+
| `container_trajectory` | **一条轨迹**:它的身体(SESSION.md)+ 它的时间轴。建/看/切换/原地重建之外,还能登记**未来唤醒**(= 未来某时刻 + 一条消息,可唤醒自己,也可唤醒别的轨迹) | 任何多步骤的活儿,第一步就是它;想让 AI 未来某刻自动接着干也用它 |
|
|
74
74
|
| `dashboard` | 仪表盘:工作区健康检查(三项)、当前时间、等待 | 进工作区先自查一下;等外部服务时用 |
|
|
75
75
|
| `container_git` | git 操作:status / commit / push / log / pull / diff | 提交和推送代码;它绝不自动强推 |
|
|
76
76
|
| `msm` | 小工具执行入口:`msm("名字", ["参数"])`;名字记不全就给候选;`inspect=true` 看用法 | 调用工作区里注册的任何小工具 |
|
|
77
77
|
| `praxis` | 按需给 AI 注入三套"做事方法":输出自检(eap)、设计对齐(neat)、认知连续性(cce) | 要它把话说清楚 / 先对齐再动手时 |
|
|
78
78
|
| `handyman` | 杂工:派一个便宜模型的助手干活。**默认模式(foreground)**= 一次串行委派、拿回结果;**background 模式**= 循环干活直到完成(完成码校验 / 轮次上限 / 自动重启 / 进度文件),也可一次派多个并行 | 大批量、重复性的活(扫描几十个技能、逐用例回归) |
|
|
79
79
|
| `localstore` | 存密钥和配置(凭据、偏好两个命名空间) | API key、密码集中放一处,不进 git |
|
|
80
|
-
| `container_admin` |
|
|
81
|
-
| `trajectory` | 轨迹管理:登记**未来唤醒**(唤醒 = 未来某时刻 + 一条消息,可唤醒自己,也可唤醒别的轨迹);定时自动巡航(到点唤醒工作区、注入当前焦点),支持多个工作区各自独立 | 想让 AI 定时自己干活、或安排它未来某刻自动接着干(见 §6.5) |
|
|
80
|
+
| `container_admin` | 机务舱:管理子角色、管理小工具注册表、查看全部配置,以及**定时自动巡航**(autopilot:状态 / 初始化 / 生成先验偏见) | 定义"子角色"、注册新小工具、开自动巡航时 |
|
|
82
81
|
| `im-bridge` | 给 IM 联系人发消息(目前是微信):发文本、发文件、查已配置联系人、查通道状态。每次成功发送自动进工作区的消息记录 | 想让 AI 主动给家人/同事发消息(见 §6.6)。**只在工作区配了微信桥时才出现**,且只能发本工作区的消息 |
|
|
82
|
+
| `acc-diag` | ACC 运行态诊断:一次调用出全报告——当前有多少会话活着、各自属于哪个工作区、自动巡航的到点判断与 agent 定位、唤醒登记表的每一条、以及"这一轮为什么没被唤起"的条件链 | **ACC 维护者专用**。**默认对所有工作区隐藏**,只有在工作区配置里点名(`exclusiveTools`)才出现 |
|
|
83
83
|
|
|
84
|
-
>
|
|
84
|
+
> **改过名**(旧名已彻底停用,没有兼容别名):下面每组的箭头链是**逐个发布版本**的名字,**末项才是今名**——`cc_fs` → `container_fs` · `cc_git` → `container_git` · `session`+`session_rebuild` → `logbook`(v1.30/1.31)→ `trajectory`(v1.32)→ **`container_trajectory`**(v1.34,今名) · `acc_kit` → `dashboard` · `acc_msm` → `msm`(执行)+ `container_admin`(管理)· `eap`/`neat`/`cce` → `praxis` · `skiff_admin` → `container_admin role` · `autopilot-trajectory` → `trajectory`(v1.32)→ **`container_trajectory`**(v1.34,今名;其自动巡航面现归 `container_admin`)。老会话里看到旧名,**一律取所在那一组的末项**。
|
|
85
85
|
|
|
86
86
|
### 3.2 机械约束(AI 绕不过去)
|
|
87
87
|
|
|
@@ -163,7 +163,7 @@ my-workspace/ ← 工作区根目录(放一个 .serenity
|
|
|
163
163
|
|
|
164
164
|
| # | 你想干的事 | 实际怎么走 |
|
|
165
165
|
|---|---|---|
|
|
166
|
-
| 1 | **长期项目不断线** | `
|
|
166
|
+
| 1 | **长期项目不断线** | `container_trajectory create` 建轨迹 → 每推进一段写进去 → 中断后 `container_trajectory use` 接上 → 上下文满了 `container_trajectory rebuild` 原地重建并自动继续 |
|
|
167
167
|
| 2 | **批量同步代码** | 当前仓库 `container_git commit/push`;多个子仓库一条命令全同步(自动提交 + 推送) |
|
|
168
168
|
| 3 | **做一集字幕** | 搜片源 → 下载 → Whisper 转写 → 翻译 → 双语 SRT → 机械质检(7 项)→ 推送订阅/邮件 |
|
|
169
169
|
| 4 | **服务器巡检** | 一条命令出 CPU/内存/GPU/容器/服务报告;重启容器也在同一条白名单通道里 |
|
|
@@ -266,7 +266,7 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
|
|
|
266
266
|
|
|
267
267
|
### 6.5 轨迹与自主巡航(trajectory)
|
|
268
268
|
|
|
269
|
-
`trajectory`(轨迹)是一等概念:一个工作区里可以有任意多条轨迹并行;**autopilot(自主巡航)是它的一个子集**——"周期自唤醒"
|
|
269
|
+
`trajectory`(轨迹)是一等概念:一个工作区里可以有任意多条轨迹并行;**autopilot(自主巡航)是它的一个子集**——"周期自唤醒"的特例(开关与控制归 `container_admin autopilot`)。
|
|
270
270
|
|
|
271
271
|
**自主巡航**:让工作区**到点自己醒过来干活**,全程在你眼前发生(前台注入,随时可介入):
|
|
272
272
|
|
|
@@ -274,7 +274,7 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
|
|
|
274
274
|
- **醒了先看什么**:先看你自己写的"焦点"(`topPrompt`,每轮最先注入,防跑偏),再看随机生成的"偏见内容"(你写的脚本,负责探索方向)
|
|
275
275
|
- **多个工作区各自独立**:每个工作区自己的间隔/会话/焦点/窗口,互不干扰
|
|
276
276
|
- **有审计**:每次唤醒都记一笔,面板里能看到最近几次;失败会指数退避重试
|
|
277
|
-
-
|
|
277
|
+
- **还能预约未来某一刻**:用 `container_trajectory wake-later` 登记一条"唤醒"= 未来某时刻 + 一条消息——可以给自己预约,也可以唤醒别的轨迹;落在工作区内的 `AGENT_SESSIONS/wake-registry.json`(可读可审计),到点由中心调度器投递,不阻塞、不等待、也不回执
|
|
278
278
|
- 没有"每天最多唤醒几次"的限制——频率只由间隔和窗口决定
|
|
279
279
|
|
|
280
280
|
### 6.6 安全模型
|
|
@@ -310,7 +310,7 @@ AI 一次能"记住"的内容有上限。满了不用你手动开新会话:
|
|
|
310
310
|
| 机制 | 说人话 |
|
|
311
311
|
|---|---|
|
|
312
312
|
| **工作日志(SESSION.md)** | AI 的"笔记本",永远留在原地。目标、决定、进度都写这儿 |
|
|
313
|
-
| **原地重建(
|
|
313
|
+
| **原地重建(container_trajectory rebuild)** | 快满时它会提示 AI 主动重建:把这一轮对话清空,但重新注入"你是谁 + 继续 S### 的工作"——**载体换了,活儿接着干**。重建后的 token 计量也正确回落 |
|
|
314
314
|
| **进度提醒** | 做久了会按计分提醒 AI 把进度写回日志,并要求它回确认码 |
|
|
315
315
|
| **沉淀纪律** | 重建前如果产生了有价值的认知,先把它写进相关技能(而不是丢掉) |
|
|
316
316
|
|
|
@@ -347,7 +347,7 @@ pnpm build # 打包(lib/index.js + client.js)
|
|
|
347
347
|
| 跑在 | OpenCode | DeepSeek Harness |
|
|
348
348
|
| 实现 | 独立 | **独立**(不复用源码,但遵循同一套标准) |
|
|
349
349
|
| 系统提示词 | `system.transform` | `systemPrompt.section`,平台无关的部分逐字对齐 |
|
|
350
|
-
| 工具 | msm / container_fs / logbook 等 | container_fs /
|
|
350
|
+
| 工具 | msm / container_fs / logbook 等 | container_fs / container_trajectory / dashboard / container_git / msm / praxis / handyman / localstore / container_admin + 两个条件出现的(`im-bridge` / `acc-diag`) |
|
|
351
351
|
|
|
352
352
|
**同一个工作区可以随时换运行时**:`.serenity` 标记、`.opencode/skills/`、配置、`AGENT_SESSIONS/` 的文件格式都一致;
|
|
353
353
|
差别只在平台层(工具名、注入方式),换过去以后 AI 收到的约束是一样的。
|
|
@@ -366,7 +366,7 @@ pnpm build # 打包(lib/index.js + client.js)
|
|
|
366
366
|
连续失败 5 次锁 15 分钟(指数退避)。等锁过期,或检查账号的验证码绑定状态。
|
|
367
367
|
|
|
368
368
|
**Q:上下文快满了怎么办?**
|
|
369
|
-
先让 AI 把进度写回 SESSION.md,然后按提示调用 `
|
|
369
|
+
先让 AI 把进度写回 SESSION.md,然后按提示调用 `container_trajectory rebuild`。轨迹会自动接续,不用手动开新会话。
|
|
370
370
|
|
|
371
371
|
**Q:对外问答页会返回内部信息吗?**
|
|
372
372
|
不会。只返回答案本身,内部轨迹和工具结果都不出去。
|
package/dsh.plugin.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-serenity-hooks",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.34.0",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
|
-
"description": "宁静号 ACC harness(Native Cordis 插件):给 DSH 装一个「AI 工作区」——11 个工具(container_fs/
|
|
5
|
+
"description": "宁静号 ACC harness(Native Cordis 插件):给 DSH 装一个「AI 工作区」——11 个工具(container_fs/container_trajectory/dashboard/container_git/msm/praxis/handyman/localstore/container_admin/im-bridge/acc-diag;后两个按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫)+ 轨迹日志与原地重建 + 网页登录入口/微信桥/子角色/对外问答页/trajectory 唤醒注册表。适配 DSH 0.1.5-rc.2(deepseek-ai/deepseek-harness)。",
|
|
6
6
|
"engines": {
|
|
7
7
|
"dsh": ">=0.1.5-rc.2"
|
|
8
8
|
},
|
|
9
9
|
"contributes": {
|
|
10
10
|
"tools": [
|
|
11
11
|
"container_fs",
|
|
12
|
-
"
|
|
12
|
+
"container_trajectory",
|
|
13
13
|
"dashboard",
|
|
14
14
|
"container_git",
|
|
15
15
|
"msm",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"handyman",
|
|
18
18
|
"localstore",
|
|
19
19
|
"container_admin",
|
|
20
|
-
"
|
|
21
|
-
"
|
|
20
|
+
"im-bridge",
|
|
21
|
+
"acc-diag"
|
|
22
22
|
],
|
|
23
23
|
"skills": []
|
|
24
24
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: autopilot-trajectory-experiment
|
|
3
|
-
description: Autopilot Trajectory(自动巡航轨迹,正式版;前身自主轨迹实验)参与 skill。本 skill 让 CCC 完整理解机制背景(人类 waiting 是 trajectory 速度瓶颈)、目的(验证"无人等待的 trajectory"能否加速认知推进)、方式(时钟唤起 + 先验偏见 + 轨迹焦点 + 前台运行 + 多 CCC
|
|
3
|
+
description: Autopilot Trajectory(自动巡航轨迹,正式版;前身自主轨迹实验)参与 skill。本 skill 让 CCC 完整理解机制背景(人类 waiting 是 trajectory 速度瓶颈)、目的(验证"无人等待的 trajectory"能否加速认知推进)、方式(时钟唤起 + 先验偏见 + 轨迹焦点 + 前台运行 + 多 CCC 独立),并提供一站式管理入口(v1.33 起归 `container_admin autopilot`:status 全报告 / init 初始化 / generate-bias 验证偏见内容;条件链诊断走开发面脚本)。任何希望参与的 CCC 复制本目录到 .opencode/skills/ 即可开始。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Skill: autopilot-trajectory-experiment
|
|
7
7
|
|
|
8
8
|
> 本 skill 是 Autopilot Trajectory(自动巡航轨迹)的 **CCC 参与入口**——加载本 skill 即完整理解机制的**背景、目的、方式**。
|
|
9
|
-
>
|
|
9
|
+
> 实验管理(v1.33 起):`container_admin autopilot status | init | generate-bias`(原 `trajectory all/init/random`——D58 起工具更名 `trajectory`,v1.33 起 autopilot 面归机务舱,硬切无别名)
|
|
10
10
|
> 理论依据:serenity-acc-specs `docs/self-sustaining-trajectory-hypothesis.md`(v0.1 猜想)
|
|
11
11
|
|
|
12
12
|
## 触发条件/何时加载
|
|
@@ -37,7 +37,7 @@ description: Autopilot Trajectory(自动巡航轨迹,正式版;前身自
|
|
|
37
37
|
|
|
38
38
|
## 3. 参与方式(CCC 侧四步——第一步可一键 init)
|
|
39
39
|
|
|
40
|
-
### ① 初始化(一键):`
|
|
40
|
+
### ① 初始化(一键):`container_admin autopilot init`
|
|
41
41
|
|
|
42
42
|
自动完成:写配置(`.opencode/serenity.json` `trajectory.autopilot` 段)+ 生成偏见提供者脚本模板(CCC 根 `autopilot-bias.ts`)。
|
|
43
43
|
|
|
@@ -63,7 +63,7 @@ description: Autopilot Trajectory(自动巡航轨迹,正式版;前身自
|
|
|
63
63
|
|
|
64
64
|
### ③ 实现偏见内容提供者(`autopilot-bias.ts`)
|
|
65
65
|
|
|
66
|
-
CCC 根目录下一个脚本,**stdout 输出本轮唤起注入的偏见内容**(反事实问题/探索方向/任何让轨迹偏离既有路径的输入)。**偏见内容归 CCC**——用本 CCC 自己的反馈信息来源保证"足够随机"。`
|
|
66
|
+
CCC 根目录下一个脚本,**stdout 输出本轮唤起注入的偏见内容**(反事实问题/探索方向/任何让轨迹偏离既有路径的输入)。**偏见内容归 CCC**——用本 CCC 自己的反馈信息来源保证"足够随机"。`container_admin autopilot generate-bias` 可验证输出。
|
|
67
67
|
|
|
68
68
|
### ④ 标记目标会话(可选自生动机段)
|
|
69
69
|
|
|
@@ -85,17 +85,17 @@ CCC 根目录下一个脚本,**stdout 输出本轮唤起注入的偏见内容*
|
|
|
85
85
|
|
|
86
86
|
**人类角色**:不触发、不中断;回复/评价天然并入(同一前台会话);轨迹不等人类。
|
|
87
87
|
|
|
88
|
-
## 5. 实验管理(`
|
|
88
|
+
## 5. 实验管理(`container_admin autopilot`)——一站式
|
|
89
89
|
|
|
90
90
|
| 用法 | 功能 |
|
|
91
91
|
|------|------|
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
|
|
|
96
|
-
|
|
|
97
|
-
|
|
|
98
|
-
| `
|
|
92
|
+
| `container_admin autopilot status`(**推荐,无参即全报告**) | **一站式全报告**:背景摘要 + 就绪度检查 + 当前状态 + 下一步指引 + 步骤——CCC agent 看一次即完整理解并知道怎么开始 |
|
|
93
|
+
| `container_admin autopilot init` | **一键初始化**:写配置(`trajectory.autopilot`)+ 生成偏见提供者脚本模板(CCC 根 autopilot-bias.ts) |
|
|
94
|
+
| `container_admin autopilot generate-bias` | 运行偏见提供者脚本,输出当前偏见内容(验证) |
|
|
95
|
+
| (开发面)`bun <包内脚本> check` | 仅就绪度检查(配置/轨迹焦点 topPrompt/偏见提供者/--auto 标志/动机段) |
|
|
96
|
+
| (开发面)`bun <包内脚本> status` | 仅当前状态(配置快照/目标会话/距上次活动/唤起窗口/可唤起性) |
|
|
97
|
+
| (开发面)`bun <包内脚本> diag` | 唤起条件链诊断(逐条件 + 阻断点 + 修复建议)——CCC 侧另有专属工具 `acc-diag`(含进程内 live 运行态) |
|
|
98
|
+
| (开发面)`bun <包内脚本> doc` / `guide` | 机制定义全文(本 SKILL.md)/ 仅步骤指引 |
|
|
99
99
|
|
|
100
100
|
## 6. 观察与验证
|
|
101
101
|
|
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
/**
|
|
3
|
-
* autopilot-trajectory.ts —
|
|
3
|
+
* autopilot-trajectory.ts — 自主轨迹实验管理脚本(Mech,纯 TS 零 LLM 决策)——一站式
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* acc_msm exec autopilot-trajectory status → 仅当前状态
|
|
13
|
-
* acc_msm exec autopilot-trajectory guide → 仅步骤指引
|
|
5
|
+
* 脚本通道(v1.33 命名:CCC 工具面已改由 `container_admin autopilot` 承载**三个**动作,
|
|
6
|
+
* 脚本自身保留全部子命令供开发面直接调用):
|
|
7
|
+
* container_admin autopilot status → 一站式全报告(背景 + 就绪 + 状态 + 下一步) [脚本 all]
|
|
8
|
+
* container_admin autopilot init → 初始化实验(写配置 + 生成偏见提供者脚本模板) [脚本 init]
|
|
9
|
+
* container_admin autopilot generate-bias → 运行偏见提供者脚本,输出当前偏见内容(验证) [脚本 random]
|
|
10
|
+
* (开发面)bun <脚本> diag → 唤起条件链诊断(--ccc <path> 指定;无参递归扫描 /home/yh 两层)
|
|
11
|
+
* (开发面)bun <脚本> doc|check|status|guide → 定义全文 / 仅就绪度 / 仅状态 / 仅步骤指引
|
|
14
12
|
*
|
|
15
13
|
* 概念(用户拍板命名):偏见内容提供者(bias provider)——CCC 根目录下一个脚本,
|
|
16
14
|
* stdout 输出本轮唤起要注入的偏见内容(反事实方向/探索动机等)。tool 直接运行它;
|
|
17
15
|
* 脚本缺失 → 报错要求实现(不再经 mech-registry 注册 MSM)。
|
|
18
16
|
*
|
|
19
|
-
* 状态查看:WebUI
|
|
20
|
-
* (POST /serenity/
|
|
17
|
+
* 状态查看:WebUI 设置面板「trajectory」区块(GET /serenity/trajectory)+「立即唤起」按钮
|
|
18
|
+
* (POST /serenity/trajectory {action:'wake'},调试语义跳过窗口/间隔)——由插件提供,脚本不重复。
|
|
19
|
+
* 运行态诊断(live 会话 / agent 定位 / 唤醒注册表):专属工具 `acc-diag`(ACC 负责人)。
|
|
21
20
|
*
|
|
22
|
-
* 零 DSH 依赖,任何 CCC 可运行。环境:SERENITY_ROOT
|
|
21
|
+
* 零 DSH 依赖,任何 CCC 可运行。环境:SERENITY_ROOT(由 `container_admin` 的 autopilot 域注入)或 cwd 上溯 .serenity。
|
|
23
22
|
*/
|
|
24
23
|
|
|
25
24
|
import { existsSync, readFileSync, statSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs'
|
|
@@ -91,13 +90,24 @@ function readUtf8(p: string): string {
|
|
|
91
90
|
return readFileSync(p, 'utf-8').replace(/^\uFEFF/, '')
|
|
92
91
|
}
|
|
93
92
|
|
|
93
|
+
/**
|
|
94
|
+
* 读 autopilot 配置:与插件侧 `readAutopilotSettings` **同一回退链**
|
|
95
|
+
* (`trajectory.autopilot` → `autopilotTrajectory` → `autotrajectory`,D58;逐级回退、不回写)。
|
|
96
|
+
*
|
|
97
|
+
* 为什么必须对齐(v1.33 修正):脚本与插件是两个读侧。若只认旧键,CCC 把配置迁到新键后,
|
|
98
|
+
* 调度器照跑而 `container_admin autopilot status` 报"未配置"——**静默的假阴性**。
|
|
99
|
+
*/
|
|
94
100
|
function loadConfig(root: string): AutoConfig | null {
|
|
95
101
|
for (const rel of CONFIG_PATHS) {
|
|
96
102
|
const p = join(root, rel)
|
|
97
103
|
if (!existsSync(p)) continue
|
|
98
104
|
try {
|
|
99
|
-
const cfg = JSON.parse(readUtf8(p)) as {
|
|
100
|
-
|
|
105
|
+
const cfg = JSON.parse(readUtf8(p)) as {
|
|
106
|
+
autopilotTrajectory?: AutoConfig
|
|
107
|
+
autotrajectory?: AutoConfig
|
|
108
|
+
trajectory?: { autopilot?: AutoConfig }
|
|
109
|
+
}
|
|
110
|
+
return cfg.trajectory?.autopilot ?? cfg.autopilotTrajectory ?? cfg.autotrajectory ?? null
|
|
101
111
|
} catch {
|
|
102
112
|
return null
|
|
103
113
|
}
|
|
@@ -124,7 +134,7 @@ function runBiasProvider(root: string, providerRel: string): { text: string | nu
|
|
|
124
134
|
return { text: null, error: String((e as Error).message) }
|
|
125
135
|
}
|
|
126
136
|
if (!existsSync(scriptAbs)) {
|
|
127
|
-
return { text: null, error: `请在 CCC 根目录实现偏见内容提供者脚本: ${providerRel}(
|
|
137
|
+
return { text: null, error: `请在 CCC 根目录实现偏见内容提供者脚本: ${providerRel}(container_admin autopilot init 可生成模板)` }
|
|
128
138
|
}
|
|
129
139
|
for (const cmd of ['bun', process.execPath]) {
|
|
130
140
|
try {
|
|
@@ -183,10 +193,10 @@ function check(root: string): string {
|
|
|
183
193
|
const fail: string[] = []
|
|
184
194
|
|
|
185
195
|
if (!cfg) {
|
|
186
|
-
lines.push('✗ 未配置
|
|
196
|
+
lines.push('✗ 未配置 trajectory.autopilot(.opencode/serenity.json 缺段)——container_admin autopilot init 一键初始化')
|
|
187
197
|
fail.push('config')
|
|
188
198
|
} else if (!cfg.enabled) {
|
|
189
|
-
lines.push('✗
|
|
199
|
+
lines.push('✗ trajectory.autopilot.enabled = false(未开启)')
|
|
190
200
|
fail.push('enabled')
|
|
191
201
|
} else {
|
|
192
202
|
lines.push(`✓ enabled = true`)
|
|
@@ -195,7 +205,7 @@ function check(root: string): string {
|
|
|
195
205
|
if (cfg.topPrompt?.trim()) {
|
|
196
206
|
lines.push(`✓ topPrompt(轨迹焦点)已定义: ${cfg.topPrompt.trim().slice(0, 60)}${cfg.topPrompt.trim().length > 60 ? '…' : ''}(每次唤起最先注入,锚定防漂移)`)
|
|
197
207
|
} else {
|
|
198
|
-
lines.push(`⚠ topPrompt(轨迹焦点)未定义——建议 CCC 定义
|
|
208
|
+
lines.push(`⚠ topPrompt(轨迹焦点)未定义——建议 CCC 定义 trajectory.autopilot 时填写本轨迹核心焦点(实验观察:无焦点锚定,多轮唤起轨迹易漂移腐化)`)
|
|
199
209
|
}
|
|
200
210
|
if (cfg.session) lines.push(` session = ${cfg.session}`)
|
|
201
211
|
const avoid = cfg.avoidWakeHours
|
|
@@ -245,7 +255,7 @@ function status(root: string): string {
|
|
|
245
255
|
const now = Date.now()
|
|
246
256
|
const lines: string[] = [`[autopilot-trajectory] 实验状态(CCC: ${basename(root)},北京 ${beijingHour(now)} 点)`, '']
|
|
247
257
|
if (!cfg?.enabled) {
|
|
248
|
-
lines.push('
|
|
258
|
+
lines.push('trajectory.autopilot 未启用(enabled=false 或未配置)——零资源占用')
|
|
249
259
|
return lines.join('\n')
|
|
250
260
|
}
|
|
251
261
|
lines.push(`配置: intervalHours=${cfg.intervalHours ?? 12} | biasProvider=${cfg.biasProvider?.trim() || DEFAULT_BIAS_PROVIDER}${cfg.session ? ` | session=${cfg.session}` : ''}${cfg.topPrompt?.trim() ? ' | topPrompt ✓' : ''}`)
|
|
@@ -269,22 +279,23 @@ function guide(): string {
|
|
|
269
279
|
return [
|
|
270
280
|
'[autopilot-trajectory] 实验步骤指引',
|
|
271
281
|
'',
|
|
272
|
-
'① 初始化(一键):
|
|
273
|
-
' ——写配置(.opencode/serenity.json
|
|
282
|
+
'① 初始化(一键):container_admin autopilot init',
|
|
283
|
+
' ——写配置(.opencode/serenity.json 的 trajectory.autopilot 段)+ 生成偏见提供者脚本模板(CCC 根 autopilot-bias.ts)',
|
|
274
284
|
'② **定义轨迹焦点(topPrompt)**:编辑配置中的 topPrompt——**CCC 自己填写**本轨迹的核心',
|
|
275
285
|
' 目标/纪律/质量要求(示例:"持续深化某领域认知,产出可重建的结论与决策记录")。',
|
|
276
286
|
' 它会在每次唤起时最先注入([轨迹焦点] 段),作为稳定焦点锚定 trajectory 防漂移——',
|
|
277
287
|
' **实验观察:无焦点锚定时多轮唤起轨迹腐化严重(焦点丢失)**。勿留空。',
|
|
278
288
|
'③ 实现偏见内容提供者:编辑 autopilot-bias.ts,stdout 输出偏见内容(反事实方向/探索动机,',
|
|
279
|
-
' 用本 CCC 自己的信息来源保证"足够随机");
|
|
289
|
+
' 用本 CCC 自己的信息来源保证"足够随机");container_admin autopilot generate-bias 验证',
|
|
280
290
|
'④ 标记目标会话:目录名加 --auto 后缀 AGENT_SESSIONS/<date>--<desc>--auto/',
|
|
281
291
|
' (可选)该 SESSION.md 写「下一轮动机」段作自生偏见',
|
|
282
|
-
'⑤ 验证就绪:
|
|
292
|
+
'⑤ 验证就绪:container_admin autopilot status(一站式报告应为 ✅;topPrompt 未定义会 ⚠ 提示)',
|
|
283
293
|
'⑥ 观察:无人类活动满 intervalHours 且北京非高峰 → 前台会话自动出现 [自主轨迹唤起]',
|
|
284
294
|
' 产出落 SESSION.md「自主探索日志」+ 预写「下一轮动机」',
|
|
285
295
|
'',
|
|
286
296
|
'分工:焦点(topPrompt)= 稳定锚,每轮不变;偏见(biasProvider)= 随机探索方向,每轮不同——两者都由 CCC 定义。',
|
|
287
|
-
'
|
|
297
|
+
'定义全文见 experiments/autopilot-trajectory/SKILL.md(开发面:bun <本脚本> doc)',
|
|
298
|
+
'运行态诊断(live 会话 / agent 定位 / 唤醒注册表 / 本条件链):专属工具 acc-diag(ACC 负责人)',
|
|
288
299
|
].join('\n')
|
|
289
300
|
}
|
|
290
301
|
|
|
@@ -307,20 +318,33 @@ function init(root: string): string {
|
|
|
307
318
|
/* 损坏则重建 */
|
|
308
319
|
}
|
|
309
320
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
321
|
+
// 写入 **新键** `trajectory.autopilot`(D58);旧键 `autopilotTrajectory`/`autotrajectory`
|
|
322
|
+
// 若存在则**迁移并删除**——保留两处会形成"改了不生效"的双真相源(读侧新键优先)。
|
|
323
|
+
const traj = (merged.trajectory as Record<string, unknown> | undefined) ?? {}
|
|
324
|
+
const legacy =
|
|
325
|
+
(merged.autopilotTrajectory as Record<string, unknown> | undefined) ??
|
|
326
|
+
(merged.autotrajectory as Record<string, unknown> | undefined)
|
|
327
|
+
const at = (traj.autopilot as Record<string, unknown> | undefined) ?? legacy ?? {}
|
|
328
|
+
merged.trajectory = {
|
|
329
|
+
...traj,
|
|
330
|
+
autopilot: {
|
|
331
|
+
enabled: true,
|
|
332
|
+
intervalHours: 12,
|
|
333
|
+
biasProvider: DEFAULT_BIAS_PROVIDER,
|
|
334
|
+
// 轨迹焦点(topPrompt):**CCC 自己定义**本轨迹的核心目标/纪律/质量要求——每次唤起最先
|
|
335
|
+
// 注入,作为稳定焦点锚定 trajectory,防止多轮自主唤起中焦点丢失(腐化)。请按本 CCC
|
|
336
|
+
// 的轨迹目标改写,不要留空(留空 = 唤起无焦点锚定,轨迹易漂移)。
|
|
337
|
+
topPrompt: '本轨迹的核心焦点:<CCC 填写——例如:持续深化某领域认知,产出可重建的结论与决策记录>',
|
|
338
|
+
...at,
|
|
339
|
+
},
|
|
320
340
|
}
|
|
341
|
+
const migrated = Boolean(legacy)
|
|
342
|
+
delete merged.autopilotTrajectory
|
|
343
|
+
delete merged.autotrajectory
|
|
321
344
|
writeFileSync(cfgPath, `${JSON.stringify(merged, null, 2)}\n`)
|
|
322
345
|
out.push(`✓ 配置写入: ${cfgPath}`)
|
|
323
|
-
out.push(`
|
|
346
|
+
out.push(` trajectory.autopilot = ${JSON.stringify((merged.trajectory as Record<string, unknown>).autopilot)}`)
|
|
347
|
+
if (migrated) out.push(' ↑ 已从旧键 autopilotTrajectory/autotrajectory 迁移到 trajectory.autopilot(旧键已删除,避免双真相源)')
|
|
324
348
|
out.push(` ⚠ 请编辑 topPrompt 为**本 CCC 的轨迹焦点**(现为占位——每次唤起最先注入,防轨迹漂移,勿留空)`)
|
|
325
349
|
|
|
326
350
|
// ② 生成偏见提供者脚本模板
|
|
@@ -332,7 +356,7 @@ function init(root: string): string {
|
|
|
332
356
|
out.push(`✓ 已生成偏见提供者脚本模板: ${DEFAULT_BIAS_PROVIDER}(编辑它,stdout 输出偏见内容)`)
|
|
333
357
|
}
|
|
334
358
|
|
|
335
|
-
out.push('', '下一步:② 编辑配置 topPrompt(轨迹焦点——CCC 自己填写本轨迹核心目标,勿留空)→ ③ 标记目标会话 --auto 后缀 → ⑤
|
|
359
|
+
out.push('', '下一步:② 编辑配置 topPrompt(轨迹焦点——CCC 自己填写本轨迹核心目标,勿留空)→ ③ 标记目标会话 --auto 后缀 → ⑤ container_admin autopilot status 验证就绪')
|
|
336
360
|
return out.join('\n')
|
|
337
361
|
}
|
|
338
362
|
|
|
@@ -352,14 +376,14 @@ function all(root: string): string {
|
|
|
352
376
|
const stat = status(root)
|
|
353
377
|
const next: string[] = ['═══ 下一步 ═══']
|
|
354
378
|
if (!cfg) {
|
|
355
|
-
next.push('→ 本 CCC 尚未配置
|
|
379
|
+
next.push('→ 本 CCC 尚未配置 trajectory.autopilot。开始实验:container_admin autopilot init 一键初始化。')
|
|
356
380
|
} else if (!cfg.enabled) {
|
|
357
|
-
next.push('→
|
|
381
|
+
next.push('→ trajectory.autopilot.enabled 为 false——置 true 开启实验(或 init 重新初始化)。')
|
|
358
382
|
} else if (ready.includes('✗')) {
|
|
359
383
|
next.push('→ 存在未就绪项(见上)。补齐后重跑本命令确认 ✅。')
|
|
360
384
|
} else {
|
|
361
385
|
next.push('→ 已就绪 ✅。保持会话空闲满 intervalHours 且北京非高峰 → 自动唤起(前台可见)。')
|
|
362
|
-
next.push('→ 之后可随时
|
|
386
|
+
next.push('→ 之后可随时 container_admin autopilot status 查看距下次唤起的进度。')
|
|
363
387
|
}
|
|
364
388
|
return [BACKGROUND, ready, '', stat, '', next.join('\n'), '', guide()].join('\n')
|
|
365
389
|
}
|
|
@@ -374,8 +398,8 @@ function diagCcc(root: string): string {
|
|
|
374
398
|
|
|
375
399
|
// ① enabled(定时器是否启动)
|
|
376
400
|
if (!cfg) {
|
|
377
|
-
blocks.push('✗
|
|
378
|
-
suggest.push('配置:.opencode/serenity.json 加
|
|
401
|
+
blocks.push('✗ trajectory.autopilot 未配置(定时器不启动)')
|
|
402
|
+
suggest.push('配置:.opencode/serenity.json 加 trajectory.autopilot 段(container_admin autopilot init 可生成)')
|
|
379
403
|
} else if (!cfg.enabled) {
|
|
380
404
|
blocks.push('✗ enabled = false(定时器不启动)')
|
|
381
405
|
suggest.push('置 enabled: true')
|
|
@@ -431,7 +455,7 @@ function diagCcc(root: string): string {
|
|
|
431
455
|
const bias = runBiasProvider(root, provider)
|
|
432
456
|
if (bias.error) {
|
|
433
457
|
blocks.push(`✗ 偏见脚本: ${bias.error}`)
|
|
434
|
-
suggest.push('实现偏见脚本(autopilot
|
|
458
|
+
suggest.push('实现偏见脚本(container_admin autopilot init 生成模板后编辑)')
|
|
435
459
|
} else {
|
|
436
460
|
blocks.push(`✓ 偏见脚本可运行(输出: ${bias.text ?? '(空)'})`)
|
|
437
461
|
}
|
|
@@ -449,7 +473,7 @@ function diagCcc(root: string): string {
|
|
|
449
473
|
return lines.join('\n')
|
|
450
474
|
}
|
|
451
475
|
|
|
452
|
-
/** diag:--ccc <path> 指定目标 CCC;无参扫描常见 CCC 根(配置了
|
|
476
|
+
/** diag:--ccc <path> 指定目标 CCC;无参扫描常见 CCC 根(配置了 trajectory.autopilot 的优先) */
|
|
453
477
|
function diag(): string {
|
|
454
478
|
const argIdx = process.argv.indexOf('--ccc')
|
|
455
479
|
if (argIdx >= 0 && process.argv[argIdx + 1]) {
|
|
@@ -483,7 +507,7 @@ function main(): void {
|
|
|
483
507
|
const cmd = process.argv[2] ?? 'all'
|
|
484
508
|
const root = findRoot()
|
|
485
509
|
if (!root) {
|
|
486
|
-
console.error('[autopilot-trajectory] ✗ 未找到 CCC 根(无 .serenity;
|
|
510
|
+
console.error('[autopilot-trajectory] ✗ 未找到 CCC 根(无 .serenity;container_admin 的 autopilot 域会自动注入 SERENITY_ROOT)')
|
|
487
511
|
process.exit(1)
|
|
488
512
|
}
|
|
489
513
|
switch (cmd) {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autopilot-script.ts — 包内 autopilot 脚本通道(v1.33 提取;S142 §32「logbook × trajectory 合并」)
|
|
3
|
+
*
|
|
4
|
+
* 为什么单独成模块(R↓):autopilot 的三个动作(`autopilot-status` / `autopilot-init` /
|
|
5
|
+
* `generate-autopilot-bias`,原 `all` / `init` / `random`)**归 `container_admin`**,而
|
|
6
|
+
* 脚本定位与执行逻辑此前长在 `tools/autopilot-trajectory.ts` 里。若不提取,要么在两处
|
|
7
|
+
* 重复 spawn 逻辑(熵),要么让 container_admin 依赖一个即将删除的工具文件(错向依赖)。
|
|
8
|
+
* ⇒ 提取为**单真相源**:脚本定位(`findExpScript` / `EXP_SCRIPT`)+ 执行(`runAutopilotScript`)。
|
|
9
|
+
*
|
|
10
|
+
* 脚本本体:`experiments/autopilot-trajectory/scripts/autopilot-trajectory.ts`(随 npm files 分发)。
|
|
11
|
+
* 契约:argv[2] = 子命令(`all` | `init` | `random` | `diag` | `doc` | `check` | `status` | `guide`),
|
|
12
|
+
* 环境变量 `SERENITY_ROOT` = CCC 根;stdout 即人读结果。
|
|
13
|
+
* ⚠️ 脚本侧的 `diag`/`doc`/`check`/`status`/`guide` 已**不在 CCC 工具面**(S142 §32.9:
|
|
14
|
+
* `diag` 归 ACC 负责人、其余并入 `autopilot-status`)——脚本保留这些子命令以便开发面直接调用。
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* 定位包内脚本(npm files 分发 experiments/autopilot-trajectory/)。
|
|
18
|
+
* 布局差异:tsdown bundle 后 import.meta.url 指向 lib/index.js(lib → 包根 1 层);
|
|
19
|
+
* vitest 源码直跑时指向 src/tools/x.ts(src/tools → 包根 2 层)——逐级上溯查找,
|
|
20
|
+
* 两种布局都稳(找到 experiments/autopilot-trajectory/scripts/autopilot-trajectory.ts 即止)。
|
|
21
|
+
* @param startDir 起始目录(通常为模块自身所在目录)
|
|
22
|
+
* @returns 脚本绝对路径;未找到 null
|
|
23
|
+
*/
|
|
24
|
+
export declare function findExpScript(startDir: string): string | null;
|
|
25
|
+
/** 包内脚本(上溯查找;找不到 → 调用方报错提示包完整性) */
|
|
26
|
+
export declare const EXP_SCRIPT: string | null;
|
|
27
|
+
/** 脚本执行结果(人读;`error` 非空即失败,调用方不得静默) */
|
|
28
|
+
export interface AutopilotScriptResult {
|
|
29
|
+
/** 成功时的 stdout(已 trim) */
|
|
30
|
+
output?: string;
|
|
31
|
+
/** 失败原因(人读,含"包不完整/缺 bun/脚本退出码"三类) */
|
|
32
|
+
error?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 执行包内 autopilot 脚本(bun 优先;同步、10min 超时、注入 CCC 根)。
|
|
36
|
+
* @param root CCC 根(注入 `SERENITY_ROOT`;null 则靠脚本自行上溯 .serenity)
|
|
37
|
+
* @param action 脚本子命令(`all` | `init` | `random` | …)
|
|
38
|
+
* @returns `{ output }` 或 `{ error }`(不抛错——调用方决定如何呈现)
|
|
39
|
+
*/
|
|
40
|
+
export declare function runAutopilotScript(root: string | null, action: string): AutopilotScriptResult;
|
|
@@ -125,6 +125,34 @@ export declare function resetWakeHistory(): void;
|
|
|
125
125
|
export declare function performAutopilotWake(ctx: Context, root: string, settings: AutopilotTrajectorySettings, opts?: {
|
|
126
126
|
force?: boolean;
|
|
127
127
|
}): Promise<WakeResult>;
|
|
128
|
+
/**
|
|
129
|
+
* **周期自唤醒全局闸**(v1.34 更名收窄,原 `autopilotEnabled`):关 = 定时器不武装 + tick 不唤起。
|
|
130
|
+
*
|
|
131
|
+
* 语义边界(用户 2026-09-15 裁决 S-1):**只管周期自唤醒** —— 一次性唤醒(`container_trajectory wake-later`)
|
|
132
|
+
* 归 `wakeSchedulerEnabled`,两者**互不连带**(旧实现共用一闸是缺陷,见 wake-scheduler 注释)。
|
|
133
|
+
*
|
|
134
|
+
* 读取顺序(迁移期,不回写):`autopilotWakeEnabled`(新键)→ `autopilotEnabled`(旧键)→ false。
|
|
135
|
+
* 用 `??` 而非 `||` 的理由:**新键显式 false 必须能覆盖旧键 true**(否则"关不掉")。
|
|
136
|
+
* 抽成模块级函数是为了让 {@link autopilotClockState}(诊断)与 tick 读**同一判据**。
|
|
137
|
+
*/
|
|
138
|
+
export declare function autopilotGloballyEnabled(): boolean;
|
|
139
|
+
/**
|
|
140
|
+
* autopilot **进程态**(诊断用,模块级 = 进程级)。
|
|
141
|
+
* 与 {@link wakeSchedulerState} 同规格:回答"时钟是否武装 / 上次 tick 何时 / 为何跳过"。
|
|
142
|
+
*/
|
|
143
|
+
interface AutopilotClockRuntime {
|
|
144
|
+
armed: boolean;
|
|
145
|
+
armedAt: number | null;
|
|
146
|
+
lastTickAt: number | null;
|
|
147
|
+
ticks: number;
|
|
148
|
+
lastSkipReason: string | null;
|
|
149
|
+
}
|
|
150
|
+
/** autopilot 时钟进程态快照(只读) */
|
|
151
|
+
export declare function autopilotClockState(): AutopilotClockRuntime & {
|
|
152
|
+
enabled: boolean;
|
|
153
|
+
};
|
|
154
|
+
/** 测试用:复位进程态 */
|
|
155
|
+
export declare function __resetAutopilotClockStateForTest(): void;
|
|
128
156
|
/**
|
|
129
157
|
* 装配(index.ts apply 调用)。时钟唤起(v1.26.14 修复 + v1.27.4 多 CCC 独立):
|
|
130
158
|
*
|
|
@@ -232,3 +260,4 @@ export interface DiagLiveReport {
|
|
|
232
260
|
panelResolved: string | null;
|
|
233
261
|
}
|
|
234
262
|
export declare function diagLive(ctx: Context): DiagLiveReport;
|
|
263
|
+
export {};
|
|
@@ -139,6 +139,22 @@ function loadSerenityConfig(root, paths = DEFAULT_SERENITY_CONFIG_PATHS) {
|
|
|
139
139
|
}
|
|
140
140
|
return {};
|
|
141
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* 读取 CCC 声明的「专属工具」清单(`exclusiveTools`,v1.33)。
|
|
144
|
+
*
|
|
145
|
+
* 失败语义:无配置/字段缺失/配置损坏 → **空数组**(= 不声明任何专属工具 ⇒ 专属工具保持隐藏)。
|
|
146
|
+
* 这里选 **fail-closed**(与 im-bridge 的 fail-open 相反)的理由:专属工具的默认态就是"隐藏",
|
|
147
|
+
* 判据读不到 = 没有证据表明该 CCC 要它;而配置损坏本身已在 `loadSerenityConfig` 响亮告警
|
|
148
|
+
* (不会静默)。im-bridge 相反——隐藏一个**已在使用**的通道才会静默损害能力。
|
|
149
|
+
* @param root CCC 根
|
|
150
|
+
* @param paths 候选配置相对路径
|
|
151
|
+
* @returns 去空白后的工具名列表(非字符串项被丢弃)
|
|
152
|
+
*/
|
|
153
|
+
function readExclusiveTools(root, paths = DEFAULT_SERENITY_CONFIG_PATHS) {
|
|
154
|
+
const list = loadSerenityConfig(root, paths).exclusiveTools;
|
|
155
|
+
if (!Array.isArray(list)) return [];
|
|
156
|
+
return list.filter((x) => typeof x === "string" && x.trim() !== "").map((x) => x.trim());
|
|
157
|
+
}
|
|
142
158
|
const SAFE_MODE_MARKER = ".serenity-safe-on";
|
|
143
159
|
function isSafeModeOn(root) {
|
|
144
160
|
return existsSync(resolve(root, SAFE_MODE_MARKER));
|
|
@@ -177,4 +193,4 @@ function matchBlacklist(relPath, rules) {
|
|
|
177
193
|
return null;
|
|
178
194
|
}
|
|
179
195
|
//#endregion
|
|
180
|
-
export { findSerenityRoot as a, matchBlacklist as c, readCccName as d,
|
|
196
|
+
export { findSerenityRoot as a, matchBlacklist as c, readCccName as d, readExclusiveTools as f, resolveInside as h, findGitRoot as i, pathInside as l, readUtf8 as m, SAFE_MODE_MARKER as n, isSafeModeOn as o, readHandymanConfig as p, classifyPath as r, loadSerenityConfig as s, DEFAULT_SERENITY_CONFIG_PATHS as t, readBlacklist as u };
|
package/lib/ccc.d.ts
CHANGED
|
@@ -102,6 +102,14 @@ export interface SerenityConfig {
|
|
|
102
102
|
* 未配置或 enabled=false → 该 CCC 桥完全不启动(零资源占用)。
|
|
103
103
|
*/
|
|
104
104
|
weixin?: WeixinSettings;
|
|
105
|
+
/**
|
|
106
|
+
* 专属工具声明(v1.33,S142 §32.11):**ACC 注册但默认对所有 CCC 隐藏**的工具,
|
|
107
|
+
* 只有在自己这里声明的 CCC 可见(例:`["acc-diag"]` = ACC 负责人的运行态诊断)。
|
|
108
|
+
*
|
|
109
|
+
* 归属判据(D23):**机制在 ACC(通用,任何工具名皆可),声明在 CCC**——
|
|
110
|
+
* ACC 代码里不出现任何具体 CCC 的名字;未声明(含未配置/配置损坏)⇒ 隐藏。
|
|
111
|
+
*/
|
|
112
|
+
exclusiveTools?: string[];
|
|
105
113
|
}
|
|
106
114
|
/**
|
|
107
115
|
* Autopilot Trajectory 配置(CCC 定义;S142 用户拍板 v0.5 + 正式化 v1.27.4):
|
|
@@ -274,6 +282,18 @@ export declare function __resetBrokenConfigWarningsForTest(): void;
|
|
|
274
282
|
* @returns 解析后的配置;无文件/损坏 → `{}`
|
|
275
283
|
*/
|
|
276
284
|
export declare function loadSerenityConfig(root: string, paths?: string[]): SerenityConfig;
|
|
285
|
+
/**
|
|
286
|
+
* 读取 CCC 声明的「专属工具」清单(`exclusiveTools`,v1.33)。
|
|
287
|
+
*
|
|
288
|
+
* 失败语义:无配置/字段缺失/配置损坏 → **空数组**(= 不声明任何专属工具 ⇒ 专属工具保持隐藏)。
|
|
289
|
+
* 这里选 **fail-closed**(与 im-bridge 的 fail-open 相反)的理由:专属工具的默认态就是"隐藏",
|
|
290
|
+
* 判据读不到 = 没有证据表明该 CCC 要它;而配置损坏本身已在 `loadSerenityConfig` 响亮告警
|
|
291
|
+
* (不会静默)。im-bridge 相反——隐藏一个**已在使用**的通道才会静默损害能力。
|
|
292
|
+
* @param root CCC 根
|
|
293
|
+
* @param paths 候选配置相对路径
|
|
294
|
+
* @returns 去空白后的工具名列表(非字符串项被丢弃)
|
|
295
|
+
*/
|
|
296
|
+
export declare function readExclusiveTools(root: string, paths?: string[]): string[];
|
|
277
297
|
export declare const SAFE_MODE_MARKER = ".serenity-safe-on";
|
|
278
298
|
export declare function isSafeModeOn(root: string): boolean;
|
|
279
299
|
/** 黑名单条目(对齐 osp BlacklistEntry):pattern + 可选自定义拦截提示 message */
|