@vortex-os/memory-extended 0.5.1 → 0.5.3
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/README.md +17 -17
- package/dist/mcp/recall-tool.d.ts +13 -1
- package/dist/mcp/recall-tool.d.ts.map +1 -1
- package/dist/mcp/recall-tool.js +37 -8
- package/dist/mcp/recall-tool.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/recall/engine.d.ts +20 -18
- package/dist/recall/engine.d.ts.map +1 -1
- package/dist/recall/engine.js +248 -56
- package/dist/recall/engine.js.map +1 -1
- package/dist/recall/ftsQuery.d.ts +29 -0
- package/dist/recall/ftsQuery.d.ts.map +1 -0
- package/dist/recall/ftsQuery.js +36 -0
- package/dist/recall/ftsQuery.js.map +1 -0
- package/dist/recall/fusion.d.ts +58 -0
- package/dist/recall/fusion.d.ts.map +1 -0
- package/dist/recall/fusion.js +115 -0
- package/dist/recall/fusion.js.map +1 -0
- package/dist/recall/index.d.ts +3 -1
- package/dist/recall/index.d.ts.map +1 -1
- package/dist/recall/index.js +1 -0
- package/dist/recall/index.js.map +1 -1
- package/dist/recall/types.d.ts +24 -2
- package/dist/recall/types.d.ts.map +1 -1
- package/dist/sessionArchive/adapters/claude-code.d.ts.map +1 -1
- package/dist/sessionArchive/adapters/claude-code.js +38 -4
- package/dist/sessionArchive/adapters/claude-code.js.map +1 -1
- package/dist/sessionArchive/index.d.ts +1 -1
- package/dist/sessionArchive/index.d.ts.map +1 -1
- package/dist/sessionArchive/index.js.map +1 -1
- package/dist/sessionArchive/store.d.ts +22 -1
- package/dist/sessionArchive/store.d.ts.map +1 -1
- package/dist/sessionArchive/store.js +143 -12
- package/dist/sessionArchive/store.js.map +1 -1
- package/dist/sqlite/fts.d.ts +38 -0
- package/dist/sqlite/fts.d.ts.map +1 -0
- package/dist/sqlite/fts.js +102 -0
- package/dist/sqlite/fts.js.map +1 -0
- package/dist/sqlite/index.d.ts +2 -0
- package/dist/sqlite/index.d.ts.map +1 -1
- package/dist/sqlite/index.js +1 -0
- package/dist/sqlite/index.js.map +1 -1
- package/dist/sqlite/store.d.ts +8 -1
- package/dist/sqlite/store.d.ts.map +1 -1
- package/dist/sqlite/store.js +29 -7
- package/dist/sqlite/store.js.map +1 -1
- package/dist/vector/embedder.d.ts +11 -0
- package/dist/vector/embedder.d.ts.map +1 -1
- package/dist/vector/embedder.js +4 -1
- package/dist/vector/embedder.js.map +1 -1
- package/dist/vector/segment.d.ts +1 -1
- package/dist/vector/store.d.ts +12 -2
- package/dist/vector/store.d.ts.map +1 -1
- package/dist/vector/store.js +17 -2
- package/dist/vector/store.js.map +1 -1
- package/dist/vector/types.d.ts +1 -1
- package/dist/vector/types.js +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
/**
|
|
3
|
+
* Keyword (FTS5) lane over memories — P3 hybrid search.
|
|
4
|
+
*
|
|
5
|
+
* A REGULAR stored-content FTS5 table (NOT contentless — see design §11 R4):
|
|
6
|
+
* it keeps its own copy of name/description/body so an upsert (the `memories`
|
|
7
|
+
* table uses INSERT OR REPLACE, which reassigns the integer rowid on every
|
|
8
|
+
* edit — verified) can be mirrored by a plain DELETE+INSERT on the stored
|
|
9
|
+
* `mid` without the rowid-desync an external-content+trigger table would hit.
|
|
10
|
+
* `mid` is the `memories.id` (TEXT), UNINDEXED, returned by MATCH for join-back.
|
|
11
|
+
*
|
|
12
|
+
* `trigram` gives Korean substring matching + ASCII case-folding; sub-3-codepoint
|
|
13
|
+
* terms (which trigram cannot match) fall back to LIKE over the source `memories`
|
|
14
|
+
* table. The table lives in the gitignored memory.sqlite and is a pure function
|
|
15
|
+
* of `memories` (rebuilt from data/_memory/*.md) — no new source of truth.
|
|
16
|
+
*/
|
|
17
|
+
export declare const MEMORY_FTS_SCHEMA = "\nCREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(\n mid UNINDEXED,\n name,\n description,\n body,\n tokenize = 'trigram'\n);\n";
|
|
18
|
+
export interface MemoryFtsOptions {
|
|
19
|
+
readonly limit: number;
|
|
20
|
+
/** Optional memory-id allowlist (hard-filter parity with the vector lane). */
|
|
21
|
+
readonly ids?: ReadonlySet<string>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Keyword search over memories. Returns memory ids best-first — the order IS
|
|
25
|
+
* the keyword lane's rank for RRF fusion. bm25 column weights name>description>
|
|
26
|
+
* body. For any sub-3-codepoint query term, a bounded, deterministic LIKE over
|
|
27
|
+
* `memories` is merged in (trigram cannot match <3 codepoints — verified). The
|
|
28
|
+
* `ids` allowlist (when given) is applied in JS; the corpus is small.
|
|
29
|
+
*/
|
|
30
|
+
export declare function searchMemoryFts(db: Database.Database, query: string, options: MemoryFtsOptions): string[];
|
|
31
|
+
/**
|
|
32
|
+
* Backfill memory_fts from `memories` when the FTS table is empty but memories
|
|
33
|
+
* is not — i.e. the memory.sqlite pre-dates this feature. Idempotent and guarded
|
|
34
|
+
* (a no-op once memory_fts has any row); cheap at memory-corpus scale. Run once
|
|
35
|
+
* at store open so the keyword lane goes live with no manual rebuild.
|
|
36
|
+
*/
|
|
37
|
+
export declare function backfillMemoryFts(db: Database.Database): void;
|
|
38
|
+
//# sourceMappingURL=fts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../src/sqlite/fts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,kJAQ7B,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,GACxB,MAAM,EAAE,CAiDV;AAOD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAY7D"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { buildFtsQuery } from "../recall/ftsQuery.js";
|
|
2
|
+
/**
|
|
3
|
+
* Keyword (FTS5) lane over memories — P3 hybrid search.
|
|
4
|
+
*
|
|
5
|
+
* A REGULAR stored-content FTS5 table (NOT contentless — see design §11 R4):
|
|
6
|
+
* it keeps its own copy of name/description/body so an upsert (the `memories`
|
|
7
|
+
* table uses INSERT OR REPLACE, which reassigns the integer rowid on every
|
|
8
|
+
* edit — verified) can be mirrored by a plain DELETE+INSERT on the stored
|
|
9
|
+
* `mid` without the rowid-desync an external-content+trigger table would hit.
|
|
10
|
+
* `mid` is the `memories.id` (TEXT), UNINDEXED, returned by MATCH for join-back.
|
|
11
|
+
*
|
|
12
|
+
* `trigram` gives Korean substring matching + ASCII case-folding; sub-3-codepoint
|
|
13
|
+
* terms (which trigram cannot match) fall back to LIKE over the source `memories`
|
|
14
|
+
* table. The table lives in the gitignored memory.sqlite and is a pure function
|
|
15
|
+
* of `memories` (rebuilt from data/_memory/*.md) — no new source of truth.
|
|
16
|
+
*/
|
|
17
|
+
export const MEMORY_FTS_SCHEMA = `
|
|
18
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(
|
|
19
|
+
mid UNINDEXED,
|
|
20
|
+
name,
|
|
21
|
+
description,
|
|
22
|
+
body,
|
|
23
|
+
tokenize = 'trigram'
|
|
24
|
+
);
|
|
25
|
+
`;
|
|
26
|
+
/**
|
|
27
|
+
* Keyword search over memories. Returns memory ids best-first — the order IS
|
|
28
|
+
* the keyword lane's rank for RRF fusion. bm25 column weights name>description>
|
|
29
|
+
* body. For any sub-3-codepoint query term, a bounded, deterministic LIKE over
|
|
30
|
+
* `memories` is merged in (trigram cannot match <3 codepoints — verified). The
|
|
31
|
+
* `ids` allowlist (when given) is applied in JS; the corpus is small.
|
|
32
|
+
*/
|
|
33
|
+
export function searchMemoryFts(db, query, options) {
|
|
34
|
+
const { match, shortTerms, hasTokens } = buildFtsQuery(query);
|
|
35
|
+
if (!hasTokens)
|
|
36
|
+
return [];
|
|
37
|
+
// The id allowlist is applied IN SQL (not after LIMIT) so a filtered memory
|
|
38
|
+
// ranked just below the unfiltered top `limit` is not dropped (Codex F4). FTS5
|
|
39
|
+
// permits constraining the UNINDEXED `mid` column alongside MATCH.
|
|
40
|
+
const idList = options.ids ? [...options.ids] : null;
|
|
41
|
+
const placeholders = idList ? idList.map(() => "?").join(",") : "";
|
|
42
|
+
const seen = new Set();
|
|
43
|
+
const out = [];
|
|
44
|
+
const take = (mid) => {
|
|
45
|
+
if (seen.has(mid))
|
|
46
|
+
return;
|
|
47
|
+
seen.add(mid);
|
|
48
|
+
out.push(mid);
|
|
49
|
+
};
|
|
50
|
+
if (match) {
|
|
51
|
+
const where = idList ? `memory_fts MATCH ? AND mid IN (${placeholders})` : `memory_fts MATCH ?`;
|
|
52
|
+
const rows = db
|
|
53
|
+
.prepare(`SELECT mid, bm25(memory_fts, 3.0, 2.0, 1.0) AS rank
|
|
54
|
+
FROM memory_fts
|
|
55
|
+
WHERE ${where}
|
|
56
|
+
ORDER BY rank
|
|
57
|
+
LIMIT ?`)
|
|
58
|
+
.all(match, ...(idList ?? []), options.limit);
|
|
59
|
+
for (const r of rows)
|
|
60
|
+
take(r.mid);
|
|
61
|
+
}
|
|
62
|
+
// Sub-3-codepoint terms: LIKE over the source memories table (the trigram
|
|
63
|
+
// index cannot match them). Deterministic ORDER BY before LIMIT (design §14);
|
|
64
|
+
// `updated DESC` puts NULLs last in SQLite, matching "null sorts after real".
|
|
65
|
+
for (const term of shortTerms) {
|
|
66
|
+
const like = `%${escapeLike(term)}%`;
|
|
67
|
+
const idFilter = idList ? ` AND id IN (${placeholders})` : "";
|
|
68
|
+
const rows = db
|
|
69
|
+
.prepare(`SELECT id AS mid FROM memories
|
|
70
|
+
WHERE (name LIKE ? ESCAPE '\\' OR description LIKE ? ESCAPE '\\' OR body LIKE ? ESCAPE '\\')${idFilter}
|
|
71
|
+
ORDER BY updated DESC, id ASC
|
|
72
|
+
LIMIT ?`)
|
|
73
|
+
.all(like, like, like, ...(idList ?? []), options.limit);
|
|
74
|
+
for (const r of rows)
|
|
75
|
+
take(r.mid);
|
|
76
|
+
}
|
|
77
|
+
return out.slice(0, options.limit);
|
|
78
|
+
}
|
|
79
|
+
/** Escape LIKE metacharacters so a literal %, _, or \ in a term is matched verbatim. */
|
|
80
|
+
function escapeLike(s) {
|
|
81
|
+
return s.replace(/[\\%_]/g, (c) => `\\${c}`);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Backfill memory_fts from `memories` when the FTS table is empty but memories
|
|
85
|
+
* is not — i.e. the memory.sqlite pre-dates this feature. Idempotent and guarded
|
|
86
|
+
* (a no-op once memory_fts has any row); cheap at memory-corpus scale. Run once
|
|
87
|
+
* at store open so the keyword lane goes live with no manual rebuild.
|
|
88
|
+
*/
|
|
89
|
+
export function backfillMemoryFts(db) {
|
|
90
|
+
const ftsCount = db.prepare(`SELECT count(*) AS c FROM memory_fts`).get().c;
|
|
91
|
+
if (ftsCount > 0)
|
|
92
|
+
return;
|
|
93
|
+
const memCount = db.prepare(`SELECT count(*) AS c FROM memories`).get().c;
|
|
94
|
+
if (memCount === 0)
|
|
95
|
+
return;
|
|
96
|
+
const tx = db.transaction(() => {
|
|
97
|
+
db.exec(`INSERT INTO memory_fts(mid, name, description, body)
|
|
98
|
+
SELECT id, name, description, body FROM memories`);
|
|
99
|
+
});
|
|
100
|
+
tx();
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=fts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts.js","sourceRoot":"","sources":["../../src/sqlite/fts.ts"],"names":[],"mappings":"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"}
|
package/dist/sqlite/index.d.ts
CHANGED
|
@@ -19,4 +19,6 @@ export { MemorySqliteStore } from "./store.js";
|
|
|
19
19
|
export { rebuildFromMemoryDir, readRowFromFile } from "./rebuild.js";
|
|
20
20
|
export type { RebuildResult } from "./rebuild.js";
|
|
21
21
|
export { driftCheck } from "./drift.js";
|
|
22
|
+
export { MEMORY_FTS_SCHEMA, searchMemoryFts, backfillMemoryFts } from "./fts.js";
|
|
23
|
+
export type { MemoryFtsOptions } from "./fts.js";
|
|
22
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,YAAY,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,YAAY,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/sqlite/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { MemorySqliteStore } from "./store.js";
|
|
2
2
|
export { rebuildFromMemoryDir, readRowFromFile } from "./rebuild.js";
|
|
3
3
|
export { driftCheck } from "./drift.js";
|
|
4
|
+
export { MEMORY_FTS_SCHEMA, searchMemoryFts, backfillMemoryFts } from "./fts.js";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
package/dist/sqlite/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/sqlite/store.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { MemoryFtsOptions } from "./fts.js";
|
|
1
2
|
import type { MemoryQuery, MemoryRow } from "./types.js";
|
|
2
3
|
/**
|
|
3
4
|
* SQLite-backed store mirroring `data/_memory/*.md`. The store is a
|
|
@@ -23,12 +24,18 @@ export declare class MemorySqliteStore {
|
|
|
23
24
|
close(): void;
|
|
24
25
|
/** Upsert a row + its tags. Atomic via SQLite transaction. */
|
|
25
26
|
upsert(row: MemoryRow): void;
|
|
26
|
-
/** Delete a row + its tags (cascade). */
|
|
27
|
+
/** Delete a row + its tags (cascade) + its keyword-lane (memory_fts) row. */
|
|
27
28
|
deleteById(id: string): boolean;
|
|
28
29
|
/** Return all rows. Use sparingly — primarily for rebuild + drift scans. */
|
|
29
30
|
listAll(): readonly MemoryRow[];
|
|
30
31
|
/** Read a single row by id (or null if absent). */
|
|
31
32
|
getById(id: string): MemoryRow | null;
|
|
33
|
+
/**
|
|
34
|
+
* Keyword (FTS5) search over memories — P3 hybrid search. Returns memory ids
|
|
35
|
+
* best-first (the order is the keyword lane's rank for fusion). Thin wrapper
|
|
36
|
+
* so callers never touch the raw db handle.
|
|
37
|
+
*/
|
|
38
|
+
keywordSearch(query: string, options: MemoryFtsOptions): string[];
|
|
32
39
|
byType(type: string): readonly MemoryRow[];
|
|
33
40
|
byTag(tag: string): readonly MemoryRow[];
|
|
34
41
|
byPrivacy(privacy: string): readonly MemoryRow[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/sqlite/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/sqlite/store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,EAAE,MAAM;IAiB1B,KAAK,IAAI,IAAI;IAIb,8DAA8D;IAC9D,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAsC5B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS/B,4EAA4E;IAC5E,OAAO,IAAI,SAAS,SAAS,EAAE;IAO/B,mDAAmD;IACnD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAOrC;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAAE;IAIjE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,SAAS,EAAE;IAI1C,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,SAAS,EAAE;IAIxC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,SAAS,EAAE;IAIhD;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,SAAS,EAAE;IAO1D;;;;OAIG;IACH,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,SAAS,EAAE;IAoC3C,OAAO,CAAC,OAAO;CAkBhB"}
|
package/dist/sqlite/store.js
CHANGED
|
@@ -2,6 +2,7 @@ import { chmodSync, mkdirSync } from "node:fs";
|
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
3
|
import Database from "better-sqlite3";
|
|
4
4
|
import { SCHEMA } from "./schema.js";
|
|
5
|
+
import { MEMORY_FTS_SCHEMA, backfillMemoryFts, searchMemoryFts } from "./fts.js";
|
|
5
6
|
/**
|
|
6
7
|
* SQLite-backed store mirroring `data/_memory/*.md`. The store is a
|
|
7
8
|
* derived index — markdown remains the source of truth (see
|
|
@@ -33,6 +34,10 @@ export class MemorySqliteStore {
|
|
|
33
34
|
this.db.pragma("journal_mode = WAL");
|
|
34
35
|
this.db.pragma("foreign_keys = ON");
|
|
35
36
|
this.db.exec(SCHEMA);
|
|
37
|
+
// Keyword (FTS5) lane for P3 hybrid search. Additive + idempotent; the
|
|
38
|
+
// backfill lights it up on an instance whose memory.sqlite pre-dates it.
|
|
39
|
+
this.db.exec(MEMORY_FTS_SCHEMA);
|
|
40
|
+
backfillMemoryFts(this.db);
|
|
36
41
|
}
|
|
37
42
|
close() {
|
|
38
43
|
this.db.close();
|
|
@@ -41,8 +46,8 @@ export class MemorySqliteStore {
|
|
|
41
46
|
upsert(row) {
|
|
42
47
|
const tx = this.db.transaction(() => {
|
|
43
48
|
this.db
|
|
44
|
-
.prepare(`INSERT OR REPLACE INTO memories
|
|
45
|
-
(id, name, description, type, privacy, created, updated, body, body_hash, frontmatter_json)
|
|
49
|
+
.prepare(`INSERT OR REPLACE INTO memories
|
|
50
|
+
(id, name, description, type, privacy, created, updated, body, body_hash, frontmatter_json)
|
|
46
51
|
VALUES (@id, @name, @description, @type, @privacy, @created, @updated, @body, @bodyHash, @frontmatterJson)`)
|
|
47
52
|
.run({
|
|
48
53
|
id: row.id,
|
|
@@ -62,15 +67,24 @@ export class MemorySqliteStore {
|
|
|
62
67
|
const tagInsert = this.db.prepare(`INSERT INTO memory_tags (memory_id, tag) VALUES (?, ?)`);
|
|
63
68
|
for (const tag of row.tags)
|
|
64
69
|
tagInsert.run(row.id, tag);
|
|
70
|
+
// Keyword (FTS5) lane — keep memory_fts in lockstep within the same tx so
|
|
71
|
+
// it can never drift. memories uses INSERT OR REPLACE (reassigns rowid),
|
|
72
|
+
// so we DELETE+INSERT by the stored `mid`, not an external-content link.
|
|
73
|
+
this.db.prepare(`DELETE FROM memory_fts WHERE mid = ?`).run(row.id);
|
|
74
|
+
this.db
|
|
75
|
+
.prepare(`INSERT INTO memory_fts(mid, name, description, body) VALUES (?, ?, ?, ?)`)
|
|
76
|
+
.run(row.id, row.name, row.description, row.body);
|
|
65
77
|
});
|
|
66
78
|
tx();
|
|
67
79
|
}
|
|
68
|
-
/** Delete a row + its tags (cascade). */
|
|
80
|
+
/** Delete a row + its tags (cascade) + its keyword-lane (memory_fts) row. */
|
|
69
81
|
deleteById(id) {
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
.run(id);
|
|
73
|
-
|
|
82
|
+
const tx = this.db.transaction(() => {
|
|
83
|
+
// memory_fts is a virtual table (no FK cascade), so clear it explicitly.
|
|
84
|
+
this.db.prepare(`DELETE FROM memory_fts WHERE mid = ?`).run(id);
|
|
85
|
+
return this.db.prepare(`DELETE FROM memories WHERE id = ?`).run(id);
|
|
86
|
+
});
|
|
87
|
+
return tx().changes > 0;
|
|
74
88
|
}
|
|
75
89
|
/** Return all rows. Use sparingly — primarily for rebuild + drift scans. */
|
|
76
90
|
listAll() {
|
|
@@ -86,6 +100,14 @@ export class MemorySqliteStore {
|
|
|
86
100
|
.get(id);
|
|
87
101
|
return row ? this.hydrate(row) : null;
|
|
88
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Keyword (FTS5) search over memories — P3 hybrid search. Returns memory ids
|
|
105
|
+
* best-first (the order is the keyword lane's rank for fusion). Thin wrapper
|
|
106
|
+
* so callers never touch the raw db handle.
|
|
107
|
+
*/
|
|
108
|
+
keywordSearch(query, options) {
|
|
109
|
+
return searchMemoryFts(this.db, query, options);
|
|
110
|
+
}
|
|
89
111
|
byType(type) {
|
|
90
112
|
return this.query({ type: [type] });
|
|
91
113
|
}
|
package/dist/sqlite/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/sqlite/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/sqlite/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,17 @@ export interface LocalEmbedderOptions {
|
|
|
48
48
|
readonly query: string;
|
|
49
49
|
readonly passage: string;
|
|
50
50
|
} | null;
|
|
51
|
+
/**
|
|
52
|
+
* Load only from the local model cache — never hit the network. When the
|
|
53
|
+
* model is not yet cached this makes the **first embed fail fast (no
|
|
54
|
+
* download)** instead of blocking on a ~470 MB fetch. Use it for
|
|
55
|
+
* automatic/background paths (e.g. session-start vectorization) so they can
|
|
56
|
+
* never trigger an unprompted download: if the model is absent they error
|
|
57
|
+
* immediately and the caller skips. The explicit, user-consented `/recall`
|
|
58
|
+
* setup uses the default (`false`) and is what brings the model into the
|
|
59
|
+
* cache in the first place.
|
|
60
|
+
*/
|
|
61
|
+
readonly localFilesOnly?: boolean;
|
|
51
62
|
}
|
|
52
63
|
/**
|
|
53
64
|
* Build an {@link EmbedFn} backed by a local transformers pipeline. The
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/vector/embedder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,WAAW,oBAAoB;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/vector/embedder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,WAAW,oBAAoB;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF;;;;;;;;;OASG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAKD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CA+C3E"}
|
package/dist/vector/embedder.js
CHANGED
|
@@ -11,6 +11,7 @@ export function createLocalEmbedder(options) {
|
|
|
11
11
|
const pooling = options?.pooling ?? "mean";
|
|
12
12
|
// undefined → e5 defaults; null → disabled (symmetric models).
|
|
13
13
|
const prefixes = options?.prefixes === undefined ? E5_PREFIXES : options.prefixes;
|
|
14
|
+
const localFilesOnly = options?.localFilesOnly ?? false;
|
|
14
15
|
// Lazily-created, memoized pipeline promise. Typed loosely because the
|
|
15
16
|
// dependency is optional-at-build-time and resolved at runtime.
|
|
16
17
|
let pipePromise = null;
|
|
@@ -32,7 +33,9 @@ export function createLocalEmbedder(options) {
|
|
|
32
33
|
`to avoid the local model entirely. Original error: ${e.message}`);
|
|
33
34
|
}
|
|
34
35
|
const pipeline = mod.pipeline;
|
|
35
|
-
|
|
36
|
+
// `local_files_only` keeps transformers.js from reaching the network: a
|
|
37
|
+
// cache miss throws immediately instead of downloading ~470 MB.
|
|
38
|
+
const extractor = (await pipeline("feature-extraction", model, localFilesOnly ? { local_files_only: true } : undefined));
|
|
36
39
|
return extractor;
|
|
37
40
|
})();
|
|
38
41
|
return pipePromise;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/vector/embedder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/vector/embedder.ts"],"names":[],"mappings":"AA6DA,MAAM,aAAa,GAAG,8BAA8B,CAAC;AACrD,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAW,CAAC;AAExE;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA8B;IAChE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,aAAa,CAAC;IAC9C,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC;IAC3C,+DAA+D;IAC/D,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAClF,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,KAAK,CAAC;IAExD,uEAAuE;IACvE,gEAAgE;IAChE,IAAI,WAAW,GAA0F,IAAI,CAAC;IAE9G,KAAK,UAAU,OAAO;QACpB,IAAI,WAAW;YAAE,OAAO,WAAW,CAAC;QACpC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;YACxB,oEAAoE;YACpE,4DAA4D;YAC5D,MAAM,SAAS,GAAG,2BAA2B,CAAC;YAC9C,IAAI,GAAoF,CAAC;YACzF,IAAI,CAAC;gBACH,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAe,CAAC;YAChD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACb,mEAAmE;oBACjE,4EAA4E;oBAC5E,yEAAyE;oBACzE,sDAAuD,CAAW,CAAC,OAAO,EAAE,CAC/E,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC9B,wEAAwE;YACxE,gEAAgE;YAChE,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAC/B,oBAAoB,EACpB,KAAK,EACL,cAAc,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CACxD,CAA0E,CAAC;YAC5E,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,KAAK,EAAE,IAAY,EAAE,IAAgB,EAAE,EAAE;QAC9C,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/vector/segment.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import type { EmbedFn } from "./types.js";
|
|
|
7
7
|
* running centroid tracks "the current topic so far"; when a new turn's
|
|
8
8
|
* cosine similarity to that centroid drops below `threshold` (and the chunk
|
|
9
9
|
* already has at least `minUnits` turns), a boundary is cut. Min/max guards
|
|
10
|
-
* keep chunks from being a single "
|
|
10
|
+
* keep chunks from being a single "yeah" or growing unbounded.
|
|
11
11
|
*
|
|
12
12
|
* Boundary detection uses the per-turn embeddings (running centroid). The
|
|
13
13
|
* stored chunk vector, however, is a fresh embedding of the chunk's *joined
|
package/dist/vector/store.d.ts
CHANGED
|
@@ -38,14 +38,24 @@ export declare class MemoryVectorStore {
|
|
|
38
38
|
*/
|
|
39
39
|
upsert(row: MemoryRow, embed: EmbedFn): Promise<boolean>;
|
|
40
40
|
/**
|
|
41
|
-
* Rebuild the `memory` source from the sqlite store: embed
|
|
41
|
+
* Rebuild the `memory` source from the sqlite store: embed each memory,
|
|
42
42
|
* upsert it, and prune vectors whose memory no longer exists. Idempotent.
|
|
43
43
|
*
|
|
44
44
|
* `embed` is called once per memory; pass a memoized embedder (the
|
|
45
45
|
* default `createLocalEmbedder()` memoizes its pipeline) so the model
|
|
46
46
|
* loads once.
|
|
47
|
+
*
|
|
48
|
+
* With `{ onlyMissing: true }` a memory that already has a vector is left
|
|
49
|
+
* untouched (not re-embedded) — the incremental mode used by the automatic
|
|
50
|
+
* session-start pass so it embeds only newly-added memories and stays cheap.
|
|
51
|
+
* Pruning of deleted memories still runs. Caveat: a memory *edited* in place
|
|
52
|
+
* keeps its prior vector until a full rebuild (`onlyMissing` omitted, e.g.
|
|
53
|
+
* `npx rebuild-memory-vector`), since presence — not content — is the skip
|
|
54
|
+
* test; its sqlite hard-filter row is always current.
|
|
47
55
|
*/
|
|
48
|
-
rebuild(sqlite: MemorySqliteStore, embed: EmbedFn
|
|
56
|
+
rebuild(sqlite: MemorySqliteStore, embed: EmbedFn, options?: {
|
|
57
|
+
readonly onlyMissing?: boolean;
|
|
58
|
+
}): Promise<VectorRebuildResult>;
|
|
49
59
|
/**
|
|
50
60
|
* Rebuild the `session-archive` source: segment each archived session into
|
|
51
61
|
* topic chunks (embedding-similarity), embed each chunk, store the vector
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/vector/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;gBAErB,OAAO,GAAE,wBAA6B;IAclD,8DAA8D;IAC9D,IAAI,aAAa,IAAI,aAAa,CAEjC;IAED;;;OAGG;IACG,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9D
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/vector/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;gBAErB,OAAO,GAAE,wBAA6B;IAclD,8DAA8D;IAC9D,IAAI,aAAa,IAAI,aAAa,CAEjC;IAED;;;OAGG;IACG,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9D;;;;;;;;;;;;;;;OAeG;IACG,OAAO,CACX,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3C,OAAO,CAAC,mBAAmB,CAAC;IA8B/B;;;;;;OAMG;IACG,eAAe,CACnB,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAchC;;;;;OAKG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;IAKtC,uEAAuE;IACvE,YAAY,CACV,WAAW,EAAE,YAAY,EACzB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,SAAS,eAAe,EAAE;IAI7B,KAAK,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM;IAIpC,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/vector/store.js
CHANGED
|
@@ -49,19 +49,34 @@ export class MemoryVectorStore {
|
|
|
49
49
|
return true;
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
* Rebuild the `memory` source from the sqlite store: embed
|
|
52
|
+
* Rebuild the `memory` source from the sqlite store: embed each memory,
|
|
53
53
|
* upsert it, and prune vectors whose memory no longer exists. Idempotent.
|
|
54
54
|
*
|
|
55
55
|
* `embed` is called once per memory; pass a memoized embedder (the
|
|
56
56
|
* default `createLocalEmbedder()` memoizes its pipeline) so the model
|
|
57
57
|
* loads once.
|
|
58
|
+
*
|
|
59
|
+
* With `{ onlyMissing: true }` a memory that already has a vector is left
|
|
60
|
+
* untouched (not re-embedded) — the incremental mode used by the automatic
|
|
61
|
+
* session-start pass so it embeds only newly-added memories and stays cheap.
|
|
62
|
+
* Pruning of deleted memories still runs. Caveat: a memory *edited* in place
|
|
63
|
+
* keeps its prior vector until a full rebuild (`onlyMissing` omitted, e.g.
|
|
64
|
+
* `npx rebuild-memory-vector`), since presence — not content — is the skip
|
|
65
|
+
* test; its sqlite hard-filter row is always current.
|
|
58
66
|
*/
|
|
59
|
-
async rebuild(sqlite, embed) {
|
|
67
|
+
async rebuild(sqlite, embed, options) {
|
|
68
|
+
const existing = options?.onlyMissing ? new Set(this.backend.listIds("memory")) : null;
|
|
60
69
|
const memories = sqlite.listAll();
|
|
61
70
|
const liveIds = new Set();
|
|
62
71
|
let indexed = 0;
|
|
63
72
|
let skipped = 0;
|
|
64
73
|
for (const m of memories) {
|
|
74
|
+
if (existing?.has(m.id)) {
|
|
75
|
+
// Already vectorized — keep it (so it is not pruned) and skip the embed.
|
|
76
|
+
liveIds.add(m.id);
|
|
77
|
+
skipped++;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
65
80
|
const ok = await this.upsert(m, embed);
|
|
66
81
|
if (ok) {
|
|
67
82
|
liveIds.add(m.id);
|
package/dist/vector/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/vector/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GAGtB,MAAM,cAAc,CAAC;AAqBtB;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,iBAAiB;IACX,OAAO,CAAgB;IACxC,2EAA2E;IAC1D,MAAM,CAAU;IAEjC,YAAY,UAAoC,EAAE;QAChD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAC/B,IAAI,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,OAAQ,OAAO,CAAC,OAAgC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxG,IAAI,CAAC,MAAM,GAAI,OAAO,CAAC,OAA8B,CAAC,MAAM,CAAC;YAC/D,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,GAAc,EAAE,KAAc;QACzC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/vector/store.ts"],"names":[],"mappings":"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"}
|
package/dist/vector/types.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Phase 11c, operator decisions (2026-05-29 afternoon):
|
|
5
5
|
*
|
|
6
6
|
* - **Decision 1 (embedder)** — host-injected `EmbedFn`. A default local
|
|
7
|
-
* embedder (`createLocalEmbedder`, `@huggingface/transformers`
|
|
7
|
+
* embedder (`createLocalEmbedder`, `@huggingface/transformers` multilingual e5-small)
|
|
8
8
|
* ships with this package and loads lazily on first use; operators can
|
|
9
9
|
* swap it for an API embedder by passing their own `EmbedFn`.
|
|
10
10
|
* - **Decision 2 (backend)** — default is in-process brute-force cosine
|
package/dist/vector/types.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Phase 11c, operator decisions (2026-05-29 afternoon):
|
|
5
5
|
*
|
|
6
6
|
* - **Decision 1 (embedder)** — host-injected `EmbedFn`. A default local
|
|
7
|
-
* embedder (`createLocalEmbedder`, `@huggingface/transformers`
|
|
7
|
+
* embedder (`createLocalEmbedder`, `@huggingface/transformers` multilingual e5-small)
|
|
8
8
|
* ships with this package and loads lazily on first use; operators can
|
|
9
9
|
* swap it for an API embedder by passing their own `EmbedFn`.
|
|
10
10
|
* - **Decision 2 (backend)** — default is in-process brute-force cosine
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vortex-os/memory-extended",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"description": "Add-on cluster — extended memory namespaces (sqlite, vector, sessionArchive, recall, consolidate) layered on @vortex-os/base.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "vortex-os-project",
|
|
@@ -64,9 +64,9 @@
|
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"yaml": "^2.6.0"
|
|
66
66
|
},
|
|
67
|
-
"_releaseNote": "@vortex-os/base
|
|
67
|
+
"_releaseNote": "0.5.3: broadened the @vortex-os/base peer to '>=0.3.0 <1.0.0' (any 0.x) so an mx republish is NOT needed on every base minor. The trigger was base 0.6.0 (a minor for new features): mx 0.5.2's range topped out at ^0.5.0 and ERESOLVE-conflicted against base 0.6.0. @vortex-os/base is the only @vortex-os peer; it is published. The proactive-curator surface this add-on used is inlined (src/internal/proactive-curator-helpers.ts), so no separate @vortex-os/proactive-curator dependency is needed. better-sqlite3 / classic-level are native peers.",
|
|
68
68
|
"peerDependencies": {
|
|
69
|
-
"@vortex-os/base": "
|
|
69
|
+
"@vortex-os/base": ">=0.3.0 <1.0.0",
|
|
70
70
|
"better-sqlite3": "^12.0.0",
|
|
71
71
|
"classic-level": "^3.0.0"
|
|
72
72
|
},
|