cortex-mcp 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/dist/cli/setup.d.ts +12 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +293 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config/config.d.ts +13 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +33 -0
- package/dist/config/config.js.map +1 -0
- package/dist/core/event-bus.d.ts +19 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +51 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/db/database.d.ts +19 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +254 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/event-log.d.ts +28 -0
- package/dist/db/event-log.d.ts.map +1 -0
- package/dist/db/event-log.js +87 -0
- package/dist/db/event-log.js.map +1 -0
- package/dist/db/memory-store.d.ts +65 -0
- package/dist/db/memory-store.d.ts.map +1 -0
- package/dist/db/memory-store.js +370 -0
- package/dist/db/memory-store.js.map +1 -0
- package/dist/embedding-worker.d.ts +3 -0
- package/dist/embedding-worker.d.ts.map +1 -0
- package/dist/embedding-worker.js +94 -0
- package/dist/embedding-worker.js.map +1 -0
- package/dist/hooks/cortex-run.d.ts +15 -0
- package/dist/hooks/cortex-run.d.ts.map +1 -0
- package/dist/hooks/cortex-run.js +148 -0
- package/dist/hooks/cortex-run.js.map +1 -0
- package/dist/hooks/git-capture.d.ts +21 -0
- package/dist/hooks/git-capture.d.ts.map +1 -0
- package/dist/hooks/git-capture.js +178 -0
- package/dist/hooks/git-capture.js.map +1 -0
- package/dist/hooks/git-hooks.d.ts +12 -0
- package/dist/hooks/git-hooks.d.ts.map +1 -0
- package/dist/hooks/git-hooks.js +130 -0
- package/dist/hooks/git-hooks.js.map +1 -0
- package/dist/mcp-stdio.d.ts +10 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +247 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/memory/anticipation-engine.d.ts +19 -0
- package/dist/memory/anticipation-engine.d.ts.map +1 -0
- package/dist/memory/anticipation-engine.js +76 -0
- package/dist/memory/anticipation-engine.js.map +1 -0
- package/dist/memory/attention-ranker.d.ts +19 -0
- package/dist/memory/attention-ranker.d.ts.map +1 -0
- package/dist/memory/attention-ranker.js +97 -0
- package/dist/memory/attention-ranker.js.map +1 -0
- package/dist/memory/auto-learner.d.ts +20 -0
- package/dist/memory/auto-learner.d.ts.map +1 -0
- package/dist/memory/auto-learner.js +179 -0
- package/dist/memory/auto-learner.js.map +1 -0
- package/dist/memory/confidence-decay.d.ts +22 -0
- package/dist/memory/confidence-decay.d.ts.map +1 -0
- package/dist/memory/confidence-decay.js +54 -0
- package/dist/memory/confidence-decay.js.map +1 -0
- package/dist/memory/embedding-manager.d.ts +5 -0
- package/dist/memory/embedding-manager.d.ts.map +1 -0
- package/dist/memory/embedding-manager.js +118 -0
- package/dist/memory/embedding-manager.js.map +1 -0
- package/dist/memory/export-import.d.ts +49 -0
- package/dist/memory/export-import.d.ts.map +1 -0
- package/dist/memory/export-import.js +131 -0
- package/dist/memory/export-import.js.map +1 -0
- package/dist/memory/git-memory.d.ts +15 -0
- package/dist/memory/git-memory.d.ts.map +1 -0
- package/dist/memory/git-memory.js +178 -0
- package/dist/memory/git-memory.js.map +1 -0
- package/dist/memory/learning-rate.d.ts +24 -0
- package/dist/memory/learning-rate.d.ts.map +1 -0
- package/dist/memory/learning-rate.js +95 -0
- package/dist/memory/learning-rate.js.map +1 -0
- package/dist/memory/llm-enhancer.d.ts +54 -0
- package/dist/memory/llm-enhancer.d.ts.map +1 -0
- package/dist/memory/llm-enhancer.js +270 -0
- package/dist/memory/llm-enhancer.js.map +1 -0
- package/dist/memory/memory-cache.d.ts +5 -0
- package/dist/memory/memory-cache.d.ts.map +1 -0
- package/dist/memory/memory-cache.js +37 -0
- package/dist/memory/memory-cache.js.map +1 -0
- package/dist/memory/memory-consolidator.d.ts +14 -0
- package/dist/memory/memory-consolidator.d.ts.map +1 -0
- package/dist/memory/memory-consolidator.js +156 -0
- package/dist/memory/memory-consolidator.js.map +1 -0
- package/dist/memory/memory-decay.d.ts +10 -0
- package/dist/memory/memory-decay.d.ts.map +1 -0
- package/dist/memory/memory-decay.js +79 -0
- package/dist/memory/memory-decay.js.map +1 -0
- package/dist/memory/memory-quality.d.ts +37 -0
- package/dist/memory/memory-quality.d.ts.map +1 -0
- package/dist/memory/memory-quality.js +203 -0
- package/dist/memory/memory-quality.js.map +1 -0
- package/dist/memory/memory-ranker.d.ts +14 -0
- package/dist/memory/memory-ranker.d.ts.map +1 -0
- package/dist/memory/memory-ranker.js +68 -0
- package/dist/memory/memory-ranker.js.map +1 -0
- package/dist/memory/meta-memory.d.ts +11 -0
- package/dist/memory/meta-memory.d.ts.map +1 -0
- package/dist/memory/meta-memory.js +141 -0
- package/dist/memory/meta-memory.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +39 -0
- package/dist/memory/session-tracker.d.ts.map +1 -0
- package/dist/memory/session-tracker.js +127 -0
- package/dist/memory/session-tracker.js.map +1 -0
- package/dist/memory/temporal-engine.d.ts +25 -0
- package/dist/memory/temporal-engine.d.ts.map +1 -0
- package/dist/memory/temporal-engine.js +106 -0
- package/dist/memory/temporal-engine.js.map +1 -0
- package/dist/retrieval/hybrid-retriever.d.ts +23 -0
- package/dist/retrieval/hybrid-retriever.d.ts.map +1 -0
- package/dist/retrieval/hybrid-retriever.js +120 -0
- package/dist/retrieval/hybrid-retriever.js.map +1 -0
- package/dist/scanners/architecture-graph.d.ts +30 -0
- package/dist/scanners/architecture-graph.d.ts.map +1 -0
- package/dist/scanners/architecture-graph.js +315 -0
- package/dist/scanners/architecture-graph.js.map +1 -0
- package/dist/scanners/code-verifier.d.ts +70 -0
- package/dist/scanners/code-verifier.d.ts.map +1 -0
- package/dist/scanners/code-verifier.js +374 -0
- package/dist/scanners/code-verifier.js.map +1 -0
- package/dist/scanners/context-builder.d.ts +19 -0
- package/dist/scanners/context-builder.d.ts.map +1 -0
- package/dist/scanners/context-builder.js +102 -0
- package/dist/scanners/context-builder.js.map +1 -0
- package/dist/scanners/export-map.d.ts +22 -0
- package/dist/scanners/export-map.d.ts.map +1 -0
- package/dist/scanners/export-map.js +249 -0
- package/dist/scanners/export-map.js.map +1 -0
- package/dist/scanners/file-verifier.d.ts +22 -0
- package/dist/scanners/file-verifier.d.ts.map +1 -0
- package/dist/scanners/file-verifier.js +140 -0
- package/dist/scanners/file-verifier.js.map +1 -0
- package/dist/scanners/project-scanner.d.ts +31 -0
- package/dist/scanners/project-scanner.d.ts.map +1 -0
- package/dist/scanners/project-scanner.js +398 -0
- package/dist/scanners/project-scanner.js.map +1 -0
- package/dist/security/encryption.d.ts +15 -0
- package/dist/security/encryption.d.ts.map +1 -0
- package/dist/security/encryption.js +116 -0
- package/dist/security/encryption.js.map +1 -0
- package/dist/security/feature-gate.d.ts +30 -0
- package/dist/security/feature-gate.d.ts.map +1 -0
- package/dist/security/feature-gate.js +91 -0
- package/dist/security/feature-gate.js.map +1 -0
- package/dist/security/license.d.ts +24 -0
- package/dist/security/license.d.ts.map +1 -0
- package/dist/security/license.js +168 -0
- package/dist/security/license.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +20 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +60 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/server/dashboard.d.ts +3 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +258 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/mcp-handler.d.ts +12 -0
- package/dist/server/mcp-handler.d.ts.map +1 -0
- package/dist/server/mcp-handler.js +1392 -0
- package/dist/server/mcp-handler.js.map +1 -0
- package/dist/strategies/embedders/local-minilm.d.ts +35 -0
- package/dist/strategies/embedders/local-minilm.d.ts.map +1 -0
- package/dist/strategies/embedders/local-minilm.js +176 -0
- package/dist/strategies/embedders/local-minilm.js.map +1 -0
- package/dist/types.d.ts +207 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,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 @@
|
|
|
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"}
|