cortex-mcp 2.7.6 → 2.9.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/CHANGELOG.md +305 -58
- package/README.md +394 -224
- package/dist/cli/setup.js +58 -60
- package/dist/cli/setup.js.map +1 -1
- package/dist/config/config.js +2 -2
- package/dist/config/config.js.map +1 -1
- package/dist/db/database.d.ts +8 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +35 -54
- package/dist/db/database.js.map +1 -1
- package/dist/db/event-log.d.ts +4 -0
- package/dist/db/event-log.d.ts.map +1 -1
- package/dist/db/event-log.js +14 -10
- package/dist/db/event-log.js.map +1 -1
- package/dist/db/memory-store.d.ts +30 -3
- package/dist/db/memory-store.d.ts.map +1 -1
- package/dist/db/memory-store.js +153 -55
- package/dist/db/memory-store.js.map +1 -1
- package/dist/embedding-worker.js +1 -1
- package/dist/embedding-worker.js.map +1 -1
- package/dist/hooks/git-capture.js +3 -3
- package/dist/hooks/git-hooks.js +5 -2
- package/dist/mcp-stdio.js +39 -5
- package/dist/mcp-stdio.js.map +1 -1
- package/dist/memory/access-pattern-tracker.d.ts +51 -0
- package/dist/memory/access-pattern-tracker.d.ts.map +1 -0
- package/dist/memory/access-pattern-tracker.js +92 -0
- package/dist/memory/access-pattern-tracker.js.map +1 -0
- package/dist/memory/anticipation-engine.d.ts.map +1 -1
- package/dist/memory/anticipation-engine.js +18 -10
- package/dist/memory/anticipation-engine.js.map +1 -1
- package/dist/memory/auto-learner.d.ts.map +1 -1
- package/dist/memory/auto-learner.js +192 -45
- package/dist/memory/auto-learner.js.map +1 -1
- package/dist/memory/completion-resolver.d.ts +38 -0
- package/dist/memory/completion-resolver.d.ts.map +1 -0
- package/dist/memory/completion-resolver.js +127 -0
- package/dist/memory/completion-resolver.js.map +1 -0
- package/dist/memory/confidence-decay.d.ts.map +1 -1
- package/dist/memory/confidence-decay.js +13 -9
- package/dist/memory/confidence-decay.js.map +1 -1
- package/dist/memory/convention-detector.d.ts +11 -0
- package/dist/memory/convention-detector.d.ts.map +1 -0
- package/dist/memory/convention-detector.js +294 -0
- package/dist/memory/convention-detector.js.map +1 -0
- package/dist/memory/correction-detector.d.ts +33 -0
- package/dist/memory/correction-detector.d.ts.map +1 -0
- package/dist/memory/correction-detector.js +129 -0
- package/dist/memory/correction-detector.js.map +1 -0
- package/dist/memory/cross-memory-linker.d.ts +18 -0
- package/dist/memory/cross-memory-linker.d.ts.map +1 -0
- package/dist/memory/cross-memory-linker.js +115 -0
- package/dist/memory/cross-memory-linker.js.map +1 -0
- package/dist/memory/daily-diary.d.ts +30 -0
- package/dist/memory/daily-diary.d.ts.map +1 -0
- package/dist/memory/daily-diary.js +159 -0
- package/dist/memory/daily-diary.js.map +1 -0
- package/dist/memory/embedding-cache.d.ts +32 -0
- package/dist/memory/embedding-cache.d.ts.map +1 -0
- package/dist/memory/embedding-cache.js +76 -0
- package/dist/memory/embedding-cache.js.map +1 -0
- package/dist/memory/embedding-manager.d.ts.map +1 -1
- package/dist/memory/embedding-manager.js +6 -4
- package/dist/memory/embedding-manager.js.map +1 -1
- package/dist/memory/error-learner.d.ts +26 -0
- package/dist/memory/error-learner.d.ts.map +1 -0
- package/dist/memory/error-learner.js +145 -0
- package/dist/memory/error-learner.js.map +1 -0
- package/dist/memory/export-import.js +2 -2
- package/dist/memory/export-import.js.map +1 -1
- package/dist/memory/file-relationships.d.ts +47 -0
- package/dist/memory/file-relationships.d.ts.map +1 -0
- package/dist/memory/file-relationships.js +130 -0
- package/dist/memory/file-relationships.js.map +1 -0
- package/dist/memory/git-memory.d.ts.map +1 -1
- package/dist/memory/git-memory.js +20 -26
- package/dist/memory/git-memory.js.map +1 -1
- package/dist/memory/impact-analyzer.d.ts +16 -0
- package/dist/memory/impact-analyzer.d.ts.map +1 -0
- package/dist/memory/impact-analyzer.js +189 -0
- package/dist/memory/impact-analyzer.js.map +1 -0
- package/dist/memory/instructions-generator.d.ts +30 -0
- package/dist/memory/instructions-generator.d.ts.map +1 -0
- package/dist/memory/instructions-generator.js +117 -0
- package/dist/memory/instructions-generator.js.map +1 -0
- package/dist/memory/learning-rate.js +8 -7
- package/dist/memory/learning-rate.js.map +1 -1
- package/dist/memory/llm-enhancer.d.ts +2 -14
- package/dist/memory/llm-enhancer.d.ts.map +1 -1
- package/dist/memory/llm-enhancer.js +66 -46
- package/dist/memory/llm-enhancer.js.map +1 -1
- package/dist/memory/memory-cache.d.ts.map +1 -1
- package/dist/memory/memory-cache.js +10 -0
- package/dist/memory/memory-cache.js.map +1 -1
- package/dist/memory/memory-consolidator.d.ts.map +1 -1
- package/dist/memory/memory-consolidator.js +20 -14
- package/dist/memory/memory-consolidator.js.map +1 -1
- package/dist/memory/memory-decay.d.ts.map +1 -1
- package/dist/memory/memory-decay.js +82 -52
- package/dist/memory/memory-decay.js.map +1 -1
- package/dist/memory/memory-export-md.d.ts +12 -0
- package/dist/memory/memory-export-md.d.ts.map +1 -0
- package/dist/memory/memory-export-md.js +188 -0
- package/dist/memory/memory-export-md.js.map +1 -0
- package/dist/memory/memory-quality.d.ts +1 -1
- package/dist/memory/memory-quality.d.ts.map +1 -1
- package/dist/memory/memory-quality.js +9 -6
- package/dist/memory/memory-quality.js.map +1 -1
- package/dist/memory/memory-ranker.d.ts.map +1 -1
- package/dist/memory/memory-ranker.js +12 -3
- package/dist/memory/memory-ranker.js.map +1 -1
- package/dist/memory/meta-memory.js +3 -3
- package/dist/memory/meta-memory.js.map +1 -1
- package/dist/memory/mmr-reranker.d.ts +39 -0
- package/dist/memory/mmr-reranker.d.ts.map +1 -0
- package/dist/memory/mmr-reranker.js +115 -0
- package/dist/memory/mmr-reranker.js.map +1 -0
- package/dist/memory/pre-flight.d.ts +24 -0
- package/dist/memory/pre-flight.d.ts.map +1 -0
- package/dist/memory/pre-flight.js +121 -0
- package/dist/memory/pre-flight.js.map +1 -0
- package/dist/memory/preference-learner.d.ts +28 -0
- package/dist/memory/preference-learner.d.ts.map +1 -0
- package/dist/memory/preference-learner.js +144 -0
- package/dist/memory/preference-learner.js.map +1 -0
- package/dist/memory/query-expansion.d.ts +28 -0
- package/dist/memory/query-expansion.d.ts.map +1 -0
- package/dist/memory/query-expansion.js +140 -0
- package/dist/memory/query-expansion.js.map +1 -0
- package/dist/memory/regression-guard.d.ts +35 -0
- package/dist/memory/regression-guard.d.ts.map +1 -0
- package/dist/memory/regression-guard.js +90 -0
- package/dist/memory/regression-guard.js.map +1 -0
- package/dist/memory/resume-work.d.ts +37 -0
- package/dist/memory/resume-work.d.ts.map +1 -0
- package/dist/memory/resume-work.js +141 -0
- package/dist/memory/resume-work.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +2 -0
- package/dist/memory/session-tracker.d.ts.map +1 -1
- package/dist/memory/session-tracker.js +26 -8
- package/dist/memory/session-tracker.js.map +1 -1
- package/dist/memory/soul-manager.d.ts +30 -0
- package/dist/memory/soul-manager.d.ts.map +1 -0
- package/dist/memory/soul-manager.js +171 -0
- package/dist/memory/soul-manager.js.map +1 -0
- package/dist/memory/success-tracker.d.ts +33 -0
- package/dist/memory/success-tracker.d.ts.map +1 -0
- package/dist/memory/success-tracker.js +75 -0
- package/dist/memory/success-tracker.js.map +1 -0
- package/dist/memory/temporal-engine.d.ts.map +1 -1
- package/dist/memory/temporal-engine.js +9 -13
- package/dist/memory/temporal-engine.js.map +1 -1
- package/dist/memory/tool-recommender.d.ts +29 -0
- package/dist/memory/tool-recommender.d.ts.map +1 -0
- package/dist/memory/tool-recommender.js +117 -0
- package/dist/memory/tool-recommender.js.map +1 -0
- package/dist/memory/usage-stats.d.ts +98 -0
- package/dist/memory/usage-stats.d.ts.map +1 -0
- package/dist/memory/usage-stats.js +345 -0
- package/dist/memory/usage-stats.js.map +1 -0
- package/dist/retrieval/hybrid-retriever.d.ts +0 -2
- package/dist/retrieval/hybrid-retriever.d.ts.map +1 -1
- package/dist/retrieval/hybrid-retriever.js +3 -13
- package/dist/retrieval/hybrid-retriever.js.map +1 -1
- package/dist/scanners/architecture-graph.js +2 -2
- package/dist/scanners/architecture-graph.js.map +1 -1
- package/dist/scanners/code-verifier.d.ts +1 -0
- package/dist/scanners/code-verifier.d.ts.map +1 -1
- package/dist/scanners/code-verifier.js +14 -14
- package/dist/scanners/code-verifier.js.map +1 -1
- package/dist/scanners/context-builder.d.ts.map +1 -1
- package/dist/scanners/context-builder.js +33 -45
- package/dist/scanners/context-builder.js.map +1 -1
- package/dist/scanners/export-map.js +2 -2
- package/dist/scanners/export-map.js.map +1 -1
- package/dist/scanners/project-scanner.js +2 -2
- package/dist/scanners/project-scanner.js.map +1 -1
- package/dist/security/encryption.js +1 -1
- package/dist/security/encryption.js.map +1 -1
- package/dist/security/feature-gate.d.ts.map +1 -1
- package/dist/security/feature-gate.js +62 -20
- package/dist/security/feature-gate.js.map +1 -1
- package/dist/security/license.js +282 -35
- package/dist/security/license.js.map +1 -1
- package/dist/security/rate-limiter.d.ts +4 -3
- package/dist/security/rate-limiter.d.ts.map +1 -1
- package/dist/security/rate-limiter.js +11 -29
- package/dist/security/rate-limiter.js.map +1 -1
- package/dist/server/dashboard.js +166 -327
- package/dist/server/dashboard.js.map +1 -1
- package/dist/server/mcp-handler.d.ts.map +1 -1
- package/dist/server/mcp-handler.js +1000 -792
- package/dist/server/mcp-handler.js.map +1 -1
- package/dist/utils/extract-tags.d.ts +16 -0
- package/dist/utils/extract-tags.d.ts.map +1 -0
- package/dist/utils/extract-tags.js +40 -0
- package/dist/utils/extract-tags.js.map +1 -0
- package/package.json +18 -8
- package/dist/core/event-bus.d.ts +0 -19
- package/dist/core/event-bus.d.ts.map +0 -1
- package/dist/core/event-bus.js +0 -51
- package/dist/core/event-bus.js.map +0 -1
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.analyzeImpact = analyzeImpact;
|
|
37
|
+
exports.formatImpact = formatImpact;
|
|
38
|
+
/**
|
|
39
|
+
* Impact Analyzer — Shows what breaks when you change a file.
|
|
40
|
+
*
|
|
41
|
+
* Before editing file A, this module checks the architecture graph
|
|
42
|
+
* to find all files that import from A (dependents).
|
|
43
|
+
* Prevents breaking changes by making dependencies visible.
|
|
44
|
+
*
|
|
45
|
+
* Like checking "who's using this?" before changing an API.
|
|
46
|
+
*/
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
/**
|
|
50
|
+
* Analyze the impact of changing a file.
|
|
51
|
+
* Scans for import statements that reference the target file.
|
|
52
|
+
*/
|
|
53
|
+
function analyzeImpact(targetFile, workspaceRoot) {
|
|
54
|
+
const result = {
|
|
55
|
+
targetFile,
|
|
56
|
+
directDependents: [],
|
|
57
|
+
indirectDependents: [],
|
|
58
|
+
totalImpact: 0,
|
|
59
|
+
exports: [],
|
|
60
|
+
riskLevel: 'LOW',
|
|
61
|
+
};
|
|
62
|
+
if (!workspaceRoot || !fs.existsSync(workspaceRoot))
|
|
63
|
+
return result;
|
|
64
|
+
// Normalize target for matching
|
|
65
|
+
const targetBasename = path.basename(targetFile).replace(/\.(ts|tsx|js|jsx)$/, '');
|
|
66
|
+
const targetRelative = path.relative(workspaceRoot, targetFile).replace(/\\/g, '/');
|
|
67
|
+
// Get all source files
|
|
68
|
+
const allFiles = getAllSourceFiles(workspaceRoot);
|
|
69
|
+
// Find what the target exports
|
|
70
|
+
try {
|
|
71
|
+
const targetContent = fs.readFileSync(fs.existsSync(targetFile) ? targetFile : path.join(workspaceRoot, targetFile), 'utf-8');
|
|
72
|
+
const exportMatches = targetContent.match(/export\s+(?:function|class|const|let|type|interface|enum)\s+(\w+)/g);
|
|
73
|
+
if (exportMatches) {
|
|
74
|
+
result.exports = exportMatches.map(m => {
|
|
75
|
+
const name = m.match(/\s(\w+)$/);
|
|
76
|
+
return name ? name[1] : m;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch { /* file read failure is non-fatal */ }
|
|
81
|
+
// Scan all files for imports from target
|
|
82
|
+
for (const file of allFiles) {
|
|
83
|
+
if (file === targetRelative)
|
|
84
|
+
continue;
|
|
85
|
+
try {
|
|
86
|
+
const content = fs.readFileSync(path.join(workspaceRoot, file), 'utf-8');
|
|
87
|
+
// Check for imports referencing the target file
|
|
88
|
+
const importPattern = new RegExp(`(?:import|require).*(?:${escapeRegex(targetBasename)}|${escapeRegex(targetRelative.replace(/\.(ts|tsx|js|jsx)$/, ''))})`, 'i');
|
|
89
|
+
if (importPattern.test(content)) {
|
|
90
|
+
result.directDependents.push(file);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch { /* ignore read failures */ }
|
|
94
|
+
}
|
|
95
|
+
// Find indirect dependents (files that import from direct dependents)
|
|
96
|
+
const directSet = new Set(result.directDependents);
|
|
97
|
+
for (const depFile of result.directDependents) {
|
|
98
|
+
const depBasename = path.basename(depFile).replace(/\.(ts|tsx|js|jsx)$/, '');
|
|
99
|
+
for (const file of allFiles) {
|
|
100
|
+
if (directSet.has(file) || file === targetRelative)
|
|
101
|
+
continue;
|
|
102
|
+
try {
|
|
103
|
+
const content = fs.readFileSync(path.join(workspaceRoot, file), 'utf-8');
|
|
104
|
+
if (content.includes(depBasename)) {
|
|
105
|
+
result.indirectDependents.push(file);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch { /* ignore */ }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Deduplicate indirect
|
|
112
|
+
result.indirectDependents = [...new Set(result.indirectDependents)];
|
|
113
|
+
result.totalImpact = result.directDependents.length + result.indirectDependents.length;
|
|
114
|
+
// Risk level
|
|
115
|
+
if (result.totalImpact === 0)
|
|
116
|
+
result.riskLevel = 'LOW';
|
|
117
|
+
else if (result.totalImpact <= 3)
|
|
118
|
+
result.riskLevel = 'MEDIUM';
|
|
119
|
+
else if (result.totalImpact <= 8)
|
|
120
|
+
result.riskLevel = 'HIGH';
|
|
121
|
+
else
|
|
122
|
+
result.riskLevel = 'CRITICAL';
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
/** Format impact analysis for AI consumption */
|
|
126
|
+
function formatImpact(result) {
|
|
127
|
+
const riskEmoji = {
|
|
128
|
+
LOW: '🟢', MEDIUM: '🟡', HIGH: '🟠', CRITICAL: '🔴',
|
|
129
|
+
};
|
|
130
|
+
const lines = [
|
|
131
|
+
`# 💥 Impact Analysis: ${path.basename(result.targetFile)}`,
|
|
132
|
+
`\n**Risk Level:** ${riskEmoji[result.riskLevel]} ${result.riskLevel} (${result.totalImpact} files affected)`,
|
|
133
|
+
];
|
|
134
|
+
if (result.exports.length > 0) {
|
|
135
|
+
lines.push(`\n**Exports:** \`${result.exports.slice(0, 10).join('`, `')}\``);
|
|
136
|
+
}
|
|
137
|
+
if (result.directDependents.length > 0) {
|
|
138
|
+
lines.push(`\n## Direct Dependents (${result.directDependents.length} files import this)`);
|
|
139
|
+
result.directDependents.forEach(f => lines.push(`- 📁 ${f}`));
|
|
140
|
+
}
|
|
141
|
+
if (result.indirectDependents.length > 0) {
|
|
142
|
+
lines.push(`\n## Indirect Dependents (${result.indirectDependents.length} files)`);
|
|
143
|
+
result.indirectDependents.slice(0, 5).forEach(f => lines.push(`- 📁 ${f}`));
|
|
144
|
+
if (result.indirectDependents.length > 5) {
|
|
145
|
+
lines.push(`_...and ${result.indirectDependents.length - 5} more_`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (result.totalImpact === 0) {
|
|
149
|
+
lines.push('\n✅ **No dependents found.** Safe to modify.');
|
|
150
|
+
}
|
|
151
|
+
else if (result.riskLevel === 'CRITICAL' || result.riskLevel === 'HIGH') {
|
|
152
|
+
lines.push('\n> ⚠️ **Caution:** Many files depend on this. Changing exports or signatures may cause cascading failures.');
|
|
153
|
+
}
|
|
154
|
+
return lines.join('\n');
|
|
155
|
+
}
|
|
156
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
157
|
+
function getAllSourceFiles(root, maxFiles = 200) {
|
|
158
|
+
const files = [];
|
|
159
|
+
const ignore = new Set(['node_modules', '.git', 'dist', 'coverage', '.next', 'build', 'out']);
|
|
160
|
+
const exts = new Set(['.ts', '.tsx', '.js', '.jsx']);
|
|
161
|
+
function walk(dir, depth) {
|
|
162
|
+
if (depth > 4 || files.length >= maxFiles)
|
|
163
|
+
return;
|
|
164
|
+
try {
|
|
165
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
166
|
+
for (const entry of entries) {
|
|
167
|
+
if (ignore.has(entry.name) || entry.name.startsWith('.'))
|
|
168
|
+
continue;
|
|
169
|
+
const full = path.join(dir, entry.name);
|
|
170
|
+
if (entry.isDirectory()) {
|
|
171
|
+
walk(full, depth + 1);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const ext = path.extname(entry.name);
|
|
175
|
+
if (exts.has(ext) && !entry.name.endsWith('.d.ts')) {
|
|
176
|
+
files.push(path.relative(root, full).replace(/\\/g, '/'));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch { /* ignore */ }
|
|
182
|
+
}
|
|
183
|
+
walk(root, 0);
|
|
184
|
+
return files;
|
|
185
|
+
}
|
|
186
|
+
function escapeRegex(str) {
|
|
187
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=impact-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact-analyzer.js","sourceRoot":"","sources":["../../src/memory/impact-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contextual Instructions Generator — Converts raw memories into direct DO/DON'T rules.
|
|
3
|
+
*
|
|
4
|
+
* THE GAP THIS FILLS:
|
|
5
|
+
* Currently, force_recall dumps memories like:
|
|
6
|
+
* "[CONVENTION] Arrow functions preferred over function declarations"
|
|
7
|
+
* But the AI has to interpret this. What it actually needs is:
|
|
8
|
+
* "DO: Use arrow functions. DON'T: Use function declarations."
|
|
9
|
+
*
|
|
10
|
+
* This module converts conventions, corrections, and preferences into
|
|
11
|
+
* imperative instructions that the AI can follow without thinking.
|
|
12
|
+
*
|
|
13
|
+
* Like a military briefing: clear, direct, no interpretation needed.
|
|
14
|
+
*/
|
|
15
|
+
import { MemoryStore } from '../db/memory-store';
|
|
16
|
+
export interface InstructionSet {
|
|
17
|
+
dos: string[];
|
|
18
|
+
donts: string[];
|
|
19
|
+
watchOuts: string[];
|
|
20
|
+
style: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generate contextual instructions from stored memories.
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateInstructions(memoryStore: MemoryStore): InstructionSet;
|
|
26
|
+
/**
|
|
27
|
+
* Format instructions as a clear, imperative briefing.
|
|
28
|
+
*/
|
|
29
|
+
export declare function formatInstructions(instructions: InstructionSet): string;
|
|
30
|
+
//# sourceMappingURL=instructions-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions-generator.d.ts","sourceRoot":"","sources":["../../src/memory/instructions-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,cAAc,CAiF7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,cAAc,GAAG,MAAM,CAwBvE"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateInstructions = generateInstructions;
|
|
4
|
+
exports.formatInstructions = formatInstructions;
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
/**
|
|
7
|
+
* Generate contextual instructions from stored memories.
|
|
8
|
+
*/
|
|
9
|
+
function generateInstructions(memoryStore) {
|
|
10
|
+
const instructions = {
|
|
11
|
+
dos: [],
|
|
12
|
+
donts: [],
|
|
13
|
+
watchOuts: [],
|
|
14
|
+
style: [],
|
|
15
|
+
};
|
|
16
|
+
const active = memoryStore.getActive(200);
|
|
17
|
+
for (const m of active) {
|
|
18
|
+
const intent = m.intent.toLowerCase();
|
|
19
|
+
const full = `${m.intent} ${m.action || ''} ${m.reason || ''}`;
|
|
20
|
+
// ─── Corrections → DON'Ts ──────────────────────────────────────
|
|
21
|
+
if (m.type === types_1.MemoryType.CORRECTION) {
|
|
22
|
+
// Extract the "don't do X" from corrections
|
|
23
|
+
const noMatch = full.match(/(?:no[,.]?\s+use|don'?t\s+use|never\s+use|avoid|instead\s+of)\s+(\w[\w\s]{3,40})/i);
|
|
24
|
+
const yesMatch = full.match(/(?:use|prefer|always\s+use|should\s+use|switch\s+to)\s+(\w[\w\s]{3,40})/i);
|
|
25
|
+
if (noMatch) {
|
|
26
|
+
instructions.donts.push(`DON'T: ${noMatch[1].trim()}`);
|
|
27
|
+
}
|
|
28
|
+
if (yesMatch) {
|
|
29
|
+
instructions.dos.push(`DO: ${yesMatch[1].trim()}`);
|
|
30
|
+
}
|
|
31
|
+
if (!noMatch && !yesMatch) {
|
|
32
|
+
instructions.watchOuts.push(`⚠️ Past correction: ${m.intent.slice(0, 80)}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// ─── Conventions → DOs ─────────────────────────────────────────
|
|
36
|
+
if (m.type === types_1.MemoryType.CONVENTION) {
|
|
37
|
+
// Check if this is a preference (communication style)
|
|
38
|
+
if (m.tags?.includes('preference')) {
|
|
39
|
+
instructions.style.push(m.intent.slice(0, 80));
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// Auto-detected conventions → direct rules
|
|
43
|
+
if (m.tags?.includes('auto-detected')) {
|
|
44
|
+
if (intent.includes('arrow function')) {
|
|
45
|
+
instructions.dos.push('DO: Use arrow functions (const fn = () => {})');
|
|
46
|
+
}
|
|
47
|
+
else if (intent.includes('function declaration')) {
|
|
48
|
+
instructions.dos.push('DO: Use function declarations (function fn() {})');
|
|
49
|
+
}
|
|
50
|
+
else if (intent.includes('const over let')) {
|
|
51
|
+
instructions.dos.push('DO: Use const by default, let only when reassignment needed');
|
|
52
|
+
}
|
|
53
|
+
else if (intent.includes('semicolon')) {
|
|
54
|
+
if (intent.includes('always'))
|
|
55
|
+
instructions.dos.push('DO: Always use semicolons');
|
|
56
|
+
else
|
|
57
|
+
instructions.dos.push('DO: Omit semicolons (ASI style)');
|
|
58
|
+
}
|
|
59
|
+
else if (intent.includes('single quote')) {
|
|
60
|
+
instructions.dos.push('DO: Use single quotes for strings');
|
|
61
|
+
}
|
|
62
|
+
else if (intent.includes('double quote')) {
|
|
63
|
+
instructions.dos.push('DO: Use double quotes for strings');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
instructions.dos.push(`DO: ${m.intent.slice(0, 80)}`);
|
|
67
|
+
}
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
instructions.dos.push(`DO: ${m.intent.slice(0, 80)}`);
|
|
71
|
+
}
|
|
72
|
+
// ─── Bug Fixes → Watch Outs ───────────────────────────────────
|
|
73
|
+
if (m.type === types_1.MemoryType.BUG_FIX) {
|
|
74
|
+
if (m.tags?.includes('error-pattern')) {
|
|
75
|
+
// These are TS error lessons
|
|
76
|
+
instructions.watchOuts.push(`⚠️ ${m.intent.replace('[ERROR PATTERN] ', '').slice(0, 80)}`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
instructions.watchOuts.push(`⚠️ Known bug: ${m.intent.slice(0, 80)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Deduplicate
|
|
84
|
+
instructions.dos = [...new Set(instructions.dos)].slice(0, 15);
|
|
85
|
+
instructions.donts = [...new Set(instructions.donts)].slice(0, 10);
|
|
86
|
+
instructions.watchOuts = [...new Set(instructions.watchOuts)].slice(0, 10);
|
|
87
|
+
instructions.style = [...new Set(instructions.style)].slice(0, 5);
|
|
88
|
+
return instructions;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Format instructions as a clear, imperative briefing.
|
|
92
|
+
*/
|
|
93
|
+
function formatInstructions(instructions) {
|
|
94
|
+
const sections = [];
|
|
95
|
+
if (instructions.dos.length > 0) {
|
|
96
|
+
sections.push('## ✅ Project Rules (DO)');
|
|
97
|
+
for (const d of instructions.dos)
|
|
98
|
+
sections.push(`- ${d}`);
|
|
99
|
+
}
|
|
100
|
+
if (instructions.donts.length > 0) {
|
|
101
|
+
sections.push('\n## ❌ Avoid (DON\'T)');
|
|
102
|
+
for (const d of instructions.donts)
|
|
103
|
+
sections.push(`- ${d}`);
|
|
104
|
+
}
|
|
105
|
+
if (instructions.watchOuts.length > 0) {
|
|
106
|
+
sections.push('\n## ⚠️ Watch Out');
|
|
107
|
+
for (const w of instructions.watchOuts)
|
|
108
|
+
sections.push(`- ${w}`);
|
|
109
|
+
}
|
|
110
|
+
if (instructions.style.length > 0) {
|
|
111
|
+
sections.push('\n## 🎯 Communication Style');
|
|
112
|
+
for (const s of instructions.style)
|
|
113
|
+
sections.push(`- ${s}`);
|
|
114
|
+
}
|
|
115
|
+
return sections.length > 0 ? sections.join('\n') : '';
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=instructions-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions-generator.js","sourceRoot":"","sources":["../../src/memory/instructions-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -79,17 +79,18 @@ function formatHotCorrections(memoryStore) {
|
|
|
79
79
|
}
|
|
80
80
|
return lines.join('\n');
|
|
81
81
|
}
|
|
82
|
+
/** Module-level stopwords set — avoid recreation per call */
|
|
83
|
+
const TOPIC_STOP_WORDS = new Set([
|
|
84
|
+
'the', 'a', 'an', 'is', 'was', 'are', 'were', 'to', 'of', 'in', 'for',
|
|
85
|
+
'on', 'with', 'at', 'by', 'from', 'it', 'this', 'that', 'and', 'or',
|
|
86
|
+
'but', 'not', 'do', 'does', 'did', 'don', 'dont', 'use', 'using',
|
|
87
|
+
'should', 'must', 'never', 'always', 'avoid', 'instead',
|
|
88
|
+
]);
|
|
82
89
|
/** Extract meaningful topic words from correction text */
|
|
83
90
|
function extractTopicWords(text) {
|
|
84
|
-
const stopWords = new Set([
|
|
85
|
-
'the', 'a', 'an', 'is', 'was', 'are', 'were', 'to', 'of', 'in', 'for',
|
|
86
|
-
'on', 'with', 'at', 'by', 'from', 'it', 'this', 'that', 'and', 'or',
|
|
87
|
-
'but', 'not', 'do', 'does', 'did', 'don', 'dont', 'use', 'using',
|
|
88
|
-
'should', 'must', 'never', 'always', 'avoid', 'instead',
|
|
89
|
-
]);
|
|
90
91
|
return text.toLowerCase()
|
|
91
92
|
.replace(/[^a-z0-9\s]/g, ' ')
|
|
92
93
|
.split(/\s+/)
|
|
93
|
-
.filter(w => w.length > 3 && !
|
|
94
|
+
.filter(w => w.length > 3 && !TOPIC_STOP_WORDS.has(w));
|
|
94
95
|
}
|
|
95
96
|
//# sourceMappingURL=learning-rate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learning-rate.js","sourceRoot":"","sources":["../../src/memory/learning-rate.ts"],"names":[],"mappings":";;AAoBA,gEAiCC;AAGD,4DA2BC;AAGD,oDAYC;AAxFD,
|
|
1
|
+
{"version":3,"file":"learning-rate.js","sourceRoot":"","sources":["../../src/memory/learning-rate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LLM Enhancer — Optional LLM-powered memory enrichment.
|
|
3
|
-
*
|
|
4
|
-
* When the user provides an API key (OPENAI_API_KEY or CORTEX_LLM_KEY),
|
|
5
|
-
* this module uses an LLM to:
|
|
6
|
-
* 1. Better classify memories (vs. keyword matching)
|
|
7
|
-
* 2. Extract richer insights from commit messages
|
|
8
|
-
* 3. Generate smart tags and connections
|
|
9
|
-
* 4. Summarize and merge related memories
|
|
10
|
-
*
|
|
11
|
-
* When no API key is available, falls back to keyword-based classification.
|
|
12
|
-
* This ensures Cortex works for EVERYONE — free without an API key,
|
|
13
|
-
* but smarter WITH one.
|
|
14
|
-
*/
|
|
15
1
|
export interface LLMEnhancedMemory {
|
|
16
2
|
type: string;
|
|
17
3
|
intent: string;
|
|
@@ -25,6 +11,8 @@ export interface LLMConfig {
|
|
|
25
11
|
model: string;
|
|
26
12
|
baseUrl: string;
|
|
27
13
|
maxTokens: number;
|
|
14
|
+
provider: 'openrouter' | 'openai' | 'anthropic' | 'custom';
|
|
15
|
+
extraHeaders?: Record<string, string>;
|
|
28
16
|
}
|
|
29
17
|
/**
|
|
30
18
|
* Check if LLM enhancement is available (API key configured).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-enhancer.d.ts","sourceRoot":"","sources":["../../src/memory/llm-enhancer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"llm-enhancer.d.ts","sourceRoot":"","sources":["../../src/memory/llm-enhancer.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAiID;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAMxC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAKvC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,iBAAiB,CAAC,CA2D5B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACnC,QAAQ,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GACrE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB"}
|
|
@@ -1,18 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* LLM Enhancer — Optional LLM-powered memory enrichment.
|
|
4
|
-
*
|
|
5
|
-
* When the user provides an API key (OPENAI_API_KEY or CORTEX_LLM_KEY),
|
|
6
|
-
* this module uses an LLM to:
|
|
7
|
-
* 1. Better classify memories (vs. keyword matching)
|
|
8
|
-
* 2. Extract richer insights from commit messages
|
|
9
|
-
* 3. Generate smart tags and connections
|
|
10
|
-
* 4. Summarize and merge related memories
|
|
11
|
-
*
|
|
12
|
-
* When no API key is available, falls back to keyword-based classification.
|
|
13
|
-
* This ensures Cortex works for EVERYONE — free without an API key,
|
|
14
|
-
* but smarter WITH one.
|
|
15
|
-
*/
|
|
16
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
3
|
if (k2 === undefined) k2 = k;
|
|
18
4
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -51,32 +37,76 @@ exports.isLLMAvailable = isLLMAvailable;
|
|
|
51
37
|
exports.getLLMProvider = getLLMProvider;
|
|
52
38
|
exports.enhanceMemory = enhanceMemory;
|
|
53
39
|
exports.summarizeMemories = summarizeMemories;
|
|
40
|
+
/**
|
|
41
|
+
* LLM Enhancer — Optional LLM-powered memory enrichment.
|
|
42
|
+
*
|
|
43
|
+
* Supports multiple LLM providers:
|
|
44
|
+
* 1. OpenRouter (FREE models available!) — OPENROUTER_API_KEY
|
|
45
|
+
* 2. OpenAI — OPENAI_API_KEY
|
|
46
|
+
* 3. Anthropic — ANTHROPIC_API_KEY
|
|
47
|
+
* 4. Any OpenAI-compatible API — CORTEX_LLM_KEY + CORTEX_LLM_BASE_URL
|
|
48
|
+
*
|
|
49
|
+
* When the user provides an API key, this module uses an LLM to:
|
|
50
|
+
* 1. Better classify memories (vs. keyword matching)
|
|
51
|
+
* 2. Extract richer insights from conversations
|
|
52
|
+
* 3. Generate smart tags and connections
|
|
53
|
+
* 4. Summarize and merge related memories
|
|
54
|
+
*
|
|
55
|
+
* When no API key is available, falls back to keyword-based classification.
|
|
56
|
+
* This ensures Cortex works for EVERYONE — free without an API key,
|
|
57
|
+
* but smarter WITH one.
|
|
58
|
+
*
|
|
59
|
+
* === HOW TO GET A FREE OPENROUTER KEY ===
|
|
60
|
+
* 1. Go to https://openrouter.ai/keys
|
|
61
|
+
* 2. Create a free account
|
|
62
|
+
* 3. Generate an API key (free tier included)
|
|
63
|
+
* 4. Set: OPENROUTER_API_KEY=sk-or-v1-... in your environment
|
|
64
|
+
* 5. Cortex will automatically use free models for smarter memory extraction!
|
|
65
|
+
*/
|
|
66
|
+
const extract_tags_1 = require("../utils/extract-tags");
|
|
54
67
|
const https = __importStar(require("https"));
|
|
55
68
|
const http = __importStar(require("http"));
|
|
56
69
|
// ─── Config Detection ─────────────────────────────────────────────────────────
|
|
57
70
|
function detectLLMConfig() {
|
|
58
|
-
//
|
|
71
|
+
// 1. OpenRouter (RECOMMENDED — has free models!)
|
|
72
|
+
const openrouterKey = process.env.OPENROUTER_API_KEY;
|
|
73
|
+
if (openrouterKey) {
|
|
74
|
+
return {
|
|
75
|
+
apiKey: openrouterKey,
|
|
76
|
+
model: process.env.CORTEX_LLM_MODEL || 'meta-llama/llama-4-scout:free',
|
|
77
|
+
baseUrl: 'https://openrouter.ai/api',
|
|
78
|
+
maxTokens: 200,
|
|
79
|
+
provider: 'openrouter',
|
|
80
|
+
extraHeaders: {
|
|
81
|
+
'HTTP-Referer': 'https://github.com/jaswanthkumarj1234-beep/cortex-mcp',
|
|
82
|
+
'X-Title': 'Cortex MCP',
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// 2. Check other API key sources
|
|
59
87
|
const apiKey = process.env.OPENAI_API_KEY
|
|
60
88
|
|| process.env.CORTEX_LLM_KEY
|
|
61
89
|
|| process.env.ANTHROPIC_API_KEY
|
|
62
90
|
|| null;
|
|
63
91
|
if (!apiKey)
|
|
64
92
|
return null;
|
|
65
|
-
//
|
|
93
|
+
// 3. Anthropic
|
|
66
94
|
if (apiKey.startsWith('sk-ant-')) {
|
|
67
95
|
return {
|
|
68
96
|
apiKey,
|
|
69
97
|
model: process.env.CORTEX_LLM_MODEL || 'claude-3-haiku-20240307',
|
|
70
98
|
baseUrl: 'https://api.anthropic.com',
|
|
71
99
|
maxTokens: 200,
|
|
100
|
+
provider: 'anthropic',
|
|
72
101
|
};
|
|
73
102
|
}
|
|
74
|
-
// Default to OpenAI-compatible (works with OpenAI,
|
|
103
|
+
// 4. Default to OpenAI-compatible (works with OpenAI, local, etc.)
|
|
75
104
|
return {
|
|
76
105
|
apiKey,
|
|
77
106
|
model: process.env.CORTEX_LLM_MODEL || 'gpt-4o-mini',
|
|
78
107
|
baseUrl: process.env.CORTEX_LLM_BASE_URL || 'https://api.openai.com',
|
|
79
108
|
maxTokens: 200,
|
|
109
|
+
provider: 'openai',
|
|
80
110
|
};
|
|
81
111
|
}
|
|
82
112
|
// ─── LLM Call ─────────────────────────────────────────────────────────────────
|
|
@@ -89,16 +119,21 @@ function callOpenAI(config, prompt) {
|
|
|
89
119
|
max_tokens: config.maxTokens,
|
|
90
120
|
temperature: 0.1,
|
|
91
121
|
});
|
|
122
|
+
const headers = {
|
|
123
|
+
'Content-Type': 'application/json',
|
|
124
|
+
'Authorization': `Bearer ${config.apiKey}`,
|
|
125
|
+
'Content-Length': Buffer.byteLength(body),
|
|
126
|
+
};
|
|
127
|
+
// Add provider-specific headers (OpenRouter requires HTTP-Referer and X-Title)
|
|
128
|
+
if (config.extraHeaders) {
|
|
129
|
+
Object.assign(headers, config.extraHeaders);
|
|
130
|
+
}
|
|
92
131
|
const options = {
|
|
93
132
|
hostname: url.hostname,
|
|
94
133
|
port: url.port || 443,
|
|
95
134
|
path: url.pathname,
|
|
96
135
|
method: 'POST',
|
|
97
|
-
headers
|
|
98
|
-
'Content-Type': 'application/json',
|
|
99
|
-
'Authorization': `Bearer ${config.apiKey}`,
|
|
100
|
-
'Content-Length': Buffer.byteLength(body),
|
|
101
|
-
},
|
|
136
|
+
headers,
|
|
102
137
|
};
|
|
103
138
|
const transport = url.protocol === 'https:' ? https : http;
|
|
104
139
|
const req = transport.request(options, (res) => {
|
|
@@ -107,6 +142,10 @@ function callOpenAI(config, prompt) {
|
|
|
107
142
|
res.on('end', () => {
|
|
108
143
|
try {
|
|
109
144
|
const json = JSON.parse(data);
|
|
145
|
+
if (json.error) {
|
|
146
|
+
reject(new Error(`LLM API error: ${json.error.message || JSON.stringify(json.error)}`));
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
110
149
|
const content = json.choices?.[0]?.message?.content || '';
|
|
111
150
|
resolve(content.trim());
|
|
112
151
|
}
|
|
@@ -116,7 +155,7 @@ function callOpenAI(config, prompt) {
|
|
|
116
155
|
});
|
|
117
156
|
});
|
|
118
157
|
req.on('error', reject);
|
|
119
|
-
req.setTimeout(
|
|
158
|
+
req.setTimeout(15000, () => {
|
|
120
159
|
req.destroy();
|
|
121
160
|
reject(new Error('LLM request timeout'));
|
|
122
161
|
});
|
|
@@ -141,27 +180,6 @@ function classifyByKeywords(text) {
|
|
|
141
180
|
return 'BUG_FIX';
|
|
142
181
|
return 'DECISION';
|
|
143
182
|
}
|
|
144
|
-
function extractKeywordTags(text) {
|
|
145
|
-
const tags = [];
|
|
146
|
-
const lower = text.toLowerCase();
|
|
147
|
-
const patterns = [
|
|
148
|
-
[/\b(auth|login|session|token|jwt|oauth)\b/, 'auth'],
|
|
149
|
-
[/\b(database|sql|query|migration|schema)\b/, 'database'],
|
|
150
|
-
[/\b(api|endpoint|route|rest|graphql)\b/, 'api'],
|
|
151
|
-
[/\b(ui|component|render|style|css|html)\b/, 'ui'],
|
|
152
|
-
[/\b(test|spec|mock|assert|coverage)\b/, 'testing'],
|
|
153
|
-
[/\b(deploy|ci|cd|pipeline|docker|k8s)\b/, 'devops'],
|
|
154
|
-
[/\b(security|encrypt|permission|vulnerability)\b/, 'security'],
|
|
155
|
-
[/\b(perf|optimize|cache|speed|memory)\b/, 'performance'],
|
|
156
|
-
[/\b(config|env|setting|option)\b/, 'config'],
|
|
157
|
-
[/\b(error|exception|crash|debug|log)\b/, 'error-handling'],
|
|
158
|
-
];
|
|
159
|
-
for (const [pattern, tag] of patterns) {
|
|
160
|
-
if (pattern.test(lower))
|
|
161
|
-
tags.push(tag);
|
|
162
|
-
}
|
|
163
|
-
return tags;
|
|
164
|
-
}
|
|
165
183
|
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
166
184
|
let _config = undefined;
|
|
167
185
|
let _available = undefined;
|
|
@@ -181,7 +199,9 @@ function isLLMAvailable() {
|
|
|
181
199
|
function getLLMProvider() {
|
|
182
200
|
if (!isLLMAvailable() || !_config)
|
|
183
201
|
return 'none';
|
|
184
|
-
if (_config.
|
|
202
|
+
if (_config.provider === 'openrouter')
|
|
203
|
+
return `openrouter/${_config.model}`;
|
|
204
|
+
if (_config.provider === 'anthropic')
|
|
185
205
|
return `anthropic/${_config.model}`;
|
|
186
206
|
return `openai/${_config.model}`;
|
|
187
207
|
}
|
|
@@ -195,7 +215,7 @@ async function enhanceMemory(text, context) {
|
|
|
195
215
|
type: classifyByKeywords(text),
|
|
196
216
|
intent: text.length > 200 ? text.slice(0, 200) + '...' : text,
|
|
197
217
|
action: text,
|
|
198
|
-
tags:
|
|
218
|
+
tags: (0, extract_tags_1.extractTags)(text),
|
|
199
219
|
};
|
|
200
220
|
if (!isLLMAvailable() || !_config) {
|
|
201
221
|
return fallback;
|