@shgroup/dsh-serenity-hooks 1.73.0 → 1.74.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 +12 -11
- package/dsh.plugin.json +2 -2
- package/lib/accounts-BHQbakUh.js +33 -0
- package/lib/{ccc-CZUOq3NY.js → ccc-CyYJL4F2.js} +9 -9
- package/lib/{ccc-roots-BhoA7G-0.js → ccc-roots-B2t_aM8L.js} +4 -4
- package/lib/client.js +116 -1
- package/lib/cro/core.d.ts +1 -1
- package/lib/guard/seam.d.ts +4 -4
- package/lib/host/effect.d.ts +1 -1
- package/lib/im/bridge.d.ts +3 -3
- package/lib/im/endpoint.d.ts +2 -2
- package/lib/im/guard.d.ts +1 -1
- package/lib/im/hook.d.ts +1 -1
- package/lib/im/inbound-event.d.ts +6 -6
- package/lib/im/route.d.ts +25 -3
- package/lib/index.d.ts +5 -5
- package/lib/index.js +360 -265
- package/lib/kernel/ccc-roots.d.ts +4 -4
- package/lib/kernel/ccc.d.ts +19 -19
- package/lib/kernel/ports.d.ts +1 -1
- package/lib/{message-source-ChyVfev9.js → message-source-DCpoRHP3.js} +2 -2
- package/lib/patches/opencode-provider.d.ts +1 -1
- package/lib/{profile-BIQ2widI.js → profile-BVt84mbi.js} +59 -59
- package/lib/{route-ItCgAsnz.js → route-COOFLTpU.js} +44 -6
- package/lib/seams/guards.d.ts +14 -14
- package/lib/seams/keeper.d.ts +1 -1
- package/lib/seams/lifecycle.d.ts +2 -2
- package/lib/{settings-UcwIPJhM.js → settings-D8hlqxua.js} +40 -26
- package/lib/surface/faces.d.ts +1 -1
- package/lib/surface/http.d.ts +1 -1
- package/lib/surface/settings.d.ts +7 -7
- package/lib/surface/text.d.ts +3 -3
- package/lib/tools/config-docs.d.ts +53 -0
- package/lib/tools/container-admin.d.ts +19 -12
- package/lib/tools/msm/service.d.ts +7 -0
- package/lib/tools/trajectory-constraint-admin.d.ts +30 -0
- package/lib/trajectory/carrier.d.ts +1 -1
- package/lib/trajectory/core.d.ts +1 -1
- package/lib/trajectory/policy/profile.d.ts +36 -36
- package/lib/trajectory/policy/rules.d.ts +33 -20
- package/lib/trajectory/policy/window.d.ts +13 -13
- package/lib/trajectory/prompt.d.ts +12 -12
- package/lib/trajectory/rebuild.d.ts +2 -2
- package/lib/trajectory/session.d.ts +49 -49
- package/package.json +2 -2
- package/lib/tools/skiff-admin.d.ts +0 -30
|
@@ -1,53 +1,53 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* trajectory/policy/profile.ts —
|
|
2
|
+
* trajectory/policy/profile.ts — **轨迹约束的唯一判据**:目录下有 `trajectory-constraint.json` 的认知轨迹(零 DSH 依赖,可独立单测)
|
|
3
3
|
*
|
|
4
4
|
* ## 🔴 owner 2026-10-19 重做令(逐字,本文件存在的全部理由)
|
|
5
5
|
*
|
|
6
|
-
* >
|
|
7
|
-
* >
|
|
8
|
-
* > (json 里配置上个版本就有的各种约束),**会话跑在认知轨迹上且发现 `
|
|
6
|
+
* > 「轨迹约束 复杂的约束和提示词体系都干掉,改为这样的实现:
|
|
7
|
+
* > **轨迹约束本身是认知轨迹的一个特殊情况,即目录下拥有 `trajectory-constraint.json` 的认知轨迹自动是一个 轨迹约束**
|
|
8
|
+
* > (json 里配置上个版本就有的各种约束),**会话跑在认知轨迹上且发现 `trajectory-constraint.json`,则运行时实现各类约束**」
|
|
9
9
|
*
|
|
10
10
|
* ## 旧模型 → 新模型(**一条判据取代四条**)
|
|
11
11
|
*
|
|
12
12
|
* | 项 | 旧 | 新 |
|
|
13
13
|
* |---|---|---|
|
|
14
|
-
* |
|
|
15
|
-
* | 怎么认出
|
|
16
|
-
* | 工作台从哪来 | `
|
|
14
|
+
* | 轨迹约束是什么 | `serenity.json` 的 `轨迹约束.roles.<name>` 一条配置 | **轨迹目录里有 `trajectory-constraint.json`** |
|
|
15
|
+
* | 怎么认出 轨迹约束会话 | dsh sessionId 前缀 `轨迹约束-` | **它绑定的轨迹有 `trajectory-constraint.json`** |
|
|
16
|
+
* | 工作台从哪来 | `ensureTrajectorySession` 另建一个 SESSION | **就是该轨迹自己的 SESSION.md** |
|
|
17
17
|
* | 身份 | 角色名 | **轨迹编码**(`trajectory/core.ts` 的 `parseTrajectoryCode`) |
|
|
18
18
|
*
|
|
19
19
|
* ⇒ 收益(owner:「理解难度大幅下降」的实际内容):四个各自会漂的机制收敛为**一条文件存在性判据**。
|
|
20
|
-
* 删掉 `
|
|
20
|
+
* 删掉 `trajectory-constraint.json` ⇒ 该轨迹**当场**退化为普通轨迹(工具面、提示词、keeper 全部恢复默认)。
|
|
21
21
|
*
|
|
22
22
|
* ## 归属(D23)
|
|
23
23
|
* **机制在 ACC**(文件叫什么、怎么读、怎么判、缺省值、如何施加约束);
|
|
24
|
-
* **内容在 CCC**(`
|
|
25
|
-
* ⇒ ACC 代码里**不出现任何具体角色名**,也不读 `serenity.json` 的
|
|
24
|
+
* **内容在 CCC**(`trajectory-constraint.json` 里填什么:模型、白名单、提示词路径)。
|
|
25
|
+
* ⇒ ACC 代码里**不出现任何具体角色名**,也不读 `serenity.json` 的 轨迹约束段(该段已退役)。
|
|
26
26
|
*
|
|
27
|
-
* ## S12(2026-10-19,轨迹中心重构):此前位于 `role
|
|
27
|
+
* ## S12(2026-10-19,轨迹中心重构):此前位于 `role/轨迹约束/` 下(该目录已随本重构消失)
|
|
28
28
|
*
|
|
29
29
|
* 落点 = `trajectory/policy/`。判据(判读表 §3.1):本文件判的是**某条轨迹的约束面**,
|
|
30
30
|
* 主语是轨迹 ⇒ 它一直就是轨迹切面,只是旧目录把它挂在"角色"这个**平行概念**下。
|
|
31
|
-
* ⚠️ **文件名 `profile` 与 `
|
|
31
|
+
* ⚠️ **文件名 `profile` 与 `trajectory-constraint.json` / `TrajectoryConstraint` 等符号名一律不动**:
|
|
32
32
|
* 那是有具体指称的东西(一个固定文件名 + 它的解析结果),不是组织单位。
|
|
33
33
|
*/
|
|
34
|
-
/** `
|
|
35
|
-
export declare const
|
|
34
|
+
/** `trajectory-constraint.json` 的固定文件名(**判据就是它存在**——不是目录名前缀,也不是配置里的一行) */
|
|
35
|
+
export declare const TRAJECTORY_CONSTRAINT_FILENAME = "trajectory-constraint.json";
|
|
36
36
|
/**
|
|
37
|
-
* 一个
|
|
37
|
+
* 一个 轨迹约束轨迹的**完整约束面**(= 旧 `轨迹约束.roles.<name>` 那套,整体搬进轨迹目录)。
|
|
38
38
|
*
|
|
39
39
|
* ⚠️ 与旧配置的**一处有意语义翻转**(R↓,别当成"顺手改默认值"):
|
|
40
|
-
* `cognitiveTrajectory.*` 在旧模型里**缺省全 false**("
|
|
41
|
-
* **它的工作台是外挂的**(`
|
|
40
|
+
* `cognitiveTrajectory.*` 在旧模型里**缺省全 false**("轨迹约束 完全独立"),理由是
|
|
41
|
+
* **它的工作台是外挂的**(`ensureTrajectorySession` 另建一个 SESSION,不由轨迹承载)。
|
|
42
42
|
* 新模型里**工作台就是它自己的 SESSION.md** ⇒ 全 false 会让它拿不到自己的身体
|
|
43
43
|
* ⇒ **缺省翻成 true**。这不是偏好问题,是两个模型的结构差。
|
|
44
44
|
*/
|
|
45
|
-
export interface
|
|
45
|
+
export interface TrajectoryConstraint {
|
|
46
46
|
/** 该约束面所属轨迹的目录名(`YYYY-MM-DD--<code>[--<desc>]`) */
|
|
47
47
|
dirName: string;
|
|
48
48
|
/** 轨迹编码(= 唯一标识;见 `parseTrajectoryCode`) */
|
|
49
49
|
code: string;
|
|
50
|
-
/** `
|
|
50
|
+
/** `trajectory-constraint.json` 的绝对路径 */
|
|
51
51
|
path: string;
|
|
52
52
|
/** 模型(`provider/model`);缺省回退 `cheap-worker.defaultModel` */
|
|
53
53
|
model?: string;
|
|
@@ -67,26 +67,26 @@ export interface SkiffProfile {
|
|
|
67
67
|
systemPromptFile?: string;
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
|
-
* 读一个目录下的 `
|
|
70
|
+
* 读一个目录下的 `trajectory-constraint.json`(**纯读,不施加约束**)。
|
|
71
71
|
*
|
|
72
72
|
* @param trajectoryDir 轨迹目录绝对路径
|
|
73
73
|
* @param root CCC 根(仅用于 `systemPromptFile` 的逃逸拒绝)
|
|
74
|
-
* @returns 归一后的约束面;**无该文件 → `null`(= 这不是
|
|
74
|
+
* @returns 归一后的约束面;**无该文件 → `null`(= 这不是 轨迹约束,常态,不是错误)**
|
|
75
75
|
*
|
|
76
76
|
* ⚠️ **形态容错**:数组元素非字符串 → 丢弃该项(不整份作废);`cognitiveTrajectory`
|
|
77
77
|
* 缺项 → 各自取 **true**(见 R↓);`model` 空白 → undefined(回退缺省)。
|
|
78
|
-
* 坏 JSON ⇒ 告警 + `null`(**按"不是
|
|
78
|
+
* 坏 JSON ⇒ 告警 + `null`(**按"不是 轨迹约束"处理**:宁可让它退回普通轨迹,也不要带着
|
|
79
79
|
* 半份读不懂的权限面运行)。
|
|
80
80
|
*/
|
|
81
|
-
export declare function
|
|
81
|
+
export declare function readTrajectoryConstraintAt(trajectoryDir: string, root: string): TrajectoryConstraint | null;
|
|
82
82
|
/**
|
|
83
|
-
* 按**轨迹编码**解析
|
|
83
|
+
* 按**轨迹编码**解析 轨迹约束面(`list`/`admin`/调试页/路由解析用)。
|
|
84
84
|
*
|
|
85
|
-
* @returns 约束面;轨迹不存在 / 无 `
|
|
85
|
+
* @returns 约束面;轨迹不存在 / 无 `trajectory-constraint.json` → `null`
|
|
86
86
|
*/
|
|
87
|
-
export declare function
|
|
88
|
-
/** 扫全部活跃轨迹,返回全部
|
|
89
|
-
export declare function
|
|
87
|
+
export declare function readTrajectoryConstraintByCode(root: string, code: string): TrajectoryConstraint | null;
|
|
88
|
+
/** 扫全部活跃轨迹,返回全部 轨迹约束。**顺序按目录名**(确定性,便于对读)。 */
|
|
89
|
+
export declare function listTrajectoryConstraints(root: string): TrajectoryConstraint[];
|
|
90
90
|
/**
|
|
91
91
|
* 编码 → 轨迹目录名(活跃轨迹内)。找不到 → `null`。
|
|
92
92
|
*
|
|
@@ -96,27 +96,27 @@ export declare function listSkiffProfiles(root: string): SkiffProfile[];
|
|
|
96
96
|
*/
|
|
97
97
|
export declare function findDirNameByCode(root: string, code: string): string | null;
|
|
98
98
|
/**
|
|
99
|
-
* **会话级**判据(J2):这个 dsh 会话是不是
|
|
99
|
+
* **会话级**判据(J2):这个 dsh 会话是不是 轨迹约束会话 —— 唯一入口。
|
|
100
100
|
*
|
|
101
|
-
* 判据 = **它绑定的轨迹有 `
|
|
101
|
+
* 判据 = **它绑定的轨迹有 `trajectory-constraint.json`**(不是 sessionId 前缀,也不是配置里有没有角色)。
|
|
102
102
|
*
|
|
103
103
|
* ## 为什么"绑定的轨迹"从两个来源取(R↓,一个失败模式)
|
|
104
104
|
* ① **持久绑定**(`readLastBound`,宿主存储域/`.bindings.json`)—— 权威,跨重启成立;
|
|
105
105
|
* ② **内存注册表**(`trajectory/policy/window`)—— 覆盖绑定的**窗口期**(轨迹刚定、bound 还没落盘)。
|
|
106
|
-
* ⇒ 只取 ① 会在建会话的第一轮判成"不是
|
|
107
|
-
* 只取 ② 会在进程重启后全判成"不是"
|
|
106
|
+
* ⇒ 只取 ① 会在建会话的第一轮判成"不是 轨迹约束"(工具面不收窄,模型看见不该有的工具);
|
|
107
|
+
* 只取 ② 会在进程重启后全判成"不是"(轨迹约束 失去约束,**权限面静默放开**)。
|
|
108
108
|
* ⇒ **两来源并取**,都不中才 `null`。
|
|
109
109
|
*
|
|
110
110
|
* @param root CCC 根
|
|
111
111
|
* @param sessionId dsh 会话 id
|
|
112
112
|
* @param boundDirName 调用方已解析的绑定目录名(可选;给了就省一次读绑定)
|
|
113
|
-
* @returns 约束面;不是
|
|
113
|
+
* @returns 约束面;不是 轨迹约束会话 → `null`
|
|
114
114
|
*/
|
|
115
|
-
export declare function
|
|
115
|
+
export declare function trajectoryConstraintForSession(root: string, sessionId: string | undefined, boundDirName?: string | null): TrajectoryConstraint | null;
|
|
116
116
|
/**
|
|
117
|
-
* 该 dsh 会话**是不是**
|
|
117
|
+
* 该 dsh 会话**是不是** 轨迹约束会话(布尔形态的 `trajectoryConstraintForSession`)。
|
|
118
118
|
*
|
|
119
119
|
* 存在的理由:调用点很多只要一个"是/不是"(seams 的旁路判定),
|
|
120
120
|
* 让它们各自写 `!== null` 会把判据散开;**判据只能有一个入口**。
|
|
121
121
|
*/
|
|
122
|
-
export declare function
|
|
122
|
+
export declare function isTrajectoryConstrained(root: string, sessionId: string | undefined): boolean;
|
|
@@ -5,35 +5,35 @@
|
|
|
5
5
|
*
|
|
6
6
|
* | 模块 | 管什么 |
|
|
7
7
|
* |---|---|
|
|
8
|
-
* | `./profile.ts` | **判据 + 读盘**("这是不是
|
|
8
|
+
* | `./profile.ts` | **判据 + 读盘**("这是不是 轨迹约束"、"约束面是什么") |
|
|
9
9
|
* | `./rules.ts`(本文件) | **从约束面派生出的纯函数**(白名单集合、提示词读取器、基础提示词文本) |
|
|
10
10
|
* | `../session-create.ts` | 会话创建/复用、提问、守门查询 |
|
|
11
11
|
*
|
|
12
|
-
* ⇒ 本文件**不再读 `serenity.json
|
|
13
|
-
* 它只接收一个已解析好的 `
|
|
12
|
+
* ⇒ 本文件**不再读 `serenity.json`**:`轨迹约束.roles` 整段已退役(owner 2026-10-19 重做)。
|
|
13
|
+
* 它只接收一个已解析好的 `TrajectoryConstraint`,因此**不涉及任何 IO**(除提示词文件,那是刻意懒读的)。
|
|
14
14
|
*
|
|
15
15
|
* ## S12(2026-10-19,轨迹中心重构)
|
|
16
16
|
*
|
|
17
|
-
* 原名 `role
|
|
17
|
+
* 原名 `role/轨迹约束/config.ts`。改名理由(框架 §6.3「角色不是一个概念,是一段历史」):
|
|
18
18
|
* 它派生的是**某条轨迹的约束面**,与"配置读取"无关(本文件零配置读取,见上一段)
|
|
19
19
|
* ⇒ `config` 这个名字描述的是**它曾经的样子**,`rules` 描述它**现在做的事**。
|
|
20
20
|
*/
|
|
21
|
-
import type {
|
|
21
|
+
import type { TrajectoryConstraint } from './profile.js';
|
|
22
22
|
/** 白名单推导 ────────────────────────────────────────────────────────────── */
|
|
23
23
|
/** 提示词来源提示串(`apply` 回执与面板共用;避免两处措辞漂) */
|
|
24
|
-
export declare const
|
|
24
|
+
export declare const TRAJECTORY_CONSTRAINT_HINT = "systemPromptFile hot-reloads by mtime; the rest of trajectory-constraint.json is re-read every turn";
|
|
25
25
|
/**
|
|
26
|
-
* 该
|
|
26
|
+
* 该 轨迹约束会话**可见**的工具面(tools ∪ `msm`)。
|
|
27
27
|
*
|
|
28
|
-
* 🔴 `msm` 为什么自动加入:`msms` 非空意味着这个
|
|
28
|
+
* 🔴 `msm` 为什么自动加入:`msms` 非空意味着这个 轨迹约束 **有 MSM 通道**,
|
|
29
29
|
* 而 MSM 的唯一合法调用入口是 `msm` 工具(单入口纪律)——不给它 `msm` 就等于
|
|
30
30
|
* 声明了一堆调不动的能力。⚠️ 这是**并集**,不是覆盖:`tools` 里显式写的照旧生效。
|
|
31
31
|
*/
|
|
32
|
-
export declare function profileToolWhitelist(profile:
|
|
33
|
-
/** 该
|
|
34
|
-
export declare function profileMsmWhitelist(profile:
|
|
35
|
-
/** 轨迹纪律参与项(`profile` 缺省已在 `
|
|
36
|
-
export declare function
|
|
32
|
+
export declare function profileToolWhitelist(profile: TrajectoryConstraint | null | undefined): Set<string>;
|
|
33
|
+
/** 该 轨迹约束会话可 exec 的 MSM 白名单(`msm` 工具内部再过滤;独立于工具白名单) */
|
|
34
|
+
export declare function profileMsmWhitelist(profile: TrajectoryConstraint | null | undefined): Set<string>;
|
|
35
|
+
/** 轨迹纪律参与项(`profile` 缺省已在 `readTrajectoryConstraintAt` 归一为全 true) */
|
|
36
|
+
export declare function constraintCognitiveTrajectory(profile: TrajectoryConstraint | null | undefined): {
|
|
37
37
|
session: boolean;
|
|
38
38
|
keeper: boolean;
|
|
39
39
|
rebuild: boolean;
|
|
@@ -46,9 +46,22 @@ export declare function profileCognitiveTrajectory(profile: SkiffProfile | null
|
|
|
46
46
|
*
|
|
47
47
|
* ⚠️ 热路径**不用**它(那会用每次工具调用去读盘)——热路径用 `createProfilePromptReader`。
|
|
48
48
|
*/
|
|
49
|
-
export declare function
|
|
50
|
-
/**
|
|
51
|
-
|
|
49
|
+
export declare function resolveConstraintSystemPrompt(root: string, profile: TrajectoryConstraint | null | undefined): string;
|
|
50
|
+
/**
|
|
51
|
+
* 提示词来源(`list`/`validate` 展示用)。
|
|
52
|
+
*
|
|
53
|
+
* 🔴 **2026-10-19 修(T4 的漏网面)**:v1.72.0 起提示词有两代来源——**新形态**
|
|
54
|
+
* 是轨迹目录里的 `PROMPT.md`(`trajectory/prompt.ts`,**优先**),旧形态才是
|
|
55
|
+
* `systemPromptFile` / `systemPrompt`。本函数原先只认旧形态 ⇒ 两条只写了 `PROMPT.md`
|
|
56
|
+
* 的轨迹在 `container_admin config list` 里恒显示 `promptSource: 'none'`。
|
|
57
|
+
*
|
|
58
|
+
* 那是**读数器过时**,不是配置缺失:`validate` 侧早已按两条来源判(见
|
|
59
|
+
* `trajectory-constraint-admin.ts` 的 `hasTrajectoryPromptOrLegacy`),而 `list` 侧漏了。
|
|
60
|
+
* ⇒ 返 **四种**值,把"有章程但来源是新形态"这一格单独说出来。
|
|
61
|
+
*
|
|
62
|
+
* @param hasPromptFile 该轨迹目录下**是否真有** `PROMPT.md`(调用方查,本函数不做 IO)
|
|
63
|
+
*/
|
|
64
|
+
export declare function constraintSystemPromptSource(profile: TrajectoryConstraint | null | undefined, hasPromptFile?: boolean): 'trajectory-file' | 'file' | 'inline' | 'none';
|
|
52
65
|
/**
|
|
53
66
|
* 提示词**读取器**(长期热更新;改文件即生效,无需重启)。
|
|
54
67
|
*
|
|
@@ -62,9 +75,9 @@ export declare function profileSystemPromptSource(profile: SkiffProfile | null |
|
|
|
62
75
|
* @param root CCC 根
|
|
63
76
|
* @param profile 约束面
|
|
64
77
|
*/
|
|
65
|
-
export declare function createProfilePromptReader(root: string, profile:
|
|
78
|
+
export declare function createProfilePromptReader(root: string, profile: TrajectoryConstraint | null | undefined): () => string;
|
|
66
79
|
/**
|
|
67
|
-
*
|
|
80
|
+
* 轨迹约束 基础提示词(dsp 只给这部分;CCC 的 `systemPrompt` 段由调用方拼接)。
|
|
68
81
|
*
|
|
69
82
|
* ## 🔴 为什么**不再枚举**清单(owner 2026-10-19 令)
|
|
70
83
|
*
|
|
@@ -80,6 +93,6 @@ export declare function createProfilePromptReader(root: string, profile: SkiffPr
|
|
|
80
93
|
*
|
|
81
94
|
* ⇒ 现在只声明**边界与发现路径**,不抄内容:清单在哪,怎么取,越界会怎样。
|
|
82
95
|
*
|
|
83
|
-
* @param code
|
|
96
|
+
* @param code 轨迹编码(轨迹约束的身份 —— 不是"角色名",那个概念已退役)
|
|
84
97
|
*/
|
|
85
|
-
export declare function
|
|
98
|
+
export declare function buildTrajectoryBasePrompt(code: string): string;
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* ## 它现在只做一件事:**把「会话」映到「轨迹」**
|
|
5
5
|
*
|
|
6
6
|
* 旧形态存的是 `{role, ccc}`(角色名)。owner 2026-10-19 重做后 **角色名不再存在**——
|
|
7
|
-
*
|
|
7
|
+
* 轨迹约束的身份是**轨迹编码**,约束面住在该轨迹的 `trajectory-constraint.json` 里(见 `./profile.ts`)。
|
|
8
8
|
* ⇒ 本表退化为一张**会话 → 轨迹目录名**的内存映射,供**同步**热路径(guards / system-prompt)查询;
|
|
9
9
|
* 权威来源仍是持久绑定(`trajectory/bound.ts` 的 `readLastBound`)。
|
|
10
10
|
*
|
|
11
|
-
* ## S12(2026-10-19,轨迹中心重构):原名 `role
|
|
11
|
+
* ## S12(2026-10-19,轨迹中心重构):原名 `role/轨迹约束/registry.ts`
|
|
12
12
|
*
|
|
13
13
|
* 改名理由:它**不是**一张"注册表"(注册表的语义是权威名单),它是**权威来源之外的一个窗口**——
|
|
14
14
|
* 覆盖「轨迹已定、绑定还没落盘」那一段(见下方「为什么还需要这张内存表」)。
|
|
@@ -16,32 +16,32 @@
|
|
|
16
16
|
*
|
|
17
17
|
* ## 为什么还需要这张内存表(R↓,一个窗口期)
|
|
18
18
|
*
|
|
19
|
-
* 持久绑定是**异步落盘**的(宿主存储域写入)。会话刚建立、`
|
|
20
|
-
* 还没落盘的那一段,`readLastBound` 返回 null ⇒ 若只认持久绑定,**第一轮会被判成"不是
|
|
19
|
+
* 持久绑定是**异步落盘**的(宿主存储域写入)。会话刚建立、`trajectory-constraint.json` 已生效、绑定的记录
|
|
20
|
+
* 还没落盘的那一段,`readLastBound` 返回 null ⇒ 若只认持久绑定,**第一轮会被判成"不是 轨迹约束"**
|
|
21
21
|
* ⇒ 工具面不收窄(模型看见并会去试它不该有的工具)。
|
|
22
|
-
* ⇒ 两个来源并取(见 `profile.ts` 的 `
|
|
22
|
+
* ⇒ 两个来源并取(见 `profile.ts` 的 `trajectoryConstraintForSession`),**都不中才判"不是"**。
|
|
23
23
|
*
|
|
24
24
|
* ## 生命周期
|
|
25
25
|
* 进程内存态:连接/会话关闭时解绑(`lifecycle.ts`),进程重启自然清空
|
|
26
26
|
* (此时持久绑定已落盘 ⇒ 由它接管,**不会因为内存空而失去约束**)。
|
|
27
27
|
*/
|
|
28
28
|
/** 注册表值:该 dsh 会话承载哪条轨迹(`trajectoryDirName` 为空串 = 已登记但还没定轨迹) */
|
|
29
|
-
interface
|
|
30
|
-
/** 轨迹目录名(`YYYY-MM-DD--<code>[--<desc>]
|
|
29
|
+
interface 轨迹约束SessionBinding {
|
|
30
|
+
/** 轨迹目录名(`YYYY-MM-DD--<code>[--<desc>]`)——**轨迹约束 身份的唯一载体** */
|
|
31
31
|
trajectoryDirName: string;
|
|
32
32
|
/** CCC 根(多 CCC 时防止串味:同 sessionId 复用必须同 (轨迹, CCC)) */
|
|
33
33
|
ccc: string;
|
|
34
34
|
}
|
|
35
35
|
/** 登记/更新一个会话 → 轨迹的映射 */
|
|
36
|
-
export declare function
|
|
36
|
+
export declare function registerTrajectorySession(sessionId: string, trajectoryDirName: string, ccc: string): void;
|
|
37
37
|
/** 解绑(会话销毁 / 轨迹失效 ⇒ 换身份) */
|
|
38
|
-
export declare function
|
|
38
|
+
export declare function unregisterTrajectorySession(sessionId: string): void;
|
|
39
39
|
/** 查会话承载的轨迹目录名(无 → null);`guards`/`system-prompt` 的同步热路径用 */
|
|
40
|
-
export declare function
|
|
40
|
+
export declare function trajectoryDirNameForSession(sessionId: string): string | null;
|
|
41
41
|
/** 查会话的完整绑定(轨迹 + CCC;无 → null)——追问延续时校验 (轨迹, CCC) 未串味 */
|
|
42
|
-
export declare function
|
|
42
|
+
export declare function trajectorySessionInfo(sessionId: string): 轨迹约束SessionBinding | null;
|
|
43
43
|
/** 测试/诊断:注册表快照 */
|
|
44
|
-
export declare function
|
|
44
|
+
export declare function trajectorySessionSnapshot(): ReadonlyMap<string, 轨迹约束SessionBinding>;
|
|
45
45
|
/** 测试:清空(进程级状态,用例间必须复位) */
|
|
46
|
-
export declare function
|
|
46
|
+
export declare function resetTrajectorySessions(): void;
|
|
47
47
|
export {};
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* **轨迹提示词** = 一条认知轨迹的**可编辑章程声明**,由 ACC 按固定顺序装配进系统提示词。
|
|
9
9
|
* 三个关键词各是一条判据:
|
|
10
10
|
* - **可编辑**:住在 CCC(盘上),改它**不发版**(D23 归属判据的直接推论)
|
|
11
|
-
* - **声明**:它声明**身份/章程/方法论**,**不声明能力**(能力面归 `
|
|
11
|
+
* - **声明**:它声明**身份/章程/方法论**,**不声明能力**(能力面归 `trajectory-constraint.json` 白名单与工具 schema)
|
|
12
12
|
* - **固定顺序**:装配顺序由 ACC 定死(见 `seams/system-prompt.ts` 的 ⑧ 位)
|
|
13
13
|
*
|
|
14
14
|
* ## 为什么取代「人格」
|
|
@@ -23,24 +23,24 @@
|
|
|
23
23
|
*
|
|
24
24
|
* - **跟着轨迹走**:`archive` 时整个目录搬走,章程不会掉队(旧形态 `.opencode/skiff/<name>.md`
|
|
25
25
|
* 与轨迹**分居两处** —— 多条轨迹共用一份文件正是那个后果)。
|
|
26
|
-
* - **每条轨迹都能有**:不只是
|
|
27
|
-
* - 与 `SESSION.md`(身体:延续/日志)、`
|
|
26
|
+
* - **每条轨迹都能有**:不只是 轨迹约束。普通轨迹同样需要"我是谁、按什么章程"。
|
|
27
|
+
* - 与 `SESSION.md`(身体:延续/日志)、`trajectory-constraint.json`(约束面:能力)三件并列,
|
|
28
28
|
* 各管一件事,不合并(合并会让"改能力"与"改身份"互相牵连)。
|
|
29
29
|
*
|
|
30
30
|
* ## 兼容(不静默坏)
|
|
31
31
|
*
|
|
32
|
-
* `PROMPT.md`
|
|
32
|
+
* `PROMPT.md` 不存在时**不报错**(普通轨迹常态)。轨迹约束的旧字段 `systemPromptFile`
|
|
33
33
|
* 在兼容期仍被读取——优先级见 {@link resolveTrajectoryPrompt}。
|
|
34
34
|
*/
|
|
35
|
-
import type {
|
|
35
|
+
import type { TrajectoryConstraint } from './policy/profile.js';
|
|
36
36
|
/** 轨迹提示词的固定文件名(**判据就是它存在**——不是目录名前缀,也不是配置里的一行) */
|
|
37
37
|
export declare const TRAJECTORY_PROMPT_FILENAME = "PROMPT.md";
|
|
38
38
|
/** 一次解析的结果(`source` 说明正文**从哪来**,便于诊断与「为什么我改的不生效」) */
|
|
39
39
|
export interface TrajectoryPromptResolution {
|
|
40
40
|
/** 提示词正文(已 trim);无来源 ⇒ 空串 */
|
|
41
41
|
text: string;
|
|
42
|
-
/** 来源:轨迹目录的 PROMPT.md /
|
|
43
|
-
source: 'trajectory-file' | '
|
|
42
|
+
/** 来源:轨迹目录的 PROMPT.md / 轨迹约束 旧字段 / 无 */
|
|
43
|
+
source: 'trajectory-file' | '轨迹约束-legacy' | 'none';
|
|
44
44
|
/** 实际读取的绝对路径(`none` ⇒ null) */
|
|
45
45
|
path: string | null;
|
|
46
46
|
}
|
|
@@ -49,9 +49,9 @@ export declare function trajectoryPromptPath(root: string, dirName: string): str
|
|
|
49
49
|
/**
|
|
50
50
|
* 该轨迹**有没有**轨迹提示词(单一判据)。
|
|
51
51
|
*
|
|
52
|
-
* 用途:兼容期的"让位"判定 —— 若已有 `PROMPT.md
|
|
53
|
-
* 必须**让位**,否则同一份章程会在两处各注入一遍(第 ⑧ 段 + `serenity
|
|
54
|
-
* 🔴 判据只有这一处:别在
|
|
52
|
+
* 用途:兼容期的"让位"判定 —— 若已有 `PROMPT.md`,轨迹约束 旧字段 `systemPromptFile`
|
|
53
|
+
* 必须**让位**,否则同一份章程会在两处各注入一遍(第 ⑧ 段 + `serenity-轨迹约束` 段)。
|
|
54
|
+
* 🔴 判据只有这一处:别在 轨迹约束那边自己拼路径再判(两处会漂)。
|
|
55
55
|
*/
|
|
56
56
|
export declare function hasTrajectoryPrompt(root: string, dirName: string): boolean;
|
|
57
57
|
/**
|
|
@@ -61,13 +61,13 @@ export declare function hasTrajectoryPrompt(root: string, dirName: string): bool
|
|
|
61
61
|
*
|
|
62
62
|
* 优先级(**确定性,只有这一条**):
|
|
63
63
|
* ① `<轨迹目录>/PROMPT.md` —— 新形态,**所有轨迹**都能有
|
|
64
|
-
* ②
|
|
64
|
+
* ② 轨迹约束的 `systemPromptFile` —— **兼容期**旧形态(存量 CCC 不必同批迁移)
|
|
65
65
|
* ③ 无 ⇒ 空串(**不是错误**:没有章程的轨迹是常态)
|
|
66
66
|
*
|
|
67
67
|
* ⚠️ 读失败(权限/坏文件)⇒ 空串而不是抛错:提示词读不到不该阻断会话创建;
|
|
68
68
|
* 但**会告警**(见 reader 版本),不静默。
|
|
69
69
|
*/
|
|
70
|
-
export declare function resolveTrajectoryPrompt(root: string, dirName: string, legacyProfile?:
|
|
70
|
+
export declare function resolveTrajectoryPrompt(root: string, dirName: string, legacyProfile?: TrajectoryConstraint | null): TrajectoryPromptResolution;
|
|
71
71
|
/**
|
|
72
72
|
* 轨迹提示词的**读取器**(长期热更新;改文件即生效,无需重启)。
|
|
73
73
|
*
|
|
@@ -75,9 +75,9 @@ interface RebuildResult {
|
|
|
75
75
|
* → ②b **权威绑定**(`AGENT_SESSIONS/.bindings.json`,本会话持久绑定)→ ③ surface 首条锚点
|
|
76
76
|
* (events 异常时兜底)。
|
|
77
77
|
*
|
|
78
|
-
* v1.30.13(S142 用户"微信桥 +
|
|
78
|
+
* v1.30.13(S142 用户"微信桥 + 轨迹约束会话锚定要准确",诊断 D4):**移除**原 ④「全局最新未完成
|
|
79
79
|
* 会话」(`findLatestActiveSessionMd`)。理由(R↓):④ 是**跨轨迹**猜测——候选①②③全空时,
|
|
80
|
-
* 它会把 rebuild 静默接到 AGENT_SESSIONS 里最新的另一个会话(临时
|
|
80
|
+
* 它会把 rebuild 静默接到 AGENT_SESSIONS 里最新的另一个会话(临时 轨迹约束会话 persistent=false、
|
|
81
81
|
* 重启后首条消息前、新会话首条消息都命中该形态),而"接错轨迹"比重建失败危险得多
|
|
82
82
|
* (错误轨迹被继续写入 + 正确轨迹静默丢失)。现在全部候选失败 → 返回 null → 调用方
|
|
83
83
|
* 报错引导用户显式 `cognitive_trajectory use`(响亮失败优于静默接错)。
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* trajectory/session.ts — 轨迹的**会话(载体)管理**(**2026-10-19
|
|
2
|
+
* trajectory/session.ts — 轨迹的**会话(载体)管理**(**2026-10-19 重做**:轨迹约束 = 带 `trajectory-constraint.json` 的认知轨迹)
|
|
3
3
|
*
|
|
4
4
|
* ## 与旧版的根本差别(R↓,这是那次重做的全部内容)
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* dsh sessionId 前缀
|
|
6
|
+
* 旧版:轨迹约束是**一个角色**(`serenity.json` 的 `轨迹约束.roles.<name>`),会话身份由
|
|
7
|
+
* dsh sessionId 前缀 `轨迹约束-` 判定,工作台由 `ensureTrajectorySession` **另建一个 SESSION**。
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* 新版:轨迹约束是**一条认知轨迹**(目录里有 `trajectory-constraint.json`)——
|
|
10
10
|
* · **身份 = 轨迹编码**(不是角色名,不是 sessionId 前缀);
|
|
11
|
-
* · **工作台 = 该轨迹自己的 SESSION.md**(不再另建,`
|
|
12
|
-
* · **判据 = 绑定的轨迹有没有 `
|
|
11
|
+
* · **工作台 = 该轨迹自己的 SESSION.md**(不再另建,`ensureTrajectorySession` 已删除);
|
|
12
|
+
* · **判据 = 绑定的轨迹有没有 `trajectory-constraint.json`**(唯一入口 `policy/profile.ts` 的 `trajectoryConstraintForSession`)。
|
|
13
13
|
*
|
|
14
14
|
* ⇒ 删掉的东西(它们只是旧模型的补丁,不是通用机制):
|
|
15
|
-
* `SKIFF_SESSION_PREFIX` 判定 / `
|
|
15
|
+
* `SKIFF_SESSION_PREFIX` 判定 / `ensureTrajectorySession` 自动建工作台 /
|
|
16
16
|
* `kind: temporary|persistent` / 换代计数器(`im/route.ts` 的 `.weixin-session-gen.json`)。
|
|
17
17
|
*
|
|
18
18
|
* ## 本文件仍负责
|
|
19
19
|
* agent 创建/复用(resume-or-create)/系统提示词段注册/提问与等本轮回答/守门查询。
|
|
20
20
|
*
|
|
21
|
-
* ## S13(2026-10-19,轨迹中心重构):此前位于 `role
|
|
21
|
+
* ## S13(2026-10-19,轨迹中心重构):此前位于 `role/轨迹约束/` 下(该目录已随本重构消失)
|
|
22
22
|
*
|
|
23
23
|
* 文件名从 `core` 改为 `session`:它管的是**轨迹的会话(载体)**——
|
|
24
24
|
* 与同目录 `live.ts`(活载体查询)/`rebuild.ts`(换船板)/`cleanup.ts`(清理)同族。
|
|
@@ -29,61 +29,61 @@
|
|
|
29
29
|
*/
|
|
30
30
|
import type { Context } from 'cordis';
|
|
31
31
|
import type { Agent, AgentHandle } from '@deepseek-ai/dsh-agent';
|
|
32
|
-
import { type
|
|
33
|
-
export type {
|
|
32
|
+
import { type TrajectoryConstraint } from './policy/profile.js';
|
|
33
|
+
export type { TrajectoryConstraint };
|
|
34
34
|
/** 查 sessionId 承载的轨迹目录名(无 → null) */
|
|
35
|
-
export declare function
|
|
35
|
+
export declare function trajectoryDirNameForSession(sessionId: string): string | null;
|
|
36
36
|
/** 查 sessionId 的会话绑定(轨迹 + ccc;无 → null)——追问校验 */
|
|
37
|
-
export declare function
|
|
37
|
+
export declare function trajectorySessionInfo(sessionId: string): {
|
|
38
38
|
trajectoryDirName: string;
|
|
39
39
|
ccc: string;
|
|
40
40
|
} | null;
|
|
41
41
|
/** 查 sessionId 的活体 agent(进程内会话延续用;未注册/已清理 → undefined) */
|
|
42
|
-
export declare function
|
|
43
|
-
/** 该会话当前绑定的
|
|
44
|
-
export declare function
|
|
45
|
-
export declare function
|
|
46
|
-
export declare function
|
|
42
|
+
export declare function getTrajectoryAgent(sessionId: string): Agent | undefined;
|
|
43
|
+
/** 该会话当前绑定的 轨迹约束面(不是 轨迹约束 → null)。**守门与提示词的唯一查询入口。** */
|
|
44
|
+
export declare function trajectoryConstraintFor(root: string, sessionId: string | undefined): TrajectoryConstraint | null;
|
|
45
|
+
export declare function registerTrajectorySession(sessionId: string, trajectoryDirName: string, ccc: string, agent: Agent): void;
|
|
46
|
+
export declare function unregisterTrajectorySession(sessionId: string): void;
|
|
47
47
|
/** 测试/调试:注册表快照 */
|
|
48
|
-
export declare function
|
|
48
|
+
export declare function trajectorySessionSnapshot(): ReadonlyMap<string, {
|
|
49
49
|
trajectoryDirName: string;
|
|
50
50
|
ccc: string;
|
|
51
51
|
}>;
|
|
52
52
|
/**
|
|
53
|
-
* 该
|
|
53
|
+
* 该 轨迹约束会话的**工作台路径** = 它自己轨迹的 SESSION.md。
|
|
54
54
|
*
|
|
55
|
-
* 🔴 与旧版的差别:旧版会在这里**自动新建**一个 SESSION(`
|
|
56
|
-
* 新版**没有新建这个动作** —— 轨迹就是工作台,`
|
|
55
|
+
* 🔴 与旧版的差别:旧版会在这里**自动新建**一个 SESSION(`ensureTrajectorySession`);
|
|
56
|
+
* 新版**没有新建这个动作** —— 轨迹就是工作台,`trajectory-constraint.json` 与 `SESSION.md` 同处一个目录。
|
|
57
57
|
* ⇒ 语义变成纯粹的"查询:我自己的身体在哪"。
|
|
58
58
|
*
|
|
59
|
-
* @returns SESSION.md 绝对路径;不是
|
|
59
|
+
* @returns SESSION.md 绝对路径;不是 轨迹约束 / 文件不在 → null
|
|
60
60
|
*/
|
|
61
|
-
export declare function
|
|
61
|
+
export declare function trajectoryWorkspaceMdPath(root: string, sessionId: string | undefined): string | null;
|
|
62
62
|
/**
|
|
63
63
|
* 系统提示词中的**工作台纪律块**(S142 用户:只给路径 LLM 不会主动用)。
|
|
64
64
|
*
|
|
65
|
-
* SESSION = 工作台 ——
|
|
65
|
+
* SESSION = 工作台 —— 轨迹约束与主舱同一套机制(**零特调**,用户拍板):
|
|
66
66
|
* SESSION.md 是持久记忆载体、rebuild 自动从本 SESSION 续接。
|
|
67
67
|
* 注入 agent 系统提示词(用户对话面不可见)。
|
|
68
68
|
*
|
|
69
69
|
* v1.30.13(S142 诊断 D5):写入纪律**不点名具体工具** —— 旧文案写死 "with write/edit",
|
|
70
|
-
* 而某个
|
|
70
|
+
* 而某个 轨迹约束的工具白名单里根本没有 write/edit ⇒ 指令指向它没有的工具
|
|
71
71
|
* (注入纪律与能力面矛盾,模型只能猜)。现文案改为「用本轨迹被授权的写入通道」。
|
|
72
72
|
*/
|
|
73
73
|
export declare function workspaceCognitiveTrajectoryLine(mdPath: string): string;
|
|
74
74
|
/**
|
|
75
75
|
* 把**工作台纪律块**挂到 agent 的系统提示词段(单一注入点)。
|
|
76
76
|
*
|
|
77
|
-
* 用户原话(S142,2026-09-08):"
|
|
78
|
-
* 这样就重复,能否微信桥情况下,注入内容直接取
|
|
77
|
+
* 用户原话(S142,2026-09-08):"微信桥的注入机制,每个用户消息都会注入,轨迹约束本身也会注入,
|
|
78
|
+
* 这样就重复,能否微信桥情况下,注入内容直接取 轨迹约束的,这样不用配两遍"。
|
|
79
79
|
*
|
|
80
|
-
* 现形态:工作台行**只**经本函数挂系统提示词段(name `serenity
|
|
80
|
+
* 现形态:工作台行**只**经本函数挂系统提示词段(name `serenity-轨迹约束-workspace`,
|
|
81
81
|
* 动态 `text()` 每轮按 scope 读当前活跃 mdPath)。
|
|
82
82
|
*
|
|
83
83
|
* @returns true = 段已在位;false = 该 agent 挂不上(调用方降级为 question 前缀注入)
|
|
84
84
|
*/
|
|
85
85
|
export declare function ensureWorkspacePromptSection(agent: Agent, scope: string, root: string): boolean;
|
|
86
|
-
interface
|
|
86
|
+
interface 轨迹约束AgentRef {
|
|
87
87
|
handle: AgentHandle;
|
|
88
88
|
agent: Agent;
|
|
89
89
|
sessionId: string;
|
|
@@ -91,17 +91,17 @@ interface SkiffAgentRef {
|
|
|
91
91
|
resumed: boolean;
|
|
92
92
|
}
|
|
93
93
|
/**
|
|
94
|
-
* 创建(或复用)一个
|
|
94
|
+
* 创建(或复用)一个 轨迹约束会话。
|
|
95
95
|
*
|
|
96
96
|
* **固定 sessionId 的 resume-or-create**(v1.27.2):指定 sessionId 且磁盘已有持久化 log →
|
|
97
97
|
* `ctx.agents.resume`(DSH 持久化语义:sessionId 即身份,历史 + turn 续号延续);
|
|
98
98
|
* 无 log(首次)→ `ctx.agents.create`。不指定 → 随机 id 恒 create(调试页路径)。
|
|
99
99
|
*
|
|
100
|
-
* @param profile 该
|
|
100
|
+
* @param profile 该 轨迹约束的约束面(来自 `trajectory-constraint.json`)
|
|
101
101
|
* @param sessionId 指定会话 id(可选;微信桥等外部面用固定 id 实现"轨迹 ↔ 会话"长期映射)
|
|
102
102
|
*/
|
|
103
|
-
export declare function
|
|
104
|
-
interface
|
|
103
|
+
export declare function createTrajectoryAgent(ctx: Context, root: string, profile: TrajectoryConstraint, defaultModel?: string, sessionId?: string): Promise<轨迹约束AgentRef>;
|
|
104
|
+
interface 轨迹约束AskResult {
|
|
105
105
|
answer: string;
|
|
106
106
|
sessionId: string;
|
|
107
107
|
}
|
|
@@ -130,35 +130,35 @@ export declare function waitForTurnAssistant(ctx: unknown, agent: Agent, beforeA
|
|
|
130
130
|
*
|
|
131
131
|
* @param options.timeoutMs 本轮等待上限(测试注入;生产用缺省)
|
|
132
132
|
*/
|
|
133
|
-
export declare function
|
|
133
|
+
export declare function askTrajectory(ctx: Context, agent: Agent, question: string, options?: {
|
|
134
134
|
timeoutMs?: number;
|
|
135
|
-
}): Promise
|
|
135
|
+
}): Promise<轨迹约束AskResult>;
|
|
136
136
|
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
137
|
+
* 轨迹约束会话的轨迹纪律参与判定:**不是 轨迹约束恒 true**(正常参与);
|
|
138
|
+
* 轨迹约束 按 `trajectory-constraint.json` 的 `cognitiveTrajectory` 子集决定。
|
|
139
139
|
*
|
|
140
|
-
* 注册表缺失(进程刚重启、绑定还没读)⇒ 由 `
|
|
141
|
-
* 两者都不中 ⇒ 判"不是
|
|
140
|
+
* 注册表缺失(进程刚重启、绑定还没读)⇒ 由 `trajectoryConstraintForSession` 回落持久绑定;
|
|
141
|
+
* 两者都不中 ⇒ 判"不是 轨迹约束" ⇒ 恒 true(正常参与)。**fail-open 是有意的**:
|
|
142
142
|
* 纪律参与项的失败不该让会话失去 keeper/rebuild(那是能力倒退,比多跑一次更糟)。
|
|
143
143
|
*/
|
|
144
|
-
export declare function
|
|
145
|
-
interface
|
|
144
|
+
export declare function trajectoryConstraintParticipates(root: string, sessionId: string | undefined, key: 'session' | 'keeper' | 'rebuild'): boolean;
|
|
145
|
+
interface 轨迹约束MsmGate {
|
|
146
146
|
/** 拒绝原因(有则拒绝执行) */
|
|
147
147
|
reject?: string;
|
|
148
148
|
/** list 显示白名单(msms);仅 action==='list' 时有值 */
|
|
149
149
|
whitelist?: Set<string>;
|
|
150
150
|
}
|
|
151
151
|
/**
|
|
152
|
-
* `msm` 工具的
|
|
152
|
+
* `msm` 工具的 轨迹约束门控:非 轨迹约束恒放行;轨迹约束会话——
|
|
153
153
|
* exec 非白名单 MSM 拒绝(**不列名单**)、register/deregister 必拒、
|
|
154
154
|
* list 白名单过滤、check/guide/ccc-config 只读放行。
|
|
155
155
|
*/
|
|
156
|
-
export declare function
|
|
157
|
-
/** 该
|
|
158
|
-
export declare function
|
|
159
|
-
/** 按编码解析
|
|
160
|
-
export declare function
|
|
156
|
+
export declare function trajectoryConstraintMsmGate(root: string, sessionId: string | undefined, action: string, name?: string): 轨迹约束MsmGate;
|
|
157
|
+
/** 该 轨迹约束会话的工具白名单(guards 的 schema 收窄用) */
|
|
158
|
+
export declare function 轨迹约束ToolWhitelist(root: string, sessionId: string | undefined): Set<string> | null;
|
|
159
|
+
/** 按编码解析 轨迹约束(路由/调试页/审计用) */
|
|
160
|
+
export declare function trajectoryConstraintByCode(root: string, code: string): TrajectoryConstraint | null;
|
|
161
161
|
/** 编码 → 轨迹目录名(路由用;只做精确匹配) */
|
|
162
|
-
export declare function
|
|
162
|
+
export declare function 轨迹约束DirNameByCode(root: string, code: string): string | null;
|
|
163
163
|
/** 一次性解析提示词全文(admin/validate 用;热路径不要用) */
|
|
164
|
-
export declare function
|
|
164
|
+
export declare function 轨迹约束SystemPrompt(root: string, profile: TrajectoryConstraint | null | undefined): string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shgroup/dsh-serenity-hooks",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "宁静号 ACC harness(Native Cordis 插件)——给 DeepSeek Harness 装一个「AI 工作区」:14 个工具(container_fs/cognitive_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/cheap-worker/localstore/container_admin;另三个 im-bridge/acc-diag/diagram 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫/对外输出守卫)+ 认知轨迹日志与原地重建 +
|
|
3
|
+
"version": "1.74.0",
|
|
4
|
+
"description": "宁静号 ACC harness(Native Cordis 插件)——给 DeepSeek Harness 装一个「AI 工作区」:14 个工具(container_fs/cognitive_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/cheap-worker/localstore/container_admin;另三个 im-bridge/acc-diag/diagram 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫/对外输出守卫)+ 认知轨迹日志与原地重建 + 网页登录入口/IM 桥/认知轨迹唤醒注册表。轨迹约束 = 目录下有 trajectory-constraint.json 的认知轨迹(约束面住在轨迹里);轨迹提示词 = 轨迹目录下的 PROMPT.md(一条轨迹「是谁、按什么章程工作」,所有轨迹通用,追加在容器层与质量层之后,不替换它们)。适配 DSH 0.1.7-rc.1 / 0.2.0-rc.1 / 0.2.1-rc.1(三档)。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|