@shgroup/dsh-serenity-hooks 1.34.1 → 1.34.2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "dsh-serenity-hooks",
3
- "version": "1.34.1",
3
+ "version": "1.34.2",
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": {
@@ -101,15 +101,27 @@ export declare function checkHostVersion(version: string | null): {
101
101
  */
102
102
  export declare function probeHostContract(ctx: unknown, hostVersion?: string | null): HostContractReport;
103
103
  /**
104
- * 取宿主契约报告——**进程内唯一来源**。
104
+ * 取宿主契约报告——**每次调用现探**(`ctx` 决定"问谁",**不缓存"答案"**)。
105
105
  *
106
- * @param ctx 宿主上下文;**仅当快照尚未捕获时**用于跑探针(首见即捕获一次)
106
+ * 为什么**不缓存**(R↓:一个被实测推翻的设计,留档以免重犯):
107
+ * v1.34.1 曾把 `apply()` 时的探针结果存为模块级快照,理由是"两者对**同一个已装载的宿主**
108
+ * 问同一个问题,第二次计算的答案**不可能不同**,成本却是一次全服务遍历"。
109
+ * **该前提被实测证伪**(本机 2026-09-15,v1.34.1 部署后):
110
+ * - `apply()` 跑在装载早期,表中 `access:'lazy'` 的服务**尚未实例化**(`ctx.get` 返回 undefined)
111
+ * ⇒ 启动探针把它们记为 `not available (lazy)`;
112
+ * - 到 `dashboard health` 被调用时它们早已可用 ⇒ **现探给的是相反结论**。
113
+ * - 实测差异:快照 = `checked 36 / issues 3`(含 `workspaceRegistry not available` + 后果
114
+ * "工作区白名单下拉为空"),而**同一时刻** `GET /serenity/cccs` 正常返回 **4 个工作区**
115
+ * (含 3 个无 live 会话的冷 CCC)⇒ 快照渲染出的是**假阴性**。
116
+ * ⇒ 「两次探针」**不是重复计算,问的是两个时刻**;缓存答案 = 把装载瞬间的观测冒充运行态事实。
117
+ *
118
+ * 保留统一入口的收益(这才是 C5 的正确部分):取数口唯一——`container-status` / `kit-ops`
119
+ * 只问这一个函数;将来若要"筛掉装载期噪声",只需改这一处。
120
+ *
121
+ * @param ctx 宿主上下文;**未给** ⇒ 返回 `null`(不猜、不暗跑探针)
107
122
  * @param hostVersion 运行中宿主版本(`readDshVersion()`;null = 未知)
108
- * @returns 契约报告;快照未捕获且未给 `ctx` → `null`(不猜、不重算)
109
123
  */
110
124
  export declare function hostContractReport(ctx?: unknown, hostVersion?: string | null): HostContractReport | null;
111
- /** 测试用:复位进程内快照(避免用例间串味;与 `__resetWakeSchedulerStateForTest` 同规格) */
112
- export declare function __resetHostContractForTest(): void;
113
125
  /** 单行摘要(启动告警用) */
114
126
  export declare function summarizeHostContract(report: HostContractReport): string;
115
127
  export {};
package/lib/index.js CHANGED
@@ -7966,38 +7966,29 @@ function probeHostContract(ctx, hostVersion = null) {
7966
7966
  };
7967
7967
  }
