@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.
- package/LICENSE +21 -0
- package/README.md +263 -0
- package/dist/database/connection.d.ts +47 -0
- package/dist/database/connection.d.ts.map +1 -0
- package/dist/database/connection.js +151 -0
- package/dist/database/connection.js.map +1 -0
- package/dist/database/schema.d.ts +33 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +293 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/extractors/entity-extractor.d.ts +25 -0
- package/dist/extractors/entity-extractor.d.ts.map +1 -0
- package/dist/extractors/entity-extractor.js +195 -0
- package/dist/extractors/entity-extractor.js.map +1 -0
- package/dist/extractors/fact-extractor.d.ts +38 -0
- package/dist/extractors/fact-extractor.d.ts.map +1 -0
- package/dist/extractors/fact-extractor.js +172 -0
- package/dist/extractors/fact-extractor.js.map +1 -0
- package/dist/extractors/summary-generator.d.ts +28 -0
- package/dist/extractors/summary-generator.d.ts.map +1 -0
- package/dist/extractors/summary-generator.js +149 -0
- package/dist/extractors/summary-generator.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +229 -0
- package/dist/index.js.map +1 -0
- package/dist/scoring/importance.d.ts +39 -0
- package/dist/scoring/importance.d.ts.map +1 -0
- package/dist/scoring/importance.js +150 -0
- package/dist/scoring/importance.js.map +1 -0
- package/dist/scoring/ttl-manager.d.ts +33 -0
- package/dist/scoring/ttl-manager.d.ts.map +1 -0
- package/dist/scoring/ttl-manager.js +99 -0
- package/dist/scoring/ttl-manager.js.map +1 -0
- package/dist/search/semantic-search.d.ts +15 -0
- package/dist/search/semantic-search.d.ts.map +1 -0
- package/dist/search/semantic-search.js +236 -0
- package/dist/search/semantic-search.js.map +1 -0
- package/dist/tools/memory-forget.d.ts +10 -0
- package/dist/tools/memory-forget.d.ts.map +1 -0
- package/dist/tools/memory-forget.js +34 -0
- package/dist/tools/memory-forget.js.map +1 -0
- package/dist/tools/memory-recall.d.ts +12 -0
- package/dist/tools/memory-recall.d.ts.map +1 -0
- package/dist/tools/memory-recall.js +106 -0
- package/dist/tools/memory-recall.js.map +1 -0
- package/dist/tools/memory-store.d.ts +13 -0
- package/dist/tools/memory-store.d.ts.map +1 -0
- package/dist/tools/memory-store.js +279 -0
- package/dist/tools/memory-store.js.map +1 -0
- package/dist/tools/response-formatter.d.ts +71 -0
- package/dist/tools/response-formatter.d.ts.map +1 -0
- package/dist/tools/response-formatter.js +180 -0
- package/dist/tools/response-formatter.js.map +1 -0
- package/dist/types/index.d.ts +244 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +29 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/token-estimator.d.ts +33 -0
- package/dist/utils/token-estimator.d.ts.map +1 -0
- package/dist/utils/token-estimator.js +54 -0
- package/dist/utils/token-estimator.js.map +1 -0
- 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"}
|