@shgroup/dsh-serenity-hooks 1.31.12 → 1.32.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 CHANGED
@@ -78,10 +78,10 @@ dsh plugin --profile web add link:$(pwd)/hooks/dsh-serenity-hooks
78
78
  | `handyman` | 杂工:派一个便宜模型的助手干活。**默认模式(foreground)**= 一次串行委派、拿回结果;**background 模式**= 循环干活直到完成(完成码校验 / 轮次上限 / 自动重启 / 进度文件),也可一次派多个并行 | 大批量、重复性的活(扫描几十个技能、逐用例回归) |
79
79
  | `localstore` | 存密钥和配置(凭据、偏好两个命名空间) | API key、密码集中放一处,不进 git |
80
80
  | `container_admin` | 机务舱:管理子角色、管理小工具注册表、查看全部配置 | 定义"子角色"、注册新小工具时 |
81
- | `autopilot-trajectory` | 自动巡航:定时唤醒工作区、注入当前焦点,支持多个工作区各自独立 | 想让 AI 定时自己干活(见 §6.5) |
81
+ | `trajectory` | 轨迹管理:登记**未来唤醒**(唤醒 = 未来某时刻 + 一条消息,可唤醒自己,也可唤醒别的轨迹);定时自动巡航(到点唤醒工作区、注入当前焦点),支持多个工作区各自独立 | 想让 AI 定时自己干活、或安排它未来某刻自动接着干(见 §6.5) |
82
82
  | `im-bridge` | 给 IM 联系人发消息(目前是微信):发文本、发文件、查已配置联系人、查通道状态。每次成功发送自动进工作区的消息记录 | 想让 AI 主动给家人/同事发消息(见 §6.6)。**只在工作区配了微信桥时才出现**,且只能发本工作区的消息 |
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` · `acc_kit` → `dashboard` · `acc_msm` → `msm`(执行)+ `container_admin`(管理)· `eap`/`neat`/`cce` → `praxis` · `skiff_admin` → `container_admin role` · `autopilot-trajectory` → `trajectory`。老会话里看到旧名,照这张表对照即可。
85
85
 
86
86
  ### 3.2 机械约束(AI 绕不过去)
87
87
 
@@ -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(自主巡航)是它的一个子集**——"周期自唤醒"的特例。
270
+
271
+ **自主巡航**:让工作区**到点自己醒过来干活**,全程在你眼前发生(前台注入,随时可介入):
270
272
 
271
273
  - **什么时候醒**:工作区开关打开 + 全局开关打开(默认关,只在你想跑的机器上开)+ 目标会话存在(目录带 `--auto` 后缀)+ 到了间隔(支持小数,最密约 36 秒)+ 不在避开的高峰窗口(默认北京时间 8~18 点)+ 偏见脚本就绪
272
274
  - **醒了先看什么**:先看你自己写的"焦点"(`topPrompt`,每轮最先注入,防跑偏),再看随机生成的"偏见内容"(你写的脚本,负责探索方向)
273
275
  - **多个工作区各自独立**:每个工作区自己的间隔/会话/焦点/窗口,互不干扰
274
276
  - **有审计**:每次唤醒都记一笔,面板里能看到最近几次;失败会指数退避重试
277
+ - **还能预约未来某一刻**:登记一条"唤醒"= 未来某时刻 + 一条消息——可以给自己预约,也可以唤醒别的轨迹;落在工作区内的 `AGENT_SESSIONS/wake-registry.json`(可读可审计),到点由中心调度器投递,不阻塞、不等待
275
278
  - 没有"每天最多唤醒几次"的限制——频率只由间隔和窗口决定
276
279
 
277
280
  ### 6.6 安全模型
@@ -317,7 +320,7 @@ AI 一次能"记住"的内容有上限。满了不用你手动开新会话:
317
320
 
318
321
  ```bash
319
322
  pnpm typecheck # 类型检查(node + 浏览器端两套)
320
- pnpm test # 全量测试(当前 80 个文件 / 1180 个用例)
323
+ pnpm test # 全量测试(当前 80 个文件 / 1186 个用例)
321
324
  pnpm build # 打包(lib/index.js + client.js)
