@shgroup/dsh-serenity-hooks 1.47.3 → 1.48.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/dsh.plugin.json +1 -1
- package/lib/agent-idle.d.ts +17 -3
- package/lib/api.d.ts +0 -10
- package/lib/{ccc-roots-NpTWo0-c.js → ccc-roots-Duk89a-h.js} +11 -0
- package/lib/ccc-roots.d.ts +12 -2
- package/lib/clock-runtime.d.ts +12 -7
- package/lib/cro-turns.d.ts +19 -6
- package/lib/cro.d.ts +0 -2
- package/lib/index.js +2373 -58
- package/lib/live-sessions.d.ts +14 -4
- package/lib/{message-source-aR-FJ38L.js → message-source-D72jte0u.js} +46 -5
- package/lib/msm-ops.d.ts +3 -1
- package/lib/opencode-provider.d.ts +53 -0
- package/lib/tools/trajectory.d.ts +0 -22
- package/lib/trajectory-assistant.d.ts +3 -8
- package/lib/trajectory-bound.d.ts +0 -17
- package/lib/trajectory-ops.d.ts +29 -2
- package/lib/trajectory-skills.d.ts +0 -2
- package/lib/wake-scheduler.d.ts +4 -5
- package/package.json +1 -1
- package/lib/session-cleanup-BtkSmry8.js +0 -213
- package/lib/wake-scheduler-BR4hD8Vj.js +0 -1888
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-serenity-hooks",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.48.0",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"description": "宁静号 ACC harness(Native Cordis 插件):给 DSH 装一个「AI 工作区」——11 个工具(container_fs/container_trajectory/dashboard/container_git/msm/praxis/handyman/localstore/container_admin/im-bridge/acc-diag;后两个按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫)+ 轨迹日志与原地重建 + 网页登录入口/微信桥/子角色/对外问答页/trajectory 唤醒注册表。适配 DSH 0.1.5-rc.2(deepseek-ai/deepseek-harness)。",
|
|
6
6
|
"engines": {
|
package/lib/agent-idle.d.ts
CHANGED
|
@@ -15,13 +15,27 @@
|
|
|
15
15
|
* 无超时:agent 工作多久等多久(handyman 可永续)。订阅后再查一次 `agent.status`——
|
|
16
16
|
* 宿主 `followup`/`steer` 会同步把 phase 置为 running(`agent.ts:181-201`),
|
|
17
17
|
* 因此此刻读到 idle 只可能是"唤醒已在订阅前收敛",立即结算以避免漏事件挂死。
|
|
18
|
+
*
|
|
19
|
+
* ── 🔴 2026-09-25 I2 收敛(约束文档 §2.7 违反清单,L1 违反之一)────────────────
|
|
20
|
+
* **`ctx` 参数类型从 `Context` 改为 `unknown`** ⇒ 消除本文件的 `W2`(宿主 `cordis` 类型)接触。
|
|
21
|
+
*
|
|
22
|
+
* **判据(本文件与前两个不同:它不是"纯透传",但仍适用)**:本模块**确实用** `ctx`,
|
|
23
|
+
* 但用法是**结构化读**而非类型化读 —— 原码第 47 行**本就写着**
|
|
24
|
+
* `(ctx as unknown as { on?: … }).on?.(…)`:它**主动绕过** `Context` 类型去取 `on`。
|
|
25
|
+
* ⇒ 那个 `Context` 注解**没有为这处调用提供任何类型保证**(调用点已弃用它),
|
|
26
|
+
* 它只贡献了一处 L1→宿主 的接触点。
|
|
27
|
+
* 🔵 **证据(可重跑)**:本文件**零处** `ctx.xxx` 类型化属性访问;
|
|
28
|
+
* 唯一的 `ctx` 使用点是被 `as unknown as` **双重断言**后的结构化调用。
|
|
29
|
+
* ⚠️ 与 `live-sessions.ts`/`ccc-roots.ts` 的区别:那两处是**纯透传**(连断言都没有);
|
|
30
|
+
* 本处是**结构化访问**。两者的共同结论一致:`Context` 注解未参与类型检查。
|
|
31
|
+
* 🔵 **`Agent` 类型 import 保留**:它**被真正使用**(`p?.agent === agent` 的同一性比较)
|
|
32
|
+
* ⇒ 属 §2.6 的 W2-类型,但本模块**不是**"只贡献接触点"那种 —— 它是真需要,故不在本次收敛面。
|
|
18
33
|
*/
|
|
19
|
-
import type { Context } from 'cordis';
|
|
20
34
|
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
21
35
|
/**
|
|
22
36
|
* 等待 agent 空闲或销毁。
|
|
23
|
-
* @param ctx
|
|
37
|
+
* @param ctx 宿主插件上下文(事件通道来源;**结构化访问**,故类型为 `unknown`,见文件头 I2 段)
|
|
24
38
|
* @param agent 目标 agent
|
|
25
39
|
* @returns 空闲、agent 销毁、或会话销毁时结算(永不 reject)
|
|
26
40
|
*/
|
|
27
|
-
export declare function waitAgentIdle(ctx:
|
|
41
|
+
export declare function waitAgentIdle(ctx: unknown, agent: Agent): Promise<void>;
|
package/lib/api.d.ts
CHANGED
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
* 经 ctx.webServer(webserver 服务,公开版由 httpServer 改名)注册;客户端与服务器同源,调用无信任围栏问题。
|
|
11
11
|
*/
|
|
12
12
|
import type { Context } from 'cordis';
|
|
13
|
-
import type { IncomingMessage } from 'node:http';
|
|
14
13
|
/** 图片落盘目录(CCC 根相对;S142 图片自动识别基础设施——粘贴图片落盘供 agent 经 CCC vlm MSM 自主处理) */
|
|
15
14
|
export declare const IMAGE_UPLOAD_DIR = "_tmp/images_from_user";
|
|
16
15
|
/** 文件落盘目录(CCC 根相对;v1.24.1 粘贴任意文件自动落盘——agent 经 CCC 既有 MSM(pdf-extract/archive-extract 等)自主处理) */
|
|
@@ -32,15 +31,6 @@ export declare function sanitizeFileName(name: string): string;
|
|
|
32
31
|
* 校验失败抛 Error(handler 转 400)。
|
|
33
32
|
*/
|
|
34
33
|
export declare function saveFileToTmp(root: string, fileName: string, data: string): string;
|
|
35
|
-
/**
|
|
36
|
-
* WebUI 专属动作的来源判别(C4 块 C:此前 **9 处内联** `req.headers['x-serenity-ui'] !== '1'`)。
|
|
37
|
-
*
|
|
38
|
-
* ⚠️ 语义边界(勿误读为认证):这是**客户端判别头**——任何本机能发 HTTP 的进程都可自带它
|
|
39
|
-
* (无密钥、无签名、不校验来源,见现状取证 §② 面 A "认证与守卫")。它区分的是
|
|
40
|
-
* "WebUI 触发的动作"与"agent/curl 触发的动作"(如 safe-mode 不可由 agent 自行开关)。
|
|
41
|
-
* 本 helper 只做**同一判据的归一**,不放宽也不收紧:判据、状态码、文案均由调用方给出。
|
|
42
|
-
*/
|
|
43
|
-
export declare function senderIsWebUi(req: IncomingMessage): boolean;
|
|
44
34
|
interface StatusApiRegistration {
|
|
45
35
|
configPaths?: string[];
|
|
46
36
|
}
|
|
@@ -22,6 +22,17 @@ import { basename } from "node:path";
|
|
|
22
22
|
*
|
|
23
23
|
* 不新增持久状态(Q5 裁决:**不新增"本机 CCC 名单"**、不扫盘、不写路径假设)——
|
|
24
24
|
* 枚举只读 **DSH 已有的三个来源**。
|
|
25
|
+
*
|
|
26
|
+
* ── 🔴 2026-09-25 I2 收敛(约束文档 §2.7 违反清单,L1 违反之一)────────────────
|
|
27
|
+
* **本模块的 `ctx` 参数类型从 `Context` 改为 `unknown`** —— 消除本文件唯一的 `W2` 接触。
|
|
28
|
+
*
|
|
29
|
+
* **判据(与 `live-sessions.ts` 同款,但本文件要多过一道):** 约束文档 §2.7 原记本处
|
|
30
|
+
* `Context` 是"**实测真被用到**"(因它调 `hostService(ctx,…)`/`hostSessions(ctx)`)。
|
|
31
|
+
* 🔴 **该判断把"透传"与"解引用"混为一谈了** —— 实测本文件 `ctx` 的**唯一**去向是
|
|
32
|
+
* **原样透传**给两个 L0 取数口(签名均为 `ctx: unknown`),**零处** `ctx.xxx` 属性访问。
|
|
33
|
+
* ⇒ `Context` 这个 import **未参与任何类型检查**,只贡献了一处 L1→宿主 的接触点。
|
|
34
|
+
* 🔵 **证据(可重跑)**:grep 本文件 —— `ctx.` **0 命中**;`ctx` 命中全在
|
|
35
|
+
* 参数位/调用位(`hostService(ctx, …)` / `hostSessions(ctx)`)。
|
|
25
36
|
*/
|
|
26
37
|
var ccc_roots_exports = /* @__PURE__ */ __exportAll({
|
|
27
38
|
NO_CCC_FROM_AGENT_CWD: () => NO_CCC_FROM_AGENT_CWD,
|
package/lib/ccc-roots.d.ts
CHANGED
|
@@ -17,8 +17,18 @@
|
|
|
17
17
|
*
|
|
18
18
|
* 不新增持久状态(Q5 裁决:**不新增"本机 CCC 名单"**、不扫盘、不写路径假设)——
|
|
19
19
|
* 枚举只读 **DSH 已有的三个来源**。
|
|
20
|
+
*
|
|
21
|
+
* ── 🔴 2026-09-25 I2 收敛(约束文档 §2.7 违反清单,L1 违反之一)────────────────
|
|
22
|
+
* **本模块的 `ctx` 参数类型从 `Context` 改为 `unknown`** —— 消除本文件唯一的 `W2` 接触。
|
|
23
|
+
*
|
|
24
|
+
* **判据(与 `live-sessions.ts` 同款,但本文件要多过一道):** 约束文档 §2.7 原记本处
|
|
25
|
+
* `Context` 是"**实测真被用到**"(因它调 `hostService(ctx,…)`/`hostSessions(ctx)`)。
|
|
26
|
+
* 🔴 **该判断把"透传"与"解引用"混为一谈了** —— 实测本文件 `ctx` 的**唯一**去向是
|
|
27
|
+
* **原样透传**给两个 L0 取数口(签名均为 `ctx: unknown`),**零处** `ctx.xxx` 属性访问。
|
|
28
|
+
* ⇒ `Context` 这个 import **未参与任何类型检查**,只贡献了一处 L1→宿主 的接触点。
|
|
29
|
+
* 🔵 **证据(可重跑)**:grep 本文件 —— `ctx.` **0 命中**;`ctx` 命中全在
|
|
30
|
+
* 参数位/调用位(`hostService(ctx, …)` / `hostSessions(ctx)`)。
|
|
20
31
|
*/
|
|
21
|
-
import type { Context } from 'cordis';
|
|
22
32
|
/**
|
|
23
33
|
* 工具/缝里"取会话工作目录"的那段形状的最小模型。
|
|
24
34
|
* 多数工具只带 `agent`(`exec.agent.session.header.cwd`);少数缝把 agent 本身传进来。
|
|
@@ -102,4 +112,4 @@ export interface ListCccsOptions {
|
|
|
102
112
|
* @param opts.defaultRoot 默认根(不在列表 → 置首);opts.withRoles 是否读 `skiff.roles`
|
|
103
113
|
* @returns 按上述顺序去重的 CCC 条目(无任何来源 → 空数组 + 可选默认根)
|
|
104
114
|
*/
|
|
105
|
-
export declare function listCccs(ctx:
|
|
115
|
+
export declare function listCccs(ctx: unknown, opts?: ListCccsOptions): Promise<CccEntry[]>;
|
package/lib/clock-runtime.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* clock-runtime.ts — **时钟运行时工厂**(S142 §38 复审候选 C6b,路径 **P2**)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* · 唤醒调度器(`wake-scheduler.ts`,一次性唤醒,D58
|
|
6
|
-
* · autopilot 时钟(`autopilot-trajectory.ts`,周期自唤醒,D59
|
|
4
|
+
* 🔴 2026-09-25(S142 分批清死代码·第 1 批)**更正**:本文件当初是为**两条**独立 5min 时钟抽出的公共引擎:
|
|
5
|
+
* · 唤醒调度器(`wake-scheduler.ts`,一次性唤醒,D58)—— **现存**
|
|
6
|
+
* · autopilot 时钟(`autopilot-trajectory.ts`,周期自唤醒,D59)—— 🔴 **已随 v1.35.0 整段退场**
|
|
7
7
|
* 二者的**业务判据完全不同**(谁来扫 / 扫什么 / 投递给谁 / 按什么周期),但**引擎骨架逐字同形**
|
|
8
8
|
* ——进程态 + 快照 + 复位 + `startTimer` + tick 外壳 + 事件接线 + disposer + `timer.unref()`。
|
|
9
|
-
*
|
|
9
|
+
* 本条把**引擎**抽到本工厂,**各钟仍各持自己的定时器与自己的串行链**(现存的那一钟 = 唤醒调度器)。
|
|
10
10
|
*
|
|
11
11
|
* ───────────────────────────────────────────────────────────────────────────
|
|
12
12
|
* 🔴 硬约束一:**两条时钟绝不可共用"排队执行"的链**(这是 P2 与 P1 的分界判据)
|
|
@@ -26,7 +26,9 @@
|
|
|
26
26
|
*
|
|
27
27
|
* 🔴 硬约束三:**闸是可选能力,工厂不得替调用方假设"必须有闸"**(v1.34 S-1 解耦 → 2026-09-21 收窄)
|
|
28
28
|
*
|
|
29
|
-
*
|
|
29
|
+
* 🔴 2026-09-25(S142 分批清死代码·第 1 批)**更正:当前零条闸在用** —— 现存唯一那一钟
|
|
30
|
+
* (唤醒调度器)本已无闸,而"曾只余的那一条" `autopilotWakeEnabled` 已随 **v1.35.0 autopilot
|
|
31
|
+
* 整段退场**一并消失 ⇒ `gate` **缺省即常态,不是特例**。**唤醒调度器已无闸**
|
|
30
32
|
* (原 `wakeSchedulerEnabled` 于 2026-09-21 所有者令砍掉 ⇒ 调用方**不传** `gate`
|
|
31
33
|
* = 恒武装、永不因闸跳过、`enabled` 恒 `true`)。工厂取 `gate` **回调**(每次现读),
|
|
32
34
|
* **不做**任何合并或缓存;**缺省无闸是合法形态,不是漏配**。
|
|
@@ -169,8 +171,11 @@ export interface ClockOptions<T> {
|
|
|
169
171
|
* `ticks`/`lastTickAt` 在**枚举到 live+enabled CCC 之后、任何 await 之前**同步记账;
|
|
170
172
|
* "无 CCC 可扫" 的那一拍**不计**(既有行为:`ticks` 停在 0 直到真有 CCC 可唤起)。
|
|
171
173
|
* 若把它交给工厂"body 前同步记账",就会**在闸之后无条件 +1**——那会把
|
|
172
|
-
* "无 CCC 可扫时不计数"
|
|
173
|
-
*
|
|
174
|
+
* "无 CCC 可扫时不计数"这条既有语义改掉(🔴 **回归钉在 `clock-runtime.test.ts`**:
|
|
175
|
+
* 『`bodyCountsTick=true` → 工厂不记账,由 body 决定(autopilot 语义:无目标则不计)』
|
|
176
|
+
* +『body 调 `countTick` 才计,且可在 await 之前同步计』—— 原文曾指向
|
|
177
|
+
* `autopilot-trajectory.test.ts`,**该文件已随 v1.35.0 退场、全仓不存在**
|
|
178
|
+
* ⇒ 2026-09-25 **只修引用**,语义与断言逐字未动)。
|
|
174
179
|
*
|
|
175
180
|
* ⚠️ 故本项**不是**"记账早晚"的风格开关,而是"**谁**知道该不该记"的归属划分:
|
|
176
181
|
* 知道"有没有目标"的只有 body ⇒ 由 body 决定何时记账。
|
package/lib/cro-turns.d.ts
CHANGED
|
@@ -48,8 +48,6 @@
|
|
|
48
48
|
* **查询时按轨迹聚合**(`listBoundSessionIds` → 「任一载体在跑」⇒ 该轨迹在跑)。
|
|
49
49
|
* ⚠️ 这也天然处理了「同一轨迹多载体」(S142 曾挂 4 条)的情形。
|
|
50
50
|
*/
|
|
51
|
-
import type { Context } from 'cordis';
|
|
52
|
-
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
53
51
|
/** 一次「在跑」记录的 TTL(见文件头的方向性判据) */
|
|
54
52
|
export declare const TURN_TTL_MS: number;
|
|
55
53
|
/** 标记「在跑」(`agent/created` + `agent/status=running` 调用) */
|
|
@@ -88,8 +86,23 @@ export declare function __resetCroTurnsForTest(): void;
|
|
|
88
86
|
*
|
|
89
87
|
* ⚠️ **失败不抛**:任一事件通道缺失 ⇒ 响亮日志 + 该订阅跳过(**apply 不可成为启动单点**,
|
|
90
88
|
* 与 `registerDeepseekVisionPatch` 等既有装配同款纪律)。
|
|
91
|
-
*
|
|
89
|
+
*
|
|
90
|
+
* ── 🔴 2026-09-25 I2 收敛(约束文档 §2.7 违反清单,L1 违反之一)────────────────
|
|
91
|
+
* **两个宿主 import 全部清除**(`Context`(cordis)+ `Agent`(`@deepseek-ai/dsh-agent`)),
|
|
92
|
+
* `ctx` 参数类型 → `unknown`。
|
|
93
|
+
*
|
|
94
|
+
* 🔴 **本处顺带更正 §2.7 的一处分档**:本文件原被列在"剩余 3 个属**真依赖**档"里,
|
|
95
|
+
* 但**逐符号查证后与那个判断不符** ——
|
|
96
|
+
* · `Context`:`ctx` 只被**结构化访问**(原码本就写着 `ctx as unknown as { on: … }`)
|
|
97
|
+
* ⇒ 该注解未提供任何类型保证(与 `agent-idle.ts` 同档)。
|
|
98
|
+
* · `Agent`:**导入后从未使用** —— 事件 payload 一律按 `{ agent?: unknown }` 解构,
|
|
99
|
+
* 再交给 `sessionIdOf(...)`(它收 `unknown`)。⇒ **纯粹是死 import**。
|
|
100
|
+
* ⇒ **判据(本件再证一次,且比上一件更硬)**:分档**必须逐符号看"它有没有参与类型检查"**,
|
|
101
|
+
* **不能按文件整档划分** —— 同一个文件里可以并存"真依赖符号"与"纯名义符号"。
|
|
102
|
+
* 🔵 **剩余 2 个文件**才是真依赖档:`rebuild.ts` 用 `Session`/`SessionEvent`/
|
|
103
|
+
* `deriveEventMessage`/`Agent` 等**真调用**的类型;`wake-scheduler.ts` 用 `Agent` 的
|
|
104
|
+
* `followup`/`steer`(**真调用**)⇒ 它们走 §2.7-③ **选项 (b)** 或把中立接口下沉到 L0,
|
|
105
|
+
* **另立一件**(D85 一次只改一件事)。
|
|
106
|
+
* @param ctx 插件上下文(**结构化访问** `on`,故类型为 `unknown`,见下方 I2 说明)
|
|
92
107
|
*/
|
|
93
|
-
export declare function registerCroTurnTracking(ctx:
|
|
94
|
-
/** 类型再导出(调用方少一处 import) */
|
|
95
|
-
export type { Agent as CroAgent };
|
|
108
|
+
export declare function registerCroTurnTracking(ctx: unknown): void;
|
package/lib/cro.d.ts
CHANGED
|
@@ -256,8 +256,6 @@ export declare function listCroTrajectories(root: string): string[];
|
|
|
256
256
|
* @returns 执行结果(含输出的解析交由 `parseCroOutput`)
|
|
257
257
|
*/
|
|
258
258
|
export declare function runCroProcess(scriptAbs: string, stdinJson: string, timeoutMs?: number): Promise<CroRunResult>;
|
|
259
|
-
/** 读 SESSION.md 体积(供看门狗判据等复用;读不到 ⇒ null) */
|
|
260
|
-
export declare function readSessionMdBytes(mdPath: string): number | null;
|
|
261
259
|
/** 读取快照所需的 fs 侧数据(**纯读取,不抛**) */
|
|
262
260
|
export declare function readCroSnapshotInput(root: string, dirName: string, nowMs: number, extras: {
|
|
263
261
|
liveSessionIds: string[];
|