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.mjs CHANGED
@@ -207,7 +207,7 @@ function getVersion() {
207
207
  const pkg = JSON.parse(readFileSync6(resolve9(process.cwd(), "package.json"), "utf-8"));
208
208
  return pkg.version;
209
209
  } catch {
210
- return "2.1.4";
210
+ return "2.1.5";
211
211
  }
212
212
  }
213
213
  }
@@ -4568,7 +4568,15 @@ var Store = class extends EventEmitter {
4568
4568
  vals.push(this.now());
4569
4569
  sets.push("version = version + 1");
4570
4570
  vals.push(id);
4571
- this.stmt(`UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`).run(...vals);
4571
+ const sql = `UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`;
4572
+ try {
4573
+ this.stmt(sql).run(...vals);
4574
+ } catch (err) {
4575
+ if (err.message?.includes("malformed") || err.message?.includes("corrupt")) {
4576
+ throw new Error(`Database appears corrupted. Run "mnemosyne doctor --data-dir ./data" or delete the data directory and run "mnemosyne init" again.`);
4577
+ }
4578
+ throw err;
4579
+ }
4572
4580
  const updated = this.getAtom(id);
4573
4581
  this.emit("atom.updated", { atom: updated, projectId: atom.project_id, changes });
4574
4582
  this.logEvent("atom.updated", updatedBy, "assistant", atom.project_id, id, void 0, { fields: changes });
@@ -4823,7 +4831,6 @@ var Store = class extends EventEmitter {
4823
4831
  // ═══════════════════════════════════════════════════════════
4824
4832
  search(projectId, q, limit) {
4825
4833
  const results = [];
4826
- const seenAtoms = /* @__PURE__ */ new Set();
4827
4834
  const matchExpr = q.trim().split(/\s+/).filter(Boolean).map((t) => `"${t.replace(/"/g, "")}"`).join(" ");
4828
4835
  if (!matchExpr) return results;
4829
4836
  const projectFilter = projectId ? "AND a.project_id = ?" : "";
@@ -4838,26 +4845,9 @@ var Store = class extends EventEmitter {
4838
4845
  `).all(...paramsAtoms);
4839
4846
  for (const a of atoms) {
4840
4847
  if (results.length >= limit) break;
4841
- seenAtoms.add(a.id);
4848
+ if (a.title === "__INDEX__") continue;
4842
4849
  results.push({ kind: "atom", ...a, metadata: this.parseMeta(a) });
4843
4850
  }
4844
- const paramsBlocks = projectId ? [matchExpr, projectId, limit] : [matchExpr, limit];
4845
- const blocks = this.stmt(`
4846
- SELECT b.*, a.title as atom_title, a.id as atom_id, bm25(search_blocks) as rank
4847
- FROM search_blocks
4848
- JOIN blocks b ON b.rowid = search_blocks.rowid
4849
- JOIN atoms a ON b.atom_id = a.id
4850
- WHERE search_blocks MATCH ? ${projectFilter}
4851
- ORDER BY rank
4852
- LIMIT ?
4853
- `).all(...paramsBlocks);
4854
- for (const b of blocks) {
4855
- if (results.length >= limit) break;
4856
- if (!seenAtoms.has(b.atom_id)) {
4857
- seenAtoms.add(b.atom_id);
4858
- results.push({ kind: "block", ...b, metadata: this.parseMeta(b) });
4859
- }
4860
- }
4861
4851
  return results;
4862
4852
  }
4863
4853
  // ─── Semantic Search ──────────────────────────────────────
@@ -4908,7 +4898,7 @@ var Store = class extends EventEmitter {
4908
4898
  ORDER BY v.distance
4909
4899
  LIMIT ${limit}
4910
4900
  `).all(...params);
4911
- return rows.map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
4901
+ return rows.filter((r) => r.title !== "__INDEX__").map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
4912
4902
  } catch (err) {
4913
4903
  console.error("[Store] Semantic search failed:", err.message);
4914
4904
  return [];
@@ -5371,7 +5361,7 @@ function getVersion2() {
5371
5361
  const pkg = JSON.parse(readFileSync6(resolve9(process.cwd(), "package.json"), "utf-8"));
5372
5362
  return pkg.version;
5373
5363
  } catch {
5374
- return "2.1.4";
5364
+ return "2.1.5";
5375
5365
  }
5376
5366
  }
5377
5367
  }
@@ -5610,7 +5600,7 @@ CREATE TRIGGER IF NOT EXISTS trig_search_atoms_insert AFTER INSERT ON atoms BEGI
5610
5600
  END;
5611
5601
 
5612
5602
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_update AFTER UPDATE ON atoms BEGIN
5613
- UPDATE search_atoms SET title = new.title, summary = COALESCE(new.summary, '') WHERE rowid = new.rowid;
5603
+ INSERT OR REPLACE INTO search_atoms(rowid, title, summary) VALUES (new.rowid, new.title, COALESCE(new.summary, ''));
5614
5604
  END;
5615
5605
 
5616
5606
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_delete AFTER DELETE ON atoms BEGIN
@@ -5662,6 +5652,10 @@ var Mnemosyne = class {
5662
5652
  this.db.pragma("journal_mode = WAL");
5663
5653
  this.db.pragma("foreign_keys = ON");
5664
5654
  this.db.pragma("synchronous = NORMAL");
5655
+ try {
5656
+ this.db.pragma("wal_checkpoint(TRUNCATE)");
5657
+ } catch {
5658
+ }
5665
5659
  this.vecEnabled = false;
5666
5660
  try {
5667
5661
  let vecPath;
@@ -5954,7 +5948,7 @@ function getVersion3() {
5954
5948
  const pkg = JSON.parse(readFileSync6(resolve9(process.cwd(), "package.json"), "utf-8"));
5955
5949
  return pkg.version;
5956
5950
  } catch {
5957
- return "2.1.4";
5951
+ return "2.1.5";
5958
5952
  }
5959
5953
  }
5960
5954
  }
@@ -6910,8 +6904,7 @@ async function handleSearch(store, pathname, method, res, searchParams) {
6910
6904
  } else {
6911
6905
  results = store.search(projectId, q, limit);
6912
6906
  }
6913
- const filtered = results.filter((r) => r.title !== "__INDEX__");
6914
- json(res, 200, { query: q, semantic, count: filtered.length, results: filtered });
6907
+ json(res, 200, { query: q, semantic, count: results.length, results });
6915
6908
  return true;
6916
6909
  }
