cortex-mcp 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +202 -0
  4. package/dist/cli/setup.d.ts +12 -0
  5. package/dist/cli/setup.d.ts.map +1 -0
  6. package/dist/cli/setup.js +293 -0
  7. package/dist/cli/setup.js.map +1 -0
  8. package/dist/config/config.d.ts +13 -0
  9. package/dist/config/config.d.ts.map +1 -0
  10. package/dist/config/config.js +33 -0
  11. package/dist/config/config.js.map +1 -0
  12. package/dist/core/event-bus.d.ts +19 -0
  13. package/dist/core/event-bus.d.ts.map +1 -0
  14. package/dist/core/event-bus.js +51 -0
  15. package/dist/core/event-bus.js.map +1 -0
  16. package/dist/db/database.d.ts +19 -0
  17. package/dist/db/database.d.ts.map +1 -0
  18. package/dist/db/database.js +254 -0
  19. package/dist/db/database.js.map +1 -0
  20. package/dist/db/event-log.d.ts +28 -0
  21. package/dist/db/event-log.d.ts.map +1 -0
  22. package/dist/db/event-log.js +87 -0
  23. package/dist/db/event-log.js.map +1 -0
  24. package/dist/db/memory-store.d.ts +65 -0
  25. package/dist/db/memory-store.d.ts.map +1 -0
  26. package/dist/db/memory-store.js +370 -0
  27. package/dist/db/memory-store.js.map +1 -0
  28. package/dist/embedding-worker.d.ts +3 -0
  29. package/dist/embedding-worker.d.ts.map +1 -0
  30. package/dist/embedding-worker.js +94 -0
  31. package/dist/embedding-worker.js.map +1 -0
  32. package/dist/hooks/cortex-run.d.ts +15 -0
  33. package/dist/hooks/cortex-run.d.ts.map +1 -0
  34. package/dist/hooks/cortex-run.js +148 -0
  35. package/dist/hooks/cortex-run.js.map +1 -0
  36. package/dist/hooks/git-capture.d.ts +21 -0
  37. package/dist/hooks/git-capture.d.ts.map +1 -0
  38. package/dist/hooks/git-capture.js +178 -0
  39. package/dist/hooks/git-capture.js.map +1 -0
  40. package/dist/hooks/git-hooks.d.ts +12 -0
  41. package/dist/hooks/git-hooks.d.ts.map +1 -0
  42. package/dist/hooks/git-hooks.js +130 -0
  43. package/dist/hooks/git-hooks.js.map +1 -0
  44. package/dist/mcp-stdio.d.ts +10 -0
  45. package/dist/mcp-stdio.d.ts.map +1 -0
  46. package/dist/mcp-stdio.js +247 -0
  47. package/dist/mcp-stdio.js.map +1 -0
  48. package/dist/memory/anticipation-engine.d.ts +19 -0
  49. package/dist/memory/anticipation-engine.d.ts.map +1 -0
  50. package/dist/memory/anticipation-engine.js +76 -0
  51. package/dist/memory/anticipation-engine.js.map +1 -0
  52. package/dist/memory/attention-ranker.d.ts +19 -0
  53. package/dist/memory/attention-ranker.d.ts.map +1 -0
  54. package/dist/memory/attention-ranker.js +97 -0
  55. package/dist/memory/attention-ranker.js.map +1 -0
  56. package/dist/memory/auto-learner.d.ts +20 -0
  57. package/dist/memory/auto-learner.d.ts.map +1 -0
  58. package/dist/memory/auto-learner.js +179 -0
  59. package/dist/memory/auto-learner.js.map +1 -0
  60. package/dist/memory/confidence-decay.d.ts +22 -0
  61. package/dist/memory/confidence-decay.d.ts.map +1 -0
  62. package/dist/memory/confidence-decay.js +54 -0
  63. package/dist/memory/confidence-decay.js.map +1 -0
  64. package/dist/memory/embedding-manager.d.ts +5 -0
  65. package/dist/memory/embedding-manager.d.ts.map +1 -0
  66. package/dist/memory/embedding-manager.js +118 -0
  67. package/dist/memory/embedding-manager.js.map +1 -0
  68. package/dist/memory/export-import.d.ts +49 -0
  69. package/dist/memory/export-import.d.ts.map +1 -0
  70. package/dist/memory/export-import.js +131 -0
  71. package/dist/memory/export-import.js.map +1 -0
  72. package/dist/memory/git-memory.d.ts +15 -0
  73. package/dist/memory/git-memory.d.ts.map +1 -0
  74. package/dist/memory/git-memory.js +178 -0
  75. package/dist/memory/git-memory.js.map +1 -0
  76. package/dist/memory/learning-rate.d.ts +24 -0
  77. package/dist/memory/learning-rate.d.ts.map +1 -0
  78. package/dist/memory/learning-rate.js +95 -0
  79. package/dist/memory/learning-rate.js.map +1 -0
  80. package/dist/memory/llm-enhancer.d.ts +54 -0
  81. package/dist/memory/llm-enhancer.d.ts.map +1 -0
  82. package/dist/memory/llm-enhancer.js +270 -0
  83. package/dist/memory/llm-enhancer.js.map +1 -0
  84. package/dist/memory/memory-cache.d.ts +5 -0
  85. package/dist/memory/memory-cache.d.ts.map +1 -0
  86. package/dist/memory/memory-cache.js +37 -0
  87. package/dist/memory/memory-cache.js.map +1 -0
  88. package/dist/memory/memory-consolidator.d.ts +14 -0
  89. package/dist/memory/memory-consolidator.d.ts.map +1 -0
  90. package/dist/memory/memory-consolidator.js +156 -0
  91. package/dist/memory/memory-consolidator.js.map +1 -0
  92. package/dist/memory/memory-decay.d.ts +10 -0
  93. package/dist/memory/memory-decay.d.ts.map +1 -0
  94. package/dist/memory/memory-decay.js +79 -0
  95. package/dist/memory/memory-decay.js.map +1 -0
  96. package/dist/memory/memory-quality.d.ts +37 -0
  97. package/dist/memory/memory-quality.d.ts.map +1 -0
  98. package/dist/memory/memory-quality.js +203 -0
  99. package/dist/memory/memory-quality.js.map +1 -0
  100. package/dist/memory/memory-ranker.d.ts +14 -0
  101. package/dist/memory/memory-ranker.d.ts.map +1 -0
  102. package/dist/memory/memory-ranker.js +68 -0
  103. package/dist/memory/memory-ranker.js.map +1 -0
  104. package/dist/memory/meta-memory.d.ts +11 -0
  105. package/dist/memory/meta-memory.d.ts.map +1 -0
  106. package/dist/memory/meta-memory.js +141 -0
  107. package/dist/memory/meta-memory.js.map +1 -0
  108. package/dist/memory/session-tracker.d.ts +39 -0
  109. package/dist/memory/session-tracker.d.ts.map +1 -0
  110. package/dist/memory/session-tracker.js +127 -0
  111. package/dist/memory/session-tracker.js.map +1 -0
  112. package/dist/memory/temporal-engine.d.ts +25 -0
  113. package/dist/memory/temporal-engine.d.ts.map +1 -0
  114. package/dist/memory/temporal-engine.js +106 -0
  115. package/dist/memory/temporal-engine.js.map +1 -0
  116. package/dist/retrieval/hybrid-retriever.d.ts +23 -0
  117. package/dist/retrieval/hybrid-retriever.d.ts.map +1 -0
  118. package/dist/retrieval/hybrid-retriever.js +120 -0
  119. package/dist/retrieval/hybrid-retriever.js.map +1 -0
  120. package/dist/scanners/architecture-graph.d.ts +30 -0
  121. package/dist/scanners/architecture-graph.d.ts.map +1 -0
  122. package/dist/scanners/architecture-graph.js +315 -0
  123. package/dist/scanners/architecture-graph.js.map +1 -0
  124. package/dist/scanners/code-verifier.d.ts +70 -0
  125. package/dist/scanners/code-verifier.d.ts.map +1 -0
  126. package/dist/scanners/code-verifier.js +374 -0
  127. package/dist/scanners/code-verifier.js.map +1 -0
  128. package/dist/scanners/context-builder.d.ts +19 -0
  129. package/dist/scanners/context-builder.d.ts.map +1 -0
  130. package/dist/scanners/context-builder.js +102 -0
  131. package/dist/scanners/context-builder.js.map +1 -0
  132. package/dist/scanners/export-map.d.ts +22 -0
  133. package/dist/scanners/export-map.d.ts.map +1 -0
  134. package/dist/scanners/export-map.js +249 -0
  135. package/dist/scanners/export-map.js.map +1 -0
  136. package/dist/scanners/file-verifier.d.ts +22 -0
  137. package/dist/scanners/file-verifier.d.ts.map +1 -0
  138. package/dist/scanners/file-verifier.js +140 -0
  139. package/dist/scanners/file-verifier.js.map +1 -0
  140. package/dist/scanners/project-scanner.d.ts +31 -0
  141. package/dist/scanners/project-scanner.d.ts.map +1 -0
  142. package/dist/scanners/project-scanner.js +398 -0
  143. package/dist/scanners/project-scanner.js.map +1 -0
  144. package/dist/security/encryption.d.ts +15 -0
  145. package/dist/security/encryption.d.ts.map +1 -0
  146. package/dist/security/encryption.js +116 -0
  147. package/dist/security/encryption.js.map +1 -0
  148. package/dist/security/feature-gate.d.ts +30 -0
  149. package/dist/security/feature-gate.d.ts.map +1 -0
  150. package/dist/security/feature-gate.js +91 -0
  151. package/dist/security/feature-gate.js.map +1 -0
  152. package/dist/security/license.d.ts +24 -0
  153. package/dist/security/license.d.ts.map +1 -0
  154. package/dist/security/license.js +168 -0
  155. package/dist/security/license.js.map +1 -0
  156. package/dist/security/rate-limiter.d.ts +20 -0
  157. package/dist/security/rate-limiter.d.ts.map +1 -0
  158. package/dist/security/rate-limiter.js +60 -0
  159. package/dist/security/rate-limiter.js.map +1 -0
  160. package/dist/server/dashboard.d.ts +3 -0
  161. package/dist/server/dashboard.d.ts.map +1 -0
  162. package/dist/server/dashboard.js +258 -0
  163. package/dist/server/dashboard.js.map +1 -0
  164. package/dist/server/mcp-handler.d.ts +12 -0
  165. package/dist/server/mcp-handler.d.ts.map +1 -0
  166. package/dist/server/mcp-handler.js +1392 -0
  167. package/dist/server/mcp-handler.js.map +1 -0
  168. package/dist/strategies/embedders/local-minilm.d.ts +35 -0
  169. package/dist/strategies/embedders/local-minilm.d.ts.map +1 -0
  170. package/dist/strategies/embedders/local-minilm.js +176 -0
  171. package/dist/strategies/embedders/local-minilm.js.map +1 -0
  172. package/dist/types.d.ts +207 -0
  173. package/dist/types.d.ts.map +1 -0
  174. package/dist/types.js +83 -0
  175. package/dist/types.js.map +1 -0
  176. package/package.json +87 -0
