@kybernesis/brain-core 0.2.0 → 0.5.0
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/entity-graph.d.ts +11 -13
- package/dist/entity-graph.d.ts.map +1 -1
- package/dist/entity-graph.js +36 -548
- package/dist/entity-graph.js.map +1 -1
- package/dist/fact-store.d.ts +6 -1
- package/dist/fact-store.d.ts.map +1 -1
- package/dist/fact-store.js +17 -157
- package/dist/fact-store.js.map +1 -1
- package/dist/fts-sanitizer.d.ts +7 -28
- package/dist/fts-sanitizer.d.ts.map +1 -1
- package/dist/fts-sanitizer.js +7 -57
- package/dist/fts-sanitizer.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js +10 -34
- package/dist/ops.js.map +1 -1
- package/dist/storage.d.ts +28 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +40 -0
- package/dist/storage.js.map +1 -0
- package/dist/timeline.d.ts +11 -22
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +24 -310
- package/dist/timeline.js.map +1 -1
- package/dist/user-profile.d.ts.map +1 -1
- package/dist/user-profile.js +11 -57
- package/dist/user-profile.js.map +1 -1
- package/dist/vectors.d.ts +8 -10
- package/dist/vectors.d.ts.map +1 -1
- package/dist/vectors.js +22 -72
- package/dist/vectors.js.map +1 -1
- package/package.json +6 -6
package/dist/user-profile.js
CHANGED
|
@@ -6,20 +6,20 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
8
8
|
import { dirname } from 'node:path';
|
|
9
|
-
import { getDb } from '@kybernesis/brain-storage-sqlite';
|
|
10
9
|
import { ensureFactsTable } from './fact-store.js';
|
|
10
|
+
import { getStorage } from './storage.js';
|
|
11
11
|
// ─── Generation ───────────────────────────────────────────────────────────────
|
|
12
12
|
export async function generateUserProfile(t) {
|
|
13
13
|
await ensureFactsTable(t);
|
|
14
|
-
const
|
|
15
|
-
const identity =
|
|
16
|
-
const preferences =
|
|
17
|
-
const relationships =
|
|
18
|
-
const current_plans =
|
|
19
|
-
const recent_events =
|
|
14
|
+
const facts = getStorage().facts;
|
|
15
|
+
const identity = await facts.getFactContentsByCategory(t, 'biographical', 15, 'frecency');
|
|
16
|
+
const preferences = await facts.getFactContentsByCategory(t, 'preference', 10, 'frecency');
|
|
17
|
+
const relationships = await facts.getFactContentsByCategory(t, 'relationship', 10, 'frecency');
|
|
18
|
+
const current_plans = await facts.getFactContentsByCategory(t, 'plan', 5, 'frecency');
|
|
19
|
+
const recent_events = await facts.getFactContentsByCategory(t, 'event', 5, 'recent');
|
|
20
20
|
const totalFacts = identity.length + preferences.length + relationships.length
|
|
21
21
|
+ current_plans.length + recent_events.length;
|
|
22
|
-
const top_entities = queryTopEntities(t);
|
|
22
|
+
const top_entities = await queryTopEntities(t);
|
|
23
23
|
return {
|
|
24
24
|
generated_at: new Date().toISOString(),
|
|
25
25
|
fact_count: totalFacts,
|
|
@@ -27,56 +27,10 @@ export async function generateUserProfile(t) {
|
|
|
27
27
|
top_entities,
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
-
function
|
|
30
|
+
async function queryTopEntities(t) {
|
|
31
31
|
try {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
WHERE category = ?
|
|
35
|
-
AND is_latest = 1
|
|
36
|
-
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
37
|
-
ORDER BY confidence DESC, access_count DESC
|
|
38
|
-
LIMIT ?
|
|
39
|
-
`).all(category, limit);
|
|
40
|
-
return rows.map((r) => r.content);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
// access_count column may not exist yet
|
|
44
|
-
try {
|
|
45
|
-
const rows = db.prepare(`
|
|
46
|
-
SELECT content FROM facts
|
|
47
|
-
WHERE category = ?
|
|
48
|
-
AND is_latest = 1
|
|
49
|
-
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
50
|
-
ORDER BY confidence DESC
|
|
51
|
-
LIMIT ?
|
|
52
|
-
`).all(category, limit);
|
|
53
|
-
return rows.map((r) => r.content);
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
return [];
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function queryRecentFacts(db, category, limit) {
|
|
61
|
-
try {
|
|
62
|
-
const rows = db.prepare(`
|
|
63
|
-
SELECT content FROM facts
|
|
64
|
-
WHERE category = ?
|
|
65
|
-
AND is_latest = 1
|
|
66
|
-
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
67
|
-
ORDER BY timestamp DESC
|
|
68
|
-
LIMIT ?
|
|
69
|
-
`).all(category, limit);
|
|
70
|
-
return rows.map((r) => r.content);
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
return [];
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
function queryTopEntities(t) {
|
|
77
|
-
try {
|
|
78
|
-
const db = getDb(t, 'entityGraph');
|
|
79
|
-
return db.prepare('SELECT name, type, mention_count FROM entities ORDER BY mention_count DESC LIMIT 10').all();
|
|
32
|
+
const entities = await getStorage().entities.getMostMentionedEntities(t, { limit: 10 });
|
|
33
|
+
return entities.map((e) => ({ name: e.name, type: e.type, mention_count: e.mention_count }));
|
|
80
34
|
}
|
|
81
35
|
catch {
|
|
82
36
|
return [];
|
package/dist/user-profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-profile.js","sourceRoot":"","sources":["../src/user-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"user-profile.js","sourceRoot":"","sources":["../src/user-profile.ts"],"names":[],"mappings":"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"}
|
package/dist/vectors.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Vector indexing + semantic search —
|
|
2
|
+
* Vector indexing + semantic search — public API.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* indexChunk is a no-op and semanticSearch returns [].
|
|
4
|
+
* Embeddings are injected via setEmbeddingProvider (same pattern as
|
|
5
|
+
* setLLMProvider — see ADR-0009): the library has no default backend, the app
|
|
6
|
+
* wires one at startup. When no provider is set, indexChunk is a no-op and
|
|
7
|
+
* semanticSearch returns [].
|
|
9
8
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Persistence now lives behind the storage seam (getStorage().vectors); this
|
|
10
|
+
* module owns the embedding orchestration and maps store rows to SearchResult.
|
|
11
|
+
* The vector backend (sqlite-vec today, libsql native in Stage 3) is swappable.
|
|
12
12
|
*/
|
|
13
13
|
import type { TenantContext } from '@kybernesis/brain-contracts';
|
|
14
14
|
import { EMBEDDING_DIM } from '@kybernesis/brain-contracts';
|
|
@@ -52,6 +52,4 @@ export declare function vectorStats(t: TenantContext): Promise<{
|
|
|
52
52
|
count: number;
|
|
53
53
|
available: boolean;
|
|
54
54
|
}>;
|
|
55
|
-
/** Reset the cached storage module — for tests where we need a clean state. */
|
|
56
|
-
export declare function _resetVecStorageCache(): void;
|
|
57
55
|
//# sourceMappingURL=vectors.d.ts.map
|
package/dist/vectors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectors.d.ts","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAA2C,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"vectors.d.ts","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAA2C,MAAM,6BAA6B,CAAC;AAGrG,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;CAC/C;AAID,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAmB;AACnF,wBAAgB,sBAAsB,IAAI,IAAI,CAAsB;AACpE,wBAAgB,kBAAkB,IAAI,OAAO,CAA+B;AAI5E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,UAAU,CAC9B,CAAC,EAAE,aAAa,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAyB3B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,wBAAsB,cAAc,CAClC,CAAC,EAAE,aAAa,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3C,OAAO,CAAC,YAAY,EAAE,CAAC,CA2BzB;AAED,wBAAsB,WAAW,CAC/B,CAAC,EAAE,aAAa,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAMhD"}
|
package/dist/vectors.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Vector indexing + semantic search —
|
|
2
|
+
* Vector indexing + semantic search — public API.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* indexChunk is a no-op and semanticSearch returns [].
|
|
4
|
+
* Embeddings are injected via setEmbeddingProvider (same pattern as
|
|
5
|
+
* setLLMProvider — see ADR-0009): the library has no default backend, the app
|
|
6
|
+
* wires one at startup. When no provider is set, indexChunk is a no-op and
|
|
7
|
+
* semanticSearch returns [].
|
|
9
8
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Persistence now lives behind the storage seam (getStorage().vectors); this
|
|
10
|
+
* module owns the embedding orchestration and maps store rows to SearchResult.
|
|
11
|
+
* The vector backend (sqlite-vec today, libsql native in Stage 3) is swappable.
|
|
12
12
|
*/
|
|
13
13
|
import { EMBEDDING_DIM, EMBEDDING_INPUT_CAP as CONTENT_CHAR_CAP } from '@kybernesis/brain-contracts';
|
|
14
|
+
import { getStorage } from './storage.js';
|
|
14
15
|
export { EMBEDDING_DIM };
|
|
15
16
|
let _embedder = null;
|
|
16
17
|
export function setEmbeddingProvider(p) { _embedder = p; }
|
|
@@ -19,21 +20,11 @@ export function embeddingAvailable() { return _embedder !== null; }
|
|
|
19
20
|
export async function indexChunk(t, content, meta) {
|
|
20
21
|
if (!_embedder)
|
|
21
22
|
return { indexed: false, reason: 'no embedding provider' };
|
|
22
|
-
const
|
|
23
|
-
if (!
|
|
24
|
-
return { indexed: false, reason: 'brain-storage-vec unavailable' };
|
|
25
|
-
}
|
|
26
|
-
let db;
|
|
27
|
-
try {
|
|
28
|
-
db = vec.getVectorDb(t);
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
console.warn('[brain-core/vectors] failed to open vector db', { err: String(err) });
|
|
23
|
+
const vectors = getStorage().vectors;
|
|
24
|
+
if (!(await vectors.available(t)))
|
|
32
25
|
return { indexed: false, reason: 'vector db unavailable' };
|
|
33
|
-
}
|
|
34
26
|
if (meta.origin_id) {
|
|
35
|
-
|
|
36
|
-
if (existing)
|
|
27
|
+
if (await vectors.hasOrigin(t, meta.origin_id))
|
|
37
28
|
return { indexed: false, reason: 'already indexed' };
|
|
38
29
|
}
|
|
39
30
|
const capped = content.slice(0, CONTENT_CHAR_CAP);
|
|
@@ -43,43 +34,28 @@ export async function indexChunk(t, content, meta) {
|
|
|
43
34
|
if (embedding.length !== EMBEDDING_DIM) {
|
|
44
35
|
return { indexed: false, reason: `expected ${EMBEDDING_DIM}-dim vector, got ${embedding.length}` };
|
|
45
36
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
37
|
+
await vectors.insertChunk(t, {
|
|
38
|
+
embedding,
|
|
39
|
+
ts: meta.ts,
|
|
40
|
+
source: meta.source,
|
|
41
|
+
content: capped,
|
|
42
|
+
origin_id: meta.origin_id,
|
|
51
43
|
});
|
|
52
|
-
tx();
|
|
53
44
|
return { indexed: true };
|
|
54
45
|
}
|
|
55
46
|
export async function semanticSearch(t, query, opts = {}) {
|
|
56
47
|
const limit = opts.limit ?? 10;
|
|
57
48
|
if (!_embedder)
|
|
58
49
|
return [];
|
|
59
|
-
const
|
|
60
|
-
if (!
|
|
61
|
-
return [];
|
|
62
|
-
let db;
|
|
63
|
-
try {
|
|
64
|
-
db = vec.getVectorDb(t);
|
|
65
|
-
}
|
|
66
|
-
catch (err) {
|
|
67
|
-
console.warn('[brain-core/vectors] failed to open vector db', { err: String(err) });
|
|
50
|
+
const vectors = getStorage().vectors;
|
|
51
|
+
if (!(await vectors.available(t)))
|
|
68
52
|
return [];
|
|
69
|
-
}
|
|
70
53
|
const embedding = await _embedder.embed(query.slice(0, CONTENT_CHAR_CAP));
|
|
71
54
|
if (!embedding || embedding.length !== EMBEDDING_DIM)
|
|
72
55
|
return [];
|
|
73
56
|
let rows;
|
|
74
57
|
try {
|
|
75
|
-
rows =
|
|
76
|
-
SELECT m.ts, m.source, m.content, m.origin_id,
|
|
77
|
-
vec_distance_l2(c.embedding, ?) AS distance
|
|
78
|
-
FROM chunks c
|
|
79
|
-
JOIN chunk_meta m ON c.rowid = m.rowid
|
|
80
|
-
ORDER BY distance ASC
|
|
81
|
-
LIMIT ?
|
|
82
|
-
`).all(vec.toFloat32Buffer(embedding), limit);
|
|
58
|
+
rows = await vectors.search(t, embedding, limit);
|
|
83
59
|
}
|
|
84
60
|
catch (err) {
|
|
85
61
|
console.warn('[brain-core/vectors] query failed', { err: String(err) });
|
|
@@ -96,37 +72,11 @@ export async function semanticSearch(t, query, opts = {}) {
|
|
|
96
72
|
}));
|
|
97
73
|
}
|
|
98
74
|
export async function vectorStats(t) {
|
|
99
|
-
const vec = await loadVecStorage();
|
|
100
|
-
if (!vec.getVectorDb)
|
|
101
|
-
return { count: 0, available: false };
|
|
102
75
|
try {
|
|
103
|
-
|
|
104
|
-
const row = db.prepare('SELECT COUNT(*) AS c FROM chunk_meta').get();
|
|
105
|
-
return { count: row.c, available: true };
|
|
76
|
+
return await getStorage().vectors.stats(t);
|
|
106
77
|
}
|
|
107
78
|
catch {
|
|
108
79
|
return { count: 0, available: false };
|
|
109
80
|
}
|
|
110
81
|
}
|
|
111
|
-
let _vecStorage = null;
|
|
112
|
-
let _vecStorageAttempted = false;
|
|
113
|
-
async function loadVecStorage() {
|
|
114
|
-
if (_vecStorageAttempted)
|
|
115
|
-
return _vecStorage ?? {};
|
|
116
|
-
_vecStorageAttempted = true;
|
|
117
|
-
try {
|
|
118
|
-
const mod = await import('@kybernesis/brain-storage-vec');
|
|
119
|
-
_vecStorage = { getVectorDb: mod.getVectorDb, toFloat32Buffer: mod.toFloat32Buffer };
|
|
120
|
-
return _vecStorage;
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
_vecStorage = {};
|
|
124
|
-
return _vecStorage;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/** Reset the cached storage module — for tests where we need a clean state. */
|
|
128
|
-
export function _resetVecStorageCache() {
|
|
129
|
-
_vecStorage = null;
|
|
130
|
-
_vecStorageAttempted = false;
|
|
131
|
-
}
|
|
132
82
|
//# sourceMappingURL=vectors.js.map
|
package/dist/vectors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectors.js","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,aAAa,EAAE,mBAAmB,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"vectors.js","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kybernesis/brain-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Kernel brain methods — timeline, entity-graph, facts, vectors, retrieval, sleep",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "David Cruwys (AppyDave)",
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
"README.md"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@kybernesis/brain-contracts": "0.
|
|
31
|
-
"@kybernesis/brain-storage-sqlite": "0.
|
|
30
|
+
"@kybernesis/brain-contracts": "0.5.0",
|
|
31
|
+
"@kybernesis/brain-storage-sqlite": "0.5.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@kybernesis/brain-storage-vec": "0.
|
|
34
|
+
"@kybernesis/brain-storage-vec": "0.5.0"
|
|
35
35
|
},
|
|
36
36
|
"peerDependenciesMeta": {
|
|
37
37
|
"@kybernesis/brain-storage-vec": {
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
}
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@kybernesis/brain-storage-vec": "0.
|
|
43
|
-
"@kybernesis/brain-testkit": "0.
|
|
42
|
+
"@kybernesis/brain-storage-vec": "0.5.0",
|
|
43
|
+
"@kybernesis/brain-testkit": "0.5.0"
|
|
44
44
|
},
|
|
45
45
|
"publishConfig": {
|
|
46
46
|
"access": "public"
|