kratos-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.
- package/AGENTS.md +25 -0
- package/LICENSE +21 -0
- package/bin/kratos-cli +7 -0
- package/dist/cli/capture-handler.d.ts +13 -0
- package/dist/cli/capture-handler.d.ts.map +1 -0
- package/dist/cli/capture-handler.js +112 -0
- package/dist/cli/capture-handler.js.map +1 -0
- package/dist/cli/commands/ask.d.ts +5 -0
- package/dist/cli/commands/ask.d.ts.map +1 -0
- package/dist/cli/commands/ask.js +64 -0
- package/dist/cli/commands/ask.js.map +1 -0
- package/dist/cli/commands/capture.d.ts +5 -0
- package/dist/cli/commands/capture.d.ts.map +1 -0
- package/dist/cli/commands/capture.js +31 -0
- package/dist/cli/commands/capture.js.map +1 -0
- package/dist/cli/commands/forget.d.ts +3 -0
- package/dist/cli/commands/forget.d.ts.map +1 -0
- package/dist/cli/commands/forget.js +12 -0
- package/dist/cli/commands/forget.js.map +1 -0
- package/dist/cli/commands/get.d.ts +3 -0
- package/dist/cli/commands/get.d.ts.map +1 -0
- package/dist/cli/commands/get.js +28 -0
- package/dist/cli/commands/get.js.map +1 -0
- package/dist/cli/commands/hooks.d.ts +2 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -0
- package/dist/cli/commands/hooks.js +136 -0
- package/dist/cli/commands/hooks.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +5 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +56 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/recent.d.ts +6 -0
- package/dist/cli/commands/recent.d.ts.map +1 -0
- package/dist/cli/commands/recent.js +21 -0
- package/dist/cli/commands/recent.js.map +1 -0
- package/dist/cli/commands/save.d.ts +8 -0
- package/dist/cli/commands/save.d.ts.map +1 -0
- package/dist/cli/commands/save.js +31 -0
- package/dist/cli/commands/save.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +5 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +28 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/search.d.ts +8 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +45 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +89 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/switch.d.ts +3 -0
- package/dist/cli/commands/switch.d.ts.map +1 -0
- package/dist/cli/commands/switch.js +18 -0
- package/dist/cli/commands/switch.js.map +1 -0
- package/dist/cli/core.d.ts +15 -0
- package/dist/cli/core.d.ts.map +1 -0
- package/dist/cli/core.js +18 -0
- package/dist/cli/core.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +157 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +22 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +74 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/compression/factory.d.ts +6 -0
- package/dist/compression/factory.d.ts.map +1 -0
- package/dist/compression/factory.js +8 -0
- package/dist/compression/factory.js.map +1 -0
- package/dist/compression/index.d.ts +10 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/index.js +2 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/compression/rule-compressor.d.ts +9 -0
- package/dist/compression/rule-compressor.d.ts.map +1 -0
- package/dist/compression/rule-compressor.js +43 -0
- package/dist/compression/rule-compressor.js.map +1 -0
- package/dist/memory-server/concept-store-enhanced.d.ts +88 -0
- package/dist/memory-server/concept-store-enhanced.d.ts.map +1 -0
- package/dist/memory-server/concept-store-enhanced.js +392 -0
- package/dist/memory-server/concept-store-enhanced.js.map +1 -0
- package/dist/memory-server/concept-store.d.ts +58 -0
- package/dist/memory-server/concept-store.d.ts.map +1 -0
- package/dist/memory-server/concept-store.js +329 -0
- package/dist/memory-server/concept-store.js.map +1 -0
- package/dist/memory-server/context-broker.d.ts +63 -0
- package/dist/memory-server/context-broker.d.ts.map +1 -0
- package/dist/memory-server/context-broker.js +340 -0
- package/dist/memory-server/context-broker.js.map +1 -0
- package/dist/memory-server/database.d.ts +108 -0
- package/dist/memory-server/database.d.ts.map +1 -0
- package/dist/memory-server/database.js +690 -0
- package/dist/memory-server/database.js.map +1 -0
- package/dist/project-manager.d.ts +77 -0
- package/dist/project-manager.d.ts.map +1 -0
- package/dist/project-manager.js +226 -0
- package/dist/project-manager.js.map +1 -0
- package/dist/security/data-retention.d.ts +104 -0
- package/dist/security/data-retention.d.ts.map +1 -0
- package/dist/security/data-retention.js +444 -0
- package/dist/security/data-retention.js.map +1 -0
- package/dist/security/encryption.d.ts +48 -0
- package/dist/security/encryption.d.ts.map +1 -0
- package/dist/security/encryption.js +131 -0
- package/dist/security/encryption.js.map +1 -0
- package/dist/security/pii-detector.d.ts +61 -0
- package/dist/security/pii-detector.d.ts.map +1 -0
- package/dist/security/pii-detector.js +220 -0
- package/dist/security/pii-detector.js.map +1 -0
- package/dist/types/index.d.ts +151 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +10 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import crypto from 'crypto';
|
|
6
|
+
import { Logger } from '../utils/logger.js';
|
|
7
|
+
const logger = new Logger('ConceptStore');
|
|
8
|
+
/**
|
|
9
|
+
* ENHANCED Concept Store - 10/10 Features
|
|
10
|
+
*
|
|
11
|
+
* NEW FEATURES:
|
|
12
|
+
* - Auto-discovery: Automatically finds and suggests relevant concepts
|
|
13
|
+
* - Usage tracking: Tracks which concepts are most useful
|
|
14
|
+
* - Smart ranking: Combines relevance, importance, and usage
|
|
15
|
+
* - Cross-project learning: Optionally share valuable concepts
|
|
16
|
+
* - Concept relationships: Link related concepts
|
|
17
|
+
*/
|
|
18
|
+
export class ConceptStoreEnhanced {
|
|
19
|
+
db;
|
|
20
|
+
static instances = new Map();
|
|
21
|
+
projectId;
|
|
22
|
+
// Concept discovery cache
|
|
23
|
+
discoveryCache = new Map();
|
|
24
|
+
constructor(projectId) {
|
|
25
|
+
this.projectId = projectId;
|
|
26
|
+
// ISOLATED concept store per project
|
|
27
|
+
const kratosHome = path.join(os.homedir(), '.kratos');
|
|
28
|
+
const dbPath = path.join(kratosHome, 'projects', projectId, 'databases', 'concepts.db');
|
|
29
|
+
fs.ensureDirSync(path.dirname(dbPath));
|
|
30
|
+
this.db = new Database(dbPath);
|
|
31
|
+
this.db.pragma('journal_mode = WAL');
|
|
32
|
+
this.initializeEnhancedSchema();
|
|
33
|
+
logger.info(`Enhanced Concept Store initialized for project: ${projectId}`);
|
|
34
|
+
}
|
|
35
|
+
static getInstance(projectId) {
|
|
36
|
+
const id = projectId || 'global';
|
|
37
|
+
if (!ConceptStoreEnhanced.instances.has(id)) {
|
|
38
|
+
ConceptStoreEnhanced.instances.set(id, new ConceptStoreEnhanced(id));
|
|
39
|
+
}
|
|
40
|
+
return ConceptStoreEnhanced.instances.get(id);
|
|
41
|
+
}
|
|
42
|
+
initializeEnhancedSchema() {
|
|
43
|
+
// Enhanced concepts table with usage tracking
|
|
44
|
+
this.db.exec(`
|
|
45
|
+
CREATE TABLE IF NOT EXISTS concepts (
|
|
46
|
+
id TEXT PRIMARY KEY,
|
|
47
|
+
title TEXT NOT NULL,
|
|
48
|
+
body TEXT NOT NULL,
|
|
49
|
+
tags TEXT DEFAULT '[]',
|
|
50
|
+
importance INTEGER DEFAULT 3 CHECK(importance >= 1 AND importance <= 5),
|
|
51
|
+
usage_count INTEGER DEFAULT 0,
|
|
52
|
+
last_used INTEGER,
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL,
|
|
55
|
+
source TEXT DEFAULT 'manual', -- manual, discovered, imported
|
|
56
|
+
confidence REAL DEFAULT 1.0 -- confidence in the concept
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_concept_importance ON concepts(importance DESC);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_concept_usage ON concepts(usage_count DESC);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_concept_last_used ON concepts(last_used DESC);
|
|
62
|
+
`);
|
|
63
|
+
// Concept relationships table
|
|
64
|
+
this.db.exec(`
|
|
65
|
+
CREATE TABLE IF NOT EXISTS concept_relationships (
|
|
66
|
+
concept_id TEXT NOT NULL,
|
|
67
|
+
related_id TEXT NOT NULL,
|
|
68
|
+
relationship_type TEXT DEFAULT 'related', -- related, prerequisite, extends, conflicts
|
|
69
|
+
strength REAL DEFAULT 0.5,
|
|
70
|
+
PRIMARY KEY (concept_id, related_id),
|
|
71
|
+
FOREIGN KEY (concept_id) REFERENCES concepts(id) ON DELETE CASCADE,
|
|
72
|
+
FOREIGN KEY (related_id) REFERENCES concepts(id) ON DELETE CASCADE
|
|
73
|
+
);
|
|
74
|
+
`);
|
|
75
|
+
// Project allowlists (enhanced with auto-add suggestions)
|
|
76
|
+
this.db.exec(`
|
|
77
|
+
CREATE TABLE IF NOT EXISTS project_allowlists (
|
|
78
|
+
project_id TEXT NOT NULL,
|
|
79
|
+
concept_id TEXT NOT NULL,
|
|
80
|
+
added_at INTEGER NOT NULL,
|
|
81
|
+
auto_suggested BOOLEAN DEFAULT 0,
|
|
82
|
+
accepted BOOLEAN DEFAULT 1,
|
|
83
|
+
PRIMARY KEY (project_id, concept_id),
|
|
84
|
+
FOREIGN KEY (concept_id) REFERENCES concepts(id) ON DELETE CASCADE
|
|
85
|
+
);
|
|
86
|
+
`);
|
|
87
|
+
// Full-text search with enhanced fields
|
|
88
|
+
this.db.exec(`
|
|
89
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS concept_fts USING fts5(
|
|
90
|
+
title,
|
|
91
|
+
body,
|
|
92
|
+
tags,
|
|
93
|
+
content='concepts',
|
|
94
|
+
content_rowid='rowid',
|
|
95
|
+
tokenize='porter unicode61'
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
-- Enhanced triggers for FTS
|
|
99
|
+
CREATE TRIGGER IF NOT EXISTS concept_fts_insert AFTER INSERT ON concepts BEGIN
|
|
100
|
+
INSERT INTO concept_fts(rowid, title, body, tags)
|
|
101
|
+
VALUES (new.rowid, new.title, new.body,
|
|
102
|
+
CASE WHEN json_array_length(new.tags) > 0
|
|
103
|
+
THEN (SELECT group_concat(value, ' ') FROM json_each(new.tags))
|
|
104
|
+
ELSE ''
|
|
105
|
+
END);
|
|
106
|
+
END;
|
|
107
|
+
|
|
108
|
+
CREATE TRIGGER IF NOT EXISTS concept_fts_delete AFTER DELETE ON concepts BEGIN
|
|
109
|
+
DELETE FROM concept_fts WHERE rowid = old.rowid;
|
|
110
|
+
END;
|
|
111
|
+
|
|
112
|
+
CREATE TRIGGER IF NOT EXISTS concept_fts_update AFTER UPDATE ON concepts BEGIN
|
|
113
|
+
DELETE FROM concept_fts WHERE rowid = old.rowid;
|
|
114
|
+
INSERT INTO concept_fts(rowid, title, body, tags)
|
|
115
|
+
VALUES (new.rowid, new.title, new.body,
|
|
116
|
+
CASE WHEN json_array_length(new.tags) > 0
|
|
117
|
+
THEN (SELECT group_concat(value, ' ') FROM json_each(new.tags))
|
|
118
|
+
ELSE ''
|
|
119
|
+
END);
|
|
120
|
+
END;
|
|
121
|
+
`);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Enhanced save with auto-discovery and relationship detection
|
|
125
|
+
*/
|
|
126
|
+
save(params) {
|
|
127
|
+
const now = Date.now();
|
|
128
|
+
const id = this.generateConceptId(params.title);
|
|
129
|
+
const concept = {
|
|
130
|
+
id,
|
|
131
|
+
title: params.title,
|
|
132
|
+
body: params.body,
|
|
133
|
+
tags: params.tags || [],
|
|
134
|
+
importance: params.importance || 3,
|
|
135
|
+
usage_count: 0,
|
|
136
|
+
created_at: now,
|
|
137
|
+
updated_at: now
|
|
138
|
+
};
|
|
139
|
+
const stmt = this.db.prepare(`
|
|
140
|
+
INSERT OR REPLACE INTO concepts
|
|
141
|
+
(id, title, body, tags, importance, usage_count, created_at, updated_at, source)
|
|
142
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
143
|
+
`);
|
|
144
|
+
stmt.run(concept.id, concept.title, concept.body, JSON.stringify(concept.tags), concept.importance, 0, concept.created_at, concept.updated_at, params.source || 'manual');
|
|
145
|
+
// Save relationships if provided
|
|
146
|
+
if (params.relatedTo && params.relatedTo.length > 0) {
|
|
147
|
+
this.addRelationships(id, params.relatedTo);
|
|
148
|
+
}
|
|
149
|
+
// Auto-discover related concepts
|
|
150
|
+
this.autoDiscoverRelated(concept);
|
|
151
|
+
logger.info(`Saved enhanced concept: ${concept.title} (${id})`);
|
|
152
|
+
return concept;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* ENHANCED search with smart ranking
|
|
156
|
+
*/
|
|
157
|
+
search(params) {
|
|
158
|
+
const k = params.k || 10;
|
|
159
|
+
const searchQuery = params.q || '*';
|
|
160
|
+
let query;
|
|
161
|
+
let queryParams = [];
|
|
162
|
+
if (searchQuery === '*') {
|
|
163
|
+
// Return all concepts with smart ranking
|
|
164
|
+
query = `
|
|
165
|
+
SELECT
|
|
166
|
+
c.*,
|
|
167
|
+
(c.importance * 2.0 +
|
|
168
|
+
COALESCE(c.usage_count * 0.1, 0) +
|
|
169
|
+
CASE WHEN c.last_used > ? THEN 2.0 ELSE 0 END) as smart_score,
|
|
170
|
+
'' as snippet
|
|
171
|
+
FROM concepts c
|
|
172
|
+
`;
|
|
173
|
+
// Recent = last 7 days
|
|
174
|
+
queryParams = [Date.now() - 7 * 24 * 60 * 60 * 1000];
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// Enhanced FTS search with smart scoring
|
|
178
|
+
query = `
|
|
179
|
+
SELECT
|
|
180
|
+
c.*,
|
|
181
|
+
(-bm25(concept_fts) * 3.0 +
|
|
182
|
+
c.importance * 2.0 +
|
|
183
|
+
COALESCE(c.usage_count * 0.1, 0) +
|
|
184
|
+
CASE WHEN c.last_used > ? THEN 2.0 ELSE 0 END) as smart_score,
|
|
185
|
+
snippet(concept_fts, 0, '[', ']', '...', 32) as snippet
|
|
186
|
+
FROM concepts c
|
|
187
|
+
JOIN concept_fts ON c.rowid = concept_fts.rowid
|
|
188
|
+
WHERE concept_fts MATCH ?
|
|
189
|
+
`;
|
|
190
|
+
queryParams = [Date.now() - 7 * 24 * 60 * 60 * 1000, searchQuery];
|
|
191
|
+
}
|
|
192
|
+
// Apply filters
|
|
193
|
+
if (params.projectId) {
|
|
194
|
+
const whereClause = searchQuery === '*' ? ' WHERE' : ' AND';
|
|
195
|
+
query += `${whereClause} c.id IN (
|
|
196
|
+
SELECT concept_id FROM project_allowlists
|
|
197
|
+
WHERE project_id = ? AND accepted = 1
|
|
198
|
+
)`;
|
|
199
|
+
queryParams.push(params.projectId);
|
|
200
|
+
}
|
|
201
|
+
// Smart ordering
|
|
202
|
+
query += ' ORDER BY smart_score DESC LIMIT ?';
|
|
203
|
+
queryParams.push(k);
|
|
204
|
+
const stmt = this.db.prepare(query);
|
|
205
|
+
const results = stmt.all(...queryParams);
|
|
206
|
+
// Include related concepts if requested
|
|
207
|
+
let finalResults = results.map(row => ({
|
|
208
|
+
concept: this.rowToConcept(row),
|
|
209
|
+
score: row.smart_score || 1.0,
|
|
210
|
+
snippet: row.snippet
|
|
211
|
+
}));
|
|
212
|
+
if (params.includeRelated && finalResults.length > 0) {
|
|
213
|
+
finalResults = this.enrichWithRelated(finalResults);
|
|
214
|
+
}
|
|
215
|
+
// Track usage for learning
|
|
216
|
+
if (finalResults.length > 0) {
|
|
217
|
+
this.trackUsage(finalResults[0].concept.id);
|
|
218
|
+
}
|
|
219
|
+
return finalResults;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Auto-discover concepts from text
|
|
223
|
+
*/
|
|
224
|
+
async autoDiscover(text, context) {
|
|
225
|
+
const discovered = [];
|
|
226
|
+
// Pattern matching for common concept indicators
|
|
227
|
+
const patterns = [
|
|
228
|
+
/(?:best practice|pattern|principle|rule):\s*([^.]+)/gi,
|
|
229
|
+
/(?:always|never|should|must)\s+([^.]+)/gi,
|
|
230
|
+
/(?:tip|note|important):\s*([^.]+)/gi,
|
|
231
|
+
/(?:remember|keep in mind):\s*([^.]+)/gi
|
|
232
|
+
];
|
|
233
|
+
for (const pattern of patterns) {
|
|
234
|
+
const matches = text.matchAll(pattern);
|
|
235
|
+
for (const match of matches) {
|
|
236
|
+
const conceptText = match[1].trim();
|
|
237
|
+
if (conceptText.length > 20 && conceptText.length < 500) {
|
|
238
|
+
const concept = this.save({
|
|
239
|
+
title: this.generateTitle(conceptText),
|
|
240
|
+
body: conceptText,
|
|
241
|
+
tags: this.extractTags(conceptText),
|
|
242
|
+
importance: 3,
|
|
243
|
+
source: 'discovered'
|
|
244
|
+
});
|
|
245
|
+
discovered.push(concept);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return discovered;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Track concept usage for smart ranking
|
|
253
|
+
*/
|
|
254
|
+
trackUsage(conceptId) {
|
|
255
|
+
const stmt = this.db.prepare(`
|
|
256
|
+
UPDATE concepts
|
|
257
|
+
SET usage_count = usage_count + 1,
|
|
258
|
+
last_used = ?
|
|
259
|
+
WHERE id = ?
|
|
260
|
+
`);
|
|
261
|
+
stmt.run(Date.now(), conceptId);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Add relationships between concepts
|
|
265
|
+
*/
|
|
266
|
+
addRelationships(conceptId, relatedIds, type = 'related') {
|
|
267
|
+
const stmt = this.db.prepare(`
|
|
268
|
+
INSERT OR REPLACE INTO concept_relationships
|
|
269
|
+
(concept_id, related_id, relationship_type, strength)
|
|
270
|
+
VALUES (?, ?, ?, ?)
|
|
271
|
+
`);
|
|
272
|
+
for (const relatedId of relatedIds) {
|
|
273
|
+
stmt.run(conceptId, relatedId, type, 0.5);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Auto-discover related concepts
|
|
278
|
+
*/
|
|
279
|
+
autoDiscoverRelated(concept) {
|
|
280
|
+
// Find concepts with overlapping tags
|
|
281
|
+
const stmt = this.db.prepare(`
|
|
282
|
+
SELECT id, title, tags FROM concepts
|
|
283
|
+
WHERE id != ?
|
|
284
|
+
LIMIT 20
|
|
285
|
+
`);
|
|
286
|
+
const others = stmt.all(concept.id);
|
|
287
|
+
for (const other of others) {
|
|
288
|
+
const otherTags = JSON.parse(other.tags);
|
|
289
|
+
const overlap = concept.tags.filter(t => otherTags.includes(t)).length;
|
|
290
|
+
if (overlap > 0) {
|
|
291
|
+
const strength = overlap / Math.max(concept.tags.length, otherTags.length);
|
|
292
|
+
if (strength > 0.3) {
|
|
293
|
+
this.addRelationships(concept.id, [other.id], 'related');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Enrich results with related concepts
|
|
300
|
+
*/
|
|
301
|
+
enrichWithRelated(results) {
|
|
302
|
+
const enriched = [...results];
|
|
303
|
+
const seen = new Set(results.map(r => r.concept.id));
|
|
304
|
+
for (const result of results.slice(0, 3)) {
|
|
305
|
+
const stmt = this.db.prepare(`
|
|
306
|
+
SELECT c.*, r.strength
|
|
307
|
+
FROM concepts c
|
|
308
|
+
JOIN concept_relationships r ON c.id = r.related_id
|
|
309
|
+
WHERE r.concept_id = ?
|
|
310
|
+
ORDER BY r.strength DESC
|
|
311
|
+
LIMIT 2
|
|
312
|
+
`);
|
|
313
|
+
const related = stmt.all(result.concept.id);
|
|
314
|
+
for (const rel of related) {
|
|
315
|
+
if (!seen.has(rel.id)) {
|
|
316
|
+
enriched.push({
|
|
317
|
+
concept: this.rowToConcept(rel),
|
|
318
|
+
score: result.score * rel.strength * 0.5,
|
|
319
|
+
snippet: `[Related to: ${result.concept.title}]`
|
|
320
|
+
});
|
|
321
|
+
seen.add(rel.id);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return enriched.sort((a, b) => b.score - a.score);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Auto-suggest concepts for a project based on context
|
|
329
|
+
*/
|
|
330
|
+
async suggestForProject(projectId, context) {
|
|
331
|
+
const searchResults = this.search({
|
|
332
|
+
q: context,
|
|
333
|
+
k: 5,
|
|
334
|
+
boostRecent: true
|
|
335
|
+
});
|
|
336
|
+
const suggestions = searchResults
|
|
337
|
+
.filter(r => r.score > 2.0)
|
|
338
|
+
.map(r => r.concept);
|
|
339
|
+
// Add to allowlist as suggestions
|
|
340
|
+
const stmt = this.db.prepare(`
|
|
341
|
+
INSERT OR IGNORE INTO project_allowlists
|
|
342
|
+
(project_id, concept_id, added_at, auto_suggested, accepted)
|
|
343
|
+
VALUES (?, ?, ?, 1, 0)
|
|
344
|
+
`);
|
|
345
|
+
for (const concept of suggestions) {
|
|
346
|
+
stmt.run(projectId, concept.id, Date.now());
|
|
347
|
+
}
|
|
348
|
+
return suggestions;
|
|
349
|
+
}
|
|
350
|
+
generateConceptId(title) {
|
|
351
|
+
const slug = title.toLowerCase()
|
|
352
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
353
|
+
.replace(/^-|-$/g, '')
|
|
354
|
+
.substring(0, 50);
|
|
355
|
+
const hash = crypto.randomBytes(3).toString('hex');
|
|
356
|
+
return `${slug}-${hash}`;
|
|
357
|
+
}
|
|
358
|
+
generateTitle(text) {
|
|
359
|
+
const words = text.split(' ').slice(0, 5).join(' ');
|
|
360
|
+
return words.charAt(0).toUpperCase() + words.slice(1);
|
|
361
|
+
}
|
|
362
|
+
extractTags(text) {
|
|
363
|
+
const keywords = text.toLowerCase()
|
|
364
|
+
.split(/\s+/)
|
|
365
|
+
.filter(word => word.length > 4)
|
|
366
|
+
.filter(word => !['should', 'would', 'could', 'might', 'must'].includes(word))
|
|
367
|
+
.slice(0, 5);
|
|
368
|
+
return [...new Set(keywords)];
|
|
369
|
+
}
|
|
370
|
+
rowToConcept(row) {
|
|
371
|
+
return {
|
|
372
|
+
id: row.id,
|
|
373
|
+
title: row.title,
|
|
374
|
+
body: row.body,
|
|
375
|
+
tags: JSON.parse(row.tags),
|
|
376
|
+
importance: row.importance,
|
|
377
|
+
usage_count: row.usage_count || 0,
|
|
378
|
+
last_used: row.last_used,
|
|
379
|
+
created_at: row.created_at,
|
|
380
|
+
updated_at: row.updated_at
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
get(id) {
|
|
384
|
+
const stmt = this.db.prepare('SELECT * FROM concepts WHERE id = ?');
|
|
385
|
+
const row = stmt.get(id);
|
|
386
|
+
return row ? this.rowToConcept(row) : null;
|
|
387
|
+
}
|
|
388
|
+
close() {
|
|
389
|
+
this.db.close();
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=concept-store-enhanced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concept-store-enhanced.js","sourceRoot":"","sources":["../../src/memory-server/concept-store-enhanced.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface Concept {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
body: string;
|
|
5
|
+
tags: string[];
|
|
6
|
+
importance: number;
|
|
7
|
+
created_at: number;
|
|
8
|
+
updated_at: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ConceptSearchResult {
|
|
11
|
+
concept: Concept;
|
|
12
|
+
score: number;
|
|
13
|
+
snippet?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class ConceptStore {
|
|
16
|
+
private db;
|
|
17
|
+
private static instances;
|
|
18
|
+
private projectId;
|
|
19
|
+
private constructor();
|
|
20
|
+
static getInstance(projectId?: string): ConceptStore;
|
|
21
|
+
private initializeSchema;
|
|
22
|
+
private seedInitialConcepts;
|
|
23
|
+
search(params: {
|
|
24
|
+
q: string;
|
|
25
|
+
k?: number;
|
|
26
|
+
allowlist?: string[];
|
|
27
|
+
projectId?: string;
|
|
28
|
+
}): ConceptSearchResult[];
|
|
29
|
+
get(id: string): Concept | null;
|
|
30
|
+
save(params: {
|
|
31
|
+
id?: string;
|
|
32
|
+
title: string;
|
|
33
|
+
body: string;
|
|
34
|
+
tags?: string[];
|
|
35
|
+
importance?: number;
|
|
36
|
+
}): {
|
|
37
|
+
id: string;
|
|
38
|
+
};
|
|
39
|
+
updateAllowlist(params: {
|
|
40
|
+
projectId: string;
|
|
41
|
+
add?: string[];
|
|
42
|
+
remove?: string[];
|
|
43
|
+
list?: boolean;
|
|
44
|
+
}): {
|
|
45
|
+
allowlist?: string[];
|
|
46
|
+
added?: string[];
|
|
47
|
+
removed?: string[];
|
|
48
|
+
};
|
|
49
|
+
linkToProject(conceptId: string, projectId: string): {
|
|
50
|
+
memoryId: string;
|
|
51
|
+
};
|
|
52
|
+
private generateConceptId;
|
|
53
|
+
private normalizeSearchQuery;
|
|
54
|
+
private escapeQuery;
|
|
55
|
+
private rowToConcept;
|
|
56
|
+
close(): void;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=concept-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concept-store.d.ts","sourceRoot":"","sources":["../../src/memory-server/concept-store.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAwC;IAChE,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;IAeP,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY;IASpD,OAAO,CAAC,gBAAgB;IAqDxB,OAAO,CAAC,mBAAmB;IAgE3B,MAAM,CAAC,MAAM,EAAE;QACb,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,mBAAmB,EAAE;IAyEzB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAO/B,IAAI,CAAC,MAAM,EAAE;QACX,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;IAiDlB,eAAe,CAAC,MAAM,EAAE;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;IAyDlE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;IAczE,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IAYpB,KAAK;CAGN"}
|