cortex-mcp 1.0.1

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 (176) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +202 -0
  4. package/dist/cli/setup.d.ts +12 -0
  5. package/dist/cli/setup.d.ts.map +1 -0
  6. package/dist/cli/setup.js +293 -0
  7. package/dist/cli/setup.js.map +1 -0
  8. package/dist/config/config.d.ts +13 -0
  9. package/dist/config/config.d.ts.map +1 -0
  10. package/dist/config/config.js +33 -0
  11. package/dist/config/config.js.map +1 -0
  12. package/dist/core/event-bus.d.ts +19 -0
  13. package/dist/core/event-bus.d.ts.map +1 -0
  14. package/dist/core/event-bus.js +51 -0
  15. package/dist/core/event-bus.js.map +1 -0
  16. package/dist/db/database.d.ts +19 -0
  17. package/dist/db/database.d.ts.map +1 -0
  18. package/dist/db/database.js +254 -0
  19. package/dist/db/database.js.map +1 -0
  20. package/dist/db/event-log.d.ts +28 -0
  21. package/dist/db/event-log.d.ts.map +1 -0
  22. package/dist/db/event-log.js +87 -0
  23. package/dist/db/event-log.js.map +1 -0
  24. package/dist/db/memory-store.d.ts +65 -0
  25. package/dist/db/memory-store.d.ts.map +1 -0
  26. package/dist/db/memory-store.js +370 -0
  27. package/dist/db/memory-store.js.map +1 -0
  28. package/dist/embedding-worker.d.ts +3 -0
  29. package/dist/embedding-worker.d.ts.map +1 -0
  30. package/dist/embedding-worker.js +94 -0
  31. package/dist/embedding-worker.js.map +1 -0
  32. package/dist/hooks/cortex-run.d.ts +15 -0
  33. package/dist/hooks/cortex-run.d.ts.map +1 -0
  34. package/dist/hooks/cortex-run.js +148 -0
  35. package/dist/hooks/cortex-run.js.map +1 -0
  36. package/dist/hooks/git-capture.d.ts +21 -0
  37. package/dist/hooks/git-capture.d.ts.map +1 -0
  38. package/dist/hooks/git-capture.js +178 -0
  39. package/dist/hooks/git-capture.js.map +1 -0
  40. package/dist/hooks/git-hooks.d.ts +12 -0
  41. package/dist/hooks/git-hooks.d.ts.map +1 -0
  42. package/dist/hooks/git-hooks.js +130 -0
  43. package/dist/hooks/git-hooks.js.map +1 -0
  44. package/dist/mcp-stdio.d.ts +10 -0
  45. package/dist/mcp-stdio.d.ts.map +1 -0
  46. package/dist/mcp-stdio.js +247 -0
  47. package/dist/mcp-stdio.js.map +1 -0
  48. package/dist/memory/anticipation-engine.d.ts +19 -0
  49. package/dist/memory/anticipation-engine.d.ts.map +1 -0
  50. package/dist/memory/anticipation-engine.js +76 -0
  51. package/dist/memory/anticipation-engine.js.map +1 -0
  52. package/dist/memory/attention-ranker.d.ts +19 -0
  53. package/dist/memory/attention-ranker.d.ts.map +1 -0
  54. package/dist/memory/attention-ranker.js +97 -0
  55. package/dist/memory/attention-ranker.js.map +1 -0
  56. package/dist/memory/auto-learner.d.ts +20 -0
  57. package/dist/memory/auto-learner.d.ts.map +1 -0
  58. package/dist/memory/auto-learner.js +179 -0
  59. package/dist/memory/auto-learner.js.map +1 -0
  60. package/dist/memory/confidence-decay.d.ts +22 -0
  61. package/dist/memory/confidence-decay.d.ts.map +1 -0
  62. package/dist/memory/confidence-decay.js +54 -0
  63. package/dist/memory/confidence-decay.js.map +1 -0
  64. package/dist/memory/embedding-manager.d.ts +5 -0
  65. package/dist/memory/embedding-manager.d.ts.map +1 -0
  66. package/dist/memory/embedding-manager.js +118 -0
  67. package/dist/memory/embedding-manager.js.map +1 -0
  68. package/dist/memory/export-import.d.ts +49 -0
  69. package/dist/memory/export-import.d.ts.map +1 -0
  70. package/dist/memory/export-import.js +131 -0
  71. package/dist/memory/export-import.js.map +1 -0
  72. package/dist/memory/git-memory.d.ts +15 -0
  73. package/dist/memory/git-memory.d.ts.map +1 -0
  74. package/dist/memory/git-memory.js +178 -0
  75. package/dist/memory/git-memory.js.map +1 -0
  76. package/dist/memory/learning-rate.d.ts +24 -0
  77. package/dist/memory/learning-rate.d.ts.map +1 -0
  78. package/dist/memory/learning-rate.js +95 -0
  79. package/dist/memory/learning-rate.js.map +1 -0
  80. package/dist/memory/llm-enhancer.d.ts +54 -0
  81. package/dist/memory/llm-enhancer.d.ts.map +1 -0
  82. package/dist/memory/llm-enhancer.js +270 -0
  83. package/dist/memory/llm-enhancer.js.map +1 -0
  84. package/dist/memory/memory-cache.d.ts +5 -0
  85. package/dist/memory/memory-cache.d.ts.map +1 -0
  86. package/dist/memory/memory-cache.js +37 -0
  87. package/dist/memory/memory-cache.js.map +1 -0
  88. package/dist/memory/memory-consolidator.d.ts +14 -0
  89. package/dist/memory/memory-consolidator.d.ts.map +1 -0
  90. package/dist/memory/memory-consolidator.js +156 -0
  91. package/dist/memory/memory-consolidator.js.map +1 -0
  92. package/dist/memory/memory-decay.d.ts +10 -0
  93. package/dist/memory/memory-decay.d.ts.map +1 -0
  94. package/dist/memory/memory-decay.js +79 -0
  95. package/dist/memory/memory-decay.js.map +1 -0
  96. package/dist/memory/memory-quality.d.ts +37 -0
  97. package/dist/memory/memory-quality.d.ts.map +1 -0
  98. package/dist/memory/memory-quality.js +203 -0
  99. package/dist/memory/memory-quality.js.map +1 -0
  100. package/dist/memory/memory-ranker.d.ts +14 -0
  101. package/dist/memory/memory-ranker.d.ts.map +1 -0
  102. package/dist/memory/memory-ranker.js +68 -0
  103. package/dist/memory/memory-ranker.js.map +1 -0
  104. package/dist/memory/meta-memory.d.ts +11 -0
  105. package/dist/memory/meta-memory.d.ts.map +1 -0
  106. package/dist/memory/meta-memory.js +141 -0
  107. package/dist/memory/meta-memory.js.map +1 -0
  108. package/dist/memory/session-tracker.d.ts +39 -0
  109. package/dist/memory/session-tracker.d.ts.map +1 -0
  110. package/dist/memory/session-tracker.js +127 -0
  111. package/dist/memory/session-tracker.js.map +1 -0
  112. package/dist/memory/temporal-engine.d.ts +25 -0
  113. package/dist/memory/temporal-engine.d.ts.map +1 -0
  114. package/dist/memory/temporal-engine.js +106 -0
  115. package/dist/memory/temporal-engine.js.map +1 -0
  116. package/dist/retrieval/hybrid-retriever.d.ts +23 -0
  117. package/dist/retrieval/hybrid-retriever.d.ts.map +1 -0
  118. package/dist/retrieval/hybrid-retriever.js +120 -0
  119. package/dist/retrieval/hybrid-retriever.js.map +1 -0
  120. package/dist/scanners/architecture-graph.d.ts +30 -0
  121. package/dist/scanners/architecture-graph.d.ts.map +1 -0
  122. package/dist/scanners/architecture-graph.js +315 -0
  123. package/dist/scanners/architecture-graph.js.map +1 -0
  124. package/dist/scanners/code-verifier.d.ts +70 -0
  125. package/dist/scanners/code-verifier.d.ts.map +1 -0
  126. package/dist/scanners/code-verifier.js +374 -0
  127. package/dist/scanners/code-verifier.js.map +1 -0
  128. package/dist/scanners/context-builder.d.ts +19 -0
  129. package/dist/scanners/context-builder.d.ts.map +1 -0
  130. package/dist/scanners/context-builder.js +102 -0
  131. package/dist/scanners/context-builder.js.map +1 -0
  132. package/dist/scanners/export-map.d.ts +22 -0
  133. package/dist/scanners/export-map.d.ts.map +1 -0
  134. package/dist/scanners/export-map.js +249 -0
  135. package/dist/scanners/export-map.js.map +1 -0
  136. package/dist/scanners/file-verifier.d.ts +22 -0
  137. package/dist/scanners/file-verifier.d.ts.map +1 -0
  138. package/dist/scanners/file-verifier.js +140 -0
  139. package/dist/scanners/file-verifier.js.map +1 -0
  140. package/dist/scanners/project-scanner.d.ts +31 -0
  141. package/dist/scanners/project-scanner.d.ts.map +1 -0
  142. package/dist/scanners/project-scanner.js +398 -0
  143. package/dist/scanners/project-scanner.js.map +1 -0
  144. package/dist/security/encryption.d.ts +15 -0
  145. package/dist/security/encryption.d.ts.map +1 -0
  146. package/dist/security/encryption.js +116 -0
  147. package/dist/security/encryption.js.map +1 -0
  148. package/dist/security/feature-gate.d.ts +30 -0
  149. package/dist/security/feature-gate.d.ts.map +1 -0
  150. package/dist/security/feature-gate.js +91 -0
  151. package/dist/security/feature-gate.js.map +1 -0
  152. package/dist/security/license.d.ts +24 -0
  153. package/dist/security/license.d.ts.map +1 -0
  154. package/dist/security/license.js +168 -0
  155. package/dist/security/license.js.map +1 -0
  156. package/dist/security/rate-limiter.d.ts +20 -0
  157. package/dist/security/rate-limiter.d.ts.map +1 -0
  158. package/dist/security/rate-limiter.js +60 -0
  159. package/dist/security/rate-limiter.js.map +1 -0
  160. package/dist/server/dashboard.d.ts +3 -0
  161. package/dist/server/dashboard.d.ts.map +1 -0
  162. package/dist/server/dashboard.js +258 -0
  163. package/dist/server/dashboard.js.map +1 -0
  164. package/dist/server/mcp-handler.d.ts +12 -0
  165. package/dist/server/mcp-handler.d.ts.map +1 -0
  166. package/dist/server/mcp-handler.js +1392 -0
  167. package/dist/server/mcp-handler.js.map +1 -0
  168. package/dist/strategies/embedders/local-minilm.d.ts +35 -0
  169. package/dist/strategies/embedders/local-minilm.d.ts.map +1 -0
  170. package/dist/strategies/embedders/local-minilm.js +176 -0
  171. package/dist/strategies/embedders/local-minilm.js.map +1 -0
  172. package/dist/types.d.ts +207 -0
  173. package/dist/types.d.ts.map +1 -0
  174. package/dist/types.js +83 -0
  175. package/dist/types.js.map +1 -0
  176. package/package.json +87 -0
