@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,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* clock
|
|
2
|
+
* wake/clock.ts — **时钟运行时工厂**(S142 §38 复审候选 C6b,路径 **P2**)
|
|
3
3
|
*
|
|
4
4
|
* 🔴 2026-09-25(S142 分批清死代码·第 1 批)**更正**:本文件当初是为**两条**独立 5min 时钟抽出的公共引擎:
|
|
5
|
-
* · 唤醒调度器(`wake
|
|
5
|
+
* · 唤醒调度器(`wake/scheduler.ts`,一次性唤醒,D58)—— **现存**
|
|
6
6
|
* · autopilot 时钟(`autopilot-trajectory.ts`,周期自唤醒,D59)—— 🔴 **已随 v1.35.0 整段退场**
|
|
7
7
|
* 二者的**业务判据完全不同**(谁来扫 / 扫什么 / 投递给谁 / 按什么周期),但**引擎骨架逐字同形**
|
|
8
8
|
* ——进程态 + 快照 + 复位 + `startTimer` + tick 外壳 + 事件接线 + disposer + `timer.unref()`。
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
* **本工厂是"加法式"重构**(P2 的性质):不新增任何判定逻辑,只把同形骨架收成一份代码;
|
|
50
50
|
* 两个模块仍各自导出 `wakeSchedulerState()` / `autopilotClockState()` 与各自的
|
|
51
51
|
* `__reset…ForTest()`,**对外可观测面(字段名与语义)零变化**——`acc-diag` ①b 段、
|
|
52
|
-
* `
|
|
52
|
+
* `surface/observation.ts:containerClocks()` 与面板都在读它们(见该文件 :225–250 的设计红线)。
|
|
53
53
|
*
|
|
54
54
|
* 为什么**不**取 P1(真合并成一个 `setInterval` + 两条策略)——2026-09-15 所有者裁决:
|
|
55
55
|
* P1 只多省 ~20 行,却要把 `armed` 拆成"宿主 + 每策略"两层、并强行分开串行域,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* cro-log.ts — CRO 唤起日志(**ACC 侧**,每轨迹一份固定名文件,2026-09-20 S142 §7.16)
|
|
2
|
+
* wake/cro-log.ts — CRO 唤起日志(**ACC 侧**,每轨迹一份固定名文件,2026-09-20 S142 §7.16)
|
|
3
3
|
*
|
|
4
4
|
* ## 所有者令(本模块的存在理由)
|
|
5
5
|
*
|
|
@@ -31,11 +31,11 @@
|
|
|
31
31
|
* ## 🔴 轮转(所有者明示「程序化的」)
|
|
32
32
|
*
|
|
33
33
|
* **写入时按窗裁剪**:每次落盘只保留 `at >= now - CRO_LOG_RETENTION_MS` 的条目,
|
|
34
|
-
* 随后**原子写**(`tmp + rename`,与 `wake
|
|
34
|
+
* 随后**原子写**(`tmp + rename`,与 `wake/registry.ts` 同款形态)。
|
|
35
35
|
* ⇒ 清理与写入**是同一笔操作** ⇒ **结构上不存在"忘了清"的可能**(比"另设一个每 tick 的清理步"更硬:
|
|
36
36
|
* 那多一个"可能忘了跑"的面)。窗宽是**常量**,**无配置键、无人工清理动作**。
|
|
37
37
|
*
|
|
38
|
-
* ## 🔴 铁律(与 `cro.ts` 同族)
|
|
38
|
+
* ## 🔴 铁律(与 `wake/cro.ts` 同族)
|
|
39
39
|
*
|
|
40
40
|
* **本模块的每个导出函数都不抛错**:写盘 / 裁剪 / 解析失败一律返回结构化失败,
|
|
41
41
|
* 由调用方只记一行 tick 日志 ⇒ **CRO 流水的问题绝不影响投递与既有链路**(设计 §5)。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* cro-turns.ts — 「这条轨迹是否正在跑轮次」的追踪(设计 §3.2,2026-09-19 S142)
|
|
2
|
+
* wake/cro-turns.ts — 「这条轨迹是否正在跑轮次」的追踪(设计 §3.2,2026-09-19 S142)
|
|
3
3
|
*
|
|
4
4
|
* ## 为什么需要这个模块(CRO 唯一需要 ACC 新增的状态)
|
|
5
5
|
*
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* | 事件 | 动作 | 出处 |
|
|
14
14
|
* |---|---|---|
|
|
15
15
|
* | `agent/created` | 标记「在跑」 | `host/contract.ts`(dsp 已在 `seams/context.ts` 订阅)。⚠️ v0.1.7 前名为 `agent/session-start`;新事件 `@mode = serial` ⇒ 处理函数须快速返回 |
|
|
16
|
-
* | `agent/turn-stopping` | 清除标记 | `host/contract.ts:277`(dsp 已在 `rebuild.ts:442` 等 4 处订阅) |
|
|
16
|
+
* | `agent/turn-stopping` | 清除标记 | `host/contract.ts:277`(dsp 已在 `trajectory/rebuild.ts:442` 等 4 处订阅) |
|
|
17
17
|
* | `agent/disposed` | **清该载体的项** | `host/contract.ts:280` |
|
|
18
18
|
* | `session/disposed` | **清该载体的项** | `host/contract.ts:283` |
|
|
19
19
|
*
|
|
@@ -94,13 +94,13 @@ export declare function __resetCroTurnsForTest(): void;
|
|
|
94
94
|
* 🔴 **本处顺带更正 §2.7 的一处分档**:本文件原被列在"剩余 3 个属**真依赖**档"里,
|
|
95
95
|
* 但**逐符号查证后与那个判断不符** ——
|
|
96
96
|
* · `Context`:`ctx` 只被**结构化访问**(原码本就写着 `ctx as unknown as { on: … }`)
|
|
97
|
-
* ⇒ 该注解未提供任何类型保证(与 `
|
|
97
|
+
* ⇒ 该注解未提供任何类型保证(与 `role/worker/idle.ts` 同档)。
|
|
98
98
|
* · `Agent`:**导入后从未使用** —— 事件 payload 一律按 `{ agent?: unknown }` 解构,
|
|
99
99
|
* 再交给 `sessionIdOf(...)`(它收 `unknown`)。⇒ **纯粹是死 import**。
|
|
100
100
|
* ⇒ **判据(本件再证一次,且比上一件更硬)**:分档**必须逐符号看"它有没有参与类型检查"**,
|
|
101
101
|
* **不能按文件整档划分** —— 同一个文件里可以并存"真依赖符号"与"纯名义符号"。
|
|
102
|
-
* 🔵 **剩余 2 个文件**才是真依赖档:`rebuild.ts` 用 `Session`/`SessionEvent`/
|
|
103
|
-
* `deriveEventMessage`/`Agent` 等**真调用**的类型;`wake
|
|
102
|
+
* 🔵 **剩余 2 个文件**才是真依赖档:`trajectory/rebuild.ts` 用 `Session`/`SessionEvent`/
|
|
103
|
+
* `deriveEventMessage`/`Agent` 等**真调用**的类型;`wake/scheduler.ts` 用 `Agent` 的
|
|
104
104
|
* `followup`/`steer`(**真调用**)⇒ 它们走 §2.7-③ **选项 (b)** 或把中立接口下沉到 L0,
|
|
105
105
|
* **另立一件**(D85 一次只改一件事)。
|
|
106
106
|
* @param ctx 插件上下文(**结构化访问** `on`,故类型为 `unknown`,见下方 I2 说明)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* cro.ts — CRO(Continuous Re-Occurrence · 持续再发生)机制层(S142 §7.8,2026-09-19)
|
|
2
|
+
* wake/cro.ts — CRO(Continuous Re-Occurrence · 持续再发生)机制层(S142 §7.8,2026-09-19)
|
|
3
3
|
*
|
|
4
4
|
* ## 这东西用来干什么(白话)
|
|
5
5
|
*
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
* ## 🔴 铁律:CRO 的任何失败,绝不影响既有机制(设计 §5)
|
|
41
41
|
*
|
|
42
42
|
* `send-later` / `send-now` / 唤醒表的投递**照常工作**。
|
|
43
|
-
* 先例 = `
|
|
43
|
+
* 先例 = `im/hook.ts` 的**旁路容忍**("超时 kill / 非 0 退出 / spawn 失败 → 仅日志返回,绝不抛")。
|
|
44
44
|
* ⇒ 本模块的**每一个**导出函数**都不抛错**(返回结构化失败)。
|
|
45
45
|
*/
|
|
46
46
|
/** 入口文件名(**全写**,所有者令 2026-09-19;不改缩写) */
|
|
@@ -104,7 +104,7 @@ export interface CroSnapshot {
|
|
|
104
104
|
/**
|
|
105
105
|
* 🔴 其中**正在跑轮次**的(设计 §3.2 —— 本机制**唯一需要 ACC 新增的状态**)。
|
|
106
106
|
* ⚠️ `live ≠ 在跑`:一条会话可以 live 而空闲。
|
|
107
|
-
* 宿主没有现成的 turn 运行标志 ⇒ 由 `cro-turns.ts` 用 `agent/session-start` +
|
|
107
|
+
* 宿主没有现成的 turn 运行标志 ⇒ 由 `wake/cro-turns.ts` 用 `agent/session-start` +
|
|
108
108
|
* `agent/turn-stopping` 两个**既有契约事件**夹出来。
|
|
109
109
|
*/
|
|
110
110
|
runningSessionIds: string[];
|
|
@@ -217,13 +217,13 @@ export interface CroRunResult {
|
|
|
217
217
|
/** 失败分类(稳定码,供日志/测试断言) */
|
|
218
218
|
code?: string;
|
|
219
219
|
}
|
|
220
|
-
/** runner 签名(**可注入** —— 测试捕获防真实 spawn flake;同 `
|
|
220
|
+
/** runner 签名(**可注入** —— 测试捕获防真实 spawn flake;同 `im/hook.ts` 手法) */
|
|
221
221
|
export type CroRunner = (scriptAbs: string, stdinJson: string, timeoutMs: number) => Promise<CroRunResult>;
|
|
222
222
|
/**
|
|
223
223
|
* CRO 程序路径:`<CCC 根>/AGENT_SESSIONS/<dirName>/continuous-re-occurrence.ts`。
|
|
224
224
|
*
|
|
225
225
|
* ⚠️ 路径逃逸校验(`resolveInside`):`dirName` 来自配置/工具入参,
|
|
226
|
-
* 必须确保解析后仍在 CCC 根内(同 `
|
|
226
|
+
* 必须确保解析后仍在 CCC 根内(同 `im/hook.ts:160` 手法)。**抛错由调用方吞**。
|
|
227
227
|
* @param root CCC 根
|
|
228
228
|
* @param dirName 轨迹目录名
|
|
229
229
|
* @returns 绝对路径
|
|
@@ -336,7 +336,7 @@ export declare function listCroCognitiveTrajectories(root: string): string[];
|
|
|
336
336
|
/**
|
|
337
337
|
* 执行一次 CRO 程序(**永不抛** —— 旁路容忍铁律)。
|
|
338
338
|
*
|
|
339
|
-
* runner 顺序(照 `
|
|
339
|
+
* runner 顺序(照 `im/hook.ts:171-174` 的 bun 优先 / node 兜底):
|
|
340
340
|
* `bun` → `process.execPath`(同运行时)。
|
|
341
341
|
* 判据:`ENOENT`(二进制不存在)⇒ 试下一个;**其余失败视为最终结果**
|
|
342
342
|
* (程序自己报错就是报错,不该用另一个 runner 掩盖——与 hook 一致)。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wake
|
|
2
|
+
* wake/registry.ts — 认知轨迹唤醒注册表(D58,S142 2026-09-13)
|
|
3
3
|
*
|
|
4
4
|
* 需求(用户原话):一个 CCC 内允许多个认知轨迹任意形态并行;某个认知轨迹可以
|
|
5
5
|
* **预定未来唤醒自己或别人**,本质上是一次「未来时刻 + 一条 message」的投递;「周期自唤醒」
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - 状态机:`pending` →(投递成功)`delivered`|(超补跑窗口)`missed`|(`wake rm` 物理移除)
|
|
12
12
|
* - 投递即终结:一次性,不重投(无回执语义——发起方不 await,见设计文档 §2)
|
|
13
13
|
*
|
|
14
|
-
* 调度与投递在 `wake
|
|
14
|
+
* 调度与投递在 `wake/scheduler.ts`(需要 ctx),本模块保持纯净。
|
|
15
15
|
*/
|
|
16
16
|
/**
|
|
17
17
|
* 补跑窗口(缺省 2h):dsh 停机期间到期的条目,若迟到不超过本窗口则补投,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wake
|
|
2
|
+
* wake/scheduler.ts — 认知轨迹唤醒调度器(D58/D59/D60;S142 2026-09-13)
|
|
3
3
|
*
|
|
4
4
|
* 一个**中心调度器**(5min tick,复用 autopilot 的节律常量),处理 CCC 唤醒注册表里
|
|
5
5
|
* 到期的条目:把「未来时刻 + 一条 message」投递给目标认知轨迹,**fire-and-forget**
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
* CRO 阶段另有**独立**总闸 `croEnabled`(只停 CRO,**不影响**本注册表投递)|
|
|
24
24
|
* 补跑窗口 2h(超窗置 missed 留痕)|同 tick 串行|唤起后维持 live(人类可介入)。
|
|
25
25
|
*/
|
|
26
|
-
import { type ClockRuntime } from './clock
|
|
27
|
-
import { type WakeEntry } from './
|
|
26
|
+
import { type ClockRuntime } from './clock.js';
|
|
27
|
+
import { type WakeEntry } from './registry.js';
|
|
28
28
|
/** 投递结果(写回条目的 lastResult;人读) */
|
|
29
29
|
interface WakeDeliveryResult {
|
|
30
30
|
ok: boolean;
|
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.72.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 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫/对外输出守卫)+ 认知轨迹日志与原地重建 + 网页登录入口/微信桥/认知轨迹唤醒注册表。skiff = 目录下有 skiff.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",
|
package/lib/constants.d.ts
DELETED
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import { f as hostSettings } from "./ccc-roots-RzasspMr.js";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
-
//#region src/constants.ts
|
|
6
|
-
/** 常量(纯模块,零 DSH 依赖) */
|
|
7
|
-
/**
|
|
8
|
-
* ACC 版本:自动从 package.json 读取(单一真相源,消除与 CHANGELOG 的漂移)。
|
|
9
|
-
* 发布时只需改 package.json 的 version。
|
|
10
|
-
*/
|
|
11
|
-
const ACC_VERSION = (() => {
|
|
12
|
-
try {
|
|
13
|
-
const here = dirname(fileURLToPath(import.meta.url));
|
|
14
|
-
return JSON.parse(readFileSync(join(here, "..", "package.json"), "utf-8")).version ?? "0.0.0";
|
|
15
|
-
} catch {
|
|
16
|
-
return "0.0.0";
|
|
17
|
-
}
|
|
18
|
-
})();
|
|
19
|
-
//#endregion
|
|
20
|
-
//#region src/skiff-registry.ts
|
|
21
|
-
const skiffSessions = /* @__PURE__ */ new Map();
|
|
22
|
-
/** 查 sessionId 的 Skiff 角色名(无 → null)——向后兼容(guards/seams 依赖) */
|
|
23
|
-
function skiffRoleFor(sessionId) {
|
|
24
|
-
return skiffSessions.get(sessionId)?.role ?? null;
|
|
25
|
-
}
|
|
26
|
-
/** 查 sessionId 的完整绑定(role + ccc;无 → null)——v1.25.10 会话追问校验 */
|
|
27
|
-
function skiffSessionInfo(sessionId) {
|
|
28
|
-
return skiffSessions.get(sessionId) ?? null;
|
|
29
|
-
}
|
|
30
|
-
function registerSkiffSession(sessionId, role, ccc) {
|
|
31
|
-
skiffSessions.set(sessionId, {
|
|
32
|
-
role,
|
|
33
|
-
ccc
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
function unregisterSkiffSession(sessionId) {
|
|
37
|
-
skiffSessions.delete(sessionId);
|
|
38
|
-
}
|
|
39
|
-
//#endregion
|
|
40
|
-
//#region src/ports.ts
|
|
41
|
-
/**
|
|
42
|
-
* 集中端口表。
|
|
43
|
-
* A=宿主主面(插件不监听)/ B=网关(可配,默认关)/ C=微信发送(默认开,仅 loopback)
|
|
44
|
-
* / D=Skiff 调试(默认关)。
|
|
45
|
-
*/
|
|
46
|
-
const FACE_PORTS = {
|
|
47
|
-
main: {
|
|
48
|
-
port: 3080,
|
|
49
|
-
host: null,
|
|
50
|
-
defaultEnabled: true,
|
|
51
|
-
meaning: "宿主 DSH 主 WebUI + 插件 /serenity/* 路由面(**插件不起此 listener**,端口自宿主读)"
|
|
52
|
-
},
|
|
53
|
-
gateway: {
|
|
54
|
-
port: 3081,
|
|
55
|
-
host: "0.0.0.0",
|
|
56
|
-
defaultEnabled: false,
|
|
57
|
-
meaning: "双端口网关(外部登录 + 全量反代宿主主面;host/port 走 plugin 全局配置)"
|
|
58
|
-
},
|
|
59
|
-
weixinSend: {
|
|
60
|
-
port: 3082,
|
|
61
|
-
host: "127.0.0.1",
|
|
62
|
-
defaultEnabled: true,
|
|
63
|
-
meaning: "微信主动发送面(容器外进程 → POST /send;与 3080 显式解耦,不经网关)"
|
|
64
|
-
},
|
|
65
|
-
skiffDebug: {
|
|
66
|
-
port: 3099,
|
|
67
|
-
host: "127.0.0.1",
|
|
68
|
-
defaultEnabled: false,
|
|
69
|
-
meaning: "Skiff 调试问答面(人工调试子角色;无认证,仅靠 loopback)"
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
/** 宿主主 WebUI 端口(面 A:插件**不监听**,只读取;`readWebPort` 的回退值) */
|
|
73
|
-
const MAIN_WEB_PORT = FACE_PORTS.main.port;
|
|
74
|
-
/** 网关端口默认值(面 B) */
|
|
75
|
-
const GATEWAY_PORT = FACE_PORTS.gateway.port;
|
|
76
|
-
/** 微信主动发送端口默认值(面 C) */
|
|
77
|
-
const WEIXIN_SEND_PORT = FACE_PORTS.weixinSend.port;
|
|
78
|
-
/** Skiff 调试页端口默认值(面 D) */
|
|
79
|
-
const SKIFF_DEBUG_PORT = FACE_PORTS.skiffDebug.port;
|
|
80
|
-
/**
|
|
81
|
-
* **机制端口**词表(output-guard 用:agent 在**用户可见输出**里提及内部端口即打回)。
|
|
82
|
-
*
|
|
83
|
-
* 由 {@link FACE_PORTS} 机械派生 ⇒ 与面清单**永不漂移**。
|
|
84
|
-
* ⚠️ 修复记录(C4 块 B,2026-09-15):旧常量硬写 `['3080','3081','3099','3100']`
|
|
85
|
-
* ——**漏 3082**(微信发送面,默认开)⇒ 守卫拦不住"3082"这类提及。现由表派生,四面齐全。
|
|
86
|
-
* ⚠️ 面变更记录(2026-10-15):**面 E(3100 ACP/问答)已整体退役**(owner 裁「砍掉外部问答」)
|
|
87
|
-
* ⇒ 本词表随之少一项,**无需另改**(这正是"派生而非手抄"的收益)。
|
|
88
|
-
*/
|
|
89
|
-
const MECHANISM_PORTS = Object.keys(FACE_PORTS).map((id) => String(FACE_PORTS[id].port));
|
|
90
|
-
//#endregion
|
|
91
|
-
//#region src/settings-section.ts
|
|
92
|
-
/**
|
|
93
|
-
* 设置面板命名空间 = **profile 条目 id**(v0.1.7 起;与旧 `settings.yaml` 段名逐字相同)。
|
|
94
|
-
*/
|
|
95
|
-
const SERENITY_SETTINGS_NS = "serenity-hooks";
|
|
96
|
-
/** 进程级默认(无 Config 可读时的兜底;与 Config 各字段的缺省一致) */
|
|
97
|
-
function defaultSimpleSettings() {
|
|
98
|
-
return {
|
|
99
|
-
gatewayEnabled: false,
|
|
100
|
-
rebuildThresholdK: 400,
|
|
101
|
-
skiffEnabled: false,
|
|
102
|
-
skiffDebugPort: SKIFF_DEBUG_PORT,
|
|
103
|
-
croEnabled: true,
|
|
104
|
-
diagramEnabled: false,
|
|
105
|
-
humanChannel: defaultHumanChannelSettings()
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* volatile 字段的**结构化解包**(v1.47.2;本文件读取语义的第一道)。
|
|
110
|
-
*
|
|
111
|
-
* ## 为什么必须有它(两个事实的合成,缺一即错)
|
|
112
|
-
* ① **0.1.7 的面板层字段必须标 `.volatile()`** —— 否则本插件命名空间整个不进宿主的
|
|
113
|
-
* `settings.describe()`(`volatileForm()` 只认 `meta.volatile`)⇒ **设置面板那一节消失**。
|
|
114
|
-
* ② **标了之后,运行期拿到的是引用包装,不是裸值** —— schemastery 的 `Schema.resolve()` 对
|
|
115
|
-
* `meta.volatile` **无条件**包 `createVolatile(value)`,且该分支排在"缺省值回退"那一段
|
|
116
|
-
* **之前** ⇒ **"用户没设过"的字段也是恒真对象**(`.get()` 返回 `undefined`),**不是 `undefined`**。
|
|
117
|
-
*
|
|
118
|
-
* ⇒ 若这里不解包,下面十行的 `??` 链会**短路在这层包装上** ⇒ 网关 / Skiff 会被
|
|
119
|
-
* **无意打开**(比"面板不显示"更坏:静默改变对外暴露面)。
|
|
120
|
-
*
|
|
121
|
-
* ## 为什么用结构判定
|
|
122
|
-
* 可观察形状就是"有 `get()`"(cosmokit 的 `isVolatile` 也这么判);本模块不引它的运行时依赖。
|
|
123
|
-
*
|
|
124
|
-
* @param value - volatile 引用 | 裸值 | undefined
|
|
125
|
-
* @returns 解包后的裸值(引用 ⇒ `.get()`;裸值原样;缺省 ⇒ `undefined`)
|
|
126
|
-
*/
|
|
127
|
-
function unwrapVolatile(value) {
|
|
128
|
-
if (value === void 0 || value === null) return void 0;
|
|
129
|
-
if (typeof value.get === "function") return value.get();
|
|
130
|
-
return value;
|
|
131
|
-
}
|
|
132
|
-
/** human-channel 的内建缺省(与 `Config` 的 schema 缺省**同源**:这里是读取面,那里是解析面) */
|
|
133
|
-
function defaultHumanChannelSettings() {
|
|
134
|
-
return {
|
|
135
|
-
accounts: [],
|
|
136
|
-
subscriptions: [],
|
|
137
|
-
relayCcc: null,
|
|
138
|
-
sendingAllow: ["*"]
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
/** 取"有内容的字符串"(首尾空白剥掉;空白串 ⇒ `undefined`)—— 面板空文本框会写 `''`,那是"没填"不是"填了个空名" */
|
|
142
|
-
function nonEmptyText(value) {
|
|
143
|
-
if (typeof value !== "string") return void 0;
|
|
144
|
-
const trimmed = value.trim();
|
|
145
|
-
return trimmed === "" ? void 0 : trimmed;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* `humanChannel` 片段 → 运行时归一形态。**优先级:显式值 > 内建缺省**(与 `simpleSettingsFromConfig` 同族)。
|
|
149
|
-
*
|
|
150
|
-
* 🔴 三处"缺省 vs 显式"的语义差别,别写反:
|
|
151
|
-
* ① `sending.allow: []` ⇒ **`[]`**("谁都不许"),**不是**回退到 `['*']` —— 故用 `??`
|
|
152
|
-
* (只对 `undefined`/`null` 回退)。⚠️ **别拿 `??`→`||` 当变异探针**:空数组在 JS 里是
|
|
153
|
-
* **真值** ⇒ 两种写法在这个输入上**恰好同效**,那是**非变异**(会得出"测试不承重"的假结论)。
|
|
154
|
-
* ② `relay.ccc` 空白 ⇒ `null`("没填"与"没这一项"同义),**不是**把空白当 CCC 名;
|
|
155
|
-
* ③ 账号 `enabled` 缺省 **true**(老账号表里 `enabled` 不写就是开)。
|
|
156
|
-
*
|
|
157
|
-
* 🔴 **旧 CCC 侧 `weixin.*` 不在这里、也不该在这里**:机器级面**只**认 `humanChannel`
|
|
158
|
-
* (硬切无别名,同 D61 先例)⇒ 传进来的旧键**一律不进结构**(回归钉见
|
|
159
|
-
* `tests/human-channel-config.test.ts`;CCC 侧旧读取面的退役在 P0-2~P0-4)。
|
|
160
|
-
* @param fragment - `Config.humanChannel`(可能整个不存在 —— 那是**合法**初始态)
|
|
161
|
-
* @returns 归一形态(永不 `undefined`)
|
|
162
|
-
*/
|
|
163
|
-
function humanChannelSettingsFromConfig(fragment) {
|
|
164
|
-
const d = defaultHumanChannelSettings();
|
|
165
|
-
if (!fragment) return d;
|
|
166
|
-
return {
|
|
167
|
-
accounts: (fragment.accounts ?? []).map((a) => ({
|
|
168
|
-
id: nonEmptyText(a?.id),
|
|
169
|
-
channel: nonEmptyText(a?.channel),
|
|
170
|
-
enabled: a?.enabled !== false,
|
|
171
|
-
token: a?.token,
|
|
172
|
-
userId: a?.userId
|
|
173
|
-
})),
|
|
174
|
-
subscriptions: (fragment.subscriptions ?? []).map((s) => ({
|
|
175
|
-
account: nonEmptyText(s?.account),
|
|
176
|
-
user: nonEmptyText(s?.user),
|
|
177
|
-
ccc: nonEmptyText(s?.ccc),
|
|
178
|
-
role: nonEmptyText(s?.role)
|
|
179
|
-
})),
|
|
180
|
-
relayCcc: nonEmptyText(fragment.relay?.ccc) ?? d.relayCcc,
|
|
181
|
-
sendingAllow: fragment.sending?.allow ?? d.sendingAllow
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Config(宿主 Loader 校验后的解析值)→ 扁平简单配置。**本文件唯一的读取语义**。
|
|
186
|
-
*
|
|
187
|
-
* 优先级:**面板层(扁平键)> 部署层(嵌套段)> 内建缺省**。
|
|
188
|
-
* @param config - 插件 Config(`fiber.config` 或 apply 收到的 config)
|
|
189
|
-
* @returns 扁平开关集合
|
|
190
|
-
*/
|
|
191
|
-
function simpleSettingsFromConfig(config) {
|
|
192
|
-
const d = defaultSimpleSettings();
|
|
193
|
-
return {
|
|
194
|
-
gatewayEnabled: unwrapVolatile(config.gatewayEnabled) ?? config.gateway?.enabled ?? d.gatewayEnabled,
|
|
195
|
-
rebuildThresholdK: unwrapVolatile(config.rebuildThresholdK) ?? config.rebuild?.thresholdK ?? d.rebuildThresholdK,
|
|
196
|
-
skiffEnabled: unwrapVolatile(config.skiffEnabled) ?? config.skiff?.enabled ?? d.skiffEnabled,
|
|
197
|
-
skiffDebugPort: unwrapVolatile(config.skiffDebugPort) ?? config.skiff?.debugPort ?? d.skiffDebugPort,
|
|
198
|
-
croEnabled: unwrapVolatile(config.croEnabled) ?? d.croEnabled,
|
|
199
|
-
diagramEnabled: unwrapVolatile(config.diagramEnabled) ?? config.diagram?.enabled ?? d.diagramEnabled,
|
|
200
|
-
humanChannel: humanChannelSettingsFromConfig(config.humanChannel)
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
/** 运行时源(`registerSettingsSection` 装配:读本插件 fiber 的**当前** Config) */
|
|
204
|
-
let simpleSource = null;
|
|
205
|
-
/**
|
|
206
|
-
* 读取当前简单配置(各功能 gateway/rebuild/skiff/… 的启动与运行时判断都经此)。
|
|
207
|
-
*
|
|
208
|
-
* 源 = 本插件 fiber 的 `config`(宿主在配置变更时走 `fiber.update()` ⇒ `config` 始终最新,
|
|
209
|
-
* **不必**依赖 apply 重跑,也不必缓存)。
|
|
210
|
-
* @returns 扁平开关集合
|
|
211
|
-
*/
|
|
212
|
-
function readSimpleSettings() {
|
|
213
|
-
return simpleSource ? simpleSource() : defaultSimpleSettings();
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* 装配简单配置读取面(v1.21 分层;**v0.1.7 起不再注册任何 section**)。
|
|
217
|
-
*
|
|
218
|
-
* 两件事:
|
|
219
|
-
* 1. 把"本插件自己的 Config"接成简单配置源 —— 读 `ctx.fiber.config`(宿主 `fiber.update()`
|
|
220
|
-
* 保证最新),拿不到 fiber 时退回 apply 收到的 `config`。
|
|
221
|
-
* 2. 关掉宿主按 Config schema **自动生成**的通用页(`settings.configure({ auto: false })`)——
|
|
222
|
-
* 门面是我们的自定义页 `client/SettingsSection.tsx`(同一个命名空间,同一份数据)。
|
|
223
|
-
*
|
|
224
|
-
* ⚠️ 两个失败都不阻断插件装载(面板是附属能力,绝不能成为启动单点)。
|
|
225
|
-
* @param ctx - 插件上下文
|
|
226
|
-
* @param config - apply 收到的 Config(fiber.config 不可用时的兜底)
|
|
227
|
-
*/
|
|
228
|
-
function registerSettingsSection(ctx, config) {
|
|
229
|
-
const fiber = ctx.fiber;
|
|
230
|
-
const readConfig = () => fiber?.config ?? config;
|
|
231
|
-
simpleSource = () => simpleSettingsFromConfig(readConfig());
|
|
232
|
-
const settings = hostSettings(ctx);
|
|
233
|
-
try {
|
|
234
|
-
settings?.configure?.({ auto: false }, fiber);
|
|
235
|
-
} catch {}
|
|
236
|
-
}
|
|
237
|
-
//#endregion
|
|
238
|
-
export { GATEWAY_PORT as a, SKIFF_DEBUG_PORT as c, skiffRoleFor as d, skiffSessionInfo as f, FACE_PORTS as i, WEIXIN_SEND_PORT as l, ACC_VERSION as m, readSimpleSettings as n, MAIN_WEB_PORT as o, unregisterSkiffSession as p, registerSettingsSection as r, MECHANISM_PORTS as s, SERENITY_SETTINGS_NS as t, registerSkiffSession as u };
|
package/lib/skiff-core.d.ts
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* skiff-core.ts — Skiff 会话核心(F4,v1.25.0 实验性)
|
|
3
|
-
*
|
|
4
|
-
* Skiff agent = 标准 DSH agent(ctx.agents.create,跑 DSH agent-loop):
|
|
5
|
-
* 一次提问(followup)→ 模型自主循环调用工具直到 turn 结束(idle)→
|
|
6
|
-
* 读 session.events 取 committed 答案 + 完整轨迹(与 dsh WebUI 同源数据)。
|
|
7
|
-
*
|
|
8
|
-
* 实验性质:仅当 Skiff 调试服务开启(设置面板人工开关)且 CCC 配置了角色时才创建
|
|
9
|
-
* agent;未启用时本模块零副作用(无监听、无 agent、无会话注册)。
|
|
10
|
-
*/
|
|
11
|
-
import type { Context } from 'cordis';
|
|
12
|
-
import type { Agent, AgentHandle } from '@deepseek-ai/dsh-agent';
|
|
13
|
-
import { type SkiffRoleConfig } from './skiff-role.js';
|
|
14
|
-
/** 查 sessionId 的 Skiff 角色名(无 → null) */
|
|
15
|
-
export declare function skiffRoleFor(sessionId: string): string | null;
|
|
16
|
-
/** 查 sessionId 的会话绑定(role + ccc;无 → null)——v1.25.10 追问校验 */
|
|
17
|
-
export declare function skiffSessionInfo(sessionId: string): {
|
|
18
|
-
role: string;
|
|
19
|
-
ccc: string;
|
|
20
|
-
} | null;
|
|
21
|
-
/** 查 sessionId 的活体 agent(进程内会话延续用;未注册/已清理 → undefined) */
|
|
22
|
-
export declare function getSkiffAgent(sessionId: string): Agent | undefined;
|
|
23
|
-
export declare function registerSkiffSession(sessionId: string, role: string, ccc: string, agent: Agent): void;
|
|
24
|
-
export declare function unregisterSkiffSession(sessionId: string): void;
|
|
25
|
-
/** 测试/调试:注册表快照(sessionId → {role} 兼容展示) */
|
|
26
|
-
export declare function skiffSessionSnapshot(): ReadonlyMap<string, {
|
|
27
|
-
role: string;
|
|
28
|
-
ccc: string;
|
|
29
|
-
}>;
|
|
30
|
-
/**
|
|
31
|
-
* 系统提示词中的**工作台纪律块**(v1.30.4 升级:从单行路径 → 完整 ACC 层约束)。
|
|
32
|
-
* 用户点破(S142):只给路径 LLM 不会主动用——需注入「已绑定 + 使用纪律 + 动作指引」。
|
|
33
|
-
* SESSION = 工作台——skiff 与主舱同一套机制(零特调,用户拍板):
|
|
34
|
-
* 自动绑定已生效(无需 cognitive_trajectory use)、SESSION.md 是持久记忆载体、rebuild 自动从本 SESSION 续接。
|
|
35
|
-
* 注入 agent 系统提示词(用户对话面不可见)。
|
|
36
|
-
*
|
|
37
|
-
* v1.30.13(S142 诊断 D5):写入纪律**不点名具体工具**。旧文案写死 "with write/edit",
|
|
38
|
-
* 而某角色的工具白名单已移除 write/edit(写能力收归 CCC 的 session-write MSM)
|
|
39
|
-
* → 指令指向它根本没有的工具(注入纪律与能力面矛盾,模型只能猜)。
|
|
40
|
-
* 现文案改为「用本角色被授权的写入通道」——ACC 只声明义务(写进工作台),
|
|
41
|
-
* 具体通道由 CCC 的角色配置与角色提示词决定(ACC/CCC 归属二分;也不把某个 CCC 的
|
|
42
|
-
* MSM 名硬编码进 ACC 源码)。
|
|
43
|
-
*/
|
|
44
|
-
export declare function workspaceCognitiveTrajectoryLine(mdPath: string): string;
|
|
45
|
-
/**
|
|
46
|
-
* 把**工作台纪律块**挂到 agent 的系统提示词段(单一真相源,v1.30.13 用户需求)。
|
|
47
|
-
*
|
|
48
|
-
* 用户原话(S142,2026-09-08):"微信桥的注入机制,每个用户消息都会注入,skiff 本身也会注入,
|
|
49
|
-
* 这样就重复,能否微信桥情况下,注入内容直接取 skiff 的,这样不用配两遍"。
|
|
50
|
-
*
|
|
51
|
-
* 现状(改前):`createSkiffAgent` 把 `workspaceCognitiveTrajectoryLine(mdPath)` 塞进基础段
|
|
52
|
-
* (创建时一次快照),微信桥又**每条消息**把同一文本拼进 question(v1.30.4 为覆盖
|
|
53
|
-
* "live/existing 快路径不重挂提示词"而加)→ 新建 agent 首轮起即重复,且每轮重复付 token。
|
|
54
|
-
*
|
|
55
|
-
* 现形态(单一注入点):工作台行**只**经本函数挂系统提示词段(name `serenity-skiff-workspace`,
|
|
56
|
-
* 动态 `text()` 每轮按 scope 读当前活跃 mdPath → 绑定变化自动跟随,无需重挂):
|
|
57
|
-
* - `createSkiffAgent` 调它(不再把工作台行拼进基础段);
|
|
58
|
-
* - 微信桥对 live/existing agent 调它(不再拼 question)。
|
|
59
|
-
*
|
|
60
|
-
* @returns true = 段已在位(本次注册成功或此前已注册);false = 该 agent 无法挂系统提示词段
|
|
61
|
-
* (宿主 systemPrompt 缺失/注册抛错)→ 调用方降级为 question 前缀注入(约束必须在场)
|
|
62
|
-
*/
|
|
63
|
-
export declare function ensureWorkspacePromptSection(agent: Agent, scope: string): boolean;
|
|
64
|
-
/**
|
|
65
|
-
* 确保启用 session 能力的 skiff 会话拥有**专属 SESSION**(工作台):
|
|
66
|
-
* 懒绑定 + 幂等(per skiff 会话 scope 隔离——微信多用户各自独立,永不共享同一份)。
|
|
67
|
-
*
|
|
68
|
-
* 判定链:
|
|
69
|
-
* ⓪ **临时身份不建工作台**(v1.30.9,S142 用户报"SESSION 爆炸"根治):`persistent=false`
|
|
70
|
-
* (调试页等**无固定会话 id**的临时 agent)→ null。理由(R↓):这些 agent 每次
|
|
71
|
-
* 调用都是新 id、无身份延续,为其建 SESSION = 每次问答留一个永久空目录(无界熵增);
|
|
72
|
-
* 用户模型「skiff 本质是临时会话机制」——工作台属于**持久身份**,不属于单次调用。
|
|
73
|
-
* ① 角色未启用 session 能力(cognitiveTrajectory.session !== true)→ null(现状零变化)
|
|
74
|
-
* ② 已有**本机制自动创建**的 bound(note 前缀 auto-created)→ 恢复(重启/续接记得)
|
|
75
|
-
* ②b 内存活跃记录(同 scope)→ 恢复 + **自愈补写绑定**(防御纵深:绑定写失败/事件形态未落盘时
|
|
76
|
-
* 仍复用同一 SESSION,而不是每条消息新建一个——v1.30.5 及更早"每条消息一个 SESSION"的放大效应)
|
|
77
|
-
* ③ 无 → 自动创建专属 SESSION(createSession desc=`<role> skiff`——编号自动递增,用户不关心是谁)
|
|
78
|
-
*
|
|
79
|
-
* @param persistent 该 skiff 会话是否有**持久身份**(固定会话 id)。默认 true(向后兼容调用点);
|
|
80
|
-
* `createSkiffAgent` 传 `sessionId !== undefined`,微信桥的 existing 快路径传 true。
|
|
81
|
-
* @returns 绑定后的 SESSION.md 绝对路径(供提示词注入);不适用/失败 → null
|
|
82
|
-
*/
|
|
83
|
-
export declare function ensureSkiffSession(root: string, agent: Agent, roleName: string, role: SkiffRoleConfig, persistent?: boolean): string | null;
|
|
84
|
-
interface SkiffAgentRef {
|
|
85
|
-
handle: AgentHandle;
|
|
86
|
-
agent: Agent;
|
|
87
|
-
sessionId: string;
|
|
88
|
-
/** true = 从持久化恢复既有会话(历史延续,非新对话);false = 新建(首次/无持久化) */
|
|
89
|
-
resumed: boolean;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* 创建 Skiff agent:标准 DSH agent + cwd=CCC root + 角色模型 +
|
|
93
|
-
* standard preset(平台工具面)+ scoped 系统提示词(基础提示词 + CCC 定义段,全替换 ACC 默认注入)。
|
|
94
|
-
*
|
|
95
|
-
* **固定 sessionId 的 resume-or-create(v1.27.2,微信桥 id collision 修复)**:
|
|
96
|
-
* 指定 sessionId 且磁盘已有持久化 log → `ctx.agents.resume`(DSH 持久化语义:
|
|
97
|
-
* sessionId 即身份,已持久化会话必须 resume——历史 + turn 续号延续,同用户长期记忆保留);
|
|
98
|
-
* 无 log(首次)/持久化未配置 → `ctx.agents.create`(新建)。不指定 sessionId →
|
|
99
|
-
* 随机 id 恒 create(调试页默认路径)。
|
|
100
|
-
*
|
|
101
|
-
* @param sessionId 指定会话 id(可选;微信桥等外部面用固定 id 实现用户↔会话长期映射——
|
|
102
|
-
* 不传则随机生成 skiff-<role>-<uuid>,调试页默认路径)
|
|
103
|
-
*/
|
|
104
|
-
export declare function createSkiffAgent(ctx: Context, root: string, roleName: string, role: SkiffRoleConfig, defaultModel?: string, sessionId?: string): Promise<SkiffAgentRef>;
|
|
105
|
-
export interface SkiffCognitiveTrajectoryEntry {
|
|
106
|
-
role: 'user' | 'assistant' | 'tool';
|
|
107
|
-
text: string;
|
|
108
|
-
/** assistant 的工具调用名(有则填) */
|
|
109
|
-
tool?: string;
|
|
110
|
-
}
|
|
111
|
-
interface SkiffAskResult {
|
|
112
|
-
answer: string;
|
|
113
|
-
sessionId: string;
|
|
114
|
-
cognitiveTrajectory: SkiffCognitiveTrajectoryEntry[];
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* 提问一轮:followup → 等 idle → 读答案 + 轨迹。
|
|
118
|
-
* @param eventsStart 轨迹起点:显式传 0 = 全量轨迹(会话追问时页面重绘完整时间线,
|
|
119
|
-
* v1.25.10 用户拍板);不传(undefined)= 本轮增量(followup 前 events 之后)
|
|
120
|
-
* @param options.includeCognitiveTrajectory 是否计算轨迹(v1.26.10 起供**对外面**传 false 跳过计算——
|
|
121
|
-
* 原消费方 = 3100 公开问答页 / ACP JSON-RPC,**该面已于 2026-10-15 退役** ⇒ 现无生产调用方传 false;
|
|
122
|
-
* 3099 调试页默认 true 保留)
|
|
123
|
-
*/
|
|
124
|
-
export declare function askSkiff(ctx: Context, agent: Agent, question: string, eventsStart?: number, options?: {
|
|
125
|
-
includeCognitiveTrajectory?: boolean;
|
|
126
|
-
}): Promise<SkiffAskResult>;
|
|
127
|
-
/**
|
|
128
|
-
* Skiff 会话的轨迹纪律参与判定:非 skiff 会话恒 true(正常参与);
|
|
129
|
-
* skiff 会话按角色 cognitiveTrajectory 子集(session/keeper/rebuild)决定;
|
|
130
|
-
* 注册表缺失(进程重启遗留等)→ 保守旁路(false,完全独立)。
|
|
131
|
-
*/
|
|
132
|
-
export declare function skiffCognitiveTrajectoryEnabled(root: string, sessionId: string | undefined, key: 'session' | 'keeper' | 'rebuild'): boolean;
|
|
133
|
-
interface SkiffMsmGate {
|
|
134
|
-
/** 拒绝原因(有则拒绝执行) */
|
|
135
|
-
reject?: string;
|
|
136
|
-
/** list 显示白名单(msms);仅 action==='list' 时有值 */
|
|
137
|
-
whitelist?: Set<string>;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* msm 工具的 Skiff 门控:非 skiff 会话恒放行;skiff 会话——
|
|
141
|
-
* exec 非白名单 MSM 拒绝(不列名单)、register/deregister 必拒、
|
|
142
|
-
* list 白名单过滤、check/guide/ccc-config 只读放行。
|
|
143
|
-
*/
|
|
144
|
-
export declare function skiffMsmGate(root: string, sessionId: string | undefined, action: string, name?: string): SkiffMsmGate;
|
|
145
|
-
export {};
|
package/lib/skiff-registry.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* skiff-registry.ts — Skiff 会话注册表(sessionId → {role, ccc};零 DSH 依赖,可被任何 seams 安全 import)
|
|
3
|
-
*
|
|
4
|
-
* F4b 会话映射:Skiff agent 创建时注册(skiff-core),guards/seams 按 sessionId 查角色。
|
|
5
|
-
* 独立成模块的原因:guards.ts 等拦截缝需要查角色而不引入 skiff-core 的运行时依赖
|
|
6
|
-
* (skiff-core 依赖 @deepseek-ai/dsh-llm,测试/装配级联成本高)——注册表本身纯内存 Map。
|
|
7
|
-
*
|
|
8
|
-
* 值结构 v1.25.10 扩展:role(guards/seams 依赖,向后兼容)+ ccc(会话追问时
|
|
9
|
-
* 角色/容器绑定校验——同 sessionId 复用必须同 (role, ccc),防串角色污染)。
|
|
10
|
-
*
|
|
11
|
-
* 生命周期:进程内存态;连接/页面关闭时 unregister;进程重启自然清空(skiff 会话不复存在)。
|
|
12
|
-
*/
|
|
13
|
-
/** 注册表值:会话绑定的角色 + CCC 根(追问延续校验用) */
|
|
14
|
-
interface SkiffSessionBinding {
|
|
15
|
-
role: string;
|
|
16
|
-
ccc: string;
|
|
17
|
-
}
|
|
18
|
-
/** 查 sessionId 的 Skiff 角色名(无 → null)——向后兼容(guards/seams 依赖) */
|
|
19
|
-
export declare function skiffRoleFor(sessionId: string): string | null;
|
|
20
|
-
/** 查 sessionId 的完整绑定(role + ccc;无 → null)——v1.25.10 会话追问校验 */
|
|
21
|
-
export declare function skiffSessionInfo(sessionId: string): SkiffSessionBinding | null;
|
|
22
|
-
export declare function registerSkiffSession(sessionId: string, role: string, ccc: string): void;
|
|
23
|
-
export declare function unregisterSkiffSession(sessionId: string): void;
|
|
24
|
-
/** 测试/调试:注册表快照(sessionId → {role, ccc}) */
|
|
25
|
-
export declare function skiffSessionSnapshot(): ReadonlyMap<string, SkiffSessionBinding>;
|
|
26
|
-
export {};
|