@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
|
-
*
|
|
2
|
+
* im/inbound.ts — 人机信道的**机制层**(机器级;2026-09-26 owner 定案 ⇒ 方案 §2.6)
|
|
3
3
|
*
|
|
4
4
|
* ## 为什么单独一个模块(方案 §5-12)
|
|
5
|
-
* 今天"机制"与"渠道实现"混在 `
|
|
5
|
+
* 今天"机制"与"渠道实现"混在 `im/bridge.ts` 里。P0-2 要立的这条不变量是**机器级**的 ——
|
|
6
6
|
* 它**跨 CCC**、且与"微信"无关(飞书桥/邮件桥同样要守)⇒ 抽到这里;`weixin-bridge` 只做接线。
|
|
7
7
|
*
|
|
8
8
|
* ## 本模块唯一的不变量
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
* ② **订阅表查询 + 入站路由决策**(P0-3:`(账号, 用户) → (CCC, 角色)`)—— 见 §订阅表
|
|
24
24
|
* ③ **机器级留痕**(P0-3:未投递 / 目标不存在 / 表残缺)—— 见 §留痕。
|
|
25
25
|
* 🔴 为什么这些必须机器级:它们**没有目标 CCC** ⇒ 落进任何 CCC 都是"编一个"目标。
|
|
26
|
-
* **不碰**:轮询循环、凭据解析、会话投递 —— 那些是**渠道实现**,留在 `
|
|
26
|
+
* **不碰**:轮询循环、凭据解析、会话投递 —— 那些是**渠道实现**,留在 `im/bridge.ts`。
|
|
27
27
|
* ⇒ 本模块**零 DSH 依赖**(只有 `node:crypto` / `node:fs`),可独立单测。
|
|
28
28
|
*/
|
|
29
|
-
import type { HumanChannelSubscriptionSettings } from '
|
|
29
|
+
import type { HumanChannelSubscriptionSettings } from '../surface/settings.js';
|
|
30
30
|
/** 一个"想为该账号起 poller"的请求(来自某 CCC) */
|
|
31
31
|
export interface PollerRequest {
|
|
32
32
|
/** 发起方 CCC 根(绝对路径) */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* im/route.ts — 微信桥 CCC 配置层纯逻辑(F4c-3,v1.27.0 实验性)
|
|
3
3
|
*
|
|
4
4
|
* 职责(零 DSH 依赖,可独立单测):
|
|
5
5
|
* - 读取 CCC 的 weixin 配置(.opencode/serenity.json weixin 段——结构/路由/开关)
|
|
@@ -11,18 +11,59 @@
|
|
|
11
11
|
* 配置归属(S142 用户拍板):**CCC 级**——serenity.json 结构 + localstore 凭据分离;
|
|
12
12
|
* 不绑定具体 role(用户自选路由目标)。
|
|
13
13
|
*/
|
|
14
|
-
import { type WeixinSettings, type WeixinRouteConfig, type WeixinAccountConfig } from '
|
|
15
|
-
import type { WeixinMediaRef, WeixinMessageItem } from './
|
|
16
|
-
/** 判定 sessionId
|
|
14
|
+
import { type WeixinSettings, type WeixinRouteConfig, type WeixinAccountConfig, type ImSettings } from '../kernel/ccc.js';
|
|
15
|
+
import type { WeixinMediaRef, WeixinMessageItem } from './ilink.js';
|
|
16
|
+
/** 判定 sessionId 是否为微信桥会话(**命名形态**判定;权力面判据见 `isSkiffSession`) */
|
|
17
17
|
export declare function isWeixinSessionId(sessionId: string | undefined): boolean;
|
|
18
|
-
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
|
|
18
|
+
/**
|
|
19
|
+
* **轨迹编码 → 固定的 dsh 会话 id**(2026-10-19 重做:身份挂在轨迹上,不挂在用户上)。
|
|
20
|
+
*
|
|
21
|
+
* ## 为什么改(owner 重做令的实际含义)
|
|
22
|
+
*
|
|
23
|
+
* 旧派生 = `skiff-weixin-<sha256(微信用户 id)>`:**同一条轨迹换一个用户就是另一条会话**,
|
|
24
|
+
* 而**同一个用户换一条轨迹也还是原来那条会话**(后者的症状:改路由之后,新轨迹的约束
|
|
25
|
+
* 对不上旧会话的历史工具清单)。⇒ 那不是"轨迹是一等公民",那是"用户是一等公民"。
|
|
26
|
+
*
|
|
27
|
+
* 新派生 = **由轨迹编码决定**:同一条轨迹 ⇒ 恒同一条 dsh 会话(无论谁在跟它说话);
|
|
28
|
+
* 换轨迹 ⇒ 新会话。这正是"skiff 是认知轨迹的一种"。
|
|
29
|
+
*
|
|
30
|
+
* ## 连带删掉的东西
|
|
31
|
+
*
|
|
32
|
+
* 旧实现有 `.weixin-session-gen.json` 换代计数器(`baseId-g<n>`),存在的唯一理由是
|
|
33
|
+
* "身份绑在用户上、载体(SESSION.md)可能先被归档" ⇒ 只能靠换代续命。
|
|
34
|
+
* 现在**身份就是轨迹**:轨迹没了就该报"目标不存在"(响亮),**不该静默续命**
|
|
35
|
+
* ⇒ 计数器整件删除。
|
|
36
|
+
*
|
|
37
|
+
* ⚠️ 会话 id 里保留 `skiff-weixin-` 前缀只为可读性;**它不含用户身份**,
|
|
38
|
+
* 因此也不会泄漏"谁在跟它说话"(旧形态的哈希虽是伪名,但它是**可复算的稳定标识**,
|
|
39
|
+
* 见 `privacy-scan` 的 `weixin-session-pseudonym` 规则 —— 新形态连这个问题都没有了)。
|
|
40
|
+
*/
|
|
41
|
+
export declare function weixinSessionIdForTrajectory(code: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* **统一 IM 配置的单一读取入口**(2026-10-19 owner 定向:微信与飞书只是账号实现不同,
|
|
44
|
+
* 整合到统一配置)。
|
|
45
|
+
*
|
|
46
|
+
* 读取顺序(**确定性,只有这一处**):
|
|
47
|
+
* ① `im` 段 —— 但**判据是 `accounts` 是数组**,不是"段存在"(见下 🔴)
|
|
48
|
+
* ② 旧 `weixin` 段 —— 存量 CCC 零迁移
|
|
49
|
+
* ③ 都没有 ⇒ 归一默认(`enabled:false`、空数组)
|
|
50
|
+
*
|
|
51
|
+
* 🔴 **为什么判据是「`accounts` 是数组」**:本 CCC 的配置里**曾经**有过一个 `im` 段
|
|
52
|
+
* (退役的 ACP 形态:`{channel:"acp", acp:{enabled, accounts:[…]}}`)。若只判"段存在",
|
|
53
|
+
* 那份残留会被当成新配置读 ⇒ 得到一个没有 `accounts` 数组 / 或 `accounts` 形状完全不同的对象
|
|
54
|
+
* ⇒ 表现为**"配置没生效"且不报错**。⇒ 用可判别的形状把它排除掉(退役残留继续被静默忽略,
|
|
55
|
+
* 与 v1.59.0 的裁决一致)。
|
|
56
|
+
*
|
|
57
|
+
* ⚠️ 本函数**只做归一**,不判断"这个通道实现有没有"——那是装配处的事
|
|
58
|
+
* (`syncMachinePollers` 里有"未实现的 channel 出声但不静默跳过")。
|
|
59
|
+
*/
|
|
60
|
+
export declare function readImSettings(root: string, paths?: string[]): ImSettings;
|
|
23
61
|
/**
|
|
24
62
|
* 读取 CCC 微信桥配置(未配置/未启用 → 归一默认)。
|
|
25
|
-
*
|
|
63
|
+
*
|
|
64
|
+
* ⚠️ 2026-10-19 起它是 {@link readImSettings} 的**薄别名**(签名与返回形状不变):
|
|
65
|
+
* 旧调用点无需改动,但**配置来源已经统一**——`im` 段优先、`weixin` 段回退。
|
|
66
|
+
* 保留名字是为了让既有调用点与测试**逐字不动**(P1 是纯重构,读数必须不变)。
|
|
26
67
|
*/
|
|
27
68
|
export declare function readWeixinSettings(root: string, paths?: string[]): WeixinSettings;
|
|
28
69
|
/** 账号凭据(localstore credential scope;baseUrl 缺省 = 官方默认) */
|
|
@@ -39,7 +80,7 @@ export declare function writeWeixinCredential(root: string, accountId: string, c
|
|
|
39
80
|
export declare function clearWeixinCredential(root: string, accountId: string): void;
|
|
40
81
|
/**
|
|
41
82
|
* 路由匹配:exact user 优先,通配 `*` 兜底。
|
|
42
|
-
* @returns
|
|
83
|
+
* @returns 命中的**轨迹编码**;未命中 → null(无路由 → 消息不回复/忽略)
|
|
43
84
|
*/
|
|
44
85
|
export declare function matchWeixinRoute(routes: WeixinRouteConfig[], fromUserId: string): string | null;
|
|
45
86
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* im/send.ts — 主动发送入口(S142 v1.30.9,用户需求"微信桥支持被调用发消息给指定用户")
|
|
3
3
|
*
|
|
4
4
|
* 形态(用户拍板 A2):**独立监听器,只绑 127.0.0.1**(默认 3082,plugin 全局配置 weixinApi)。
|
|
5
5
|
* 为什么不挂在主 webServer(3080) 上:3080 会被 3081 公网网关原样反代(含全部请求头),
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import { type ServerResponse } from 'node:http';
|
|
24
24
|
import type { Context } from 'cordis';
|
|
25
|
-
import { type FaceSpec } from '
|
|
26
|
-
import { weixinSendEndpoint } from './
|
|
25
|
+
import { type FaceSpec } from '../surface/faces.js';
|
|
26
|
+
import { weixinSendEndpoint } from './endpoint.js';
|
|
27
27
|
export { weixinSendEndpoint };
|
|
28
28
|
/** 文本长度上限(微信侧单条消息实践上限;超限拒绝而非静默截断) */
|
|
29
29
|
export declare const WEIXIN_SEND_MAX_TEXT = 4000;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* im/weixin-account.ts — 微信账号实现(P2:把既有微信轮询包成 `ImAccountImpl`)
|
|
3
|
+
*
|
|
4
|
+
* 🔴 **纯移动,零逻辑改动**。`runAccountLoop` 的函数体逐字来自 `bridge.ts`;
|
|
5
|
+
* 唯一新增的是把它**登记成"一种账号实现"**,这样装配处不必再写死 `channel === 'weixin'`。
|
|
6
|
+
*
|
|
7
|
+
* 为什么值得单独成一个文件(而不是留在 bridge.ts 里):
|
|
8
|
+
* 装配处从此只认 `ImAccountImpl` 接口;微信与飞书是**并列的两个实现**,
|
|
9
|
+
* 而不是"微信是主角、别的往里塞"。这正是 owner「只不过是 account 方实现不同」的结构表达。
|
|
10
|
+
*/
|
|
11
|
+
import type { WeixinAccountCredential } from './route.js';
|
|
12
|
+
import { type ImAccountImpl } from './accounts.js';
|
|
13
|
+
/**
|
|
14
|
+
* 把实现所需的最小注入面收进来。
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ 这些是**微信侧的运行依赖**(`getUpdates` / `handleIncoming` / `handleMachineIncoming`)。
|
|
17
|
+
* 用注入而不是 import,是为了让 `bridge.ts` 不因本文件而反向依赖 —— 否则两个文件互相
|
|
18
|
+
* import 会成环(本轨已有先例:`rebuild ⇄ tools/trajectory` 那个人工发现的环)。
|
|
19
|
+
*/
|
|
20
|
+
export interface WeixinLoopDeps {
|
|
21
|
+
getUpdates: (input: {
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
token: string;
|
|
24
|
+
getUpdatesBuf: string;
|
|
25
|
+
timeoutMs: number;
|
|
26
|
+
}) => Promise<{
|
|
27
|
+
get_updates_buf?: string;
|
|
28
|
+
msgs?: Array<Record<string, unknown>>;
|
|
29
|
+
}>;
|
|
30
|
+
handleIncoming: (ctx: unknown, root: string, accountId: string, cred: WeixinAccountCredential, msg: never) => Promise<void>;
|
|
31
|
+
handleMachineIncoming: (ctx: unknown, accountId: string, cred: WeixinAccountCredential, msg: never) => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
/** 装配时注入依赖(`bridge.ts` 在模块初始化末尾调用一次;见 `installWeixinAccountImpl`) */
|
|
34
|
+
export declare function setWeixinLoopDeps(d: WeixinLoopDeps): void;
|
|
35
|
+
/** 微信账号实现(登记的 channel 名 = `weixin`;与配置里的取值一致) */
|
|
36
|
+
export declare const weixinAccountImpl: ImAccountImpl;
|
|
37
|
+
/**
|
|
38
|
+
* 注册微信实现**并注入依赖**(`bridge.ts` 调用;幂等——重复注册覆盖同名 channel)。
|
|
39
|
+
*
|
|
40
|
+
* ⚠️ 必须在首次 `syncHumanChannel` / `syncCccBridge` **之前**发生。
|
|
41
|
+
* `bridge.ts` 在**模块求值时**调用它一次(不是等到 `registerWeixinBridge`)——
|
|
42
|
+
* 因为测试与面板会**直接**调 `syncCccBridge`,那时装配入口还没跑过;
|
|
43
|
+
* 若依赖装配入口注册,那些路径会全部走进"未实现"分支(本轮实测:12 例红,根因就是它)。
|
|
44
|
+
*/
|
|
45
|
+
export declare function installWeixinAccountImpl(d: WeixinLoopDeps): void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* im-
|
|
2
|
+
* im/weixin-channel.ts — 微信通道实现(`im-bridge` 的通道之一,v1.31.0)
|
|
3
3
|
*
|
|
4
4
|
* 能力归 ACC(S142 用户洞察):本文件吸收原 CCC MSM `.opencode/skills/home-serenity/scripts/
|
|
5
5
|
* weixin-send.ts` 的 `send` / `send-file` / `users` 语义——协议、凭据、账号选择、别名解析、
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* - `send` 复用 `sendProactiveText`(唯一文本发送实现 + 唯一记录点)
|
|
11
11
|
* - `sendFile` 走 iLink 上传(`weixin-api.sendFileMessage`)+ 同一 outgoing hook(带 `file` 元数据)
|
|
12
12
|
*/
|
|
13
|
-
import type { ImChannel } from './
|
|
13
|
+
import type { ImChannel } from './channels.js';
|
|
14
14
|
/**
|
|
15
15
|
* 解析该 CCC 的别名表(v1.56.10)。
|
|
16
16
|
*
|