@@ -0,0 +1,370 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryStore = void 0;
4
+ /**
5
+ * Memory Store — CRUD for memory_units, edges, and vector search.
6
+ * Uses JS cosine similarity for M1 (no native extension needed).
7
+ */
8
+ const uuid_1 = require("uuid");
9
+ class MemoryStore {
10
+ db;
11
+ // Prepared statements
12
+ insertMemoryStmt;
13
+ updateMemoryStmt;
14
+ getMemoryStmt;
15
+ deactivateStmt;
16
+ touchStmt;
17
+ insertEdgeStmt;
18
+ insertVectorStmt;
19
+ // In-memory vector index (JS fallback for M1)
20
+ vectors = new Map();
21
+ constructor(database) {
22
+ this.db = database.connection;
23
+ // Create vector table (simple key-value for M1)
24
+ this.db.exec(`
25
+ CREATE TABLE IF NOT EXISTS memory_vectors (
26
+ id TEXT PRIMARY KEY,
27
+ embedding BLOB NOT NULL
28
+ )
29
+ `);
30
+ // Index for faster filtering by type/status
31
+ this.db.exec(`CREATE INDEX IF NOT EXISTS idx_memories_type_active ON memory_units(type, is_active);`);
32
+ this.db.exec(`CREATE INDEX IF NOT EXISTS idx_memories_created ON memory_units(created_at);`);
33
+ this.insertMemoryStmt = this.db.prepare(`
34
+ INSERT INTO memory_units (
35
+ id, type, intent, action, reason, impact, outcome,
36
+ related_files, code_snippet, tags, timestamp,
37
+ confidence, importance, access_count, last_accessed,
38
+ superseded_by, is_active, source_event_id, created_at
39
+ ) VALUES (
40
+ @id, @type, @intent, @action, @reason, @impact, @outcome,
41
+ @relatedFiles, @codeSnippet, @tags, @timestamp,
42
+ @confidence, @importance, 0, NULL,
43
+ NULL, 1, @sourceEventId, @createdAt
44
+ )
45
+ `);
46
+ this.updateMemoryStmt = this.db.prepare(`
47
+ UPDATE memory_units SET
48
+ intent = @intent, action = @action, reason = @reason,
49
+ impact = @impact, outcome = @outcome,
50
+ related_files = @relatedFiles, code_snippet = @codeSnippet,
51
+ tags = @tags, confidence = @confidence, importance = @importance,
52
+ timestamp = @timestamp
53
+ WHERE id = @id
54
+ `);
55
+ this.getMemoryStmt = this.db.prepare('SELECT * FROM memory_units WHERE id = ?');
56
+ this.deactivateStmt = this.db.prepare('UPDATE memory_units SET is_active = 0, superseded_by = @supersededBy WHERE id = @id');
57
+ this.touchStmt = this.db.prepare('UPDATE memory_units SET access_count = access_count + 1, last_accessed = @lastAccessed WHERE id = @id');
58
+ this.insertEdgeStmt = this.db.prepare(`
59
+ INSERT OR REPLACE INTO edges (source_id, target_id, relation, weight, timestamp)
60
+ VALUES (@sourceId, @targetId, @relation, @weight, @timestamp)
61
+ `);
62
+ this.insertVectorStmt = this.db.prepare('INSERT OR REPLACE INTO memory_vectors (id, embedding) VALUES (@id, @embedding)');
63
+ // Load existing vectors into memory for fast JS cosine search
64
+ this.loadVectors();
65
+ }
66
+ // ═══ MEMORY CRUD ═══
67
+ /** Create a new memory unit (with deduplication) */
68
+ add(memory) {
69
+ // ── Deduplication: skip if very similar memory already exists ──
70
+ const duplicate = this.findDuplicate(memory.type, memory.intent);
71
+ if (duplicate) {
72
+ // Touch the existing memory to refresh its recency
73
+ this.touch(duplicate.id);
74
+ return duplicate;
75
+ }
76
+ const now = Date.now();
77
+ const id = memory.id || (0, uuid_1.v4)();
78
+ const full = {
79
+ id,
80
+ type: memory.type,
81
+ intent: memory.intent,
82
+ action: memory.action,
83
+ reason: memory.reason,
84
+ impact: memory.impact,
85
+ outcome: memory.outcome || 'unknown',
86
+ relatedFiles: memory.relatedFiles || [],
87
+ codeSnippet: memory.codeSnippet,
88
+ tags: memory.tags || [],
89
+ timestamp: memory.timestamp || now,
90
+ confidence: memory.confidence ?? 0.5,
91
+ importance: memory.importance ?? 0.5,
92
+ accessCount: 0,
93
+ lastAccessed: undefined,
94
+ supersededBy: undefined,
95
+ isActive: true,
96
+ sourceEventId: memory.sourceEventId,
97
+ createdAt: now,
98
+ };
99
+ this.insertMemoryStmt.run({
100
+ id: full.id,
101
+ type: full.type,
102
+ intent: full.intent,
103
+ action: full.action,
104
+ reason: full.reason || null,
105
+ impact: full.impact || null,
106
+ outcome: full.outcome,
107
+ relatedFiles: JSON.stringify(full.relatedFiles),
108
+ codeSnippet: full.codeSnippet || null,
109
+ tags: JSON.stringify(full.tags),
110
+ timestamp: full.timestamp,
111
+ confidence: full.confidence,
112
+ importance: full.importance,
113
+ sourceEventId: full.sourceEventId || null,
114
+ createdAt: full.createdAt,
115
+ });
116
+ return full;
117
+ }
118
+ /**
119
+ * Find a duplicate memory by type + intent similarity.
120
+ * Uses word-overlap (Jaccard similarity) — no ML needed.
121
+ * Returns existing memory if similarity > 0.7, else undefined.
122
+ */
123
+ findDuplicate(type, intent) {
124
+ const candidates = this.db
125
+ .prepare('SELECT * FROM memory_units WHERE type = ? AND is_active = 1 LIMIT 200')
126
+ .all(type);
127
+ const newWords = new Set(this.tokenize(intent));
128
+ if (newWords.size === 0)
129
+ return undefined;
130
+ for (const row of candidates) {
131
+ const existingWords = new Set(this.tokenize(row.intent));
132
+ const intersection = [...newWords].filter(w => existingWords.has(w)).length;
133
+ const union = new Set([...newWords, ...existingWords]).size;
134
+ const similarity = union > 0 ? intersection / union : 0;
135
+ if (similarity >= 0.7) {
136
+ return this.rowToMemory(row);
137
+ }
138
+ }
139
+ return undefined;
140
+ }
141
+ /** Tokenize text into lowercase words (stop-word filtered) */
142
+ tokenize(text) {
143
+ const STOP_WORDS = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'use', 'always', 'never', 'should', 'must', 'not', 'do', 'be', 'it', 'this', 'that', 'and', 'or', 'but']);
144
+ return text
145
+ .toLowerCase()
146
+ .replace(/[^a-z0-9\s]/g, ' ')
147
+ .split(/\s+/)
148
+ .filter(w => w.length > 2 && !STOP_WORDS.has(w));
149
+ }
150
+ /** Update an existing memory */
151
+ update(id, updates) {
152
+ const existing = this.get(id);
153
+ if (!existing)
154
+ return;
155
+ this.updateMemoryStmt.run({
156
+ id,
157
+ intent: updates.intent || existing.intent,
158
+ action: updates.action || existing.action,
159
+ reason: updates.reason ?? existing.reason ?? null,
160
+ impact: updates.impact ?? existing.impact ?? null,
161
+ outcome: updates.outcome ?? existing.outcome,
162
+ relatedFiles: JSON.stringify(updates.relatedFiles || existing.relatedFiles),
163
+ codeSnippet: updates.codeSnippet ?? existing.codeSnippet ?? null,
164
+ tags: JSON.stringify(updates.tags || existing.tags),
165
+ confidence: updates.confidence ?? existing.confidence,
166
+ importance: updates.importance ?? existing.importance,
167
+ timestamp: updates.timestamp || existing.timestamp,
168
+ });
169
+ }
170
+ /** Get a memory by ID */
171
+ get(id) {
172
+ const row = this.getMemoryStmt.get(id);
173
+ return row ? this.rowToMemory(row) : undefined;
174
+ }
175
+ /** Deactivate a memory (soft delete) */
176
+ deactivate(id, supersededBy) {
177
+ this.deactivateStmt.run({ supersededBy: supersededBy || null, id });
178
+ }
179
+ /** Record an access (for importance tracking) */
180
+ touch(id) {
181
+ this.touchStmt.run({ lastAccessed: Date.now(), id });
182
+ }
183
+ /** Get all active memories */
184
+ getActive(limit = 1000) {
185
+ const rows = this.db
186
+ .prepare('SELECT * FROM memory_units WHERE is_active = 1 ORDER BY timestamp DESC LIMIT ?')
187
+ .all(limit);
188
+ return rows.map(this.rowToMemory);
189
+ }
190
+ /** Get memories by type */
191
+ getByType(type, limit = 100) {
192
+ const rows = this.db
193
+ .prepare('SELECT * FROM memory_units WHERE type = ? AND is_active = 1 ORDER BY timestamp DESC LIMIT ?')
194
+ .all(type, limit);
195
+ return rows.map(this.rowToMemory);
196
+ }
197
+ /** Get memories related to a file */
198
+ getByFile(filePath, limit = 50) {
199
+ // Search in related_files JSON array
200
+ const rows = this.db
201
+ .prepare(`SELECT * FROM memory_units WHERE is_active = 1
202
+ AND related_files LIKE ? ORDER BY timestamp DESC LIMIT ?`)
203
+ .all(`%${filePath}%`, limit);
204
+ return rows.map(this.rowToMemory);
205
+ }
206
+ /** Full-text search via FTS5 */
207
+ searchFTS(query, limit = 20) {
208
+ const rows = this.db
209
+ .prepare(`
210
+ SELECT m.*, fts.rank
211
+ FROM memory_fts fts
212
+ JOIN memory_units m ON m.id = fts.id
213
+ WHERE memory_fts MATCH ? AND m.is_active = 1
214
+ ORDER BY fts.rank
215
+ LIMIT ?
216
+ `)
217
+ .all(query, limit);
218
+ return rows.map((row) => ({
219
+ memory: this.rowToMemory(row),
220
+ score: -row.rank, // FTS5 rank is negative (lower = better)
221
+ matchMethod: 'fts',
222
+ }));
223
+ }
224
+ // ═══ VECTOR SEARCH (JS cosine similarity — M1 fallback) ═══
225
+ /** Store a vector embedding */
226
+ storeVector(id, embedding) {
227
+ const buffer = Buffer.from(embedding.buffer);
228
+ this.insertVectorStmt.run({ id, embedding: buffer });
229
+ this.vectors.set(id, embedding);
230
+ }
231
+ /** Search by vector similarity */
232
+ searchVector(queryEmbedding, limit = 20) {
233
+ const results = [];
234
+ for (const [id, vec] of this.vectors) {
235
+ const sim = this.cosineSimilarity(queryEmbedding, vec);
236
+ results.push({ id, score: sim });
237
+ }
238
+ results.sort((a, b) => b.score - a.score);
239
+ return results.slice(0, limit).map((r) => {
240
+ const memory = this.get(r.id);
241
+ return {
242
+ memory: memory,
243
+ score: r.score,
244
+ matchMethod: 'vector',
245
+ };
246
+ }).filter((r) => r.memory && r.memory.isActive);
247
+ }
248
+ cosineSimilarity(a, b) {
249
+ let dot = 0, magA = 0, magB = 0;
250
+ for (let i = 0; i < a.length; i++) {
251
+ dot += a[i] * b[i];
252
+ magA += a[i] * a[i];
253
+ magB += b[i] * b[i];
254
+ }
255
+ const mag = Math.sqrt(magA) * Math.sqrt(magB);
256
+ return mag === 0 ? 0 : dot / mag;
257
+ }
258
+ loadVectors() {
259
+ const rows = this.db.prepare('SELECT id, embedding FROM memory_vectors').all();
260
+ for (const row of rows) {
261
+ const buffer = row.embedding;
262
+ const embedding = new Float32Array(buffer.buffer, buffer.byteOffset, buffer.length / 4);
263
+ this.vectors.set(row.id, embedding);
264
+ }
265
+ }
266
+ // ═══ GRAPH EDGES ═══
267
+ /** Add an edge between memories */
268
+ addEdge(edge) {
269
+ this.insertEdgeStmt.run({
270
+ sourceId: edge.sourceId,
271
+ targetId: edge.targetId,
272
+ relation: edge.relation,
273
+ weight: edge.weight,
274
+ timestamp: edge.timestamp,
275
+ });
276
+ }
277
+ /** Get edges from a source memory */
278
+ getEdgesFrom(sourceId) {
279
+ return this.db
280
+ .prepare('SELECT * FROM edges WHERE source_id = ?')
281
+ .all(sourceId);
282
+ }
283
+ /** Get edges to a target memory */
284
+ getEdgesTo(targetId) {
285
+ return this.db
286
+ .prepare('SELECT * FROM edges WHERE target_id = ?')
287
+ .all(targetId);
288
+ }
289
+ /** Graph traversal — find related memories within N hops */
290
+ getRelated(memoryId, maxHops = 2, limit = 20) {
291
+ // Recursive CTE for graph traversal
292
+ const rows = this.db
293
+ .prepare(`
294
+ WITH RECURSIVE related(id, depth, path) AS (
295
+ SELECT target_id, 1, source_id || '→' || target_id
296
+ FROM edges WHERE source_id = ?
297
+ UNION ALL
298
+ SELECT e.target_id, r.depth + 1, r.path || '→' || e.target_id
299
+ FROM edges e
300
+ JOIN related r ON e.source_id = r.id
301
+ WHERE r.depth < ?
302
+ AND r.path NOT LIKE '%' || e.target_id || '%'
303
+ )
304
+ SELECT DISTINCT m.*, r.depth
305
+ FROM related r
306
+ JOIN memory_units m ON m.id = r.id
307
+ WHERE m.is_active = 1
308
+ ORDER BY r.depth ASC
309
+ LIMIT ?
310
+ `)
311
+ .all(memoryId, maxHops, limit);
312
+ return rows.map((row) => ({
313
+ memory: this.rowToMemory(row),
314
+ score: 1.0 / (row.depth + 1), // closer = higher score
315
+ matchMethod: 'graph',
316
+ }));
317
+ }
318
+ // ═══ STATS ═══
319
+ /** Total active memories */
320
+ activeCount() {
321
+ const row = this.db
322
+ .prepare('SELECT COUNT(*) as cnt FROM memory_units WHERE is_active = 1')
323
+ .get();
324
+ return row.cnt;
325
+ }
326
+ /** Total memories (including inactive) */
327
+ totalCount() {
328
+ const row = this.db
329
+ .prepare('SELECT COUNT(*) as cnt FROM memory_units')
330
+ .get();
331
+ return row.cnt;
332
+ }
333
+ // ═══ HELPERS ═══
334
+ rowToMemory(row) {
335
+ return {
336
+ id: row.id,
337
+ type: row.type,
338
+ intent: row.intent,
339
+ action: row.action,
340
+ reason: row.reason || undefined,
341
+ impact: row.impact || undefined,
342
+ outcome: row.outcome || 'unknown',
343
+ relatedFiles: row.related_files ? JSON.parse(row.related_files) : [],
344
+ codeSnippet: row.code_snippet || undefined,
345
+ tags: row.tags ? JSON.parse(row.tags) : [],
346
+ timestamp: row.timestamp,
347
+ confidence: row.confidence,
348
+ importance: row.importance,
349
+ accessCount: row.access_count,
350
+ lastAccessed: row.last_accessed || undefined,
351
+ supersededBy: row.superseded_by || undefined,
352
+ isActive: row.is_active === 1,
353
+ sourceEventId: row.source_event_id || undefined,
354
+ createdAt: row.created_at,
355
+ };
356
+ }
357
+ rebuildIndex() {
358
+ console.log(' [cortex-mcp] Rebuilding FTS5 Search Index...');
359
+ try {
360
+ this.db.exec("INSERT INTO memory_fts(memory_fts) VALUES('rebuild');");
361
+ this.db.exec("VACUUM;");
362
+ console.log(' [cortex-mcp] Index rebuilt and database optimized.');
363
+ }
364
+ catch (err) {
365
+ console.error(' [ERROR] Rebuild failed:', err.message);
366
+ }
367
+ }
368
+ }
369
+ exports.MemoryStore = MemoryStore;
370
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/db/memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=embedding-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-worker.d.ts","sourceRoot":"","sources":["../src/embedding-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ /**
38
+ * Embedding Worker Thread — Runs MiniLM in a separate thread.
39
+ *
40
+ * Never blocks the main event loop. Main thread sends text,
41
+ * worker returns Float32Array embeddings asynchronously.
42
+ */
43
+ // SILENCE WORKER THREAD (prevent protocol corruption)
44
+ console.log = () => { };
45
+ console.warn = () => { };
46
+ console.error = () => { };
47
+ const worker_threads_1 = require("worker_threads");
48
+ let pipeline = null;
49
+ let modelReady = false;
50
+ async function loadModel() {
51
+ try {
52
+ const { pipeline: createPipeline } = await Promise.resolve().then(() => __importStar(require('@xenova/transformers')));
53
+ pipeline = await createPipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2', {
54
+ quantized: true,
55
+ progress_callback: (x) => { }, // SILENCE PROGRESS BARS
56
+ });
57
+ modelReady = true;
58
+ worker_threads_1.parentPort?.postMessage({ type: 'ready' });
59
+ }
60
+ catch (err) {
61
+ worker_threads_1.parentPort?.postMessage({ type: 'error', id: '__init__', message: err.message });
62
+ }
63
+ }
64
+ worker_threads_1.parentPort?.on('message', async (msg) => {
65
+ if (msg.type !== 'embed')
66
+ return;
67
+ if (!modelReady) {
68
+ worker_threads_1.parentPort?.postMessage({
69
+ type: 'error',
70
+ id: msg.id,
71
+ message: 'Model not ready yet',
72
+ });
73
+ return;
74
+ }
75
+ try {
76
+ const output = await pipeline(msg.text, { pooling: 'mean', normalize: true });
77
+ const vector = Array.from(output.data);
78
+ worker_threads_1.parentPort?.postMessage({
79
+ type: 'result',
80
+ id: msg.id,
81
+ vector,
82
+ });
83
+ }
84
+ catch (err) {
85
+ worker_threads_1.parentPort?.postMessage({
86
+ type: 'error',
87
+ id: msg.id,
88
+ message: err.message,
89
+ });
90
+ }
91
+ });
92
+ // Start loading immediately
93
+ loadModel();
94
+ //# sourceMappingURL=embedding-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-worker.js","sourceRoot":"","sources":["../src/embedding-worker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;;;;GAKG;AACH,sDAAsD;AACtD,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;AACxB,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;AACzB,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;AAE1B,mDAA4C;AAE5C,IAAI,QAAQ,GAAQ,IAAI,CAAC;AACzB,IAAI,UAAU,GAAG,KAAK,CAAC;AAwBvB,KAAK,UAAU,SAAS;IACpB,IAAI,CAAC;QACD,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,wDAAa,sBAAsB,GAAC,CAAC;QAE1E,QAAQ,GAAG,MAAM,cAAc,CAAC,oBAAoB,EAAE,yBAAyB,EAAE;YAC7E,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,CAAC,CAAM,EAAE,EAAE,GAAG,CAAC,EAAE,wBAAwB;SAC/D,CAAC,CAAC;QACH,UAAU,GAAG,IAAI,CAAC;QAClB,2BAAU,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAmB,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,2BAAU,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAmB,CAAC,CAAC;IACtG,CAAC;AACL,CAAC;AAED,2BAAU,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAiB,EAAE,EAAE;IAClD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO;IAEjC,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,2BAAU,EAAE,WAAW,CAAC;YACpB,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,OAAO,EAAE,qBAAqB;SAChB,CAAC,CAAC;QACpB,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAoB,CAAC,CAAC;QACvD,2BAAU,EAAE,WAAW,CAAC;YACpB,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,MAAM;SACQ,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,2BAAU,EAAE,WAAW,CAAC;YACpB,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,OAAO,EAAE,GAAG,CAAC,OAAO;SACN,CAAC,CAAC;IACxB,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,4BAA4B;AAC5B,SAAS,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cortex Run — Wraps any command and captures errors as memories.
4
+ *
5
+ * Usage:
6
+ * cortex-run npm test
7
+ * cortex-run npm run build
8
+ * cortex-run python main.py
9
+ *
10
+ * If the command fails, captures the error output as a BUG_FIX memory
11
+ * so the AI knows about it in future conversations.
12
+ * If the command succeeds, captures a brief success note.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=cortex-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cortex-run.d.ts","sourceRoot":"","sources":["../../src/hooks/cortex-run.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Cortex Run — Wraps any command and captures errors as memories.
5
+ *
6
+ * Usage:
7
+ * cortex-run npm test
8
+ * cortex-run npm run build
9
+ * cortex-run python main.py
10
+ *
11
+ * If the command fails, captures the error output as a BUG_FIX memory
12
+ * so the AI knows about it in future conversations.
13
+ * If the command succeeds, captures a brief success note.
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ const child_process_1 = require("child_process");
50
+ const path = __importStar(require("path"));
51
+ const fs = __importStar(require("fs"));
52
+ function generateId() {
53
+ return `cr_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
54
+ }
55
+ function findDbPath() {
56
+ let dir = process.cwd();
57
+ // Walk up to find .ai/brain-data/cortex.db
58
+ for (let i = 0; i < 10; i++) {
59
+ const dbPath = path.join(dir, '.ai', 'brain-data', 'cortex.db');
60
+ if (fs.existsSync(dbPath))
61
+ return dbPath;
62
+ const parent = path.dirname(dir);
63
+ if (parent === dir)
64
+ break;
65
+ dir = parent;
66
+ }
67
+ return null;
68
+ }
69
+ function extractErrorSummary(output) {
70
+ const lines = output.split('\n').filter(l => l.trim());
71
+ // Look for common error patterns
72
+ const errorLines = lines.filter(l => /error|Error|ERROR|fail|FAIL|exception|Exception|TypeError|ReferenceError|SyntaxError/i.test(l));
73
+ if (errorLines.length > 0) {
74
+ return errorLines.slice(0, 5).join('\n');
75
+ }
76
+ // Return last 10 lines if no specific error found
77
+ return lines.slice(-10).join('\n');
78
+ }
79
+ function storeMemory(dbPath, type, intent, action, tags) {
80
+ try {
81
+ const Database = require('better-sqlite3');
82
+ const db = new Database(dbPath);
83
+ db.pragma('journal_mode = WAL');
84
+ db.prepare(`
85
+ INSERT INTO memory_units (id, type, intent, action, reason, tags, timestamp, confidence, importance, is_active)
86
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1)
87
+ `).run(generateId(), type, intent, action, 'Auto-captured from cortex-run', JSON.stringify(tags), Date.now(), 0.7, 0.6);
88
+ // Try FTS insert
89
+ try {
90
+ db.prepare(`INSERT INTO memory_fts (rowid, intent, action, tags) VALUES (
91
+ (SELECT rowid FROM memory_units WHERE id = (SELECT id FROM memory_units ORDER BY timestamp DESC LIMIT 1)), ?, ?, ?
92
+ )`).run(intent, action, tags.join(' '));
93
+ }
94
+ catch { }
95
+ db.close();
96
+ }
97
+ catch { }
98
+ }
99
+ function main() {
100
+ const args = process.argv.slice(2);
101
+ if (args.length === 0) {
102
+ console.log('Usage: cortex-run <command> [args...]');
103
+ console.log('Example: cortex-run npm test');
104
+ console.log(' cortex-run npm run build');
105
+ process.exit(1);
106
+ }
107
+ const command = args.join(' ');
108
+ const dbPath = findDbPath();
109
+ const startTime = Date.now();
110
+ try {
111
+ // Run the command, inheriting stdio for real-time output
112
+ (0, child_process_1.execSync)(command, {
113
+ stdio: 'inherit',
114
+ cwd: process.cwd(),
115
+ env: process.env,
116
+ });
117
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
118
+ // Success — store a brief note
119
+ if (dbPath) {
120
+ storeMemory(dbPath, 'INSIGHT', `[OK] Command succeeded: ${command} (${duration}s)`, `Successfully ran "${command}" in ${duration} seconds`, ['cortex-run', 'success', command.split(' ')[0]]);
121
+ }
122
+ }
123
+ catch (err) {
124
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
125
+ // Failure — capture error details
126
+ if (dbPath) {
127
+ let errorOutput = '';
128
+ try {
129
+ // Re-run to capture output
130
+ (0, child_process_1.execSync)(command, {
131
+ cwd: process.cwd(),
132
+ env: process.env,
133
+ encoding: 'utf-8',
134
+ stdio: ['pipe', 'pipe', 'pipe'],
135
+ });
136
+ }
137
+ catch (e) {
138
+ errorOutput = (e.stderr || e.stdout || e.message || '').toString();
139
+ }
140
+ const errorSummary = extractErrorSummary(errorOutput);
141
+ storeMemory(dbPath, 'BUG_FIX', `[FAIL] Command failed: ${command}`, `Failed after ${duration}s.\n\nError:\n${errorSummary.slice(0, 500)}`, ['cortex-run', 'error', command.split(' ')[0], 'needs-fix']);
142
+ }
143
+ // Exit with the same error code
144
+ process.exit(err.status || 1);
145
+ }
146
+ }
147
+ main();
148
+ //# sourceMappingURL=cortex-run.js.map