@@ -0,0 +1,54 @@
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
+ export interface LLMEnhancedMemory {
16
+ type: string;
17
+ intent: string;
18
+ action: string;
19
+ tags: string[];
20
+ reason?: string;
21
+ connections?: string[];
22
+ }
23
+ export interface LLMConfig {
24
+ apiKey: string;
25
+ model: string;
26
+ baseUrl: string;
27
+ maxTokens: number;
28
+ }
29
+ /**
30
+ * Check if LLM enhancement is available (API key configured).
31
+ */
32
+ export declare function isLLMAvailable(): boolean;
33
+ /**
34
+ * Get which LLM provider is configured.
35
+ */
36
+ export declare function getLLMProvider(): string;
37
+ /**
38
+ * Enhance a memory with LLM intelligence.
39
+ * Falls back to keyword-based classification if no API key.
40
+ */
41
+ export declare function enhanceMemory(text: string, context?: {
42
+ files?: string[];
43
+ commitHash?: string;
44
+ }): Promise<LLMEnhancedMemory>;
45
+ /**
46
+ * Summarize multiple related memories into one.
47
+ * Only works with LLM, returns null without API key.
48
+ */
49
+ export declare function summarizeMemories(memories: Array<{
50
+ intent: string;
51
+ type: string;
52
+ timestamp: number;
53
+ }>): Promise<string | null>;
54
+ //# sourceMappingURL=llm-enhancer.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,270 @@
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
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.isLLMAvailable = isLLMAvailable;
51
+ exports.getLLMProvider = getLLMProvider;
52
+ exports.enhanceMemory = enhanceMemory;
53
+ exports.summarizeMemories = summarizeMemories;
54
+ const https = __importStar(require("https"));
55
+ const http = __importStar(require("http"));
56
+ // ─── Config Detection ─────────────────────────────────────────────────────────
57
+ function detectLLMConfig() {
58
+ // Check multiple API key sources
59
+ const apiKey = process.env.OPENAI_API_KEY
60
+ || process.env.CORTEX_LLM_KEY
61
+ || process.env.ANTHROPIC_API_KEY
62
+ || null;
63
+ if (!apiKey)
64
+ return null;
65
+ // Detect which provider based on key prefix
66
+ if (apiKey.startsWith('sk-ant-')) {
67
+ return {
68
+ apiKey,
69
+ model: process.env.CORTEX_LLM_MODEL || 'claude-3-haiku-20240307',
70
+ baseUrl: 'https://api.anthropic.com',
71
+ maxTokens: 200,
72
+ };
73
+ }
74
+ // Default to OpenAI-compatible (works with OpenAI, OpenRouter, local)
75
+ return {
76
+ apiKey,
77
+ model: process.env.CORTEX_LLM_MODEL || 'gpt-4o-mini',
78
+ baseUrl: process.env.CORTEX_LLM_BASE_URL || 'https://api.openai.com',
79
+ maxTokens: 200,
80
+ };
81
+ }
82
+ // ─── LLM Call ─────────────────────────────────────────────────────────────────
83
+ function callOpenAI(config, prompt) {
84
+ return new Promise((resolve, reject) => {
85
+ const url = new URL('/v1/chat/completions', config.baseUrl);
86
+ const body = JSON.stringify({
87
+ model: config.model,
88
+ messages: [{ role: 'user', content: prompt }],
89
+ max_tokens: config.maxTokens,
90
+ temperature: 0.1,
91
+ });
92
+ const options = {
93
+ hostname: url.hostname,
94
+ port: url.port || 443,
95
+ path: url.pathname,
96
+ method: 'POST',
97
+ headers: {
98
+ 'Content-Type': 'application/json',
99
+ 'Authorization': `Bearer ${config.apiKey}`,
100
+ 'Content-Length': Buffer.byteLength(body),
101
+ },
102
+ };
103
+ const transport = url.protocol === 'https:' ? https : http;
104
+ const req = transport.request(options, (res) => {
105
+ let data = '';
106
+ res.on('data', (chunk) => data += chunk);
107
+ res.on('end', () => {
108
+ try {
109
+ const json = JSON.parse(data);
110
+ const content = json.choices?.[0]?.message?.content || '';
111
+ resolve(content.trim());
112
+ }
113
+ catch {
114
+ reject(new Error('Failed to parse LLM response'));
115
+ }
116
+ });
117
+ });
118
+ req.on('error', reject);
119
+ req.setTimeout(10000, () => {
120
+ req.destroy();
121
+ reject(new Error('LLM request timeout'));
122
+ });
123
+ req.write(body);
124
+ req.end();
125
+ });
126
+ }
127
+ // ─── Keyword Fallback (No API Key) ────────────────────────────────────────────
128
+ function classifyByKeywords(text) {
129
+ const lower = text.toLowerCase();
130
+ if (/\b(fix|bug|patch|hotfix|resolve|repair|correct|issue|crash|error)\b/.test(lower))
131
+ return 'BUG_FIX';
132
+ if (/\b(refactor|clean|rename|restructure|reorganize|lint|format|style|convention)\b/.test(lower))
133
+ return 'CONVENTION';
134
+ if (/\b(feat|add|implement|create|new|introduce|support|enable|integrate|decide)\b/.test(lower))
135
+ return 'DECISION';
136
+ if (/\b(doc|readme|comment|explain|note|changelog|learn|discover|insight)\b/.test(lower))
137
+ return 'INSIGHT';
138
+ if (/\b(test|spec|coverage|assert|verify)\b/.test(lower))
139
+ return 'CONVENTION';
140
+ if (/\b(revert|rollback|undo)\b/.test(lower))
141
+ return 'BUG_FIX';
142
+ return 'DECISION';
143
+ }
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
+ // ─── Public API ───────────────────────────────────────────────────────────────
166
+ let _config = undefined;
167
+ let _available = undefined;
168
+ /**
169
+ * Check if LLM enhancement is available (API key configured).
170
+ */
171
+ function isLLMAvailable() {
172
+ if (_available === undefined) {
173
+ _config = detectLLMConfig();
174
+ _available = _config !== null;
175
+ }
176
+ return _available;
177
+ }
178
+ /**
179
+ * Get which LLM provider is configured.
180
+ */
181
+ function getLLMProvider() {
182
+ if (!isLLMAvailable() || !_config)
183
+ return 'none';
184
+ if (_config.baseUrl.includes('anthropic'))
185
+ return `anthropic/${_config.model}`;
186
+ return `openai/${_config.model}`;
187
+ }
188
+ /**
189
+ * Enhance a memory with LLM intelligence.
190
+ * Falls back to keyword-based classification if no API key.
191
+ */
192
+ async function enhanceMemory(text, context) {
193
+ // Keyword fallback (always works, free)
194
+ const fallback = {
195
+ type: classifyByKeywords(text),
196
+ intent: text.length > 200 ? text.slice(0, 200) + '...' : text,
197
+ action: text,
198
+ tags: extractKeywordTags(text),
199
+ };
200
+ if (!isLLMAvailable() || !_config) {
201
+ return fallback;
202
+ }
203
+ // LLM enhancement
204
+ try {
205
+ const filesContext = context?.files?.length
206
+ ? `\nFiles involved: ${context.files.slice(0, 5).join(', ')}`
207
+ : '';
208
+ const prompt = `Analyze this developer activity and return JSON only (no markdown):
209
+ {
210
+ "type": "BUG_FIX" | "DECISION" | "CONVENTION" | "INSIGHT" | "CORRECTION",
211
+ "intent": "one-line summary of what happened",
212
+ "action": "what was done and why (2-3 sentences max)",
213
+ "tags": ["relevant", "topic", "tags"],
214
+ "connections": ["related concepts or patterns"]
215
+ }
216
+
217
+ Activity: ${text}${filesContext}
218
+
219
+ Rules:
220
+ - BUG_FIX = fixed a bug or error
221
+ - DECISION = chose a technology, approach, or architecture
222
+ - CONVENTION = established or followed a coding pattern
223
+ - INSIGHT = learned something useful
224
+ - CORRECTION = corrected a previous mistake
225
+ - Keep intent under 100 chars
226
+ - Max 5 tags, max 3 connections`;
227
+ const response = await callOpenAI(_config, prompt);
228
+ // Parse JSON from response
229
+ const jsonMatch = response.match(/\{[\s\S]*\}/);
230
+ if (jsonMatch) {
231
+ const parsed = JSON.parse(jsonMatch[0]);
232
+ return {
233
+ type: parsed.type || fallback.type,
234
+ intent: parsed.intent || fallback.intent,
235
+ action: parsed.action || fallback.action,
236
+ tags: Array.isArray(parsed.tags) ? parsed.tags.slice(0, 5) : fallback.tags,
237
+ connections: Array.isArray(parsed.connections) ? parsed.connections.slice(0, 3) : undefined,
238
+ };
239
+ }
240
+ }
241
+ catch (err) {
242
+ // LLM failed — fall back silently
243
+ console.log(`[cortex] LLM enhancement failed (using keywords): ${err.message}`);
244
+ }
245
+ return fallback;
246
+ }
247
+ /**
248
+ * Summarize multiple related memories into one.
249
+ * Only works with LLM, returns null without API key.
250
+ */
251
+ async function summarizeMemories(memories) {
252
+ if (!isLLMAvailable() || !_config || memories.length < 2)
253
+ return null;
254
+ try {
255
+ const items = memories
256
+ .slice(0, 10)
257
+ .map((m, i) => `${i + 1}. [${m.type}] ${m.intent}`)
258
+ .join('\n');
259
+ const prompt = `Summarize these related developer memories into one concise statement (1-2 sentences):
260
+
261
+ ${items}
262
+
263
+ Return ONLY the summary text, nothing else.`;
264
+ return await callOpenAI(_config, prompt);
265
+ }
266
+ catch {
267
+ return null;
268
+ }
269
+ }
270
+ //# sourceMappingURL=llm-enhancer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-enhancer.js","sourceRoot":"","sources":["../../src/memory/llm-enhancer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function getCached(key: string): any | null;
2
+ export declare function setCache(key: string, result: any): void;
3
+ export declare function invalidateCache(): void;
4
+ export declare function cacheSize(): number;
5
+ //# sourceMappingURL=memory-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-cache.d.ts","sourceRoot":"","sources":["../../src/memory/memory-cache.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAQjD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAMvD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCached = getCached;
4
+ exports.setCache = setCache;
5
+ exports.invalidateCache = invalidateCache;
6
+ exports.cacheSize = cacheSize;
7
+ /**
8
+ * Memory Cache — LRU result cache for fast repeat queries.
9
+ * Extracted from standalone.ts L645-666.
10
+ */
11
+ const config_1 = require("../config/config");
12
+ const recallCache = new Map();
13
+ function getCached(key) {
14
+ const entry = recallCache.get(key);
15
+ if (!entry)
16
+ return null;
17
+ if (Date.now() - entry.time > config_1.CONFIG.CACHE_TTL) {
18
+ recallCache.delete(key);
19
+ return null;
20
+ }
21
+ return entry.result;
22
+ }
23
+ function setCache(key, result) {
24
+ if (recallCache.size >= config_1.CONFIG.CACHE_MAX) {
25
+ const oldest = recallCache.keys().next().value;
26
+ if (oldest)
27
+ recallCache.delete(oldest);
28
+ }
29
+ recallCache.set(key, { result, time: Date.now() });
30
+ }
31
+ function invalidateCache() {
32
+ recallCache.clear();
33
+ }
34
+ function cacheSize() {
35
+ return recallCache.size;
36
+ }
37
+ //# sourceMappingURL=memory-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-cache.js","sourceRoot":"","sources":["../../src/memory/memory-cache.ts"],"names":[],"mappings":";;AAQA,8BAQC;AAED,4BAMC;AAED,0CAEC;AAED,8BAEC;AAhCD;;;GAGG;AACH,6CAA0C;AAE1C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyC,CAAC;AAErE,SAAgB,SAAS,CAAC,GAAW;IACjC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG,eAAM,CAAC,SAAS,EAAE,CAAC;QAC7C,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAW,EAAE,MAAW;IAC7C,IAAI,WAAW,CAAC,IAAI,IAAI,eAAM,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC/C,IAAI,MAAM;YAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,eAAe;IAC3B,WAAW,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,SAAgB,SAAS;IACrB,OAAO,WAAW,CAAC,IAAI,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Memory Consolidator — Merges similar memories into higher-level insights.
3
+ *
4
+ * Like how a human brain consolidates daily experiences during sleep:
5
+ * 5 separate "fixed auth bug" memories → 1 insight: "Auth system has recurring issues."
6
+ *
7
+ * No LLM needed — uses word overlap + template-based summarization.
8
+ */
9
+ import { MemoryStore } from '../db/memory-store';
10
+ /** Run consolidation — merges similar active memories. Returns count of merges. */
11
+ export declare function consolidateMemories(memoryStore: MemoryStore): number;
12
+ /** Check if consolidation should run (e.g., after force_recall) */
13
+ export declare function shouldConsolidate(memoryStore: MemoryStore): boolean;
14
+ //# sourceMappingURL=memory-consolidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-consolidator.d.ts","sourceRoot":"","sources":["../../src/memory/memory-consolidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUjD,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CA2CpE;AAyHD,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAEnE"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.consolidateMemories = consolidateMemories;
4
+ exports.shouldConsolidate = shouldConsolidate;
5
+ const types_1 = require("../types");
6
+ /** Run consolidation — merges similar active memories. Returns count of merges. */
7
+ function consolidateMemories(memoryStore) {
8
+ const active = memoryStore.getActive(500);
9
+ if (active.length < 10)
10
+ return 0; // Not enough to consolidate
11
+ let mergeCount = 0;
12
+ // Group by type first
13
+ const byType = new Map();
14
+ for (const m of active) {
15
+ const arr = byType.get(m.type) || [];
16
+ arr.push(m);
17
+ byType.set(m.type, arr);
18
+ }
19
+ // Within each type, find similar groups
20
+ for (const [type, memories] of byType) {
21
+ if (memories.length < 3)
22
+ continue;
23
+ const groups = findSimilarGroups(memories);
24
+ for (const group of groups) {
25
+ if (group.memories.length < 3)
26
+ continue;
27
+ // Create merged memory
28
+ const merged = createMergedMemory(group, type);
29
+ const newMemory = memoryStore.add(merged);
30
+ // Deactivate originals, link to merged
31
+ for (const old of group.memories) {
32
+ memoryStore.deactivate(old.id, newMemory.id);
33
+ memoryStore.addEdge({
34
+ sourceId: old.id,
35
+ targetId: newMemory.id,
36
+ relation: types_1.EdgeRelation.REPLACED_BY,
37
+ weight: 0.9,
38
+ timestamp: Date.now(),
39
+ });
40
+ }
41
+ mergeCount++;
42
+ }
43
+ }
44
+ return mergeCount;
45
+ }
46
+ /** Find groups of similar memories based on word overlap */
47
+ function findSimilarGroups(memories) {
48
+ const groups = [];
49
+ const used = new Set();
50
+ for (let i = 0; i < memories.length; i++) {
51
+ if (used.has(memories[i].id))
52
+ continue;
53
+ const group = [memories[i]];
54
+ const wordsI = tokenize(memories[i].intent);
55
+ for (let j = i + 1; j < memories.length; j++) {
56
+ if (used.has(memories[j].id))
57
+ continue;
58
+ const wordsJ = tokenize(memories[j].intent);
59
+ const similarity = jaccardSimilarity(wordsI, wordsJ);
60
+ if (similarity > 0.5) { // 50% word overlap = similar enough
61
+ group.push(memories[j]);
62
+ }
63
+ }
64
+ if (group.length >= 3) {
65
+ for (const m of group)
66
+ used.add(m.id);
67
+ const allWords = group.flatMap(m => tokenize(m.intent));
68
+ const wordFreq = new Map();
69
+ for (const w of allWords)
70
+ wordFreq.set(w, (wordFreq.get(w) || 0) + 1);
71
+ // Common words = appear in majority of the group
72
+ const threshold = Math.ceil(group.length * 0.6);
73
+ const commonWords = [...wordFreq.entries()]
74
+ .filter(([, count]) => count >= threshold)
75
+ .sort((a, b) => b[1] - a[1])
76
+ .map(([word]) => word)
77
+ .slice(0, 10);
78
+ groups.push({
79
+ type: group[0].type,
80
+ memories: group,
81
+ commonWords,
82
+ similarity: 0.5, // approximate
83
+ });
84
+ }
85
+ }
86
+ return groups;
87
+ }
88
+ /** Create a merged memory from a group */
89
+ function createMergedMemory(group, type) {
90
+ const count = group.memories.length;
91
+ const topicWords = group.commonWords.slice(0, 5).join(', ');
92
+ // Template-based summarization
93
+ const templates = {
94
+ [types_1.MemoryType.BUG_FIX]: `Recurring bug pattern (${count} fixes): topics: ${topicWords}`,
95
+ [types_1.MemoryType.CORRECTION]: `Repeated correction (${count}x): ${topicWords} — pattern suggests this area needs attention`,
96
+ [types_1.MemoryType.DECISION]: `Consolidated decision (${count} related): ${topicWords}`,
97
+ [types_1.MemoryType.CONVENTION]: `Established convention (${count} mentions): ${topicWords}`,
98
+ [types_1.MemoryType.INSIGHT]: `Key insight (from ${count} observations): ${topicWords}`,
99
+ };
100
+ const intent = templates[type] || `Consolidated memory (${count}): ${topicWords}`;
101
+ // Collect all unique files
102
+ const allFiles = new Set();
103
+ for (const m of group.memories) {
104
+ if (m.relatedFiles)
105
+ m.relatedFiles.forEach(f => allFiles.add(f));
106
+ }
107
+ // Collect all unique tags
108
+ const allTags = new Set();
109
+ allTags.add('consolidated');
110
+ for (const m of group.memories) {
111
+ if (m.tags)
112
+ m.tags.forEach(t => allTags.add(t));
113
+ }
114
+ // Average importance (boosted because consolidation = important pattern)
115
+ const avgImportance = group.memories.reduce((sum, m) => sum + m.importance, 0) / count;
116
+ const boostedImportance = Math.min(1.0, avgImportance * 1.2);
117
+ return {
118
+ type,
119
+ intent,
120
+ action: `Merged ${count} similar memories about: ${topicWords}. Originals deactivated.`,
121
+ reason: `Auto-consolidated: ${count} memories shared >50% word overlap`,
122
+ relatedFiles: [...allFiles],
123
+ tags: [...allTags],
124
+ confidence: 0.85,
125
+ importance: boostedImportance,
126
+ timestamp: Date.now(),
127
+ isActive: true,
128
+ accessCount: 0,
129
+ createdAt: Date.now(),
130
+ };
131
+ }
132
+ /** Jaccard similarity between two word sets */
133
+ function jaccardSimilarity(a, b) {
134
+ const setA = new Set(a);
135
+ const setB = new Set(b);
136
+ let intersection = 0;
137
+ for (const word of setA) {
138
+ if (setB.has(word))
139
+ intersection++;
140
+ }
141
+ const union = setA.size + setB.size - intersection;
142
+ return union === 0 ? 0 : intersection / union;
143
+ }
144
+ /** Tokenize text into lowercase words */
145
+ function tokenize(text) {
146
+ const stopWords = new Set(['the', 'a', 'an', 'is', 'was', 'are', 'were', 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'it', 'this', 'that', 'and', 'or', 'but']);
147
+ return text.toLowerCase()
148
+ .replace(/[^a-z0-9\s]/g, ' ')
149
+ .split(/\s+/)
150
+ .filter(w => w.length > 2 && !stopWords.has(w));
151
+ }
152
+ /** Check if consolidation should run (e.g., after force_recall) */
153
+ function shouldConsolidate(memoryStore) {
154
+ return memoryStore.activeCount() > 50;
155
+ }
156
+ //# sourceMappingURL=memory-consolidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-consolidator.js","sourceRoot":"","sources":["../../src/memory/memory-consolidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Memory Decay — Cleanup stale and low-value memories.
3
+ * Extracted from standalone.ts L668-711.
4
+ *
5
+ * NEW: Duplicate detection — merges identical memories instead of keeping copies.
6
+ * NEW: Memory strengthening — repeated patterns increase importance.
7
+ */
8
+ import { MemoryStore } from '../db/memory-store';
9
+ export declare function cleanupMemories(memoryStore: MemoryStore): void;
10
+ //# sourceMappingURL=memory-decay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-decay.d.ts","sourceRoot":"","sources":["../../src/memory/memory-decay.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKjD,wBAAgB,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CA8E9D"}