@modusensus/dsh-mneme 0.3.0 → 0.3.1
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/lib/entities/extractor.js +4 -4
- package/lib/index.js +2 -2
- package/lib/service.js +5 -5
- package/package.json +1 -1
- package/src/entities/extractor.js +4 -4
- package/src/index.js +2 -2
- package/src/service.js +5 -5
- package/test/fnew-0112.test.js +13 -18
|
@@ -140,7 +140,7 @@ async function resolveEntity(entity, store) {
|
|
|
140
140
|
return created.id;
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
export async function extractEntities(memory, { store, config, callLLM }) {
|
|
143
|
+
export async function extractEntities(memory, { store, config, callLLM, logger }) {
|
|
144
144
|
try {
|
|
145
145
|
if (!memory || !memory.content) {
|
|
146
146
|
return { ok: false, error: "Invalid memory: missing content" };
|
|
@@ -181,7 +181,7 @@ export async function extractEntities(memory, { store, config, callLLM }) {
|
|
|
181
181
|
resolvedEntities.push({ ...entity, entity_id: entityId });
|
|
182
182
|
} catch (err) {
|
|
183
183
|
skipCount++;
|
|
184
|
-
|
|
184
|
+
logger?.warn?.(`[extractor] Failed to resolve entity "${entity.name}":`, err.message);
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
|
|
@@ -201,7 +201,7 @@ export async function extractEntities(memory, { store, config, callLLM }) {
|
|
|
201
201
|
attrs.push(saved);
|
|
202
202
|
} catch (err) {
|
|
203
203
|
skipCount++;
|
|
204
|
-
|
|
204
|
+
logger?.warn?.(`[extractor] Failed to save attr "${attr.key}" for entity "${entity.name}":`, err.message);
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
207
|
}
|
|
@@ -224,7 +224,7 @@ export async function extractEntities(memory, { store, config, callLLM }) {
|
|
|
224
224
|
savedRelations.push(saved);
|
|
225
225
|
} catch (err) {
|
|
226
226
|
skipCount++;
|
|
227
|
-
|
|
227
|
+
logger?.warn?.(`[extractor] Failed to save relation "${rel.from} -> ${rel.to}":`, err.message);
|
|
228
228
|
}
|
|
229
229
|
}
|
|
230
230
|
|
package/lib/index.js
CHANGED
|
@@ -43,7 +43,7 @@ export const apply = (ctx, config) => {
|
|
|
43
43
|
store.deleteOldFailures(new Date(Date.now() - 90 * 86400000).toISOString());
|
|
44
44
|
} catch { /* non-fatal */ }
|
|
45
45
|
const mirror = createMirror(memoryDir);
|
|
46
|
-
const service = createService({ store, mirror, config: cfg });
|
|
46
|
+
const service = createService({ store, mirror, config: cfg, logger: ctx.logger });
|
|
47
47
|
|
|
48
48
|
// Recall-layer receipt: when searchMemories runs with recordRecall=true, the
|
|
49
49
|
// retrieval scene (query/mode/topK/threshold + candidates) is persisted to
|
|
@@ -196,7 +196,7 @@ export const apply = (ctx, config) => {
|
|
|
196
196
|
return text;
|
|
197
197
|
};
|
|
198
198
|
service.setEntityExtractor((memory) =>
|
|
199
|
-
extractEntities(memory, { store, config: cfg, callLLM: streamEntityText })
|
|
199
|
+
extractEntities(memory, { store, config: cfg, callLLM: streamEntityText, logger: ctx.logger })
|
|
200
200
|
.catch((err) => {
|
|
201
201
|
ctx.logger?.warn?.(`[dsh-mneme] entity extraction failed: ${String(err)}`);
|
|
202
202
|
return { ok: false, error: String(err) };
|
package/lib/service.js
CHANGED
|
@@ -3,7 +3,7 @@ import { TYPE_FILE } from "./mirror.js";
|
|
|
3
3
|
|
|
4
4
|
const INJECT_TYPES = new Set(["preference", "project", "decision", "summary"]);
|
|
5
5
|
|
|
6
|
-
export function createService({ store, mirror, config, onWrite }) {
|
|
6
|
+
export function createService({ store, mirror, config, onWrite, logger }) {
|
|
7
7
|
// Optional dream scheduler hook, installed via setDreamHook after creation
|
|
8
8
|
// (the scheduler holds a reference back to the service, so it cannot be
|
|
9
9
|
// passed in the constructor). Fired on the same write events as onWrite.
|
|
@@ -56,10 +56,10 @@ export function createService({ store, mirror, config, onWrite }) {
|
|
|
56
56
|
if (!config.entityExtractionEnabled || !entityExtractor) return;
|
|
57
57
|
try {
|
|
58
58
|
entityExtractor(memory).catch((err) => {
|
|
59
|
-
|
|
59
|
+
logger?.warn?.("entity extraction failed:", err);
|
|
60
60
|
});
|
|
61
61
|
} catch (err) {
|
|
62
|
-
|
|
62
|
+
logger?.warn?.("entity extraction failed:", err);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
|
|
@@ -306,7 +306,7 @@ export function createService({ store, mirror, config, onWrite }) {
|
|
|
306
306
|
try {
|
|
307
307
|
syncMirror();
|
|
308
308
|
} catch (error) {
|
|
309
|
-
|
|
309
|
+
logger?.warn?.("syncMirror failed after transaction:", error);
|
|
310
310
|
}
|
|
311
311
|
notifyWrite();
|
|
312
312
|
}
|
|
@@ -488,7 +488,7 @@ export function createService({ store, mirror, config, onWrite }) {
|
|
|
488
488
|
try {
|
|
489
489
|
mirror.sync(reconcileHumanEdits(store.list({ limit: 500, includeForgotten: false })));
|
|
490
490
|
} catch (error) {
|
|
491
|
-
|
|
491
|
+
logger?.warn?.("syncMirror failed:", error);
|
|
492
492
|
}
|
|
493
493
|
}
|
|
494
494
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@modusensus/dsh-mneme",
|
|
3
3
|
"description": "Cross-session memory plugin for DeepSeek Harness with autoDream consolidation: SQLite store, Markdown mirrors, 6 model tools, automatic injection, session summarization, user profile/rules, custom slash commands, vector (semantic) search, and a Web GUI panel",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "lib/index.js",
|
|
@@ -140,7 +140,7 @@ async function resolveEntity(entity, store) {
|
|
|
140
140
|
return created.id;
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
export async function extractEntities(memory, { store, config, callLLM }) {
|
|
143
|
+
export async function extractEntities(memory, { store, config, callLLM, logger }) {
|
|
144
144
|
try {
|
|
145
145
|
if (!memory || !memory.content) {
|
|
146
146
|
return { ok: false, error: "Invalid memory: missing content" };
|
|
@@ -181,7 +181,7 @@ export async function extractEntities(memory, { store, config, callLLM }) {
|
|
|
181
181
|
resolvedEntities.push({ ...entity, entity_id: entityId });
|
|
182
182
|
} catch (err) {
|
|
183
183
|
skipCount++;
|
|
184
|
-
|
|
184
|
+
logger?.warn?.(`[extractor] Failed to resolve entity "${entity.name}":`, err.message);
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
|
|
@@ -201,7 +201,7 @@ export async function extractEntities(memory, { store, config, callLLM }) {
|
|
|
201
201
|
attrs.push(saved);
|
|
202
202
|
} catch (err) {
|
|
203
203
|
skipCount++;
|
|
204
|
-
|
|
204
|
+
logger?.warn?.(`[extractor] Failed to save attr "${attr.key}" for entity "${entity.name}":`, err.message);
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
207
|
}
|
|
@@ -224,7 +224,7 @@ export async function extractEntities(memory, { store, config, callLLM }) {
|
|
|
224
224
|
savedRelations.push(saved);
|
|
225
225
|
} catch (err) {
|
|
226
226
|
skipCount++;
|
|
227
|
-
|
|
227
|
+
logger?.warn?.(`[extractor] Failed to save relation "${rel.from} -> ${rel.to}":`, err.message);
|
|
228
228
|
}
|
|
229
229
|
}
|
|
230
230
|
|
package/src/index.js
CHANGED
|
@@ -43,7 +43,7 @@ export const apply = (ctx, config) => {
|
|
|
43
43
|
store.deleteOldFailures(new Date(Date.now() - 90 * 86400000).toISOString());
|
|
44
44
|
} catch { /* non-fatal */ }
|
|
45
45
|
const mirror = createMirror(memoryDir);
|
|
46
|
-
const service = createService({ store, mirror, config: cfg });
|
|
46
|
+
const service = createService({ store, mirror, config: cfg, logger: ctx.logger });
|
|
47
47
|
|
|
48
48
|
// Recall-layer receipt: when searchMemories runs with recordRecall=true, the
|
|
49
49
|
// retrieval scene (query/mode/topK/threshold + candidates) is persisted to
|
|
@@ -196,7 +196,7 @@ export const apply = (ctx, config) => {
|
|
|
196
196
|
return text;
|
|
197
197
|
};
|
|
198
198
|
service.setEntityExtractor((memory) =>
|
|
199
|
-
extractEntities(memory, { store, config: cfg, callLLM: streamEntityText })
|
|
199
|
+
extractEntities(memory, { store, config: cfg, callLLM: streamEntityText, logger: ctx.logger })
|
|
200
200
|
.catch((err) => {
|
|
201
201
|
ctx.logger?.warn?.(`[dsh-mneme] entity extraction failed: ${String(err)}`);
|
|
202
202
|
return { ok: false, error: String(err) };
|
package/src/service.js
CHANGED
|
@@ -3,7 +3,7 @@ import { TYPE_FILE } from "./mirror.js";
|
|
|
3
3
|
|
|
4
4
|
const INJECT_TYPES = new Set(["preference", "project", "decision", "summary"]);
|
|
5
5
|
|
|
6
|
-
export function createService({ store, mirror, config, onWrite }) {
|
|
6
|
+
export function createService({ store, mirror, config, onWrite, logger }) {
|
|
7
7
|
// Optional dream scheduler hook, installed via setDreamHook after creation
|
|
8
8
|
// (the scheduler holds a reference back to the service, so it cannot be
|
|
9
9
|
// passed in the constructor). Fired on the same write events as onWrite.
|
|
@@ -56,10 +56,10 @@ export function createService({ store, mirror, config, onWrite }) {
|
|
|
56
56
|
if (!config.entityExtractionEnabled || !entityExtractor) return;
|
|
57
57
|
try {
|
|
58
58
|
entityExtractor(memory).catch((err) => {
|
|
59
|
-
|
|
59
|
+
logger?.warn?.("entity extraction failed:", err);
|
|
60
60
|
});
|
|
61
61
|
} catch (err) {
|
|
62
|
-
|
|
62
|
+
logger?.warn?.("entity extraction failed:", err);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
|
|
@@ -306,7 +306,7 @@ export function createService({ store, mirror, config, onWrite }) {
|
|
|
306
306
|
try {
|
|
307
307
|
syncMirror();
|
|
308
308
|
} catch (error) {
|
|
309
|
-
|
|
309
|
+
logger?.warn?.("syncMirror failed after transaction:", error);
|
|
310
310
|
}
|
|
311
311
|
notifyWrite();
|
|
312
312
|
}
|
|
@@ -488,7 +488,7 @@ export function createService({ store, mirror, config, onWrite }) {
|
|
|
488
488
|
try {
|
|
489
489
|
mirror.sync(reconcileHumanEdits(store.list({ limit: 500, includeForgotten: false })));
|
|
490
490
|
} catch (error) {
|
|
491
|
-
|
|
491
|
+
logger?.warn?.("syncMirror failed:", error);
|
|
492
492
|
}
|
|
493
493
|
}
|
|
494
494
|
|
package/test/fnew-0112.test.js
CHANGED
|
@@ -201,27 +201,22 @@ test("F-NEW-02 e: COMMIT 后 mirror.sync 抛 ENOSPC → transaction 正常返回
|
|
|
201
201
|
try {
|
|
202
202
|
const store = createStore(dbPath);
|
|
203
203
|
const mirror = createMirror(mirrorDir);
|
|
204
|
-
const
|
|
204
|
+
const warns = [];
|
|
205
|
+
const logger = { warn: (...a) => warns.push(a) };
|
|
206
|
+
const service = createService({ store, mirror, config: {}, logger });
|
|
205
207
|
const { original } = throwingMirrorSync(mirror);
|
|
206
208
|
|
|
207
|
-
let warns = 0;
|
|
208
209
|
let committedId;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
result
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
}, "syncMirror 失败不得向外抛(已 COMMIT 不得被当成未提交)");
|
|
220
|
-
assert.equal(result, "tx-result", "transaction 必须返回 fn 的结果");
|
|
221
|
-
} finally {
|
|
222
|
-
console.warn = origWarn;
|
|
223
|
-
}
|
|
224
|
-
assert.ok(warns >= 1, "fail-safe 应走 console.warn 路径");
|
|
210
|
+
let result;
|
|
211
|
+
assert.doesNotThrow(() => {
|
|
212
|
+
result = service.transaction(() => {
|
|
213
|
+
const { memory } = service.saveWithDedupe({ type: "project", title: "原子", content: "已提交", importance: 3 });
|
|
214
|
+
committedId = memory.id;
|
|
215
|
+
return "tx-result";
|
|
216
|
+
});
|
|
217
|
+
}, "syncMirror 失败不得向外抛(已 COMMIT 不得被当成未提交)");
|
|
218
|
+
assert.equal(result, "tx-result", "transaction 必须返回 fn 的结果");
|
|
219
|
+
assert.ok(warns.length >= 1, "fail-safe 应走 logger.warn 路径");
|
|
225
220
|
assert.equal(store.count(), 1, "DB 必须已提交");
|
|
226
221
|
assert.equal(service.getById(committedId).content, "已提交");
|
|
227
222
|
|