@shgroup/dsh-serenity-hooks 1.63.2 → 1.65.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 +15 -15
- package/dsh.plugin.json +3 -3
- package/lib/{ccc-B0ZGL9lx.js → ccc-C33QWoWZ.js} +3 -3
- package/lib/{ccc-roots-GIJ3A_tw.js → ccc-roots-RMzGU-CJ.js} +2 -2
- package/lib/ccc.d.ts +15 -50
- package/lib/client.js +0 -23
- package/lib/{trajectory-assistant.d.ts → cognitive-trajectory-assistant.d.ts} +9 -9
- package/lib/{trajectory-bound.d.ts → cognitive-trajectory-bound.d.ts} +10 -10
- package/lib/{trajectory-ops.d.ts → cognitive-trajectory-ops.d.ts} +6 -6
- package/lib/{trajectory-skills.d.ts → cognitive-trajectory-skills.d.ts} +8 -8
- package/lib/cro-log.d.ts +2 -2
- package/lib/cro.d.ts +1 -1
- package/lib/host/contract.d.ts +1 -1
- package/lib/index.d.ts +1 -5
- package/lib/index.js +245 -919
- package/lib/invariant.d.ts +1 -1
- package/lib/invariant.js +1 -1
- package/lib/json.d.ts +1 -1
- package/lib/{localstore-ops-DMs_ovHo.js → localstore-ops-ylQoPz1Q.js} +1 -1
- package/lib/{message-source-B4P3Uw6D.js → message-source--2veY0JU.js} +17 -17
- package/lib/output-guard-seam.d.ts +5 -3
- package/lib/output-guard.d.ts +1 -1
- package/lib/rebuild.d.ts +2 -2
- package/lib/seams/keeper.d.ts +6 -6
- package/lib/seams/system-prompt.d.ts +1 -1
- package/lib/{settings-section-DGUQZo5j.js → settings-section-B1YzjFz6.js} +1 -3
- package/lib/settings-section.d.ts +0 -10
- package/lib/skiff-core.d.ts +10 -10
- package/lib/skiff-debug.d.ts +1 -1
- package/lib/{skiff-role-B615L9MV.js → skiff-role-Boc4SKct.js} +14 -14
- package/lib/skiff-role.d.ts +4 -4
- package/lib/skills/resource-index.d.ts +1 -1
- package/lib/skills-discovery.d.ts +1 -1
- package/lib/tools/{trajectory.d.ts → cognitive-trajectory.d.ts} +7 -7
- package/lib/tools/skiff-admin.d.ts +1 -1
- package/lib/usage-stats.d.ts +1 -1
- package/lib/wake-registry.d.ts +5 -5
- package/lib/wake-scheduler.d.ts +5 -5
- package/lib/weixin-bridge.d.ts +1 -1
- package/lib/{weixin-route-Aheyq3fN.js → weixin-route-BoSC-uPp.js} +2 -2
- package/package.json +2 -2
- package/lib/unattended-ops.d.ts +0 -249
- package/lib/unattended-seam.d.ts +0 -49
package/lib/invariant.d.ts
CHANGED
|
@@ -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", "
|
|
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
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-
|
|
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-
|
|
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,13 +87,13 @@ 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):本文件只服务 `
|
|
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)**同批删除**——
|
|
@@ -101,7 +101,7 @@ function localIdStamp(value = Date.now()) {
|
|
|
101
101
|
* list(含 summarize 仪表盘)、show、use(激活 + 绑定)、以及供 list 用的 summarize。
|
|
102
102
|
* 「完成」不再由 close 写入,而是从 SESSION.md 的 `[x]` 推导;归档走 `container_fs mv`。
|
|
103
103
|
*/
|
|
104
|
-
const
|
|
104
|
+
const COGNITIVE_TRAJECTORY_ACTIONS = [
|
|
105
105
|
"list",
|
|
106
106
|
"show",
|
|
107
107
|
"create",
|
|
@@ -463,7 +463,7 @@ function extractSessionMdPathFromText(text) {
|
|
|
463
463
|
const m = text.match(SESSION_MD_PATH_RE);
|
|
464
464
|
if (!m) return null;
|
|
465
465
|
let p = m[1].trim();
|
|
466
|
-
const suffix = p.search(/ \(the trajectory's persistent body/);
|
|
466
|
+
const suffix = p.search(/ \(the cognitive trajectory's persistent body/);
|
|
467
467
|
if (suffix > 0) p = p.slice(0, suffix).trim();
|
|
468
468
|
return p;
|
|
469
469
|
}
|
|
@@ -533,16 +533,16 @@ function summarize(root) {
|
|
|
533
533
|
return ` ${s.status.completed ? "✓" : "○"} ${s.dirName} (${age}d ago)`;
|
|
534
534
|
})
|
|
535
535
|
];
|
|
536
|
-
if (stale > 0) lines.push("", "⚠ Warning: stale trajectories present (no activity > 7d) — see the list above for detail.");
|
|
536
|
+
if (stale > 0) lines.push("", "⚠ Warning: stale cognitive trajectories present (no activity > 7d) — see the list above for detail.");
|
|
537
537
|
return lines.join("\n");
|
|
538
538
|
}
|
|
539
539
|
//#endregion
|
|
540
|
-
//#region src/trajectory-bound.ts
|
|
540
|
+
//#region src/cognitive-trajectory-bound.ts
|
|
541
541
|
/**
|
|
542
|
-
* trajectory-bound.ts — SESSION 绑定持久化(CCC 内 `AGENT_SESSIONS/.bindings.json`)
|
|
542
|
+
* cognitive-trajectory-bound.ts — SESSION 绑定持久化(CCC 内 `AGENT_SESSIONS/.bindings.json`)
|
|
543
543
|
*
|
|
544
544
|
* 目标(S142 用户拍板,方案 v1.0):让「dsh 会话(载体)↔ SESSION(宁静号轨迹)」
|
|
545
|
-
* 的绑定坚固——LLM 不能因智力因素(幻觉/理解偏差)在过程中或
|
|
545
|
+
* 的绑定坚固——LLM 不能因智力因素(幻觉/理解偏差)在过程中或 cognitive_trajectory rebuild 后
|
|
546
546
|
* 自行更换 SESSION。
|
|
547
547
|
*
|
|
548
548
|
* 存储形态(v1.30.6 起,S142 review F-01):绑定**不再写入 dsh 会话日志**。
|
|
@@ -776,12 +776,12 @@ function readLastBound(session) {
|
|
|
776
776
|
return readLegacyBoundFromEvents(session);
|
|
777
777
|
}
|
|
778
778
|
/** 目录名 → 轨迹标签(`--S###--` 命中取 `S###`;未命中原样返回——编码无关 U4) */
|
|
779
|
-
function
|
|
779
|
+
function cognitiveTrajectoryLabel(dirName) {
|
|
780
780
|
const m = dirName.match(/--S(\d{3,})--/);
|
|
781
781
|
return m ? `S${m[1]}` : dirName;
|
|
782
782
|
}
|
|
783
783
|
/**
|
|
784
|
-
* **调用方自身**所属 trajectory 的标签(审计字段 `createdBy` 的唯一正解)。
|
|
784
|
+
* **调用方自身**所属 cognitive trajectory 的标签(审计字段 `createdBy` 的唯一正解)。
|
|
785
785
|
*
|
|
786
786
|
* 三级来源,逐级回退(R↓:为什么不用单一来源):
|
|
787
787
|
* 1. `readLastBound(session)` —— **持久 bound**,权威(重启存活、不受别的会话激活污染)
|
|
@@ -789,7 +789,7 @@ function trajectoryLabel(dirName) {
|
|
|
789
789
|
* 3. `getLastActiveSessionInfo()` —— **全局**最近激活指针(无绑定的会话兼容回退)
|
|
790
790
|
*
|
|
791
791
|
* ⚠️ 为何单列成本函数(S142 §30.12.1 实测缺陷):唤醒注册表的 `createdBy` 原先直接取第 3 级
|
|
792
|
-
* 全局指针,而它记录的是"**进程内最近一次被激活的 trajectory**"——多会话并发时必然张冠李戴
|
|
792
|
+
* 全局指针,而它记录的是"**进程内最近一次被激活的 cognitive trajectory**"——多会话并发时必然张冠李戴
|
|
793
793
|
* (实测:S142 登记唤醒被写成 `by=S060`)。`createdBy` 是 D60「以可审计替代入口栅」的**唯一凭证**,
|
|
794
794
|
* 失真即替代控制失效 ⇒ 必须以"调用方自己是谁"为准,全局指针只作最后兜底。
|
|
795
795
|
*
|
|
@@ -797,15 +797,15 @@ function trajectoryLabel(dirName) {
|
|
|
797
797
|
* @param scope 调用方 dsh 会话 id(取不到传空串)
|
|
798
798
|
* @returns 轨迹标签(`S###` 或完整目录名);三级全落空 → 空串(渲染为 `?`)
|
|
799
799
|
*/
|
|
800
|
-
function
|
|
800
|
+
function resolveSessionCognitiveTrajectoryLabel(session, scope) {
|
|
801
801
|
const bound = session ? readLastBound(session) : null;
|
|
802
|
-
if (bound?.dirName) return
|
|
802
|
+
if (bound?.dirName) return cognitiveTrajectoryLabel(bound.dirName);
|
|
803
803
|
const scoped = scope !== "" ? getActiveSessionInfo(scope) : null;
|
|
804
804
|
if (scoped) return scoped.sessionId;
|
|
805
805
|
return getLastActiveSessionInfo()?.sessionId ?? "";
|
|
806
806
|
}
|
|
807
807
|
/**
|
|
808
|
-
* 反向查:绑定到某 trajectory 目录名的 dsh 会话 id(**按绑定时间倒序,最新在前**)。
|
|
808
|
+
* 反向查:绑定到某 cognitive trajectory 目录名的 dsh 会话 id(**按绑定时间倒序,最新在前**)。
|
|
809
809
|
*
|
|
810
810
|
* 用途(wake-scheduler 冷唤醒):.bindings.json 以 **sessionId 为键**,而唤醒条目的
|
|
811
811
|
* target 是**目录名**——需要值侧扫描做反向索引。冷会话被唤醒时必须先知道"哪个 dsh
|
|
@@ -965,4 +965,4 @@ const ACC_MESSAGE_KIND = "plugin:dsh-serenity-hooks";
|
|
|
965
965
|
/** ACC 注入消息的统一来源值(各缝共用;需要 `form` 时按 `ContextFormed` 另加字段)。 */
|
|
966
966
|
const PLUGIN_SOURCE = { kind: ACC_MESSAGE_KIND };
|
|
967
967
|
//#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,
|
|
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, COGNITIVE_TRAJECTORY_ACTIONS as l, findSession as m, PLUGIN_SOURCE as n, readLastBound as o, extractSessionMdPathFromText as p, appendBound as r, resolveSessionCognitiveTrajectoryLabel as s, ACC_MESSAGE_KIND as t, DEFAULT_SESSION_SCOPE as u, parseSessionContextFromEvents as v, showSession as w, sessionEvents as x, readActiveSessionMd 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/
|
|
11
|
+
* (dsh-serenity-hooks/cognitive_trajectory rebuild/mech-registry),打回会瘫痪自身工作。
|
|
12
12
|
*
|
|
13
13
|
* 🔴 **2026-10-15 补注(面 E 退役)**:`acp-` 前缀分支**已成孤儿,但本批不动**。
|
|
14
14
|
* 判据(两条,实测):① **该前缀从来没有生产者** —— 历史 `acp-core.ts` 建会话走的是
|
|
@@ -20,8 +20,10 @@
|
|
|
20
20
|
import type { Context } from 'cordis';
|
|
21
21
|
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
22
22
|
/** 读会话最后一个 assistant/message 文本(skiff-core 同款)
|
|
23
|
-
* **
|
|
24
|
-
*
|
|
23
|
+
* **v1.63.3 起唯一的导出理由消失**:原导出是给 `unattended-seam.ts` 复用的(D77),
|
|
24
|
+
* 该文件已随无人值守功能整条退役 ⇒ 现只有本模块自己用(`isLeak` 的调用点)。
|
|
25
|
+
* ⚠️ 保持 `export` 无害(它有测试覆盖,且将来"同一读法只留一份"的纪律仍成立),
|
|
26
|
+
* 但**不要**再写成"为了 X 复用才导出"——那个 X 不存在了。
|
|
25
27
|
* **v1.27.7:剥离 think 块再检测**(用户:"不检查think内容(因为不输出)")——
|
|
26
28
|
* ` think…` 是模型思考过程,不进入用户可见输出;敏感词检测只针对**最终呈现文本**,
|
|
27
29
|
* 否则 think 内提及内部机制词(思考过程必然推演机制)会误打回。复用 stripThink
|
package/lib/output-guard.d.ts
CHANGED
|
@@ -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)超限重建:
|
|
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
|
-
* 报错引导用户显式 `
|
|
83
|
+
* 报错引导用户显式 `cognitive_trajectory use`(响亮失败优于静默接错)。
|
|
84
84
|
* 备选:④ 仅在"同 scope 确无绑定"时兜底——同样会接错轨迹,故不采纳。
|
|
85
85
|
*
|
|
86
86
|
* 每候选 resolve 后 existsSync 校验(相对路径按 root 解析);全部失败返回 null → 调用方报错引导。
|
package/lib/seams/keeper.d.ts
CHANGED
|
@@ -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,持续注入直到调用
|
|
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`(`
|
|
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
|
|
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 超限(`
|
|
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
|
|
131
|
+
export declare function registerCognitiveTrajectorySkillSection(agent: Agent, root: string): boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as hostSettings } from "./ccc-roots-
|
|
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";
|
|
@@ -123,7 +123,6 @@ function defaultSimpleSettings() {
|
|
|
123
123
|
skiffEnabled: false,
|
|
124
124
|
skiffDebugPort: SKIFF_DEBUG_PORT,
|
|
125
125
|
croEnabled: true,
|
|
126
|
-
unattendedEnabled: false,
|
|
127
126
|
diagramEnabled: false,
|
|
128
127
|
acpFaceEnabled: false,
|
|
129
128
|
acpFacePort: ACP_PORT,
|
|
@@ -221,7 +220,6 @@ function simpleSettingsFromConfig(config) {
|
|
|
221
220
|
skiffEnabled: unwrapVolatile(config.skiffEnabled) ?? config.skiff?.enabled ?? d.skiffEnabled,
|
|
222
221
|
skiffDebugPort: unwrapVolatile(config.skiffDebugPort) ?? config.skiff?.debugPort ?? d.skiffDebugPort,
|
|
223
222
|
croEnabled: unwrapVolatile(config.croEnabled) ?? d.croEnabled,
|
|
224
|
-
unattendedEnabled: unwrapVolatile(config.unattendedEnabled) ?? d.unattendedEnabled,
|
|
225
223
|
diagramEnabled: unwrapVolatile(config.diagramEnabled) ?? config.diagram?.enabled ?? d.diagramEnabled,
|
|
226
224
|
acpFaceEnabled: unwrapVolatile(config.acpFaceEnabled) ?? config.acpFace?.enabled ?? d.acpFaceEnabled,
|
|
227
225
|
acpFacePort: unwrapVolatile(config.acpFacePort) ?? config.acpFace?.port ?? d.acpFacePort,
|
|
@@ -83,7 +83,6 @@ interface SimpleConfigFragment {
|
|
|
83
83
|
skiffEnabled?: PanelBoolean;
|
|
84
84
|
skiffDebugPort?: PanelNumber;
|
|
85
85
|
croEnabled?: PanelBoolean;
|
|
86
|
-
unattendedEnabled?: PanelBoolean;
|
|
87
86
|
diagramEnabled?: PanelBoolean;
|
|
88
87
|
/** 🔴 面 E(官方 ACP,2026-10-16):开关 + 端口(面板层扁平键) */
|
|
89
88
|
acpFaceEnabled?: PanelBoolean;
|
|
@@ -114,15 +113,6 @@ interface SerenitySimpleSettings {
|
|
|
114
113
|
* **只关 CRO 阶段**:`send-later` / `send-now` / 唤醒表投递**照常**。
|
|
115
114
|
* ⚠️ 与它**同时废止**的键:`wakeSchedulerEnabled`(唤醒调度器现恒开、无闸;旧键静默忽略)。 */
|
|
116
115
|
croEnabled: boolean;
|
|
117
|
-
/** **无人值守代理回复(unattended proxy)总开关**(2026-09-23 所有者令新增;**缺省关**)。
|
|
118
|
-
*
|
|
119
|
-
* 开启后:CCC 会话**被 LLM 主动停止**且无人应答时,ACC 注入一次**代理用户的结构化回复**,
|
|
120
|
-
* 以**验证码(nonce)**作「合法收束」判据 —— **未回码 ⇒ 继续,回码 ⇒ 放过**。
|
|
121
|
-
* **缺省关**:它把**人**从回路里拿掉(失败模式是静默的)。
|
|
122
|
-
* **排除面**:仅有 CRO 程序的轨迹不适用(所有者 2026-09-23 裁决:口径由"宽"改"窄"
|
|
123
|
-
* —— 原"任何自排唤醒都排除"会让本机制永远够不着靠续接绳活着的维护会话;改窄后
|
|
124
|
-
* **自排绳不再排除**,绳退化为**长周期保险丝**)。设计全文见 S142 的 **D77**。 */
|
|
125
|
-
unattendedEnabled: boolean;
|
|
126
116
|
/** **diagram 工具总开关**(2026-09-29 owner 具名令 **D104**;**缺省关**)。
|
|
127
117
|
*
|
|
128
118
|
* 开启后:ACC 注册 `diagram` 工具 —— agent **直接给一段标签格式源码**,进程内
|
package/lib/skiff-core.d.ts
CHANGED
|
@@ -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
|
-
* 自动绑定已生效(无需
|
|
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
|
|
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` 把 `
|
|
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 能力(
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
125
|
+
includeCognitiveTrajectory?: boolean;
|
|
126
126
|
}): Promise<SkiffAskResult>;
|
|
127
127
|
/**
|
|
128
128
|
* Skiff 会话的轨迹纪律参与判定:非 skiff 会话恒 true(正常参与);
|
|
129
|
-
* skiff 会话按角色
|
|
129
|
+
* skiff 会话按角色 cognitiveTrajectory 子集(session/keeper/rebuild)决定;
|
|
130
130
|
* 注册表缺失(进程重启遗留等)→ 保守旁路(false,完全独立)。
|
|
131
131
|
*/
|
|
132
|
-
export declare function
|
|
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;
|
package/lib/skiff-debug.d.ts
CHANGED
|
@@ -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,
|
|
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-
|
|
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
|
-
|
|
52
|
-
session: role.
|
|
53
|
-
keeper: role.
|
|
54
|
-
rebuild: role.
|
|
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
|
|
65
|
+
function cognitiveTrajectorySubset(role) {
|
|
66
66
|
return {
|
|
67
|
-
session: role?.
|
|
68
|
-
keeper: role?.
|
|
69
|
-
rebuild: role?.
|
|
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 {
|
|
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 };
|
package/lib/skiff-role.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* skiff-role.ts — Skiff(F4,v1.25.0 实验性)角色层纯逻辑(零 DSH 依赖,可独立单测)
|
|
3
3
|
*
|
|
4
|
-
* 概念(S142 用户拍板):Skiff = 完整宁静号 trajectory(在宁静号内全知全能)的
|
|
4
|
+
* 概念(S142 用户拍板):Skiff = 完整宁静号 cognitive trajectory(在宁静号内全知全能)的
|
|
5
5
|
* **任意子集**——CCC 通过角色配置定义:能力面(tools 非 MSM 工具白名单 + msms
|
|
6
|
-
* MSM 白名单,双白名单独立,白名单外全隐藏)+ 轨迹纪律面(trajectory 子集)+
|
|
6
|
+
* MSM 白名单,双白名单独立,白名单外全隐藏)+ 轨迹纪律面(cognitive trajectory 子集)+
|
|
7
7
|
* 系统提示词(CCC 完整定义,dsp 只给基础部分)。
|
|
8
8
|
*
|
|
9
9
|
* 实验性质:未配置任何角色 → Skiff 完全零影响(无监听、无 agent 创建、guard 无规则)。
|
|
@@ -20,12 +20,12 @@ export declare function isSkiffSessionId(sessionId: string | undefined): boolean
|
|
|
20
20
|
*/
|
|
21
21
|
export declare function readSkiffRoles(root: string, paths?: string[]): Map<string, SkiffRoleConfig>;
|
|
22
22
|
/** 某角色的轨迹纪律子集(缺省全 false = 完全独立) */
|
|
23
|
-
interface
|
|
23
|
+
interface SkiffCognitiveTrajectorySubset {
|
|
24
24
|
session: boolean;
|
|
25
25
|
keeper: boolean;
|
|
26
26
|
rebuild: boolean;
|
|
27
27
|
}
|
|
28
|
-
export declare function
|
|
28
|
+
export declare function cognitiveTrajectorySubset(role: SkiffRoleConfig | undefined): SkiffCognitiveTrajectorySubset;
|
|
29
29
|
/** 角色可用工具面(白名单并集):tools + msm(msms 非空时作为 MSM 通道自动可用) */
|
|
30
30
|
export declare function roleToolWhitelist(role: SkiffRoleConfig | undefined): Set<string>;
|
|
31
31
|
/** 角色允许的 MSM 白名单(msm 工具 exec 校验 / 过滤用;独立于 tools 白名单) */
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
*
|
|
31
31
|
* 🔴 **两个面,两个入口**(2026-10-12 增;owner 裁决 O2)—— 同源、但成本形态不同:
|
|
32
32
|
* · **载入面** `buildResourceIndex()` —— 完整索引(名字 + 首标题 + 字节),带 `.md` 文件头读取;
|
|
33
|
-
* 在三条路径上各附一次:入口段(`system-prompt.ts` order −50)/轨迹段(`trajectory-skills.ts`
|
|
33
|
+
* 在三条路径上各附一次:入口段(`system-prompt.ts` order −50)/轨迹段(`cognitive-trajectory-skills.ts`
|
|
34
34
|
* order −45)/目录 provider 的 `get()`(`opencode-skills.ts`)。
|
|
35
35
|
* · **目录面** `buildResourceNameSuffix()` —— **只有名字**,**不读任何正文**;只挂一处:
|
|
36
36
|
* 目录 provider 的 `list()`(`available_skills` 的 `SkillSummary.description`)。
|
|
@@ -24,7 +24,7 @@ interface EntrySkill {
|
|
|
24
24
|
/**
|
|
25
25
|
* 防穿越:skill 名必须是简单目录名(拒绝分隔符与 `..`/`.` 路径段)。
|
|
26
26
|
* v1.34.1:导出——轨迹 skill 声明(CCC 数据)的名字也要**先过这一关**才能用于拼路径
|
|
27
|
-
* (规格 `docs/trajectory-skill-injection.md` §3「名字安全(必做)」)。
|
|
27
|
+
* (规格 `docs/cognitive-trajectory-skill-injection.md` §3「名字安全(必做)」)。
|
|
28
28
|
*/
|
|
29
29
|
export declare function isSafeSkillName(name: string): boolean;
|
|
30
30
|
/**
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* trajectory.ts — `
|
|
2
|
+
* trajectory.ts — `cognitive_trajectory` 真实 DSH 工具定义(defineTool)
|
|
3
3
|
*
|
|
4
4
|
* v1.33(S142 §32 用户裁决):由 `logbook` **更名并收敛为 `trajectory`**(v1.34:工具名再硬切为
|
|
5
|
-
* `container_trajectory`,无别名)——trajectory 是一等概念
|
|
5
|
+
* `container_trajectory`,无别名)——cognitive trajectory 是一等概念
|
|
6
6
|
* (SESSION.md 是它的持久身体),本工具管它的**载体生命周期 + 一次性时间安排**。
|
|
7
7
|
* 动作面现行 **8 个**:list / show / create / use / rebuild / **`send-now`** / **`send-later`** / **`cro-guide`**。
|
|
8
8
|
* 🔴 2026-09-16(所有者裁决):**第 7 个动作 `send-message`(即时投递)**
|
|
9
9
|
* ——与 `wake-later` 共用取用通路,差别只在**时刻**(现在 vs 未来)与**回执**(有 vs 无);
|
|
10
10
|
* 实现落在 `wake-scheduler.ts` 的 `sendToTrajectory()`("怎么把一句话送到一条轨迹"是调度器的知识)。
|
|
11
|
-
* 设计稿 = `docs/trajectory-send-message-design.md`(v0.2 定稿)。
|
|
11
|
+
* 设计稿 = `docs/cognitive-trajectory-send-message-design.md`(v0.2 定稿)。
|
|
12
12
|
* 🔴 2026-09-17(所有者裁决 · **命名 A 案**):**两个投递动作更名** —— `wake-later` → **`send-later`**、
|
|
13
13
|
* `send-message` → **`send-now`**。判据(R↓):两者本是**同一条投递通路**(同取用机制 / 同载荷 /
|
|
14
14
|
* 同落点语义),只差**时刻**;而「唤醒(冷载入)」是**两条路径共有**的属性,不配做区分
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* 归档能力由 `container_fs mv → _archived/` 承担
|
|
28
28
|
* · `hook-develop-guide` → **淘汰**(v1.34.1:SEP 整体废除——「能落 harness 已有原语,
|
|
29
29
|
* 就不要自造协议 + 脚本管道」;轨迹挂哪些 skill 改由 SESSION.md frontmatter 声明 +
|
|
30
|
-
* `systemPrompt.section` 注入,见 `docs/trajectory-skill-injection.md`)
|
|
30
|
+
* `systemPrompt.section` 注入,见 `docs/cognitive-trajectory-skill-injection.md`)
|
|
31
31
|
* · autopilot 面(all/init/random/diag/doc/check/status/guide)→ `container_admin` 的 autopilot 域
|
|
32
32
|
* · `wake-add`/`wake-list`/`wake-rm` → **`wake-later`**(v1.33 收敛;**2026-09-17 更名 `send-later`**)
|
|
33
33
|
* · 2026-09-20(CRO 落地):新增 **`cro-guide`** —— CRO 编写指南的出口(纯读)。
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
*/
|
|
40
40
|
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
41
41
|
import type { Context } from 'cordis';
|
|
42
|
-
import { type ActiveSessionInfo, type CreateSessionResult } from '../trajectory-ops.js';
|
|
42
|
+
import { type ActiveSessionInfo, type CreateSessionResult } from '../cognitive-trajectory-ops.js';
|
|
43
43
|
interface RenameOnUseDeps {
|
|
44
44
|
/** sessionTitle 服务可用性 */
|
|
45
45
|
sessionTitleAvailable: boolean;
|
|
@@ -88,8 +88,8 @@ export declare function renameDshSessionForActive(ctx: Context, exec: {
|
|
|
88
88
|
};
|
|
89
89
|
}, info: ActiveSessionInfo, summary?: string): void;
|
|
90
90
|
/**
|
|
91
|
-
* 创建 trajectory 工具(原 logbook;v1.33 S142 §32 更名 + 动作收敛)。
|
|
91
|
+
* 创建 cognitive trajectory 工具(原 logbook;v1.33 S142 §32 更名 + 动作收敛)。
|
|
92
92
|
* 闭包捕获插件 ctx → use 后可调 ctx.sessionTitle.rename。
|
|
93
93
|
*/
|
|
94
|
-
export declare function
|
|
94
|
+
export declare function createCognitiveTrajectoryTool(ctx: Context): ReturnType<typeof defineTool>;
|
|
95
95
|
export {};
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import type { JsonValue } from '../json.js';
|
|
11
11
|
/** Skiff 定义教程(核心):概念 / schema / 认知 MSM 写法 / 双白名单 / 轨迹纪律 / 示例角色 */
|
|
12
|
-
export declare const SKIFF_GUIDE = "\u2550\u2550\u2550 Skiff Definition Guide (F4, experimental) \u2550\u2550\u2550\n\nSkiff = \u5B81\u9759\u53F7\u653E\u51FA\u7684\u72EC\u7ACB\u5C0F\u8247\u2014\u2014\u5B8C\u6574 trajectory\uFF08\u5728\u5B81\u9759\u53F7\u5185\u5168\u77E5\u5168\u80FD\uFF09\u7684**\u4EFB\u610F\u5B50\u96C6\u89D2\u8272**\u3002\n\u7531\u672C CCC\uFF08.opencode/serenity.json skiff.roles\uFF09\u5B9A\u4E49\uFF1A\u80FD\u529B\u9762\uFF08\u53CC\u767D\u540D\u5355\uFF09+ \u8F68\u8FF9\u7EAA\u5F8B\u5B50\u96C6 + \u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002\ndsp \u53EA\u63D0\u4F9B\u673A\u5236\uFF08\u53CC\u767D\u540D\u5355\u5F3A\u5236 + \u57FA\u7840\u63D0\u793A\u8BCD + \u8C03\u8BD5\u95EE\u7B54\u9875\uFF09\uFF1B\u89D2\u8272\u5185\u5BB9\u5B8C\u5168\u7531 CCC \u53D1\u6325\u3002\n\n\u2500\u2500 \u89D2\u8272\u914D\u7F6E schema \u2500\u2500\n { \"skiff\": { \"roles\": {\n \"<role-name>\": {\n \"model\": \"provider/model\", // \u89D2\u8272\u6A21\u578B\uFF08CCC \u76F4\u63A5\u6307\u5B9A\uFF0C\u65E0\u767D\u540D\u5355\u6821\u9A8C\uFF1B\u7F3A\u7701\u56DE\u9000 cheap-worker.defaultModel\uFF09\n \"msms\": [\"msm-a\", \"msm-b\"], // MSM \u767D\u540D\u5355\uFF08\u72EC\u7ACB\uFF09\uFF1Amsm \u5DE5\u5177\u53EA\u80FD\u6267\u884C\u8FD9\u4E9B\uFF1Bregister/deregister \u5FC5\u62D2\n \"tools\": [\"read\",\"grep\",\"glob\",...], // \u975E MSM \u5DE5\u5177\u767D\u540D\u5355\uFF08\u72EC\u7ACB\uFF09\uFF1A\u767D\u540D\u5355\u5916\u5DE5\u5177\u4E00\u5F8B\u4E0D\u53EF\u7528\uFF08guard \u5F3A\u5236\uFF09\n \"
|
|
12
|
+
export declare const SKIFF_GUIDE = "\u2550\u2550\u2550 Skiff Definition Guide (F4, experimental) \u2550\u2550\u2550\n\nSkiff = \u5B81\u9759\u53F7\u653E\u51FA\u7684\u72EC\u7ACB\u5C0F\u8247\u2014\u2014\u5B8C\u6574 cognitive trajectory\uFF08\u5728\u5B81\u9759\u53F7\u5185\u5168\u77E5\u5168\u80FD\uFF09\u7684**\u4EFB\u610F\u5B50\u96C6\u89D2\u8272**\u3002\n\u7531\u672C CCC\uFF08.opencode/serenity.json skiff.roles\uFF09\u5B9A\u4E49\uFF1A\u80FD\u529B\u9762\uFF08\u53CC\u767D\u540D\u5355\uFF09+ \u8F68\u8FF9\u7EAA\u5F8B\u5B50\u96C6 + \u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002\ndsp \u53EA\u63D0\u4F9B\u673A\u5236\uFF08\u53CC\u767D\u540D\u5355\u5F3A\u5236 + \u57FA\u7840\u63D0\u793A\u8BCD + \u8C03\u8BD5\u95EE\u7B54\u9875\uFF09\uFF1B\u89D2\u8272\u5185\u5BB9\u5B8C\u5168\u7531 CCC \u53D1\u6325\u3002\n\n\u2500\u2500 \u89D2\u8272\u914D\u7F6E schema \u2500\u2500\n { \"skiff\": { \"roles\": {\n \"<role-name>\": {\n \"model\": \"provider/model\", // \u89D2\u8272\u6A21\u578B\uFF08CCC \u76F4\u63A5\u6307\u5B9A\uFF0C\u65E0\u767D\u540D\u5355\u6821\u9A8C\uFF1B\u7F3A\u7701\u56DE\u9000 cheap-worker.defaultModel\uFF09\n \"msms\": [\"msm-a\", \"msm-b\"], // MSM \u767D\u540D\u5355\uFF08\u72EC\u7ACB\uFF09\uFF1Amsm \u5DE5\u5177\u53EA\u80FD\u6267\u884C\u8FD9\u4E9B\uFF1Bregister/deregister \u5FC5\u62D2\n \"tools\": [\"read\",\"grep\",\"glob\",...], // \u975E MSM \u5DE5\u5177\u767D\u540D\u5355\uFF08\u72EC\u7ACB\uFF09\uFF1A\u767D\u540D\u5355\u5916\u5DE5\u5177\u4E00\u5F8B\u4E0D\u53EF\u7528\uFF08guard \u5F3A\u5236\uFF09\n \"cognitiveTrajectory\": { \"session\": false, \"keeper\": false, \"rebuild\": false }, // \u8F68\u8FF9\u7EAA\u5F8B\u5B50\u96C6\uFF08\u7F3A\u7701\u5168\u5173 = \u5B8C\u5168\u72EC\u7ACB\uFF09\n // \u89D2\u8272\u4EBA\u683C/\u8BA4\u77E5\u8FB9\u754C/\u98CE\u683C\uFF08CCC \u5B8C\u6574\u5B9A\u4E49\uFF1Bdsp \u53EA\u7ED9\u57FA\u7840\u63D0\u793A\u8BCD\uFF09\n \"systemPromptFile\": \".opencode/skiff/<role>.md\" // \u2605 \u63A8\u8350\uFF1A\u5F15\u7528 md \u6587\u4EF6\uFF08\u76F8\u5BF9 CCC \u6839\uFF1B\u8D85\u957F\u63D0\u793A\u8BCD\u5728 JSON \u5185\u5D4C\u4E0D\u53EF\u8BFB\uFF09\n // \"systemPrompt\": \"...\" // \u517C\u5BB9\uFF1A\u5185\u5D4C\u5B57\u7B26\u4E32\u4ECD\u53EF\u7528\uFF1B\u4E24\u8005\u90FD\u8BBE\u65F6 systemPromptFile \u4F18\u5148\n }\n } } }\n\n\u2500\u2500 \u53CC\u767D\u540D\u5355\u8BED\u4E49\uFF08\u5168\u6309\u767D\u540D\u5355\u66B4\u9732\uFF0C\u767D\u540D\u5355\u5916\u5168\u9690\u85CF\uFF09\u2500\u2500\n - tools \u7A7A + msms \u975E\u7A7A = \u7EAF MSM \u89D2\u8272\uFF08\u8BA4\u77E5\u95EE\u7B54\u5178\u578B\u5F62\u6001\uFF09\n - msms \u975E\u7A7A \u2192 msm \u5DE5\u5177\u81EA\u52A8\u53EF\u7528\uFF08MSM \u901A\u9053\uFF09\n - \u767D\u540D\u5355\u5916\u5DE5\u5177\u5373\u4F7F DSH \u672A\u6765\u65B0\u589E\u4E5F\u81EA\u52A8\u88AB\u6321\uFF08guard \u6309\u89D2\u8272\u5224\u5B9A\uFF0C\u4E0D\u679A\u4E3E\u5DE5\u5177\u540D\u2014\u2014\u5B8C\u5907\u6027\uFF09\n\n\u2500\u2500 \u8BA4\u77E5 MSM \u5199\u6CD5\uFF08\u8BFB\u77E5\u8BC6 / \u64CD\u4F5C\u80FD\u529B\uFF09\u2500\u2500\n - \u8BFB\u77E5\u8BC6\uFF1A\u811A\u672C\u8BFB CCC \u5185\u6587\u4EF6\uFF08SERENITY_ROOT env \u6CE8\u5165\uFF09\u2192 \u8F93\u51FA\u7B54\u6848/\u6458\u8981\uFF08\u5982 cognitive-qa\uFF09\n - \u64CD\u4F5C\u80FD\u529B\uFF1A\u811A\u672C\u8C03\u7528\u65E2\u6709\u5BB6\u5EAD\u5DE5\u5177/\u670D\u52A1\uFF08SSH/API/\u6587\u4EF6\u64CD\u4F5C\uFF09\u2014\u2014\u89D2\u8272\u80FD\u529B\u4E0A\u9650 = \u767D\u540D\u5355 MSM \u7684\u5B9E\u9645\u884C\u4E3A\n - \u4F8B\uFF1Acognitive-qa\uFF08\u8BFB docs/references \u56DE\u7B54\uFF09\u3001review-scan\uFF08\u8BFB\u4EE3\u7801\u51FA\u5BA1\u67E5\u610F\u89C1\uFF09\u3001review-fix\uFF08\u5199\u4FEE\u590D\uFF09\n - \u6CE8\u610F\uFF1AMSM \u5728\u811A\u672C\u5C42\u6267\u884C\uFF08bun\uFF09\uFF0C\u6587\u4EF6\u8BBF\u95EE\u4E0D\u53D7 agent \u5DE5\u5177\u9762\u7EA6\u675F\u2014\u2014\"\u53EA\u8BFB\"\u8BED\u4E49\u9760 CCC \u81EA\u5199 MSM \u81EA\u89C9\n\n\u2500\u2500 \u8F68\u8FF9\u7EAA\u5F8B\u5B50\u96C6\uFF08cognitiveTrajectory\uFF09\u2500\u2500\n - session/keeper/rebuild \u9ED8\u8BA4 false\uFF1ASkiff \u5B8C\u5168\u72EC\u7ACB\uFF08\u4E0D\u5EFA SESSION.md\u3001\u65E0 keeper \u63D0\u9192\u3001\u65E0 rebuild \u538B\u529B\u68C0\u6D4B\uFF09\n - \u5F00\u542F\u67D0\u9879 = \u8BE5\u89D2\u8272\u53C2\u4E0E\u5BF9\u5E94\u8F68\u8FF9\u673A\u5236\uFF08\u5982 keeper=true \u8BA1\u5206\u63D0\u9192\u6309\u89D2\u8272\u751F\u6548\uFF09\n\n\u2500\u2500 \u793A\u4F8B\u89D2\u8272 \u2500\u2500\n qa-readonly: { \"msms\": [\"cognitive-qa\"], \"tools\": [], \"cognitiveTrajectory\": {} }\n \u2192 \u8BA4\u77E5\u95EE\u7B54\uFF08\u4EC5 MSM \u901A\u9053\uFF0C\u65E0\u76F4\u63A5\u5DE5\u5177\uFF0C\u5B8C\u5168\u72EC\u7ACB\uFF09\n code-review: { \"msms\": [\"review-scan\",\"review-fix\"], \"tools\": [\"read\",\"grep\",\"glob\",\"write\",\"edit\"], \"cognitiveTrajectory\": { \"keeper\": true } }\n \u2192 \u6709\u64CD\u4F5C\u80FD\u529B\uFF08\u53EF\u5199\u4FEE\u590D\uFF09\uFF0C\u53C2\u4E0E keeper \u8F68\u8FF9\u673A\u5236\n\n\u2500\u2500 \u8FD0\u884C \u2500\u2500\n \u8C03\u8BD5\uFF1A\u8BBE\u7F6E\u9762\u677F\u300CSerenity\u300D\u9875 Skiff \u533A\u5757\u5F00\u542F \u2192 http://127.0.0.1:<debugPort> \u95EE\u7B54\u9875\u5B9E\u6D4B\n \uD83D\uDD34 \u5916\u90E8\u7A0B\u5E8F\u5316\u63A5\u5165\uFF082026-10-15 \u8D77\u6539\u8D70\u5B98\u65B9\uFF09\uFF1A\u672C\u63D2\u4EF6\u81EA\u9020\u7684 ACP \u9762\uFF08HTTP JSON-RPC 3100 \uFF0F\n \u5EFA\u8BAE\u95EE\u7B54\u9875\uFF09**\u5DF2\u6574\u4F53\u9000\u5F79**\uFF08owner \u88C1\u300C\u780D\u6389\u5916\u90E8\u95EE\u7B54\u300D\uFF09\u3002\u73B0\u5728\u8981\u7A0B\u5E8F\u5316/\u8FDC\u7A0B\u63A5\u5165\uFF0C\u8D70\u5BBF\u4E3B\n \u81EA\u5E26\u7684\u5B98\u65B9 ACP server\uFF1Adsh --profile acp\uFF08\u7EAF stdio\u3001\u96F6\u8BA4\u8BC1\uFF09\uFF0B \u4EFB\u4E00 ACP \u5BA2\u6237\u7AEF\n \uFF08\u624B\u673A\u7AEF\u5982 Agmente / ACP UI\uFF09\u7ECF\u96A7\u9053\u63A5\u5165\u3002\u8BE6\u89C1 S142 \u7684\u63A5\u5165\u6307\u5357\u6587\u6863\u3002\n \u542F\u505C = \u4EBA\u5DE5\uFF08\u8BBE\u7F6E\u9762\u677F\u5F00\u5173\uFF0C\u4E0D\u968F\u63D2\u4EF6\u52A0\u8F7D\u81EA\u52A8\u542F\u52A8\uFF09\uFF1B\u672A\u5F00\u542F\u96F6\u8D44\u6E90\u5360\u7528\n \u751F\u6548\u673A\u5236\uFF1A\u89D2\u8272\u914D\u7F6E**\u5B9E\u65F6\u8BFB\u53D6**\uFF08\u6539 .opencode/serenity.json \u2192 \u5237\u65B0\u8C03\u8BD5\u9875\u5373\u751F\u6548\uFF09\uFF1B\n \u6539\u914D\u7F6E\u540E\u7528 container_admin role apply \u505A\u663E\u5F0F\u6821\u9A8C + \u5E94\u7528\u786E\u8BA4\uFF08\u7ED1\u5B9A CCC + \u89D2\u8272\u6E05\u5355\uFF09\n \u4F1A\u8BDD\u8FFD\u95EE\uFF08v1.25.10\uFF09\uFF1A\u8C03\u8BD5\u9875\u6301\u6709\u5F53\u524D\u4F1A\u8BDD\uFF0C\u8FFD\u95EE\u81EA\u52A8\u7EED\u63A5\uFF08\u540C\u4F1A\u8BDD\u4E0A\u4E0B\u6587\u5EF6\u7EED\uFF09\uFF1B\n \u300C\u65B0\u5BF9\u8BDD\u300D\u6309\u94AE\u5F00\u65B0\u4F1A\u8BDD\uFF1B\u8FDB\u7A0B\u91CD\u542F\u540E\u65E7\u4F1A\u8BDD\u4E0D\u53EF\u7EED\uFF08WebUI \u4ECD\u53EF\u89C1\u5386\u53F2\uFF09\n \u6CE8\u610F\uFF1Askill \u52A0\u8F7D\u5BF9 skiff **\u6052\u53EF\u7528**\uFF08\u4E0D\u8BBE\u767D\u540D\u5355\u2014\u2014\u8BFB\u77E5\u8BC6\u9762\uFF0C\u65E0\u5199\u80FD\u529B\uFF09";
|
|
13
13
|
/** 校验当前 CCC 的 skiff 配置:roles schema 合法 / msms 均已注册 / model ∈ cheap-worker.models / systemPrompt 非空 */
|
|
14
14
|
export declare function validateSkiffConfig(root: string): JsonValue;
|
|
15
15
|
/** 列出当前 CCC 已定义角色(名 / 模型 / msms / tools / 轨迹纪律摘要) */
|
package/lib/usage-stats.d.ts
CHANGED
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
* | 字段 | 含义 | 喂它的地方 |
|
|
39
39
|
* |---|---|---|
|
|
40
40
|
* | `skill.loads` | 模型**主动**调宿主 `skill` 工具(把某 skill 的 `SKILL.md` 全文载入) | `tools/post-execute`(工具名 = `skill`) |
|
|
41
|
-
* | `skill.injections` | ACC **每请求注入**的 skill 段(`
|
|
41
|
+
* | `skill.injections` | ACC **每请求注入**的 skill 段(`cognitiveTrajectory.skills` / 轨迹 frontmatter 声明) | `seams/system-prompt.ts` 的 cognitive-trajectory-skills section 求值回调 |
|
|
42
42
|
* | `msm` | `msm` 工具的一次执行,按 **MSM 名**分桶 | `tools/post-execute`(工具名 = `msm`) |
|
|
43
43
|
*
|
|
44
44
|
* 🔴 **两者差好几个数量级**:`loads` 是模型的**动作**(稀疏),`injections` 是**请求的属性**(稠密)。
|