@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 +4 -0
- package/package.json +5 -5
- package/src/core/beam/helpers.ts +9 -6
- package/src/core/beam/recall.ts +6 -4
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@linxiraos/pi-mnemopi",
|
|
4
|
-
"version": "1.1.
|
|
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.
|
|
43
|
-
"@linxiraos/pi-catalog": "1.1.
|
|
44
|
-
"@linxiraos/pi-natives": "1.1.
|
|
45
|
-
"@linxiraos/pi-utils": "1.1.
|
|
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",
|
package/src/core/beam/helpers.ts
CHANGED
|
@@ -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 (
|
|
274
|
-
|
|
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 {
|
package/src/core/beam/recall.ts
CHANGED
|
@@ -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 [];
|