mnemosyne-core 2.1.4 → 2.1.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.
@@ -3641,7 +3641,7 @@ function getVersion() {
3641
3641
  const pkg = JSON.parse(readFileSync8(resolve14(process.cwd(), "package.json"), "utf-8"));
3642
3642
  return pkg.version;
3643
3643
  } catch {
3644
- return "2.1.4";
3644
+ return "2.1.5";
3645
3645
  }
3646
3646
  }
3647
3647
  }
@@ -7602,7 +7602,7 @@ var require_package = __commonJS({
7602
7602
  "package.json"(exports, module2) {
7603
7603
  module2.exports = {
7604
7604
  name: "mnemosyne-core",
7605
- version: "2.1.4",
7605
+ version: "2.1.6",
7606
7606
  description: "Unified memory engine for AI agents \u2014 graph atoms, semantic search, and collaborative memory",
7607
7607
  logo: "logo.png",
7608
7608
  author: "Arman Aslanyan <aslanyanarman88@gmail.com> (https://www.linkedin.com/in/arman-aslanyan/)",
@@ -8140,7 +8140,15 @@ var Store = class extends EventEmitter {
8140
8140
  vals.push(this.now());
8141
8141
  sets.push("version = version + 1");
8142
8142
  vals.push(id);
8143
- this.stmt(`UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`).run(...vals);
8143
+ const sql = `UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`;
8144
+ try {
8145
+ this.stmt(sql).run(...vals);
8146
+ } catch (err) {
8147
+ if (err.message?.includes("malformed") || err.message?.includes("corrupt")) {
8148
+ throw new Error(`Database appears corrupted. Run "mnemosyne doctor --data-dir ./data" or delete the data directory and run "mnemosyne init" again.`);
8149
+ }
8150
+ throw err;
8151
+ }
8144
8152
  const updated = this.getAtom(id);
8145
8153
  this.emit("atom.updated", { atom: updated, projectId: atom.project_id, changes });
8146
8154
  this.logEvent("atom.updated", updatedBy, "assistant", atom.project_id, id, void 0, { fields: changes });
@@ -8395,7 +8403,6 @@ var Store = class extends EventEmitter {
8395
8403
  // ═══════════════════════════════════════════════════════════
8396
8404
  search(projectId, q, limit) {
8397
8405
  const results = [];
8398
- const seenAtoms = /* @__PURE__ */ new Set();
8399
8406
  const matchExpr = q.trim().split(/\s+/).filter(Boolean).map((t) => `"${t.replace(/"/g, "")}"`).join(" ");
8400
8407
  if (!matchExpr) return results;
8401
8408
  const projectFilter = projectId ? "AND a.project_id = ?" : "";
@@ -8410,26 +8417,9 @@ var Store = class extends EventEmitter {
8410
8417
  `).all(...paramsAtoms);
8411
8418
  for (const a of atoms) {
8412
8419
  if (results.length >= limit) break;
8413
- seenAtoms.add(a.id);
8420
+ if (a.title === "__INDEX__") continue;
8414
8421
  results.push({ kind: "atom", ...a, metadata: this.parseMeta(a) });
8415
8422
  }
8416
- const paramsBlocks = projectId ? [matchExpr, projectId, limit] : [matchExpr, limit];
8417
- const blocks = this.stmt(`
8418
- SELECT b.*, a.title as atom_title, a.id as atom_id, bm25(search_blocks) as rank
8419
- FROM search_blocks
8420
- JOIN blocks b ON b.rowid = search_blocks.rowid
8421
- JOIN atoms a ON b.atom_id = a.id
8422
- WHERE search_blocks MATCH ? ${projectFilter}
8423
- ORDER BY rank
8424
- LIMIT ?
8425
- `).all(...paramsBlocks);
8426
- for (const b of blocks) {
8427
- if (results.length >= limit) break;
8428
- if (!seenAtoms.has(b.atom_id)) {
8429
- seenAtoms.add(b.atom_id);
8430
- results.push({ kind: "block", ...b, metadata: this.parseMeta(b) });
8431
- }
8432
- }
8433
8423
  return results;
8434
8424
  }
8435
8425
  // ─── Semantic Search ──────────────────────────────────────
@@ -8480,7 +8470,7 @@ var Store = class extends EventEmitter {
8480
8470
  ORDER BY v.distance
8481
8471
  LIMIT ${limit}
8482
8472
  `).all(...params);
8483
- return rows.map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
8473
+ return rows.filter((r) => r.title !== "__INDEX__").map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
8484
8474
  } catch (err) {
8485
8475
  console.error("[Store] Semantic search failed:", err.message);
8486
8476
  return [];
@@ -8943,7 +8933,7 @@ function getVersion2() {
8943
8933
  const pkg = JSON.parse(readFileSync8(resolve14(process.cwd(), "package.json"), "utf-8"));
8944
8934
  return pkg.version;
8945
8935
  } catch {
8946
- return "2.1.4";
8936
+ return "2.1.5";
8947
8937
  }
8948
8938
  }
8949
8939
  }
@@ -9182,7 +9172,7 @@ CREATE TRIGGER IF NOT EXISTS trig_search_atoms_insert AFTER INSERT ON atoms BEGI
9182
9172
  END;
9183
9173
 
9184
9174
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_update AFTER UPDATE ON atoms BEGIN
9185
- UPDATE search_atoms SET title = new.title, summary = COALESCE(new.summary, '') WHERE rowid = new.rowid;
9175
+ INSERT OR REPLACE INTO search_atoms(rowid, title, summary) VALUES (new.rowid, new.title, COALESCE(new.summary, ''));
9186
9176
  END;
9187
9177
 
9188
9178
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_delete AFTER DELETE ON atoms BEGIN
@@ -9234,6 +9224,10 @@ var Mnemosyne = class {
9234
9224
  this.db.pragma("journal_mode = WAL");
9235
9225
  this.db.pragma("foreign_keys = ON");
9236
9226
  this.db.pragma("synchronous = NORMAL");
9227
+ try {
9228
+ this.db.pragma("wal_checkpoint(TRUNCATE)");
9229
+ } catch {
9230
+ }
9237
9231
  this.vecEnabled = false;
9238
9232
  try {
9239
9233
  let vecPath;
@@ -9541,7 +9535,7 @@ function getVersion3() {
9541
9535
  const pkg = JSON.parse(readFileSync8(resolve14(process.cwd(), "package.json"), "utf-8"));
9542
9536
  return pkg.version;
9543
9537
  } catch {
9544
- return "2.1.4";
9538
+ return "2.1.5";
9545
9539
  }
9546
9540
  }
9547
9541
  }
@@ -10466,8 +10460,7 @@ async function handleSearch(store, pathname, method, res, searchParams) {
10466
10460
  } else {
10467
10461
  results = store.search(projectId, q, limit);
10468
10462
  }
10469
- const filtered = results.filter((r) => r.title !== "__INDEX__");
10470
- json(res, 200, { query: q, semantic, count: filtered.length, results: filtered });
10463
+ json(res, 200, { query: q, semantic, count: results.length, results });
10471
10464
  return true;
10472
10465
  }
10473
10466
  return false;
@@ -10677,7 +10670,7 @@ var PKG_VERSION = (() => {
10677
10670
  const pkg = JSON.parse(__require("fs").readFileSync(__require("path").resolve(__dirname, "../../package.json"), "utf-8"));
10678
10671
  return pkg.version;
10679
10672
  } catch {
10680
- return "2.1.4";
10673
+ return "2.1.5";
10681
10674
  }
10682
10675
  })();
10683
10676
  function handleHealth(store, pathname, method, res) {
@@ -10923,6 +10916,10 @@ function getDb() {
10923
10916
  db.pragma("journal_mode = WAL");
10924
10917
  db.pragma("foreign_keys = ON");
10925
10918
  db.pragma("synchronous = NORMAL");
10919
+ try {
10920
+ db.pragma("wal_checkpoint(TRUNCATE)");
10921
+ } catch {
10922
+ }
10926
10923
  try {
10927
10924
  const { getLoadablePath } = __require("sqlite-vec");
10928
10925
  db.loadExtension(getLoadablePath());
@@ -11001,7 +10998,7 @@ var MnemosyneServer = class {
11001
10998
  const wss = new import_websocket_server.default({ server: this.httpServer });
11002
10999
  this.wsHandler = new WebSocketHandler(wss, this.store);
11003
11000
  }
11004
- const version = cfg?.server?.version || "2.1.4";
11001
+ const version = cfg?.server?.version || "2.1.5";
11005
11002
  this.httpServer.listen(port, () => {
11006
11003
  console.log(`Mnemosyne v${version} \u2014 port ${port}`);
11007
11004
  console.log(`Dashboard: http://${host}:${port}/dashboard`);
@@ -11059,7 +11056,7 @@ function getVersion4() {
11059
11056
  const { resolve: resolve14 } = __require("path");
11060
11057
  return JSON.parse(readFileSync8(resolve14(__dirname, "../../package.json"), "utf-8")).version;
11061
11058
  } catch {
11062
- return "2.1.4";
11059
+ return "2.1.5";
11063
11060
  }
11064
11061
  }
11065
11062
  async function startCommand(options) {
@@ -11351,7 +11348,7 @@ program2.name("mnemosyne").description("Mnemosyne \u2014 Your exocortex").versio
11351
11348
  try {
11352
11349
  return require_package().version;
11353
11350
  } catch {
11354
- return "2.1.4";
11351
+ return "2.1.5";
11355
11352
  }
11356
11353
  })());
11357
11354
  program2.command("init").description("Initialize a new Mnemosyne workspace").option("-d, --data-dir <path>", "Data directory", "./data").option("-c, --config <path>", "Config file path").action(initCommand);