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/index.js CHANGED
@@ -201,7 +201,7 @@ function getVersion() {
201
201
  const pkg = JSON.parse(readFileSync6(resolve9(process.cwd(), "package.json"), "utf-8"));
202
202
  return pkg.version;
203
203
  } catch {
204
- return "2.1.4";
204
+ return "2.1.5";
205
205
  }
206
206
  }
207
207
  }
@@ -4598,7 +4598,15 @@ var Store = class extends EventEmitter {
4598
4598
  vals.push(this.now());
4599
4599
  sets.push("version = version + 1");
4600
4600
  vals.push(id);
4601
- this.stmt(`UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`).run(...vals);
4601
+ const sql = `UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`;
4602
+ try {
4603
+ this.stmt(sql).run(...vals);
4604
+ } catch (err) {
4605
+ if (err.message?.includes("malformed") || err.message?.includes("corrupt")) {
4606
+ throw new Error(`Database appears corrupted. Run "mnemosyne doctor --data-dir ./data" or delete the data directory and run "mnemosyne init" again.`);
4607
+ }
4608
+ throw err;
4609
+ }
4602
4610
  const updated = this.getAtom(id);
4603
4611
  this.emit("atom.updated", { atom: updated, projectId: atom.project_id, changes });
4604
4612
  this.logEvent("atom.updated", updatedBy, "assistant", atom.project_id, id, void 0, { fields: changes });
@@ -4853,7 +4861,6 @@ var Store = class extends EventEmitter {
4853
4861
  // ═══════════════════════════════════════════════════════════
4854
4862
  search(projectId, q, limit) {
4855
4863
  const results = [];
4856
- const seenAtoms = /* @__PURE__ */ new Set();
4857
4864
  const matchExpr = q.trim().split(/\s+/).filter(Boolean).map((t) => `"${t.replace(/"/g, "")}"`).join(" ");
4858
4865
  if (!matchExpr) return results;
4859
4866
  const projectFilter = projectId ? "AND a.project_id = ?" : "";
@@ -4868,26 +4875,9 @@ var Store = class extends EventEmitter {
4868
4875
  `).all(...paramsAtoms);
4869
4876
  for (const a of atoms) {
4870
4877
  if (results.length >= limit) break;
4871
- seenAtoms.add(a.id);
4878
+ if (a.title === "__INDEX__") continue;
4872
4879
  results.push({ kind: "atom", ...a, metadata: this.parseMeta(a) });
4873
4880
  }
4874
- const paramsBlocks = projectId ? [matchExpr, projectId, limit] : [matchExpr, limit];
4875
- const blocks = this.stmt(`
4876
- SELECT b.*, a.title as atom_title, a.id as atom_id, bm25(search_blocks) as rank
4877
- FROM search_blocks
4878
- JOIN blocks b ON b.rowid = search_blocks.rowid
4879
- JOIN atoms a ON b.atom_id = a.id
4880
- WHERE search_blocks MATCH ? ${projectFilter}
4881
- ORDER BY rank
4882
- LIMIT ?
4883
- `).all(...paramsBlocks);
4884
- for (const b of blocks) {
4885
- if (results.length >= limit) break;
4886
- if (!seenAtoms.has(b.atom_id)) {
4887
- seenAtoms.add(b.atom_id);
4888
- results.push({ kind: "block", ...b, metadata: this.parseMeta(b) });
4889
- }
4890
- }
4891
4881
  return results;
4892
4882
  }
4893
4883
  // ─── Semantic Search ──────────────────────────────────────
@@ -4938,7 +4928,7 @@ var Store = class extends EventEmitter {
4938
4928
  ORDER BY v.distance
4939
4929
  LIMIT ${limit}
4940
4930
  `).all(...params);
4941
- return rows.map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
4931
+ return rows.filter((r) => r.title !== "__INDEX__").map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
4942
4932
  } catch (err) {
4943
4933
  console.error("[Store] Semantic search failed:", err.message);
4944
4934
  return [];
@@ -5401,7 +5391,7 @@ function getVersion2() {
5401
5391
  const pkg = JSON.parse(readFileSync6(resolve9(process.cwd(), "package.json"), "utf-8"));
5402
5392
  return pkg.version;
5403
5393
  } catch {
5404
- return "2.1.4";
5394
+ return "2.1.5";
5405
5395
  }
5406
5396
  }
5407
5397
  }
@@ -5640,7 +5630,7 @@ CREATE TRIGGER IF NOT EXISTS trig_search_atoms_insert AFTER INSERT ON atoms BEGI
5640
5630
  END;
5641
5631
 
5642
5632
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_update AFTER UPDATE ON atoms BEGIN
5643
- UPDATE search_atoms SET title = new.title, summary = COALESCE(new.summary, '') WHERE rowid = new.rowid;
5633
+ INSERT OR REPLACE INTO search_atoms(rowid, title, summary) VALUES (new.rowid, new.title, COALESCE(new.summary, ''));
5644
5634
  END;
5645
5635
 
5646
5636
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_delete AFTER DELETE ON atoms BEGIN
@@ -5692,6 +5682,10 @@ var Mnemosyne = class {
5692
5682
  this.db.pragma("journal_mode = WAL");
5693
5683
  this.db.pragma("foreign_keys = ON");
5694
5684
  this.db.pragma("synchronous = NORMAL");
5685
+ try {
5686
+ this.db.pragma("wal_checkpoint(TRUNCATE)");
5687
+ } catch {
5688
+ }
5695
5689
  this.vecEnabled = false;
5696
5690
  try {
5697
5691
  let vecPath;
@@ -5984,7 +5978,7 @@ function getVersion3() {
5984
5978
  const pkg = JSON.parse(readFileSync6(resolve9(process.cwd(), "package.json"), "utf-8"));
5985
5979
  return pkg.version;
5986
5980
  } catch {
5987
- return "2.1.4";
5981
+ return "2.1.5";
5988
5982
  }
5989
5983
  }
5990
5984
  }
@@ -6940,8 +6934,7 @@ async function handleSearch(store, pathname, method, res, searchParams) {
6940
6934
  } else {
6941
6935
  results = store.search(projectId, q, limit);
6942
6936
  }
6943
- const filtered = results.filter((r) => r.title !== "__INDEX__");
6944
- json(res, 200, { query: q, semantic, count: filtered.length, results: filtered });
6937
+ json(res, 200, { query: q, semantic, count: results.length, results });
6945
6938
  return true;
6946
6939
  }
