@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/wake-registry.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wake-registry.ts —
|
|
2
|
+
* wake-registry.ts — 认知轨迹唤醒注册表(D58,S142 2026-09-13)
|
|
3
3
|
*
|
|
4
|
-
* 需求(用户原话):一个 CCC
|
|
4
|
+
* 需求(用户原话):一个 CCC 内允许多个认知轨迹任意形态并行;某个认知轨迹可以
|
|
5
5
|
* **预定未来唤醒自己或别人**,本质上是一次「未来时刻 + 一条 message」的投递;「周期自唤醒」
|
|
6
6
|
* 曾是它的特例(原 ACC autopilot / D59,该机制已于 2026-09-15 整段退场)。协作边界:
|
|
7
7
|
* 互相可见、**无阻塞无等待**。
|
|
@@ -24,11 +24,11 @@ type WakeState = 'pending' | 'delivered' | 'missed' | 'cancelled';
|
|
|
24
24
|
export interface WakeEntry {
|
|
25
25
|
/** 稳定 id(不复用;`w-<当地到分钟>-<4 hex>`) */
|
|
26
26
|
id: string;
|
|
27
|
-
/**
|
|
27
|
+
/** 目标认知轨迹:`S###` 或完整 AGENT_SESSIONS 目录名(编码无关,与绑定锚一致) */
|
|
28
28
|
target: string;
|
|
29
29
|
/** 绝对时刻(当地 RFC3339 带偏移,如 `2026-09-14T09:00:00.000+08:00`) */
|
|
30
30
|
at: string;
|
|
31
|
-
/** 唤醒 message
|
|
31
|
+
/** 唤醒 message(投递给目标认知轨迹的正文) */
|
|
32
32
|
message: string;
|
|
33
33
|
/** 状态 */
|
|
34
34
|
state: WakeState;
|
|
@@ -79,7 +79,7 @@ export declare function parseWakeAt(input: string, nowMs: number): {
|
|
|
79
79
|
/**
|
|
80
80
|
* 登记一条唤醒。
|
|
81
81
|
* @param root CCC 根
|
|
82
|
-
* @param input
|
|
82
|
+
* @param input 目标认知轨迹 / 时刻串 / message / 发起者 / 当前时刻
|
|
83
83
|
* @returns 成功返回条目,失败返回稳定错误文案(不抛错)
|
|
84
84
|
*/
|
|
85
85
|
export declare function addWake(root: string, input: {
|
package/lib/wake-scheduler.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wake-scheduler.ts —
|
|
2
|
+
* wake-scheduler.ts — 认知轨迹唤醒调度器(D58/D59/D60;S142 2026-09-13)
|
|
3
3
|
*
|
|
4
4
|
* 一个**中心调度器**(5min tick,复用 autopilot 的节律常量),处理 CCC 唤醒注册表里
|
|
5
|
-
* 到期的条目:把「未来时刻 + 一条 message
|
|
5
|
+
* 到期的条目:把「未来时刻 + 一条 message」投递给目标认知轨迹,**fire-and-forget**
|
|
6
6
|
* (无阻塞、无等待、无回执——发起方不 await,调度器不替模型结果负责)。
|
|
7
7
|
*
|
|
8
8
|
* 与 autopilot 的关系(D59):**两个 tick 各自独立**。autopilot 是每 CCC 单例的
|
|
@@ -100,7 +100,7 @@ export declare function deliverWake(ctx: unknown, root: string, entry: WakeEntry
|
|
|
100
100
|
*/
|
|
101
101
|
export declare function buildSendText(target: WakeTarget, message: string, sender: string): string;
|
|
102
102
|
/**
|
|
103
|
-
* 即时投递(`
|
|
103
|
+
* 即时投递(`cognitive_trajectory send-now`)——与 `send-later`(预约)**共用取用通路**(`acquireWakeAgent`),
|
|
104
104
|
* 区别只在**时刻**(现在 vs 未来)与**回执**(有 vs 无):
|
|
105
105
|
* · `send-later`(原 `wake-later`):未来时刻 + 一条 message → 落注册表 → 本文件的调度器到点投递(**fire-and-forget,无回执**)
|
|
106
106
|
* · `send-now`(原 `send-message`):**此刻**把一条 message 递给目标 → **同步回执** → **不落注册表**
|
|
@@ -127,7 +127,7 @@ export declare function buildSendText(target: WakeTarget, message: string, sende
|
|
|
127
127
|
* 预约的本职是"到点唤起",且在跑时排队不打断是它被实证验收过的行为,不顺手动它。
|
|
128
128
|
*
|
|
129
129
|
* **归属**:本函数放在调度器侧而非工具侧 —— "怎么把一句话送到一条轨迹"是**调度器的知识**,
|
|
130
|
-
* 工具只该知道"有这个动作"。这样 `trajectory.ts` 完全不碰调度器内部(v1.35.0 硬约束①:
|
|
130
|
+
* 工具只该知道"有这个动作"。这样 `cognitive-trajectory.ts` 完全不碰调度器内部(v1.35.0 硬约束①:
|
|
131
131
|
* `send-later` 链路**一行为不动**,本次改动 = **纯新增**)。
|
|
132
132
|
*
|
|
133
133
|
* @param ctx 插件上下文
|
|
@@ -137,7 +137,7 @@ export declare function buildSendText(target: WakeTarget, message: string, sende
|
|
|
137
137
|
* @param sender 发起者轨迹标识
|
|
138
138
|
* @returns 投递结果(**同步**返回给调用方)
|
|
139
139
|
*/
|
|
140
|
-
export declare function
|
|
140
|
+
export declare function sendToCognitiveTrajectory(ctx: unknown, root: string, target: string, message: string, sender: string): Promise<WakeDeliveryResult>;
|
|
141
141
|
/**
|
|
142
142
|
* CRO 唤起消息正文(**刻意不复用** {@link buildWakeText} / {@link buildSendText})。
|
|
143
143
|
*
|
package/lib/weixin-bridge.d.ts
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* `human-channel.ts`(机器级机制;本文件只接线)。这是"微信桥上移 ACC 层"的第一步。
|
|
22
22
|
*
|
|
23
23
|
* 外部面纯净(D9/D11 延续):微信桥会话 = 外部面——session/prompt 走
|
|
24
|
-
*
|
|
24
|
+
* includeCognitiveTrajectory:false(对外不返回轨迹);skiff 角色白名单即授权(G9)。
|
|
25
25
|
*/
|
|
26
26
|
import type { Context } from 'cordis';
|
|
27
27
|
import { type WeixinAccountCredential } from './weixin-route.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
|
|
2
|
-
import { s as loadSerenityConfig, t as DEFAULT_SERENITY_CONFIG_PATHS } from "./ccc-
|
|
3
|
-
import { c as unsetEntry, l as writeEntry, r as getEntry } from "./localstore-ops-
|
|
2
|
+
import { s as loadSerenityConfig, t as DEFAULT_SERENITY_CONFIG_PATHS } from "./ccc-C33QWoWZ.js";
|
|
3
|
+
import { c as unsetEntry, l as writeEntry, r as getEntry } from "./localstore-ops-ylQoPz1Q.js";
|
|
4
4
|
import { join, resolve } from "node:path";
|
|
5
5
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
6
6
|
import { createHash } from "node:crypto";
|
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/
|
|
3
|
+
"version": "1.65.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 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫/对外输出守卫)+ 认知轨迹日志与原地重建 + 网页登录入口/微信桥/子角色/官方 ACP 面/认知轨迹唤醒注册表。适配 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/unattended-ops.d.ts
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* unattended-ops.ts — 无人值守代理回复(unattended proxy)机制层(S142 **D77**,owner 2026-09-23 提案)
|
|
3
|
-
*
|
|
4
|
-
* ## 这东西用来干什么(白话)
|
|
5
|
-
*
|
|
6
|
-
* 用户发个任务就走开。现在模型干完一段就停下来等回话,用户不在 ⇒ **会话挂在那儿不动**。
|
|
7
|
-
* 本机制 = 用户走开后,系统**代替用户说一句"继续"**:让它自己跑完;干完了用一个**验证码**报告;
|
|
8
|
-
* 卡住了先自己想办法;真不能定的**写下来等用户回来**。
|
|
9
|
-
*
|
|
10
|
-
* ## 归属(D23:ACC 管机制与数据,CCC 管措辞与纪律)
|
|
11
|
-
*
|
|
12
|
-
* | 面 | 归谁 | 内容 |
|
|
13
|
-
* |---|---|---|
|
|
14
|
-
* | **机制** | 🔴 **ACC(本模块)** | 触发判定 / 验证码 / 四选一结构 / 轮上限 / 流水 |
|
|
15
|
-
* | **不可代批的*具体内容*** | **CCC 纪律** | ACC 只给**通用下限**({@link UNATTENDED_BLOCKED_FLOOR}),CCC 可加严 |
|
|
16
|
-
*
|
|
17
|
-
* 🔵 下限之所以落在 ACC(而不是"完全交给 CCC"):**没有这张清单,"自行解决"=把所有把关点自动放行**。
|
|
18
|
-
* 最终内容仍待 owner 一句(设计 §13-5)——本版先给**保守下限**,CCC 只能在其上加严、不得放宽。
|
|
19
|
-
*
|
|
20
|
-
* ## 🔴 核心原则:单一续驱者(single-driver)
|
|
21
|
-
*
|
|
22
|
-
* > **一个会话同一时刻只应有一个"续驱者":用户 / CRO / 自排绳 / 无人值守代理。**
|
|
23
|
-
*
|
|
24
|
-
* 口径(owner 2026-09-23 19:1x 裁决)= **窄口径:只排除「有 CRO 程序的轨迹」**。
|
|
25
|
-
* 原「宽口径」(任何自排唤醒都排除)**作废** —— 它会让本机制**永远够不着靠续接绳活着的会话**,
|
|
26
|
-
* 等于**放弃"代替旧机制"**(绳因此退化为**长周期保险丝**:6–12h 一条)。
|
|
27
|
-
*
|
|
28
|
-
* ## 🔴 铁律(与 `cro.ts` / `cro-log.ts` 同族,勿破)
|
|
29
|
-
*
|
|
30
|
-
* **本模块的每个导出函数都不抛错**:写盘 / 解析 / 裁剪失败一律返回结构化失败。
|
|
31
|
-
* ⇒ 代理机制的任何问题**不影响 turn 收尾**、不影响既有链路(唤醒投递 / 输出守卫 / rebuild)。
|
|
32
|
-
*
|
|
33
|
-
* ## 🔴 为什么不构成第二真相源(勿删此论证)
|
|
34
|
-
*
|
|
35
|
-
* | 载体 | 谁写 | 主语 | 回答 |
|
|
36
|
-
* |---|---|---|---|
|
|
37
|
-
* | `<轨迹目录>/unattended-log.json`(**本模块**) | **ACC** | ACC | 「**我注入了什么、判了什么、放过没有**」 |
|
|
38
|
-
* | `<轨迹目录>/SESSION.md` | **LLM(CCC)** | CCC | 「**这轮发生了什么、为什么这么定**」 |
|
|
39
|
-
*
|
|
40
|
-
* **内容不重叠**:本模块只记**机械事实**(轮次 / 验证码 / 判定理由码 / 是否放过),**不写散文**;
|
|
41
|
-
* LLM 侧的散文与理由归 SESSION.md。完整审计 = 两者合看(本模块 = 注入面|SESSION.md = 判断面)。
|
|
42
|
-
*
|
|
43
|
-
* ## 🔴 验证码形态(禁用 4 位字母码)
|
|
44
|
-
*
|
|
45
|
-
* 注入文本**自带**"请回复 ABCD" ⇒ 模型**复述指令**即**假完成**(高概率,不是小概率)
|
|
46
|
-
* ⇒ 用**每轮新生成**的 nonce + **包装 + 独占一行**(`[[UNATTENDED-DONE:<hex>]]`),
|
|
47
|
-
* 明写「**旧码作废**」,校验**只认当前轮**(防上下文里的旧码复活)。
|
|
48
|
-
* 先例 = `cheap-worker` background 的 `SERENITY_CHEAP_WORKER_DONE_<16hex>`(同族实现)。
|
|
49
|
-
*/
|
|
50
|
-
/** 完成码包装前缀(**独占一行**才有意义;见文件头"禁用 4 位字母码") */
|
|
51
|
-
export declare const UNATTENDED_DONE_PREFIX = "[[UNATTENDED-DONE:";
|
|
52
|
-
/** 完成码包装后缀 */
|
|
53
|
-
export declare const UNATTENDED_DONE_SUFFIX = "]]";
|
|
54
|
-
/** 注入消息的**首行标记**(幂等可辨:模型与事后审计都能一眼看出这是代理消息,不是用户消息) */
|
|
55
|
-
export declare const UNATTENDED_PROXY_MARK = "[[UNATTENDED-PROXY v1]]";
|
|
56
|
-
/** 🔴 合成消息**固定身份句**(owner 已裁:「形如用户消息,但首句自报身份与权限边界」) */
|
|
57
|
-
export declare const UNATTENDED_IDENTITY_LINE = "\u65E0\u4EBA\u503C\u5B88\u4EE3\u7406 \u00B7 \u975E\u672C\u4EBA";
|
|
58
|
-
/** nonce 字节数 ⇒ 16 个 hex 字符(与 cheap-worker 同量级;够长到不可能被复述猜中) */
|
|
59
|
-
export declare const UNATTENDED_NONCE_BYTES = 8;
|
|
60
|
-
/** 生成一枚新 nonce(**每轮一枚**;旧码作废由调用方在文本里声明) */
|
|
61
|
-
export declare function newNonce(): string;
|
|
62
|
-
/** 完成码全文(注入文本展示用;校验走 {@link hasDoneToken}) */
|
|
63
|
-
export declare function doneToken(nonce: string): string;
|
|
64
|
-
/**
|
|
65
|
-
* 出现过的完成码 nonce 列表(按出现顺序、去重;**小写归一**)。
|
|
66
|
-
* 容忍 8–64 位 hex(模型可能手抄多/少几个字符 ⇒ 那就不匹配,属预期:只认本轮那枚)。
|
|
67
|
-
*/
|
|
68
|
-
export declare function parseDoneNonces(text: string): string[];
|
|
69
|
-
/** 本轮收尾文本里是否出现过**当前轮**那枚码(唯一合法收束判据) */
|
|
70
|
-
export declare function hasDoneToken(text: string, nonce: string): boolean;
|
|
71
|
-
/** 单个会话在一个"代理段"内的**轮次上限**(设计建议 10–20;取 15——远小于 cheap-worker 的 100) */
|
|
72
|
-
export declare const UNATTENDED_MAX_ROUNDS = 15;
|
|
73
|
-
/** 一个"代理段"的**墙钟上限**(自第一次注入起算;跨轮累计,防"轮次没到但烧了一天") */
|
|
74
|
-
export declare const UNATTENDED_MAX_WALL_MS: number;
|
|
75
|
-
/** 触及即停(写待办/交接,**不循环**)——**CCC 的纪律更严则从严** */
|
|
76
|
-
export declare const UNATTENDED_BLOCKED_FLOOR: readonly string[];
|
|
77
|
-
/** 注入消息装配输入 */
|
|
78
|
-
export interface ProxyMessageInput {
|
|
79
|
-
/** 本轮轮次号(1 起) */
|
|
80
|
-
round: number;
|
|
81
|
-
/** 轮上限(写进文本让模型知道还剩几轮) */
|
|
82
|
-
maxRounds: number;
|
|
83
|
-
/** 本轮 nonce */
|
|
84
|
-
nonce: string;
|
|
85
|
-
/** 不可代批清单(缺省 = {@link UNATTENDED_BLOCKED_FLOOR}) */
|
|
86
|
-
blocked?: readonly string[];
|
|
87
|
-
}
|
|
88
|
-
/** 组装一次代理注入消息(**形如用户消息,但首句自报身份与权限边界**) */
|
|
89
|
-
export declare function buildProxyMessage(input: ProxyMessageInput): string;
|
|
90
|
-
/**
|
|
91
|
-
* 组装一次**假完成打回**消息(设计 §7 的机械核验分支:声称已通知用户,但本轮无发送记录)。
|
|
92
|
-
*
|
|
93
|
-
* ⚠️ 同样带**新 nonce**:它是一次"再来一轮",不是"放过"。
|
|
94
|
-
*/
|
|
95
|
-
export declare function buildFalseNotifyRebuke(input: ProxyMessageInput): string;
|
|
96
|
-
/** 收尾文本是否**声称**已联系用户(见 {@link NOTIFY_CLAIM_PATTERNS} 的误判方向说明) */
|
|
97
|
-
export declare function claimsUserNotification(text: string): boolean;
|
|
98
|
-
/**
|
|
99
|
-
* **不许开**的会话(设计 §3 的"建议写死",本版**确实写死**):
|
|
100
|
-
* `skiff-`(F4 问答 / **微信桥会话也是这个前缀** —— 桥那侧的"用户"是**家人**,
|
|
101
|
-
* 代理替家人说话 = **冒充**)| `acp-`(对外程序化面 —— ⚠️ **2026-10-15 起已成死判据**:
|
|
102
|
-
* 该前缀从无生产者且面 E 已退役;理由与"为何保留"见 `output-guard-seam.ts` 文件头)|
|
|
103
|
-
* `cheap-worker-`(自主 worker,已有自己的完成码循环)。
|
|
104
|
-
*
|
|
105
|
-
* ⚠️ **`rebuild-` 不在排除面**(与 `output-guard-seam.ts` 的取向**刻意不同**):重建会话是
|
|
106
|
-
* **同一轨迹的载体**(内部维护面),不是对外面;把它排除会让"重建后就没人推了"。
|
|
107
|
-
*/
|
|
108
|
-
export declare function isProxyExcludedSessionId(sessionId: string): boolean;
|
|
109
|
-
/** 判定所需事实(**全部由 seam 取好**,本函数不做任何 I/O、不读时钟) */
|
|
110
|
-
export interface UnattendedFacts {
|
|
111
|
-
/** 总闸(settings `unattendedEnabled`,缺省关) */
|
|
112
|
-
enabled: boolean;
|
|
113
|
-
/** 本会话所属 CCC 根;null = 不在任何 CCC 内 */
|
|
114
|
-
root: string | null;
|
|
115
|
-
/** 是 CCC 内**主会话**(`delegationDepth === 0`;子代理/无头运行不算) */
|
|
116
|
-
isMainSession: boolean;
|
|
117
|
-
/** 会话 id 在排除面({@link isProxyExcludedSessionId}) */
|
|
118
|
-
sessionIdExcluded: boolean;
|
|
119
|
-
/** **本轮由真实用户消息发起**(`agent/inbox/claimed` + source.kind === 'user') */
|
|
120
|
-
userInitiated: boolean;
|
|
121
|
-
/** 该轨迹**有 CRO 程序**(窄口径的唯一排除项) */
|
|
122
|
-
hasCroProgram: boolean;
|
|
123
|
-
/** 该会话当前的代理段状态;null = 尚未开始 */
|
|
124
|
-
run: ProxyRun | null;
|
|
125
|
-
/** 当前时刻(epoch ms,由调用方注入 ⇒ 用例可穷举时间边界) */
|
|
126
|
-
nowMs: number;
|
|
127
|
-
/** 收尾文本里出现的当前轮候选码({@link parseDoneNonces} 的首个;无 ⇒ null) */
|
|
128
|
-
doneNonce: string | null;
|
|
129
|
-
/** 收尾文本**声称**已通知用户({@link claimsUserNotification}) */
|
|
130
|
-
claimsNotify: boolean;
|
|
131
|
-
/** 本轮窗口内 ACC 侧**确实**发出过消息({@link hasOutboundSendSince}) */
|
|
132
|
-
outboundSeen: boolean;
|
|
133
|
-
}
|
|
134
|
-
/** 判定结论(`reason` 是**机器可读理由码**:写进流水,便于事后 grep 归因) */
|
|
135
|
-
export interface UnattendedVerdict {
|
|
136
|
-
action: 'skip' | 'accept' | 'inject' | 'cap';
|
|
137
|
-
reason: string;
|
|
138
|
-
/** 轮次号:`inject` = **即将注入**的那一轮;`accept` / `cap` = 当前轮;`skip` = 0 */
|
|
139
|
-
round: number;
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* 一次判定的**唯一入口**(纯函数)。
|
|
143
|
-
*
|
|
144
|
-
* 顺序即语义(R↓,勿随意调换):
|
|
145
|
-
* 1. **闸/空间/会话资格**(关着、不在 CCC、非主会话、排除面)⇒ skip;
|
|
146
|
-
* 2. **单一续驱者**:用户刚发起 ⇒ skip(人就在场);该轨迹有 CRO ⇒ skip(程序在驱动);
|
|
147
|
-
* 3. **合法收束优先于轮上限** —— 最后一轮交的码必须算数(否则等于永远收不了尾);
|
|
148
|
-
* 4. 交码 + 声称已通知 + **无发送记录** ⇒ 假完成,走下一轮(reason=`false-notify`);
|
|
149
|
-
* 5. 墙钟 / 轮上限 ⇒ cap(**停下不动**,退回改造前的行为,不产生新风险);
|
|
150
|
-
* 6. 其余 ⇒ inject 下一轮。
|
|
151
|
-
*/
|
|
152
|
-
export declare function decideUnattendedAction(f: UnattendedFacts): UnattendedVerdict;
|
|
153
|
-
/** 一个会话的"代理段"状态(自第一次注入起算,直到 放过 / 上限 / 用户回来) */
|
|
154
|
-
export interface ProxyRun {
|
|
155
|
-
/** 已注入到第几轮 */
|
|
156
|
-
round: number;
|
|
157
|
-
/** **当前轮**的 nonce(校验只认它) */
|
|
158
|
-
nonce: string;
|
|
159
|
-
/** 第一次注入的时刻(墙钟上限的起算点,**跨轮累计**) */
|
|
160
|
-
startedAt: number;
|
|
161
|
-
}
|
|
162
|
-
/** 取该会话的代理段(无 ⇒ null) */
|
|
163
|
-
export declare function getProxyRun(sessionId: string): ProxyRun | null;
|
|
164
|
-
/** 开始 / 推进一段代理(`startedAt` 由调用方给出 ⇒ 跨轮保留首次值) */
|
|
165
|
-
export declare function setProxyRun(sessionId: string, run: ProxyRun): void;
|
|
166
|
-
/** 结束该会话的代理段(放过 / 上限 / 用户回来 / 载体销毁) */
|
|
167
|
-
export declare function clearProxyRun(sessionId: string): void;
|
|
168
|
-
/** 当前在代理的会话 id(诊断 / 测试用) */
|
|
169
|
-
export declare function proxyRunSessionIds(): string[];
|
|
170
|
-
/** 当前代理中、已注入轮数的合计(`acc-diag` 观测面用) */
|
|
171
|
-
export declare function activeProxyRoundTotal(): number;
|
|
172
|
-
/** 记下"这个载体的这一轮是真实用户发起的" */
|
|
173
|
-
export declare function noteUserTurn(sessionId: string, turn: number): void;
|
|
174
|
-
/** 该载体的这一轮是否由真实用户发起(判据 = `noteUserTurn` 写入的最新一条) */
|
|
175
|
-
export declare function isUserTurn(sessionId: string, turn: number | null | undefined): boolean;
|
|
176
|
-
/** 清掉该载体的用户轮次记录(载体销毁时) */
|
|
177
|
-
export declare function clearUserTurn(sessionId: string): void;
|
|
178
|
-
/** 清空全部进程内运行态(disposer;**不碰磁盘**) */
|
|
179
|
-
export declare function clearUnattendedState(): void;
|
|
180
|
-
/** 测试辅助:复位(生产零调用) */
|
|
181
|
-
export declare function __resetUnattendedForTest(): void;
|
|
182
|
-
/** 每个 CCC 保留的最近发送条数(环形裁剪 ⇒ 表大小有界) */
|
|
183
|
-
export declare const UNATTENDED_OUTBOUND_KEEP = 20;
|
|
184
|
-
/** 发送记录保留窗(超出即丢:它只服务"这一轮到底发没发"这个瞬时问题) */
|
|
185
|
-
export declare const UNATTENDED_OUTBOUND_TTL_MS: number;
|
|
186
|
-
/**
|
|
187
|
-
* 记一次**成功的**出站发送(`im-bridge` 工具面在通道返回成功后调用)。
|
|
188
|
-
*
|
|
189
|
-
* ⚠️ **覆盖边界(诚实标注)**:只覆盖 **ACC 自己这条通道**(`im-bridge` 的 send / send-file)。
|
|
190
|
-
* CCC 自有的发送通道(如 `mail-tool` MSM)**ACC 看不见** ⇒ 那类"已通知"落到
|
|
191
|
-
* {@link hasOutboundSendSince} = false ⇒ 会被判成假完成。⇒ 本版口径:**代理模式下"联系用户"
|
|
192
|
-
* 只认 ACC 通道**;这与设计 §7 的原话(im-bridge 记日志)一致,边界写在此处以免误读。
|
|
193
|
-
*/
|
|
194
|
-
export declare function noteOutboundSend(root: string, atMs?: number): void;
|
|
195
|
-
/** 自 `sinceMs` 起该 CCC 是否有过成功出站发送(**只读,不清表**——清理归写入侧的裁剪) */
|
|
196
|
-
export declare function hasOutboundSendSince(root: string, sinceMs: number, nowMs?: number): boolean;
|
|
197
|
-
/** 发送记录表大小(诊断 / 测试用) */
|
|
198
|
-
export declare function outboundSendRoots(): string[];
|
|
199
|
-
/** 固定文件名(与 `cro-wake-log.json` 并排、主语分明:那份记"我叫了什么",这份记"我代说了什么") */
|
|
200
|
-
export declare const UNATTENDED_LOG_FILENAME = "unattended-log.json";
|
|
201
|
-
/** 保留窗 = 2 日(与 CRO 流水同值;**常量** ⇒ 无需人工清理动作) */
|
|
202
|
-
export declare const UNATTENDED_LOG_RETENTION_MS: number;
|
|
203
|
-
/** 一条代理流水(**成功与失败都记**,与 CRO 流水同规格) */
|
|
204
|
-
export interface UnattendedLogEntry {
|
|
205
|
-
/** 时刻(当地 RFC3339 带偏移,遵 D67) */
|
|
206
|
-
at: string;
|
|
207
|
-
/** 事件:inject(注入了一轮)/ accept(交码放过)/ cap(撞上限停下)/ yield(用户回来、让位) */
|
|
208
|
-
event: 'inject' | 'accept' | 'cap' | 'yield';
|
|
209
|
-
/** 轮次号 */
|
|
210
|
-
round: number;
|
|
211
|
-
/** 该轮 nonce(yield / cap 时 = 停下时的当前码;无 ⇒ null,**不留空白**) */
|
|
212
|
-
nonce: string | null;
|
|
213
|
-
/** 机器可读理由码(判定函数的 `reason`) */
|
|
214
|
-
reason: string;
|
|
215
|
-
/** 载体 dsh 会话 id(多载体轨迹可分辨) */
|
|
216
|
-
sessionId: string;
|
|
217
|
-
}
|
|
218
|
-
/** 文件形态(与 `wake-registry.json` / `cro-wake-log.json` 同款:`{version, entries}`) */
|
|
219
|
-
export interface UnattendedLog {
|
|
220
|
-
version: number;
|
|
221
|
-
entries: UnattendedLogEntry[];
|
|
222
|
-
}
|
|
223
|
-
/** 日志绝对路径 */
|
|
224
|
-
export declare function unattendedLogPath(root: string, dirName: string): string;
|
|
225
|
-
/** 读取流水(**永不抛**;读坏 ⇒ 当作空档 + 返回 error 文本) */
|
|
226
|
-
export declare function loadUnattendedLog(root: string, dirName: string): {
|
|
227
|
-
log: UnattendedLog;
|
|
228
|
-
error: string | null;
|
|
229
|
-
};
|
|
230
|
-
/**
|
|
231
|
-
* 按窗裁剪(**纯函数** ⇒ 可穷举测试)。
|
|
232
|
-
* 🔴 `at` 不可解析者**一律丢弃**并在返回值里报数(`dropped`)——**不静默吞掉**(同 `cro-log.ts` 纪律)。
|
|
233
|
-
*/
|
|
234
|
-
export declare function pruneUnattendedLogEntries(entries: UnattendedLogEntry[], nowMs: number, windowMs?: number): {
|
|
235
|
-
kept: UnattendedLogEntry[];
|
|
236
|
-
pruned: number;
|
|
237
|
-
dropped: number;
|
|
238
|
-
};
|
|
239
|
-
/**
|
|
240
|
-
* 追加一条流水并按窗裁剪(**本模块的落盘入口;永不抛**)。
|
|
241
|
-
*
|
|
242
|
-
* 顺序 = 读 → 追加 → 裁剪 → **原子写**(tmp + rename)。任一步失败 ⇒ `{ok:false, error}`,**不抛**
|
|
243
|
-
* ——调用方只记一行 console 日志 ⇒ **代理机制的问题绝不影响 turn 收尾**。
|
|
244
|
-
*/
|
|
245
|
-
export declare function appendUnattendedLog(root: string, dirName: string, entry: Omit<UnattendedLogEntry, 'at'>, nowMs?: number): {
|
|
246
|
-
ok: boolean;
|
|
247
|
-
error: string | null;
|
|
248
|
-
kept: number;
|
|
249
|
-
};
|
package/lib/unattended-seam.d.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* unattended-seam.ts — 无人值守代理回复的**拦截缝**(S142 **D77**,owner 2026-09-23 令「我需要的是一个机制」)
|
|
3
|
-
*
|
|
4
|
-
* ## 停在哪、怎么接(设计 §4 的裁决:**A 的通道 + B 的措辞**)
|
|
5
|
-
*
|
|
6
|
-
* 复用的是**已验证过的**通道——`agent/turn-stopping`(serial)里 `agent.steer()`:
|
|
7
|
-
* 宿主语义 = "**listener 反对就打回**,机器重读 inbox:有新 steer ⇒ 再跑一步,没有 ⇒ 关轮"
|
|
8
|
-
* (`host/contract.ts` 的 `HOST_EVENTS` 原文)。因此:
|
|
9
|
-
* · **轮不结束**(语义正是"有人打回")⇒ **零新机械**;
|
|
10
|
-
* · 文本**写成代理用户的话**(B 的措辞)+ **首句自报身份**(owner 已裁)。
|
|
11
|
-
*
|
|
12
|
-
* 模板 = `output-guard-seam.ts`(同一缝位、同一 `createUserMessage + PLUGIN_SOURCE` 形态)。
|
|
13
|
-
*
|
|
14
|
-
* ## 🔴「这轮是不是真实用户发起的」怎么判(本机制**唯一**的新机械;2026-09-23 取证)
|
|
15
|
-
*
|
|
16
|
-
* 交接块把它列为"动手前必须先查清的一件事",取证结论(读宿主类型面,非猜测):
|
|
17
|
-
*
|
|
18
|
-
* | 事实 | 出处 |
|
|
19
|
-
* |---|---|
|
|
20
|
-
* | 每条进入 inbox 的消息都发 `agent/inbox/inserted { agent, message }`;**在轮内离开 inbox 时**发 `agent/inbox/claimed { agent, message, turn }` | `@deepseek-ai/dsh-agent` README(Inbox 段)+ `runtime-types.d.ts` |
|
|
21
|
-
* | `claimed.turn` = **拥有该消息的那一轮**;`turn-stopping.turn` = **即将关闭的那一轮** ⇒ 两者同编号可直接比对 | `runtime-types.d.ts` 同一文件两处 `turn` 声明 |
|
|
22
|
-
* | 消息来源可辨:`MessageSourceMap` 里**真实用户** = `kind: 'user'`(`user` / `user-rpc` 两种形态**同 kind**);**ACC 自己注入**的一律 `kind: 'plugin:dsh-serenity-hooks'`(v1.47.0 改;旧值 = `'plugin'`) | `@deepseek-ai/dsh-llm` `src/message.ts` 的 `MessageSourceMap`(合并和类型)+ 本仓 `message-source.ts`(**唯一**声明处与常量处) |
|
|
23
|
-
*
|
|
24
|
-
* ⇒ **判据 = 「这一轮 claim 到的消息里,有没有 `source.kind === 'user'`」**。
|
|
25
|
-
* 没有现成信号时本可退化为"记账法"(我们知道自己投过什么),**但不必**:宿主已给出一手信号。
|
|
26
|
-
*
|
|
27
|
-
* ## 🔴 为什么"用户发起的轮"要跳过(这是设计 §3-③ 的本意,别当成漏洞)
|
|
28
|
-
*
|
|
29
|
-
* 用户**刚说完话**⇒ 人就在跟前,代理插话既是冒充也是浪费。**"用户说完走开"那种情形**
|
|
30
|
-
* 由**绳(长周期保险丝)/其它非用户发起的唤醒**覆盖:那条轮**不是**用户发起的 ⇒ 代理接手,
|
|
31
|
-
* 一路推进到**合法收束**。⇒ 两个机制合起来才等于"用户走开后会话还能自己跑完"。
|
|
32
|
-
*
|
|
33
|
-
* ## 🔴 铁律(与 `unattended-ops.ts` 同族)
|
|
34
|
-
*
|
|
35
|
-
* **本模块的任何失败都不得影响 turn 收尾**:所有 handler 包 try/catch,异常只记一行 console。
|
|
36
|
-
*/
|
|
37
|
-
import type { Context } from 'cordis';
|
|
38
|
-
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
39
|
-
/**
|
|
40
|
-
* 装配无人值守代理缝(`index.ts` apply 调用)。
|
|
41
|
-
*
|
|
42
|
-
* 订阅三个事件(**都已在 `host/contract.ts` 白名单里**,新增的 `agent/inbox/claimed` 同批登记):
|
|
43
|
-
* · `agent/inbox/claimed` —— 记「真实用户发起的轮次」;用户回来时**让位**(清代理段 + 记流水);
|
|
44
|
-
* · `agent/turn-stopping` —— 判定 + 注入(本机制主体);
|
|
45
|
-
* · `agent/disposed` / `session/disposed` —— 载体销毁清表(**本容器栽过 5 次"只增不清"**)。
|
|
46
|
-
*/
|
|
47
|
-
export declare function registerUnattendedSeam(ctx: Context): void;
|
|
48
|
-
/** 类型再导出(调用方少一处 import) */
|
|
49
|
-
export type { Agent as UnattendedAgent };
|