@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.
@@ -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
- console.warn(`[extractor] Failed to resolve entity "${entity.name}":`, err.message);
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
- console.warn(`[extractor] Failed to save attr "${attr.key}" for entity "${entity.name}":`, err.message);
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
- console.warn(`[extractor] Failed to save relation "${rel.from} -> ${rel.to}":`, err.message);
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
- console.warn("entity extraction failed:", err);
59
+ logger?.warn?.("entity extraction failed:", err);
60
60
  });
61
61
  } catch (err) {
62
- console.warn("entity extraction failed:", err);
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
- console.warn("syncMirror failed after transaction:", error);
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
- console.warn("syncMirror failed:", error);
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.0",
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
- console.warn(`[extractor] Failed to resolve entity "${entity.name}":`, err.message);
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
- console.warn(`[extractor] Failed to save attr "${attr.key}" for entity "${entity.name}":`, err.message);
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
- console.warn(`[extractor] Failed to save relation "${rel.from} -> ${rel.to}":`, err.message);
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
- console.warn("entity extraction failed:", err);
59
+ logger?.warn?.("entity extraction failed:", err);
60
60
  });
61
61
  } catch (err) {
62
- console.warn("entity extraction failed:", err);
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
- console.warn("syncMirror failed after transaction:", error);
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
- console.warn("syncMirror failed:", error);
491
+ logger?.warn?.("syncMirror failed:", error);
492
492
  }
493
493
  }
494
494
 
@@ -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 service = createService({ store, mirror, config: {} });
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
- const origWarn = console.warn;
210
- console.warn = (...a) => { warns++; origWarn(...a); };
211
- try {
212
- let result;
213
- assert.doesNotThrow(() => {
214
- result = service.transaction(() => {
215
- const { memory } = service.saveWithDedupe({ type: "project", title: "原子", content: "已提交", importance: 3 });
216
- committedId = memory.id;
217
- return "tx-result";
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