322
325
  ```
323
326
 
@@ -327,6 +330,9 @@ pnpm build # 打包(lib/index.js + client.js)
327
330
  ⚠️ **改完 `package.json` 依赖后必须跑 `lockfile` 并提交锁文件** —— v1.31.6 漏了这一步,CI 从此一直红(红在"测试根本没跑",见 CHANGELOG v1.31.10)
328
331
  - **宿主类型基准 = devDependencies**(v1.31.11):`tsconfig.json` / `client/tsconfig.json` 的 `paths` 指向**仓库内** `node_modules/@deepseek-ai/*`,由精确钉版的 devDependencies 提供 → **新增 paths 条目必须同时加 devDependency**(否则 tsc 静默回落 node_modules = 假绿,CI 的 typecheck 也就形同虚设)。机械闸门见 `tests/compliance.test.ts` F7;升级宿主时只改 `package.json` 一处 + 重跑 `lockfile`
329
332
  - **升级宿主(v1.31.12)**:`dsh-develop host-upgrade <版本|dist-tag>` 全局升级 DSH CLI(包名硬编码 `@deepseek-ai/dsh`、默认官方源、`--dry-run` 预览)→ 把 `package.json` 的 peer/devDeps 基准抬到同一版本 + 重跑 `lockfile`(`compliance.test.ts` F6c/F7d 与 `host-manifest.test.ts` 会强制各声明面同步,漏一处必红)→ `restart-web` → `dashboard health` 看 `dshVersion`
333
+ - **诊断会话打不开(v1.31.13)**:`dsh-develop session-doctor` —— 会话日志体检(**只读**)。
334
+ `--probe` 走宿主**真实读取路径**判定(`msm("dsh-develop", ["session-doctor","--probe","--summary"])` 可全量跑)。
335
+ ⚠️ 两个易误读点:① `readStoredLog` 是**存储层**读、**不走格式迁移** ⇒ 它对历史世代报 "no upgrade path" 属**正常现象**,不是损坏证据;判断"用户能不能打开"要看应用面 `open(id,'read')`。② 本工具修的两个真实缺陷见 CHANGELOG v1.31.13(`rebuild` 写的 `user/message` 缺 `id`/`role` ⇒ 会话**永久打不开**;`findSessionLog` 不认 `session.vN.jsonl.zstd` ⇒ 清理静默失效)
330
336
  - **架构**:Cordis 原生插件,用 DSH 的正式接口注册工具和拦截点——**从不修改 DSH 本体**
331
337
  - **代码地图**:[docs/codebase-overview-v1.22.md](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/docs/codebase-overview-v1.22.md)
332
338
  - **设计决策**:见 [CHANGELOG.md](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/CHANGELOG.md) 和维护技能 `dsh-serenity-plugin-development`
@@ -341,7 +347,7 @@ pnpm build # 打包(lib/index.js + client.js)
341
347
  | 跑在 | OpenCode | DeepSeek Harness |
342
348
  | 实现 | 独立 | **独立**(不复用源码,但遵循同一套标准) |
343
349
  | 系统提示词 | `system.transform` | `systemPrompt.section`,平台无关的部分逐字对齐 |
344
- | 工具 | 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 / logbook / dashboard / container_git / msm / praxis / handyman / localstore / container_admin / trajectory / im-bridge |
345
351
 
346
352
  **同一个工作区可以随时换运行时**:`.serenity` 标记、`.opencode/skills/`、配置、`AGENT_SESSIONS/` 的文件格式都一致;
347
353
  差别只在平台层(工具名、注入方式),换过去以后 AI 收到的约束是一样的。
@@ -385,4 +391,4 @@ pnpm build # 打包(lib/index.js + client.js)
385
391
 
386
392
  MIT(见 [LICENSE](https://github.com/tellmewhattodo/dsh-serenity-plugin/blob/master/LICENSE))
387
393
 
388
- > **版本**:v1.31.12 | **前置**:DSH 0.1.5-rc.2+ / Node ≥ 20 或 bun | **测试**:80 个文件 / 1180 个用例
394
+ > **版本**:v1.31.13 | **前置**:DSH 0.1.5-rc.2+ / Node ≥ 20 或 bun | **测试**:80 个文件 / 1186 个用例
package/dsh.plugin.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "id": "dsh-serenity-hooks",
3
- "version": "1.31.12",
3
+ "version": "1.32.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/logbook/dashboard/container_git/msm/praxis/handyman/localstore/container_admin/trajectory/im-bridge)+ 机械约束(安全模式/工作区围墙/密钥守卫)+ 工作日志与原地重建 + 网页登录入口/微信桥/子角色/对外问答页/trajectory 唤醒注册表。适配 DSH 0.1.5-rc.2(deepseek-ai/deepseek-harness)。",
6
6
  "engines": {
7
7
  "dsh": ">=0.1.5-rc.2"
8
8
  },
@@ -17,7 +17,7 @@
17
17
  "handyman",
18
18
  "localstore",
19
19
  "container_admin",
20
- "autopilot-trajectory",
20
+ "trajectory",
21
21
  "im-bridge"
22
22
  ],
23
23
  "skills": []
@@ -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 独立),并提供一站式管理工具(`trajectory`:无参全报告 / init 初始化 / random 验证偏见内容 / diag 诊断)。任何希望参与的 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
+ > 实验管理:工具 `trajectory`(动作 `<all|doc|check|status|guide>`;D58 起 ACC 工具 `autopilot-trajectory` 更名 `trajectory`,硬切无别名)
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
+ ### ① 初始化(一键):`trajectory 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 自己的反馈信息来源保证"足够随机"。`trajectory random` 可验证输出。
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. 实验管理(`trajectory` 工具)——一站式
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
+ | `trajectory`(**推荐,无参**) | **一站式全报告**:背景摘要 + 就绪度检查 + 当前状态 + 下一步指引 + 步骤——CCC agent 看一次即完整理解并知道怎么开始 |
93
+ | `trajectory init` | **一键初始化**:写配置 + 生成偏见提供者脚本模板(CCC 根 autopilot-bias.ts) |
94
+ | `trajectory random` | 运行偏见提供者脚本,输出当前偏见内容(验证) |
95
+ | `trajectory doc` | 机制定义说明全文(本 SKILL.md) |
96
+ | `trajectory check` | 仅就绪度检查(配置/轨迹焦点 topPrompt/偏见提供者/--auto 标志/动机段) |
97
+ | `trajectory status` | 仅当前状态(配置快照/目标会话/距上次活动/唤起窗口/可唤起性) |
98
+ | `trajectory guide` | 仅步骤指引 |
97
99
 
98
100
  ## 6. 观察与验证
99
101
 
@@ -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/本地任意)。
@@ -142,13 +142,13 @@ export declare function performAutopilotWake(ctx: Context, root: string, setting
142
142
  */
