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 +7 -1
- package/dist/index.js +4 -3
- package/dist/pipeline/ruminate.d.ts +11 -1
- package/dist/pipeline/ruminate.js +7 -2
- package/dist/room-review.d.ts +15 -2
- package/dist/room-review.js +11 -5
- package/dist/tools/index.js +1 -1
- package/dsh.plugin.json +1 -1
- package/package.json +1 -1
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.
|
|
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
|
}
|
package/dist/room-review.d.ts
CHANGED
|
@@ -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[]
|
|
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
|
}>>;
|
package/dist/room-review.js
CHANGED
|
@@ -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
|
-
//
|
|
96
|
-
//
|
|
97
|
-
const
|
|
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,
|
|
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)
|
package/dist/tools/index.js
CHANGED
|
@@ -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.
|
|
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 分层蒸馏记忆插件:自动捕获对话、抽取原子记忆、整合场景块、蒸馏核心画像,并在模型步骤前自动召回注入。"
|