@shgroup/dsh-serenity-hooks 1.70.0 → 1.72.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 +21 -19
- package/dsh.plugin.json +2 -2
- package/lib/{ccc-C33QWoWZ.js → ccc-Dkoa2oW3.js} +16 -2
- package/lib/{ccc-roots-RzasspMr.js → ccc-roots-jZYR2GVE.js} +16 -10
- package/lib/client.js +2 -2
- package/lib/{gateway-auth.d.ts → gateway/auth.d.ts} +3 -3
- package/lib/{gateway-dsh-auth.d.ts → gateway/dsh-auth.d.ts} +1 -1
- package/lib/{gateway-proxy.d.ts → gateway/proxy.d.ts} +3 -3
- package/lib/{gateway.d.ts → gateway/server.d.ts} +5 -5
- package/lib/{totp.d.ts → gateway/totp.d.ts} +1 -1
- package/lib/{output-guard.d.ts → guard/filter.d.ts} +2 -2
- package/lib/{output-guard-seam.d.ts → guard/seam.d.ts} +2 -2
- package/lib/{weixin-api-BrRcPiQs.js → ilink-DEpmE3yi.js} +6 -6
- package/lib/im/accounts.d.ts +105 -0
- package/lib/{weixin-bridge.d.ts → im/bridge.d.ts} +16 -9
- package/lib/{im-bridge.d.ts → im/channels.d.ts} +3 -3
- package/lib/{weixin-send-endpoint.d.ts → im/endpoint.d.ts} +2 -2
- package/lib/{weixin-output-guard.d.ts → im/guard.d.ts} +1 -1
- package/lib/{weixin-hook.d.ts → im/hook.d.ts} +1 -1
- package/lib/{weixin-api.d.ts → im/ilink.d.ts} +3 -3
- package/lib/{human-channel.d.ts → im/inbound.d.ts} +4 -4
- package/lib/{weixin-route.d.ts → im/route.d.ts} +52 -11
- package/lib/{weixin-send-api.d.ts → im/send.d.ts} +3 -3
- package/lib/im/weixin-account.d.ts +45 -0
- package/lib/{im-weixin.d.ts → im/weixin-channel.d.ts} +2 -2
- package/lib/index.js +1008 -815
- package/lib/invariant.js +2 -2
- package/lib/{ccc-roots.d.ts → kernel/ccc-roots.d.ts} +10 -10
- package/lib/{ccc.d.ts → kernel/ccc.d.ts} +114 -44
- package/lib/{config-ops.d.ts → kernel/config.d.ts} +2 -2
- package/lib/kernel/constants.d.ts +20 -0
- package/lib/{invariant.d.ts → kernel/invariant.d.ts} +1 -1
- package/lib/{json.d.ts → kernel/json.d.ts} +1 -1
- package/lib/{message-source.d.ts → kernel/message-source.d.ts} +1 -1
- package/lib/{ports.d.ts → kernel/ports.d.ts} +1 -1
- package/lib/{time.d.ts → kernel/time.d.ts} +1 -1
- package/lib/message-source-kVoNK0C5.js +432 -0
- package/lib/{deepseek-vision-patch.d.ts → patches/deepseek-vision.d.ts} +3 -3
- package/lib/{opencode-provider.d.ts → patches/opencode-provider.d.ts} +1 -1
- package/lib/{web-fetch-provider.d.ts → patches/web-fetch.d.ts} +1 -1
- package/lib/{message-source-DhA1dVBi.js → profile-DyMJ_bfr.js} +277 -463
- package/lib/role/skiff/config.d.ts +79 -0
- package/lib/role/skiff/core.d.ts +155 -0
- package/lib/{skiff-debug.d.ts → role/skiff/debug.d.ts} +4 -4
- package/lib/role/skiff/profile.d.ts +115 -0
- package/lib/role/skiff/registry.d.ts +41 -0
- package/lib/{cheap-worker-ops.d.ts → role/worker/core.d.ts} +1 -1
- package/lib/{agent-idle.d.ts → role/worker/idle.d.ts} +2 -2
- package/lib/{cheap-worker-preset-inherit.d.ts → role/worker/preset.d.ts} +2 -2
- package/lib/{weixin-route-D_DvgPqy.js → route-f7JlinIt.js} +132 -47
- package/lib/seams/context.d.ts +3 -3
- package/lib/seams/guards.d.ts +18 -12
- package/lib/seams/keeper.d.ts +1 -1
- package/lib/seams/system-prompt.d.ts +3 -1
- package/lib/settings-lt1i3OZv.js +403 -0
- package/lib/{skills-discovery.d.ts → skills/discovery.d.ts} +1 -1
- package/lib/skills/resource-index.d.ts +2 -2
- package/lib/{face-host.d.ts → surface/faces.d.ts} +4 -4
- package/lib/{api.d.ts → surface/http.d.ts} +2 -2
- package/lib/{container-status.d.ts → surface/observation.d.ts} +16 -16
- package/lib/{settings-section.d.ts → surface/settings.d.ts} +1 -1
- package/lib/{status.d.ts → surface/status.d.ts} +2 -2
- package/lib/{usage-stats.d.ts → surface/usage.d.ts} +4 -4
- package/lib/{voyage-page.d.ts → surface/voyage/page.d.ts} +2 -2
- package/lib/{voyage-vocab.d.ts → surface/voyage/vocab.d.ts} +1 -1
- package/lib/tools/cognitive-trajectory.d.ts +2 -2
- package/lib/tools/{acc-diag.d.ts → diag/index.d.ts} +2 -2
- package/lib/{diag-ops.d.ts → tools/diag/service.d.ts} +7 -7
- package/lib/tools/eap.d.ts +1 -1
- package/lib/tools/fs/index.d.ts +7 -0
- package/lib/{fs-ops.d.ts → tools/fs/service.d.ts} +2 -2
- package/lib/tools/git/index.d.ts +4 -0
- package/lib/{git-ops.d.ts → tools/git/service.d.ts} +2 -2
- package/lib/tools/im-bridge.d.ts +2 -2
- package/lib/tools/{kit.d.ts → kit/index.d.ts} +1 -1
- package/lib/{kit-ops.d.ts → tools/kit/service.d.ts} +6 -6
- package/lib/tools/{localstore.d.ts → localstore/index.d.ts} +1 -1
- package/lib/{localstore-ops.d.ts → tools/localstore/service.d.ts} +2 -2
- package/lib/tools/{msm.d.ts → msm/index.d.ts} +1 -1
- package/lib/{msm-ops.d.ts → tools/msm/service.d.ts} +2 -2
- package/lib/tools/skiff-admin.d.ts +19 -14
- package/lib/{cognitive-trajectory-assistant.d.ts → trajectory/assistant.d.ts} +2 -2
- package/lib/{cognitive-trajectory-bound.d.ts → trajectory/bound.d.ts} +2 -2
- package/lib/{session-cleanup.d.ts → trajectory/cleanup.d.ts} +1 -1
- package/lib/{cognitive-trajectory-ops.d.ts → trajectory/core.d.ts} +55 -25
- package/lib/{live-sessions.d.ts → trajectory/live.d.ts} +1 -1
- package/lib/trajectory/prompt.d.ts +101 -0
- package/lib/{rebuild.d.ts → trajectory/rebuild.d.ts} +1 -1
- package/lib/{cognitive-trajectory-skills.d.ts → trajectory/skills.d.ts} +1 -1
- package/lib/{clock-runtime.d.ts → wake/clock.d.ts} +3 -3
- package/lib/{cro-guide.d.ts → wake/cro-guide.d.ts} +1 -1
- package/lib/{cro-log.d.ts → wake/cro-log.d.ts} +3 -3
- package/lib/{cro-turns.d.ts → wake/cro-turns.d.ts} +5 -5
- package/lib/{cro.d.ts → wake/cro.d.ts} +6 -6
- package/lib/{wake-registry.d.ts → wake/registry.d.ts} +2 -2
- package/lib/{wake-scheduler.d.ts → wake/scheduler.d.ts} +3 -3
- package/package.json +2 -2
- package/lib/constants.d.ts +0 -6
- package/lib/settings-section-0TPYWug9.js +0 -238
- package/lib/skiff-core.d.ts +0 -145
- package/lib/skiff-registry.d.ts +0 -26
- package/lib/skiff-role-cwxAt0gE.js +0 -203
- package/lib/skiff-role.d.ts +0 -89
- package/lib/tools/cc-fs.d.ts +0 -7
- package/lib/tools/git.d.ts +0 -4
|
@@ -1,203 +0,0 @@
|
|
|
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-C33QWoWZ.js";
|
|
3
|
-
import { existsSync, statSync } from "node:fs";
|
|
4
|
-
//#region src/skiff-role.ts
|
|
5
|
-
/**
|
|
6
|
-
* skiff-role.ts — Skiff(F4,v1.25.0 实验性)角色层纯逻辑(零 DSH 依赖,可独立单测)
|
|
7
|
-
*
|
|
8
|
-
* 概念(S142 用户拍板):Skiff = 完整宁静号 cognitive trajectory(在宁静号内全知全能)的
|
|
9
|
-
* **任意子集**——CCC 通过角色配置定义:能力面(tools 非 MSM 工具白名单 + msms
|
|
10
|
-
* MSM 白名单,双白名单独立,白名单外全隐藏)+ 轨迹纪律面(cognitive trajectory 子集)+
|
|
11
|
-
* 系统提示词(CCC 完整定义,dsp 只给基础部分)。
|
|
12
|
-
*
|
|
13
|
-
* 实验性质:未配置任何角色 → Skiff 完全零影响(无监听、无 agent 创建、guard 无规则)。
|
|
14
|
-
*/
|
|
15
|
-
var skiff_role_exports = /* @__PURE__ */ __exportAll({
|
|
16
|
-
SKIFF_SESSION_PREFIX: () => SKIFF_SESSION_PREFIX,
|
|
17
|
-
buildSkiffBasePrompt: () => buildSkiffBasePrompt,
|
|
18
|
-
cognitiveTrajectorySubset: () => cognitiveTrajectorySubset,
|
|
19
|
-
createRolePromptReader: () => createRolePromptReader,
|
|
20
|
-
isSkiffSessionId: () => isSkiffSessionId,
|
|
21
|
-
readSkiffRoles: () => readSkiffRoles,
|
|
22
|
-
resolveRoleSystemPrompt: () => resolveRoleSystemPrompt,
|
|
23
|
-
resolveSkiffKind: () => resolveSkiffKind,
|
|
24
|
-
roleMsmWhitelist: () => roleMsmWhitelist,
|
|
25
|
-
roleToolWhitelist: () => roleToolWhitelist,
|
|
26
|
-
systemPromptSource: () => systemPromptSource
|
|
27
|
-
});
|
|
28
|
-
/** Skiff agent 会话 id 前缀(agents.create 生成;seams 旁路/白名单判定用) */
|
|
29
|
-
const SKIFF_SESSION_PREFIX = "skiff-";
|
|
30
|
-
/** 判定 sessionId 是否为 Skiff 会话(仿 cheap-worker- 前缀排除模式) */
|
|
31
|
-
function isSkiffSessionId(sessionId) {
|
|
32
|
-
return typeof sessionId === "string" && sessionId.startsWith("skiff-");
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* 读取 CCC 的 Skiff 角色配置(.opencode/serenity.json skiff.roles)。
|
|
36
|
-
* @returns 名 → 角色配置 的 Map;未配置(无 skiff 段/空 roles)返回空 Map(Skiff 未启用)
|
|
37
|
-
*/
|
|
38
|
-
function readSkiffRoles(root, paths = DEFAULT_SERENITY_CONFIG_PATHS) {
|
|
39
|
-
const out = /* @__PURE__ */ new Map();
|
|
40
|
-
try {
|
|
41
|
-
const roles = loadSerenityConfig(root, paths).skiff?.roles;
|
|
42
|
-
if (!roles || typeof roles !== "object") return out;
|
|
43
|
-
for (const [name, role] of Object.entries(roles)) {
|
|
44
|
-
if (!role || typeof role !== "object") continue;
|
|
45
|
-
if (name.trim() === "") continue;
|
|
46
|
-
out.set(name.trim(), {
|
|
47
|
-
model: typeof role.model === "string" ? role.model : void 0,
|
|
48
|
-
kind: role.kind === "temporary" || role.kind === "persistent" ? role.kind : void 0,
|
|
49
|
-
msms: Array.isArray(role.msms) ? role.msms.filter((m) => typeof m === "string") : void 0,
|
|
50
|
-
tools: Array.isArray(role.tools) ? role.tools.filter((t) => typeof t === "string") : void 0,
|
|
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
|
-
} : void 0,
|
|
56
|
-
systemPrompt: typeof role.systemPrompt === "string" ? role.systemPrompt : void 0,
|
|
57
|
-
systemPromptFile: typeof role.systemPromptFile === "string" ? role.systemPromptFile : void 0
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
} catch (err) {
|
|
61
|
-
console.warn(`[serenity-hooks] ✗ skiff 角色配置读取失败(按无角色继续): ${String(err?.message ?? err)}`);
|
|
62
|
-
}
|
|
63
|
-
return out;
|
|
64
|
-
}
|
|
65
|
-
function cognitiveTrajectorySubset(role) {
|
|
66
|
-
return {
|
|
67
|
-
session: role?.cognitiveTrajectory?.session === true,
|
|
68
|
-
keeper: role?.cognitiveTrajectory?.keeper === true,
|
|
69
|
-
rebuild: role?.cognitiveTrajectory?.rebuild === true
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
/** 角色可用工具面(白名单并集):tools + msm(msms 非空时作为 MSM 通道自动可用) */
|
|
73
|
-
function roleToolWhitelist(role) {
|
|
74
|
-
const out = /* @__PURE__ */ new Set();
|
|
75
|
-
for (const t of role?.tools ?? []) out.add(t);
|
|
76
|
-
if ((role?.msms?.length ?? 0) > 0) out.add("msm");
|
|
77
|
-
return out;
|
|
78
|
-
}
|
|
79
|
-
/** 角色允许的 MSM 白名单(msm 工具 exec 校验 / 过滤用;独立于 tools 白名单) */
|
|
80
|
-
function roleMsmWhitelist(role) {
|
|
81
|
-
return new Set(role?.msms ?? []);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* 解析角色的系统提示词全文(v1.25.10,S142 用户:超长提示词 JSON 内嵌不可读):
|
|
85
|
-
* ① `systemPromptFile` 存在 → 读取文件内容(**推荐配置方法**;相对 CCC 根,
|
|
86
|
-
* 路径逃逸拒绝(resolveInside)+ BOM 剥除(readUtf8)+ 存在性校验)
|
|
87
|
-
* ② 否则 → 内嵌 `systemPrompt`(兼容旧配置)
|
|
88
|
-
* ③ 都无 → 空字符串
|
|
89
|
-
* 文件缺失/逃逸 → 抛错(调用方 catch 降级 + validate 报 issue)。
|
|
90
|
-
* 懒读取:readSkiffRoles 不读文件(guards/seams 每次工具调用查询的热路径零 IO),
|
|
91
|
-
* 仅在本函数(创建 agent / validate / list 时)读取。
|
|
92
|
-
*/
|
|
93
|
-
function resolveRoleSystemPrompt(root, role) {
|
|
94
|
-
if (!role) return "";
|
|
95
|
-
const file = role.systemPromptFile?.trim();
|
|
96
|
-
if (file) {
|
|
97
|
-
const abs = resolveInside(root, file);
|
|
98
|
-
if (!existsSync(abs)) throw new Error(`skiff role "${role.systemPrompt ?? "(unnamed)"}": systemPromptFile "${file}" not found (resolved: ${abs})`);
|
|
99
|
-
return readUtf8(abs).trim();
|
|
100
|
-
}
|
|
101
|
-
return role.systemPrompt ?? "";
|
|
102
|
-
}
|
|
103
|
-
/** 角色系统提示词来源(validate/list 展示用) */
|
|
104
|
-
function systemPromptSource(role) {
|
|
105
|
-
if (role?.systemPromptFile?.trim()) return "file";
|
|
106
|
-
if (role?.systemPrompt?.trim()) return "inline";
|
|
107
|
-
return "none";
|
|
108
|
-
}
|
|
109
|
-
function resolveSkiffKind(role, hasStableId) {
|
|
110
|
-
const k = role?.kind;
|
|
111
|
-
if (k === "temporary" || k === "persistent") return k;
|
|
112
|
-
return hasStableId ? "persistent" : "temporary";
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* 角色提示词**读取器**(v1.30.15,方案 A:长期型热更新)。
|
|
116
|
-
*
|
|
117
|
-
* 为什么是函数而不是字符串(R↓):旧实现 `createSkiffAgent` 在创建时把
|
|
118
|
-
* `resolveRoleSystemPrompt(...)` 的结果**快照**进系统提示词段闭包 → CCC 改了
|
|
119
|
-
* `<role>.md` 必须重启 dsh web 才生效(本轮实证:改完 18KB 提示词,live agent 仍用旧文本)。
|
|
120
|
-
* 现形态返回一个读取函数,由系统提示词段的 `text()` **每轮调用**:
|
|
121
|
-
* - `systemPromptFile`:按 **mtime + size** 缓存重读(命中缓存零 IO;未变不解析)
|
|
122
|
-
* → 改文件即生效,**无需重启**;变更时打一行 info 日志(可观测,便于确认热更生效)
|
|
123
|
-
* - 内嵌 `systemPrompt`:静态(JSON 配置改动仍需重启/重载配置)
|
|
124
|
-
* - 读取失败:返回**上次成功内容**(绝不返回空——空提示词会让角色失去人格与纪律),
|
|
125
|
-
* 并按标签去重告警一次
|
|
126
|
-
* @param root CCC 根
|
|
127
|
-
* @param role 角色配置
|
|
128
|
-
*/
|
|
129
|
-
function createRolePromptReader(root, role) {
|
|
130
|
-
const file = role?.systemPromptFile?.trim();
|
|
131
|
-
if (!file) {
|
|
132
|
-
const inline = role?.systemPrompt ?? "";
|
|
133
|
-
return () => inline;
|
|
134
|
-
}
|
|
135
|
-
let abs = null;
|
|
136
|
-
try {
|
|
137
|
-
abs = resolveInside(root, file);
|
|
138
|
-
} catch (err) {
|
|
139
|
-
console.warn(`[serenity-hooks] ✗ skiff 角色提示词路径非法(${file}): ${String(err?.message ?? err)}`);
|
|
140
|
-
}
|
|
141
|
-
if (abs === null) return () => "";
|
|
142
|
-
const absPath = abs;
|
|
143
|
-
let cachedMtime = -1;
|
|
144
|
-
let cachedSize = -1;
|
|
145
|
-
let cachedText = "";
|
|
146
|
-
let warned = false;
|
|
147
|
-
return () => {
|
|
148
|
-
try {
|
|
149
|
-
const st = statSync(absPath);
|
|
150
|
-
if (st.mtimeMs === cachedMtime && st.size === cachedSize) return cachedText;
|
|
151
|
-
const text = readUtf8(absPath).trim();
|
|
152
|
-
const isReload = cachedMtime !== -1;
|
|
153
|
-
cachedMtime = st.mtimeMs;
|
|
154
|
-
cachedSize = st.size;
|
|
155
|
-
cachedText = text;
|
|
156
|
-
warned = false;
|
|
157
|
-
if (isReload) console.info(`[serenity-hooks] ↻ skiff 角色提示词已热重载(${file},${text.length} 字符)`);
|
|
158
|
-
return text;
|
|
159
|
-
} catch (err) {
|
|
160
|
-
if (!warned) {
|
|
161
|
-
warned = true;
|
|
162
|
-
console.warn(`[serenity-hooks] ✗ skiff 角色提示词读取失败(${file})——沿用上次成功内容: ${String(err?.message ?? err)}`);
|
|
163
|
-
}
|
|
164
|
-
return cachedText;
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Skiff 基础提示词(dsp 只给这部分;CCC 的 systemPrompt 段由调用方拼接)。
|
|
170
|
-
*
|
|
171
|
-
* ## 🔴 为什么**不再枚举**清单(owner 2026-10-19 令)
|
|
172
|
-
*
|
|
173
|
-
* 旧版在这里抄了两份清单(`MSMs: a, b, c` / `Tools: read, grep, …`)。那是**第二真相源**,
|
|
174
|
-
* 而真相源本来就在模型自己手里:
|
|
175
|
-
* · **工具清单** = 这一轮实际注册给它的 tool schema —— 模型已经看得见,抄一遍只会漂
|
|
176
|
-
* · **MSM 清单** = `msm()` 无参调用返回的目录 —— 已按角色白名单过滤,且**每次实时读配置**
|
|
177
|
-
*
|
|
178
|
-
* ⚠️ **漂移不是理论风险,是已发生的缺陷**(2026-10-19):角色配置早就长到 8 个工具,
|
|
179
|
-
* 而这个函数是从**创建时冻结的 role 快照**求值的 ⇒ 提示词里一直写着旧的 4 个
|
|
180
|
-
* ⇒ 模型照着提示词办事,**它自己以为没有的能力就不去调** ⇒ 症状是"工具用不了",
|
|
181
|
-
* 而守卫那边(每调用实时读配置)其实是放行的。两个真相源打架,输的总是提示词。
|
|
182
|
-
*
|
|
183
|
-
* ⇒ 现在只声明**边界与发现路径**,不抄内容:清单在哪,怎么取,越界会怎样。
|
|
184
|
-
*
|
|
185
|
-
* @param roleName 角色名(CCC 定义;用于身份声明)
|
|
186
|
-
*/
|
|
187
|
-
function buildSkiffBasePrompt(roleName) {
|
|
188
|
-
return [
|
|
189
|
-
"=== Serenity Skiff ===",
|
|
190
|
-
`Role: ${roleName} (defined by this CCC)`,
|
|
191
|
-
"Your capability boundary is enforced mechanically by this CCC — anything outside it is rejected at the call site, not by your judgment.",
|
|
192
|
-
"Discover your surface, do not memorize it (both are generated from the live config on every turn):",
|
|
193
|
-
" · Your tools are exactly the tool schemas you see in this session — if a tool is not in your schema, it is not available.",
|
|
194
|
-
" · Your MSMs are listed by calling msm() with no arguments — that directory is already filtered to this role.",
|
|
195
|
-
" · Usage for any MSM: msm(\"<name>\", [], inspect=true) or pass \"--help\" as the first argument.",
|
|
196
|
-
"Do not infer unavailability from anything you remember or from an earlier list: this surface changes when the CCC configuration changes, and it takes effect without restarting.",
|
|
197
|
-
"",
|
|
198
|
-
"---",
|
|
199
|
-
""
|
|
200
|
-
].join("\n");
|
|
201
|
-
}
|
|
202
|
-
//#endregion
|
|
203
|
-
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 };
|
package/lib/skiff-role.d.ts
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* skiff-role.ts — Skiff(F4,v1.25.0 实验性)角色层纯逻辑(零 DSH 依赖,可独立单测)
|
|
3
|
-
*
|
|
4
|
-
* 概念(S142 用户拍板):Skiff = 完整宁静号 cognitive trajectory(在宁静号内全知全能)的
|
|
5
|
-
* **任意子集**——CCC 通过角色配置定义:能力面(tools 非 MSM 工具白名单 + msms
|
|
6
|
-
* MSM 白名单,双白名单独立,白名单外全隐藏)+ 轨迹纪律面(cognitive trajectory 子集)+
|
|
7
|
-
* 系统提示词(CCC 完整定义,dsp 只给基础部分)。
|
|
8
|
-
*
|
|
9
|
-
* 实验性质:未配置任何角色 → Skiff 完全零影响(无监听、无 agent 创建、guard 无规则)。
|
|
10
|
-
*/
|
|
11
|
-
import { type SkiffRoleConfig } from './ccc.js';
|
|
12
|
-
export type { SkiffRoleConfig };
|
|
13
|
-
/** Skiff agent 会话 id 前缀(agents.create 生成;seams 旁路/白名单判定用) */
|
|
14
|
-
export declare const SKIFF_SESSION_PREFIX = "skiff-";
|
|
15
|
-
/** 判定 sessionId 是否为 Skiff 会话(仿 cheap-worker- 前缀排除模式) */
|
|
16
|
-
export declare function isSkiffSessionId(sessionId: string | undefined): boolean;
|
|
17
|
-
/**
|
|
18
|
-
* 读取 CCC 的 Skiff 角色配置(.opencode/serenity.json skiff.roles)。
|
|
19
|
-
* @returns 名 → 角色配置 的 Map;未配置(无 skiff 段/空 roles)返回空 Map(Skiff 未启用)
|
|
20
|
-
*/
|
|
21
|
-
export declare function readSkiffRoles(root: string, paths?: string[]): Map<string, SkiffRoleConfig>;
|
|
22
|
-
/** 某角色的轨迹纪律子集(缺省全 false = 完全独立) */
|
|
23
|
-
interface SkiffCognitiveTrajectorySubset {
|
|
24
|
-
session: boolean;
|
|
25
|
-
keeper: boolean;
|
|
26
|
-
rebuild: boolean;
|
|
27
|
-
}
|
|
28
|
-
export declare function cognitiveTrajectorySubset(role: SkiffRoleConfig | undefined): SkiffCognitiveTrajectorySubset;
|
|
29
|
-
/** 角色可用工具面(白名单并集):tools + msm(msms 非空时作为 MSM 通道自动可用) */
|
|
30
|
-
export declare function roleToolWhitelist(role: SkiffRoleConfig | undefined): Set<string>;
|
|
31
|
-
/** 角色允许的 MSM 白名单(msm 工具 exec 校验 / 过滤用;独立于 tools 白名单) */
|
|
32
|
-
export declare function roleMsmWhitelist(role: SkiffRoleConfig | undefined): Set<string>;
|
|
33
|
-
/**
|
|
34
|
-
* 解析角色的系统提示词全文(v1.25.10,S142 用户:超长提示词 JSON 内嵌不可读):
|
|
35
|
-
* ① `systemPromptFile` 存在 → 读取文件内容(**推荐配置方法**;相对 CCC 根,
|
|
36
|
-
* 路径逃逸拒绝(resolveInside)+ BOM 剥除(readUtf8)+ 存在性校验)
|
|
37
|
-
* ② 否则 → 内嵌 `systemPrompt`(兼容旧配置)
|
|
38
|
-
* ③ 都无 → 空字符串
|
|
39
|
-
* 文件缺失/逃逸 → 抛错(调用方 catch 降级 + validate 报 issue)。
|
|
40
|
-
* 懒读取:readSkiffRoles 不读文件(guards/seams 每次工具调用查询的热路径零 IO),
|
|
41
|
-
* 仅在本函数(创建 agent / validate / list 时)读取。
|
|
42
|
-
*/
|
|
43
|
-
export declare function resolveRoleSystemPrompt(root: string, role: SkiffRoleConfig | undefined): string;
|
|
44
|
-
/** 角色系统提示词来源(validate/list 展示用) */
|
|
45
|
-
export declare function systemPromptSource(role: SkiffRoleConfig | undefined): 'file' | 'inline' | 'none';
|
|
46
|
-
/**
|
|
47
|
-
* 角色类型(v1.30.15,S142 用户拍板):
|
|
48
|
-
* - 显式 `role.kind` 优先(`temporary` / `persistent`)
|
|
49
|
-
* - 缺省 = 隐式推断:调用方给出**稳定 sessionId** → persistent;否则 temporary
|
|
50
|
-
* (存量配置零迁移;微信桥传固定会话 id → persistent,调试页随机 id → temporary)
|
|
51
|
-
*/
|
|
52
|
-
type SkiffKind = 'temporary' | 'persistent';
|
|
53
|
-
export declare function resolveSkiffKind(role: SkiffRoleConfig | undefined, hasStableId: boolean): SkiffKind;
|
|
54
|
-
/**
|
|
55
|
-
* 角色提示词**读取器**(v1.30.15,方案 A:长期型热更新)。
|
|
56
|
-
*
|
|
57
|
-
* 为什么是函数而不是字符串(R↓):旧实现 `createSkiffAgent` 在创建时把
|
|
58
|
-
* `resolveRoleSystemPrompt(...)` 的结果**快照**进系统提示词段闭包 → CCC 改了
|
|
59
|
-
* `<role>.md` 必须重启 dsh web 才生效(本轮实证:改完 18KB 提示词,live agent 仍用旧文本)。
|
|
60
|
-
* 现形态返回一个读取函数,由系统提示词段的 `text()` **每轮调用**:
|
|
61
|
-
* - `systemPromptFile`:按 **mtime + size** 缓存重读(命中缓存零 IO;未变不解析)
|
|
62
|
-
* → 改文件即生效,**无需重启**;变更时打一行 info 日志(可观测,便于确认热更生效)
|
|
63
|
-
* - 内嵌 `systemPrompt`:静态(JSON 配置改动仍需重启/重载配置)
|
|
64
|
-
* - 读取失败:返回**上次成功内容**(绝不返回空——空提示词会让角色失去人格与纪律),
|
|
65
|
-
* 并按标签去重告警一次
|
|
66
|
-
* @param root CCC 根
|
|
67
|
-
* @param role 角色配置
|
|
68
|
-
*/
|
|
69
|
-
export declare function createRolePromptReader(root: string, role: SkiffRoleConfig | undefined): () => string;
|
|
70
|
-
/**
|
|
71
|
-
* Skiff 基础提示词(dsp 只给这部分;CCC 的 systemPrompt 段由调用方拼接)。
|
|
72
|
-
*
|
|
73
|
-
* ## 🔴 为什么**不再枚举**清单(owner 2026-10-19 令)
|
|
74
|
-
*
|
|
75
|
-
* 旧版在这里抄了两份清单(`MSMs: a, b, c` / `Tools: read, grep, …`)。那是**第二真相源**,
|
|
76
|
-
* 而真相源本来就在模型自己手里:
|
|
77
|
-
* · **工具清单** = 这一轮实际注册给它的 tool schema —— 模型已经看得见,抄一遍只会漂
|
|
78
|
-
* · **MSM 清单** = `msm()` 无参调用返回的目录 —— 已按角色白名单过滤,且**每次实时读配置**
|
|
79
|
-
*
|
|
80
|
-
* ⚠️ **漂移不是理论风险,是已发生的缺陷**(2026-10-19):角色配置早就长到 8 个工具,
|
|
81
|
-
* 而这个函数是从**创建时冻结的 role 快照**求值的 ⇒ 提示词里一直写着旧的 4 个
|
|
82
|
-
* ⇒ 模型照着提示词办事,**它自己以为没有的能力就不去调** ⇒ 症状是"工具用不了",
|
|
83
|
-
* 而守卫那边(每调用实时读配置)其实是放行的。两个真相源打架,输的总是提示词。
|
|
84
|
-
*
|
|
85
|
-
* ⇒ 现在只声明**边界与发现路径**,不抄内容:清单在哪,怎么取,越界会怎样。
|
|
86
|
-
*
|
|
87
|
-
* @param roleName 角色名(CCC 定义;用于身份声明)
|
|
88
|
-
*/
|
|
89
|
-
export declare function buildSkiffBasePrompt(roleName: string): string;
|
package/lib/tools/cc-fs.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* cc-fs.ts — container_fs 真实 DSH 工具定义(defineTool)(v1.30:cc_fs → container_fs)
|
|
3
|
-
*
|
|
4
|
-
* 进程内注册(取代 v0.1 的 bash spawn runner):zod/schemastery 参数校验、
|
|
5
|
-
* 规范 JSON 输出、纯 render 投影。逻辑在 fs-ops.ts(可单测)。
|
|
6
|
-
*/
|
|
7
|
-
export declare const ccFsTool: import("@deepseek-ai/dsh-tools").ToolDefinition;
|
package/lib/tools/git.d.ts
DELETED