dsh-prime-memory 0.20.0-beta.5 → 0.20.0-beta.6

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
@@ -17,7 +17,13 @@
17
17
  - **建议状态(`longtask-hint-get`)+ 浮动球(`client/src/longtask-fab.ts`)**:ego-browser 式 vanilla overlay(FAB+面板,拖拽/位置持久化/视口夹紧),**建议不阻断**——仅当「上下文占用达 `contextThresholdPct`」或「todo 漂移达 `driftThreshold`」且长任务未开启时点亮呼吸光晕;面板内:长任务开关(临时,per-session,**不带 mode**——切开关不重置用户档位)、占用/漂移进度条、手动尾部压缩按钮(长任务开启才可用)、任务计数。轮询忙 2s/闲 5s,RPC 失败静默;座位契约不变(settings.section 恰一个,body 单例不占任何座位)。
18
18
  - **`session-mode-set` 的 `mode` 转为可选**:与 `longTask` 二选一必传——纯切长任务开关不再被迫发送档位(旧客户端恒传 mode,行为不变)。响应 `mode` 改回当前生效值。
19
19
 
20
- ## [0.20.0-beta.5] — 2026-10-01
20
+ ## [0.20.0-beta.6] — 2026-10-01
21
+
22
+ ### 修复
23
+
24
+ - **标注器词表接入注册表(beta.5 漏项补齐)**:beta.5 的 merge/rename/retire 已落,但候选标注器(`annotateOrphanCandidates`)的词表仍是纯自生长聚合——预注册的 Room 根本进不了候选。现 OrphanAnnotateIO 带 registry:合并词表 = 注册表条目排前(count=0,附 label/description)+ 自生长目录,封顶 120;ruminate 与 memory_room_admin annotate 两条路径都传参。**预注册 Room 从此真实影响候选标注**。
25
+
26
+ ## [0.20.0-beta.5] — 2026-10-01## [0.20.0-beta.5] — 2026-10-01
21
27
 
22
28
  > Room 分类管理第二船(**破坏性面**)。dryRun 默认 true——merge/rename 先预览影响面,确认后才实跑;执行前自动备份到 `rooms-merge-backups/`。
23
29
 
package/dist/index.js CHANGED
@@ -354,8 +354,11 @@ export async function apply(ctx, config) {
354
354
  backend = await createMemoryBackend({ dbPath: path.join(dataDir, 'memory.db'), dimensions: initial.dims, logger }, backend);
355
355
  }
356
356
  stores.backend = backend;
357
+ // Room 注册表(分类管理 beta.4;损坏降级为纯自生长目录)
358
+ const roomRegistry = new RoomRegistryStore(dataDir, logger);
359
+ await roomRegistry.init();
357
360
  const ruminate = storageOk && !db.isDegraded() && ruminateFile
358
- ? new RuminateController(ctx, config, runner, stores, logger, live, ruminateFile)
361
+ ? new RuminateController(ctx, config, runner, stores, logger, live, ruminateFile, roomRegistry)
359
362
  : undefined;
360
363
  let flushL0;
