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.
package/dist/cli/index.js CHANGED
@@ -3635,7 +3635,7 @@ function getVersion() {
3635
3635
  const pkg = JSON.parse(readFileSync8(resolve14(process.cwd(), "package.json"), "utf-8"));
3636
3636
  return pkg.version;
3637
3637
  } catch {
3638
- return "2.1.4";
3638
+ return "2.1.5";
3639
3639
  }
3640
3640
  }
3641
3641
  }
@@ -7599,7 +7599,7 @@ var require_package = __commonJS({
7599
7599
  "package.json"(exports2, module2) {
7600
7600
  module2.exports = {
7601
7601
  name: "mnemosyne-core",
7602
- version: "2.1.4",
7602
+ version: "2.1.6",
7603
7603
  description: "Unified memory engine for AI agents \u2014 graph atoms, semantic search, and collaborative memory",
7604
7604
  logo: "logo.png",
7605
7605
  author: "Arman Aslanyan <aslanyanarman88@gmail.com> (https://www.linkedin.com/in/arman-aslanyan/)",
@@ -8144,7 +8144,15 @@ var Store = class extends EventEmitter {
8144
8144
  vals.push(this.now());
8145
8145
  sets.push("version = version + 1");
8146
8146
  vals.push(id);
8147
- this.stmt(`UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`).run(...vals);
8147
+ const sql = `UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`;
8148
+ try {
8149
+ this.stmt(sql).run(...vals);
8150
+ } catch (err) {
8151
+ if (err.message?.includes("malformed") || err.message?.includes("corrupt")) {
8152
+ throw new Error(`Database appears corrupted. Run "mnemosyne doctor --data-dir ./data" or delete the data directory and run "mnemosyne init" again.`);
8153
+ }
8154
+ throw err;
8155
+ }
8148
8156
  const updated = this.getAtom(id);
8149
8157
  this.emit("atom.updated", { atom: updated, projectId: atom.project_id, changes });
8150
8158
  this.logEvent("atom.updated", updatedBy, "assistant", atom.project_id, id, void 0, { fields: changes });
@@ -8399,7 +8407,6 @@ var Store = class extends EventEmitter {
8399
8407
  // ═══════════════════════════════════════════════════════════
8400
8408
  search(projectId, q, limit) {
8401
8409
  const results = [];
8402
- const seenAtoms = /* @__PURE__ */ new Set();
8403
8410
  const matchExpr = q.trim().split(/\s+/).filter(Boolean).map((t) => `"${t.replace(/"/g, "")}"`).join(" ");
8404
8411
  if (!matchExpr) return results;
8405
8412
  const projectFilter = projectId ? "AND a.project_id = ?" : "";
@@ -8414,26 +8421,9 @@ var Store = class extends EventEmitter {
8414
8421
  `).all(...paramsAtoms);
8415
8422
  for (const a of atoms) {
8416
8423
  if (results.length >= limit) break;
8417
- seenAtoms.add(a.id);
8424
+ if (a.title === "__INDEX__") continue;
8418
8425
  results.push({ kind: "atom", ...a, metadata: this.parseMeta(a) });
8419
8426
  }
8420
- const paramsBlocks = projectId ? [matchExpr, projectId, limit] : [matchExpr, limit];
8421
- const blocks = this.stmt(`
8422
- SELECT b.*, a.title as atom_title, a.id as atom_id, bm25(search_blocks) as rank
8423
- FROM search_blocks
8424
- JOIN blocks b ON b.rowid = search_blocks.rowid
8425
- JOIN atoms a ON b.atom_id = a.id
8426
- WHERE search_blocks MATCH ? ${projectFilter}
8427
- ORDER BY rank
8428
- LIMIT ?
8429
- `).all(...paramsBlocks);
8430
- for (const b of blocks) {
8431
- if (results.length >= limit) break;
8432
- if (!seenAtoms.has(b.atom_id)) {
8433
- seenAtoms.add(b.atom_id);
8434
- results.push({ kind: "block", ...b, metadata: this.parseMeta(b) });
8435
- }
8436
- }
8437
8427
  return results;
8438
8428
  }
8439
8429
  // ─── Semantic Search ──────────────────────────────────────
@@ -8484,7 +8474,7 @@ var Store = class extends EventEmitter {
8484
8474
  ORDER BY v.distance
8485
8475
  LIMIT ${limit}
8486
8476
  `).all(...params);
8487
- return rows.map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
8477
+ return rows.filter((r) => r.title !== "__INDEX__").map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
8488
8478
  } catch (err) {
8489
8479
  console.error("[Store] Semantic search failed:", err.message);
8490
8480
  return [];
@@ -8947,7 +8937,7 @@ function getVersion2() {
8947
8937
  const pkg = JSON.parse(readFileSync8(resolve14(process.cwd(), "package.json"), "utf-8"));
8948
8938
  return pkg.version;
8949
8939
  } catch {
8950
- return "2.1.4";
8940
+ return "2.1.5";
8951
8941
  }
8952
8942
  }
8953
8943
  }
@@ -9186,7 +9176,7 @@ CREATE TRIGGER IF NOT EXISTS trig_search_atoms_insert AFTER INSERT ON atoms BEGI
9186
9176
  END;
9187
9177
 
9188
9178
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_update AFTER UPDATE ON atoms BEGIN
9189
- UPDATE search_atoms SET title = new.title, summary = COALESCE(new.summary, '') WHERE rowid = new.rowid;
9179
+ INSERT OR REPLACE INTO search_atoms(rowid, title, summary) VALUES (new.rowid, new.title, COALESCE(new.summary, ''));
9190
9180
  END;
9191
9181
 
9192
9182
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_delete AFTER DELETE ON atoms BEGIN
@@ -9238,6 +9228,10 @@ var Mnemosyne = class {
9238
9228
  this.db.pragma("journal_mode = WAL");
9239
9229
  this.db.pragma("foreign_keys = ON");
9240
9230
  this.db.pragma("synchronous = NORMAL");
9231
+ try {
9232
+ this.db.pragma("wal_checkpoint(TRUNCATE)");
9233
+ } catch {
9234
+ }
9241
9235
  this.vecEnabled = false;
9242
9236
  try {
9243
9237
  let vecPath;
@@ -9545,7 +9539,7 @@ function getVersion3() {
9545
9539
  const pkg = JSON.parse(readFileSync8(resolve14(process.cwd(), "package.json"), "utf-8"));
9546
9540
  return pkg.version;
9547
9541
  } catch {
9548
- return "2.1.4";
9542
+ return "2.1.5";
9549
9543
  }
9550
9544
  }
9551
9545
  }
@@ -10470,8 +10464,7 @@ async function handleSearch(store, pathname, method, res, searchParams) {
10470
10464
  } else {
10471
10465
  results = store.search(projectId, q, limit);
10472
10466
  }
10473
- const filtered = results.filter((r) => r.title !== "__INDEX__");
10474
- json(res, 200, { query: q, semantic, count: filtered.length, results: filtered });
10467
+ json(res, 200, { query: q, semantic, count: results.length, results });
10475
10468
  return true;
10476
10469
  }
10477
10470
  return false;
@@ -10681,7 +10674,7 @@ var PKG_VERSION = (() => {
10681
10674
  const pkg = JSON.parse(require("fs").readFileSync(require("path").resolve(__dirname, "../../package.json"), "utf-8"));
10682
10675
  return pkg.version;
10683
10676
  } catch {
10684
- return "2.1.4";
10677
+ return "2.1.5";
10685
10678
  }
10686
10679
  })();
10687
10680
  function handleHealth(store, pathname, method, res) {
@@ -10927,6 +10920,10 @@ function getDb() {
10927
10920
  db.pragma("journal_mode = WAL");
10928
10921
  db.pragma("foreign_keys = ON");
10929
10922
  db.pragma("synchronous = NORMAL");
10923
+ try {
10924
+ db.pragma("wal_checkpoint(TRUNCATE)");
10925
+ } catch {
10926
+ }
10930
10927
  try {
10931
10928
  const { getLoadablePath } = require("sqlite-vec");
10932
10929
  db.loadExtension(getLoadablePath());
@@ -11005,7 +11002,7 @@ var MnemosyneServer = class {
11005
11002
  const wss = new import_websocket_server.default({ server: this.httpServer });
11006
11003
  this.wsHandler = new WebSocketHandler(wss, this.store);
11007
11004
  }
11008
- const version = cfg?.server?.version || "2.1.4";
11005
+ const version = cfg?.server?.version || "2.1.5";
11009
11006
  this.httpServer.listen(port, () => {
11010
11007
  console.log(`Mnemosyne v${version} \u2014 port ${port}`);
11011
11008
  console.log(`Dashboard: http://${host}:${port}/dashboard`);
@@ -11063,7 +11060,7 @@ function getVersion4() {
11063
11060
  const { resolve: resolve14 } = require("path");
11064
11061
  return JSON.parse(readFileSync8(resolve14(__dirname, "../../package.json"), "utf-8")).version;
11065
11062
  } catch {
11066
- return "2.1.4";
11063
+ return "2.1.5";
11067
11064
  }
11068
11065
  }
11069
11066
  async function startCommand(options) {
@@ -11355,7 +11352,7 @@ program2.name("mnemosyne").description("Mnemosyne \u2014 Your exocortex").versio
11355
11352
  try {
11356
11353
  return require_package().version;
11357
11354
  } catch {
11358
- return "2.1.4";
11355
+ return "2.1.5";
11359
11356
  }
11360
11357
  })());
11361
11358
  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);