@shgroup/dsh-serenity-hooks 1.31.13 → 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.
Files changed (37) hide show
  1. package/README.md +14 -11
  2. package/dsh.plugin.json +5 -5
  3. package/experiments/autopilot-trajectory/SKILL.md +23 -21
  4. package/experiments/autopilot-trajectory/scripts/autopilot-trajectory.ts +69 -45
  5. package/lib/autopilot-script.d.ts +40 -0
  6. package/lib/autopilot-trajectory.d.ts +44 -5
  7. package/lib/{ccc-DAsSHsub.js → ccc-eu_IPF94.js} +17 -1
  8. package/lib/ccc.d.ts +30 -0
  9. package/lib/client.js +43 -11
  10. package/lib/diag-ops.d.ts +61 -0
  11. package/lib/index.d.ts +1 -1
  12. package/lib/index.js +4802 -4206
  13. package/lib/invariant.d.ts +5 -1
  14. package/lib/invariant.js +7 -3
  15. package/lib/json.d.ts +1 -1
  16. package/lib/msm-ops.d.ts +2 -2
  17. package/lib/output-guard-seam.d.ts +1 -1
  18. package/lib/rebuild.d.ts +4 -3
  19. package/lib/seams/guards.d.ts +27 -0
  20. package/lib/seams/keeper.d.ts +3 -3
  21. package/lib/{settings-section-01rTVq6v.js → settings-section-BuPGQv_H.js} +5 -3
  22. package/lib/settings-section.d.ts +15 -3
  23. package/lib/skiff-core.d.ts +1 -1
  24. package/lib/{skiff-debug-w2c3UqQk.js → skiff-debug-D83-Njy7.js} +7 -7
  25. package/lib/{skiff-role-BYvNnwv1.js → skiff-role-DAfPb6YQ.js} +1 -1
  26. package/lib/tools/acc-diag.d.ts +22 -0
  27. package/lib/tools/container-admin.d.ts +1 -1
  28. package/lib/tools/{session.d.ts → trajectory.d.ts} +32 -16
  29. package/lib/{session-bound-BpTayaIS.js → trajectory-bound-C8DUxi6_.js} +77 -276
  30. package/lib/{session-bound.d.ts → trajectory-bound.d.ts} +32 -2
  31. package/lib/{session-ops.d.ts → trajectory-ops.d.ts} +24 -28
  32. package/lib/wake-registry-D0Vj0WXb.js +270 -0
  33. package/lib/wake-registry.d.ts +146 -0
  34. package/lib/wake-scheduler.d.ts +115 -0
  35. package/lib/{weixin-route-wWk4AIwV.js → weixin-route-D1ND823E.js} +1 -1
  36. package/package.json +2 -2
  37. 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