7968
7968
  /**
7969
- * 宿主契约报告的**进程内快照**。
7970
- *
7971
- * 为什么需要(R↓,C5 唯一实证的重复取数):`probeHostContract` 此前被算了**两次**——
7972
- * `index.ts` 的启动探针(apply 时一次,用于启动告警)与 `kit-ops.ts` 的 `dashboard health`
7973
- * (每次请求一次)。两者对**同一个已装载的宿主**问同一个问题,第二次计算的答案不可能不同,
7974
- * 成本却是一次全服务/全成员遍历。
7975
- *
7976
- * 收敛策略与时序(**这是本模块唯一的可变状态,语义见下**):
7977
- * 1. `apply()` `hostContractReport(ctx, readDshVersion())` —— **唯一计算点**,探针在此跑一次;
7978
- * 启动告警仍由返回值渲染(`summarizeHostContract`),语义逐字保留。
7979
- * 2. 其后任何消费者(`dashboard health` / `container-status`)调同一函数 命中快照,
7980
- * **不再**触发探针。
7981
- *
7982
- * 为什么这不是"会导致状态陈旧的缓存":报告描述的是**这次装载的宿主面**(HOST_SERVICES 列出的
7983
- * 都是宿主核心服务/成员,由宿主在插件装载前注册)+装载时读到的宿主版本——它是**一次性事实**,
7984
- * 不是随运行变化的量。反之,时钟/注册表这类**会变**的量一律不在此缓存(各自由其唯一来源现读)。
7985
- * 代价(诚实记录):若宿主在 apply 之后才补挂某个 `HOST_SERVICES` 里的服务,`health` 不会察觉。
7986
- * 需要"当场真探"的场合仍可直接调纯函数 {@link probeHostContract}(本函数不删它)。
7987
- */
7988
- let snapshot = null;
7989
- /**
7990
- * 取宿主契约报告——**进程内唯一来源**。
7991
- *
7992
- * @param ctx 宿主上下文;**仅当快照尚未捕获时**用于跑探针(首见即捕获一次)
7969
+ * 取宿主契约报告——**每次调用现探**(`ctx` 决定"问谁",**不缓存"答案"**)。
7970
+ *
7971
+ * 为什么**不缓存**(R↓:一个被实测推翻的设计,留档以免重犯):
7972
+ * v1.34.1 曾把 `apply()` 时的探针结果存为模块级快照,理由是"两者对**同一个已装载的宿主**
7973
+ * 问同一个问题,第二次计算的答案**不可能不同**,成本却是一次全服务遍历"。
7974
+ * **该前提被实测证伪**(本机 2026-09-15,v1.34.1 部署后):
7975
+ * - `apply()` 跑在装载早期,表中 `access:'lazy'` 的服务**尚未实例化**(`ctx.get` 返回 undefined)
7976
+ * 启动探针把它们记为 `not available (lazy)`;
7977
+ * - `dashboard health` 被调用时它们早已可用 ⇒ **现探给的是相反结论**。
7978
+ * - 实测差异:快照 = `checked 36 / issues 3`(含 `workspaceRegistry not available` + 后果
7979
+ * "工作区白名单下拉为空"),而**同一时刻** `GET /serenity/cccs` 正常返回 **4 个工作区**
7980
+ * (含 3 个无 live 会话的冷 CCC)⇒ 快照渲染出的是**假阴性**。
7981
+ * ⇒ 「两次探针」**不是重复计算,问的是两个时刻**;缓存答案 = 把装载瞬间的观测冒充运行态事实。
7982
+ *
7983
+ * 保留统一入口的收益(这才是 C5 的正确部分):取数口唯一——`container-status` / `kit-ops`
7984
+ * 只问这一个函数;将来若要"筛掉装载期噪声",只需改这一处。
7985
+ *
7986
+ * @param ctx 宿主上下文;**未给** ⇒ 返回 `null`(不猜、不暗跑探针)
7993
7987
  * @param hostVersion 运行中宿主版本(`readDshVersion()`;null = 未知)
7994
- * @returns 契约报告;快照未捕获且未给 `ctx` → `null`(不猜、不重算)
7995
7988
  */
7996
7989
  function hostContractReport(ctx, hostVersion = null) {
7997
- if (snapshot !== null) return snapshot;
7998
7990
  if (ctx === void 0) return null;
7999
- snapshot = probeHostContract(ctx, hostVersion);
8000
- return snapshot;
7991
+ return probeHostContract(ctx, hostVersion);
8001
7992
  }
8002
7993
  /** 单行摘要(启动告警用) */
8003
7994
  function summarizeHostContract(report) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shgroup/dsh-serenity-hooks",
3
- "version": "1.34.1",
3
+ "version": "1.34.2",
4
4
  "description": "宁静号 ACC harness(Native Cordis 插件)——给 DeepSeek Harness 装一个「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。",
5
5
  "license": "MIT",
6
6
  "repository": {