361
364
  if (storageOk) {
@@ -366,8 +369,6 @@ export async function apply(ctx, config) {
366
369
  const contextUsage = new ContextUsageStore(logger);
367
370
  const todoRef = new TodoRefStore();
368
371
  // Room 注册表(分类管理 beta.4;损坏降级为纯自生长目录)
369
- const roomRegistry = new RoomRegistryStore(dataDir, logger);
370
- await roomRegistry.init();
371
372
  if (storageOk) {
372
373
  registerLongTaskMonitor(ctx, {
373
374
  cfg: config,
@@ -66,6 +66,8 @@ export declare class RuminateController {
66
66
  private sessions;
67
67
  private totalL1;
68
68
  private pendingFile;
69
+ /** Room 注册表(可选;孤儿候选预标记的合并词表来源)。 */
70
+ private readonly roomRegistry;
69
71
  /** 记忆后端:未注入时包 l1(进程内,行为与改造前等价)。 */
70
72
  private backend;
71
73
  constructor(ctx: Context, cfg: MemoryConfig, runner: Pick<MemoryRunner, 'enqueue' | 'states'>, stores: {
@@ -75,7 +77,15 @@ export declare class RuminateController {
75
77
  scenes: Record<MemoryFamily, SceneStore>;
76
78
  persona: Record<MemoryFamily, PersonaStore>;
77
79
  state: StateStore;
78
- }, logger: MemoryLogger, live: LiveSettingsHandle, pendingFile: string);
80
+ }, logger: MemoryLogger, live: LiveSettingsHandle, pendingFile: string,
81
+ /** Room 注册表(可选;孤儿候选预标记的合并词表来源)。 */
82
+ roomRegistry?: {
83
+ listActive(): Array<{
84
+ slug: string;
85
+ label?: string;
86
+ description?: string;
87
+ }>;
88
+ });
79
89
  /** 状态快照 */
80
90
  getStatus(): RuminateStatus;
81
91
  /**
@@ -46,11 +46,15 @@ export class RuminateController {
46
46
  sessions = [];
47
47
  totalL1 = 0;
48
48
  pendingFile;
49
+ /** Room 注册表(可选;孤儿候选预标记的合并词表来源)。 */
50
+ roomRegistry;
49
51
  /** 记忆后端:未注入时包 l1(进程内,行为与改造前等价)。 */
50
52
  backend() {
51
53
  return this.stores.backend ?? new InProcMemoryBackend(this.stores.l1);
52
54
  }
53
- constructor(ctx, cfg, runner, stores, logger, live, pendingFile) {
55
+ constructor(ctx, cfg, runner, stores, logger, live, pendingFile,
56
+ /** Room 注册表(可选;孤儿候选预标记的合并词表来源)。 */
57
+ roomRegistry) {
54
58
  this.ctx = ctx;
55
59
  this.cfg = cfg;
56
60
  this.runner = runner;
@@ -58,6 +62,7 @@ export class RuminateController {
58
62
  this.logger = logger;
59
63
  this.live = live;
60
64
  this.pendingFile = pendingFile;
65
+ this.roomRegistry = roomRegistry;
61
66
  }
62
67
  /** 状态快照 */
63
68
  getStatus() {
@@ -238,7 +243,7 @@ export class RuminateController {
238
243
  // 候选(roomReview='pending'),由 agent 用 memory_room_review 逐个复查;
239
244
  // 每轮至多 40 条,吞错不拖垮反刍。
240
245
  try {
241
- const r = await annotateOrphanCandidates(this.ctx, this.cfg, { l1: this.stores.l1, logger: this.logger }, 40);
246
+ const r = await annotateOrphanCandidates(this.ctx, this.cfg, { l1: this.stores.l1, logger: this.logger, registry: this.roomRegistry }, 40);
242
247
  if (r.written > 0)
243
248
  this.status.detail = `孤儿候选预标记 ${r.written} 条(待 agent 复查,工具 memory_room_review)`;
244
249
  }
@@ -94,14 +94,27 @@ export declare function roomCandidateChunk(ctx: Context, cfg: MemoryConfig, logg
94
94
  export interface OrphanAnnotateIO {
95
95
  l1: RoomReviewStore;
96
96
  logger: MemoryLogger;
97
+ /** Room 注册表(可选:未装配 = 词表只用自生长聚合,无注册条目)。 */
98
+ registry?: {
99
+ listActive(): Array<{
100
+ slug: string;
101
+ label?: string;
102
+ description?: string;
103
+ }>;
104
+ };
97
105
  }
98
106
  /**
99
107
  * 预标记消费器:活跃孤儿(≤limit 条)批量产候选并写 pending。
100
108
  * 写前重读合并(与 relabel 同纪律);失败单条跳过、原记录零改动。
101
109
  */
102
110
  export interface OrphanAnnotateOverrides {
103
- /** 测试注入口:替换 LLM 候选标注器(默认走真实 callLLM 路径)。 */
104
- chunkAnnotator?: (chunk: MemoryRecord[]) => Promise<Array<{
111
+ /** 测试注入口:替换 LLM 候选标注器(默认走真实 callLLM 路径);第二参为合并词表。 */
112
+ chunkAnnotator?: (chunk: MemoryRecord[], catalog: ReadonlyArray<{
113
+ room: string;
114
+ count: number;
115
+ label?: string;
116
+ description?: string;
117
+ }>) => Promise<Array<{
105
118
  id: string;
106
119
  rooms: string[];
107
120
  }>>;
@@ -92,12 +92,18 @@ export async function annotateOrphanCandidates(ctx, cfg, io, limit = 40, overrid
92
92
  const selected = selectPendingOrphans(io.l1, limit);
93
93
  if (selected.length === 0)
94
94
  return { selected: 0, candidates: 0, written: 0 };
95
- // 全库 Room 词表(计数降序)。整批共享一张词表(一次 LLM 调用),
96
- // 同仓优先的精化在逐条候选写入后由 repo-change 重算消费,此处保持简单。
97
- const rooms = io.l1.listRooms();
95
+ // 合并词表:注册表条目排前(附 description,对 LLM 归类价值最高),封顶 120;
96
+ // 无注册表 = 纯自生长聚合(计数降序)。整批共享一张词表(一次 LLM 调用)。
97
+ const grown = io.l1.listRooms();
98
+ const regActive = io.registry?.listActive() ?? [];
99
+ const regSet = new Set(regActive.map((e) => e.slug));
100
+ const merged = [
101
+ ...regActive.map((e) => ({ room: e.slug, count: 0, label: e.label, description: e.description })),
102
+ ...grown.filter((r) => !regSet.has(r.room)).map((r) => ({ room: r.room, count: r.count })),
103
+ ].slice(0, 120);
98
104
  const rows = overrides.chunkAnnotator !== undefined
99
- ? await overrides.chunkAnnotator(selected)
100
- : await roomCandidateChunk(ctx, cfg, io.logger, selected, rooms);
105
+ ? await overrides.chunkAnnotator(selected, merged)
106
+ : await roomCandidateChunk(ctx, cfg, io.logger, selected, merged);
101
107
  let written = 0;
102
108
  for (const { id, rooms: candidates } of rows) {
103
109
  if (candidates.length === 0)
@@ -956,7 +956,7 @@ roomRegistry) {
956
956
  };
957
957
  }
958
958
  if (action === 'annotate') {
959
- const r = await annotateOrphanCandidates(ctx, cfg, io, 40);
959
+ const r = await annotateOrphanCandidates(ctx, cfg, { ...io, registry: roomRegistry }, 40);
960
960
  return {
961
961
  notice: `候选预标记完成:选中 ${r.selected} 条,产候选 ${r.candidates} 条,写 pending ${r.written} 条。用 action=next 逐个复查。`,
962
962
  annotated: r.candidates,
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.20.0-beta.5-dsh0.2.0.1",
4
+ "version": "0.20.0-beta.6-dsh0.2.0.1",
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.20.0-beta.5",
3
+ "version": "0.20.0-beta.6",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org",
6
6
  "access": "public",