persisted-memory 1.0.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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +281 -0
  3. package/dist/cli/generate-summary.d.ts +1 -0
  4. package/dist/cli/generate-summary.js +13 -0
  5. package/dist/cli/generate-summary.js.map +1 -0
  6. package/dist/cli/viewer.d.ts +1 -0
  7. package/dist/cli/viewer.js +4 -0
  8. package/dist/cli/viewer.js.map +1 -0
  9. package/dist/embeddings/ollama.d.ts +3 -0
  10. package/dist/embeddings/ollama.js +63 -0
  11. package/dist/embeddings/ollama.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +25 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/search/hybrid.d.ts +8 -0
  16. package/dist/search/hybrid.js +54 -0
  17. package/dist/search/hybrid.js.map +1 -0
  18. package/dist/server.d.ts +2 -0
  19. package/dist/server.js +399 -0
  20. package/dist/server.js.map +1 -0
  21. package/dist/storage/knowledge-graph.d.ts +32 -0
  22. package/dist/storage/knowledge-graph.js +259 -0
  23. package/dist/storage/knowledge-graph.js.map +1 -0
  24. package/dist/storage/lance-store.d.ts +21 -0
  25. package/dist/storage/lance-store.js +288 -0
  26. package/dist/storage/lance-store.js.map +1 -0
  27. package/dist/storage/markdown-store.d.ts +7 -0
  28. package/dist/storage/markdown-store.js +63 -0
  29. package/dist/storage/markdown-store.js.map +1 -0
  30. package/dist/storage/types.d.ts +19 -0
  31. package/dist/storage/types.js +13 -0
  32. package/dist/storage/types.js.map +1 -0
  33. package/dist/utils/chunking.d.ts +1 -0
  34. package/dist/utils/chunking.js +55 -0
  35. package/dist/utils/chunking.js.map +1 -0
  36. package/dist/utils/privacy.d.ts +13 -0
  37. package/dist/utils/privacy.js +23 -0
  38. package/dist/utils/privacy.js.map +1 -0
  39. package/dist/utils/project.d.ts +3 -0
  40. package/dist/utils/project.js +11 -0
  41. package/dist/utils/project.js.map +1 -0
  42. package/dist/utils/summarize.d.ts +12 -0
  43. package/dist/utils/summarize.js +123 -0
  44. package/dist/utils/summarize.js.map +1 -0
  45. package/dist/viewer/index.html +328 -0
  46. package/dist/viewer/server.d.ts +1 -0
  47. package/dist/viewer/server.js +203 -0
  48. package/dist/viewer/server.js.map +1 -0
  49. package/hooks/on-post-tool.sh +17 -0
  50. package/hooks/on-pre-compact.sh +20 -0
  51. package/hooks/on-session-end.sh +46 -0
  52. package/hooks/on-session-start.sh +14 -0
  53. package/hooks/on-stop.sh +6 -0
  54. package/package.json +60 -0
  55. package/scripts/install.sh +125 -0
  56. package/scripts/uninstall.sh +59 -0