143
143
  export declare function registerAutopilot(ctx: Context): void;
144
144
  /**
145
- * 面板状态(GET /serenity/autopilot-trajectory 数据源;纯逻辑,可单测)——
145
+ * 面板状态(GET /serenity/trajectory 数据源;纯逻辑,可单测)——
146
146
  * WebUI 设置面板「Autopilot Trajectory」只读区块展示的完整状态:配置摘要 + 目标会话
147
147
  * 命中/标志/空闲时长 + 当前窗口/可唤起判定 + 审计(最近唤起)。
148
- * 不运行偏见脚本(只报脚本是否就绪——运行验证走 autopilot-trajectory random)。
148
+ * 不运行偏见脚本(只报脚本是否就绪——运行验证走 trajectory random)。
149
149
  */
150
150
  export interface AutopilotTrajectoryStatus {
151
- /** 是否配置了 autopilotTrajectory 段(.opencode/serenity.json;含旧键回退) */
151
+ /** 是否配置了 trajectory.autopilot 段(.opencode/serenity.json;旧键 autopilotTrajectory / autotrajectory 回退) */
152
152
  configured: boolean;
153
153
  /** 总开关(缺省 false——未开零资源占用) */
154
154
  enabled: boolean;
@@ -202,7 +202,17 @@ export declare function collectAutopilotCccs(ctx: Context, opts?: {
202
202
  includeDisabled?: boolean;
203
203
  }): string[];
204
204
  /**
205
- * 进程内诊断(autopilot-trajectory diag-live 数据源;用户"排查访问不到 pangu 写个 msm")——
205
+ * 所有 live 会话所属的 CCC 根(去重,保持出现顺序)。
206
+ *
207
+ * 与 {@link collectAutopilotCccs} 的区别:**不要求该 CCC 配置 trajectory.autopilot**——
208
+ * 唤醒注册表(wake-scheduler)的条目可以指向任何 CCC 的任何 trajectory。
209
+ *
210
+ * @param ctx 插件上下文
211
+ * @returns CCC 根路径列表(无 live 会话 → `[]`)
212
+ */
213
+ export declare function collectLiveCccs(ctx: Context): string[];
214
+ /**
215
+ * 进程内诊断(trajectory diag-live 数据源;用户"排查访问不到 pangu 写个 msm")——
206
216
  * 输出当前实例 live 会话清单(id/cwd/ccc/标题)+ 每个配置了 Autopilot 的 CCC
207
217
  * 状态(配置摘要/目标命中/可唤起)+ 目标 agent 定位结果。脚本 diag 看不到运行时,
208
218
  * 本函数在插件进程内运行(能读 sessions/agents)。
package/lib/ccc.d.ts CHANGED
@@ -84,6 +84,16 @@ export interface SerenityConfig {
84
84
  autopilotTrajectory?: AutopilotTrajectorySettings;
85
85
  /** 旧键兼容(正式化前存量 CCC,如 pangu——新键 autopilotTrajectory 优先,旧键回退) */
86
86
  autotrajectory?: AutopilotTrajectorySettings;
87
+ /**
88
+ * trajectory 族配置(D58,S142 2026-09-13):`trajectory` 是一等概念,
89
+ * **autopilot 降为其子集**——故 autopilot 的配置迁到 `trajectory.autopilot`。
90
+ * 读取顺序(逐级回退,**不回写**):`trajectory.autopilot` → `autopilotTrajectory` → `autotrajectory`。
91
+ * 唤醒注册表(未来时刻一次性唤醒)为 CCC 级文件 `AGENT_SESSIONS/wake-registry.json`,不在此配置。
92
+ */
93
+ trajectory?: {
94
+ /** autopilot(周期自唤醒的特例;每 CCC 单例,D59) */
95
+ autopilot?: AutopilotTrajectorySettings;
96
+ };
87
97
  /**
88
98
  * 微信桥(F4c-3,v1.27.0 实验性):**CCC 级**配置——dsh 一个进程含多个 CCC,
89
99
  * 每个 CCC 独立对接微信桥(S142 用户拍板:ACC 不绑定 role,配置归 CCC,手工)。
package/lib/client.js CHANGED
@@ -5112,6 +5112,7 @@ Instruction-following style:
5112
5112
  const [cccs, setCccs] = (0, react.useState)([]);
5113
5113
  const [selectedRoot, setSelectedRoot] = (0, react.useState)("");
5114
5114
  const [status, setStatus] = (0, react.useState)(null);
5115
+ const [wakes, setWakes] = (0, react.useState)([]);
5115
5116
  const [unavailable, setUnavailable] = (0, react.useState)(false);
5116
5117
  const [waking, setWaking] = (0, react.useState)(false);
5117
5118
  const [wakeResult, setWakeResult] = (0, react.useState)(null);
@@ -5135,9 +5136,10 @@ Instruction-following style:
5135
5136
  const refresh = (0, react.useCallback)(async () => {
5136
5137
  if (!selectedRoot) return;
5137
5138
  try {
5138
- const res = await fetch(`/serenity/autopilot-trajectory?ccc=${encodeURIComponent(selectedRoot)}`, { headers: { accept: "application/json" } });
5139
+ const res = await fetch(`/serenity/trajectory?ccc=${encodeURIComponent(selectedRoot)}`, { headers: { accept: "application/json" } });
5139
5140
  if (!res.ok) return;
5140
5141
  const body = await res.json();
5142
+ if (Array.isArray(body.wakes)) setWakes(body.wakes);
5141
5143
  if (body.status) {
5142
5144
  setStatus(body.status);
5143
5145
  setUnavailable(false);
@@ -5156,7 +5158,7 @@ Instruction-following style:
5156
5158
  setWaking(true);
5157
5159
  setWakeResult(null);
5158
5160
  try {
5159
- const res = await fetch("/serenity/autopilot-trajectory", {
5161
+ const res = await fetch("/serenity/trajectory", {
5160
5162
  method: "POST",
5161
5163
  headers: {
5162
5164
  "content-type": "application/json",
@@ -5204,7 +5206,7 @@ Instruction-following style:
5204
5206
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
5205
5207
  title: "目标 CCC",
5206
5208
  desc: "多 CCC 各自独立——选中哪个就查看/唤起哪个",
5207
- help: "Autopilot Trajectory 目标认知容器:\n· 机制:dsh 一个进程可挂载多个 CCC,每个 CCC 的 autopilot 独立配置\n· 选择:下拉切换要查看/唤起的目标 CCC(各 CCC 时钟独立)\n· 配置:各 CCC 在自身 .opencode/serenity.json 定义 autopilotTrajectory\n· 唤起:仅对选中 CCC 生效,互不干扰",
5209
+ help: "Autopilot Trajectory 目标认知容器:\n· 机制:dsh 一个进程可挂载多个 CCC,每个 CCC 的 autopilot 独立配置\n· 选择:下拉切换要查看/唤起的目标 CCC(各 CCC 时钟独立)\n· 配置:各 CCC 在自身 .opencode/serenity.json 定义 trajectory.autopilot(旧键 autopilotTrajectory 兼容)\n· 唤起:仅对选中 CCC 生效,互不干扰",
5208
5210
  control: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
5209
5211
  className: "ss-select",
5210
5212
  value: selectedRoot,
@@ -5224,7 +5226,7 @@ Instruction-following style:
5224
5226
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
5225
5227
  title: "运行状态",
5226
5228
  desc: stateText,
5227
- help: "Autopilot Trajectory 运行状态含义:\n· 未配置:该 CCC 未定义 autopilotTrajectory(机制不开始)\n· 已配置未启用:enabled=false,零资源占用(不唤起不消耗)\n· 已启用:时钟驱动周期性自动唤起——无人类活动满间隔小时数后\n 启动一次前台 agent 轮(用户全程可见可介入)",
5229
+ help: "Autopilot Trajectory 运行状态含义:\n· 未配置:该 CCC 未定义 trajectory.autopilot(机制不开始)\n· 已配置未启用:enabled=false,零资源占用(不唤起不消耗)\n· 已启用:时钟驱动周期性自动唤起——无人类活动满间隔小时数后\n 启动一次前台 agent 轮(用户全程可见可介入)",
5228
5230
  control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5229
5231
  className: "ss-value",
5230
5232
  children: status.enabled ? "● 运行中" : status.configured ? "○ 待启" : "—"
@@ -5255,6 +5257,16 @@ Instruction-following style:
5255
5257
  }
5256
5258
  ] })
5257
5259
  }) }),
5260
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5261
+ className: "ss-rowCard",
5262
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DefList, { items: [{
5263
+ term: "唤醒注册表",
5264
+ value: wakes.length === 0 ? "无条目(agent 用 trajectory wake-add 登记:未来时刻 + 一条 message)" : `${wakes.filter((w) => w.state === "pending").length} 条在办 / 共 ${wakes.length} 条`
5265
+ }, ...wakes.slice(0, 5).map((w) => ({
5266
+ term: w.state === "pending" ? "· 待唤醒" : `· ${w.state}`,
5267
+ value: `${new Date(w.at).toLocaleString()} → ${w.target}${w.lastResult ? `(${w.lastResult})` : ""}`
5268
+ }))] })
5269
+ }) }),
5258
5270
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
5259
5271
  title: "立即唤起",
5260
5272
  desc: wakeResult ?? "调试:手动触发一次(跳过窗口/间隔,仍校验配置与偏见脚本)",