6917
6910
  return false;
@@ -7121,7 +7114,7 @@ var PKG_VERSION = (() => {
7121
7114
  const pkg = JSON.parse(__require("fs").readFileSync(__require("path").resolve(__dirname, "../../package.json"), "utf-8"));
7122
7115
  return pkg.version;
7123
7116
  } catch {
7124
- return "2.1.4";
7117
+ return "2.1.5";
7125
7118
  }
7126
7119
  })();
7127
7120
  function handleHealth(store, pathname, method, res) {
@@ -7404,6 +7397,10 @@ function getDb() {
7404
7397
  db.pragma("journal_mode = WAL");
7405
7398
  db.pragma("foreign_keys = ON");
7406
7399
  db.pragma("synchronous = NORMAL");
7400
+ try {
7401
+ db.pragma("wal_checkpoint(TRUNCATE)");
7402
+ } catch {
7403
+ }
7407
7404
  try {
7408
7405
  const { getLoadablePath } = __require("sqlite-vec");
7409
7406
  db.loadExtension(getLoadablePath());
@@ -7482,7 +7479,7 @@ var MnemosyneServer = class {
7482
7479
  const wss = new import_websocket_server.default({ server: this.httpServer });
7483
7480
  this.wsHandler = new WebSocketHandler(wss, this.store);
7484
7481
  }
7485
- const version = cfg?.server?.version || "2.1.4";
7482
+ const version = cfg?.server?.version || "2.1.5";
7486
7483
  this.httpServer.listen(port, () => {
7487
7484
  console.log(`Mnemosyne v${version} \u2014 port ${port}`);
7488
7485
  console.log(`Dashboard: http://${host}:${port}/dashboard`);