@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 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,3 @@
1
+ import type { ExtensionAPI } from '@dot-ai/core';
2
+ export default function (api: ExtensionAPI): void;
3
+ //# sourceMappingURL=extension.d.ts.map
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export {};
2
+ // Public API — nothing exported yet.
3
+ // Utilities can be exposed here when other extensions need to compose with this one.
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,qCAAqC;AACrC,qFAAqF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.spec.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,IAAI,QAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,oBAAoB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,+BAA+B,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,mCAAmC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnF,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,IAAI,QAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,oBAAoB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,8CAA8C,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/F,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,IAAI,QAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,oBAAoB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,QAAQ,CAAC,KAAK,CAAC;YACnB,OAAO,EAAE,wCAAwC;YACjD,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAErD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,sCAAsC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5F,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAExF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnF,qCAAqC;QACrC,2EAA2E;QAC3E,6DAA6D;QAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,oCAAoC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACtF,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,mCAAmC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACrF,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,QAAQ,CAAC,KAAK,CAAC;YACnB,OAAO,EAAE,yCAAyC;YAClD,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC;SAC5B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAEvE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=migrate-files.d.ts.map
@@ -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":";AACA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,mDAAmD;AACnD,SAAS,eAAe,CAAC,OAAe,EAAE,QAAgB,EAAE,IAAY;IAOtE,8DAA8D;IAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAElD,qCAAqC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAExD,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzB,0CAA0C;QAC1C,OAAO,CAAC;gBACN,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;gBACtC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;gBACzB,IAAI;gBACJ,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC;gBACtC,IAAI;aACL,CAAC,CAAC;IACL,CAAC;IAED,uDAAuD;IACvD,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;YACpC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;YACzB,IAAI;YACJ,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC;YAC3C,IAAI;SACL,CAAC;IACJ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACtF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,QAAgB;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/K,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,IAAY;IACpD,MAAM,OAAO,GAA4F,EAAE,CAAC;IAE5G,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,IAAI,IAAI,KAAK,mBAAmB;YAAE,SAAS;QAE3C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;QAC1D,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACrE,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACpE,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBACpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACxB,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAE/B,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAE5D,mBAAmB;IACnB,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,kBAAkB,WAAW,CAAC,MAAM,UAAU,CAAC,CAAC;IAE5D,wBAAwB;IACxB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QACvD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,KAAK,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;gBACvD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;gBACD,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IAED,qBAAqB;IACrB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,cAAc,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,gBAAgB,CAAC,CAAC;IAEjD,cAAc;IACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAED,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -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"}