@linxiraos/pi-mnemopi 1.1.6 → 1.1.7

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/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [1.1.7] - 2026-09-01
6
+
7
+ - 同步上游 OMP v18.0.11(`b8ce33a58911c26bed1d84f0db9a5e2e727c49a2`)。
8
+
5
9
  ## [1.1.6] - 2026-08-30
6
10
 
7
11
  - 同步上游 OMP v18.0.9(`cc14e04f075d`)。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@linxiraos/pi-mnemopi",
4
- "version": "1.1.6",
4
+ "version": "1.1.7",
5
5
  "description": "Local SQLite memory engine for Oh My Pi agents",
6
6
  "homepage": "https://linxira-os.github.io/zeta/",
7
7
  "author": "Can Boluk",
@@ -39,10 +39,10 @@
39
39
  "fmt": "biome format --write ."
40
40
  },
41
41
  "dependencies": {
42
- "@linxiraos/pi-ai": "1.1.6",
43
- "@linxiraos/pi-catalog": "1.1.6",
44
- "@linxiraos/pi-natives": "1.1.6",
45
- "@linxiraos/pi-utils": "1.1.6"
42
+ "@linxiraos/pi-ai": "1.1.7",
43
+ "@linxiraos/pi-catalog": "1.1.7",
44
+ "@linxiraos/pi-natives": "1.1.7",
45
+ "@linxiraos/pi-utils": "1.1.7"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "fastembed": "2.1.0",
@@ -270,8 +270,9 @@ export function cjkLikeSearch(
270
270
  const conditions = cjkChars.map(() => "content LIKE ? ESCAPE '\\'").join(" OR ");
271
271
  try {
272
272
  const rows = db
273
- .query(`SELECT ${idColumn}, content FROM ${table} WHERE superseded_by IS NULL AND (${conditions}) LIMIT ?`)
274
- .all(...cjkChars.map(ch => `%${ch}%`), k * 5) as Record<string, unknown>[];
273
+ .query(`SELECT ${idColumn}, content FROM ${table} WHERE superseded_by IS NULL AND (valid_until IS NULL OR valid_until > ?)
274
+ AND (${conditions}) LIMIT ?`)
275
+ .all(new Date().toISOString(), ...cjkChars.map(ch => `%${ch}%`), k * 5) as Record<string, unknown>[];
275
276
  const scored: Array<{ id: string | number; score: number }> = [];
276
277
  for (const row of rows) {
277
278
  const content = String(row.content ?? "");
@@ -298,9 +299,10 @@ export function ftsSearch(db: Database, query: string, k = 20): FtsRankResult[]
298
299
  const rows = db
299
300
  .query(`SELECT f.rowid, f.rank FROM fts_episodes f
300
301
  WHERE f.fts_episodes MATCH ?
301
- AND EXISTS (SELECT 1 FROM episodic_memory e WHERE e.rowid = f.rowid AND e.superseded_by IS NULL)
302
+ AND EXISTS (SELECT 1 FROM episodic_memory e WHERE e.rowid = f.rowid AND e.superseded_by IS NULL
303
+ AND (e.valid_until IS NULL OR e.valid_until > ?))
302
304
  ORDER BY f.rank, f.rowid LIMIT ?`)
303
- .all(ftsQuery, k) as Record<string, unknown>[];
305
+ .all(ftsQuery, new Date().toISOString(), k) as Record<string, unknown>[];
304
306
  if (rows.length === 0 && hasCjk(query)) return cjkLikeSearch(db, query, k, false) as FtsRankResult[];
305
307
  return rows.map(row => ({ rowid: Number(row.rowid), rank: Number(row.rank) }));
306
308
  } catch {
@@ -315,9 +317,10 @@ export function ftsSearchWorking(db: Database, query: string, k = 20): WorkingFt
315
317
  const rows = db
316
318
  .query(`SELECT f.id, f.rank FROM fts_working f
317
319
  WHERE f.fts_working MATCH ?
318
- AND EXISTS (SELECT 1 FROM working_memory w WHERE w.id = f.id AND w.superseded_by IS NULL)
320
+ AND EXISTS (SELECT 1 FROM working_memory w WHERE w.id = f.id AND w.superseded_by IS NULL
321
+ AND (w.valid_until IS NULL OR w.valid_until > ?))
319
322
  ORDER BY f.rank, f.id LIMIT ?`)
320
- .all(ftsQuery, k) as Record<string, unknown>[];
323
+ .all(ftsQuery, new Date().toISOString(), k) as Record<string, unknown>[];
321
324
  if (rows.length === 0 && hasCjk(query)) return cjkLikeSearch(db, query, k, true) as WorkingFtsRankResult[];
322
325
  return rows.map(row => ({ id: String(row.id), rank: Number(row.rank) }));
323
326
  } catch {
@@ -556,18 +556,20 @@ function ftsRows(
556
556
  // 0.042ms. EXISTS probes the primary key only for rows MATCH actually produced.
557
557
  `SELECT f.id, f.rank FROM fts_working f
558
558
  WHERE f.fts_working MATCH ?
559
- AND EXISTS (SELECT 1 FROM working_memory w WHERE w.id = f.id AND w.superseded_by IS NULL)
559
+ AND EXISTS (SELECT 1 FROM working_memory w WHERE w.id = f.id AND w.superseded_by IS NULL
560
+ AND (w.valid_until IS NULL OR w.valid_until > ?))
560
561
  ORDER BY f.rank, f.id LIMIT ?`,
561
- [ftsQuery(query, useSynonyms), limit],
562
+ [ftsQuery(query, useSynonyms), nowIso(), limit],
562
563
  );
563
564
  }
564
565
  return queryAll(
565
566
  beam,
566
567
  `SELECT f.rowid, f.rank FROM fts_episodes f
567
568
  WHERE f.fts_episodes MATCH ?
568
- AND EXISTS (SELECT 1 FROM episodic_memory e WHERE e.rowid = f.rowid AND e.superseded_by IS NULL)
569
+ AND EXISTS (SELECT 1 FROM episodic_memory e WHERE e.rowid = f.rowid AND e.superseded_by IS NULL
570
+ AND (e.valid_until IS NULL OR e.valid_until > ?))
569
571
  ORDER BY f.rank, f.rowid LIMIT ?`,
570
- [ftsQuery(query, useSynonyms), limit],
572
+ [ftsQuery(query, useSynonyms), nowIso(), limit],
571
573
  );
572
574
  } catch {
573
575
  return [];