@whenmoon-afk/memory-mcp 2.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +263 -0
  3. package/dist/database/connection.d.ts +47 -0
  4. package/dist/database/connection.d.ts.map +1 -0
  5. package/dist/database/connection.js +151 -0
  6. package/dist/database/connection.js.map +1 -0
  7. package/dist/database/schema.d.ts +33 -0
  8. package/dist/database/schema.d.ts.map +1 -0
  9. package/dist/database/schema.js +293 -0
  10. package/dist/database/schema.js.map +1 -0
  11. package/dist/extractors/entity-extractor.d.ts +25 -0
  12. package/dist/extractors/entity-extractor.d.ts.map +1 -0
  13. package/dist/extractors/entity-extractor.js +195 -0
  14. package/dist/extractors/entity-extractor.js.map +1 -0
  15. package/dist/extractors/fact-extractor.d.ts +38 -0
  16. package/dist/extractors/fact-extractor.d.ts.map +1 -0
  17. package/dist/extractors/fact-extractor.js +172 -0
  18. package/dist/extractors/fact-extractor.js.map +1 -0
  19. package/dist/extractors/summary-generator.d.ts +28 -0
  20. package/dist/extractors/summary-generator.d.ts.map +1 -0
  21. package/dist/extractors/summary-generator.js +149 -0
  22. package/dist/extractors/summary-generator.js.map +1 -0
  23. package/dist/index.d.ts +7 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +229 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/scoring/importance.d.ts +39 -0
  28. package/dist/scoring/importance.d.ts.map +1 -0
  29. package/dist/scoring/importance.js +150 -0
  30. package/dist/scoring/importance.js.map +1 -0
  31. package/dist/scoring/ttl-manager.d.ts +33 -0
  32. package/dist/scoring/ttl-manager.d.ts.map +1 -0
  33. package/dist/scoring/ttl-manager.js +99 -0
  34. package/dist/scoring/ttl-manager.js.map +1 -0
  35. package/dist/search/semantic-search.d.ts +15 -0
  36. package/dist/search/semantic-search.d.ts.map +1 -0
  37. package/dist/search/semantic-search.js +236 -0
  38. package/dist/search/semantic-search.js.map +1 -0
  39. package/dist/tools/memory-forget.d.ts +10 -0
  40. package/dist/tools/memory-forget.d.ts.map +1 -0
  41. package/dist/tools/memory-forget.js +34 -0
  42. package/dist/tools/memory-forget.js.map +1 -0
  43. package/dist/tools/memory-recall.d.ts +12 -0
  44. package/dist/tools/memory-recall.d.ts.map +1 -0
  45. package/dist/tools/memory-recall.js +106 -0
  46. package/dist/tools/memory-recall.js.map +1 -0
  47. package/dist/tools/memory-store.d.ts +13 -0
  48. package/dist/tools/memory-store.d.ts.map +1 -0
  49. package/dist/tools/memory-store.js +279 -0
  50. package/dist/tools/memory-store.js.map +1 -0
  51. package/dist/tools/response-formatter.d.ts +71 -0
  52. package/dist/tools/response-formatter.d.ts.map +1 -0
  53. package/dist/tools/response-formatter.js +180 -0
  54. package/dist/tools/response-formatter.js.map +1 -0
  55. package/dist/types/index.d.ts +244 -0
  56. package/dist/types/index.d.ts.map +1 -0
  57. package/dist/types/index.js +29 -0
  58. package/dist/types/index.js.map +1 -0
  59. package/dist/utils/token-estimator.d.ts +33 -0
  60. package/dist/utils/token-estimator.d.ts.map +1 -0
  61. package/dist/utils/token-estimator.js +54 -0
  62. package/dist/utils/token-estimator.js.map +1 -0
  63. package/package.json +71 -0
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Database schema definitions and migrations for Memory MCP
3
+ */
4
+ export const SCHEMA_VERSION = 3;
5
+ /**
6
+ * Initialize database schema
7
+ */
8
+ export function initializeSchema(db) {
9
+ // Enable foreign keys
10
+ db.pragma('foreign_keys = ON');
11
+ // Create schema version table
12
+ db.exec(`
13
+ CREATE TABLE IF NOT EXISTS schema_version (
14
+ version INTEGER PRIMARY KEY,
15
+ applied_at INTEGER NOT NULL
16
+ );
17
+ `);
18
+ // Check current version
19
+ const currentVersion = db
20
+ .prepare('SELECT version FROM schema_version ORDER BY version DESC LIMIT 1')
21
+ .pluck()
22
+ .get();
23
+ if (!currentVersion || currentVersion < SCHEMA_VERSION) {
24
+ applyMigrations(db, currentVersion || 0);
25
+ }
26
+ }
27
+ /**
28
+ * Apply migrations from current version to latest
29
+ */
30
+ function applyMigrations(db, fromVersion) {
31
+ const migrations = [
32
+ // Migration 1: Initial schema
33
+ (db) => {
34
+ db.exec(`
35
+ -- Memories table: Core memory storage
36
+ CREATE TABLE IF NOT EXISTS memories (
37
+ id TEXT PRIMARY KEY,
38
+ content TEXT NOT NULL,
39
+ type TEXT NOT NULL CHECK(type IN ('fact', 'entity', 'relationship', 'self')),
40
+ importance REAL NOT NULL CHECK(importance >= 0 AND importance <= 10),
41
+ embedding BLOB,
42
+ created_at INTEGER NOT NULL,
43
+ last_accessed INTEGER NOT NULL,
44
+ expires_at INTEGER,
45
+ metadata TEXT NOT NULL DEFAULT '{}',
46
+ is_deleted INTEGER NOT NULL DEFAULT 0 CHECK(is_deleted IN (0, 1))
47
+ );
48
+
49
+ -- Indexes for memories
50
+ CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
51
+ CREATE INDEX IF NOT EXISTS idx_memories_importance ON memories(importance);
52
+ CREATE INDEX IF NOT EXISTS idx_memories_last_accessed ON memories(last_accessed);
53
+ CREATE INDEX IF NOT EXISTS idx_memories_expires_at ON memories(expires_at);
54
+ CREATE INDEX IF NOT EXISTS idx_memories_is_deleted ON memories(is_deleted);
55
+
56
+ -- Entities table: Named entities
57
+ CREATE TABLE IF NOT EXISTS entities (
58
+ id TEXT PRIMARY KEY,
59
+ name TEXT NOT NULL UNIQUE,
60
+ type TEXT NOT NULL,
61
+ metadata TEXT NOT NULL DEFAULT '{}',
62
+ created_at INTEGER NOT NULL
63
+ );
64
+
65
+ -- Index for entities
66
+ CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
67
+ CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type);
68
+
69
+ -- Memory-Entity link table
70
+ CREATE TABLE IF NOT EXISTS memory_entities (
71
+ memory_id TEXT NOT NULL,
72
+ entity_id TEXT NOT NULL,
73
+ created_at INTEGER NOT NULL,
74
+ PRIMARY KEY (memory_id, entity_id),
75
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE,
76
+ FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
77
+ );
78
+
79
+ -- Indexes for memory_entities
80
+ CREATE INDEX IF NOT EXISTS idx_memory_entities_memory_id ON memory_entities(memory_id);
81
+ CREATE INDEX IF NOT EXISTS idx_memory_entities_entity_id ON memory_entities(entity_id);
82
+
83
+ -- Provenance table: Audit trail
84
+ CREATE TABLE IF NOT EXISTS provenance (
85
+ id TEXT PRIMARY KEY,
86
+ memory_id TEXT NOT NULL,
87
+ operation TEXT NOT NULL CHECK(operation IN ('create', 'update', 'delete', 'access', 'restore')),
88
+ timestamp INTEGER NOT NULL,
89
+ source TEXT NOT NULL,
90
+ context TEXT,
91
+ user_id TEXT,
92
+ changes TEXT,
93
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
94
+ );
95
+
96
+ -- Indexes for provenance
97
+ CREATE INDEX IF NOT EXISTS idx_provenance_memory_id ON provenance(memory_id);
98
+ CREATE INDEX IF NOT EXISTS idx_provenance_timestamp ON provenance(timestamp);
99
+ CREATE INDEX IF NOT EXISTS idx_provenance_operation ON provenance(operation);
100
+ `);
101
+ // Record migration
102
+ db.prepare('INSERT INTO schema_version (version, applied_at) VALUES (?, ?)').run(1, Date.now());
103
+ },
104
+ // Migration 2: Add summary and access_count fields for v2.0 optimization
105
+ (db) => {
106
+ // Add summary column (TEXT, will be NOT NULL after backfill)
107
+ db.exec(`
108
+ ALTER TABLE memories ADD COLUMN summary TEXT;
109
+ `);
110
+ // Add access_count column for frequency tracking
111
+ db.exec(`
112
+ ALTER TABLE memories ADD COLUMN access_count INTEGER NOT NULL DEFAULT 0;
113
+ `);
114
+ // Generate summaries for existing memories (first 100 characters as fallback)
115
+ const memories = db.prepare('SELECT id, content FROM memories').all();
116
+ const updateSummary = db.prepare('UPDATE memories SET summary = ? WHERE id = ?');
117
+ for (const memory of memories) {
118
+ // Simple summary: first 100 characters or first sentence
119
+ let summary = memory.content;
120
+ const firstSentence = memory.content.match(/^[^.!?]+[.!?]/);
121
+ if (firstSentence && firstSentence[0].length <= 100) {
122
+ summary = firstSentence[0].trim();
123
+ }
124
+ else if (memory.content.length > 100) {
125
+ summary = memory.content.substring(0, 97) + '...';
126
+ }
127
+ updateSummary.run(summary, memory.id);
128
+ }
129
+ // Now make summary NOT NULL (SQLite doesn't support ALTER COLUMN, so we verify all are filled)
130
+ const nullSummaries = db
131
+ .prepare('SELECT COUNT(*) FROM memories WHERE summary IS NULL')
132
+ .pluck()
133
+ .get();
134
+ if (nullSummaries > 0) {
135
+ throw new Error(`Migration 2 failed: ${nullSummaries} memories still have NULL summaries`);
136
+ }
137
+ // Record migration
138
+ db.prepare('INSERT INTO schema_version (version, applied_at) VALUES (?, ?)').run(2, Date.now());
139
+ },
140
+ // Migration 3: Add FTS5 for keyword search (replaces vector embeddings)
141
+ (db) => {
142
+ // Create FTS5 virtual table for full-text search on memory content
143
+ db.exec(`
144
+ CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
145
+ memory_id UNINDEXED,
146
+ content,
147
+ summary,
148
+ tokenize = 'porter unicode61'
149
+ );
150
+ `);
151
+ // Populate FTS table with existing memories
152
+ db.exec(`
153
+ INSERT INTO memories_fts (memory_id, content, summary)
154
+ SELECT id, content, summary FROM memories WHERE is_deleted = 0;
155
+ `);
156
+ // Create triggers to keep FTS index synchronized
157
+ db.exec(`
158
+ -- Trigger: Insert into FTS when memory created
159
+ CREATE TRIGGER IF NOT EXISTS memories_fts_insert
160
+ AFTER INSERT ON memories
161
+ WHEN NEW.is_deleted = 0
162
+ BEGIN
163
+ INSERT INTO memories_fts (memory_id, content, summary)
164
+ VALUES (NEW.id, NEW.content, NEW.summary);
165
+ END;
166
+
167
+ -- Trigger: Update FTS when memory content/summary updated
168
+ CREATE TRIGGER IF NOT EXISTS memories_fts_update
169
+ AFTER UPDATE OF content, summary ON memories
170
+ WHEN NEW.is_deleted = 0
171
+ BEGIN
172
+ DELETE FROM memories_fts WHERE memory_id = NEW.id;
173
+ INSERT INTO memories_fts (memory_id, content, summary)
174
+ VALUES (NEW.id, NEW.content, NEW.summary);
175
+ END;
176
+
177
+ -- Trigger: Delete from FTS when memory soft-deleted
178
+ CREATE TRIGGER IF NOT EXISTS memories_fts_delete
179
+ AFTER UPDATE OF is_deleted ON memories
180
+ WHEN NEW.is_deleted = 1
181
+ BEGIN
182
+ DELETE FROM memories_fts WHERE memory_id = NEW.id;
183
+ END;
184
+
185
+ -- Trigger: Add back to FTS if memory restored (is_deleted changed to 0)
186
+ CREATE TRIGGER IF NOT EXISTS memories_fts_restore
187
+ AFTER UPDATE OF is_deleted ON memories
188
+ WHEN NEW.is_deleted = 0 AND OLD.is_deleted = 1
189
+ BEGIN
190
+ INSERT INTO memories_fts (memory_id, content, summary)
191
+ VALUES (NEW.id, NEW.content, NEW.summary);
192
+ END;
193
+ `);
194
+ // Make embedding column nullable (no longer required)
195
+ // Note: SQLite doesn't support DROP COLUMN or ALTER COLUMN,
196
+ // so we just make it optional going forward
197
+ // Record migration
198
+ db.prepare('INSERT INTO schema_version (version, applied_at) VALUES (?, ?)').run(3, Date.now());
199
+ },
200
+ ];
201
+ // Apply each migration in sequence
202
+ for (let i = fromVersion; i < migrations.length; i++) {
203
+ const migration = migrations[i];
204
+ if (migration) {
205
+ db.transaction(() => {
206
+ migration(db);
207
+ })();
208
+ }
209
+ }
210
+ }
211
+ /**
212
+ * Create optimized views for common queries
213
+ */
214
+ export function createViews(db) {
215
+ // View: Active memories with entity counts
216
+ db.exec(`
217
+ CREATE VIEW IF NOT EXISTS v_active_memories AS
218
+ SELECT
219
+ m.*,
220
+ COUNT(me.entity_id) as entity_count
221
+ FROM memories m
222
+ LEFT JOIN memory_entities me ON m.id = me.memory_id
223
+ WHERE m.is_deleted = 0
224
+ AND (m.expires_at IS NULL OR m.expires_at > unixepoch() * 1000)
225
+ GROUP BY m.id;
226
+ `);
227
+ // View: Memory provenance chain
228
+ db.exec(`
229
+ CREATE VIEW IF NOT EXISTS v_memory_provenance AS
230
+ SELECT
231
+ m.id,
232
+ m.content,
233
+ m.type,
234
+ p.operation,
235
+ p.timestamp,
236
+ p.source,
237
+ p.context,
238
+ p.user_id
239
+ FROM memories m
240
+ LEFT JOIN provenance p ON m.id = p.memory_id
241
+ ORDER BY m.id, p.timestamp DESC;
242
+ `);
243
+ }
244
+ /**
245
+ * Optimize database for performance
246
+ */
247
+ export function optimizeDatabase(db) {
248
+ // Analyze tables for query optimization
249
+ db.exec('ANALYZE;');
250
+ // Set performance pragmas
251
+ db.pragma('journal_mode = WAL'); // Write-Ahead Logging for better concurrency
252
+ db.pragma('synchronous = NORMAL'); // Balance safety and speed
253
+ db.pragma('cache_size = -64000'); // 64MB cache
254
+ db.pragma('temp_store = MEMORY'); // Temp tables in memory
255
+ db.pragma('mmap_size = 30000000000'); // 30GB memory-mapped I/O
256
+ }
257
+ export function getDatabaseStats(db) {
258
+ const now = Date.now();
259
+ const stats = {
260
+ total_memories: db.prepare('SELECT COUNT(*) FROM memories').pluck().get(),
261
+ active_memories: db
262
+ .prepare('SELECT COUNT(*) FROM memories WHERE is_deleted = 0 AND (expires_at IS NULL OR expires_at > ?)')
263
+ .pluck()
264
+ .get(now),
265
+ deleted_memories: db
266
+ .prepare('SELECT COUNT(*) FROM memories WHERE is_deleted = 1')
267
+ .pluck()
268
+ .get(),
269
+ expired_memories: db
270
+ .prepare('SELECT COUNT(*) FROM memories WHERE is_deleted = 0 AND expires_at IS NOT NULL AND expires_at <= ?')
271
+ .pluck()
272
+ .get(now),
273
+ total_entities: db.prepare('SELECT COUNT(*) FROM entities').pluck().get(),
274
+ total_provenance_records: db.prepare('SELECT COUNT(*) FROM provenance').pluck().get(),
275
+ database_size_bytes: db
276
+ .prepare("SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size()")
277
+ .pluck()
278
+ .get(),
279
+ memory_avg_importance: db
280
+ .prepare('SELECT AVG(importance) FROM memories WHERE is_deleted = 0')
281
+ .pluck()
282
+ .get() || 0,
283
+ oldest_memory_age_days: (() => {
284
+ const oldest = db
285
+ .prepare('SELECT MIN(created_at) FROM memories WHERE is_deleted = 0')
286
+ .pluck()
287
+ .get();
288
+ return oldest ? Math.floor((now - oldest) / (1000 * 60 * 60 * 24)) : 0;
289
+ })(),
290
+ };
291
+ return stats;
292
+ }
293
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Entity extraction with NER-like patterns
3
+ */
4
+ import type { EntityType, EntityInput } from '../types/index.js';
5
+ /**
6
+ * Extract named entities from content
7
+ */
8
+ export declare function extractEntities(content: string): string[];
9
+ /**
10
+ * Classify entity type
11
+ */
12
+ export declare function classifyEntityType(name: string, context?: string): EntityType;
13
+ /**
14
+ * Create entity input from name and context
15
+ */
16
+ export declare function createEntityInput(name: string, context?: string): EntityInput;
17
+ /**
18
+ * Normalize entity name
19
+ */
20
+ export declare function normalizeEntityName(name: string): string;
21
+ /**
22
+ * Deduplicate entities (handle variations)
23
+ */
24
+ export declare function deduplicateEntities(entities: string[]): string[];
25
+ //# sourceMappingURL=entity-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-extractor.d.ts","sourceRoot":"","sources":["../../src/extractors/entity-extractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAqEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,UAAU,CA4EjF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,WAAW,CA+BjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAahE"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Entity extraction with NER-like patterns
3
+ */
4
+ /**
5
+ * Extract named entities from content
6
+ */
7
+ export function extractEntities(content) {
8
+ const entities = new Set();
9
+ // Pattern 1: Proper nouns (capitalized words/phrases)
10
+ const properNouns = content.match(/\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)*\b/g) || [];
11
+ properNouns.forEach((noun) => entities.add(noun));
12
+ // Pattern 2: Quoted entities
13
+ const quoted = content.match(/"([^"]+)"|'([^']+)'/g) || [];
14
+ quoted.forEach((q) => {
15
+ const cleaned = q.replace(/["']/g, '');
16
+ if (cleaned.length > 2) {
17
+ entities.add(cleaned);
18
+ }
19
+ });
20
+ // Pattern 3: Technical names (camelCase, PascalCase, kebab-case)
21
+ const technical = content.match(/\b[a-z]+[A-Z][a-zA-Z]*|[A-Z][a-z]+(?:[A-Z][a-z]+)+|[a-z]+-[a-z]+(?:-[a-z]+)*\b/g) || [];
22
+ technical.forEach((tech) => entities.add(tech));
23
+ // Pattern 4: Acronyms (2+ capital letters)
24
+ const acronyms = content.match(/\b[A-Z]{2,}\b/g) || [];
25
+ acronyms.forEach((acronym) => entities.add(acronym));
26
+ // Pattern 5: Project/product names (often have version numbers)
27
+ const versioned = content.match(/\b([A-Z][a-z]+(?:\s+[A-Z][a-z]+)*)\s+v?\d+\.\d+/gi) || [];
28
+ versioned.forEach((v) => {
29
+ const name = v.replace(/\s+v?\d+\.\d+/gi, '').trim();
30
+ if (name)
31
+ entities.add(name);
32
+ });
33
+ // Pattern 6: @mentions and #tags
34
+ const mentions = content.match(/@([a-zA-Z0-9_]+)|#([a-zA-Z0-9_]+)/g) || [];
35
+ mentions.forEach((mention) => {
36
+ const cleaned = mention.substring(1);
37
+ if (cleaned.length > 2) {
38
+ entities.add(cleaned);
39
+ }
40
+ });
41
+ // Filter out common words that might be capitalized
42
+ const commonWords = new Set([
43
+ 'I',
44
+ 'The',
45
+ 'A',
46
+ 'An',
47
+ 'This',
48
+ 'That',
49
+ 'These',
50
+ 'Those',
51
+ 'It',
52
+ 'He',
53
+ 'She',
54
+ 'They',
55
+ 'We',
56
+ 'You',
57
+ 'My',
58
+ 'Our',
59
+ 'Your',
60
+ ]);
61
+ return Array.from(entities).filter((entity) => {
62
+ // Remove single letters and common words
63
+ if (entity.length === 1 || commonWords.has(entity)) {
64
+ return false;
65
+ }
66
+ // Keep everything else
67
+ return true;
68
+ });
69
+ }
70
+ /**
71
+ * Classify entity type
72
+ */
73
+ export function classifyEntityType(name, context = '') {
74
+ const lowerContext = context.toLowerCase();
75
+ // Person indicators
76
+ const personPatterns = [
77
+ /\b(mr|mrs|ms|dr|prof|sr|jr)\b/,
78
+ /\b(person|user|developer|engineer|manager|designer|analyst|architect)\b/,
79
+ /\b(reports to|works with|team member|colleague)\b/,
80
+ ];
81
+ if (personPatterns.some((p) => p.test(lowerContext))) {
82
+ return 'person';
83
+ }
84
+ // Organization indicators
85
+ const orgPatterns = [
86
+ /\b(company|corporation|corp|inc|ltd|llc|org)\b/,
87
+ /\b(team|department|division|group|squad|tribe)\b/,
88
+ /\b(organization|startup|enterprise)\b/,
89
+ ];
90
+ if (orgPatterns.some((p) => p.test(lowerContext)) || /\b(Inc|Corp|LLC|Ltd)\b/.test(name)) {
91
+ return 'organization';
92
+ }
93
+ // Project indicators
94
+ const projectPatterns = [
95
+ /\b(project|initiative|program|feature|module|component)\b/,
96
+ /\b(v\d+\.\d+|version|release|sprint)\b/,
97
+ /\b(building|developing|implementing|working on)\b/,
98
+ ];
99
+ if (projectPatterns.some((p) => p.test(lowerContext))) {
100
+ return 'project';
101
+ }
102
+ // Technology indicators
103
+ const techPatterns = [
104
+ /\b(language|framework|library|tool|api|sdk|cli|ide)\b/,
105
+ /\b(typescript|javascript|python|java|rust|go)\b/,
106
+ /\b(react|vue|angular|node|express|django|rails)\b/,
107
+ /\.(js|ts|py|java|rs|go|rb|php|c|cpp|cs)\b/,
108
+ ];
109
+ if (techPatterns.some((p) => p.test(lowerContext)) ||
110
+ /[A-Z][a-z]+(?:[A-Z][a-z]+)+/.test(name) // PascalCase
111
+ ) {
112
+ return 'technology';
113
+ }
114
+ // Location indicators
115
+ const locationPatterns = [
116
+ /\b(city|country|state|region|office|headquarters|located|based in)\b/,
117
+ /\b(street|avenue|road|building|floor)\b/,
118
+ ];
119
+ if (locationPatterns.some((p) => p.test(lowerContext))) {
120
+ return 'location';
121
+ }
122
+ // Document indicators
123
+ const documentPatterns = [
124
+ /\b(document|file|spec|specification|readme|guide|manual|documentation)\b/,
125
+ /\.(pdf|doc|docx|txt|md|html|json|xml|yaml|yml)\b/,
126
+ ];
127
+ if (documentPatterns.some((p) => p.test(lowerContext))) {
128
+ return 'document';
129
+ }
130
+ // Concept indicators
131
+ const conceptPatterns = [
132
+ /\b(pattern|principle|methodology|paradigm|concept|idea|approach)\b/,
133
+ /\b(architecture|design|model|strategy|technique)\b/,
134
+ ];
135
+ if (conceptPatterns.some((p) => p.test(lowerContext))) {
136
+ return 'concept';
137
+ }
138
+ // Default to 'other' if can't determine
139
+ return 'other';
140
+ }
141
+ /**
142
+ * Create entity input from name and context
143
+ */
144
+ export function createEntityInput(name, context = '') {
145
+ const type = classifyEntityType(name, context);
146
+ const metadata = {};
147
+ // Extract version if present
148
+ const versionMatch = context.match(/v?(\d+\.\d+(?:\.\d+)?)/);
149
+ if (versionMatch) {
150
+ metadata['version'] = versionMatch[1];
151
+ }
152
+ // Extract role for persons
153
+ if (type === 'person') {
154
+ const roleMatch = context.match(/\b(developer|engineer|manager|designer|analyst|architect|lead|senior|junior)\b/i);
155
+ if (roleMatch) {
156
+ metadata['role'] = roleMatch[1]?.toLowerCase();
157
+ }
158
+ }
159
+ // Extract status for projects
160
+ if (type === 'project') {
161
+ const statusMatch = context.match(/\b(active|inactive|completed|in-progress|planning|archived)\b/i);
162
+ if (statusMatch) {
163
+ metadata['status'] = statusMatch[1]?.toLowerCase();
164
+ }
165
+ }
166
+ return {
167
+ name,
168
+ type,
169
+ metadata,
170
+ };
171
+ }
172
+ /**
173
+ * Normalize entity name
174
+ */
175
+ export function normalizeEntityName(name) {
176
+ return name
177
+ .trim()
178
+ .replace(/\s+/g, ' ') // Normalize whitespace
179
+ .replace(/^(the|a|an)\s+/i, ''); // Remove articles
180
+ }
181
+ /**
182
+ * Deduplicate entities (handle variations)
183
+ */
184
+ export function deduplicateEntities(entities) {
185
+ const normalized = new Map();
186
+ for (const entity of entities) {
187
+ const norm = normalizeEntityName(entity).toLowerCase();
188
+ // If we haven't seen this normalized form, or current is longer (more complete)
189
+ if (!normalized.has(norm) || entity.length > (normalized.get(norm)?.length ?? 0)) {
190
+ normalized.set(norm, entity);
191
+ }
192
+ }
193
+ return Array.from(normalized.values());
194
+ }
195
+ //# sourceMappingURL=entity-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-extractor.js","sourceRoot":"","sources":["../../src/extractors/entity-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Fact extraction from content
3
+ */
4
+ import type { MemoryType } from '../types/index.js';
5
+ /**
6
+ * Check if content qualifies as a fact
7
+ */
8
+ export declare function isFact(content: string): boolean;
9
+ /**
10
+ * Classify memory type based on content
11
+ */
12
+ export declare function classifyMemoryType(content: string, entities: string[]): MemoryType;
13
+ /**
14
+ * Detect user preferences in content
15
+ */
16
+ export declare function isUserPreference(content: string): boolean;
17
+ /**
18
+ * Detect explicit vs implicit facts
19
+ */
20
+ export declare function isExplicit(content: string): boolean;
21
+ /**
22
+ * Calculate content complexity (0-1)
23
+ */
24
+ export declare function calculateComplexity(content: string): number;
25
+ /**
26
+ * Normalize content for storage
27
+ */
28
+ export declare function normalizeContent(content: string): string;
29
+ /**
30
+ * Validate content before storage
31
+ */
32
+ export interface ValidationResult {
33
+ valid: boolean;
34
+ errors: string[];
35
+ warnings: string[];
36
+ }
37
+ export declare function validateContent(content: string, type: MemoryType): ValidationResult;
38
+ //# sourceMappingURL=fact-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fact-extractor.d.ts","sourceRoot":"","sources":["../../src/extractors/fact-extractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA8B/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU,CAiClF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQzD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAoBnD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyB3D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,gBAAgB,CAuCnF"}