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.
@@ -3823,7 +3823,7 @@ function getVersion2() {
3823
3823
  const pkg = JSON.parse(readFileSync5(resolve7(process.cwd(), "package.json"), "utf-8"));
3824
3824
  return pkg.version;
3825
3825
  } catch {
3826
- return "2.1.4";
3826
+ return "2.1.5";
3827
3827
  }
3828
3828
  }
3829
3829
  }
@@ -4364,7 +4364,7 @@ function getVersion() {
4364
4364
  const pkg = JSON.parse(readFileSync5(resolve7(process.cwd(), "package.json"), "utf-8"));
4365
4365
  return pkg.version;
4366
4366
  } catch {
4367
- return "2.1.4";
4367
+ return "2.1.5";
4368
4368
  }
4369
4369
  }
4370
4370
  }
@@ -5286,8 +5286,7 @@ async function handleSearch(store, pathname, method, res, searchParams) {
5286
5286
  } else {
5287
5287
  results = store.search(projectId, q, limit);
5288
5288
  }
5289
- const filtered = results.filter((r) => r.title !== "__INDEX__");
5290
- json(res, 200, { query: q, semantic, count: filtered.length, results: filtered });
5289
+ json(res, 200, { query: q, semantic, count: results.length, results });
5291
5290
  return true;
5292
5291
  }
5293
5292
  return false;
@@ -5497,7 +5496,7 @@ var PKG_VERSION = (() => {
5497
5496
  const pkg = JSON.parse(__require("fs").readFileSync(__require("path").resolve(__dirname, "../../package.json"), "utf-8"));
5498
5497
  return pkg.version;
5499
5498
  } catch {
5500
- return "2.1.4";
5499
+ return "2.1.5";
5501
5500
  }
5502
5501
  })();
5503
5502
  function handleHealth(store, pathname, method, res) {
@@ -6170,7 +6169,15 @@ var Store = class extends EventEmitter {
6170
6169
  vals.push(this.now());
6171
6170
  sets.push("version = version + 1");
6172
6171
  vals.push(id);
6173
- this.stmt(`UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`).run(...vals);
6172
+ const sql = `UPDATE atoms SET ${sets.join(", ")} WHERE id = ?`;
6173
+ try {
6174
+ this.stmt(sql).run(...vals);
6175
+ } catch (err) {
6176
+ if (err.message?.includes("malformed") || err.message?.includes("corrupt")) {
6177
+ throw new Error(`Database appears corrupted. Run "mnemosyne doctor --data-dir ./data" or delete the data directory and run "mnemosyne init" again.`);
6178
+ }
6179
+ throw err;
6180
+ }
6174
6181
  const updated = this.getAtom(id);
6175
6182
  this.emit("atom.updated", { atom: updated, projectId: atom.project_id, changes });
6176
6183
  this.logEvent("atom.updated", updatedBy, "assistant", atom.project_id, id, void 0, { fields: changes });
@@ -6425,7 +6432,6 @@ var Store = class extends EventEmitter {
6425
6432
  // ═══════════════════════════════════════════════════════════
6426
6433
  search(projectId, q, limit) {
6427
6434
  const results = [];
6428
- const seenAtoms = /* @__PURE__ */ new Set();
6429
6435
  const matchExpr = q.trim().split(/\s+/).filter(Boolean).map((t) => `"${t.replace(/"/g, "")}"`).join(" ");
6430
6436
  if (!matchExpr) return results;
6431
6437
  const projectFilter = projectId ? "AND a.project_id = ?" : "";
@@ -6440,26 +6446,9 @@ var Store = class extends EventEmitter {
6440
6446
  `).all(...paramsAtoms);
6441
6447
  for (const a of atoms) {
6442
6448
  if (results.length >= limit) break;
6443
- seenAtoms.add(a.id);
6449
+ if (a.title === "__INDEX__") continue;
6444
6450
  results.push({ kind: "atom", ...a, metadata: this.parseMeta(a) });
6445
6451
  }
6446
- const paramsBlocks = projectId ? [matchExpr, projectId, limit] : [matchExpr, limit];
6447
- const blocks = this.stmt(`
6448
- SELECT b.*, a.title as atom_title, a.id as atom_id, bm25(search_blocks) as rank
6449
- FROM search_blocks
6450
- JOIN blocks b ON b.rowid = search_blocks.rowid
6451
- JOIN atoms a ON b.atom_id = a.id
6452
- WHERE search_blocks MATCH ? ${projectFilter}
6453
- ORDER BY rank
6454
- LIMIT ?
6455
- `).all(...paramsBlocks);
6456
- for (const b of blocks) {
6457
- if (results.length >= limit) break;
6458
- if (!seenAtoms.has(b.atom_id)) {
6459
- seenAtoms.add(b.atom_id);
6460
- results.push({ kind: "block", ...b, metadata: this.parseMeta(b) });
6461
- }
6462
- }
6463
6452
  return results;
6464
6453
  }
6465
6454
  // ─── Semantic Search ──────────────────────────────────────
@@ -6510,7 +6499,7 @@ var Store = class extends EventEmitter {
6510
6499
  ORDER BY v.distance
6511
6500
  LIMIT ${limit}
6512
6501
  `).all(...params);
6513
- return rows.map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
6502
+ return rows.filter((r) => r.title !== "__INDEX__").map((r) => ({ kind: "atom", ...r, metadata: this.parseMeta(r) }));
6514
6503
  } catch (err) {
6515
6504
  console.error("[Store] Semantic search failed:", err.message);
6516
6505
  return [];
@@ -7075,7 +7064,7 @@ CREATE TRIGGER IF NOT EXISTS trig_search_atoms_insert AFTER INSERT ON atoms BEGI
7075
7064
  END;
7076
7065
 
7077
7066
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_update AFTER UPDATE ON atoms BEGIN
7078
- UPDATE search_atoms SET title = new.title, summary = COALESCE(new.summary, '') WHERE rowid = new.rowid;
7067
+ INSERT OR REPLACE INTO search_atoms(rowid, title, summary) VALUES (new.rowid, new.title, COALESCE(new.summary, ''));
7079
7068
  END;
7080
7069
 
7081
7070
  CREATE TRIGGER IF NOT EXISTS trig_search_atoms_delete AFTER DELETE ON atoms BEGIN
@@ -7125,6 +7114,10 @@ function getDb() {
7125
7114
  db.pragma("journal_mode = WAL");
7126
7115
  db.pragma("foreign_keys = ON");
7127
7116
  db.pragma("synchronous = NORMAL");
7117
+ try {
7118
+ db.pragma("wal_checkpoint(TRUNCATE)");
7119
+ } catch {
7120
+ }
7128
7121
  try {
7129
7122
  const { getLoadablePath } = __require("sqlite-vec");
7130
7123
  db.loadExtension(getLoadablePath());
@@ -7203,7 +7196,7 @@ var MnemosyneServer = class {
7203
7196
  const wss = new import_websocket_server.default({ server: this.httpServer });
7204
7197
  this.wsHandler = new WebSocketHandler(wss, this.store);
7205
7198
  }
7206
- const version = cfg?.server?.version || "2.1.4";
7199
+ const version = cfg?.server?.version || "2.1.5";
7207
7200
  this.httpServer.listen(port, () => {
7208
7201
  console.log(`Mnemosyne v${version} \u2014 port ${port}`);
7209
7202
  console.log(`Dashboard: http://${host}:${port}/dashboard`);