@shgroup/dsh-serenity-hooks 1.64.0 → 1.66.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 (40) hide show
  1. package/README.md +14 -14
  2. package/dsh.plugin.json +3 -3
  3. package/lib/{ccc-B0ZGL9lx.js → ccc-C33QWoWZ.js} +3 -3
  4. package/lib/{ccc-roots-GIJ3A_tw.js → ccc-roots-RMzGU-CJ.js} +2 -2
  5. package/lib/ccc.d.ts +15 -50
  6. package/lib/client.js +43 -1
  7. package/lib/{trajectory-assistant.d.ts → cognitive-trajectory-assistant.d.ts} +9 -9
  8. package/lib/{trajectory-bound.d.ts → cognitive-trajectory-bound.d.ts} +10 -10
  9. package/lib/{trajectory-ops.d.ts → cognitive-trajectory-ops.d.ts} +97 -18
  10. package/lib/{trajectory-skills.d.ts → cognitive-trajectory-skills.d.ts} +8 -8
  11. package/lib/cro-log.d.ts +2 -2
  12. package/lib/cro.d.ts +1 -1
  13. package/lib/index.d.ts +1 -1
  14. package/lib/index.js +244 -228
  15. package/lib/invariant.d.ts +1 -1
  16. package/lib/invariant.js +1 -1
  17. package/lib/json.d.ts +1 -1
  18. package/lib/{localstore-ops-DMs_ovHo.js → localstore-ops-ylQoPz1Q.js} +1 -1
  19. package/lib/{message-source-B4P3Uw6D.js → message-source-DM9-2eUT.js} +143 -59
  20. package/lib/output-guard-seam.d.ts +1 -1
  21. package/lib/output-guard.d.ts +1 -1
  22. package/lib/rebuild.d.ts +2 -2
  23. package/lib/seams/keeper.d.ts +6 -6
  24. package/lib/seams/system-prompt.d.ts +1 -1
  25. package/lib/{settings-section-DN7g8K7Q.js → settings-section-B1YzjFz6.js} +1 -1
  26. package/lib/skiff-core.d.ts +10 -10
  27. package/lib/skiff-debug.d.ts +1 -1
  28. package/lib/{skiff-role-B615L9MV.js → skiff-role-Boc4SKct.js} +14 -14
  29. package/lib/skiff-role.d.ts +4 -4
  30. package/lib/skills/resource-index.d.ts +1 -1
  31. package/lib/skills-discovery.d.ts +1 -1
  32. package/lib/status.d.ts +8 -0
  33. package/lib/tools/{trajectory.d.ts → cognitive-trajectory.d.ts} +7 -7
  34. package/lib/tools/skiff-admin.d.ts +1 -1
  35. package/lib/usage-stats.d.ts +1 -1
  36. package/lib/wake-registry.d.ts +5 -5
  37. package/lib/wake-scheduler.d.ts +5 -5
  38. package/lib/weixin-bridge.d.ts +1 -1
  39. package/lib/{weixin-route-Aheyq3fN.js → weixin-route-BoSC-uPp.js} +2 -2
  40. package/package.json +2 -2