@@ -0,0 +1,259 @@
1
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ // --- Known technology patterns ---
4
+ const KNOWN_TECHNOLOGIES = [
5
+ "react", "vue", "angular", "svelte", "next.js", "nextjs", "nuxt",
6
+ "node.js", "nodejs", "deno", "bun",
7
+ "typescript", "javascript", "python", "go", "golang", "rust", "java", "kotlin", "swift",
8
+ "docker", "kubernetes", "k8s",
9
+ "postgresql", "postgres", "mysql", "mongodb", "redis", "sqlite", "dynamodb", "cassandra",
10
+ "aws", "gcp", "azure",
11
+ "graphql", "rest", "grpc",
12
+ "webpack", "vite", "esbuild", "rollup", "turbopack",
13
+ "jest", "vitest", "mocha", "pytest", "junit",
14
+ "git", "github", "gitlab", "bitbucket",
15
+ "nginx", "apache", "caddy",
16
+ "terraform", "ansible", "pulumi",
17
+ "kafka", "rabbitmq", "nats",
18
+ "elasticsearch", "opensearch",
19
+ "tailwind", "css", "sass", "less",
20
+ "express", "fastify", "koa", "hono",
21
+ "django", "flask", "fastapi",
22
+ "spring", "spring boot",
23
+ "gin", "echo", "fiber",
24
+ "prisma", "drizzle", "typeorm", "sequelize", "knex",
25
+ "lancedb", "pinecone", "weaviate", "chromadb",
26
+ "openai", "anthropic", "claude", "gpt",
27
+ "linux", "macos", "windows",
28
+ "zod", "joi", "yup",
29
+ "oauth", "jwt", "oauth2",
30
+ "s3", "ec2", "lambda", "cloudflare",
31
+ "vercel", "netlify", "heroku", "fly.io",
32
+ "mcp",
33
+ ];
34
+ const GRAPH_FILENAME = "knowledge-graph.json";
35
+ // --- Persistence ---
36
+ export function loadGraph(memoryDir) {
37
+ const filePath = join(memoryDir, GRAPH_FILENAME);
38
+ try {
39
+ if (!existsSync(filePath)) {
40
+ return { entities: {}, relations: [] };
41
+ }
42
+ const raw = readFileSync(filePath, "utf-8");
43
+ const parsed = JSON.parse(raw);
44
+ // Validate basic structure
45
+ if (!parsed.entities || !Array.isArray(parsed.relations)) {
46
+ return { entities: {}, relations: [] };
47
+ }
48
+ return parsed;
49
+ }
50
+ catch {
51
+ return { entities: {}, relations: [] };
52
+ }
53
+ }
54
+ export function saveGraph(memoryDir, graph) {
55
+ const filePath = join(memoryDir, GRAPH_FILENAME);
56
+ writeFileSync(filePath, JSON.stringify(graph, null, 2));
57
+ }
58
+ // --- Relation deduplication index ---
59
+ function relationKey(from, to, type, memoryId) {
60
+ return `${from}|${to}|${type}|${memoryId}`;
61
+ }
62
+ const relationIndexCache = new WeakMap();
63
+ function getRelationIndex(graph) {
64
+ let index = relationIndexCache.get(graph);
65
+ if (!index) {
66
+ index = new Set(graph.relations.map((r) => relationKey(r.from, r.to, r.type, r.memory_id)));
67
+ relationIndexCache.set(graph, index);
68
+ }
69
+ return index;
70
+ }
71
+ // --- Graph mutations ---
72
+ export function addEntity(graph, name, type, memoryId) {
73
+ const normalized = name.toLowerCase().trim();
74
+ if (!normalized)
75
+ return;
76
+ const now = Date.now();
77
+ const existing = graph.entities[normalized];
78
+ if (existing) {
79
+ // Update existing entity
80
+ if (!existing.memory_ids.includes(memoryId)) {
81
+ existing.memory_ids.push(memoryId);
82
+ }
83
+ existing.last_seen = now;
84
+ }
85
+ else {
86
+ // Create new entity
87
+ graph.entities[normalized] = {
88
+ name: normalized,
89
+ type,
90
+ memory_ids: [memoryId],
91
+ first_seen: now,
92
+ last_seen: now,
93
+ };
94
+ }
95
+ }
96
+ export function addRelation(graph, from, to, type, memoryId) {
97
+ const normalizedFrom = from.toLowerCase().trim();
98
+ const normalizedTo = to.toLowerCase().trim();
99
+ if (!normalizedFrom || !normalizedTo || normalizedFrom === normalizedTo)
100
+ return;
101
+ // Deduplicate using indexed lookup (O(1) instead of O(n))
102
+ const index = getRelationIndex(graph);
103
+ const key = relationKey(normalizedFrom, normalizedTo, type, memoryId);
104
+ if (index.has(key))
105
+ return;
106
+ index.add(key);
107
+ graph.relations.push({
108
+ from: normalizedFrom,
109
+ to: normalizedTo,
110
+ type,
111
+ memory_id: memoryId,
112
+ timestamp: Date.now(),
113
+ });
114
+ }
115
+ // --- Query ---
116
+ export function findRelated(graph, entityName) {
117
+ const normalized = entityName.toLowerCase().trim();
118
+ // Find all relations involving this entity
119
+ const matchingRelations = graph.relations.filter((r) => r.from === normalized || r.to === normalized);
120
+ // Collect connected entity names
121
+ const connectedNames = new Set();
122
+ for (const rel of matchingRelations) {
123
+ if (rel.from === normalized) {
124
+ connectedNames.add(rel.to);
125
+ }
126
+ else {
127
+ connectedNames.add(rel.from);
128
+ }
129
+ }
130
+ // Include the queried entity itself if it exists
131
+ const entity = graph.entities[normalized];
132
+ if (entity) {
133
+ connectedNames.add(normalized);
134
+ }
135
+ // Gather entity objects
136
+ const entities = [];
137
+ for (const name of connectedNames) {
138
+ const ent = graph.entities[name];
139
+ if (ent) {
140
+ entities.push(ent);
141
+ }
142
+ }
143
+ return { entities, relations: matchingRelations };
144
+ }
145
+ // --- Extraction ---
146
+ const FILE_PATH_REGEX = /(?:^|\s)((?:\/|\.\/|\.\.\/|[a-zA-Z0-9_-]+\/)[^\s,;:!?'")\]]+\.[a-zA-Z0-9]+)/g;
147
+ const CAPITALIZED_PHRASE_REGEX = /\b([A-Z][a-z]+(?:\s+[A-Z][a-z]+){1,2})\b/g;
148
+ const STOP_WORDS = new Set([
149
+ "the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
150
+ "have", "has", "had", "do", "does", "did", "will", "would", "could",
151
+ "should", "may", "might", "shall", "can", "need", "must",
152
+ "for", "and", "nor", "but", "or", "yet", "so",
153
+ "in", "on", "at", "to", "by", "up", "of", "with", "from", "into",
154
+ "this", "that", "these", "those", "it", "its",
155
+ "not", "no", "very", "just", "about", "also",
156
+ ]);
157
+ function buildTechPattern() {
158
+ // Sort by length descending so longer patterns match first
159
+ const sorted = [...KNOWN_TECHNOLOGIES].sort((a, b) => b.length - a.length);
160
+ const escaped = sorted.map((t) => t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
161
+ return new RegExp(`\\b(${escaped.join("|")})\\b`, "gi");
162
+ }
163
+ const TECH_REGEX = buildTechPattern();
164
+ export function extractEntities(text, tags, filePaths) {
165
+ const seen = new Set();
166
+ const results = [];
167
+ function add(name, type) {
168
+ const normalized = name.toLowerCase().trim();
169
+ if (!normalized || seen.has(normalized))
170
+ return;
171
+ seen.add(normalized);
172
+ results.push({ name: normalized, type });
173
+ }
174
+ // 1. Explicit file paths from params
175
+ if (filePaths) {
176
+ for (const fp of filePaths) {
177
+ if (fp.trim()) {
178
+ add(fp.trim(), "file");
179
+ }
180
+ }
181
+ }
182
+ // 2. File paths extracted from text
183
+ TECH_REGEX.lastIndex = 0;
184
+ FILE_PATH_REGEX.lastIndex = 0;
185
+ let match;
186
+ match = FILE_PATH_REGEX.exec(text);
187
+ while (match !== null) {
188
+ add(match[1], "file");
189
+ match = FILE_PATH_REGEX.exec(text);
190
+ }
191
+ // 3. Tags as concepts
192
+ if (tags) {
193
+ for (const tag of tags) {
194
+ if (tag.trim()) {
195
+ add(tag.trim(), "concept");
196
+ }
197
+ }
198
+ }
199
+ // 4. Known technology patterns
200
+ TECH_REGEX.lastIndex = 0;
201
+ match = TECH_REGEX.exec(text);
202
+ while (match !== null) {
203
+ add(match[1], "technology");
204
+ match = TECH_REGEX.exec(text);
205
+ }
206
+ // 5. Capitalized multi-word phrases (2-3 words) as concepts
207
+ CAPITALIZED_PHRASE_REGEX.lastIndex = 0;
208
+ match = CAPITALIZED_PHRASE_REGEX.exec(text);
209
+ while (match !== null) {
210
+ let phrase = match[1];
211
+ // Strip leading stop words (e.g., "The Service Worker" -> "Service Worker")
212
+ const words = phrase.split(/\s+/);
213
+ while (words.length > 1 && STOP_WORDS.has(words[0].toLowerCase())) {
214
+ words.shift();
215
+ }
216
+ phrase = words.join(" ");
217
+ // Only keep phrases that still have 2+ words after stripping
218
+ if (words.length >= 2) {
219
+ const normalized = phrase.toLowerCase().trim();
220
+ if (!seen.has(normalized)) {
221
+ add(phrase, "concept");
222
+ }
223
+ }
224
+ match = CAPITALIZED_PHRASE_REGEX.exec(text);
225
+ }
226
+ return results;
227
+ }
228
+ // --- Convenience: update graph from a memory entry ---
229
+ export function updateGraphFromMemory(graph, memoryId, text, tags, filePaths) {
230
+ const extracted = extractEntities(text, tags, filePaths);
231
+ // Add all extracted entities
232
+ for (const ent of extracted) {
233
+ addEntity(graph, ent.name, ent.type, memoryId);
234
+ }
235
+ // Create "relates_to" relations between entities from the same memory
236
+ // Cap to prevent O(n^2) explosion with many entities
237
+ const MAX_PAIRWISE_ENTITIES = 10;
238
+ const toRelate = extracted.length > MAX_PAIRWISE_ENTITIES ? extracted.slice(0, MAX_PAIRWISE_ENTITIES) : extracted;
239
+ for (let i = 0; i < toRelate.length; i++) {
240
+ for (let j = i + 1; j < toRelate.length; j++) {
241
+ addRelation(graph, toRelate[i].name, toRelate[j].name, "relates_to", memoryId);
242
+ }
243
+ }
244
+ }
245
+ // --- Removal: prune stale entities/relations when a memory is deleted ---
246
+ export function removeMemoryFromGraph(graph, memoryId) {
247
+ // Remove relations referencing the deleted memory
248
+ graph.relations = graph.relations.filter((r) => r.memory_id !== memoryId);
249
+ // Clean up entity memory_ids and remove orphaned entities
250
+ for (const [key, entity] of Object.entries(graph.entities)) {
251
+ entity.memory_ids = entity.memory_ids.filter((id) => id !== memoryId);
252
+ if (entity.memory_ids.length === 0) {
253
+ delete graph.entities[key];
254
+ }
255
+ }
256
+ // Invalidate relation index cache
257
+ relationIndexCache.delete(graph);
258
+ }
259
+ //# sourceMappingURL=knowledge-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph.js","sourceRoot":"","sources":["../../src/storage/knowledge-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { MemoryEntry, MemoryType, Importance } from "./types.js";
2
+ export declare function init(memoryDir: string): Promise<void>;
3
+ export declare function store(entry: MemoryEntry, vector: number[]): Promise<void>;
4
+ export declare function vectorSearch(queryVector: number[], limit?: number, filters?: {
5
+ type?: MemoryType;
6
+ importance?: Importance;
7
+ }): Promise<Array<MemoryEntry & {
8
+ score: number;
9
+ }>>;
10
+ export declare function fullTextSearch(query: string, limit?: number): Promise<Array<MemoryEntry & {
11
+ score: number;
12
+ }>>;
13
+ export declare function deleteEntry(id: string): Promise<void>;
14
+ export declare function list(limit?: number, offset?: number, type?: MemoryType): Promise<MemoryEntry[]>;
15
+ export declare function count(): Promise<number>;
16
+ export declare function countByType(): Promise<Record<string, number>>;
17
+ export declare function consolidate(embedFn: (text: string) => Promise<number[] | null>): Promise<{
18
+ merged: number;
19
+ removed: number;
20
+ }>;
21
+ export declare function rebuild(entries: MemoryEntry[], embedFn: (text: string) => Promise<number[] | null>): Promise<number>;
@@ -0,0 +1,288 @@
1
+ import * as lancedb from "@lancedb/lancedb";
2
+ import { VECTOR_DIM, MEMORY_TABLE } from "./types.js";
3
+ import { mkdirSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ function escapeLanceValue(val) {
6
+ return val.replace(/'/g, "''");
7
+ }
8
+ let db = null;
9
+ let table = null;
10
+ let currentDir = null;
11
+ function zeroVector() {
12
+ return new Array(VECTOR_DIM).fill(0);
13
+ }
14
+ export async function init(memoryDir) {
15
+ const lanceDir = join(memoryDir, ".lance");
16
+ if (currentDir === lanceDir && db && table)
17
+ return;
18
+ mkdirSync(lanceDir, { recursive: true });
19
+ db = await lancedb.connect(lanceDir);
20
+ const tables = await db.tableNames();
21
+ if (tables.includes(MEMORY_TABLE)) {
22
+ table = await db.openTable(MEMORY_TABLE);
23
+ }
24
+ else {
25
+ // Create table with a seed row, then delete it
26
+ const seedRow = {
27
+ id: "__seed__",
28
+ text: "",
29
+ type: "context",
30
+ importance: "low",
31
+ timestamp: 0,
32
+ session_id: "",
33
+ file_paths: "[]",
34
+ tags: "[]",
35
+ vector: zeroVector(),
36
+ };
37
+ table = await db.createTable(MEMORY_TABLE, [seedRow]);
38
+ await table.delete("id = '__seed__'");
39
+ // Create FTS index on text column
40
+ try {
41
+ await table.createIndex("text", {
42
+ config: lancedb.Index.fts(),
43
+ });
44
+ }
45
+ catch {
46
+ // FTS index creation may fail on empty table; will retry on first search
47
+ }
48
+ }
49
+ currentDir = lanceDir;
50
+ }
51
+ export async function store(entry, vector) {
52
+ if (!table)
53
+ throw new Error("LanceDB not initialized");
54
+ const row = {
55
+ id: entry.id,
56
+ text: entry.text,
57
+ type: entry.type,
58
+ importance: entry.importance,
59
+ timestamp: entry.timestamp,
60
+ session_id: entry.session_id || "",
61
+ file_paths: JSON.stringify(entry.file_paths || []),
62
+ tags: JSON.stringify(entry.tags || []),
63
+ vector: vector.length === VECTOR_DIM ? vector : zeroVector(),
64
+ };
65
+ await table.add([row]);
66
+ }
67
+ export async function vectorSearch(queryVector, limit = 10, filters) {
68
+ if (!table)
69
+ throw new Error("LanceDB not initialized");
70
+ let query = table
71
+ .vectorSearch(queryVector)
72
+ .distanceType("cosine")
73
+ .limit(limit);
74
+ if (filters?.type) {
75
+ query = query.where(`type = '${escapeLanceValue(filters.type)}'`);
76
+ }
77
+ if (filters?.importance) {
78
+ query = query.where(`importance = '${escapeLanceValue(filters.importance)}'`);
79
+ }
80
+ const results = await query.toArray();
81
+ return results.map(rowToEntry);
82
+ }
83
+ export async function fullTextSearch(query, limit = 10) {
84
+ if (!table)
85
+ throw new Error("LanceDB not initialized");
86
+ try {
87
+ // Try FTS search
88
+ const results = await table
89
+ .search(query, "fts")
90
+ .limit(limit)
91
+ .toArray();
92
+ return results.map((row, idx) => ({
93
+ ...parseRow(row),
94
+ score: 1 / (1 + idx), // rank-based scoring
95
+ }));
96
+ }
97
+ catch {
98
+ // FTS index might not exist; try to create it
99
+ try {
100
+ await table.createIndex("text", {
101
+ config: lancedb.Index.fts(),
102
+ });
103
+ const results = await table
104
+ .search(query, "fts")
105
+ .limit(limit)
106
+ .toArray();
107
+ return results.map((row, idx) => ({
108
+ ...parseRow(row),
109
+ score: 1 / (1 + idx),
110
+ }));
111
+ }
112
+ catch {
113
+ // Fall back to empty results
114
+ return [];
115
+ }
116
+ }
117
+ }
118
+ export async function deleteEntry(id) {
119
+ if (!table)
120
+ throw new Error("LanceDB not initialized");
121
+ await table.delete(`id = '${escapeLanceValue(id)}'`);
122
+ }
123
+ export async function list(limit = 50, offset = 0, type) {
124
+ if (!table)
125
+ throw new Error("LanceDB not initialized");
126
+ let query = table.query();
127
+ if (type) {
128
+ query = query.where(`type = '${escapeLanceValue(type)}'`);
129
+ }
130
+ const results = await query.limit(limit + offset).toArray();
131
+ // Manual offset since LanceDB doesn't have native offset
132
+ return results
133
+ .map((row) => parseRow(row))
134
+ .sort((a, b) => b.timestamp - a.timestamp)
135
+ .slice(offset, offset + limit);
136
+ }
137
+ export async function count() {
138
+ if (!table)
139
+ throw new Error("LanceDB not initialized");
140
+ return table.countRows();
141
+ }
142
+ export async function countByType() {
143
+ if (!table)
144
+ throw new Error("LanceDB not initialized");
145
+ const allRows = await table.query().select(["type"]).toArray();
146
+ const counts = {};
147
+ for (const row of allRows) {
148
+ const t = String(row.type);
149
+ counts[t] = (counts[t] || 0) + 1;
150
+ }
151
+ return counts;
152
+ }
153
+ const MAX_CONSOLIDATION_ENTRIES = 1000;
154
+ export async function consolidate(embedFn) {
155
+ if (!table)
156
+ throw new Error("LanceDB not initialized");
157
+ const allRows = await table.query().limit(MAX_CONSOLIDATION_ENTRIES).toArray();
158
+ if (allRows.length < 2)
159
+ return { merged: 0, removed: 0 };
160
+ const importanceRank = {
161
+ low: 0,
162
+ medium: 1,
163
+ high: 2,
164
+ critical: 3,
165
+ };
166
+ const toRemove = new Set();
167
+ let merged = 0;
168
+ // Compare all pairs for high similarity
169
+ for (let i = 0; i < allRows.length; i++) {
170
+ if (toRemove.has(String(allRows[i].id)))
171
+ continue;
172
+ const vecA = allRows[i].vector;
173
+ if (!vecA || vecA.length === 0)
174
+ continue;
175
+ for (let j = i + 1; j < allRows.length; j++) {
176
+ if (toRemove.has(String(allRows[j].id)))
177
+ continue;
178
+ const vecB = allRows[j].vector;
179
+ if (!vecB || vecB.length === 0)
180
+ continue;
181
+ const sim = cosineSimilarity(vecA, vecB);
182
+ if (sim > 0.95) {
183
+ // Keep the one with higher importance, or newer timestamp
184
+ const impA = importanceRank[String(allRows[i].importance)] ?? 0;
185
+ const impB = importanceRank[String(allRows[j].importance)] ?? 0;
186
+ const keepI = impA > impB ||
187
+ (impA === impB && Number(allRows[i].timestamp) >= Number(allRows[j].timestamp));
188
+ const removeId = keepI ? String(allRows[j].id) : String(allRows[i].id);
189
+ toRemove.add(removeId);
190
+ merged++;
191
+ }
192
+ }
193
+ }
194
+ for (const id of toRemove) {
195
+ await table.delete(`id = '${escapeLanceValue(id)}'`);
196
+ }
197
+ return { merged, removed: toRemove.size };
198
+ }
199
+ export async function rebuild(entries, embedFn) {
200
+ if (!db)
201
+ throw new Error("LanceDB not initialized");
202
+ // Drop existing table
203
+ try {
204
+ await db.dropTable(MEMORY_TABLE);
205
+ }
206
+ catch {
207
+ // Table might not exist
208
+ }
209
+ if (entries.length === 0) {
210
+ table = null;
211
+ return 0;
212
+ }
213
+ const rows = [];
214
+ for (const entry of entries) {
215
+ const vec = await embedFn(entry.text);
216
+ rows.push({
217
+ id: entry.id,
218
+ text: entry.text,
219
+ type: entry.type,
220
+ importance: entry.importance,
221
+ timestamp: entry.timestamp,
222
+ session_id: entry.session_id || "",
223
+ file_paths: JSON.stringify(entry.file_paths || []),
224
+ tags: JSON.stringify(entry.tags || []),
225
+ vector: vec || zeroVector(),
226
+ });
227
+ }
228
+ table = await db.createTable(MEMORY_TABLE, rows);
229
+ try {
230
+ await table.createIndex("text", {
231
+ config: lancedb.Index.fts(),
232
+ });
233
+ }
234
+ catch {
235
+ // Ignore FTS index errors
236
+ }
237
+ return rows.length;
238
+ }
239
+ // --- Helpers ---
240
+ function parseRow(row) {
241
+ return {
242
+ id: String(row.id),
243
+ text: String(row.text),
244
+ type: String(row.type),
245
+ importance: String(row.importance),
246
+ timestamp: Number(row.timestamp),
247
+ session_id: row.session_id ? String(row.session_id) : undefined,
248
+ file_paths: safeParseArray(row.file_paths),
249
+ tags: safeParseArray(row.tags),
250
+ };
251
+ }
252
+ function rowToEntry(row) {
253
+ const distance = Number(row._distance ?? 0);
254
+ // LanceDB cosine distance is in [0, 2]; convert to similarity in [0, 1]
255
+ const score = Math.max(0, 1 - distance / 2);
256
+ return {
257
+ ...parseRow(row),
258
+ score,
259
+ };
260
+ }
261
+ function safeParseArray(val) {
262
+ if (!val)
263
+ return undefined;
264
+ if (Array.isArray(val))
265
+ return val.map(String);
266
+ try {
267
+ const parsed = JSON.parse(String(val));
268
+ return Array.isArray(parsed) ? parsed : undefined;
269
+ }
270
+ catch {
271
+ return undefined;
272
+ }
273
+ }
274
+ function cosineSimilarity(a, b) {
275
+ if (a.length !== b.length)
276
+ return 0;
277
+ let dot = 0;
278
+ let normA = 0;
279
+ let normB = 0;
280
+ for (let i = 0; i < a.length; i++) {
281
+ dot += a[i] * b[i];
282
+ normA += a[i] * a[i];
283
+ normB += b[i] * b[i];
284
+ }
285
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
286
+ return denom === 0 ? 0 : dot / denom;
287
+ }
288
+ //# sourceMappingURL=lance-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lance-store.js","sourceRoot":"","sources":["../../src/storage/lance-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function ensureDirs(memoryDir: string): void;
2
+ export declare function appendDaily(memoryDir: string, content: string): void;
3
+ export declare function appendDecision(memoryDir: string, decision: string): void;
4
+ export declare function writeSession(memoryDir: string, sessionId: string, content: string): void;
5
+ export declare function writeSummary(memoryDir: string, content: string): void;
6
+ export declare function readSummary(memoryDir: string): string | null;
7
+ export declare function readAllDecisions(memoryDir: string): string[];