- | `logbook` | 工作日志的全生命周期:新建、查看、切换、关闭、归档,还有"原地重建" | 任何多步骤的活儿,第一步就是它 |
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
- | `autopilot-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
- > **改过名**(旧名已彻底停用,没有兼容别名):`cc_fs` → `container_fs` · `cc_git` → `container_git` · `session`+`session_rebuild` → `logbook` · `acc_kit` → `dashboard` · `acc_msm` → `msm`(执行)+ `container_admin`(管理)· `eap`/`neat`/`cce` → `praxis` · `skiff_admin` → `container_admin role`。老会话里看到旧名,照这张表对照即可。
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 | **长期项目不断线** | `logbook create` 建日志 → 每推进一段写进去 → 中断后 `logbook use` 接上 → 上下文满了 `logbook rebuild` 原地重建并自动继续 |
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/容器/服务报告;重启容器也在同一条白名单通道里 |
@@ -264,14 +264,17 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
264
264
  - **只给答案**:响应里只有 answer / answer_html / sessionId——内部轨迹、工具结果、机制信息都不出去
265
265
  - 默认只监听 127.0.0.1;要给别人用,怎么暴露(隧道/反代/端口映射)由你决定
266
266
 
267
- ### 6.5 自主巡航(Autopilot Trajectory
267
+ ### 6.5 轨迹与自主巡航(trajectory
268
268
 
269
- 让工作区**到点自己醒过来干活**,全程在你眼前发生(前台注入,随时可介入):
269
+ `trajectory`(轨迹)是一等概念:一个工作区里可以有任意多条轨迹并行;**autopilot(自主巡航)是它的一个子集**——"周期自唤醒"的特例(开关与控制归 `container_admin autopilot`)。
270
+
271
+ **自主巡航**:让工作区**到点自己醒过来干活**,全程在你眼前发生(前台注入,随时可介入):
270
272
 
271
273
  - **什么时候醒**:工作区开关打开 + 全局开关打开(默认关,只在你想跑的机器上开)+ 目标会话存在(目录带 `--auto` 后缀)+ 到了间隔(支持小数,最密约 36 秒)+ 不在避开的高峰窗口(默认北京时间 8~18 点)+ 偏见脚本就绪
272
274
  - **醒了先看什么**:先看你自己写的"焦点"(`topPrompt`,每轮最先注入,防跑偏),再看随机生成的"偏见内容"(你写的脚本,负责探索方向)
273
275
  - **多个工作区各自独立**:每个工作区自己的间隔/会话/焦点/窗口,互不干扰
274
276
  - **有审计**:每次唤醒都记一笔,面板里能看到最近几次;失败会指数退避重试
277
+ - **还能预约未来某一刻**:用 `container_trajectory wake-later` 登记一条"唤醒"= 未来某时刻 + 一条消息——可以给自己预约,也可以唤醒别的轨迹;落在工作区内的 `AGENT_SESSIONS/wake-registry.json`(可读可审计),到点由中心调度器投递,不阻塞、不等待、也不回执
275
278
  - 没有"每天最多唤醒几次"的限制——频率只由间隔和窗口决定
276
279
 
277
280
  ### 6.6 安全模型
@@ -307,7 +310,7 @@ AI 一次能"记住"的内容有上限。满了不用你手动开新会话:
307
310
  | 机制 | 说人话 |
308
311
  |---|---|
309
312
  | **工作日志(SESSION.md)** | AI 的"笔记本",永远留在原地。目标、决定、进度都写这儿 |
310
- | **原地重建(logbook rebuild)** | 快满时它会提示 AI 主动重建:把这一轮对话清空,但重新注入"你是谁 + 继续 S### 的工作"——**载体换了,活儿接着干**。重建后的 token 计量也正确回落 |
313
+ | **原地重建(container_trajectory rebuild)** | 快满时它会提示 AI 主动重建:把这一轮对话清空,但重新注入"你是谁 + 继续 S### 的工作"——**载体换了,活儿接着干**。重建后的 token 计量也正确回落 |
311
314
  | **进度提醒** | 做久了会按计分提醒 AI 把进度写回日志,并要求它回确认码 |
312
315
  | **沉淀纪律** | 重建前如果产生了有价值的认知,先把它写进相关技能(而不是丢掉) |
313
316
 
@@ -344,7 +347,7 @@ pnpm build # 打包(lib/index.js + client.js)
344
347
  | 跑在 | OpenCode | DeepSeek Harness |
345
348
  | 实现 | 独立 | **独立**(不复用源码,但遵循同一套标准) |
346
349
  | 系统提示词 | `system.transform` | `systemPrompt.section`,平台无关的部分逐字对齐 |
347
- | 工具 | msm / container_fs / logbook 等 | container_fs / logbook / dashboard / container_git / msm / praxis / handyman / localstore / container_admin / autopilot-trajectory / im-bridge |
350
+ | 工具 | msm / container_fs / logbook 等 | container_fs / container_trajectory / dashboard / container_git / msm / praxis / handyman / localstore / container_admin 两个条件出现的(`im-bridge` / `acc-diag`) |
348
351
 
349
352
  **同一个工作区可以随时换运行时**:`.serenity` 标记、`.opencode/skills/`、配置、`AGENT_SESSIONS/` 的文件格式都一致;
350
353
  差别只在平台层(工具名、注入方式),换过去以后 AI 收到的约束是一样的。
@@ -363,7 +366,7 @@ pnpm build # 打包(lib/index.js + client.js)
363
366
  连续失败 5 次锁 15 分钟(指数退避)。等锁过期,或检查账号的验证码绑定状态。
364
367
 
365
368
  **Q:上下文快满了怎么办?**
366
- 先让 AI 把进度写回 SESSION.md,然后按提示调用 `logbook rebuild`。轨迹会自动接续,不用手动开新会话。
369
+ 先让 AI 把进度写回 SESSION.md,然后按提示调用 `container_trajectory rebuild`。轨迹会自动接续,不用手动开新会话。
367
370
 
368
371
  **Q:对外问答页会返回内部信息吗?**
369
372
  不会。只返回答案本身,内部轨迹和工具结果都不出去。
package/dsh.plugin.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "id": "dsh-serenity-hooks",
3
- "version": "1.31.13",
3
+ "version": "1.34.0",
4
4
  "main": "lib/index.js",
5
- "description": "宁静号 ACC harness(Native Cordis 插件):给 DSH 装一个「AI 工作区」——11 个工具(container_fs/logbook/dashboard/container_git/msm/praxis/handyman/localstore/container_admin/autopilot-trajectory/im-bridge)+ 机械约束(安全模式/工作区围墙/密钥守卫)+ 工作日志与原地重建 + 网页登录入口/微信桥/子角色/对外问答页/自主巡航。适配 DSH 0.1.5-rc.2(deepseek-ai/deepseek-harness)。",
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
- "logbook",
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
- "autopilot-trajectory",
21
- "im-bridge"
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 独立),并提供一站式管理 MSM(autopilot-trajectory:无参全报告 / init 初始化 / random 验证偏见内容 / diag 诊断)。任何希望参与的 CCC 复制本目录到 .opencode/skills/ 即可开始。
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
- > 实验管理:`msm autopilot-trajectory <doc|check|status|guide>`(v1.30:单入口 `msm("<name>", ["<args>"])`)
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,31 +37,33 @@ description: Autopilot Trajectory(自动巡航轨迹,正式版;前身自
37
37
 
38
38
  ## 3. 参与方式(CCC 侧四步——第一步可一键 init)
39
39
 
40
- ### ① 初始化(一键):`msm autopilot-trajectory init`
40
+ ### ① 初始化(一键):`container_admin autopilot init`
41
41
 
42
- 自动完成:写配置(`.opencode/serenity.json` autopilotTrajectory 段)+ 生成偏见提供者脚本模板(CCC 根 `autopilot-bias.ts`)。
42
+ 自动完成:写配置(`.opencode/serenity.json` `trajectory.autopilot` 段)+ 生成偏见提供者脚本模板(CCC 根 `autopilot-bias.ts`)。
43
43
 
44
44
  ```jsonc
