@shgroup/dsh-serenity-hooks 1.72.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-Dkoa2oW3.js → ccc-CyYJL4F2.js} +9 -9
- package/lib/{ccc-roots-jZYR2GVE.js → ccc-roots-B2t_aM8L.js} +5 -5
- package/lib/client.js +165 -58
- package/lib/{wake/cro.d.ts → cro/core.d.ts} +3 -3
- package/lib/{wake/cro-guide.d.ts → cro/guide.d.ts} +3 -3
- package/lib/{wake/cro-log.d.ts → cro/log.d.ts} +2 -2
- package/lib/{wake/cro-turns.d.ts → cro/turns.d.ts} +2 -2
- package/lib/guard/seam.d.ts +4 -4
- package/lib/host/effect.d.ts +1 -1
- package/lib/{ilink-DEpmE3yi.js → ilink-BMk2w2KY.js} +1 -1
- package/lib/im/bridge.d.ts +36 -65
- package/lib/im/endpoint.d.ts +3 -3
- package/lib/im/feishu-account.d.ts +92 -0
- package/lib/im/guard.d.ts +1 -1
- package/lib/im/hook.d.ts +1 -1
- package/lib/im/inbound-event.d.ts +162 -0
- package/lib/im/route.d.ts +38 -3
- package/lib/index.d.ts +5 -27
- package/lib/index.js +1089 -1208
- package/lib/kernel/ccc-roots.d.ts +4 -4
- package/lib/kernel/ccc.d.ts +19 -19
- package/lib/kernel/ports.d.ts +3 -5
- package/lib/lib-TxscFKeo.js +119355 -0
- package/lib/{message-source-kVoNK0C5.js → message-source-DCpoRHP3.js} +2 -2
- package/lib/patches/opencode-provider.d.ts +1 -1
- package/lib/{profile-DyMJ_bfr.js → profile-BVt84mbi.js} +68 -65
- package/lib/rolldown-runtime-B4iAMlE-.js +35 -0
- package/lib/{route-f7JlinIt.js → route-COOFLTpU.js} +61 -8
- 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-lt1i3OZv.js → settings-D8hlqxua.js} +49 -84
- package/lib/skills/resource-index.d.ts +1 -1
- package/lib/surface/faces.d.ts +1 -1
- package/lib/surface/http.d.ts +1 -1
- package/lib/surface/settings.d.ts +7 -13
- package/lib/surface/text.d.ts +72 -0
- package/lib/surface/usage.d.ts +2 -2
- 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/{role/worker/idle.d.ts → trajectory/carrier.d.ts} +12 -2
- package/lib/trajectory/core.d.ts +1 -1
- package/lib/{role/worker → trajectory/delegate}/core.d.ts +7 -1
- package/lib/{role/worker → trajectory/delegate}/preset.d.ts +9 -2
- package/lib/trajectory/policy/profile.d.ts +122 -0
- package/lib/trajectory/policy/rules.d.ts +98 -0
- package/lib/{role/skiff/registry.d.ts → trajectory/policy/window.d.ts} +19 -13
- package/lib/trajectory/prompt.d.ts +12 -12
- package/lib/trajectory/rebuild.d.ts +2 -2
- package/lib/{role/skiff/core.d.ts → trajectory/session.d.ts} +58 -49
- package/package.json +3 -2
- package/lib/role/skiff/config.d.ts +0 -79
- package/lib/role/skiff/debug.d.ts +0 -88
- package/lib/role/skiff/profile.d.ts +0 -115
- package/lib/rolldown-runtime-8H4AJuhK.js +0 -14
- package/lib/tools/skiff-admin.d.ts +0 -30
|
@@ -1,80 +1,89 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* trajectory/session.ts — 轨迹的**会话(载体)管理**(**2026-10-19 重做**:轨迹约束 = 带 `trajectory-constraint.json` 的认知轨迹)
|
|
3
3
|
*
|
|
4
|
-
* ## 与旧版的根本差别(R
|
|
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
|
+
*
|
|
21
|
+
* ## S13(2026-10-19,轨迹中心重构):此前位于 `role/轨迹约束/` 下(该目录已随本重构消失)
|
|
22
|
+
*
|
|
23
|
+
* 文件名从 `core` 改为 `session`:它管的是**轨迹的会话(载体)**——
|
|
24
|
+
* 与同目录 `live.ts`(活载体查询)/`rebuild.ts`(换船板)/`cleanup.ts`(清理)同族。
|
|
25
|
+
* `core` 描述的是"它在角色目录里居中",而那层含义随目录一起消失了。
|
|
26
|
+
*
|
|
27
|
+
* 🔴 **不拆**(S13 判据):26 KB 未过 30 KB 阈值 ⇒ 按计划 R-d 的候选 ②,
|
|
28
|
+
* 本期是**零语义改动**,拆函数体属另一件事。
|
|
20
29
|
*/
|
|
21
30
|
import type { Context } from 'cordis';
|
|
22
31
|
import type { Agent, AgentHandle } from '@deepseek-ai/dsh-agent';
|
|
23
|
-
import { type
|
|
24
|
-
export type {
|
|
32
|
+
import { type TrajectoryConstraint } from './policy/profile.js';
|
|
33
|
+
export type { TrajectoryConstraint };
|
|
25
34
|
/** 查 sessionId 承载的轨迹目录名(无 → null) */
|
|
26
|
-
export declare function
|
|
35
|
+
export declare function trajectoryDirNameForSession(sessionId: string): string | null;
|
|
27
36
|
/** 查 sessionId 的会话绑定(轨迹 + ccc;无 → null)——追问校验 */
|
|
28
|
-
export declare function
|
|
37
|
+
export declare function trajectorySessionInfo(sessionId: string): {
|
|
29
38
|
trajectoryDirName: string;
|
|
30
39
|
ccc: string;
|
|
31
40
|
} | null;
|
|
32
41
|
/** 查 sessionId 的活体 agent(进程内会话延续用;未注册/已清理 → undefined) */
|
|
33
|
-
export declare function
|
|
34
|
-
/** 该会话当前绑定的
|
|
35
|
-
export declare function
|
|
36
|
-
export declare function
|
|
37
|
-
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;
|
|
38
47
|
/** 测试/调试:注册表快照 */
|
|
39
|
-
export declare function
|
|
48
|
+
export declare function trajectorySessionSnapshot(): ReadonlyMap<string, {
|
|
40
49
|
trajectoryDirName: string;
|
|
41
50
|
ccc: string;
|
|
42
51
|
}>;
|
|
43
52
|
/**
|
|
44
|
-
* 该
|
|
53
|
+
* 该 轨迹约束会话的**工作台路径** = 它自己轨迹的 SESSION.md。
|
|
45
54
|
*
|
|
46
|
-
* 🔴 与旧版的差别:旧版会在这里**自动新建**一个 SESSION(`
|
|
47
|
-
* 新版**没有新建这个动作** —— 轨迹就是工作台,`
|
|
55
|
+
* 🔴 与旧版的差别:旧版会在这里**自动新建**一个 SESSION(`ensureTrajectorySession`);
|
|
56
|
+
* 新版**没有新建这个动作** —— 轨迹就是工作台,`trajectory-constraint.json` 与 `SESSION.md` 同处一个目录。
|
|
48
57
|
* ⇒ 语义变成纯粹的"查询:我自己的身体在哪"。
|
|
49
58
|
*
|
|
50
|
-
* @returns SESSION.md 绝对路径;不是
|
|
59
|
+
* @returns SESSION.md 绝对路径;不是 轨迹约束 / 文件不在 → null
|
|
51
60
|
*/
|
|
52
|
-
export declare function
|
|
61
|
+
export declare function trajectoryWorkspaceMdPath(root: string, sessionId: string | undefined): string | null;
|
|
53
62
|
/**
|
|
54
63
|
* 系统提示词中的**工作台纪律块**(S142 用户:只给路径 LLM 不会主动用)。
|
|
55
64
|
*
|
|
56
|
-
* SESSION = 工作台 ——
|
|
65
|
+
* SESSION = 工作台 —— 轨迹约束与主舱同一套机制(**零特调**,用户拍板):
|
|
57
66
|
* SESSION.md 是持久记忆载体、rebuild 自动从本 SESSION 续接。
|
|
58
67
|
* 注入 agent 系统提示词(用户对话面不可见)。
|
|
59
68
|
*
|
|
60
69
|
* v1.30.13(S142 诊断 D5):写入纪律**不点名具体工具** —— 旧文案写死 "with write/edit",
|
|
61
|
-
* 而某个
|
|
70
|
+
* 而某个 轨迹约束的工具白名单里根本没有 write/edit ⇒ 指令指向它没有的工具
|
|
62
71
|
* (注入纪律与能力面矛盾,模型只能猜)。现文案改为「用本轨迹被授权的写入通道」。
|
|
63
72
|
*/
|
|
64
73
|
export declare function workspaceCognitiveTrajectoryLine(mdPath: string): string;
|
|
65
74
|
/**
|
|
66
75
|
* 把**工作台纪律块**挂到 agent 的系统提示词段(单一注入点)。
|
|
67
76
|
*
|
|
68
|
-
* 用户原话(S142,2026-09-08):"
|
|
69
|
-
* 这样就重复,能否微信桥情况下,注入内容直接取
|
|
77
|
+
* 用户原话(S142,2026-09-08):"微信桥的注入机制,每个用户消息都会注入,轨迹约束本身也会注入,
|
|
78
|
+
* 这样就重复,能否微信桥情况下,注入内容直接取 轨迹约束的,这样不用配两遍"。
|
|
70
79
|
*
|
|
71
|
-
* 现形态:工作台行**只**经本函数挂系统提示词段(name `serenity
|
|
80
|
+
* 现形态:工作台行**只**经本函数挂系统提示词段(name `serenity-轨迹约束-workspace`,
|
|
72
81
|
* 动态 `text()` 每轮按 scope 读当前活跃 mdPath)。
|
|
73
82
|
*
|
|
74
83
|
* @returns true = 段已在位;false = 该 agent 挂不上(调用方降级为 question 前缀注入)
|
|
75
84
|
*/
|
|
76
85
|
export declare function ensureWorkspacePromptSection(agent: Agent, scope: string, root: string): boolean;
|
|
77
|
-
interface
|
|
86
|
+
interface 轨迹约束AgentRef {
|
|
78
87
|
handle: AgentHandle;
|
|
79
88
|
agent: Agent;
|
|
80
89
|
sessionId: string;
|
|
@@ -82,17 +91,17 @@ interface SkiffAgentRef {
|
|
|
82
91
|
resumed: boolean;
|
|
83
92
|
}
|
|
84
93
|
/**
|
|
85
|
-
* 创建(或复用)一个
|
|
94
|
+
* 创建(或复用)一个 轨迹约束会话。
|
|
86
95
|
*
|
|
87
96
|
* **固定 sessionId 的 resume-or-create**(v1.27.2):指定 sessionId 且磁盘已有持久化 log →
|
|
88
97
|
* `ctx.agents.resume`(DSH 持久化语义:sessionId 即身份,历史 + turn 续号延续);
|
|
89
98
|
* 无 log(首次)→ `ctx.agents.create`。不指定 → 随机 id 恒 create(调试页路径)。
|
|
90
99
|
*
|
|
91
|
-
* @param profile 该
|
|
100
|
+
* @param profile 该 轨迹约束的约束面(来自 `trajectory-constraint.json`)
|
|
92
101
|
* @param sessionId 指定会话 id(可选;微信桥等外部面用固定 id 实现"轨迹 ↔ 会话"长期映射)
|
|
93
102
|
*/
|
|
94
|
-
export declare function
|
|
95
|
-
interface
|
|
103
|
+
export declare function createTrajectoryAgent(ctx: Context, root: string, profile: TrajectoryConstraint, defaultModel?: string, sessionId?: string): Promise<轨迹约束AgentRef>;
|
|
104
|
+
interface 轨迹约束AskResult {
|
|
96
105
|
answer: string;
|
|
97
106
|
sessionId: string;
|
|
98
107
|
}
|
|
@@ -121,35 +130,35 @@ export declare function waitForTurnAssistant(ctx: unknown, agent: Agent, beforeA
|
|
|
121
130
|
*
|
|
122
131
|
* @param options.timeoutMs 本轮等待上限(测试注入;生产用缺省)
|
|
123
132
|
*/
|
|
124
|
-
export declare function
|
|
133
|
+
export declare function askTrajectory(ctx: Context, agent: Agent, question: string, options?: {
|
|
125
134
|
timeoutMs?: number;
|
|
126
|
-
}): Promise
|
|
135
|
+
}): Promise<轨迹约束AskResult>;
|
|
127
136
|
/**
|
|
128
|
-
*
|
|
129
|
-
*
|
|
137
|
+
* 轨迹约束会话的轨迹纪律参与判定:**不是 轨迹约束恒 true**(正常参与);
|
|
138
|
+
* 轨迹约束 按 `trajectory-constraint.json` 的 `cognitiveTrajectory` 子集决定。
|
|
130
139
|
*
|
|
131
|
-
* 注册表缺失(进程刚重启、绑定还没读)⇒ 由 `
|
|
132
|
-
* 两者都不中 ⇒ 判"不是
|
|
140
|
+
* 注册表缺失(进程刚重启、绑定还没读)⇒ 由 `trajectoryConstraintForSession` 回落持久绑定;
|
|
141
|
+
* 两者都不中 ⇒ 判"不是 轨迹约束" ⇒ 恒 true(正常参与)。**fail-open 是有意的**:
|
|
133
142
|
* 纪律参与项的失败不该让会话失去 keeper/rebuild(那是能力倒退,比多跑一次更糟)。
|
|
134
143
|
*/
|
|
135
|
-
export declare function
|
|
136
|
-
interface
|
|
144
|
+
export declare function trajectoryConstraintParticipates(root: string, sessionId: string | undefined, key: 'session' | 'keeper' | 'rebuild'): boolean;
|
|
145
|
+
interface 轨迹约束MsmGate {
|
|
137
146
|
/** 拒绝原因(有则拒绝执行) */
|
|
138
147
|
reject?: string;
|
|
139
148
|
/** list 显示白名单(msms);仅 action==='list' 时有值 */
|
|
140
149
|
whitelist?: Set<string>;
|
|
141
150
|
}
|
|
142
151
|
/**
|
|
143
|
-
* `msm` 工具的
|
|
152
|
+
* `msm` 工具的 轨迹约束门控:非 轨迹约束恒放行;轨迹约束会话——
|
|
144
153
|
* exec 非白名单 MSM 拒绝(**不列名单**)、register/deregister 必拒、
|
|
145
154
|
* list 白名单过滤、check/guide/ccc-config 只读放行。
|
|
146
155
|
*/
|
|
147
|
-
export declare function
|
|
148
|
-
/** 该
|
|
149
|
-
export declare function
|
|
150
|
-
/** 按编码解析
|
|
151
|
-
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;
|
|
152
161
|
/** 编码 → 轨迹目录名(路由用;只做精确匹配) */
|
|
153
|
-
export declare function
|
|
162
|
+
export declare function 轨迹约束DirNameByCode(root: string, code: string): string | null;
|
|
154
163
|
/** 一次性解析提示词全文(admin/validate 用;热路径不要用) */
|
|
155
|
-
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",
|
|
@@ -150,6 +150,7 @@
|
|
|
150
150
|
"@deepseek-ai/dsh-web-fetch-http": "0.1.7-rc.1",
|
|
151
151
|
"@deepseek-ai/dsh-workspace": "0.1.7-rc.1",
|
|
152
152
|
"@deepseek-ai/schemastery": "^3.18.4",
|
|
153
|
+
"@larksuiteoapi/node-sdk": "^1.76.0",
|
|
153
154
|
"@types/node": "^20.0.0",
|
|
154
155
|
"@types/qrcode-generator": "^1.0.6",
|
|
155
156
|
"@types/react": "^18.2.0",
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* role/skiff/config.ts — skiff 约束面的**纯逻辑助手**(零 DSH 依赖,可独立单测)
|
|
3
|
-
*
|
|
4
|
-
* ## 2026-10-19 重做后的职责边界(R↓,别再混起来)
|
|
5
|
-
*
|
|
6
|
-
* | 模块 | 管什么 |
|
|
7
|
-
* |---|---|
|
|
8
|
-
* | `./profile.ts` | **判据 + 读盘**("这是不是 skiff"、"约束面是什么") |
|
|
9
|
-
* | `./config.ts`(本文件) | **从约束面派生出的纯函数**(白名单集合、提示词读取器、基础提示词文本) |
|
|
10
|
-
* | `./core.ts` | 会话创建/复用、提问、守门查询 |
|
|
11
|
-
*
|
|
12
|
-
* ⇒ 本文件**不再读 `serenity.json`**:`skiff.roles` 整段已退役(owner 2026-10-19 重做)。
|
|
13
|
-
* 它只接收一个已解析好的 `SkiffProfile`,因此**不涉及任何 IO**(除提示词文件,那是刻意懒读的)。
|
|
14
|
-
*/
|
|
15
|
-
import type { SkiffProfile } from './profile.js';
|
|
16
|
-
/** 白名单推导 ────────────────────────────────────────────────────────────── */
|
|
17
|
-
/** 提示词来源提示串(`apply` 回执与面板共用;避免两处措辞漂) */
|
|
18
|
-
export declare const SKIFF_PROFILE_HINT = "systemPromptFile hot-reloads by mtime; the rest of skiff.json is re-read every turn";
|
|
19
|
-
/**
|
|
20
|
-
* 该 skiff 会话**可见**的工具面(tools ∪ `msm`)。
|
|
21
|
-
*
|
|
22
|
-
* 🔴 `msm` 为什么自动加入:`msms` 非空意味着这个 skiff **有 MSM 通道**,
|
|
23
|
-
* 而 MSM 的唯一合法调用入口是 `msm` 工具(单入口纪律)——不给它 `msm` 就等于
|
|
24
|
-
* 声明了一堆调不动的能力。⚠️ 这是**并集**,不是覆盖:`tools` 里显式写的照旧生效。
|
|
25
|
-
*/
|
|
26
|
-
export declare function profileToolWhitelist(profile: SkiffProfile | null | undefined): Set<string>;
|
|
27
|
-
/** 该 skiff 会话可 exec 的 MSM 白名单(`msm` 工具内部再过滤;独立于工具白名单) */
|
|
28
|
-
export declare function profileMsmWhitelist(profile: SkiffProfile | null | undefined): Set<string>;
|
|
29
|
-
/** 轨迹纪律参与项(`profile` 缺省已在 `readSkiffProfileAt` 归一为全 true) */
|
|
30
|
-
export declare function profileCognitiveTrajectory(profile: SkiffProfile | null | undefined): {
|
|
31
|
-
session: boolean;
|
|
32
|
-
keeper: boolean;
|
|
33
|
-
rebuild: boolean;
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* 解析约束面声明的**系统提示词全文**(一次性读取;`create` / `validate` / `list` 用)。
|
|
37
|
-
*
|
|
38
|
-
* 顺序:`systemPromptFile`(**推荐**:超长提示词在 JSON 里内嵌不可读)→ 内嵌 `systemPrompt` → 空串。
|
|
39
|
-
* 文件缺失/逃逸 ⇒ **抛错**(调用方 catch 降级;`validate` 据此报 issue)。
|
|
40
|
-
*
|
|
41
|
-
* ⚠️ 热路径**不用**它(那会用每次工具调用去读盘)——热路径用 `createProfilePromptReader`。
|
|
42
|
-
*/
|
|
43
|
-
export declare function resolveProfileSystemPrompt(root: string, profile: SkiffProfile | null | undefined): string;
|
|
44
|
-
/** 提示词来源(`list`/`validate` 展示用) */
|
|
45
|
-
export declare function profileSystemPromptSource(profile: SkiffProfile | null | undefined): 'file' | 'inline' | 'none';
|
|
46
|
-
/**
|
|
47
|
-
* 提示词**读取器**(长期热更新;改文件即生效,无需重启)。
|
|
48
|
-
*
|
|
49
|
-
* 为什么返回函数而不是字符串(R↓,实证代价):旧实现在创建时把提示词**快照**进系统提示词段闭包
|
|
50
|
-
* ⇒ CCC 改了提示词文件必须重启 dsh web 才生效(实测:改完 18KB 提示词,live agent 仍用旧文本)。
|
|
51
|
-
* 现形态由系统提示词段的 `text()` **每轮调用**本读取器:
|
|
52
|
-
* - `systemPromptFile`:按 **mtime + size** 缓存重读(命中缓存零 IO;未变不解析)
|
|
53
|
-
* - 内嵌 `systemPrompt`:静态(改 JSON 仍需重载配置,这与文件热更的差别是**必然**的 —— 文件有 mtime,JSON 没有)
|
|
54
|
-
* - 读取失败:返回**上次成功内容**(⛔ 绝不返回空——空提示词会让角色失去人格与纪律),并按标签去重告警一次
|
|
55
|
-
*
|
|
56
|
-
* @param root CCC 根
|
|
57
|
-
* @param profile 约束面
|
|
58
|
-
*/
|
|
59
|
-
export declare function createProfilePromptReader(root: string, profile: SkiffProfile | null | undefined): () => string;
|
|
60
|
-
/**
|
|
61
|
-
* skiff 基础提示词(dsp 只给这部分;CCC 的 `systemPrompt` 段由调用方拼接)。
|
|
62
|
-
*
|
|
63
|
-
* ## 🔴 为什么**不再枚举**清单(owner 2026-10-19 令)
|
|
64
|
-
*
|
|
65
|
-
* 旧版在这里抄了两份清单(`MSMs: a, b, c` / `Tools: read, grep, …`)。那是**第二真相源**,
|
|
66
|
-
* 而真相源本来就在模型自己手里:
|
|
67
|
-
* · **工具清单** = 这一轮实际注册给它的 tool schema —— 模型已经看得见,抄一遍只会漂
|
|
68
|
-
* · **MSM 清单** = `msm()` 无参调用返回的目录 —— 已按白名单过滤,且**每次实时读配置**
|
|
69
|
-
*
|
|
70
|
-
* ⚠️ **漂移不是理论风险,是已发生的缺陷**(2026-10-19):角色配置早就长到 8 个工具,
|
|
71
|
-
* 而这个函数是从**创建时冻结的快照**求值的 ⇒ 提示词里一直写着旧的 4 个
|
|
72
|
-
* ⇒ 模型照着提示词办事,**它自己以为没有的能力就不去调** ⇒ 症状是"工具用不了",
|
|
73
|
-
* 而守卫那边(每调用实时读配置)其实是放行的。两个真相源打架,输的总是提示词。
|
|
74
|
-
*
|
|
75
|
-
* ⇒ 现在只声明**边界与发现路径**,不抄内容:清单在哪,怎么取,越界会怎样。
|
|
76
|
-
*
|
|
77
|
-
* @param code 轨迹编码(skiff 的身份 —— 不是"角色名",那个概念已退役)
|
|
78
|
-
*/
|
|
79
|
-
export declare function buildSkiffBasePrompt(code: string): string;
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* role/skiff/debug.ts — Skiff 调试问答页(F4a',v1.25.x 实验性)
|
|
3
|
-
*
|
|
4
|
-
* node:http 调试端口(默认关,仅监听 127.0.0.1;启停 = 人工——设置面板「Serenity」
|
|
5
|
-
* 页 Skiff 区块开关,不随插件加载自动启动)。
|
|
6
|
-
*
|
|
7
|
-
* - GET / → 问答 HTML 页(**CCC 选择器** + 角色下拉 + 输入框 + 答案区 + 轨迹区 + WebUI 链接)
|
|
8
|
-
* - POST /ask → {ccc?, role, question} → 走会话核心(skiff-core)→ {answer, sessionId, cognitiveTrajectory}
|
|
9
|
-
*
|
|
10
|
-
* **多 CCC 手工切换(v1.25.4,S142 用户)**:dsh 管理多个 CCC 时,调试页顶部 CCC
|
|
11
|
-
* 下拉列出全部候选(live 会话 cwd 上溯 .serenity 去重 + 默认绑定 root 兜底),
|
|
12
|
-
* 切换后角色下拉联动(各 CCC 的 skiff.roles 实时读取),提问按所选 CCC 创建 agent。
|
|
13
|
-
*
|
|
14
|
-
* 与 skiff 会话核心(createSkiffAgent + askSkiff)直接共用同一实现;
|
|
15
|
-
* (原「与 ACP stdio 协议(F4c 后续)共用同一会话核心」一句已随面 E 退役删除,2026-10-15)
|
|
16
|
-
* 轨迹 = session.events 结构化返回(与 dsh WebUI 同源数据),
|
|
17
|
-
* 页面 JS 渲染成对话时间线;同时保留原生 WebUI 会话链接供完整交互。
|
|
18
|
-
*
|
|
19
|
-
* 实验性质:未开启时零资源占用(无监听、无 agent 创建)。
|
|
20
|
-
*/
|
|
21
|
-
import type { Context } from 'cordis';
|
|
22
|
-
import { type CccEntry } from '../../kernel/ccc-roots.js';
|
|
23
|
-
import { type FaceSpec } from '../../surface/faces.js';
|
|
24
|
-
export declare function skiffDebugActive(): boolean;
|
|
25
|
-
export declare function skiffDebugPort(): number | null;
|
|
26
|
-
/**
|
|
27
|
-
* 候选 CCC 条目(调试页 CCC 切换器数据)。
|
|
28
|
-
*
|
|
29
|
-
* C2:定义已迁至 `kernel/ccc-roots.ts`(L2 枚举的唯一真相源)——此处只在**类型层**转出
|
|
30
|
-
* (零运行时重导出,避免把 `ccc-roots` 拉进本模块的运行时静态链)。
|
|
31
|
-
*/
|
|
32
|
-
export type { CccEntry };
|
|
33
|
-
/** 问答页 HTML:CCC 切换器 + 角色下拉 + 输入 + 答案区 + 轨迹区(JS 渲染)+ WebUI 链接 */
|
|
34
|
-
export declare function skiffDebugPage(cccs: CccEntry[], defaultRoot: string, webPort: number): string;
|
|
35
|
-
/**
|
|
36
|
-
* JSC (Safari/iOS) JSON.parse 快速路径正则兼容化(v1.26.9,S142 调研定稿)。
|
|
37
|
-
*
|
|
38
|
-
* 背景:WebKit bug 200190「JavaScriptCore's Regex can't match the content」——JSC 的
|
|
39
|
-
* JSON.parse 用**内部正则**预校验字符串;内容含**原始** `\u2028`(行分隔符)/`\u2029`
|
|
40
|
-
* (段分隔符)时正则无法匹配 → 对**合法 JSON** 也抛
|
|
41
|
-
* `SyntaxError: The string did not match the expected pattern`(sentry-javascript #2487 同源)。
|
|
42
|
-
* JSON.stringify **不转义** `\u2028`/`\u2029`/`\uFEFF`(它们都是合法 JSON 字符串字符)→
|
|
43
|
-
* 在 JSON **文本层**把它们替换为 `\uXXXX` 转义序列:JSON.parse 后语义完全一致(还原原字符),
|
|
44
|
-
* 且 JSC 正则看到的是常规 ASCII 转义(与 JSON.stringify 对控制字符的输出同形态,安全)。
|
|
45
|
-
*
|
|
46
|
-
* 3099 调试页客户端 `await res.json()` 与页面内嵌 JSON 均需此兼容层
|
|
47
|
-
* ——iOS Safari 用户实测"复杂回答"触发。(原同批还列了 3100 问答页,该面已退役,2026-10-15)
|
|
48
|
-
*
|
|
49
|
-
* @param jsonText JSON.stringify 的输出文本;原地等价替换,返回 JSC 安全文本
|
|
50
|
-
*/
|
|
51
|
-
export declare function jscSafeJsonText(jsonText: string): string;
|
|
52
|
-
/**
|
|
53
|
-
* Markdown 渲染(v1.25.9,正经库 marked 服务端渲染——替代手写正则渲染器,S142 用户要求):
|
|
54
|
-
* ① 提取 `<think>…</think>` 块(v1.26.8 状态机扫描,占位符 \u0001T<idx>\u0001)
|
|
55
|
-
* ② 正文与 think 内容**先 escapeHtml 再 marked.parse**(GFM + breaks)——markdown 语法不受
|
|
56
|
-
* 转义影响,原始 HTML 注入被消除(安全);代码块内 `<` 显示为实体(可接受)
|
|
57
|
-
* ③ think 占位符:默认还原为 `<details class="think">` 折叠卡(🧠 思考过程,默认收起);
|
|
58
|
-
* **hideThink=true(v1.26.4,public 口)→ 直接移除**(思考过程对普通用户不展示)
|
|
59
|
-
* @param hideThink 为 true 时 `<think>` 内容完全不渲染(public 问答页体验)
|
|
60
|
-
*/
|
|
61
|
-
export declare function renderSkiffMarkdown(raw: string, hideThink?: boolean): string;
|
|
62
|
-
/**
|
|
63
|
-
* 剥离 `<think>…</think>` 块(v1.27.1,微信桥用户反馈:"过微信桥回复给用户的消息,
|
|
64
|
-
* 要去掉 think 标签,用户不应看到")。复用 extractThinkBlocks 状态机(v1.26.8,
|
|
65
|
-
* 弃正则)——提取后**只保留正文**(占位符替换为空,think 内容丢弃),
|
|
66
|
-
* 未闭合 think 优雅截断。适用于纯文本输出面(微信等不支持 think 折叠的通道)。
|
|
67
|
-
*/
|
|
68
|
-
export declare function stripThink(raw: string): string;
|
|
69
|
-
/**
|
|
70
|
-
* 本面的规格(C4 块 A/④:**只提供** name/port/host/enabled/handler)。
|
|
71
|
-
* 路由/鉴权/HTML 全部仍归本模块的 {@link handle}(面宿主不介入面语义)。
|
|
72
|
-
*/
|
|
73
|
-
export declare function skiffDebugSpec(ctx: Context, root: string, port: number, webPort: number): FaceSpec;
|
|
74
|
-
/**
|
|
75
|
-
* 启动调试问答服务(单实例;重复启动幂等返回既有实例)。
|
|
76
|
-
*
|
|
77
|
-
* **CCC 绑定(v1.25.2 用户指出)**:服务绑定一个默认 CCC root(调用方 resolveSkiffRoot
|
|
78
|
-
* 解析:live 会话中**含 skiff.roles 的 CCC 优先**);v1.25.4 起页面可**手工切换**到
|
|
79
|
-
* 其它候选 CCC(live 会话发现的全部 CCC);角色配置**每次请求实时读取**(不缓存快照)。
|
|
80
|
-
*
|
|
81
|
-
* C4 块 A:listener 的创建/监听/错误/端口占用/关闭归 `face-host`(本函数只提供规格 + 记日志)。
|
|
82
|
-
*
|
|
83
|
-
* @param root 默认绑定的 CCC 根(首次加载选中;角色配置读取 + skiff agent cwd)
|
|
84
|
-
* @param port 调试端口(仅 127.0.0.1)
|
|
85
|
-
* @param webPort 主 WebUI 端口(WebUI 链接)
|
|
86
|
-
*/
|
|
87
|
-
export declare function startSkiffDebugServer(ctx: Context, root: string, port: number, webPort: number): Promise<void>;
|
|
88
|
-
export declare function stopSkiffDebugServer(): void;
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* role/skiff/profile.ts — **skiff 的唯一判据**:目录下有 `skiff.json` 的认知轨迹(零 DSH 依赖,可独立单测)
|
|
3
|
-
*
|
|
4
|
-
* ## 🔴 owner 2026-10-19 重做令(逐字,本文件存在的全部理由)
|
|
5
|
-
*
|
|
6
|
-
* > 「skiff 复杂的约束和提示词体系都干掉,改为这样的实现:
|
|
7
|
-
* > **skiff 本身是认知轨迹的一个特殊情况,即目录下拥有 `skiff.json` 的认知轨迹自动是一个 skiff**
|
|
8
|
-
* > (json 里配置上个版本就有的各种约束),**会话跑在认知轨迹上且发现 `skiff.json`,则运行时实现各类约束**」
|
|
9
|
-
*
|
|
10
|
-
* ## 旧模型 → 新模型(**一条判据取代四条**)
|
|
11
|
-
*
|
|
12
|
-
* | 项 | 旧 | 新 |
|
|
13
|
-
* |---|---|---|
|
|
14
|
-
* | skiff 是什么 | `serenity.json` 的 `skiff.roles.<name>` 一条配置 | **轨迹目录里有 `skiff.json`** |
|
|
15
|
-
* | 怎么认出 skiff 会话 | dsh sessionId 前缀 `skiff-` | **它绑定的轨迹有 `skiff.json`** |
|
|
16
|
-
* | 工作台从哪来 | `ensureSkiffSession` 另建一个 SESSION | **就是该轨迹自己的 SESSION.md** |
|
|
17
|
-
* | 身份 | 角色名 | **轨迹编码**(`trajectory/core.ts` 的 `parseTrajectoryCode`) |
|
|
18
|
-
*
|
|
19
|
-
* ⇒ 收益(owner:「理解难度大幅下降」的实际内容):四个各自会漂的机制收敛为**一条文件存在性判据**。
|
|
20
|
-
* 删掉 `skiff.json` ⇒ 该轨迹**当场**退化为普通轨迹(工具面、提示词、keeper 全部恢复默认)。
|
|
21
|
-
*
|
|
22
|
-
* ## 归属(D23)
|
|
23
|
-
* **机制在 ACC**(文件叫什么、怎么读、怎么判、缺省值、如何施加约束);
|
|
24
|
-
* **内容在 CCC**(`skiff.json` 里填什么:模型、白名单、提示词路径)。
|
|
25
|
-
* ⇒ ACC 代码里**不出现任何具体角色名**,也不读 `serenity.json` 的 skiff 段(该段已退役)。
|
|
26
|
-
*/
|
|
27
|
-
/** `skiff.json` 的固定文件名(**判据就是它存在**——不是目录名前缀,也不是配置里的一行) */
|
|
28
|
-
export declare const SKIFF_PROFILE_FILENAME = "skiff.json";
|
|
29
|
-
/**
|
|
30
|
-
* 一个 skiff 轨迹的**完整约束面**(= 旧 `skiff.roles.<name>` 那套,整体搬进轨迹目录)。
|
|
31
|
-
*
|
|
32
|
-
* ⚠️ 与旧配置的**一处有意语义翻转**(R↓,别当成"顺手改默认值"):
|
|
33
|
-
* `cognitiveTrajectory.*` 在旧模型里**缺省全 false**("skiff 完全独立"),理由是
|
|
34
|
-
* **它的工作台是外挂的**(`ensureSkiffSession` 另建一个 SESSION,不由轨迹承载)。
|
|
35
|
-
* 新模型里**工作台就是它自己的 SESSION.md** ⇒ 全 false 会让它拿不到自己的身体
|
|
36
|
-
* ⇒ **缺省翻成 true**。这不是偏好问题,是两个模型的结构差。
|
|
37
|
-
*/
|
|
38
|
-
export interface SkiffProfile {
|
|
39
|
-
/** 该约束面所属轨迹的目录名(`YYYY-MM-DD--<code>[--<desc>]`) */
|
|
40
|
-
dirName: string;
|
|
41
|
-
/** 轨迹编码(= 唯一标识;见 `parseTrajectoryCode`) */
|
|
42
|
-
code: string;
|
|
43
|
-
/** `skiff.json` 的绝对路径 */
|
|
44
|
-
path: string;
|
|
45
|
-
/** 模型(`provider/model`);缺省回退 `cheap-worker.defaultModel` */
|
|
46
|
-
model?: string;
|
|
47
|
-
/** 非 MSM 工具白名单(白名单外**从 schema 移除**,不是"看得见调不动") */
|
|
48
|
-
tools: string[];
|
|
49
|
-
/** MSM 白名单(`msm()` 单入口内再过滤) */
|
|
50
|
-
msms: string[];
|
|
51
|
-
/** 轨迹纪律参与项(**缺省全 true**,见上方 R↓) */
|
|
52
|
-
cognitiveTrajectory: {
|
|
53
|
-
session: boolean;
|
|
54
|
-
keeper: boolean;
|
|
55
|
-
rebuild: boolean;
|
|
56
|
-
};
|
|
57
|
-
/** 内嵌提示词(`systemPromptFile` 为空时用) */
|
|
58
|
-
systemPrompt?: string;
|
|
59
|
-
/** 提示词文件(相对 CCC 根;**优先于** `systemPrompt`) */
|
|
60
|
-
systemPromptFile?: string;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* 读一个目录下的 `skiff.json`(**纯读,不施加约束**)。
|
|
64
|
-
*
|
|
65
|
-
* @param trajectoryDir 轨迹目录绝对路径
|
|
66
|
-
* @param root CCC 根(仅用于 `systemPromptFile` 的逃逸拒绝)
|
|
67
|
-
* @returns 归一后的约束面;**无该文件 → `null`(= 这不是 skiff,常态,不是错误)**
|
|
68
|
-
*
|
|
69
|
-
* ⚠️ **形态容错**:数组元素非字符串 → 丢弃该项(不整份作废);`cognitiveTrajectory`
|
|
70
|
-
* 缺项 → 各自取 **true**(见 R↓);`model` 空白 → undefined(回退缺省)。
|
|
71
|
-
* 坏 JSON ⇒ 告警 + `null`(**按"不是 skiff"处理**:宁可让它退回普通轨迹,也不要带着
|
|
72
|
-
* 半份读不懂的权限面运行)。
|
|
73
|
-
*/
|
|
74
|
-
export declare function readSkiffProfileAt(trajectoryDir: string, root: string): SkiffProfile | null;
|
|
75
|
-
/**
|
|
76
|
-
* 按**轨迹编码**解析 skiff 约束面(`list`/`admin`/调试页/路由解析用)。
|
|
77
|
-
*
|
|
78
|
-
* @returns 约束面;轨迹不存在 / 无 `skiff.json` → `null`
|
|
79
|
-
*/
|
|
80
|
-
export declare function readSkiffProfileByCode(root: string, code: string): SkiffProfile | null;
|
|
81
|
-
/** 扫全部活跃轨迹,返回全部 skiff。**顺序按目录名**(确定性,便于对读)。 */
|
|
82
|
-
export declare function listSkiffProfiles(root: string): SkiffProfile[];
|
|
83
|
-
/**
|
|
84
|
-
* 编码 → 轨迹目录名(活跃轨迹内)。找不到 → `null`。
|
|
85
|
-
*
|
|
86
|
-
* ⚠️ 与 `findSession` 的分工:这里**只按编码精确**匹配(不做模糊),
|
|
87
|
-
* 因为它的调用方(路由 / 约束施加)要的是**确定性**,模糊匹配会把"手抖打错的名字"
|
|
88
|
-
* 静默投到一条相近的轨迹上——那正是最难查的一类串味。
|
|
89
|
-
*/
|
|
90
|
-
export declare function findDirNameByCode(root: string, code: string): string | null;
|
|
91
|
-
/**
|
|
92
|
-
* **会话级**判据(J2):这个 dsh 会话是不是 skiff 会话 —— 唯一入口。
|
|
93
|
-
*
|
|
94
|
-
* 判据 = **它绑定的轨迹有 `skiff.json`**(不是 sessionId 前缀,也不是配置里有没有角色)。
|
|
95
|
-
*
|
|
96
|
-
* ## 为什么"绑定的轨迹"从两个来源取(R↓,一个失败模式)
|
|
97
|
-
* ① **持久绑定**(`readLastBound`,宿主存储域/`.bindings.json`)—— 权威,跨重启成立;
|
|
98
|
-
* ② **内存注册表**(`skiff/registry`)—— 覆盖绑定的**窗口期**(轨迹刚定、bound 还没落盘)。
|
|
99
|
-
* ⇒ 只取 ① 会在建会话的第一轮判成"不是 skiff"(工具面不收窄,模型看见不该有的工具);
|
|
100
|
-
* 只取 ② 会在进程重启后全判成"不是"(skiff 失去约束,**权限面静默放开**)。
|
|
101
|
-
* ⇒ **两来源并取**,都不中才 `null`。
|
|
102
|
-
*
|
|
103
|
-
* @param root CCC 根
|
|
104
|
-
* @param sessionId dsh 会话 id
|
|
105
|
-
* @param boundDirName 调用方已解析的绑定目录名(可选;给了就省一次读绑定)
|
|
106
|
-
* @returns 约束面;不是 skiff 会话 → `null`
|
|
107
|
-
*/
|
|
108
|
-
export declare function skiffProfileForSession(root: string, sessionId: string | undefined, boundDirName?: string | null): SkiffProfile | null;
|
|
109
|
-
/**
|
|
110
|
-
* 该 dsh 会话**是不是** skiff 会话(布尔形态的 `skiffProfileForSession`)。
|
|
111
|
-
*
|
|
112
|
-
* 存在的理由:调用点很多只要一个"是/不是"(seams 的旁路判定),
|
|
113
|
-
* 让它们各自写 `!== null` 会把判据散开;**判据只能有一个入口**。
|
|
114
|
-
*/
|
|
115
|
-
export declare function isSkiffSession(root: string, sessionId: string | undefined): boolean;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import "node:module";
|
|
2
|
-
//#region \0rolldown/runtime.js
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __exportAll = (all, no_symbols) => {
|
|
5
|
-
let target = {};
|
|
6
|
-
for (var name in all) __defProp(target, name, {
|
|
7
|
-
get: all[name],
|
|
8
|
-
enumerable: true
|
|
9
|
-
});
|
|
10
|
-
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
11
|
-
return target;
|
|
12
|
-
};
|
|
13
|
-
//#endregion
|
|
14
|
-
export { __exportAll as t };
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* skiff-admin.ts — Skiff 约束面逻辑层(公开入口 = `container_admin` 的 `role` 域)
|
|
3
|
-
*
|
|
4
|
-
* 三动作分工(用户拍板 2026-08-28,2026-10-19 重做后语义不变):guide 定义教程 /
|
|
5
|
-
* validate 校验 / list 摘要 / apply 显式应用确认。
|
|
6
|
-
*
|
|
7
|
-
* ## 🔴 2026-10-19 重做后,本文件的**数据源变了**
|
|
8
|
-
*
|
|
9
|
-
* 旧:读 `.opencode/serenity.json` 的 `skiff.roles`(容器级配置表)。
|
|
10
|
-
* 新:读**轨迹目录里的 `skiff.json`**(owner:「目录下拥有 `skiff.json` 的认知轨迹自动是一个 skiff」)。
|
|
11
|
-
* ⇒ `roleCount` 的语义 = **本 CCC 有几条 skiff 轨迹**;"角色名"这个概念没有了,只有**轨迹编码**。
|
|
12
|
-
*
|
|
13
|
-
* 归属(D23)不变:ACC 提供机制(教程 + 校验 + 列表),**约束内容归 CCC**(写进 `skiff.json`)。
|
|
14
|
-
*/
|
|
15
|
-
import type { JsonValue } from '../kernel/json.js';
|
|
16
|
-
/** Skiff 定义教程:概念 / `skiff.json` schema / 双白名单 / 轨迹纪律 / 微信路由 */
|
|
17
|
-
export declare const SKIFF_GUIDE = "\u2550\u2550\u2550 Skiff Guide (2026-10-19 redesigned) \u2550\u2550\u2550\n\n**A skiff IS a cognitive trajectory \u2014 the one whose directory contains `skiff.json`.**\nThat is the whole rule. No role table, no name registry: put the file there and the trajectory\nbecomes a skiff; delete it and it goes back to being an ordinary trajectory (takes effect at once).\n\n AGENT_SESSIONS/<YYYY-MM-DD--<code>--<desc>>/\n \u251C\u2500 SESSION.md \u2190 its persistent body (this IS the workspace \u2014 nothing is auto-created)\n \u251C\u2500 skiff.json \u2190 its constraints (this file is what makes it a skiff)\n \u2514\u2500 TRAJECTORY-UID \u2190 legacy, read-only (superseded by the code)\n\n\u2500\u2500 skiff.json schema \u2500\u2500\n {\n \"model\": \"provider/model\", // optional; falls back to cheap-worker.defaultModel\n \"tools\": [\"read\",\"grep\",\"msm\",...], // non-MSM toolbar whitelist \u2014 anything not listed is REMOVED from the schema\n \"msms\": [\"msm-a\",\"msm-b\"], // MSM whitelist \u2014 msm exec may only run these; register/deregister always refused\n \"cognitiveTrajectory\": { \"session\": true, \"keeper\": true, \"rebuild\": true }, // defaults TRUE (see below)\n \"systemPromptFile\": \".opencode/skiff/<role>.md\", // recommended: relative to CCC root, hot-reloads on save\n \"systemPrompt\": \"...\" // inline fallback; systemPromptFile wins when both are set\n }\n\n\u2500\u2500 Two whitelists, both default-deny \u2500\u2500\n - `tools: []` + non-empty `msms` = pure-MSM skiff (the usual knowledge-QA shape)\n - non-empty `msms` \u21D2 the `msm` tool is added automatically (the only entry point for MSMs)\n - anything outside both lists is invisible in the schema, not merely rejected at call time\n\n\u2500\u2500 cognitiveTrajectory: why the defaults are TRUE \u2500\u2500\n The workspace of a skiff is its own SESSION.md. Setting these to false would cut it off from\n its own body, so `session`/`keeper`/`rebuild` all default to true. Set false explicitly only\n when you deliberately want that participation off.\n\n\u2500\u2500 WeChat routing: user \u2192 trajectory code \u2500\u2500\n `weixin.routes`: `[{ \"user\": \"<wx id or *>\", \"trajectory\": \"<code>\" }]`\n A route pointing at a code with no such trajectory is a hard error (the message is NOT delivered).\n A trajectory WITHOUT `skiff.json` is still a legal target \u2014 it is just an ordinary trajectory.\n\n\u2500\u2500 Operating it \u2500\u2500\n Debug page: Settings \u2192 Serenity \u2192 enable the Skiff block \u2192 http://127.0.0.1:<debugPort>\n Everything is read live: saving `skiff.json` takes effect on the next turn, no restart.\n (The prompt FILE hot-reloads by mtime; the JSON itself is re-read every turn.)\n After editing, run container_admin role apply for an explicit validation + confirmation pass.\n Skill loading is always available to skiff sessions (skills are not whitelisted \u2014 they are read-only knowledge).";
|
|
18
|
-
/** 校验当前 CCC 的 skiff 约束面:msms 均已注册 / model ∈ cheap-worker.models / 提示词非空 */
|
|
19
|
-
export declare function validateSkiffConfig(root: string): JsonValue;
|
|
20
|
-
/** 列出当前 CCC 的 skiff 轨迹(编码 / 模型 / msms / tools / 纪律摘要 / 提示词来源) */
|
|
21
|
-
export declare function listSkiffRoles(root: string): JsonValue;
|
|
22
|
-
/**
|
|
23
|
-
* 应用当前 skiff 配置(S142 用户:改了 json 应该有个生效机制)。
|
|
24
|
-
*
|
|
25
|
-
* 语义:约束面是**每轮实时读取**的 ⇒ apply 不是"推送",而是**显式校验 + 应用确认**:
|
|
26
|
-
* ① 校验合法(复用 validate:msms 注册 / model 白名单 / 提示词非空)
|
|
27
|
-
* ② 非法 → 报告问题清单,不应用(提示修复后重跑 apply)
|
|
28
|
-
* ③ 合法 → 应用确认:绑定 CCC + 轨迹清单 + 说明(下一轮即生效)
|
|
29
|
-
*/
|
|
30
|
-
export declare function applySkiffConfig(root: string): JsonValue;
|