6947
6940
  return false;
@@ -7151,7 +7144,7 @@ var PKG_VERSION = (() => {
7151
7144
  const pkg = JSON.parse(require("fs").readFileSync(require("path").resolve(__dirname, "../../package.json"), "utf-8"));
7152
7145
  return pkg.version;
7153
7146
  } catch {
7154
- return "2.1.4";
7147
+ return "2.1.5";
7155
7148
  }
7156
7149
  })();
7157
7150
  function handleHealth(store, pathname, method, res) {
@@ -7434,6 +7427,10 @@ function getDb() {
7434
7427
  db.pragma("journal_mode = WAL");
7435
7428
  db.pragma("foreign_keys = ON");
7436
7429
  db.pragma("synchronous = NORMAL");
7430
+ try {
7431
+ db.pragma("wal_checkpoint(TRUNCATE)");
7432
+ } catch {
7433
+ }
7437
7434
  try {
7438
7435
  const { getLoadablePath } = require("sqlite-vec");
7439
7436
  db.loadExtension(getLoadablePath());
@@ -7512,7 +7509,7 @@ var MnemosyneServer = class {
7512
7509
  const wss = new import_websocket_server.default({ server: this.httpServer });
7513
7510
  this.wsHandler = new WebSocketHandler(wss, this.store);
7514
7511
  }
7515
- const version = cfg?.server?.version || "2.1.4";
7512
+ const version = cfg?.server?.version || "2.1.5";
7516
7513
  this.httpServer.listen(port, () => {
7517
7514
  console.log(`Mnemosyne v${version} \u2014 port ${port}`);
7518
7515
  console.log(`Dashboard: http://${host}:${port}/dashboard`);