dsh-prime-memory 0.26.23 → 0.26.24

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # 更新日志(Changelog)
2
2
 
3
+ ## [0.26.24] — 2026-11-02
4
+
5
+ - **修掉 `0.26.23` 自己引入的回归:读面可能被永久堵死**。上一版规定「对端已升版但 `drsReadFacade()` 返回 undefined 时抛可重试错、不回退自开库」,用意是避免把自开库结果永久缓存。但**未就绪是无法与「本进程根本不会有人 activate collector」区分的**,两类真实场景落进后者:① 宿主外跑本仓读面做校验的脚本(新进程 import collector,`apply()` 从未运行,门面永远 undefined);② collector 装了但未进当前 profile 的装载清单。它们会每次读都报错,比 `0.26.21` 的直接自开库更糟。
6
+ - **改法:有界重试后再回退**(`src/clients/drsc-inproc.ts`)。预算 `FACADE_RETRY_BUDGET = 3`:前 3 次读抛可重试错且不缓存(给宿主内 collector 的 `setImmediate` 初始化留出窗口,保住「优先用门面」);第 4 次仍拿不到门面即认定本进程等不到,回退自开只读库。两条路径都读的是同一个 WAL 库、句柄只读,不存在读到错数据的风险,差别只是是否多占一份常驻 `summaries`。门面一旦就绪,计数器归零。
7
+ - **测试**:`tests/drsc-inproc.test.ts` 相应改为断言完整状态机——预算内逐次抛错(错误文本含 `1/3`、`2/3`、`3/3`)且期间**绝不**调用 `openProjectionStore`;第 4 次回退成功打开自有句柄并返回正常结果;`resetCollectorReadState()` 后门面就绪能拿回门面。全量 **1904 例 / 190 文件**,typecheck/lint/build/build:smoke/smoke 全 0。
8
+ - **验证口径提示**:宿主外脚本按设计走的是**回退路径**(会开自己的只读句柄),因此「脚本里出现自开库」不是缺陷;宿主内的判据是日志无「背景窗拉取失败」且蒸馏/`conversation_search` 出真数据。
9
+
3
10
  ## [0.26.23] — 2026-11-02
4
11
 
5
12
  - **方案 B:DRSC 读面改走 collector 的正式门面(`drsReadFacade`)**。`0.26.21` 的进程内直调虽然绕开了宿主鉴权,但代价是**耦合 collector 的五个内部导出名**(`openProjectionStore`/`createQueryContext`/`search`/`sessionDetail`/`listSessions`),并且**自己另开一份投影库**——多占一份常驻 `summaries` 内存与一个读事务。现在 collector `0.2.5` 导出 `drsReadFacade()`,返回绑它**自己活 QueryContext** 的只读对象;本仓优先用这个门面,只认一个稳定符号,也不再开第二份库。
@@ -22,6 +22,14 @@
22
22
  const COLLECTOR_PACKAGE = 'dsh-reference-session-collector';
23
23
  const defaultLoader = async () => (await import(/* @vite-ignore */ COLLECTOR_PACKAGE));
24
24
  let modulePromise;
25
+ /**
26
+ * 对端已升版但库未就绪时的重试预算。不能无限重试:宿主**外**的脚本、以及
27
+ * 「collector 装了但未装载」的部署里,drsReadFacade() 永远返回 undefined,
28
+ * 死等会把读面永久堵死(比回退更糟)。也不能一上来就回退:那会把自开库
29
+ * 结果永久缓存,把“优先用门面”变成只在首轮赌运气。
30
+ */
31
+ const FACADE_RETRY_BUDGET = 3;
32
+ let facadeMisses = 0;
25
33
  /**
26
34
  * 兼容路径(旧 collector)的只读句柄(`openProjectionStore` 的返回值)。常驻 summaries
27
35
  * 是内存 Map,每请求重开等于重扫全表,故只开一次;undefined 是合法的未开哨兵。
@@ -31,6 +39,7 @@ let storeHandle;
31
39
  export function resetCollectorReadState() {
32
40
  modulePromise = undefined;
33
41
  storeHandle = undefined;
42
+ facadeMisses = 0;
34
43
  }
35
44
  /** 把门面对象适配成本模块统一的「模块形」,以便与兼容路径共用同一套参数映射。
36
45
  * 前三个成员在门面路径上永不会被调用:moduleOf 命中门面后直接返回,不走进兼容分支。
@@ -54,14 +63,18 @@ async function moduleOf(load) {
54
63
  const mod = (await load());
55
64
  if (typeof mod.drsReadFacade === 'function') {
56
65
  const facade = mod.drsReadFacade();
57
- // 对端是新版本但库未就绪(collector 的重活推迟在 setImmediate 臂):本轮**不**回退
58
- // 自开库,而是抛可重试错——否则会把自开库结果永久缓存,把“优先用门面”变成
59
- // 只在首轮赌运气。抛错走既有降级链(背景窗当轮空窗、工具面显式报错),
60
- // 且不缓存 rejection,下一次读会重取门面。
61
- if (facade === undefined) {
62
- throw new Error('collector 投影库尚未就绪(稍后自动重试)');
66
+ // 对端是新版本但库未就绪(collector 的重活推迟在 setImmediate 臂):先给它几次
67
+ // 重试机会(抛可重试错、不缓存 rejection,下一次读重取门面);超过预算就认定
68
+ // 本进程里不会有人 activate 它(宿主外的脚本、或 collector 装了但未装载),
69
+ // 回退自开只读库。两条路都不会读错数据:库是同一个 WAL 文件,自开句柄只读。
70
+ facadeMisses += 1;
71
+ if (facade !== undefined) {
72
+ facadeMisses = 0;
73
+ return fromFacade(facade);
74
+ }
75
+ if (facadeMisses <= FACADE_RETRY_BUDGET) {
76
+ throw new Error(`collector 投影库尚未就绪(第 ${facadeMisses}/${FACADE_RETRY_BUDGET} 次重试)`);
63
77
  }
64
- return fromFacade(facade);
65
78
  }
66
79
  return legacyStoreModule(mod);
67
80
  })().catch((err) => {
package/dsh.plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "dsh-prime-memory",
3
3
  "name": "dsh-prime-memory",
4
- "version": "0.26.23",
4
+ "version": "0.26.24",
5
5
  "description": {
6
6
  "en": "Layered distilled memory plugin (L0 capture → L1 atomic memory → L2 scenes → L3 persona) with automatic recall injection before each model step.",
7
7
  "zh": "L0~L3 分层蒸馏记忆插件:自动捕获对话、抽取原子记忆、整合场景块、蒸馏核心画像,并在模型步骤前自动召回注入。"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-prime-memory",
3
- "version": "0.26.23",
3
+ "version": "0.26.24",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org",
6
6
  "access": "public",