@dot-ai/ext-sqlite-memory 0.9.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/LICENSE +21 -0
- package/dist/extension.d.ts +3 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +102 -0
- package/dist/extension.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/index.spec.d.ts +2 -0
- package/dist/index.spec.d.ts.map +1 -0
- package/dist/index.spec.js +108 -0
- package/dist/index.spec.js.map +1 -0
- package/dist/migrate-files.d.ts +3 -0
- package/dist/migrate-files.d.ts.map +1 -0
- package/dist/migrate-files.js +177 -0
- package/dist/migrate-files.js.map +1 -0
- package/dist/sqlite-memory.d.ts +15 -0
- package/dist/sqlite-memory.d.ts.map +1 -0
- package/dist/sqlite-memory.js +184 -0
- package/dist/sqlite-memory.js.map +1 -0
- package/package.json +35 -0
- package/src/__tests__/lifecycle.test.ts +209 -0
- package/src/__tests__/sqlite-memory.test.ts +99 -0
- package/src/extension.ts +102 -0
- package/src/index.spec.ts +138 -0
- package/src/index.ts +2 -0
- package/src/migrate-files.ts +193 -0
- package/src/sqlite-memory.ts +242 -0
- package/tsconfig.json +17 -0
- package/tsconfig.tsbuildinfo +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jonathan Gelin
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,MAAM,CAAC,OAAO,WAAU,GAAG,EAAE,YAAY,QAkGxC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { SqliteMemoryProvider } from './sqlite-memory.js';
|
|
2
|
+
export default function (api) {
|
|
3
|
+
const provider = new SqliteMemoryProvider({ ...api.config, root: api.workspaceRoot });
|
|
4
|
+
api.on('session_end', async () => {
|
|
5
|
+
try {
|
|
6
|
+
await provider.consolidate?.();
|
|
7
|
+
}
|
|
8
|
+
catch { /* ignore */ }
|
|
9
|
+
try {
|
|
10
|
+
provider.close();
|
|
11
|
+
}
|
|
12
|
+
catch { /* ignore */ }
|
|
13
|
+
});
|
|
14
|
+
api.on('context_enrich', async (event) => {
|
|
15
|
+
const labelNames = event.labels.map(l => l.name);
|
|
16
|
+
const memories = await provider.search(event.prompt, labelNames);
|
|
17
|
+
if (memories.length === 0)
|
|
18
|
+
return;
|
|
19
|
+
const lines = memories.slice(0, 10).map(m => {
|
|
20
|
+
const date = m.date ? ` (${m.date})` : '';
|
|
21
|
+
return `- ${m.content}${date}`;
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
sections: [{
|
|
25
|
+
id: 'memory:recall',
|
|
26
|
+
title: 'Relevant Memory',
|
|
27
|
+
content: `> ${provider.describe()}\n\n${lines.join('\n')}`,
|
|
28
|
+
priority: 80,
|
|
29
|
+
source: 'ext-sqlite-memory',
|
|
30
|
+
trimStrategy: 'truncate',
|
|
31
|
+
}],
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
api.on('agent_end', async (event) => {
|
|
35
|
+
const response = event.response;
|
|
36
|
+
if (!response || response.length < 100)
|
|
37
|
+
return;
|
|
38
|
+
if (response.includes('NO_REPLY') || response.includes('HEARTBEAT_OK'))
|
|
39
|
+
return;
|
|
40
|
+
const CONVERSATIONAL_PREFIXES = ['OK', 'Done', "Here's", "I've", 'Sure', 'No problem', 'Voilà', "C'est fait"];
|
|
41
|
+
const trimmed = response.trimStart();
|
|
42
|
+
if (CONVERSATIONAL_PREFIXES.some(prefix => trimmed.startsWith(prefix)))
|
|
43
|
+
return;
|
|
44
|
+
const MAX_LEARN_LENGTH = 500;
|
|
45
|
+
const truncated = response.length > MAX_LEARN_LENGTH
|
|
46
|
+
? response.slice(0, MAX_LEARN_LENGTH) + '…'
|
|
47
|
+
: response;
|
|
48
|
+
try {
|
|
49
|
+
await provider.store({
|
|
50
|
+
content: truncated,
|
|
51
|
+
type: 'log',
|
|
52
|
+
date: new Date().toISOString().slice(0, 10),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch { /* ignore store errors */ }
|
|
56
|
+
});
|
|
57
|
+
api.registerTool({
|
|
58
|
+
name: 'memory_recall',
|
|
59
|
+
description: `Search stored memories. ${provider.describe()}`,
|
|
60
|
+
parameters: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
properties: {
|
|
63
|
+
query: { type: 'string', description: 'Search query to find relevant memories.' },
|
|
64
|
+
limit: { type: 'number', description: 'Maximum results. Defaults to 10.' },
|
|
65
|
+
},
|
|
66
|
+
required: ['query'],
|
|
67
|
+
},
|
|
68
|
+
async execute(input) {
|
|
69
|
+
const query = input['query'];
|
|
70
|
+
if (typeof query !== 'string')
|
|
71
|
+
return { content: 'Error: "query" must be a string.', isError: true };
|
|
72
|
+
const limit = typeof input['limit'] === 'number' ? input['limit'] : 10;
|
|
73
|
+
const entries = await provider.search(query);
|
|
74
|
+
const results = entries.slice(0, limit);
|
|
75
|
+
if (results.length === 0)
|
|
76
|
+
return { content: 'No memories found.' };
|
|
77
|
+
const lines = results.map((e, i) => `${i + 1}. [${e.type}] ${e.content}${e.date ? ` (${e.date})` : ''}`);
|
|
78
|
+
return { content: lines.join('\n'), details: { count: results.length } };
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
api.registerTool({
|
|
82
|
+
name: 'memory_store',
|
|
83
|
+
description: 'Store a new entry in memory for future recall.',
|
|
84
|
+
parameters: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {
|
|
87
|
+
text: { type: 'string', description: 'Content to store.' },
|
|
88
|
+
type: { type: 'string', description: 'Memory type: fact, decision, lesson, log, pattern. Defaults to log.' },
|
|
89
|
+
},
|
|
90
|
+
required: ['text'],
|
|
91
|
+
},
|
|
92
|
+
async execute(input) {
|
|
93
|
+
const text = input['text'];
|
|
94
|
+
if (typeof text !== 'string')
|
|
95
|
+
return { content: 'Error: "text" must be a string.', isError: true };
|
|
96
|
+
const type = typeof input['type'] === 'string' ? input['type'] : 'log';
|
|
97
|
+
await provider.store({ content: text, type, date: new Date().toISOString().slice(0, 10) });
|
|
98
|
+
return { content: `Memory stored (type: ${type}).` };
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,qCAAqC;AACrC,qFAAqF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.spec.d.ts","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { SqliteMemoryProvider } from './sqlite-memory.js';
|
|
3
|
+
describe('SqliteMemoryProvider.describe()', () => {
|
|
4
|
+
let provider;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
provider = new SqliteMemoryProvider({ path: ':memory:' });
|
|
7
|
+
});
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
provider.close();
|
|
10
|
+
});
|
|
11
|
+
it('returns a string containing "SQLite"', () => {
|
|
12
|
+
const result = provider.describe();
|
|
13
|
+
expect(typeof result).toBe('string');
|
|
14
|
+
expect(result).toContain('SQLite');
|
|
15
|
+
});
|
|
16
|
+
it('returns a string containing "FTS5"', () => {
|
|
17
|
+
const result = provider.describe();
|
|
18
|
+
expect(result).toContain('FTS5');
|
|
19
|
+
});
|
|
20
|
+
it('shows "0 entries" for an empty database', () => {
|
|
21
|
+
const result = provider.describe();
|
|
22
|
+
expect(result).toContain('0 entries');
|
|
23
|
+
});
|
|
24
|
+
it('shows correct entry count after storing 3 entries', async () => {
|
|
25
|
+
await provider.store({ content: 'First memory entry about auth', type: 'log' });
|
|
26
|
+
await provider.store({ content: 'Second memory entry about routing', type: 'log' });
|
|
27
|
+
await provider.store({ content: 'Third memory entry about testing', type: 'log' });
|
|
28
|
+
const result = provider.describe();
|
|
29
|
+
expect(result).toContain('3 entries');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('SqliteMemoryProvider.search() — source field', () => {
|
|
33
|
+
let provider;
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
provider = new SqliteMemoryProvider({ path: ':memory:' });
|
|
36
|
+
});
|
|
37
|
+
afterEach(() => {
|
|
38
|
+
provider.close();
|
|
39
|
+
});
|
|
40
|
+
it('returns entries with source "sqlite-memory"', async () => {
|
|
41
|
+
await provider.store({ content: 'The authentication middleware was refactored', type: 'log' });
|
|
42
|
+
const results = await provider.search('authentication');
|
|
43
|
+
expect(results.length).toBeGreaterThan(0);
|
|
44
|
+
for (const entry of results) {
|
|
45
|
+
expect(entry.source).toBe('sqlite-memory');
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('SqliteMemoryProvider store/search roundtrip', () => {
|
|
50
|
+
let provider;
|
|
51
|
+
beforeEach(() => {
|
|
52
|
+
provider = new SqliteMemoryProvider({ path: ':memory:' });
|
|
53
|
+
});
|
|
54
|
+
afterEach(() => {
|
|
55
|
+
provider.close();
|
|
56
|
+
});
|
|
57
|
+
it('stores an entry and retrieves it via search', async () => {
|
|
58
|
+
await provider.store({
|
|
59
|
+
content: 'Fixed the N+1 query in the task loader',
|
|
60
|
+
type: 'log',
|
|
61
|
+
date: '2026-03-04',
|
|
62
|
+
});
|
|
63
|
+
const results = await provider.search('task loader');
|
|
64
|
+
expect(results).toHaveLength(1);
|
|
65
|
+
expect(results[0].content).toContain('task loader');
|
|
66
|
+
expect(results[0].source).toBe('sqlite-memory');
|
|
67
|
+
expect(results[0].date).toBe('2026-03-04');
|
|
68
|
+
});
|
|
69
|
+
it('stores multiple entries and retrieves them all', async () => {
|
|
70
|
+
await provider.store({ content: 'Auth middleware fix applied', type: 'log' });
|
|
71
|
+
await provider.store({ content: 'Auth token expiry extended to 7 days', type: 'decision' });
|
|
72
|
+
await provider.store({ content: 'Database migration ran without issues', type: 'log' });
|
|
73
|
+
const results = await provider.search('auth');
|
|
74
|
+
expect(results.length).toBeGreaterThanOrEqual(2);
|
|
75
|
+
const contents = results.map(r => r.content);
|
|
76
|
+
expect(contents.some(c => c.includes('middleware fix'))).toBe(true);
|
|
77
|
+
expect(contents.some(c => c.includes('token expiry'))).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it('FTS5 search matches partial words', async () => {
|
|
80
|
+
await provider.store({ content: 'Authentication system redesigned', type: 'log' });
|
|
81
|
+
// FTS5 prefix search with trailing *
|
|
82
|
+
// The provider uses OR semantics — the word "authen" won't match without *
|
|
83
|
+
// But a full word "authentication" in the query should match
|
|
84
|
+
const results = await provider.search('authentication');
|
|
85
|
+
expect(results).toHaveLength(1);
|
|
86
|
+
expect(results[0].content).toContain('Authentication');
|
|
87
|
+
});
|
|
88
|
+
it('does not return unrelated entries', async () => {
|
|
89
|
+
await provider.store({ content: 'React component lifecycle overview', type: 'fact' });
|
|
90
|
+
await provider.store({ content: 'Vue router configuration patterns', type: 'fact' });
|
|
91
|
+
await provider.store({ content: 'Database indexing strategy', type: 'fact' });
|
|
92
|
+
const results = await provider.search('authentication bearer token');
|
|
93
|
+
expect(results).toHaveLength(0);
|
|
94
|
+
});
|
|
95
|
+
it('stores with labels and retrieves by label', async () => {
|
|
96
|
+
await provider.store({
|
|
97
|
+
content: 'Added input validation to all endpoints',
|
|
98
|
+
type: 'decision',
|
|
99
|
+
date: '2026-03-01',
|
|
100
|
+
labels: ['security', 'api'],
|
|
101
|
+
});
|
|
102
|
+
const results = await provider.search('unrelated query', ['security']);
|
|
103
|
+
expect(results).toHaveLength(1);
|
|
104
|
+
expect(results[0].labels).toContain('security');
|
|
105
|
+
expect(results[0].date).toBe('2026-03-01');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=index.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-files.d.ts","sourceRoot":"","sources":["../src/migrate-files.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Migrate file-based memory to SQLite.
|
|
4
|
+
* Usage: npx tsx migrate-files.ts --root /path/to/workspace --db /path/to/memory.db
|
|
5
|
+
*/
|
|
6
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { SqliteMemoryProvider } from './sqlite-memory.js';
|
|
9
|
+
// Parse a single memory markdown file into entries
|
|
10
|
+
function parseMemoryFile(content, filename, node) {
|
|
11
|
+
// Extract date from filename if it matches YYYY-MM-DD pattern
|
|
12
|
+
const dateMatch = filename.match(/^(\d{4}-\d{2}-\d{2})/);
|
|
13
|
+
const date = dateMatch ? dateMatch[1] : undefined;
|
|
14
|
+
// Split by ## headings into sections
|
|
15
|
+
const sections = content.split(/^## /m).filter(Boolean);
|
|
16
|
+
if (sections.length <= 1) {
|
|
17
|
+
// Single entry — whole file is one memory
|
|
18
|
+
return [{
|
|
19
|
+
content: content.trim().slice(0, 2000),
|
|
20
|
+
type: inferType(filename),
|
|
21
|
+
date,
|
|
22
|
+
labels: inferLabels(filename, content),
|
|
23
|
+
node,
|
|
24
|
+
}];
|
|
25
|
+
}
|
|
26
|
+
// Multiple sections — each ## heading becomes an entry
|
|
27
|
+
return sections.map(section => {
|
|
28
|
+
const lines = section.split('\n');
|
|
29
|
+
const heading = lines[0]?.trim() ?? '';
|
|
30
|
+
const body = lines.slice(1).join('\n').trim();
|
|
31
|
+
const entryContent = heading ? `## ${heading}\n${body}` : body;
|
|
32
|
+
return {
|
|
33
|
+
content: entryContent.slice(0, 2000),
|
|
34
|
+
type: inferType(filename),
|
|
35
|
+
date,
|
|
36
|
+
labels: inferLabels(filename, entryContent),
|
|
37
|
+
node,
|
|
38
|
+
};
|
|
39
|
+
}).filter(e => e.content.length > 10);
|
|
40
|
+
}
|
|
41
|
+
function inferType(filename) {
|
|
42
|
+
if (filename.includes('lesson'))
|
|
43
|
+
return 'lesson';
|
|
44
|
+
if (filename.match(/^\d{4}-\d{2}-\d{2}/))
|
|
45
|
+
return 'log';
|
|
46
|
+
if (filename.includes('research') || filename.includes('analysis'))
|
|
47
|
+
return 'research';
|
|
48
|
+
return 'note';
|
|
49
|
+
}
|
|
50
|
+
function inferLabels(filename, _content) {
|
|
51
|
+
const labels = [];
|
|
52
|
+
const parts = filename.replace('.md', '').split('-');
|
|
53
|
+
const meaningful = new Set(['cockpit', 'pro', 'roule', 'caillou', 'van', 'todo', 'home', 'assistant', 'dot', 'ai', 'nx', 'blog', 'property', 'poi', 'digest', 'email', 'api']);
|
|
54
|
+
for (const part of parts) {
|
|
55
|
+
if (meaningful.has(part.toLowerCase())) {
|
|
56
|
+
labels.push(part.toLowerCase());
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return [...new Set(labels)];
|
|
60
|
+
}
|
|
61
|
+
async function scanMemoryDir(dir, node) {
|
|
62
|
+
const entries = [];
|
|
63
|
+
let files;
|
|
64
|
+
try {
|
|
65
|
+
files = await readdir(dir);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return entries;
|
|
69
|
+
}
|
|
70
|
+
for (const file of files) {
|
|
71
|
+
if (!file.endsWith('.md'))
|
|
72
|
+
continue;
|
|
73
|
+
if (file === 'projects-index.md')
|
|
74
|
+
continue;
|
|
75
|
+
try {
|
|
76
|
+
const content = await readFile(join(dir, file), 'utf-8');
|
|
77
|
+
const parsed = parseMemoryFile(content, file, node);
|
|
78
|
+
entries.push(...parsed);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Skip unreadable files
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Also scan _archive/ subdirectory
|
|
85
|
+
try {
|
|
86
|
+
const archiveFiles = await readdir(join(dir, '_archive'));
|
|
87
|
+
for (const file of archiveFiles) {
|
|
88
|
+
if (!file.endsWith('.md'))
|
|
89
|
+
continue;
|
|
90
|
+
try {
|
|
91
|
+
const content = await readFile(join(dir, '_archive', file), 'utf-8');
|
|
92
|
+
const parsed = parseMemoryFile(content, file, node);
|
|
93
|
+
entries.push(...parsed);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Skip
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// No archive dir
|
|
102
|
+
}
|
|
103
|
+
// Also scan lessons/ subdirectory
|
|
104
|
+
try {
|
|
105
|
+
const lessonFiles = await readdir(join(dir, 'lessons'));
|
|
106
|
+
for (const file of lessonFiles) {
|
|
107
|
+
if (!file.endsWith('.md'))
|
|
108
|
+
continue;
|
|
109
|
+
try {
|
|
110
|
+
const content = await readFile(join(dir, 'lessons', file), 'utf-8');
|
|
111
|
+
const parsed = parseMemoryFile(content, file, node);
|
|
112
|
+
for (const entry of parsed) {
|
|
113
|
+
entry.type = 'lesson';
|
|
114
|
+
}
|
|
115
|
+
entries.push(...parsed);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Skip
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// No lessons dir
|
|
124
|
+
}
|
|
125
|
+
return entries;
|
|
126
|
+
}
|
|
127
|
+
async function main() {
|
|
128
|
+
const args = process.argv.slice(2);
|
|
129
|
+
const rootIdx = args.indexOf('--root');
|
|
130
|
+
const dbIdx = args.indexOf('--db');
|
|
131
|
+
const root = rootIdx >= 0 ? args[rootIdx + 1] : process.cwd();
|
|
132
|
+
const dbPath = dbIdx >= 0 ? args[dbIdx + 1] : join(root, '.ai', 'memory.db');
|
|
133
|
+
console.log(`Migrating memory files to SQLite`);
|
|
134
|
+
console.log(` Root: ${root}`);
|
|
135
|
+
console.log(` DB: ${dbPath}`);
|
|
136
|
+
// Create provider (creates DB and tables)
|
|
137
|
+
const provider = new SqliteMemoryProvider({ path: dbPath });
|
|
138
|
+
// Scan root memory
|
|
139
|
+
const rootEntries = await scanMemoryDir(join(root, '.ai', 'memory'), 'root');
|
|
140
|
+
console.log(` Root memory: ${rootEntries.length} entries`);
|
|
141
|
+
// Scan project memories
|
|
142
|
+
let projectEntries = 0;
|
|
143
|
+
try {
|
|
144
|
+
const projects = await readdir(join(root, 'projects'));
|
|
145
|
+
for (const project of projects) {
|
|
146
|
+
const memDir = join(root, 'projects', project, '.ai', 'memory');
|
|
147
|
+
const entries = await scanMemoryDir(memDir, project);
|
|
148
|
+
if (entries.length > 0) {
|
|
149
|
+
console.log(` ${project}: ${entries.length} entries`);
|
|
150
|
+
for (const entry of entries) {
|
|
151
|
+
await provider.store(entry);
|
|
152
|
+
}
|
|
153
|
+
projectEntries += entries.length;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// No projects dir
|
|
159
|
+
}
|
|
160
|
+
// Store root entries
|
|
161
|
+
for (const entry of rootEntries) {
|
|
162
|
+
await provider.store(entry);
|
|
163
|
+
}
|
|
164
|
+
const total = rootEntries.length + projectEntries;
|
|
165
|
+
console.log(`\nMigrated ${total} entries total`);
|
|
166
|
+
// Test search
|
|
167
|
+
console.log(`\nTest search for "cockpit":`);
|
|
168
|
+
const results = await provider.search('cockpit');
|
|
169
|
+
console.log(` Found ${results.length} results`);
|
|
170
|
+
if (results.length > 0) {
|
|
171
|
+
console.log(` First: ${results[0].content.slice(0, 100)}...`);
|
|
172
|
+
}
|
|
173
|
+
provider.close();
|
|
174
|
+
console.log(`\nDone. DB saved to ${dbPath}`);
|
|
175
|
+
}
|
|
176
|
+
main().catch(console.error);
|
|
177
|
+
//# sourceMappingURL=migrate-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-files.js","sourceRoot":"","sources":["../src/migrate-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MemoryEntry } from '@dot-ai/core';
|
|
2
|
+
export declare class SqliteMemoryProvider {
|
|
3
|
+
private db;
|
|
4
|
+
constructor(options?: Record<string, unknown>);
|
|
5
|
+
private init;
|
|
6
|
+
store(entry: Omit<MemoryEntry, 'source'>): Promise<void>;
|
|
7
|
+
search(query: string, labels?: string[]): Promise<MemoryEntry[]>;
|
|
8
|
+
consolidate(): Promise<{
|
|
9
|
+
archived: number;
|
|
10
|
+
deleted: number;
|
|
11
|
+
}>;
|
|
12
|
+
describe(): string;
|
|
13
|
+
close(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=sqlite-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-memory.d.ts","sourceRoot":"","sources":["../src/sqlite-memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAwBhD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,EAAE,CAAoB;gBAElB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IASjD,OAAO,CAAC,IAAI;IA+CN,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DxD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiEhE,WAAW,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBnE,QAAQ,IAAI,MAAM;IAKlB,KAAK,IAAI,IAAI;CAGd"}
|