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.
- package/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/dist/cli/setup.d.ts +12 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +293 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config/config.d.ts +13 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +33 -0
- package/dist/config/config.js.map +1 -0
- package/dist/core/event-bus.d.ts +19 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +51 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/db/database.d.ts +19 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +254 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/event-log.d.ts +28 -0
- package/dist/db/event-log.d.ts.map +1 -0
- package/dist/db/event-log.js +87 -0
- package/dist/db/event-log.js.map +1 -0
- package/dist/db/memory-store.d.ts +65 -0
- package/dist/db/memory-store.d.ts.map +1 -0
- package/dist/db/memory-store.js +370 -0
- package/dist/db/memory-store.js.map +1 -0
- package/dist/embedding-worker.d.ts +3 -0
- package/dist/embedding-worker.d.ts.map +1 -0
- package/dist/embedding-worker.js +94 -0
- package/dist/embedding-worker.js.map +1 -0
- package/dist/hooks/cortex-run.d.ts +15 -0
- package/dist/hooks/cortex-run.d.ts.map +1 -0
- package/dist/hooks/cortex-run.js +148 -0
- package/dist/hooks/cortex-run.js.map +1 -0
- package/dist/hooks/git-capture.d.ts +21 -0
- package/dist/hooks/git-capture.d.ts.map +1 -0
- package/dist/hooks/git-capture.js +178 -0
- package/dist/hooks/git-capture.js.map +1 -0
- package/dist/hooks/git-hooks.d.ts +12 -0
- package/dist/hooks/git-hooks.d.ts.map +1 -0
- package/dist/hooks/git-hooks.js +130 -0
- package/dist/hooks/git-hooks.js.map +1 -0
- package/dist/mcp-stdio.d.ts +10 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +247 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/memory/anticipation-engine.d.ts +19 -0
- package/dist/memory/anticipation-engine.d.ts.map +1 -0
- package/dist/memory/anticipation-engine.js +76 -0
- package/dist/memory/anticipation-engine.js.map +1 -0
- package/dist/memory/attention-ranker.d.ts +19 -0
- package/dist/memory/attention-ranker.d.ts.map +1 -0
- package/dist/memory/attention-ranker.js +97 -0
- package/dist/memory/attention-ranker.js.map +1 -0
- package/dist/memory/auto-learner.d.ts +20 -0
- package/dist/memory/auto-learner.d.ts.map +1 -0
- package/dist/memory/auto-learner.js +179 -0
- package/dist/memory/auto-learner.js.map +1 -0
- package/dist/memory/confidence-decay.d.ts +22 -0
- package/dist/memory/confidence-decay.d.ts.map +1 -0
- package/dist/memory/confidence-decay.js +54 -0
- package/dist/memory/confidence-decay.js.map +1 -0
- package/dist/memory/embedding-manager.d.ts +5 -0
- package/dist/memory/embedding-manager.d.ts.map +1 -0
- package/dist/memory/embedding-manager.js +118 -0
- package/dist/memory/embedding-manager.js.map +1 -0
- package/dist/memory/export-import.d.ts +49 -0
- package/dist/memory/export-import.d.ts.map +1 -0
- package/dist/memory/export-import.js +131 -0
- package/dist/memory/export-import.js.map +1 -0
- package/dist/memory/git-memory.d.ts +15 -0
- package/dist/memory/git-memory.d.ts.map +1 -0
- package/dist/memory/git-memory.js +178 -0
- package/dist/memory/git-memory.js.map +1 -0
- package/dist/memory/learning-rate.d.ts +24 -0
- package/dist/memory/learning-rate.d.ts.map +1 -0
- package/dist/memory/learning-rate.js +95 -0
- package/dist/memory/learning-rate.js.map +1 -0
- package/dist/memory/llm-enhancer.d.ts +54 -0
- package/dist/memory/llm-enhancer.d.ts.map +1 -0
- package/dist/memory/llm-enhancer.js +270 -0
- package/dist/memory/llm-enhancer.js.map +1 -0
- package/dist/memory/memory-cache.d.ts +5 -0
- package/dist/memory/memory-cache.d.ts.map +1 -0
- package/dist/memory/memory-cache.js +37 -0
- package/dist/memory/memory-cache.js.map +1 -0
- package/dist/memory/memory-consolidator.d.ts +14 -0
- package/dist/memory/memory-consolidator.d.ts.map +1 -0
- package/dist/memory/memory-consolidator.js +156 -0
- package/dist/memory/memory-consolidator.js.map +1 -0
- package/dist/memory/memory-decay.d.ts +10 -0
- package/dist/memory/memory-decay.d.ts.map +1 -0
- package/dist/memory/memory-decay.js +79 -0
- package/dist/memory/memory-decay.js.map +1 -0
- package/dist/memory/memory-quality.d.ts +37 -0
- package/dist/memory/memory-quality.d.ts.map +1 -0
- package/dist/memory/memory-quality.js +203 -0
- package/dist/memory/memory-quality.js.map +1 -0
- package/dist/memory/memory-ranker.d.ts +14 -0
- package/dist/memory/memory-ranker.d.ts.map +1 -0
- package/dist/memory/memory-ranker.js +68 -0
- package/dist/memory/memory-ranker.js.map +1 -0
- package/dist/memory/meta-memory.d.ts +11 -0
- package/dist/memory/meta-memory.d.ts.map +1 -0
- package/dist/memory/meta-memory.js +141 -0
- package/dist/memory/meta-memory.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +39 -0
- package/dist/memory/session-tracker.d.ts.map +1 -0
- package/dist/memory/session-tracker.js +127 -0
- package/dist/memory/session-tracker.js.map +1 -0
- package/dist/memory/temporal-engine.d.ts +25 -0
- package/dist/memory/temporal-engine.d.ts.map +1 -0
- package/dist/memory/temporal-engine.js +106 -0
- package/dist/memory/temporal-engine.js.map +1 -0
- package/dist/retrieval/hybrid-retriever.d.ts +23 -0
- package/dist/retrieval/hybrid-retriever.d.ts.map +1 -0
- package/dist/retrieval/hybrid-retriever.js +120 -0
- package/dist/retrieval/hybrid-retriever.js.map +1 -0
- package/dist/scanners/architecture-graph.d.ts +30 -0
- package/dist/scanners/architecture-graph.d.ts.map +1 -0
- package/dist/scanners/architecture-graph.js +315 -0
- package/dist/scanners/architecture-graph.js.map +1 -0
- package/dist/scanners/code-verifier.d.ts +70 -0
- package/dist/scanners/code-verifier.d.ts.map +1 -0
- package/dist/scanners/code-verifier.js +374 -0
- package/dist/scanners/code-verifier.js.map +1 -0
- package/dist/scanners/context-builder.d.ts +19 -0
- package/dist/scanners/context-builder.d.ts.map +1 -0
- package/dist/scanners/context-builder.js +102 -0
- package/dist/scanners/context-builder.js.map +1 -0
- package/dist/scanners/export-map.d.ts +22 -0
- package/dist/scanners/export-map.d.ts.map +1 -0
- package/dist/scanners/export-map.js +249 -0
- package/dist/scanners/export-map.js.map +1 -0
- package/dist/scanners/file-verifier.d.ts +22 -0
- package/dist/scanners/file-verifier.d.ts.map +1 -0
- package/dist/scanners/file-verifier.js +140 -0
- package/dist/scanners/file-verifier.js.map +1 -0
- package/dist/scanners/project-scanner.d.ts +31 -0
- package/dist/scanners/project-scanner.d.ts.map +1 -0
- package/dist/scanners/project-scanner.js +398 -0
- package/dist/scanners/project-scanner.js.map +1 -0
- package/dist/security/encryption.d.ts +15 -0
- package/dist/security/encryption.d.ts.map +1 -0
- package/dist/security/encryption.js +116 -0
- package/dist/security/encryption.js.map +1 -0
- package/dist/security/feature-gate.d.ts +30 -0
- package/dist/security/feature-gate.d.ts.map +1 -0
- package/dist/security/feature-gate.js +91 -0
- package/dist/security/feature-gate.js.map +1 -0
- package/dist/security/license.d.ts +24 -0
- package/dist/security/license.d.ts.map +1 -0
- package/dist/security/license.js +168 -0
- package/dist/security/license.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +20 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +60 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/server/dashboard.d.ts +3 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +258 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/mcp-handler.d.ts +12 -0
- package/dist/server/mcp-handler.d.ts.map +1 -0
- package/dist/server/mcp-handler.js +1392 -0
- package/dist/server/mcp-handler.js.map +1 -0
- package/dist/strategies/embedders/local-minilm.d.ts +35 -0
- package/dist/strategies/embedders/local-minilm.d.ts.map +1 -0
- package/dist/strategies/embedders/local-minilm.js +176 -0
- package/dist/strategies/embedders/local-minilm.js.map +1 -0
- package/dist/types.d.ts +207 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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
|