@bip-krishna/agentmind 0.1.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/.agentmind/memory.db +0 -0
- package/.context-memory/memory.db +0 -0
- package/README.md +176 -0
- package/apps/dashboard/src/server.ts +369 -0
- package/cli/src/index.ts +163 -0
- package/dist/apps/dashboard/src/server.d.ts +6 -0
- package/dist/apps/dashboard/src/server.d.ts.map +1 -0
- package/dist/apps/dashboard/src/server.js +360 -0
- package/dist/apps/dashboard/src/server.js.map +1 -0
- package/dist/cli/src/index.d.ts +3 -0
- package/dist/cli/src/index.d.ts.map +1 -0
- package/dist/cli/src/index.js +162 -0
- package/dist/cli/src/index.js.map +1 -0
- package/dist/examples/advanced.d.ts +2 -0
- package/dist/examples/advanced.d.ts.map +1 -0
- package/dist/examples/advanced.js +41 -0
- package/dist/examples/advanced.js.map +1 -0
- package/dist/examples/basic.d.ts +2 -0
- package/dist/examples/basic.d.ts.map +1 -0
- package/dist/examples/basic.js +22 -0
- package/dist/examples/basic.js.map +1 -0
- package/dist/packages/core/src/consolidation.d.ts +27 -0
- package/dist/packages/core/src/consolidation.d.ts.map +1 -0
- package/dist/packages/core/src/consolidation.js +97 -0
- package/dist/packages/core/src/consolidation.js.map +1 -0
- package/dist/packages/core/src/events.d.ts +18 -0
- package/dist/packages/core/src/events.d.ts.map +1 -0
- package/dist/packages/core/src/events.js +13 -0
- package/dist/packages/core/src/events.js.map +1 -0
- package/dist/packages/core/src/extraction.d.ts +32 -0
- package/dist/packages/core/src/extraction.d.ts.map +1 -0
- package/dist/packages/core/src/extraction.js +65 -0
- package/dist/packages/core/src/extraction.js.map +1 -0
- package/dist/packages/core/src/index.d.ts +10 -0
- package/dist/packages/core/src/index.d.ts.map +1 -0
- package/dist/packages/core/src/index.js +7 -0
- package/dist/packages/core/src/index.js.map +1 -0
- package/dist/packages/core/src/memory-store.d.ts +36 -0
- package/dist/packages/core/src/memory-store.d.ts.map +1 -0
- package/dist/packages/core/src/memory-store.js +2 -0
- package/dist/packages/core/src/memory-store.js.map +1 -0
- package/dist/packages/core/src/memory.d.ts +75 -0
- package/dist/packages/core/src/memory.d.ts.map +1 -0
- package/dist/packages/core/src/memory.js +402 -0
- package/dist/packages/core/src/memory.js.map +1 -0
- package/dist/packages/core/src/policy.d.ts +17 -0
- package/dist/packages/core/src/policy.d.ts.map +1 -0
- package/dist/packages/core/src/policy.js +22 -0
- package/dist/packages/core/src/policy.js.map +1 -0
- package/dist/packages/core/src/types.d.ts +102 -0
- package/dist/packages/core/src/types.d.ts.map +1 -0
- package/dist/packages/core/src/types.js +23 -0
- package/dist/packages/core/src/types.js.map +1 -0
- package/dist/packages/embeddings/src/index.d.ts +4 -0
- package/dist/packages/embeddings/src/index.d.ts.map +1 -0
- package/dist/packages/embeddings/src/index.js +4 -0
- package/dist/packages/embeddings/src/index.js.map +1 -0
- package/dist/packages/embeddings/src/local.d.ts +15 -0
- package/dist/packages/embeddings/src/local.d.ts.map +1 -0
- package/dist/packages/embeddings/src/local.js +45 -0
- package/dist/packages/embeddings/src/local.js.map +1 -0
- package/dist/packages/embeddings/src/openai.d.ts +17 -0
- package/dist/packages/embeddings/src/openai.d.ts.map +1 -0
- package/dist/packages/embeddings/src/openai.js +41 -0
- package/dist/packages/embeddings/src/openai.js.map +1 -0
- package/dist/packages/embeddings/src/provider.d.ts +8 -0
- package/dist/packages/embeddings/src/provider.d.ts.map +1 -0
- package/dist/packages/embeddings/src/provider.js +12 -0
- package/dist/packages/embeddings/src/provider.js.map +1 -0
- package/dist/packages/integrations/src/anthropic.d.ts +15 -0
- package/dist/packages/integrations/src/anthropic.d.ts.map +1 -0
- package/dist/packages/integrations/src/anthropic.js +25 -0
- package/dist/packages/integrations/src/anthropic.js.map +1 -0
- package/dist/packages/integrations/src/index.d.ts +4 -0
- package/dist/packages/integrations/src/index.d.ts.map +1 -0
- package/dist/packages/integrations/src/index.js +4 -0
- package/dist/packages/integrations/src/index.js.map +1 -0
- package/dist/packages/integrations/src/openai.d.ts +27 -0
- package/dist/packages/integrations/src/openai.d.ts.map +1 -0
- package/dist/packages/integrations/src/openai.js +26 -0
- package/dist/packages/integrations/src/openai.js.map +1 -0
- package/dist/packages/integrations/src/vercel.d.ts +24 -0
- package/dist/packages/integrations/src/vercel.d.ts.map +1 -0
- package/dist/packages/integrations/src/vercel.js +20 -0
- package/dist/packages/integrations/src/vercel.js.map +1 -0
- package/dist/packages/retrieval/src/index.d.ts +3 -0
- package/dist/packages/retrieval/src/index.d.ts.map +1 -0
- package/dist/packages/retrieval/src/index.js +3 -0
- package/dist/packages/retrieval/src/index.js.map +1 -0
- package/dist/packages/retrieval/src/ranker.d.ts +21 -0
- package/dist/packages/retrieval/src/ranker.d.ts.map +1 -0
- package/dist/packages/retrieval/src/ranker.js +54 -0
- package/dist/packages/retrieval/src/ranker.js.map +1 -0
- package/dist/packages/retrieval/src/token.d.ts +3 -0
- package/dist/packages/retrieval/src/token.d.ts.map +1 -0
- package/dist/packages/retrieval/src/token.js +7 -0
- package/dist/packages/retrieval/src/token.js.map +1 -0
- package/dist/packages/storage/src/config.d.ts +14 -0
- package/dist/packages/storage/src/config.d.ts.map +1 -0
- package/dist/packages/storage/src/config.js +41 -0
- package/dist/packages/storage/src/config.js.map +1 -0
- package/dist/packages/storage/src/index.d.ts +4 -0
- package/dist/packages/storage/src/index.d.ts.map +1 -0
- package/dist/packages/storage/src/index.js +4 -0
- package/dist/packages/storage/src/index.js.map +1 -0
- package/dist/packages/storage/src/memory-store.d.ts +37 -0
- package/dist/packages/storage/src/memory-store.d.ts.map +1 -0
- package/dist/packages/storage/src/memory-store.js +107 -0
- package/dist/packages/storage/src/memory-store.js.map +1 -0
- package/dist/packages/storage/src/migrations.d.ts +12 -0
- package/dist/packages/storage/src/migrations.d.ts.map +1 -0
- package/dist/packages/storage/src/migrations.js +89 -0
- package/dist/packages/storage/src/migrations.js.map +1 -0
- package/dist/packages/storage/src/postgres-store.d.ts +45 -0
- package/dist/packages/storage/src/postgres-store.d.ts.map +1 -0
- package/dist/packages/storage/src/postgres-store.js +282 -0
- package/dist/packages/storage/src/postgres-store.js.map +1 -0
- package/dist/packages/storage/src/sqlite-store.d.ts +36 -0
- package/dist/packages/storage/src/sqlite-store.d.ts.map +1 -0
- package/dist/packages/storage/src/sqlite-store.js +243 -0
- package/dist/packages/storage/src/sqlite-store.js.map +1 -0
- package/examples/advanced.ts +46 -0
- package/examples/basic.ts +25 -0
- package/package.json +52 -0
- package/packages/core/package.json +13 -0
- package/packages/core/src/consolidation.ts +104 -0
- package/packages/core/src/events.ts +25 -0
- package/packages/core/src/extraction.ts +81 -0
- package/packages/core/src/index.ts +22 -0
- package/packages/core/src/memory-store.ts +50 -0
- package/packages/core/src/memory.ts +447 -0
- package/packages/core/src/policy.ts +36 -0
- package/packages/core/src/types.ts +119 -0
- package/packages/core/tsconfig.json +6 -0
- package/packages/embeddings/package.json +9 -0
- package/packages/embeddings/src/index.ts +3 -0
- package/packages/embeddings/src/local.ts +47 -0
- package/packages/embeddings/src/openai.ts +50 -0
- package/packages/embeddings/src/provider.d.ts.map +1 -0
- package/packages/embeddings/src/provider.js.map +1 -0
- package/packages/embeddings/src/provider.ts +17 -0
- package/packages/embeddings/tsconfig.json +6 -0
- package/packages/integrations/package.json +7 -0
- package/packages/integrations/src/anthropic.ts +34 -0
- package/packages/integrations/src/index.ts +3 -0
- package/packages/integrations/src/openai.ts +52 -0
- package/packages/integrations/src/vercel.ts +26 -0
- package/packages/retrieval/package.json +8 -0
- package/packages/retrieval/src/index.ts +2 -0
- package/packages/retrieval/src/ranker.d.ts.map +1 -0
- package/packages/retrieval/src/ranker.js.map +1 -0
- package/packages/retrieval/src/ranker.ts +77 -0
- package/packages/retrieval/src/token.d.ts.map +1 -0
- package/packages/retrieval/src/token.js.map +1 -0
- package/packages/retrieval/src/token.ts +5 -0
- package/packages/retrieval/tsconfig.json +6 -0
- package/packages/storage/package.json +11 -0
- package/packages/storage/src/config.ts +44 -0
- package/packages/storage/src/index.ts +3 -0
- package/packages/storage/src/memory-store.ts +100 -0
- package/packages/storage/src/migrations.ts +96 -0
- package/packages/storage/src/postgres-store.ts +299 -0
- package/packages/storage/src/sqlite-store.ts +298 -0
- package/packages/storage/tsconfig.json +6 -0
- package/test-mvp.mjs +82 -0
- package/tests/consolidation.test.ts +45 -0
- package/tests/eval.test.ts +102 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { MIGRATIONS } from "./migrations.js";
|
|
2
|
+
export class PostgresMemoryStore {
|
|
3
|
+
pool;
|
|
4
|
+
dimensions;
|
|
5
|
+
ready;
|
|
6
|
+
constructor(opts) {
|
|
7
|
+
const connectionString = typeof opts === "string" ? opts : opts.connectionString;
|
|
8
|
+
this.dimensions = typeof opts === "object" ? (opts.vectorDimensions ?? 1536) : 1536;
|
|
9
|
+
// dynamic import to avoid hard dep if not used
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
11
|
+
const { Pool } = require("pg");
|
|
12
|
+
this.pool = new Pool({ connectionString, max: typeof opts === "object" ? (opts.maxPool ?? 10) : 10 });
|
|
13
|
+
this.ready = this.migrate();
|
|
14
|
+
}
|
|
15
|
+
async migrate() {
|
|
16
|
+
// schema_migrations + core tables
|
|
17
|
+
for (const m of MIGRATIONS) {
|
|
18
|
+
if (m.version === 2) {
|
|
19
|
+
// pgvector extension + vec column
|
|
20
|
+
try {
|
|
21
|
+
await this.pool.query(`CREATE EXTENSION IF NOT EXISTS vector`);
|
|
22
|
+
await this.pool.query(`ALTER TABLE embeddings ADD COLUMN IF NOT EXISTS vec vector(${this.dimensions})`);
|
|
23
|
+
await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_embeddings_vec ON embeddings USING hnsw (vec vector_cosine_ops)`);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// ignore if extension not available
|
|
27
|
+
}
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
// For version 1, run each statement separately for pg
|
|
31
|
+
const stmts = m.up.split(";").map((s) => s.trim()).filter(Boolean);
|
|
32
|
+
for (const stmt of stmts) {
|
|
33
|
+
try {
|
|
34
|
+
await this.pool.query(stmt);
|
|
35
|
+
}
|
|
36
|
+
catch { }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Ensure tables exist with pg-compatible types (TEXT -> VARCHAR etc handled)
|
|
40
|
+
await this.pool.query(`
|
|
41
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
42
|
+
id TEXT PRIMARY KEY,
|
|
43
|
+
name TEXT UNIQUE NOT NULL,
|
|
44
|
+
description TEXT,
|
|
45
|
+
created_at TIMESTAMPTZ NOT NULL,
|
|
46
|
+
updated_at TIMESTAMPTZ NOT NULL
|
|
47
|
+
);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS sources (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
51
|
+
type TEXT NOT NULL,
|
|
52
|
+
content TEXT,
|
|
53
|
+
created_at TIMESTAMPTZ NOT NULL,
|
|
54
|
+
metadata JSONB NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
57
|
+
id TEXT PRIMARY KEY,
|
|
58
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
59
|
+
type TEXT NOT NULL,
|
|
60
|
+
content TEXT NOT NULL,
|
|
61
|
+
importance REAL NOT NULL,
|
|
62
|
+
confidence REAL NOT NULL,
|
|
63
|
+
status TEXT NOT NULL,
|
|
64
|
+
created_at TIMESTAMPTZ NOT NULL,
|
|
65
|
+
updated_at TIMESTAMPTZ NOT NULL,
|
|
66
|
+
last_accessed_at TIMESTAMPTZ,
|
|
67
|
+
access_count INTEGER NOT NULL,
|
|
68
|
+
source_id TEXT REFERENCES sources(id) ON DELETE SET NULL,
|
|
69
|
+
metadata JSONB NOT NULL,
|
|
70
|
+
archived INTEGER NOT NULL DEFAULT 0
|
|
71
|
+
);
|
|
72
|
+
CREATE TABLE IF NOT EXISTS embeddings (
|
|
73
|
+
memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,
|
|
74
|
+
vector TEXT NOT NULL,
|
|
75
|
+
model TEXT NOT NULL,
|
|
76
|
+
dimensions INTEGER NOT NULL,
|
|
77
|
+
vec vector(${this.dimensions})
|
|
78
|
+
);
|
|
79
|
+
CREATE TABLE IF NOT EXISTS retrieval_events (
|
|
80
|
+
id TEXT PRIMARY KEY,
|
|
81
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
82
|
+
query TEXT NOT NULL,
|
|
83
|
+
retrieved_memory_ids JSONB NOT NULL,
|
|
84
|
+
scores JSONB NOT NULL,
|
|
85
|
+
final_context_tokens INTEGER NOT NULL,
|
|
86
|
+
created_at TIMESTAMPTZ NOT NULL
|
|
87
|
+
);
|
|
88
|
+
CREATE TABLE IF NOT EXISTS consolidations (
|
|
89
|
+
id TEXT PRIMARY KEY,
|
|
90
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
91
|
+
summary_memory_id TEXT REFERENCES memories(id) ON DELETE SET NULL,
|
|
92
|
+
source_memory_ids JSONB NOT NULL,
|
|
93
|
+
created_at TIMESTAMPTZ NOT NULL
|
|
94
|
+
);
|
|
95
|
+
`);
|
|
96
|
+
}
|
|
97
|
+
async ensureReady() { await this.ready; }
|
|
98
|
+
// ---- Projects ----
|
|
99
|
+
async createProject(project) {
|
|
100
|
+
await this.ensureReady();
|
|
101
|
+
await this.pool.query(`INSERT INTO projects (id, name, description, created_at, updated_at) VALUES ($1,$2,$3,$4,$5)`, [project.id, project.name, project.description ?? null, project.createdAt, project.updatedAt]);
|
|
102
|
+
return project;
|
|
103
|
+
}
|
|
104
|
+
async getProject(id) {
|
|
105
|
+
await this.ensureReady();
|
|
106
|
+
const { rows } = await this.pool.query(`SELECT * FROM projects WHERE id=$1`, [id]);
|
|
107
|
+
if (!rows[0])
|
|
108
|
+
return null;
|
|
109
|
+
return this.mapProject(rows[0]);
|
|
110
|
+
}
|
|
111
|
+
async getProjectByName(name) {
|
|
112
|
+
await this.ensureReady();
|
|
113
|
+
const { rows } = await this.pool.query(`SELECT * FROM projects WHERE name=$1`, [name]);
|
|
114
|
+
if (!rows[0])
|
|
115
|
+
return null;
|
|
116
|
+
return this.mapProject(rows[0]);
|
|
117
|
+
}
|
|
118
|
+
async listProjects() {
|
|
119
|
+
await this.ensureReady();
|
|
120
|
+
const { rows } = await this.pool.query(`SELECT * FROM projects`);
|
|
121
|
+
return rows.map(this.mapProject);
|
|
122
|
+
}
|
|
123
|
+
async deleteProject(projectId) {
|
|
124
|
+
await this.ensureReady();
|
|
125
|
+
await this.pool.query(`DELETE FROM projects WHERE id=$1`, [projectId]);
|
|
126
|
+
}
|
|
127
|
+
// ---- Sources ----
|
|
128
|
+
async createSource(source) {
|
|
129
|
+
await this.ensureReady();
|
|
130
|
+
await this.pool.query(`INSERT INTO sources (id, project_id, type, content, created_at, metadata) VALUES ($1,$2,$3,$4,$5,$6)`, [source.id, source.projectId, source.type, source.content ?? null, source.createdAt, JSON.stringify(source.metadata)]);
|
|
131
|
+
return source;
|
|
132
|
+
}
|
|
133
|
+
async getSource(id) {
|
|
134
|
+
await this.ensureReady();
|
|
135
|
+
const { rows } = await this.pool.query(`SELECT * FROM sources WHERE id=$1`, [id]);
|
|
136
|
+
if (!rows[0])
|
|
137
|
+
return null;
|
|
138
|
+
const r = rows[0];
|
|
139
|
+
return { id: r.id, projectId: r.project_id, type: r.type, content: r.content ?? undefined, createdAt: new Date(r.created_at), metadata: typeof r.metadata === "string" ? JSON.parse(r.metadata) : r.metadata };
|
|
140
|
+
}
|
|
141
|
+
// ---- Memories ----
|
|
142
|
+
async createMemory(memory) {
|
|
143
|
+
await this.ensureReady();
|
|
144
|
+
await this.pool.query(`INSERT INTO memories (id, project_id, type, content, importance, confidence, status, created_at, updated_at, last_accessed_at, access_count, source_id, metadata, archived) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14)`, [memory.id, memory.projectId, memory.type, memory.content, memory.importance, memory.confidence ?? 1, memory.status ?? "active", memory.createdAt, memory.updatedAt, memory.lastAccessedAt ?? null, memory.accessCount, memory.sourceId ?? null, JSON.stringify(memory.metadata), memory.archived ? 1 : 0]);
|
|
145
|
+
}
|
|
146
|
+
async getMemory(id) {
|
|
147
|
+
await this.ensureReady();
|
|
148
|
+
const { rows } = await this.pool.query(`SELECT * FROM memories WHERE id=$1`, [id]);
|
|
149
|
+
if (!rows[0])
|
|
150
|
+
return null;
|
|
151
|
+
return this.mapMemory(rows[0]);
|
|
152
|
+
}
|
|
153
|
+
async updateMemory(id, update) {
|
|
154
|
+
await this.ensureReady();
|
|
155
|
+
const existing = await this.getMemory(id);
|
|
156
|
+
if (!existing)
|
|
157
|
+
return;
|
|
158
|
+
const merged = { ...existing, ...update, id, updatedAt: update.updatedAt ?? new Date() };
|
|
159
|
+
await this.pool.query(`UPDATE memories SET type=$1, content=$2, importance=$3, confidence=$4, status=$5, created_at=$6, updated_at=$7, last_accessed_at=$8, access_count=$9, source_id=$10, metadata=$11, archived=$12 WHERE id=$13`, [merged.type, merged.content, merged.importance, merged.confidence, merged.status ?? "active", merged.createdAt, merged.updatedAt, merged.lastAccessedAt ?? null, merged.accessCount, merged.sourceId ?? null, JSON.stringify(merged.metadata), merged.archived ? 1 : 0, id]);
|
|
160
|
+
}
|
|
161
|
+
async deleteMemory(id) {
|
|
162
|
+
await this.ensureReady();
|
|
163
|
+
// Deleting embedding automatically via cascade, but also ensure vector cleanup
|
|
164
|
+
await this.pool.query(`DELETE FROM memories WHERE id=$1`, [id]);
|
|
165
|
+
}
|
|
166
|
+
async archiveMemory(id) {
|
|
167
|
+
await this.ensureReady();
|
|
168
|
+
await this.pool.query(`UPDATE memories SET archived=1, status='archived', updated_at=$1 WHERE id=$2`, [new Date(), id]);
|
|
169
|
+
}
|
|
170
|
+
async listMemories(projectId) {
|
|
171
|
+
await this.ensureReady();
|
|
172
|
+
const { rows } = await this.pool.query(`SELECT * FROM memories WHERE project_id=$1 ORDER BY updated_at DESC`, [projectId]);
|
|
173
|
+
return rows.map(this.mapMemory);
|
|
174
|
+
}
|
|
175
|
+
async search(query) {
|
|
176
|
+
await this.ensureReady();
|
|
177
|
+
// Enforce project isolation first
|
|
178
|
+
let sql = `SELECT * FROM memories WHERE project_id=$1`;
|
|
179
|
+
const params = [query.projectId];
|
|
180
|
+
let idx = 2;
|
|
181
|
+
if (query.types?.length) {
|
|
182
|
+
sql += ` AND type IN (${query.types.map(() => `$${idx++}`).join(",")})`;
|
|
183
|
+
params.push(...query.types);
|
|
184
|
+
}
|
|
185
|
+
if (query.minImportance !== undefined) {
|
|
186
|
+
sql += ` AND importance >= $${idx++}`;
|
|
187
|
+
params.push(query.minImportance);
|
|
188
|
+
}
|
|
189
|
+
if (!query.includeArchived)
|
|
190
|
+
sql += ` AND archived=0 AND status != 'archived'`;
|
|
191
|
+
const { rows } = await this.pool.query(sql, params);
|
|
192
|
+
const memories = rows.map(this.mapMemory);
|
|
193
|
+
// Keyword fallback scoring (vector search is done at MemoryEngine level with pgvector via separate query if needed)
|
|
194
|
+
const qLower = query.query.toLowerCase();
|
|
195
|
+
const qTokens = new Set(qLower.split(/\W+/).filter(Boolean));
|
|
196
|
+
const scored = memories.map((m) => {
|
|
197
|
+
const cLower = m.content.toLowerCase();
|
|
198
|
+
const cTokens = cLower.split(/\W+/).filter(Boolean);
|
|
199
|
+
let hits = 0;
|
|
200
|
+
for (const t of cTokens)
|
|
201
|
+
if (qTokens.has(t))
|
|
202
|
+
hits++;
|
|
203
|
+
const phraseBoost = cLower.includes(qLower) ? 0.5 : 0;
|
|
204
|
+
const keywordScore = qTokens.size ? Math.min(1, hits / qTokens.size + phraseBoost) : 0;
|
|
205
|
+
const recency = Math.exp(-(Date.now() - m.updatedAt.getTime()) / (1000 * 60 * 60 * 24 * 30));
|
|
206
|
+
const final = keywordScore * 0.7 + m.importance * 0.15 + recency * 0.15;
|
|
207
|
+
return { memory: m, score: final, semanticScore: 0, keywordScore };
|
|
208
|
+
});
|
|
209
|
+
scored.sort((a, b) => b.score - a.score);
|
|
210
|
+
return scored.slice(0, query.limit ?? 5);
|
|
211
|
+
}
|
|
212
|
+
// ---- Embeddings ----
|
|
213
|
+
async upsertEmbedding(memoryId, vector, model) {
|
|
214
|
+
await this.ensureReady();
|
|
215
|
+
const vecStr = `[${vector.join(",")}]`;
|
|
216
|
+
await this.pool.query(`INSERT INTO embeddings (memory_id, vector, model, dimensions, vec) VALUES ($1,$2,$3,$4,$5::vector) ON CONFLICT (memory_id) DO UPDATE SET vector=EXCLUDED.vector, model=EXCLUDED.model, dimensions=EXCLUDED.dimensions, vec=EXCLUDED.vec`, [memoryId, JSON.stringify(vector), model, vector.length, vecStr]);
|
|
217
|
+
}
|
|
218
|
+
async getEmbedding(memoryId) {
|
|
219
|
+
await this.ensureReady();
|
|
220
|
+
const { rows } = await this.pool.query(`SELECT vector, model FROM embeddings WHERE memory_id=$1`, [memoryId]);
|
|
221
|
+
if (!rows[0])
|
|
222
|
+
return null;
|
|
223
|
+
return { vector: JSON.parse(rows[0].vector), model: rows[0].model };
|
|
224
|
+
}
|
|
225
|
+
/** pgvector semantic search — use when MemoryEngine wants native vector ranking */
|
|
226
|
+
async vectorSearch(projectId, queryVector, limit = 10) {
|
|
227
|
+
await this.ensureReady();
|
|
228
|
+
const vecStr = `[${queryVector.join(",")}]`;
|
|
229
|
+
const { rows } = await this.pool.query(`
|
|
230
|
+
SELECT m.*, e.vec <=> $1::vector as distance
|
|
231
|
+
FROM memories m
|
|
232
|
+
JOIN embeddings e ON e.memory_id = m.id
|
|
233
|
+
WHERE m.project_id = $2 AND m.archived=0 AND m.status != 'archived'
|
|
234
|
+
ORDER BY distance ASC
|
|
235
|
+
LIMIT $3
|
|
236
|
+
`, [vecStr, projectId, limit]);
|
|
237
|
+
return rows.map((r) => ({ memory: this.mapMemory(r), distance: Number(r.distance) }));
|
|
238
|
+
}
|
|
239
|
+
// ---- Retrieval logs ----
|
|
240
|
+
async logRetrieval(event) {
|
|
241
|
+
await this.ensureReady();
|
|
242
|
+
await this.pool.query(`INSERT INTO retrieval_events (id, project_id, query, retrieved_memory_ids, scores, final_context_tokens, created_at) VALUES ($1,$2,$3,$4,$5,$6,$7)`, [event.id, event.projectId, event.query, JSON.stringify(event.retrievedMemoryIds), JSON.stringify(event.scores), event.finalContextTokens, event.createdAt]);
|
|
243
|
+
}
|
|
244
|
+
async listRetrievals(projectId, limit = 20) {
|
|
245
|
+
await this.ensureReady();
|
|
246
|
+
const { rows } = await this.pool.query(`SELECT * FROM retrieval_events WHERE project_id=$1 ORDER BY created_at DESC LIMIT $2`, [projectId, limit]);
|
|
247
|
+
return rows.map((r) => ({
|
|
248
|
+
id: r.id,
|
|
249
|
+
projectId: r.project_id,
|
|
250
|
+
query: r.query,
|
|
251
|
+
retrievedMemoryIds: typeof r.retrieved_memory_ids === "string" ? JSON.parse(r.retrieved_memory_ids) : r.retrieved_memory_ids,
|
|
252
|
+
scores: typeof r.scores === "string" ? JSON.parse(r.scores) : r.scores,
|
|
253
|
+
finalContextTokens: r.final_context_tokens,
|
|
254
|
+
createdAt: new Date(r.created_at),
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
async close() { await this.pool.end(); }
|
|
258
|
+
mapProject = (row) => ({
|
|
259
|
+
id: row.id,
|
|
260
|
+
name: row.name,
|
|
261
|
+
description: row.description ?? undefined,
|
|
262
|
+
createdAt: new Date(row.created_at),
|
|
263
|
+
updatedAt: new Date(row.updated_at),
|
|
264
|
+
});
|
|
265
|
+
mapMemory = (row) => ({
|
|
266
|
+
id: row.id,
|
|
267
|
+
projectId: row.project_id,
|
|
268
|
+
type: row.type,
|
|
269
|
+
content: row.content,
|
|
270
|
+
importance: Number(row.importance),
|
|
271
|
+
confidence: Number(row.confidence),
|
|
272
|
+
status: row.status,
|
|
273
|
+
createdAt: new Date(row.created_at),
|
|
274
|
+
updatedAt: new Date(row.updated_at),
|
|
275
|
+
lastAccessedAt: row.last_accessed_at ? new Date(row.last_accessed_at) : undefined,
|
|
276
|
+
accessCount: Number(row.access_count),
|
|
277
|
+
sourceId: row.source_id ?? undefined,
|
|
278
|
+
metadata: typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata,
|
|
279
|
+
archived: !!row.archived,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=postgres-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-store.js","sourceRoot":"","sources":["../../../../packages/storage/src/postgres-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { MemoryStore } from "../../core/src/memory-store.js";
|
|
2
|
+
import type { Memory, Project, Source, SearchQuery, SearchResult, RetrievalEvent } from "../../core/src/types.js";
|
|
3
|
+
export interface SqliteStoreOptions {
|
|
4
|
+
path?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class SqliteMemoryStore implements MemoryStore {
|
|
7
|
+
private db;
|
|
8
|
+
constructor(opts?: SqliteStoreOptions);
|
|
9
|
+
private migrate;
|
|
10
|
+
createProject(project: Project): Promise<Project>;
|
|
11
|
+
getProject(id: string): Promise<Project | null>;
|
|
12
|
+
getProjectByName(name: string): Promise<Project | null>;
|
|
13
|
+
listProjects(): Promise<Project[]>;
|
|
14
|
+
deleteProject(projectId: string): Promise<void>;
|
|
15
|
+
createSource(source: Source): Promise<Source>;
|
|
16
|
+
getSource(id: string): Promise<Source | null>;
|
|
17
|
+
createMemory(memory: Memory): Promise<void>;
|
|
18
|
+
getMemory(id: string): Promise<Memory | null>;
|
|
19
|
+
updateMemory(id: string, update: Partial<Memory>): Promise<void>;
|
|
20
|
+
deleteMemory(id: string): Promise<void>;
|
|
21
|
+
archiveMemory(id: string): Promise<void>;
|
|
22
|
+
listMemories(projectId: string): Promise<Memory[]>;
|
|
23
|
+
search(query: SearchQuery): Promise<SearchResult[]>;
|
|
24
|
+
upsertEmbedding(memoryId: string, vector: number[], model: string): Promise<void>;
|
|
25
|
+
getEmbedding(memoryId: string): Promise<{
|
|
26
|
+
vector: number[];
|
|
27
|
+
model: string;
|
|
28
|
+
} | null>;
|
|
29
|
+
deleteEmbedding(memoryId: string): Promise<void>;
|
|
30
|
+
logRetrieval(event: RetrievalEvent): Promise<void>;
|
|
31
|
+
listRetrievals(projectId: string, limit?: number): Promise<RetrievalEvent[]>;
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
private mapProject;
|
|
34
|
+
private mapMemory;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=sqlite-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../../../packages/storage/src/sqlite-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAElH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,EAAE,CAAe;gBAEb,IAAI,GAAE,kBAAuB;IAUzC,OAAO,CAAC,OAAO;IA8DT,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAM/C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAMvD,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAKlC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO7C,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAc7C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB3C,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM7C,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBhE,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmCnD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjF,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAMnF,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAaxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,UAAU,CAMf;IAEH,OAAO,CAAC,SAAS,CAed;CACJ"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
export class SqliteMemoryStore {
|
|
5
|
+
db;
|
|
6
|
+
constructor(opts = {}) {
|
|
7
|
+
const dbPath = opts.path ?? ":memory:";
|
|
8
|
+
if (dbPath !== ":memory:") {
|
|
9
|
+
const dir = path.dirname(dbPath);
|
|
10
|
+
if (dir && dir !== "." && dir !== "")
|
|
11
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
this.db = new DatabaseSync(dbPath);
|
|
14
|
+
this.migrate();
|
|
15
|
+
}
|
|
16
|
+
migrate() {
|
|
17
|
+
this.db.exec(`
|
|
18
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
19
|
+
id TEXT PRIMARY KEY,
|
|
20
|
+
name TEXT UNIQUE NOT NULL,
|
|
21
|
+
description TEXT,
|
|
22
|
+
created_at TEXT NOT NULL,
|
|
23
|
+
updated_at TEXT NOT NULL
|
|
24
|
+
);
|
|
25
|
+
CREATE TABLE IF NOT EXISTS sources (
|
|
26
|
+
id TEXT PRIMARY KEY,
|
|
27
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
28
|
+
type TEXT NOT NULL,
|
|
29
|
+
content TEXT,
|
|
30
|
+
created_at TEXT NOT NULL,
|
|
31
|
+
metadata TEXT NOT NULL
|
|
32
|
+
);
|
|
33
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
36
|
+
type TEXT NOT NULL,
|
|
37
|
+
content TEXT NOT NULL,
|
|
38
|
+
importance REAL NOT NULL,
|
|
39
|
+
confidence REAL NOT NULL,
|
|
40
|
+
status TEXT NOT NULL,
|
|
41
|
+
created_at TEXT NOT NULL,
|
|
42
|
+
updated_at TEXT NOT NULL,
|
|
43
|
+
last_accessed_at TEXT,
|
|
44
|
+
access_count INTEGER NOT NULL,
|
|
45
|
+
source_id TEXT REFERENCES sources(id) ON DELETE SET NULL,
|
|
46
|
+
metadata TEXT NOT NULL,
|
|
47
|
+
archived INTEGER NOT NULL DEFAULT 0
|
|
48
|
+
);
|
|
49
|
+
CREATE TABLE IF NOT EXISTS embeddings (
|
|
50
|
+
memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,
|
|
51
|
+
vector TEXT NOT NULL,
|
|
52
|
+
model TEXT NOT NULL,
|
|
53
|
+
dimensions INTEGER NOT NULL
|
|
54
|
+
);
|
|
55
|
+
CREATE TABLE IF NOT EXISTS retrieval_events (
|
|
56
|
+
id TEXT PRIMARY KEY,
|
|
57
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
58
|
+
query TEXT NOT NULL,
|
|
59
|
+
retrieved_memory_ids TEXT NOT NULL,
|
|
60
|
+
scores TEXT NOT NULL,
|
|
61
|
+
final_context_tokens INTEGER NOT NULL,
|
|
62
|
+
created_at TEXT NOT NULL
|
|
63
|
+
);
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project_id);
|
|
65
|
+
CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
|
|
66
|
+
CREATE TABLE IF NOT EXISTS consolidations (
|
|
67
|
+
id TEXT PRIMARY KEY,
|
|
68
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
69
|
+
summary_memory_id TEXT REFERENCES memories(id) ON DELETE SET NULL,
|
|
70
|
+
source_memory_ids TEXT NOT NULL,
|
|
71
|
+
created_at TEXT NOT NULL
|
|
72
|
+
);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_memories_status ON memories(status);
|
|
74
|
+
`);
|
|
75
|
+
}
|
|
76
|
+
// ---- Projects ----
|
|
77
|
+
async createProject(project) {
|
|
78
|
+
this.db.prepare(`INSERT INTO projects (id, name, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?)`).run(project.id, project.name, project.description ?? null, project.createdAt.toISOString(), project.updatedAt.toISOString());
|
|
79
|
+
return project;
|
|
80
|
+
}
|
|
81
|
+
async getProject(id) {
|
|
82
|
+
const row = this.db.prepare(`SELECT * FROM projects WHERE id = ?`).get(id);
|
|
83
|
+
if (!row)
|
|
84
|
+
return null;
|
|
85
|
+
return this.mapProject(row);
|
|
86
|
+
}
|
|
87
|
+
async getProjectByName(name) {
|
|
88
|
+
const row = this.db.prepare(`SELECT * FROM projects WHERE name = ?`).get(name);
|
|
89
|
+
if (!row)
|
|
90
|
+
return null;
|
|
91
|
+
return this.mapProject(row);
|
|
92
|
+
}
|
|
93
|
+
async listProjects() {
|
|
94
|
+
const rows = this.db.prepare(`SELECT * FROM projects`).all();
|
|
95
|
+
return rows.map(this.mapProject);
|
|
96
|
+
}
|
|
97
|
+
async deleteProject(projectId) {
|
|
98
|
+
this.db.prepare(`DELETE FROM projects WHERE id = ?`).run(projectId);
|
|
99
|
+
}
|
|
100
|
+
// ---- Sources ----
|
|
101
|
+
async createSource(source) {
|
|
102
|
+
this.db.prepare(`INSERT INTO sources (id, project_id, type, content, created_at, metadata) VALUES (?, ?, ?, ?, ?, ?)`).run(source.id, source.projectId, source.type, source.content ?? null, source.createdAt.toISOString(), JSON.stringify(source.metadata));
|
|
103
|
+
return source;
|
|
104
|
+
}
|
|
105
|
+
async getSource(id) {
|
|
106
|
+
const row = this.db.prepare(`SELECT * FROM sources WHERE id = ?`).get(id);
|
|
107
|
+
if (!row)
|
|
108
|
+
return null;
|
|
109
|
+
return {
|
|
110
|
+
id: row.id,
|
|
111
|
+
projectId: row.project_id,
|
|
112
|
+
type: row.type,
|
|
113
|
+
content: row.content ?? undefined,
|
|
114
|
+
createdAt: new Date(row.created_at),
|
|
115
|
+
metadata: JSON.parse(row.metadata),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// ---- Memories ----
|
|
119
|
+
async createMemory(memory) {
|
|
120
|
+
this.db.prepare(`
|
|
121
|
+
INSERT INTO memories (id, project_id, type, content, importance, confidence, status, created_at, updated_at, last_accessed_at, access_count, source_id, metadata, archived)
|
|
122
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
123
|
+
`).run(memory.id, memory.projectId, memory.type, memory.content, memory.importance, memory.confidence ?? 1, memory.status ?? "active", memory.createdAt.toISOString(), memory.updatedAt.toISOString(), memory.lastAccessedAt ? memory.lastAccessedAt.toISOString() : null, memory.accessCount, memory.sourceId ?? null, JSON.stringify(memory.metadata), memory.archived ? 1 : 0);
|
|
124
|
+
}
|
|
125
|
+
async getMemory(id) {
|
|
126
|
+
const row = this.db.prepare(`SELECT * FROM memories WHERE id = ?`).get(id);
|
|
127
|
+
if (!row)
|
|
128
|
+
return null;
|
|
129
|
+
return this.mapMemory(row);
|
|
130
|
+
}
|
|
131
|
+
async updateMemory(id, update) {
|
|
132
|
+
const existing = await this.getMemory(id);
|
|
133
|
+
if (!existing)
|
|
134
|
+
return;
|
|
135
|
+
const merged = { ...existing, ...update, id, updatedAt: update.updatedAt ?? new Date() };
|
|
136
|
+
this.db.prepare(`
|
|
137
|
+
UPDATE memories SET type=?, content=?, importance=?, confidence=?, status=?, created_at=?, updated_at=?, last_accessed_at=?, access_count=?, source_id=?, metadata=?, archived=?
|
|
138
|
+
WHERE id=?
|
|
139
|
+
`).run(merged.type, merged.content, merged.importance, merged.confidence, (merged.status ?? "active"), merged.createdAt.toISOString(), merged.updatedAt.toISOString(), merged.lastAccessedAt ? merged.lastAccessedAt.toISOString() : null, merged.accessCount, merged.sourceId ?? null, JSON.stringify(merged.metadata), merged.archived ? 1 : 0, id);
|
|
140
|
+
}
|
|
141
|
+
async deleteMemory(id) {
|
|
142
|
+
this.db.prepare(`DELETE FROM memories WHERE id = ?`).run(id);
|
|
143
|
+
}
|
|
144
|
+
async archiveMemory(id) {
|
|
145
|
+
this.db.prepare(`UPDATE memories SET archived=1, status='archived', updated_at=? WHERE id=?`).run(new Date().toISOString(), id);
|
|
146
|
+
}
|
|
147
|
+
async listMemories(projectId) {
|
|
148
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE project_id = ? ORDER BY updated_at DESC`).all(projectId);
|
|
149
|
+
return rows.map(this.mapMemory);
|
|
150
|
+
}
|
|
151
|
+
async search(query) {
|
|
152
|
+
let sql = `SELECT * FROM memories WHERE project_id = ?`;
|
|
153
|
+
const params = [query.projectId];
|
|
154
|
+
if (query.types && query.types.length) {
|
|
155
|
+
sql += ` AND type IN (${query.types.map(() => "?").join(",")})`;
|
|
156
|
+
params.push(...query.types);
|
|
157
|
+
}
|
|
158
|
+
if (query.minImportance !== undefined) {
|
|
159
|
+
sql += ` AND importance >= ?`;
|
|
160
|
+
params.push(query.minImportance);
|
|
161
|
+
}
|
|
162
|
+
if (!query.includeArchived) {
|
|
163
|
+
sql += ` AND archived = 0 AND status != 'archived'`;
|
|
164
|
+
}
|
|
165
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
166
|
+
const memories = rows.map(this.mapMemory);
|
|
167
|
+
const qLower = query.query.toLowerCase();
|
|
168
|
+
const qTokens = new Set(qLower.split(/\W+/).filter(Boolean));
|
|
169
|
+
const scored = memories.map((m) => {
|
|
170
|
+
const cLower = m.content.toLowerCase();
|
|
171
|
+
const cTokens = cLower.split(/\W+/).filter(Boolean);
|
|
172
|
+
let hits = 0;
|
|
173
|
+
for (const t of cTokens)
|
|
174
|
+
if (qTokens.has(t))
|
|
175
|
+
hits++;
|
|
176
|
+
const phraseBoost = cLower.includes(qLower) ? 0.5 : 0;
|
|
177
|
+
const keywordScore = qTokens.size ? Math.min(1, hits / qTokens.size + phraseBoost) : 0;
|
|
178
|
+
const recency = Math.exp(-(Date.now() - m.updatedAt.getTime()) / (1000 * 60 * 60 * 24 * 30));
|
|
179
|
+
const final = keywordScore * 0.7 + m.importance * 0.15 + recency * 0.15;
|
|
180
|
+
return { memory: m, score: final, semanticScore: 0, keywordScore };
|
|
181
|
+
});
|
|
182
|
+
scored.sort((a, b) => b.score - a.score);
|
|
183
|
+
return scored.slice(0, query.limit ?? 5);
|
|
184
|
+
}
|
|
185
|
+
// ---- Embeddings ----
|
|
186
|
+
async upsertEmbedding(memoryId, vector, model) {
|
|
187
|
+
this.db.prepare(`INSERT INTO embeddings (memory_id, vector, model, dimensions) VALUES (?, ?, ?, ?)
|
|
188
|
+
ON CONFLICT(memory_id) DO UPDATE SET vector=excluded.vector, model=excluded.model, dimensions=excluded.dimensions
|
|
189
|
+
`).run(memoryId, JSON.stringify(vector), model, vector.length);
|
|
190
|
+
}
|
|
191
|
+
async getEmbedding(memoryId) {
|
|
192
|
+
const row = this.db.prepare(`SELECT * FROM embeddings WHERE memory_id = ?`).get(memoryId);
|
|
193
|
+
if (!row)
|
|
194
|
+
return null;
|
|
195
|
+
return { vector: JSON.parse(row.vector), model: row.model };
|
|
196
|
+
}
|
|
197
|
+
async deleteEmbedding(memoryId) {
|
|
198
|
+
this.db.prepare(`DELETE FROM embeddings WHERE memory_id = ?`).run(memoryId);
|
|
199
|
+
}
|
|
200
|
+
// ---- Retrieval logs ----
|
|
201
|
+
async logRetrieval(event) {
|
|
202
|
+
this.db.prepare(`INSERT INTO retrieval_events (id, project_id, query, retrieved_memory_ids, scores, final_context_tokens, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)`).run(event.id, event.projectId, event.query, JSON.stringify(event.retrievedMemoryIds), JSON.stringify(event.scores), event.finalContextTokens, event.createdAt.toISOString());
|
|
203
|
+
}
|
|
204
|
+
async listRetrievals(projectId, limit = 20) {
|
|
205
|
+
const rows = this.db.prepare(`SELECT * FROM retrieval_events WHERE project_id = ? ORDER BY created_at DESC LIMIT ?`).all(projectId, limit);
|
|
206
|
+
return rows.map((r) => ({
|
|
207
|
+
id: r.id,
|
|
208
|
+
projectId: r.project_id,
|
|
209
|
+
query: r.query,
|
|
210
|
+
retrievedMemoryIds: JSON.parse(r.retrieved_memory_ids),
|
|
211
|
+
scores: JSON.parse(r.scores),
|
|
212
|
+
finalContextTokens: r.final_context_tokens,
|
|
213
|
+
createdAt: new Date(r.created_at),
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
async close() {
|
|
217
|
+
this.db.close();
|
|
218
|
+
}
|
|
219
|
+
mapProject = (row) => ({
|
|
220
|
+
id: row.id,
|
|
221
|
+
name: row.name,
|
|
222
|
+
description: row.description ?? undefined,
|
|
223
|
+
createdAt: new Date(row.created_at),
|
|
224
|
+
updatedAt: new Date(row.updated_at),
|
|
225
|
+
});
|
|
226
|
+
mapMemory = (row) => ({
|
|
227
|
+
id: row.id,
|
|
228
|
+
projectId: row.project_id,
|
|
229
|
+
type: row.type,
|
|
230
|
+
content: row.content,
|
|
231
|
+
importance: row.importance,
|
|
232
|
+
confidence: row.confidence,
|
|
233
|
+
status: row.status,
|
|
234
|
+
createdAt: new Date(row.created_at),
|
|
235
|
+
updatedAt: new Date(row.updated_at),
|
|
236
|
+
lastAccessedAt: row.last_accessed_at ? new Date(row.last_accessed_at) : undefined,
|
|
237
|
+
accessCount: row.access_count,
|
|
238
|
+
sourceId: row.source_id ?? undefined,
|
|
239
|
+
metadata: JSON.parse(row.metadata),
|
|
240
|
+
archived: !!row.archived,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=sqlite-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../../../../packages/storage/src/sqlite-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Memory } from "../packages/core/src/memory.js";
|
|
2
|
+
import { InMemoryStore } from "../packages/storage/src/memory-store.js";
|
|
3
|
+
import { LocalEmbeddingProvider } from "../packages/embeddings/src/local.js";
|
|
4
|
+
import { HeuristicExtractor } from "../packages/core/src/extraction.js";
|
|
5
|
+
|
|
6
|
+
// Policy + autoExtract + observability + consolidation demo
|
|
7
|
+
|
|
8
|
+
const store = new InMemoryStore();
|
|
9
|
+
const memory = await Memory.create({
|
|
10
|
+
project: "research-mesh",
|
|
11
|
+
store,
|
|
12
|
+
embeddingProvider: new LocalEmbeddingProvider(),
|
|
13
|
+
extractor: new HeuristicExtractor(),
|
|
14
|
+
policy: {
|
|
15
|
+
autoExtract: true,
|
|
16
|
+
minimumImportance: 0.6,
|
|
17
|
+
maxMemoriesPerProject: 10000,
|
|
18
|
+
storeSensitiveData: false,
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
memory.on("memory.created", (m: any) => console.log("[event] created:", m.content.slice(0, 40)));
|
|
23
|
+
memory.on("retrieval.completed", (e: any) => console.log("[event] retrieval:", e.query, "->", e.retrievedMemoryIds.length));
|
|
24
|
+
|
|
25
|
+
// Ingest conversation — auto-extracts memories
|
|
26
|
+
await memory.ingest({ role: "user", content: "We decided to use PostgreSQL with pgvector. SQLite isn't going to work for production because we need concurrent writes. Let's proceed with that." });
|
|
27
|
+
|
|
28
|
+
const ctx = await memory.context({ query: "What database did we decide to use?", maxTokens: 6000 });
|
|
29
|
+
console.log(ctx.text);
|
|
30
|
+
|
|
31
|
+
// Consolidation
|
|
32
|
+
for (let i = 0; i < 5; i++) await memory.remember({ content: `Payment gateway timeout on API-4821 occurrence ${i}`, importance: 0.6 });
|
|
33
|
+
const consolidated = await memory.consolidate({ threshold: 0.5, minClusterSize: 3 });
|
|
34
|
+
console.log("Consolidated:", consolidated.length);
|
|
35
|
+
|
|
36
|
+
// OpenAI integration example (pseudo)
|
|
37
|
+
/*
|
|
38
|
+
import { withMemory, createOpenAICaller } from "@agentmind/integrations/openai";
|
|
39
|
+
import OpenAI from "openai";
|
|
40
|
+
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
|
|
41
|
+
const { response } = await withMemory({
|
|
42
|
+
memory,
|
|
43
|
+
messages: [{ role: "user", content: "What's our DB?" }],
|
|
44
|
+
callLLM: createOpenAICaller(openai, "gpt-4o"),
|
|
45
|
+
});
|
|
46
|
+
*/
|