45
45
  // 写入的配置(init 后可在 .opencode/serenity.json 查看/调整)
46
46
  {
47
- "autopilotTrajectory": {
48
- "enabled": true, // 总开关(缺省 false,默认关零资源占用)
49
- "intervalHours": 12, // 无人类活动 N 小时后唤起(缺省 12)
50
- "biasProvider": "autopilot-bias.ts", // 偏见内容提供者脚本(CCC 根下)
51
- "topPrompt": "本轨迹的核心焦点:<CCC 填写>", // 轨迹焦点:CCC 定义,每次唤起最先注入
52
- "session": "S###", // 必填:目标会话(不配置绝不唤起)
53
- "avoidWakeHours": { "start": 8, "end": 18 } // 可选:避开北京高峰(缺省 8~18 省钱)
47
+ "trajectory": {
48
+ "autopilot": { // autopilotTrajectory 段,字段不变
49
+ "enabled": true, // 总开关(缺省 false,默认关零资源占用)
50
+ "intervalHours": 12, // 无人类活动 N 小时后唤起(缺省 12)
51
+ "biasProvider": "autopilot-bias.ts", // 偏见内容提供者脚本(CCC 根下)
52
+ "topPrompt": "本轨迹的核心焦点:<CCC 填写>", // 轨迹焦点:CCC 定义,每次唤起最先注入
53
+ "session": "S###", // 必填:目标会话(不配置绝不唤起)
54
+ "avoidWakeHours": { "start": 8, "end": 18 } // 可选:避开北京高峰(缺省 8~18 省钱)
55
+ }
54
56
  }
55
57
  }
56
58
  ```
57
59
 
58
60
  ### ② 定义轨迹焦点(topPrompt——CCC 自己填写)
59
61
 
60
- **CCC 定义 autopilotTrajectory 时同时定义本轨迹的顶层提示词**(`topPrompt`):核心目标/纪律/质量要求(示例:"持续深化某领域认知,产出可重建的结论与决策记录")。它会在**每次唤起时最先注入**(`[轨迹焦点]` 段,位于身份锚定之前,影响力最大),作为**稳定焦点锚定 trajectory**——**实验观察:无焦点锚定时,多轮自主唤起中轨迹腐化严重(焦点丢失)**。与偏见内容的分工:**焦点=稳定锚(每轮不变),偏见=随机探索方向(每轮不同),互补**。init 生成占位,CCC 按自己轨迹目标改写(勿留空——留空 = 唤起无焦点锚定,轨迹易漂移)。
62
+ **CCC 定义 `trajectory.autopilot` 时同时定义本轨迹的顶层提示词**(`topPrompt`):核心目标/纪律/质量要求(示例:"持续深化某领域认知,产出可重建的结论与决策记录")。它会在**每次唤起时最先注入**(`[轨迹焦点]` 段,位于身份锚定之前,影响力最大),作为**稳定焦点锚定 trajectory**——**实验观察:无焦点锚定时,多轮自主唤起中轨迹腐化严重(焦点丢失)**。与偏见内容的分工:**焦点=稳定锚(每轮不变),偏见=随机探索方向(每轮不同),互补**。init 生成占位,CCC 按自己轨迹目标改写(勿留空——留空 = 唤起无焦点锚定,轨迹易漂移)。
61
63
 
62
64
  ### ③ 实现偏见内容提供者(`autopilot-bias.ts`)
63
65
 
64
- CCC 根目录下一个脚本,**stdout 输出本轮唤起注入的偏见内容**(反事实问题/探索方向/任何让轨迹偏离既有路径的输入)。**偏见内容归 CCC**——用本 CCC 自己的反馈信息来源保证"足够随机"。`msm autopilot-trajectory random` 可验证输出。
66
+ CCC 根目录下一个脚本,**stdout 输出本轮唤起注入的偏见内容**(反事实问题/探索方向/任何让轨迹偏离既有路径的输入)。**偏见内容归 CCC**——用本 CCC 自己的反馈信息来源保证"足够随机"。`container_admin autopilot generate-bias` 可验证输出。
65
67
 
66
68
  ### ④ 标记目标会话(可选自生动机段)
67
69
 
@@ -83,17 +85,17 @@ CCC 根目录下一个脚本,**stdout 输出本轮唤起注入的偏见内容*
83
85
 
84
86
  **人类角色**:不触发、不中断;回复/评价天然并入(同一前台会话);轨迹不等人类。
85
87
 
86
- ## 5. 实验管理(autopilot-trajectory MSM)——一站式
88
+ ## 5. 实验管理(`container_admin autopilot`)——一站式
87
89
 
88
90
  | 用法 | 功能 |
89
91
  |------|------|
90
- | `msm autopilot-trajectory`(**推荐,无参**) | **一站式全报告**:背景摘要 + 就绪度检查 + 当前状态 + 下一步指引 + 步骤——CCC agent 看一次即完整理解并知道怎么开始 |
91
- | `msm autopilot-trajectory init` | **一键初始化**:写配置 + 生成偏见提供者脚本模板(CCC 根 autopilot-bias.ts) |
92
- | `msm autopilot-trajectory random` | 运行偏见提供者脚本,输出当前偏见内容(验证) |
93
- | `msm autopilot-trajectory doc` | 机制定义说明全文(本 SKILL.md) |
94
- | `msm autopilot-trajectory check` | 仅就绪度检查(配置/轨迹焦点 topPrompt/偏见提供者/--auto 标志/动机段) |
95
- | `msm autopilot-trajectory status` | 仅当前状态(配置快照/目标会话/距上次活动/唤起窗口/可唤起性) |
96
- | `msm autopilot-trajectory guide` | 仅步骤指引 |
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)/ 仅步骤指引 |
97
99
 
98
100
  ## 6. 观察与验证
99
101
 
@@ -1,25 +1,24 @@
1
1
  #!/usr/bin/env bun
2
2
  /**
3
- * autopilot-trajectory.ts — 自主轨迹实验管理 MSM(Mech,纯 TS 零 LLM 决策)——一站式
3
+ * autopilot-trajectory.ts — 自主轨迹实验管理脚本(Mech,纯 TS 零 LLM 决策)——一站式
4
4
  *
5
- * 一个 tool 整合实验全部所需:
6
- * acc_msm exec autopilot-trajectory → 一站式全报告(背景 + 就绪 + 状态 + 下一步)
7
- * acc_msm exec autopilot-trajectory init 初始化实验(写配置 + 生成偏见提供者脚本模板)
8
- * acc_msm exec autopilot-trajectory random 运行偏见提供者脚本,输出当前偏见内容(验证)
9
- * acc_msm exec autopilot-trajectory diag 唤起条件链诊断(--ccc <path> 指定;无参递归扫描 /home/yh 两层)
10
- * acc_msm exec autopilot-trajectory doc 实验定义说明全文(SKILL.md)
11
- * acc_msm exec autopilot-trajectory check 仅就绪度检查
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 设置面板「自主轨迹」区块(GET /serenity/autopilot-trajectory)+「立即唤起」按钮
20
- * (POST /serenity/autopilot-trajectory {action:'wake'},调试语义跳过窗口/间隔)——由插件提供,脚本不重复。
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(acc_msm exec 注入)或 cwd 上溯 .serenity。
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 { autopilotTrajectory?: AutoConfig }
100
- return cfg.autopilotTrajectory ?? null
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}(acc_msm exec autopilot-trajectory init 可生成模板)` }
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('✗ 未配置 autopilotTrajectory(.opencode/serenity.json 缺段)——acc_msm exec autopilot-trajectory init 一键初始化')
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('✗ autopilotTrajectory.enabled = false(未开启)')
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 定义 autopilotTrajectory 时填写本轨迹核心焦点(实验观察:无焦点锚定,多轮唤起轨迹易漂移腐化)`)
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('autopilotTrajectory 未启用(enabled=false 或未配置)——零资源占用')
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
- '① 初始化(一键):acc_msm exec autopilot-trajectory init',
273
- ' ——写配置(.opencode/serenity.json autopilotTrajectory 段)+ 生成偏见提供者脚本模板(CCC 根 autopilot-bias.ts)',
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 自己的信息来源保证"足够随机");acc_msm exec autopilot-trajectory random 验证',
289
+ ' 用本 CCC 自己的信息来源保证"足够随机");container_admin autopilot generate-bias 验证',
280
290
  '④ 标记目标会话:目录名加 --auto 后缀 AGENT_SESSIONS/<date>--<desc>--auto/',
281
291
  ' (可选)该 SESSION.md 写「下一轮动机」段作自生偏见',
282
- '⑤ 验证就绪:acc_msm exec autopilot-trajectory(一站式报告应为 ✅;topPrompt 未定义会 ⚠ 提示)',
292
+ '⑤ 验证就绪:container_admin autopilot status(一站式报告应为 ✅;topPrompt 未定义会 ⚠ 提示)',
283
293
  '⑥ 观察:无人类活动满 intervalHours 且北京非高峰 → 前台会话自动出现 [自主轨迹唤起]',
284
294
  ' 产出落 SESSION.md「自主探索日志」+ 预写「下一轮动机」',
285
295
  '',
286
296
  '分工:焦点(topPrompt)= 稳定锚,每轮不变;偏见(biasProvider)= 随机探索方向,每轮不同——两者都由 CCC 定义。',
287
- '完整定义见 SKILL.md(acc_msm exec autopilot-trajectory doc)',
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
- const at = (merged.autopilotTrajectory as Record<string, unknown> | undefined) ?? {}
311
- merged.autopilotTrajectory = {
312
- enabled: true,
313
- intervalHours: 12,
314
- biasProvider: DEFAULT_BIAS_PROVIDER,
315
- // 轨迹焦点(topPrompt):**CCC 自己定义**本轨迹的核心目标/纪律/质量要求——每次唤起最先
316
- // 注入,作为稳定焦点锚定 trajectory,防止多轮自主唤起中焦点丢失(腐化)。请按本 CCC
317
- // 的轨迹目标改写,不要留空(留空 = 唤起无焦点锚定,轨迹易漂移)。
318
- topPrompt: '本轨迹的核心焦点:<CCC 填写——例如:持续深化某领域认知,产出可重建的结论与决策记录>',
319
- ...at,
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(` autopilotTrajectory = ${JSON.stringify(merged.autopilotTrajectory)}`)
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 后缀 → ⑤ acc_msm exec autopilot-trajectory 验证就绪')
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 尚未配置 autopilotTrajectory。开始实验:acc_msm exec autopilot-trajectory init 一键初始化。')
379
+ next.push('→ 本 CCC 尚未配置 trajectory.autopilot。开始实验:container_admin autopilot init 一键初始化。')
356
380
  } else if (!cfg.enabled) {
357
- next.push('→ autopilotTrajectory.enabled 为 false——置 true 开启实验(或 init 重新初始化)。')
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('→ 之后可随时 acc_msm exec autopilot-trajectory status 查看距下次唤起的进度。')
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('✗ autopilotTrajectory 未配置(定时器不启动)')
378
- suggest.push('配置:.opencode/serenity.json 加 autopilotTrajectory 段(autopilot-trajectory init 可生成)')
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-trajectory init 生成模板后编辑)')
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 根(配置了 autopilotTrajectory 的优先) */
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;acc_msm exec 会自动注入 SERENITY_ROOT)')
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;
@@ -50,7 +50,7 @@ export declare const BIAS_OUTPUT_MAX: number;
50
50
  export declare const BIAS_RUN_TIMEOUT_MS = 60000;
51
51
  /** 审计历史 ring 上限(每 CCC 保留最近 N 条唤起记录) */
52
52
  export declare const AUDIT_HISTORY_MAX = 50;
53
- /** 读配置:新键 autopilotTrajectory 优先,旧键 autotrajectory 回退(正式化兼容) */
53
+ /** 读配置:`trajectory.autopilot`(D58 新键)优先 → 旧键 autopilotTrajectory 旧键 autotrajectory */
54
54
  export declare function readAutopilotSettings(root: string): AutopilotTrajectorySettings | null;
55
55
  /**
56
56
  * 北京时间(UTC+8)当前小时——不依赖服务器时区(服务器可能 UTC/本地任意)。
@@ -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
  *
@@ -142,13 +170,13 @@ export declare function performAutopilotWake(ctx: Context, root: string, setting
142
170
  */
143
171
  export declare function registerAutopilot(ctx: Context): void;
144
172
  /**
145
- * 面板状态(GET /serenity/autopilot-trajectory 数据源;纯逻辑,可单测)——
173
+ * 面板状态(GET /serenity/trajectory 数据源;纯逻辑,可单测)——
146
174
  * WebUI 设置面板「Autopilot Trajectory」只读区块展示的完整状态:配置摘要 + 目标会话
147
175
  * 命中/标志/空闲时长 + 当前窗口/可唤起判定 + 审计(最近唤起)。
148
- * 不运行偏见脚本(只报脚本是否就绪——运行验证走 autopilot-trajectory random)。
176
+ * 不运行偏见脚本(只报脚本是否就绪——运行验证走 trajectory random)。
149
177
  */
150
178
  export interface AutopilotTrajectoryStatus {
151
- /** 是否配置了 autopilotTrajectory 段(.opencode/serenity.json;含旧键回退) */
179
+ /** 是否配置了 trajectory.autopilot 段(.opencode/serenity.json;旧键 autopilotTrajectory / autotrajectory 回退) */
152
180
  configured: boolean;
153
181
  /** 总开关(缺省 false——未开零资源占用) */
154
182
  enabled: boolean;
@@ -202,7 +230,17 @@ export declare function collectAutopilotCccs(ctx: Context, opts?: {
202
230
  includeDisabled?: boolean;
203
231
  }): string[];
204
232
  /**
205
- * 进程内诊断(autopilot-trajectory diag-live 数据源;用户"排查访问不到 pangu 写个 msm")——
233
+ * 所有 live 会话所属的 CCC 根(去重,保持出现顺序)。
234
+ *
235
+ * 与 {@link collectAutopilotCccs} 的区别:**不要求该 CCC 配置 trajectory.autopilot**——
236
+ * 唤醒注册表(wake-scheduler)的条目可以指向任何 CCC 的任何 trajectory。
237
+ *
238
+ * @param ctx 插件上下文
239
+ * @returns CCC 根路径列表(无 live 会话 → `[]`)
240
+ */
241
+ export declare function collectLiveCccs(ctx: Context): string[];
242
+ /**
243
+ * 进程内诊断(trajectory diag-live 数据源;用户"排查访问不到 pangu 写个 msm")——
206
244
  * 输出当前实例 live 会话清单(id/cwd/ccc/标题)+ 每个配置了 Autopilot 的 CCC
207
245
  * 状态(配置摘要/目标命中/可唤起)+ 目标 agent 定位结果。脚本 diag 看不到运行时,
208
246
  * 本函数在插件进程内运行(能读 sessions/agents)。
@@ -222,3 +260,4 @@ export interface DiagLiveReport {
222
260
  panelResolved: string | null;
223
261
  }
224
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, readHandymanConfig as f, findGitRoot as i, pathInside as l, resolveInside as m, SAFE_MODE_MARKER as n, isSafeModeOn as o, readUtf8 as p, classifyPath as r, loadSerenityConfig as s, DEFAULT_SERENITY_CONFIG_PATHS as t, readBlacklist as u };
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 };