@@ -58,6 +58,6 @@ export declare function assertManifestProse(manifestPath: string, readmePaths: r
58
58
  * `review`(C 档,调引擎 `compliance`)/`index`(调 P1 的生成器)/`status` ⇒ **14**。
59
59
  * 同规格:**条件可见与否不影响这里列它**(本常量 = "插件**具备**的工具面")。
60
60
  */
61
- export declare const REGISTERED_TOOLS: readonly ["container_fs", "container_trajectory", "dashboard", "container_git", "msm", "praxis", "ontology", "serenity-skill-creator", "cheap-worker", "localstore", "container_admin", "im-bridge", "acc-diag", "diagram"];
61
+ export declare const REGISTERED_TOOLS: readonly ["container_fs", "cognitive_trajectory", "dashboard", "container_git", "msm", "praxis", "ontology", "serenity-skill-creator", "cheap-worker", "localstore", "container_admin", "im-bridge", "acc-diag", "diagram"];
62
62
  /** 条件出现的工具数(`REGISTERED_TOOLS` 的**末段**;`assertManifestProse` 用) */
63
63
  export declare const CONDITIONAL_TOOL_COUNT = 3;
package/lib/invariant.js CHANGED
@@ -137,7 +137,7 @@ function assertManifestProse(manifestPath, readmePaths) {
137
137
  */
138
138
  const REGISTERED_TOOLS = [
139
139
  "container_fs",
140
- "container_trajectory",
140
+ "cognitive_trajectory",
141
141
  "dashboard",
142
142
  "container_git",
143
143
  "msm",
package/lib/json.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * json.ts — 本地 JsonValue 类型(与 DSH 的 JsonValue 同构)
3
3
  *
4
- * 纯层(fs-ops/trajectory-ops)保持零 DSH 运行时依赖:仅用本地类型标注,
4
+ * 纯层(fs-ops/cognitive-trajectory-ops)保持零 DSH 运行时依赖:仅用本地类型标注,
5
5
  * 工具层(defineTool)要求 execute 返回 DSH JsonValue,二者结构等价。
6
6
  */
7
7
  export type JsonValue = string | number | boolean | null | JsonValue[] | {
@@ -1,4 +1,4 @@
1
- import { s as loadSerenityConfig, t as DEFAULT_SERENITY_CONFIG_PATHS } from "./ccc-B0ZGL9lx.js";
1
+ import { s as loadSerenityConfig, t as DEFAULT_SERENITY_CONFIG_PATHS } from "./ccc-C33QWoWZ.js";
2
2
  import { join } from "node:path";
3
3
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
4
4
  //#region src/localstore-ops.ts
@@ -1,4 +1,4 @@
1
- import { r as cccRootForCwd } from "./ccc-roots-GIJ3A_tw.js";
1
+ import { r as cccRootForCwd } from "./ccc-roots-RMzGU-CJ.js";
2
2
  import { basename, dirname, join } from "node:path";
3
3
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, writeFileSync } from "node:fs";
4
4
  //#region src/time.ts
@@ -87,26 +87,50 @@ function localIdStamp(value = Date.now()) {
87
87
  return `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}`;
88
88
  }
89
89
  //#endregion
90
- //#region src/trajectory-ops.ts
90
+ //#region src/cognitive-trajectory-ops.ts
91
91
  /**
92
- * trajectory-ops.ts — 轨迹工具纯操作层(零 DSH 依赖,可独立单测)
92
+ * cognitive-trajectory-ops.ts — 轨迹工具纯操作层(零 DSH 依赖,可独立单测)
93
93
  *
94
94
  * 行为对齐 osp(opencode-serenity-plugin/src/session/lib.ts)——osp 是 ACC 工具 spec。
95
95
  *
96
- * v1.33 收敛(S142 §32):本文件只服务 `container_trajectory` 的动作面
96
+ * v1.33 收敛(S142 §32):本文件只服务 `cognitive_trajectory` 的动作面
97
97
  * (现行 **8 个**:list / show / create / use / rebuild / **send-now** / **send-later** / **cro-guide**)。旧 `logbook` 面里
98
98
  * **close / archive / health / qa 四个动作已删**(用户裁决「功能上废弃,实际上没用」),
99
99
  * 其函数(closeSession / archiveSessions / healthCheck / qaCheck)**同批删除**——
100
100
  * 保留下来的只有:create(--desc / --issue 二选一、dry-run 预览)、
101
101
  * list(含 summarize 仪表盘)、show、use(激活 + 绑定)、以及供 list 用的 summarize。
102
- * 「完成」不再由 close 写入,而是从 SESSION.md 的 `[x]` 推导;归档走 `container_fs mv`。
102
+ *
103
+ * ## 🔴 2026-10-18(owner 令):**认知轨迹没有生命周期**
104
+ *
105
+ * owner 原话要点:*"我需要允许永存的认知轨迹……我希望该生命周期足够简单,即没有生命周期,
106
+ * 但允许轨迹本身被操作为归档"*。据此**删除**了以下全部"生命周期"语义:
107
+ *
108
+ * | 被删的 | 为什么它属于生命周期 |
109
+ * |---|---|
110
+ * | `completed` 解析(SESSION.md 里的方括号小写 x) | "完成"是一个**终态**;没有生命周期就没有终态 |
111
+ * | `summarize` 的 Active / Completed / Stale / Ghost 四项计数 | 四项全部在给轨迹分"阶段" |
112
+ * | `advisoryHint` 的「N 天未更新」告警 | 老化告警的前提是"旧轨迹该退休了"——现在**旧不是问题** |
113
+ * | `findLatestActiveSessionMd`(**全仓零消费者**,纯死代码) | 它的语义是"最新的**未完成**轨迹",前提已不存在 |
114
+ *
115
+ * **保留**:SESSION.md 头部的状态行**照旧生成**(`- 状态: [ ] 进行中`),但**不再被任何代码解析**。
116
+ * 理由(owner 裁决):格式最小变动、老文件完全不用改。⇒ 它从"机器契约"降为**惰性文本**,
117
+ * 且"进行中"对永存轨迹**恒为真**,因此不构成谎言。
118
+ *
119
+ * **新增唯一的操作**:`archiveSession()` —— 单向移入 `_archived/`。
120
+ * 归档是**唯一的"变化"**,且它不属于轨迹自身:轨迹本体(目录 + SESSION.md)**永不被改**,
121
+ * 只是**换了个存放位置**、从清单里消失。恢复 = 手工 `container_fs mv` 移回(owner 裁决:不设 unarchive)。
122
+ *
123
+ * ⚠️ 由此产生一条**必须成立**的配套:`readAllSessions` **跳过 `_` 前缀目录**。
124
+ * 否则归档后的轨迹会继续出现在清单里,"归档"就不是归档了(历史 bug:`_weixin-logs` /
125
+ * `_skiff-logs` / `_corpus` 曾被当成轨迹列出来)。
103
126
  */
104
- const TRAJECTORY_ACTIONS = [
127
+ const COGNITIVE_TRAJECTORY_ACTIONS = [
105
128
  "list",
106
129
  "show",
107
130
  "create",
108
131
  "use",
109
132
  "rebuild",
133
+ "archive",
110
134
  "send-now",
111
135
  "send-later",
112
136
  "cro-guide"
@@ -130,24 +154,26 @@ function sessionEvents(session) {
130
154
  return s.events ?? [];
131
155
  }
132
156
  const SESSION_MD = "SESSION.md";
133
- const HEALTH_STALE_DAYS = 7;
134
157
  const DAY = 864e5;
158
+ /** 归档区目录名(`_` 前缀 ⇒ 不是轨迹,见 readAllSessions 的跳过判据) */
159
+ const ARCHIVED_DIR = "_archived";
135
160
  function sessionsRoot(root) {
136
161
  return join(root, "AGENT_SESSIONS");
137
162
  }
138
- /** 解析 SESSION.md 状态元数据(对齐 osp parseSessionMd) */
163
+ /**
164
+ * 解析 SESSION.md 存在性。
165
+ *
166
+ * 🔴 **2026-10-18:不再解析"完成"**。旧实现 `completed: /\[\s*x\s*\]/i.test(content)` 已删——
167
+ * 轨迹永存 ⇒ 没有终态,而这个字段的所有消费者(排序 / 标记 / 计数)也同批删掉了。
168
+ * ⚠️ **副作用(有意接受)**:`[x]` 不再有机器含义 ⇒ 正文里出现它**不会再**把轨迹判成任何东西。
169
+ * 那条"正文绝不能用方括号小写 x"的老纪律随之解除(但它仍是无害的好习惯)。
170
+ */
139
171
  function parseSessionMd(filePath) {
140
172
  try {
141
- const content = readFileSync(filePath, "utf-8");
142
- return {
143
- hasSessionMd: true,
144
- completed: /\[\s*x\s*\]/i.test(content)
145
- };
173
+ readFileSync(filePath, "utf-8");
174
+ return { hasSessionMd: true };
146
175
  } catch {
147
- return {
148
- hasSessionMd: false,
149
- completed: false
150
- };
176
+ return { hasSessionMd: false };
151
177
  }
152
178
  }
153
179
  function readSessionEntry(dirPath) {
@@ -156,10 +182,7 @@ function readSessionEntry(dirPath) {
156
182
  if (!st.isDirectory()) return null;
157
183
  const dirName = basename(dirPath);
158
184
  const mdPath = join(dirPath, SESSION_MD);
159
- const status = existsSync(mdPath) ? parseSessionMd(mdPath) : {
160
- hasSessionMd: false,
161
- completed: false
162
- };
185
+ const status = existsSync(mdPath) ? parseSessionMd(mdPath) : { hasSessionMd: false };
163
186
  return {
164
187
  dirName,
165
188
  path: dirPath,
@@ -170,14 +193,20 @@ function readSessionEntry(dirPath) {
170
193
  return null;
171
194
  }
172
195
  }
173
- /** 读取 AGENT_SESSIONS 中所有会话,活跃(未完成)排前(对齐 osp readAllSessions) */
196
+ /**
197
+ * 读取 AGENT_SESSIONS 中所有**活跃**轨迹,按 mtime 降序。
198
+ *
199
+ * 🔴 **跳过 `_` 前缀目录**(2026-10-18 新增,与归档配套):
200
+ * `_archived` 是归档区,`_skiff-logs` / `_weixin-logs` / `_corpus` 是**日志与数据区**——
201
+ * 它们**都不是轨迹**。旧实现会把它们当轨迹列出来(历史 bug)。
202
+ * 没有这条,归档后的轨迹仍会出现在清单里 ⇒ **"归档"名不副实**。
203
+ *
204
+ * ⚠️ 排序判据已变:旧实现是「未完成优先,再 mtime 降序」,现在**只有 mtime 降序**
205
+ * (没有"未完成"这个概念了)。
206
+ */
174
207
  function readAllSessions(sessionsDir) {
175
208
  try {
176
- return readdirSync(sessionsDir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => readSessionEntry(join(sessionsDir, e.name))).filter((s) => s !== null).sort((a, b) => {
177
- if (!a.status.completed && b.status.completed) return -1;
178
- if (a.status.completed && !b.status.completed) return 1;
179
- return b.mtime.getTime() - a.mtime.getTime();
180
- });
209
+ return readdirSync(sessionsDir, { withFileTypes: true }).filter((e) => e.isDirectory()).filter((e) => !e.name.startsWith("_") && !e.name.startsWith(".")).map((e) => readSessionEntry(join(sessionsDir, e.name))).filter((s) => s !== null).sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
181
210
  } catch {
182
211
  return [];
183
212
  }
@@ -214,9 +243,9 @@ function listSessions(root, activeId) {
214
243
  const lines = sessions.map((s) => {
215
244
  const age = Math.floor((Date.now() - s.mtime.getTime()) / DAY);
216
245
  const sessionId = extractSessionId(s.dirName);
217
- return `${activeId !== void 0 && sessionId !== "" && sessionId === activeId ? "●" : s.status.completed ? "✓" : "○"} ${s.dirName} (${age}d ago)`;
246
+ return `${activeId !== void 0 && sessionId !== "" && sessionId === activeId ? "●" : "○"} ${s.dirName} (${age}d ago)`;
218
247
  });
219
- return `AGENT_SESSIONS/ (${sessions.length} sessions)\n` + lines.join("\n");
248
+ return `AGENT_SESSIONS/ (${sessions.length} active)\n` + lines.join("\n");
220
249
  }
221
250
  /** show 子命令(对齐 osp showSession:`# dirName\n\n` + SESSION.md 内容) */
222
251
  function showSession(root, key) {
@@ -230,10 +259,12 @@ function showSession(root, key) {
230
259
  /**
231
260
  * 生成 SESSION.md 模板(固定格式,owner 2026-09-25 裁决;时间戳 YYYY-MM-DD HH:mm)。
232
261
  *
233
- * 🔴 **状态行是被解析的机器契约**:`completed` 的判据 = SESSION.md 里出现 `[x]`(见 `parseSessionMd`)
234
- * ⇒ 状态行必须带标记 token:未完成 `- 状态: [ ] <label>`/已完成 `- 状态: [x] <label>`。
235
- * ⚠️ 改模板时**两件事必须同时成立**:① 状态行保留 `[ ]`(且全模板不得出现任何 `[x]`——否则新会话
236
- * 一出生就被判 completed)② 七个固定段的名字与顺序不得动(契约钉在 `tests/trajectory-ops.test.ts`)。
262
+ * 🔴 **2026-10-18:状态行不再是机器契约**(owner 裁决:轨迹永存,没有生命周期)。
263
+ * 它**照旧生成** `- 状态: [ ] 进行中`,但**没有任何代码解析它** —— 从"被解析的机器契约"
264
+ * 降为**惰性文本**。保留的两个理由:
265
+ * ① 格式最小变动、老文件完全不用改;
266
+ * ② 对永存轨迹来说"进行中"**恒为真**,所以它不是谎言,只是冗余。
267
+ * ⚠️ 仍然**不得**把任何一段固定 7 段的段名与顺序动掉(契约钉在 `tests/trajectory-ops.test.ts`)。
237
268
  */
238
269
  function sessionMdTemplate(title, id, goal, now) {
239
270
  const ts = localDateTimeMinutes(now);
@@ -463,7 +494,7 @@ function extractSessionMdPathFromText(text) {
463
494
  const m = text.match(SESSION_MD_PATH_RE);
464
495
  if (!m) return null;
465
496
  let p = m[1].trim();
466
- const suffix = p.search(/ \(the trajectory's persistent body/);
497
+ const suffix = p.search(/ \(the cognitive trajectory's persistent body/);
467
498
  if (suffix > 0) p = p.slice(0, suffix).trim();
468
499
  return p;
469
500
  }
@@ -508,41 +539,94 @@ function resolveSessionByTitle(title, sessionsDir) {
508
539
  if (fuzzy.length === 1) return join(fuzzy[0].path, SESSION_MD);
509
540
  return null;
510
541
  }
511
- /** summary 仪表盘(供 `list` 动作拼接;v1.33 起独立 `summary` 动作已撤,并入 list) */
542
+ /**
543
+ * summary 仪表盘(供 `list` 动作拼接;v1.33 起独立 `summary` 动作已撤,并入 list)。
544
+ *
545
+ * 🔴 **2026-10-18:四项生命周期计数已删**(Active / Completed / Stale / Ghost)。
546
+ * 它们全都在给轨迹**分阶段**,而 owner 裁决「没有生命周期」⇒ 唯一有意义的总数是 `Total`。
547
+ * ⚠️ **`Ghost` 也被删了**("目录在但没 SESSION.md")—— 它不是阶段而是**损坏**,但:
548
+ * · 真出现时 `use` 会在 `advisoryHint` 里**当场说清**(用到才发现,比长期挂一个计数更有效);
549
+ * · 挂一个恒 0 的计数只会钝化注意力。
550
+ * `Total` 现在 = **活跃轨迹数**(`_` 前缀的归档区与日志区已不在域内)。
551
+ */
512
552
  function summarize(root) {
513
553
  const sessions = readAllSessions(sessionsRoot(root));
514
554
  if (sessions.length === 0) return "AGENT_SESSIONS/ is empty.";
515
555
  const now = Date.now();
516
- const completed = sessions.filter((s) => s.status.completed).length;
517
- const active = sessions.length - completed;
518
- const stale = sessions.filter((s) => !s.status.completed && (now - s.mtime.getTime()) / DAY > HEALTH_STALE_DAYS).length;
519
- const ghost = sessions.filter((s) => !s.status.hasSessionMd).length;
520
556
  const recent = sessions.slice(0, 5);
521
- const lines = [
557
+ return [
522
558
  `AGENT_SESSIONS Summary`,
523
559
  `────────────────────────`,
524
- `Total: ${sessions.length}`,
525
- `Active: ${active}`,
526
- `Completed: ${completed}`,
527
- `Stale: ${stale}`,
528
- `Ghost: ${ghost}`,
560
+ `Active (not archived): ${sessions.length}`,
529
561
  ``,
530
562
  `Recent activity (top 5):`,
531
563
  ...recent.map((s) => {
532
564
  const age = Math.floor((now - s.mtime.getTime()) / DAY);
533
- return ` ${s.status.completed ? "✓" : "○"} ${s.dirName} (${age}d ago)`;
565
+ return ` ○ ${s.dirName} (${age}d ago)`;
534
566
  })
535
- ];
536
- if (stale > 0) lines.push("", "⚠ Warning: stale trajectories present (no activity > 7d) — see the list above for detail.");
537
- return lines.join("\n");
567
+ ].join("\n");
568
+ }
569
+ function listActiveTrajectories(root) {
570
+ const now = Date.now();
571
+ return readAllSessions(sessionsRoot(root)).map((s) => ({
572
+ dirName: s.dirName,
573
+ sessionId: extractSessionId(s.dirName),
574
+ ageDays: Math.floor((now - s.mtime.getTime()) / DAY),
575
+ hasSessionMd: s.status.hasSessionMd
576
+ }));
577
+ }
578
+ /**
579
+ * 把一条轨迹**单向**归档到 `AGENT_SESSIONS/_archived/`(owner 2026-10-18 裁决)。
580
+ *
581
+ * ## 为什么这是"唯一"的状态变化
582
+ * 轨迹没有生命周期 ⇒ 它**不完成、不关闭、不衰老**。它只会**换个存放位置**:
583
+ * 从活跃区移到归档区。目录与 SESSION.md **逐字节不动**(纯 rename)——
584
+ * 「归档」在此**不是删除,也不是收尾**,只是"不再列在活跃清单里"。
585
+ *
586
+ * ## 判据(R↓)
587
+ * ① **单向**:owner 裁决不设 unarchive。恢复 = 手工 `container_fs mv` 移回。
588
+ * ⇒ 不提供反向动作,避免"两个方向各自实现一遍、语义各自漂移"。
589
+ * ② **绝不覆盖**:目标已存在 ⇒ 报错,**不合并、不重命名、不删除**。归档是不可逆动作,
590
+ * 静默覆盖会**毁掉**先前那条轨迹(它的 SESSION.md 是唯一副本)。
591
+ * ③ **归档区不建在别处**:落点恒为 `<CCC>/AGENT_SESSIONS/_archived/`,
592
+ * 与 `readAllSessions` 的 `_` 跳过判据**成对**(换一处就要同时改两处 ⇒ 不换)。
593
+ * ④ `dryRun` 只报路径、不落盘。
594
+ *
595
+ * @param root CCC 根
596
+ * @param key 目录名 / S### / 唯一模糊串(同 findSession)
597
+ * @param dryRun 预览
598
+ */
599
+ function archiveSession(root, key, dryRun = false) {
600
+ const sessionsDir = sessionsRoot(root);
601
+ const target = findSession(sessionsDir, key);
602
+ if (!target) throw new Error(`Trajectory not found: "${key}". Use "list" to see available trajectories.`);
603
+ const archiveRoot = join(sessionsDir, ARCHIVED_DIR);
604
+ const dest = join(archiveRoot, target.dirName);
605
+ if (existsSync(dest)) throw new Error(`Cannot archive: "${target.dirName}" already exists in ${ARCHIVED_DIR}/. 归档不会覆盖既有轨迹(那是不可逆的丢失)。请先人工处理 ${dest}`);
606
+ if (dryRun) return {
607
+ message: `[dry-run] Would archive: ${target.dirName} → ${ARCHIVED_DIR}/`,
608
+ dirName: target.dirName,
609
+ from: target.path,
610
+ to: dest,
611
+ dryRun: true
612
+ };
613
+ mkdirSync(archiveRoot, { recursive: true });
614
+ renameSync(target.path, dest);
615
+ return {
616
+ message: `Archived: ${target.dirName} → ${ARCHIVED_DIR}/`,
617
+ dirName: target.dirName,
618
+ from: target.path,
619
+ to: dest,
620
+ dryRun: false
621
+ };
538
622
  }
539
623
  //#endregion
540
- //#region src/trajectory-bound.ts
624
+ //#region src/cognitive-trajectory-bound.ts
541
625
  /**
542
- * trajectory-bound.ts — SESSION 绑定持久化(CCC 内 `AGENT_SESSIONS/.bindings.json`)
626
+ * cognitive-trajectory-bound.ts — SESSION 绑定持久化(CCC 内 `AGENT_SESSIONS/.bindings.json`)
543
627
  *
544
628
  * 目标(S142 用户拍板,方案 v1.0):让「dsh 会话(载体)↔ SESSION(宁静号轨迹)」
545
- * 的绑定坚固——LLM 不能因智力因素(幻觉/理解偏差)在过程中或 container_trajectory rebuild 后
629
+ * 的绑定坚固——LLM 不能因智力因素(幻觉/理解偏差)在过程中或 cognitive_trajectory rebuild 后
546
630
  * 自行更换 SESSION。
547
631
  *
548
632
  * 存储形态(v1.30.6 起,S142 review F-01):绑定**不再写入 dsh 会话日志**。
@@ -776,12 +860,12 @@ function readLastBound(session) {
776
860
  return readLegacyBoundFromEvents(session);
777
861
  }
778
862
  /** 目录名 → 轨迹标签(`--S###--` 命中取 `S###`;未命中原样返回——编码无关 U4) */
779
- function trajectoryLabel(dirName) {
863
+ function cognitiveTrajectoryLabel(dirName) {
780
864
  const m = dirName.match(/--S(\d{3,})--/);
781
865
  return m ? `S${m[1]}` : dirName;
782
866
  }
783
867
  /**
784
- * **调用方自身**所属 trajectory 的标签(审计字段 `createdBy` 的唯一正解)。
868
+ * **调用方自身**所属 cognitive trajectory 的标签(审计字段 `createdBy` 的唯一正解)。
785
869
  *
786
870
  * 三级来源,逐级回退(R↓:为什么不用单一来源):
787
871
  * 1. `readLastBound(session)` —— **持久 bound**,权威(重启存活、不受别的会话激活污染)
@@ -789,7 +873,7 @@ function trajectoryLabel(dirName) {
789
873
  * 3. `getLastActiveSessionInfo()` —— **全局**最近激活指针(无绑定的会话兼容回退)
790
874
  *
791
875
  * ⚠️ 为何单列成本函数(S142 §30.12.1 实测缺陷):唤醒注册表的 `createdBy` 原先直接取第 3 级
792
- * 全局指针,而它记录的是"**进程内最近一次被激活的 trajectory**"——多会话并发时必然张冠李戴
876
+ * 全局指针,而它记录的是"**进程内最近一次被激活的 cognitive trajectory**"——多会话并发时必然张冠李戴
793
877
  * (实测:S142 登记唤醒被写成 `by=S060`)。`createdBy` 是 D60「以可审计替代入口栅」的**唯一凭证**,
794
878
  * 失真即替代控制失效 ⇒ 必须以"调用方自己是谁"为准,全局指针只作最后兜底。
795
879
  *
@@ -797,15 +881,15 @@ function trajectoryLabel(dirName) {
797
881
  * @param scope 调用方 dsh 会话 id(取不到传空串)
798
882
  * @returns 轨迹标签(`S###` 或完整目录名);三级全落空 → 空串(渲染为 `?`)
799
883
  */
800
- function resolveSessionTrajectoryLabel(session, scope) {
884
+ function resolveSessionCognitiveTrajectoryLabel(session, scope) {
801
885
  const bound = session ? readLastBound(session) : null;
802
- if (bound?.dirName) return trajectoryLabel(bound.dirName);
886
+ if (bound?.dirName) return cognitiveTrajectoryLabel(bound.dirName);
803
887
  const scoped = scope !== "" ? getActiveSessionInfo(scope) : null;
804
888
  if (scoped) return scoped.sessionId;
805
889
  return getLastActiveSessionInfo()?.sessionId ?? "";
806
890
  }
807
891
  /**
808
- * 反向查:绑定到某 trajectory 目录名的 dsh 会话 id(**按绑定时间倒序,最新在前**)。
892
+ * 反向查:绑定到某 cognitive trajectory 目录名的 dsh 会话 id(**按绑定时间倒序,最新在前**)。
809
893
  *
810
894
  * 用途(wake-scheduler 冷唤醒):.bindings.json 以 **sessionId 为键**,而唤醒条目的
811
895
  * target 是**目录名**——需要值侧扫描做反向索引。冷会话被唤醒时必须先知道"哪个 dsh
@@ -965,4 +1049,4 @@ const ACC_MESSAGE_KIND = "plugin:dsh-serenity-hooks";
965
1049
  /** ACC 注入消息的统一来源值(各缝共用;需要 `form` 时按 `ContextFormed` 另加字段)。 */
966
1050
  const PLUGIN_SOURCE = { kind: ACC_MESSAGE_KIND };
967
1051
  //#endregion
968
- export { localIdStamp as A, setActiveSessionInfo as C, isoLocal as D, useSession as E, localFileStamp as O, sessionsRoot as S, summarize as T, namingTitleFor as _, pruneMissingBindings as a, resolveSessionByTitle as b, setBindingStore as c, clearActiveSessionInfo as d, createSession as f, listSessions as g, getActiveSessionInfo as h, listBoundSessionIds as i, localHuman as k, DEFAULT_SESSION_SCOPE as l, findSession as m, PLUGIN_SOURCE as n, readLastBound as o, extractSessionMdPathFromText as p, appendBound as r, resolveSessionTrajectoryLabel as s, ACC_MESSAGE_KIND as t, TRAJECTORY_ACTIONS as u, parseSessionContextFromEvents as v, showSession as w, sessionEvents as x, readActiveSessionMd as y };
1052
+ export { localFileStamp as A, sessionEvents as C, summarize as D, showSession as E, localIdStamp as M, useSession as O, resolveSessionByTitle as S, setActiveSessionInfo as T, listActiveTrajectories as _, pruneMissingBindings as a, parseSessionContextFromEvents as b, setBindingStore as c, archiveSession as d, clearActiveSessionInfo as f, getActiveSessionInfo as g, findSession as h, listBoundSessionIds as i, localHuman as j, isoLocal as k, COGNITIVE_TRAJECTORY_ACTIONS as l, extractSessionMdPathFromText as m, PLUGIN_SOURCE as n, readLastBound as o, createSession as p, appendBound as r, resolveSessionCognitiveTrajectoryLabel as s, ACC_MESSAGE_KIND as t, DEFAULT_SESSION_SCOPE as u, listSessions as v, sessionsRoot as w, readActiveSessionMd as x, namingTitleFor as y };
@@ -8,7 +8,7 @@
8
8
  * 作用范围(v1.26.3 用户拍板):**仅外部面**——skiff 等对外输出会话
9
9
  * (session id `skiff-`/`rebuild-` 前缀;v1.22.4 rebuild 新建会话同面)。
10
10
  * **本地维护会话(普通 dsh 会话)不检测**——维护会话必然提及机制词
11
- * (dsh-serenity-hooks/container_trajectory rebuild/mech-registry),打回会瘫痪自身工作。
11
+ * (dsh-serenity-hooks/cognitive_trajectory rebuild/mech-registry),打回会瘫痪自身工作。
12
12
  *
13
13
  * 🔴 **2026-10-15 补注(面 E 退役)**:`acp-` 前缀分支**已成孤儿,但本批不动**。
14
14
  * 判据(两条,实测):① **该前缀从来没有生产者** —— 历史 `acp-core.ts` 建会话走的是
@@ -65,7 +65,7 @@ export declare function detectSensitive(text: string, table: SensitiveWordTable)
65
65
  * v1.26.10 只列裸词(如 "3080")模型仍不知道是什么/怎么规避;现在按类说明:
66
66
  * "3080" → 内部服务端口,不要提及内部端口/地址/端点)。
67
67
  * R↓ 安全性:命中词本就已在被拦截回复中进入会话(已暴露面),打回重复一次不扩大暴露;
68
- * steer 是 plugin source 消息不回显给用户(3100 对外响应已不含 trajectory → 打回文本不达外部用户)。
68
+ * steer 是 plugin source 消息不回显给用户(3100 对外响应已不含 cognitive trajectory → 打回文本不达外部用户)。
69
69
  */
70
70
  export declare function buildRebuke(hits: SensitiveHit[]): string;
71
71
  /** 连续打回上限(防死循环;达到后放弃打回,最终输出替换为合规占位 + 审计) */
package/lib/rebuild.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rebuild.ts — 轨迹跟踪器(Trajectory Tracker)超限重建:container_trajectory rebuild
2
+ * rebuild.ts — 轨迹跟踪器(Cognitive Trajectory Tracker)超限重建:cognitive_trajectory rebuild
3
3
  * (v1.30 起并入 logbook 的 rebuild action,v1.33 随 logbook 并入 trajectory,v1.34 工具名硬切
4
4
  * 为 container_trajectory;原独立 session_rebuild 工具)
5
5
  *
@@ -80,7 +80,7 @@ interface RebuildResult {
80
80
  * 它会把 rebuild 静默接到 AGENT_SESSIONS 里最新的另一个会话(临时 skiff 会话 persistent=false、
81
81
  * 重启后首条消息前、新会话首条消息都命中该形态),而"接错轨迹"比重建失败危险得多
82
82
  * (错误轨迹被继续写入 + 正确轨迹静默丢失)。现在全部候选失败 → 返回 null → 调用方
83
- * 报错引导用户显式 `container_trajectory use`(响亮失败优于静默接错)。
83
+ * 报错引导用户显式 `cognitive_trajectory use`(响亮失败优于静默接错)。
84
84
  * 备选:④ 仅在"同 scope 确无绑定"时兜底——同样会接错轨迹,故不采纳。
85
85
  *
86
86
  * 每候选 resolve 后 existsSync 校验(相对路径按 root 解析);全部失败返回 null → 调用方报错引导。
@@ -7,7 +7,7 @@
7
7
  * 计分(对齐 opencode-serenity-plugin session-keeper):
8
8
  * write/edit=3, task=10, read/grep/glob/msm=1, 经过时间 +1 分/分钟
9
9
  * 阈值:.opencode/serenity.json sessionKeeper.threshold(规范位置,.dsh 回退;缺省 150)
10
- * 提醒要求模型回应 [TRAJECTORY-ASSISTANT-recorded-{code}] 确认(DCP 模式)。
10
+ * 提醒要求模型回应 [COGNITIVE-TRAJECTORY-ASSISTANT-recorded-{code}] 确认(DCP 模式)。
11
11
  */
12
12
  import type { Context } from 'cordis';
13
13
  export declare function scoreTool(toolName: string): number;
@@ -36,7 +36,7 @@ export declare function reminderText(code: string): string;
36
36
  * 简短留自由度(不提"加载 eap 工具",模型自知;只说修订 skill + 新建 skill 落 SESSION)。
37
37
  *
38
38
  * escalated=true(v1.23.3):连续多轮超阈值仍未 rebuild → 升级强制语气
39
- * (STOP and rebuild now,持续注入直到调用 container_trajectory rebuild)。
39
+ * (STOP and rebuild now,持续注入直到调用 cognitive_trajectory rebuild)。
40
40
  *
41
41
  * 需求①(S142 用户拍板,v1.28.0):百分比比例 → K 数值——**判定**改为绝对
42
42
  * `projectedTokens ≥ thresholdK*1000`(触发语义,未变)。
@@ -49,7 +49,7 @@ export declare function reminderText(code: string): string;
49
49
  *
50
50
  * v1.31.1 交接协议(S142 用户需求"要求 LLM 将当前手头事项写在 SESSION.md 尾部,并要求
51
51
  * rebuild 后去读并处理"):**写侧** = 这里;**读侧** = rebuild 锚点(rebuild.ts)。
52
- * 两侧共用 trajectory-assistant 的常量(单一真相源)。
52
+ * 两侧共用 cognitive-trajectory-assistant 的常量(单一真相源)。
53
53
  *
54
54
  * 🔴 **v1.49.0(owner 2026-09-26 裁决:"砍掉 in-flight,这正是目的")**:写侧**不再**指向
55
55
  * SESSION.md 末尾的段,改指**独立便签文件** `REBUILD-TODO_FILENAME`(轨迹目录下)——
@@ -85,7 +85,7 @@ export declare function __resetLogbookCompactionForTest(): void;
85
85
  * 解析**活跃** SESSION.md 绝对路径(缓存 60s)。
86
86
  *
87
87
  * 候选链(刻意比 rebuild 的完整链短——这里每个工具调用都要跑,贵候选不划算):
88
- * ① `getActiveSessionInfo(scope).mdPath`(`container_trajectory use` / skiff 绑定 / 重启恢复都会写)
88
+ * ① `getActiveSessionInfo(scope).mdPath`(`cognitive_trajectory use` / skiff 绑定 / 重启恢复都会写)
89
89
  * ② `readLastBound(session).mdPath`(`.bindings.json` 权威绑定——重启后内存空时兜底)
90
90
  * 两者都拿不到 → null(**不猜**:宁可不提醒,也不去猜别的轨迹——对齐 v1.30.13 D4 的教训)。
91
91
  */
@@ -107,7 +107,7 @@ export declare function readSessionMdMaxKB(root: string, configPaths?: string[],
107
107
  * ③ 允许整合不重要事项(被取代的决策 / 已解决问题 / 中间态)
108
108
  * ④ 自主裁量权充分允许(唯一硬要求 = 骨架 + 未决项/决策理由/下一步仍可重建)
109
109
  */
110
- export declare function trajectoryCompactionReminderText(input: {
110
+ export declare function cognitiveTrajectoryCompactionReminderText(input: {
111
111
  sizeKB: number;
112
112
  limitKB: number;
113
113
  mdPath: string;
@@ -136,7 +136,7 @@ export declare function __resetRebuildTodoForTest(): void;
136
136
  *
137
137
  * ## 与 SESSION.md 档的**语义差别**(刻意,不是疏漏)
138
138
  *
139
- * | | SESSION.md 超限(`trajectoryCompactionReminderText`) | 便签超限(本条) |
139
+ * | | SESSION.md 超限(`cognitiveTrajectoryCompactionReminderText`) | 便签超限(本条) |
140
140
  * |---|---|---|
141
141
  * | 动作 | **重写**(compaction) | **清理/丢弃**(prune) |
142
142
  * | 结构义务 | 保 EAP 骨架 + 4 条重写原则 + frontmatter 护栏 | **无** |
@@ -128,4 +128,4 @@ export declare function codeModeAdaptationLine(ctx: Context, scope?: unknown): s
128
128
  */
129
129
  export declare function registerEntrySkillSectionGlobal(ctx: Context): void;
130
130
  export declare function registerEntrySkillSection(agent: Agent, root: string): boolean;
131
- export declare function registerTrajectorySkillSection(agent: Agent, root: string): boolean;
131
+ export declare function registerCognitiveTrajectorySkillSection(agent: Agent, root: string): boolean;
@@ -1,4 +1,4 @@
1
- import { f as hostSettings } from "./ccc-roots-GIJ3A_tw.js";
1
+ import { f as hostSettings } from "./ccc-roots-RMzGU-CJ.js";
2
2
  import { dirname, join } from "node:path";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { fileURLToPath } from "node:url";
@@ -31,7 +31,7 @@ export declare function skiffSessionSnapshot(): ReadonlyMap<string, {
31
31
  * 系统提示词中的**工作台纪律块**(v1.30.4 升级:从单行路径 → 完整 ACC 层约束)。
32
32
  * 用户点破(S142):只给路径 LLM 不会主动用——需注入「已绑定 + 使用纪律 + 动作指引」。
33
33
  * SESSION = 工作台——skiff 与主舱同一套机制(零特调,用户拍板):
34
- * 自动绑定已生效(无需 container_trajectory use)、SESSION.md 是持久记忆载体、rebuild 自动从本 SESSION 续接。
34
+ * 自动绑定已生效(无需 cognitive_trajectory use)、SESSION.md 是持久记忆载体、rebuild 自动从本 SESSION 续接。
35
35
  * 注入 agent 系统提示词(用户对话面不可见)。
36
36
  *
37
37
  * v1.30.13(S142 诊断 D5):写入纪律**不点名具体工具**。旧文案写死 "with write/edit",
@@ -41,14 +41,14 @@ export declare function skiffSessionSnapshot(): ReadonlyMap<string, {
41
41
  * 具体通道由 CCC 的角色配置与角色提示词决定(ACC/CCC 归属二分;也不把某个 CCC 的
42
42
  * MSM 名硬编码进 ACC 源码)。
43
43
  */
44
- export declare function workspaceTrajectoryLine(mdPath: string): string;
44
+ export declare function workspaceCognitiveTrajectoryLine(mdPath: string): string;
45
45
  /**
46
46
  * 把**工作台纪律块**挂到 agent 的系统提示词段(单一真相源,v1.30.13 用户需求)。
47
47
  *
48
48
  * 用户原话(S142,2026-09-08):"微信桥的注入机制,每个用户消息都会注入,skiff 本身也会注入,
49
49
  * 这样就重复,能否微信桥情况下,注入内容直接取 skiff 的,这样不用配两遍"。
50
50
  *
51
- * 现状(改前):`createSkiffAgent` 把 `workspaceTrajectoryLine(mdPath)` 塞进基础段
51
+ * 现状(改前):`createSkiffAgent` 把 `workspaceCognitiveTrajectoryLine(mdPath)` 塞进基础段
52
52
  * (创建时一次快照),微信桥又**每条消息**把同一文本拼进 question(v1.30.4 为覆盖
53
53
  * "live/existing 快路径不重挂提示词"而加)→ 新建 agent 首轮起即重复,且每轮重复付 token。
54
54
  *
@@ -70,7 +70,7 @@ export declare function ensureWorkspacePromptSection(agent: Agent, scope: string
70
70
  * (调试页等**无固定会话 id**的临时 agent)→ null。理由(R↓):这些 agent 每次
71
71
  * 调用都是新 id、无身份延续,为其建 SESSION = 每次问答留一个永久空目录(无界熵增);
72
72
  * 用户模型「skiff 本质是临时会话机制」——工作台属于**持久身份**,不属于单次调用。
73
- * ① 角色未启用 session 能力(trajectory.session !== true)→ null(现状零变化)
73
+ * ① 角色未启用 session 能力(cognitiveTrajectory.session !== true)→ null(现状零变化)
74
74
  * ② 已有**本机制自动创建**的 bound(note 前缀 auto-created)→ 恢复(重启/续接记得)
75
75
  * ②b 内存活跃记录(同 scope)→ 恢复 + **自愈补写绑定**(防御纵深:绑定写失败/事件形态未落盘时
76
76
  * 仍复用同一 SESSION,而不是每条消息新建一个——v1.30.5 及更早"每条消息一个 SESSION"的放大效应)
@@ -102,7 +102,7 @@ interface SkiffAgentRef {
102
102
  * 不传则随机生成 skiff-<role>-<uuid>,调试页默认路径)
103
103
  */
104
104
  export declare function createSkiffAgent(ctx: Context, root: string, roleName: string, role: SkiffRoleConfig, defaultModel?: string, sessionId?: string): Promise<SkiffAgentRef>;
105
- export interface SkiffTrajectoryEntry {
105
+ export interface SkiffCognitiveTrajectoryEntry {
106
106
  role: 'user' | 'assistant' | 'tool';
107
107
  text: string;
108
108
  /** assistant 的工具调用名(有则填) */
@@ -111,25 +111,25 @@ export interface SkiffTrajectoryEntry {
111
111
  interface SkiffAskResult {
112
112
  answer: string;
113
113
  sessionId: string;
114
- trajectory: SkiffTrajectoryEntry[];
114
+ cognitiveTrajectory: SkiffCognitiveTrajectoryEntry[];
115
115
  }
116
116
  /**
117
117
  * 提问一轮:followup → 等 idle → 读答案 + 轨迹。
118
118
  * @param eventsStart 轨迹起点:显式传 0 = 全量轨迹(会话追问时页面重绘完整时间线,
119
119
  * v1.25.10 用户拍板);不传(undefined)= 本轮增量(followup 前 events 之后)
120
- * @param options.includeTrajectory 是否计算轨迹(v1.26.10 起供**对外面**传 false 跳过计算——
120
+ * @param options.includeCognitiveTrajectory 是否计算轨迹(v1.26.10 起供**对外面**传 false 跳过计算——
121
121
  * 原消费方 = 3100 公开问答页 / ACP JSON-RPC,**该面已于 2026-10-15 退役** ⇒ 现无生产调用方传 false;
122
122
  * 3099 调试页默认 true 保留)
123
123
  */
124
124
  export declare function askSkiff(ctx: Context, agent: Agent, question: string, eventsStart?: number, options?: {
125
- includeTrajectory?: boolean;
125
+ includeCognitiveTrajectory?: boolean;
126
126
  }): Promise<SkiffAskResult>;
127
127
  /**
128
128
  * Skiff 会话的轨迹纪律参与判定:非 skiff 会话恒 true(正常参与);
129
- * skiff 会话按角色 trajectory 子集(session/keeper/rebuild)决定;
129
+ * skiff 会话按角色 cognitiveTrajectory 子集(session/keeper/rebuild)决定;
130
130
  * 注册表缺失(进程重启遗留等)→ 保守旁路(false,完全独立)。
131
131
  */
132
- export declare function skiffTrajectoryEnabled(root: string, sessionId: string | undefined, key: 'session' | 'keeper' | 'rebuild'): boolean;
132
+ export declare function skiffCognitiveTrajectoryEnabled(root: string, sessionId: string | undefined, key: 'session' | 'keeper' | 'rebuild'): boolean;
133
133
  interface SkiffMsmGate {
134
134
  /** 拒绝原因(有则拒绝执行) */
135
135
  reject?: string;
@@ -5,7 +5,7 @@
5
5
  * 页 Skiff 区块开关,不随插件加载自动启动)。
6
6
  *
7
7
  * - GET / → 问答 HTML 页(**CCC 选择器** + 角色下拉 + 输入框 + 答案区 + 轨迹区 + WebUI 链接)
8
- * - POST /ask → {ccc?, role, question} → 走会话核心(skiff-core)→ {answer, sessionId, trajectory}
8
+ * - POST /ask → {ccc?, role, question} → 走会话核心(skiff-core)→ {answer, sessionId, cognitiveTrajectory}
9
9
  *
10
10
  * **多 CCC 手工切换(v1.25.4,S142 用户)**:dsh 管理多个 CCC 时,调试页顶部 CCC
11
11
  * 下拉列出全部候选(live 会话 cwd 上溯 .serenity 去重 + 默认绑定 root 兜底),
@@ -1,13 +1,13 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { _ as resolveInside, g as readUtf8, s as loadSerenityConfig, t as DEFAULT_SERENITY_CONFIG_PATHS } from "./ccc-B0ZGL9lx.js";
2
+ import { _ as resolveInside, g as readUtf8, s as loadSerenityConfig, t as DEFAULT_SERENITY_CONFIG_PATHS } from "./ccc-C33QWoWZ.js";
3
3
  import { existsSync, statSync } from "node:fs";
4
4
  //#region src/skiff-role.ts
5
5
  /**
6
6
  * skiff-role.ts — Skiff(F4,v1.25.0 实验性)角色层纯逻辑(零 DSH 依赖,可独立单测)
7
7
  *
8
- * 概念(S142 用户拍板):Skiff = 完整宁静号 trajectory(在宁静号内全知全能)的
8
+ * 概念(S142 用户拍板):Skiff = 完整宁静号 cognitive trajectory(在宁静号内全知全能)的
9
9
  * **任意子集**——CCC 通过角色配置定义:能力面(tools 非 MSM 工具白名单 + msms
10
- * MSM 白名单,双白名单独立,白名单外全隐藏)+ 轨迹纪律面(trajectory 子集)+
10
+ * MSM 白名单,双白名单独立,白名单外全隐藏)+ 轨迹纪律面(cognitive trajectory 子集)+
11
11
  * 系统提示词(CCC 完整定义,dsp 只给基础部分)。
12
12
  *
13
13
  * 实验性质:未配置任何角色 → Skiff 完全零影响(无监听、无 agent 创建、guard 无规则)。
@@ -15,6 +15,7 @@ import { existsSync, statSync } from "node:fs";
15
15
  var skiff_role_exports = /* @__PURE__ */ __exportAll({
16
16
  SKIFF_SESSION_PREFIX: () => SKIFF_SESSION_PREFIX,
17
17
  buildSkiffBasePrompt: () => buildSkiffBasePrompt,
18
+ cognitiveTrajectorySubset: () => cognitiveTrajectorySubset,
18
19
  createRolePromptReader: () => createRolePromptReader,
19
20
  isSkiffSessionId: () => isSkiffSessionId,
20
21
  readSkiffRoles: () => readSkiffRoles,
@@ -22,8 +23,7 @@ var skiff_role_exports = /* @__PURE__ */ __exportAll({
22
23
  resolveSkiffKind: () => resolveSkiffKind,
23
24
  roleMsmWhitelist: () => roleMsmWhitelist,
24
25
  roleToolWhitelist: () => roleToolWhitelist,
25
- systemPromptSource: () => systemPromptSource,
26
- trajectorySubset: () => trajectorySubset
26
+ systemPromptSource: () => systemPromptSource
27
27
  });
28
28
  /** Skiff agent 会话 id 前缀(agents.create 生成;seams 旁路/白名单判定用) */
29
29
  const SKIFF_SESSION_PREFIX = "skiff-";
@@ -48,10 +48,10 @@ function readSkiffRoles(root, paths = DEFAULT_SERENITY_CONFIG_PATHS) {
48
48
  kind: role.kind === "temporary" || role.kind === "persistent" ? role.kind : void 0,
49
49
  msms: Array.isArray(role.msms) ? role.msms.filter((m) => typeof m === "string") : void 0,
50
50
  tools: Array.isArray(role.tools) ? role.tools.filter((t) => typeof t === "string") : void 0,
51
- trajectory: role.trajectory && typeof role.trajectory === "object" ? {
52
- session: role.trajectory.session === true,
53
- keeper: role.trajectory.keeper === true,
54
- rebuild: role.trajectory.rebuild === true
51
+ cognitiveTrajectory: role.cognitiveTrajectory && typeof role.cognitiveTrajectory === "object" ? {
52
+ session: role.cognitiveTrajectory.session === true,
53
+ keeper: role.cognitiveTrajectory.keeper === true,
54
+ rebuild: role.cognitiveTrajectory.rebuild === true
55
55
  } : void 0,
56
56
  systemPrompt: typeof role.systemPrompt === "string" ? role.systemPrompt : void 0,
57
57
  systemPromptFile: typeof role.systemPromptFile === "string" ? role.systemPromptFile : void 0
@@ -62,11 +62,11 @@ function readSkiffRoles(root, paths = DEFAULT_SERENITY_CONFIG_PATHS) {
62
62
  }
63
63
  return out;
64
64
  }
65
- function trajectorySubset(role) {
65
+ function cognitiveTrajectorySubset(role) {
66
66
  return {
67
- session: role?.trajectory?.session === true,
68
- keeper: role?.trajectory?.keeper === true,
69
- rebuild: role?.trajectory?.rebuild === true
67
+ session: role?.cognitiveTrajectory?.session === true,
68
+ keeper: role?.cognitiveTrajectory?.keeper === true,
69
+ rebuild: role?.cognitiveTrajectory?.rebuild === true
70
70
  };
71
71
  }
72
72
  /** 角色可用工具面(白名单并集):tools + msm(msms 非空时作为 MSM 通道自动可用) */
@@ -187,4 +187,4 @@ function buildSkiffBasePrompt(roleName, role) {
187
187
  return lines.join("\n");
188
188
  }
189
189
  //#endregion
190
- export { readSkiffRoles as a, roleMsmWhitelist as c, systemPromptSource as d, trajectorySubset as f, isSkiffSessionId as i, roleToolWhitelist as l, buildSkiffBasePrompt as n, resolveRoleSystemPrompt as o, createRolePromptReader as r, resolveSkiffKind as s, SKIFF_SESSION_PREFIX as t, skiff_role_exports as u };
190
+ export { isSkiffSessionId as a, resolveSkiffKind as c, skiff_role_exports as d, systemPromptSource as f, createRolePromptReader as i, roleMsmWhitelist as l, buildSkiffBasePrompt as n, readSkiffRoles as o, cognitiveTrajectorySubset as r, resolveRoleSystemPrompt as s, SKIFF_SESSION_PREFIX as t, roleToolWhitelist as u };