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.
Files changed (202) hide show
  1. package/CHANGELOG.md +305 -58
  2. package/README.md +394 -224
  3. package/dist/cli/setup.js +58 -60
  4. package/dist/cli/setup.js.map +1 -1
  5. package/dist/config/config.js +2 -2
  6. package/dist/config/config.js.map +1 -1
  7. package/dist/db/database.d.ts +8 -0
  8. package/dist/db/database.d.ts.map +1 -1
  9. package/dist/db/database.js +35 -54
  10. package/dist/db/database.js.map +1 -1
  11. package/dist/db/event-log.d.ts +4 -0
  12. package/dist/db/event-log.d.ts.map +1 -1
  13. package/dist/db/event-log.js +14 -10
  14. package/dist/db/event-log.js.map +1 -1
  15. package/dist/db/memory-store.d.ts +30 -3
  16. package/dist/db/memory-store.d.ts.map +1 -1
  17. package/dist/db/memory-store.js +153 -55
  18. package/dist/db/memory-store.js.map +1 -1
  19. package/dist/embedding-worker.js +1 -1
  20. package/dist/embedding-worker.js.map +1 -1
  21. package/dist/hooks/git-capture.js +3 -3
  22. package/dist/hooks/git-hooks.js +5 -2
  23. package/dist/mcp-stdio.js +39 -5
  24. package/dist/mcp-stdio.js.map +1 -1
  25. package/dist/memory/access-pattern-tracker.d.ts +51 -0
  26. package/dist/memory/access-pattern-tracker.d.ts.map +1 -0
  27. package/dist/memory/access-pattern-tracker.js +92 -0
  28. package/dist/memory/access-pattern-tracker.js.map +1 -0
  29. package/dist/memory/anticipation-engine.d.ts.map +1 -1
  30. package/dist/memory/anticipation-engine.js +18 -10
  31. package/dist/memory/anticipation-engine.js.map +1 -1
  32. package/dist/memory/auto-learner.d.ts.map +1 -1
  33. package/dist/memory/auto-learner.js +192 -45
  34. package/dist/memory/auto-learner.js.map +1 -1
  35. package/dist/memory/completion-resolver.d.ts +38 -0
  36. package/dist/memory/completion-resolver.d.ts.map +1 -0
  37. package/dist/memory/completion-resolver.js +127 -0
  38. package/dist/memory/completion-resolver.js.map +1 -0
  39. package/dist/memory/confidence-decay.d.ts.map +1 -1
  40. package/dist/memory/confidence-decay.js +13 -9
  41. package/dist/memory/confidence-decay.js.map +1 -1
  42. package/dist/memory/convention-detector.d.ts +11 -0
  43. package/dist/memory/convention-detector.d.ts.map +1 -0
  44. package/dist/memory/convention-detector.js +294 -0
  45. package/dist/memory/convention-detector.js.map +1 -0
  46. package/dist/memory/correction-detector.d.ts +33 -0
  47. package/dist/memory/correction-detector.d.ts.map +1 -0
  48. package/dist/memory/correction-detector.js +129 -0
  49. package/dist/memory/correction-detector.js.map +1 -0
  50. package/dist/memory/cross-memory-linker.d.ts +18 -0
  51. package/dist/memory/cross-memory-linker.d.ts.map +1 -0
  52. package/dist/memory/cross-memory-linker.js +115 -0
  53. package/dist/memory/cross-memory-linker.js.map +1 -0
  54. package/dist/memory/daily-diary.d.ts +30 -0
  55. package/dist/memory/daily-diary.d.ts.map +1 -0
  56. package/dist/memory/daily-diary.js +159 -0
  57. package/dist/memory/daily-diary.js.map +1 -0
  58. package/dist/memory/embedding-cache.d.ts +32 -0
  59. package/dist/memory/embedding-cache.d.ts.map +1 -0
  60. package/dist/memory/embedding-cache.js +76 -0
  61. package/dist/memory/embedding-cache.js.map +1 -0
  62. package/dist/memory/embedding-manager.d.ts.map +1 -1
  63. package/dist/memory/embedding-manager.js +6 -4
  64. package/dist/memory/embedding-manager.js.map +1 -1
  65. package/dist/memory/error-learner.d.ts +26 -0
  66. package/dist/memory/error-learner.d.ts.map +1 -0
  67. package/dist/memory/error-learner.js +145 -0
  68. package/dist/memory/error-learner.js.map +1 -0
  69. package/dist/memory/export-import.js +2 -2
  70. package/dist/memory/export-import.js.map +1 -1
  71. package/dist/memory/file-relationships.d.ts +47 -0
  72. package/dist/memory/file-relationships.d.ts.map +1 -0
  73. package/dist/memory/file-relationships.js +130 -0
  74. package/dist/memory/file-relationships.js.map +1 -0
  75. package/dist/memory/git-memory.d.ts.map +1 -1
  76. package/dist/memory/git-memory.js +20 -26
  77. package/dist/memory/git-memory.js.map +1 -1
  78. package/dist/memory/impact-analyzer.d.ts +16 -0
  79. package/dist/memory/impact-analyzer.d.ts.map +1 -0
  80. package/dist/memory/impact-analyzer.js +189 -0
  81. package/dist/memory/impact-analyzer.js.map +1 -0
  82. package/dist/memory/instructions-generator.d.ts +30 -0
  83. package/dist/memory/instructions-generator.d.ts.map +1 -0
  84. package/dist/memory/instructions-generator.js +117 -0
  85. package/dist/memory/instructions-generator.js.map +1 -0
  86. package/dist/memory/learning-rate.js +8 -7
  87. package/dist/memory/learning-rate.js.map +1 -1
  88. package/dist/memory/llm-enhancer.d.ts +2 -14
  89. package/dist/memory/llm-enhancer.d.ts.map +1 -1
  90. package/dist/memory/llm-enhancer.js +66 -46
  91. package/dist/memory/llm-enhancer.js.map +1 -1
  92. package/dist/memory/memory-cache.d.ts.map +1 -1
  93. package/dist/memory/memory-cache.js +10 -0
  94. package/dist/memory/memory-cache.js.map +1 -1
  95. package/dist/memory/memory-consolidator.d.ts.map +1 -1
  96. package/dist/memory/memory-consolidator.js +20 -14
  97. package/dist/memory/memory-consolidator.js.map +1 -1
  98. package/dist/memory/memory-decay.d.ts.map +1 -1
  99. package/dist/memory/memory-decay.js +82 -52
  100. package/dist/memory/memory-decay.js.map +1 -1
  101. package/dist/memory/memory-export-md.d.ts +12 -0
  102. package/dist/memory/memory-export-md.d.ts.map +1 -0
  103. package/dist/memory/memory-export-md.js +188 -0
  104. package/dist/memory/memory-export-md.js.map +1 -0
  105. package/dist/memory/memory-quality.d.ts +1 -1
  106. package/dist/memory/memory-quality.d.ts.map +1 -1
  107. package/dist/memory/memory-quality.js +9 -6
  108. package/dist/memory/memory-quality.js.map +1 -1
  109. package/dist/memory/memory-ranker.d.ts.map +1 -1
  110. package/dist/memory/memory-ranker.js +12 -3
  111. package/dist/memory/memory-ranker.js.map +1 -1
  112. package/dist/memory/meta-memory.js +3 -3
  113. package/dist/memory/meta-memory.js.map +1 -1
  114. package/dist/memory/mmr-reranker.d.ts +39 -0
  115. package/dist/memory/mmr-reranker.d.ts.map +1 -0
  116. package/dist/memory/mmr-reranker.js +115 -0
  117. package/dist/memory/mmr-reranker.js.map +1 -0
  118. package/dist/memory/pre-flight.d.ts +24 -0
  119. package/dist/memory/pre-flight.d.ts.map +1 -0
  120. package/dist/memory/pre-flight.js +121 -0
  121. package/dist/memory/pre-flight.js.map +1 -0
  122. package/dist/memory/preference-learner.d.ts +28 -0
  123. package/dist/memory/preference-learner.d.ts.map +1 -0
  124. package/dist/memory/preference-learner.js +144 -0
  125. package/dist/memory/preference-learner.js.map +1 -0
  126. package/dist/memory/query-expansion.d.ts +28 -0
  127. package/dist/memory/query-expansion.d.ts.map +1 -0
  128. package/dist/memory/query-expansion.js +140 -0
  129. package/dist/memory/query-expansion.js.map +1 -0
  130. package/dist/memory/regression-guard.d.ts +35 -0
  131. package/dist/memory/regression-guard.d.ts.map +1 -0
  132. package/dist/memory/regression-guard.js +90 -0
  133. package/dist/memory/regression-guard.js.map +1 -0
  134. package/dist/memory/resume-work.d.ts +37 -0
  135. package/dist/memory/resume-work.d.ts.map +1 -0
  136. package/dist/memory/resume-work.js +141 -0
  137. package/dist/memory/resume-work.js.map +1 -0
  138. package/dist/memory/session-tracker.d.ts +2 -0
  139. package/dist/memory/session-tracker.d.ts.map +1 -1
  140. package/dist/memory/session-tracker.js +26 -8
  141. package/dist/memory/session-tracker.js.map +1 -1
  142. package/dist/memory/soul-manager.d.ts +30 -0
  143. package/dist/memory/soul-manager.d.ts.map +1 -0
  144. package/dist/memory/soul-manager.js +171 -0
  145. package/dist/memory/soul-manager.js.map +1 -0
  146. package/dist/memory/success-tracker.d.ts +33 -0
  147. package/dist/memory/success-tracker.d.ts.map +1 -0
  148. package/dist/memory/success-tracker.js +75 -0
  149. package/dist/memory/success-tracker.js.map +1 -0
  150. package/dist/memory/temporal-engine.d.ts.map +1 -1
  151. package/dist/memory/temporal-engine.js +9 -13
  152. package/dist/memory/temporal-engine.js.map +1 -1
  153. package/dist/memory/tool-recommender.d.ts +29 -0
  154. package/dist/memory/tool-recommender.d.ts.map +1 -0
  155. package/dist/memory/tool-recommender.js +117 -0
  156. package/dist/memory/tool-recommender.js.map +1 -0
  157. package/dist/memory/usage-stats.d.ts +98 -0
  158. package/dist/memory/usage-stats.d.ts.map +1 -0
  159. package/dist/memory/usage-stats.js +345 -0
  160. package/dist/memory/usage-stats.js.map +1 -0
  161. package/dist/retrieval/hybrid-retriever.d.ts +0 -2
  162. package/dist/retrieval/hybrid-retriever.d.ts.map +1 -1
  163. package/dist/retrieval/hybrid-retriever.js +3 -13
  164. package/dist/retrieval/hybrid-retriever.js.map +1 -1
  165. package/dist/scanners/architecture-graph.js +2 -2
  166. package/dist/scanners/architecture-graph.js.map +1 -1
  167. package/dist/scanners/code-verifier.d.ts +1 -0
  168. package/dist/scanners/code-verifier.d.ts.map +1 -1
  169. package/dist/scanners/code-verifier.js +14 -14
  170. package/dist/scanners/code-verifier.js.map +1 -1
  171. package/dist/scanners/context-builder.d.ts.map +1 -1
  172. package/dist/scanners/context-builder.js +33 -45
  173. package/dist/scanners/context-builder.js.map +1 -1
  174. package/dist/scanners/export-map.js +2 -2
  175. package/dist/scanners/export-map.js.map +1 -1
  176. package/dist/scanners/project-scanner.js +2 -2
  177. package/dist/scanners/project-scanner.js.map +1 -1
  178. package/dist/security/encryption.js +1 -1
  179. package/dist/security/encryption.js.map +1 -1
  180. package/dist/security/feature-gate.d.ts.map +1 -1
  181. package/dist/security/feature-gate.js +62 -20
  182. package/dist/security/feature-gate.js.map +1 -1
  183. package/dist/security/license.js +282 -35
  184. package/dist/security/license.js.map +1 -1
  185. package/dist/security/rate-limiter.d.ts +4 -3
  186. package/dist/security/rate-limiter.d.ts.map +1 -1
  187. package/dist/security/rate-limiter.js +11 -29
  188. package/dist/security/rate-limiter.js.map +1 -1
  189. package/dist/server/dashboard.js +166 -327
  190. package/dist/server/dashboard.js.map +1 -1
  191. package/dist/server/mcp-handler.d.ts.map +1 -1
  192. package/dist/server/mcp-handler.js +1000 -792
  193. package/dist/server/mcp-handler.js.map +1 -1
  194. package/dist/utils/extract-tags.d.ts +16 -0
  195. package/dist/utils/extract-tags.d.ts.map +1 -0
  196. package/dist/utils/extract-tags.js +40 -0
  197. package/dist/utils/extract-tags.js.map +1 -0
  198. package/package.json +18 -8
  199. package/dist/core/event-bus.d.ts +0 -19
  200. package/dist/core/event-bus.d.ts.map +0 -1
  201. package/dist/core/event-bus.js +0 -51
  202. 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 && !stopWords.has(w));
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":"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"}
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":"AAAA;;;;;;;;;;;;;GAaG;AAOH,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;CACrB;AAwHD;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAMxC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;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
+ {"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
- // Check multiple API key sources
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
- // Detect which provider based on key prefix
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, OpenRouter, local)
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(10000, () => {
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.baseUrl.includes('anthropic'))
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: extractKeywordTags(text),
218
+ tags: (0, extract_tags_1.extractTags)(text),
199
219
  };
200
220
  if (!isLLMAvailable() || !_config) {
201
221
  return fallback;