cortex-mcp 2.4.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -1
- package/README.md +35 -39
- package/dist/memory/access-pattern-tracker.d.ts +51 -0
- package/dist/memory/access-pattern-tracker.d.ts.map +1 -0
- package/dist/memory/access-pattern-tracker.js +92 -0
- package/dist/memory/access-pattern-tracker.js.map +1 -0
- package/dist/memory/auto-learner.d.ts.map +1 -1
- package/dist/memory/auto-learner.js +33 -2
- package/dist/memory/auto-learner.js.map +1 -1
- package/dist/memory/cross-memory-linker.d.ts +18 -0
- package/dist/memory/cross-memory-linker.d.ts.map +1 -0
- package/dist/memory/cross-memory-linker.js +115 -0
- package/dist/memory/cross-memory-linker.js.map +1 -0
- package/dist/memory/daily-diary.d.ts +30 -0
- package/dist/memory/daily-diary.d.ts.map +1 -0
- package/dist/memory/daily-diary.js +159 -0
- package/dist/memory/daily-diary.js.map +1 -0
- package/dist/memory/embedding-cache.d.ts +32 -0
- package/dist/memory/embedding-cache.d.ts.map +1 -0
- package/dist/memory/embedding-cache.js +76 -0
- package/dist/memory/embedding-cache.js.map +1 -0
- package/dist/memory/memory-decay.d.ts.map +1 -1
- package/dist/memory/memory-decay.js +23 -6
- package/dist/memory/memory-decay.js.map +1 -1
- package/dist/memory/memory-export-md.d.ts +12 -0
- package/dist/memory/memory-export-md.d.ts.map +1 -0
- package/dist/memory/memory-export-md.js +188 -0
- package/dist/memory/memory-export-md.js.map +1 -0
- package/dist/memory/memory-ranker.d.ts.map +1 -1
- package/dist/memory/memory-ranker.js +7 -2
- package/dist/memory/memory-ranker.js.map +1 -1
- package/dist/memory/mmr-reranker.d.ts +39 -0
- package/dist/memory/mmr-reranker.d.ts.map +1 -0
- package/dist/memory/mmr-reranker.js +115 -0
- package/dist/memory/mmr-reranker.js.map +1 -0
- package/dist/memory/query-expansion.d.ts +28 -0
- package/dist/memory/query-expansion.d.ts.map +1 -0
- package/dist/memory/query-expansion.js +140 -0
- package/dist/memory/query-expansion.js.map +1 -0
- package/dist/memory/soul-manager.d.ts +30 -0
- package/dist/memory/soul-manager.d.ts.map +1 -0
- package/dist/memory/soul-manager.js +171 -0
- package/dist/memory/soul-manager.js.map +1 -0
- package/dist/server/mcp-handler.d.ts.map +1 -1
- package/dist/server/mcp-handler.js +119 -48
- package/dist/server/mcp-handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,159 @@
|
|
|
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.appendDiaryEntry = appendDiaryEntry;
|
|
37
|
+
exports.getDiaryForDate = getDiaryForDate;
|
|
38
|
+
exports.getRecentDiary = getRecentDiary;
|
|
39
|
+
exports.formatDiaryContext = formatDiaryContext;
|
|
40
|
+
exports.getDiaryStats = getDiaryStats;
|
|
41
|
+
/**
|
|
42
|
+
* Daily Diary — OpenClaw-style daily Markdown logs.
|
|
43
|
+
*
|
|
44
|
+
* Writes append-only daily notes like OpenClaw's memory/YYYY-MM-DD.md.
|
|
45
|
+
* Each day gets its own file with timestamped entries:
|
|
46
|
+
* - What was learned
|
|
47
|
+
* - What files changed
|
|
48
|
+
* - What decisions were made
|
|
49
|
+
* - What bugs were fixed
|
|
50
|
+
*
|
|
51
|
+
* This gives the AI a "running journal" of recent work.
|
|
52
|
+
* Injected into force_recall as Layer 7.5 (recent context).
|
|
53
|
+
*
|
|
54
|
+
* Stored in: ~/.cortex-memory/diary/YYYY-MM-DD.md
|
|
55
|
+
*/
|
|
56
|
+
const fs = __importStar(require("fs"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const os = __importStar(require("os"));
|
|
59
|
+
const DIARY_DIR = path.join(os.homedir(), '.cortex-memory', 'diary');
|
|
60
|
+
/**
|
|
61
|
+
* Append an entry to today's diary.
|
|
62
|
+
*/
|
|
63
|
+
function appendDiaryEntry(entry) {
|
|
64
|
+
try {
|
|
65
|
+
if (!fs.existsSync(DIARY_DIR))
|
|
66
|
+
fs.mkdirSync(DIARY_DIR, { recursive: true });
|
|
67
|
+
const today = getDateString();
|
|
68
|
+
const diaryPath = path.join(DIARY_DIR, `${today}.md`);
|
|
69
|
+
const time = new Date().toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit' });
|
|
70
|
+
const icon = ICONS[entry.type] || '📝';
|
|
71
|
+
const fileSuffix = entry.file ? ` _(${path.basename(entry.file)})_` : '';
|
|
72
|
+
const line = `- ${time} ${icon} **${entry.type.toUpperCase()}**: ${entry.content}${fileSuffix}\n`;
|
|
73
|
+
// Create header if new file
|
|
74
|
+
if (!fs.existsSync(diaryPath)) {
|
|
75
|
+
const header = `# 📔 Cortex Diary — ${today}\n\n`;
|
|
76
|
+
fs.writeFileSync(diaryPath, header, 'utf-8');
|
|
77
|
+
}
|
|
78
|
+
fs.appendFileSync(diaryPath, line, 'utf-8');
|
|
79
|
+
}
|
|
80
|
+
catch { /* diary is non-critical */ }
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get diary content for a specific date.
|
|
84
|
+
*/
|
|
85
|
+
function getDiaryForDate(date) {
|
|
86
|
+
try {
|
|
87
|
+
const diaryPath = path.join(DIARY_DIR, `${date}.md`);
|
|
88
|
+
if (fs.existsSync(diaryPath)) {
|
|
89
|
+
return fs.readFileSync(diaryPath, 'utf-8');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch { /* */ }
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get the last N days of diary entries combined.
|
|
97
|
+
*/
|
|
98
|
+
function getRecentDiary(days = 3) {
|
|
99
|
+
const entries = [];
|
|
100
|
+
const now = Date.now();
|
|
101
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
102
|
+
for (let i = 0; i < days; i++) {
|
|
103
|
+
const date = new Date(now - i * DAY);
|
|
104
|
+
const dateStr = formatDate(date);
|
|
105
|
+
const content = getDiaryForDate(dateStr);
|
|
106
|
+
if (content && content.trim().length > 50) {
|
|
107
|
+
entries.push(content.trim());
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return entries.join('\n\n---\n\n');
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Format diary context for injection into force_recall.
|
|
114
|
+
* Returns last 2 days of diary, condensed.
|
|
115
|
+
*/
|
|
116
|
+
function formatDiaryContext() {
|
|
117
|
+
const diary = getRecentDiary(2);
|
|
118
|
+
if (!diary || diary.length < 50)
|
|
119
|
+
return '';
|
|
120
|
+
// Truncate to last 20 entries to avoid flooding context
|
|
121
|
+
const lines = diary.split('\n').filter(l => l.startsWith('- '));
|
|
122
|
+
const recent = lines.slice(-20);
|
|
123
|
+
if (recent.length === 0)
|
|
124
|
+
return '';
|
|
125
|
+
return `\n## 📔 Recent Diary (last 2 days)\n${recent.join('\n')}`;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get diary stats for dashboard.
|
|
129
|
+
*/
|
|
130
|
+
function getDiaryStats() {
|
|
131
|
+
try {
|
|
132
|
+
if (!fs.existsSync(DIARY_DIR))
|
|
133
|
+
return { totalDays: 0, todayEntries: 0 };
|
|
134
|
+
const files = fs.readdirSync(DIARY_DIR).filter(f => f.endsWith('.md'));
|
|
135
|
+
const today = getDiaryForDate(getDateString());
|
|
136
|
+
const todayEntries = today ? today.split('\n').filter(l => l.startsWith('- ')).length : 0;
|
|
137
|
+
return { totalDays: files.length, todayEntries };
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return { totalDays: 0, todayEntries: 0 };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
144
|
+
const ICONS = {
|
|
145
|
+
decision: '📌',
|
|
146
|
+
correction: '🔴',
|
|
147
|
+
bug_fix: '🐛',
|
|
148
|
+
convention: '📏',
|
|
149
|
+
insight: '💡',
|
|
150
|
+
task: '📋',
|
|
151
|
+
file_change: '📁',
|
|
152
|
+
};
|
|
153
|
+
function getDateString() {
|
|
154
|
+
return formatDate(new Date());
|
|
155
|
+
}
|
|
156
|
+
function formatDate(d) {
|
|
157
|
+
return d.toISOString().split('T')[0]; // YYYY-MM-DD
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=daily-diary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily-diary.js","sourceRoot":"","sources":["../../src/memory/daily-diary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Cache — Avoids re-computing embeddings for identical text.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from OpenClaw's embedding_cache table architecture.
|
|
5
|
+
*
|
|
6
|
+
* Problem: Every recall re-embeds the query, even if it's the exact same text.
|
|
7
|
+
* With MiniLM this takes ~50ms per embedding — adds up fast.
|
|
8
|
+
*
|
|
9
|
+
* Solution: Cache embeddings in memory with an LRU eviction policy.
|
|
10
|
+
* Cache key = hash of the text content.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Get a cached embedding for text, or null if not cached.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getCachedEmbedding(text: string): number[] | null;
|
|
16
|
+
/**
|
|
17
|
+
* Store an embedding in the cache.
|
|
18
|
+
* Uses LRU eviction when cache is full.
|
|
19
|
+
*/
|
|
20
|
+
export declare function cacheEmbedding(text: string, embedding: number[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Clear the entire embedding cache.
|
|
23
|
+
*/
|
|
24
|
+
export declare function clearEmbeddingCache(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get cache stats for debugging/dashboard.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getEmbeddingCacheStats(): {
|
|
29
|
+
size: number;
|
|
30
|
+
maxSize: number;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=embedding-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-cache.d.ts","sourceRoot":"","sources":["../../src/memory/embedding-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuBH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAQhE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAiBtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAE1E"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Embedding Cache — Avoids re-computing embeddings for identical text.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from OpenClaw's embedding_cache table architecture.
|
|
6
|
+
*
|
|
7
|
+
* Problem: Every recall re-embeds the query, even if it's the exact same text.
|
|
8
|
+
* With MiniLM this takes ~50ms per embedding — adds up fast.
|
|
9
|
+
*
|
|
10
|
+
* Solution: Cache embeddings in memory with an LRU eviction policy.
|
|
11
|
+
* Cache key = hash of the text content.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.getCachedEmbedding = getCachedEmbedding;
|
|
15
|
+
exports.cacheEmbedding = cacheEmbedding;
|
|
16
|
+
exports.clearEmbeddingCache = clearEmbeddingCache;
|
|
17
|
+
exports.getEmbeddingCacheStats = getEmbeddingCacheStats;
|
|
18
|
+
const CACHE_MAX = 256;
|
|
19
|
+
const cache = new Map();
|
|
20
|
+
/**
|
|
21
|
+
* Simple FNV-1a hash — fast and good enough for cache keys.
|
|
22
|
+
*/
|
|
23
|
+
function hashText(text) {
|
|
24
|
+
let hash = 0x811c9dc5;
|
|
25
|
+
for (let i = 0; i < text.length; i++) {
|
|
26
|
+
hash ^= text.charCodeAt(i);
|
|
27
|
+
hash = (hash * 0x01000193) >>> 0;
|
|
28
|
+
}
|
|
29
|
+
return hash.toString(36);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get a cached embedding for text, or null if not cached.
|
|
33
|
+
*/
|
|
34
|
+
function getCachedEmbedding(text) {
|
|
35
|
+
const key = hashText(text);
|
|
36
|
+
const entry = cache.get(key);
|
|
37
|
+
if (entry) {
|
|
38
|
+
entry.timestamp = Date.now(); // Touch for LRU
|
|
39
|
+
return entry.embedding;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Store an embedding in the cache.
|
|
45
|
+
* Uses LRU eviction when cache is full.
|
|
46
|
+
*/
|
|
47
|
+
function cacheEmbedding(text, embedding) {
|
|
48
|
+
const key = hashText(text);
|
|
49
|
+
// LRU eviction if full
|
|
50
|
+
if (cache.size >= CACHE_MAX && !cache.has(key)) {
|
|
51
|
+
let oldestKey = '';
|
|
52
|
+
let oldestTime = Infinity;
|
|
53
|
+
for (const [k, v] of cache) {
|
|
54
|
+
if (v.timestamp < oldestTime) {
|
|
55
|
+
oldestTime = v.timestamp;
|
|
56
|
+
oldestKey = k;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (oldestKey)
|
|
60
|
+
cache.delete(oldestKey);
|
|
61
|
+
}
|
|
62
|
+
cache.set(key, { embedding, timestamp: Date.now() });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Clear the entire embedding cache.
|
|
66
|
+
*/
|
|
67
|
+
function clearEmbeddingCache() {
|
|
68
|
+
cache.clear();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get cache stats for debugging/dashboard.
|
|
72
|
+
*/
|
|
73
|
+
function getEmbeddingCacheStats() {
|
|
74
|
+
return { size: cache.size, maxSize: CACHE_MAX };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=embedding-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-cache.js","sourceRoot":"","sources":["../../src/memory/embedding-cache.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AA0BH,gDAQC;AAMD,wCAiBC;AAKD,kDAEC;AAKD,wDAEC;AArED,MAAM,SAAS,GAAG,GAAG,CAAC;AAOtB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE5C;;GAEG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC1B,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,IAAY;IAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,EAAE,CAAC;QACR,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,gBAAgB;QAC9C,OAAO,KAAK,CAAC,SAAS,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,SAAmB;IAC5D,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE3B,uBAAuB;IACvB,IAAI,KAAK,CAAC,IAAI,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,UAAU,GAAG,QAAQ,CAAC;QAC1B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;gBAC3B,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC;gBACzB,SAAS,GAAG,CAAC,CAAC;YAClB,CAAC;QACL,CAAC;QACD,IAAI,SAAS;YAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IAC/B,KAAK,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB;IAClC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -1 +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,
|
|
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,CAgH9D"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.cleanupMemories = cleanupMemories;
|
|
4
|
-
const types_1 = require("../types");
|
|
5
4
|
const config_1 = require("../config/config");
|
|
6
5
|
const memory_cache_1 = require("./memory-cache");
|
|
7
6
|
function cleanupMemories(memoryStore) {
|
|
@@ -10,16 +9,34 @@ function cleanupMemories(memoryStore) {
|
|
|
10
9
|
let cleaned = 0;
|
|
11
10
|
// Wrap all writes in a single transaction (10-100x faster for bulk deactivations)
|
|
12
11
|
memoryStore.runTransaction(() => {
|
|
13
|
-
//
|
|
14
|
-
|
|
12
|
+
// 0. Auto-expire CURRENT_TASK memories > 24h (working memory, not permanent)
|
|
13
|
+
// "Currently working on X" should not persist alongside "Always use TypeScript strict mode"
|
|
14
|
+
const TASK_MAX_AGE = 1 * DAY;
|
|
15
|
+
const allForTaskCleanup = memoryStore.getActive(config_1.CONFIG.MEMORY_CAP);
|
|
16
|
+
for (const m of allForTaskCleanup) {
|
|
17
|
+
if (m.type === 'CURRENT_TASK') {
|
|
18
|
+
const age = Date.now() - (m.createdAt || m.timestamp || 0);
|
|
19
|
+
if (age > TASK_MAX_AGE) {
|
|
20
|
+
memoryStore.deactivate(m.id);
|
|
21
|
+
cleaned++;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// 1. Two-tier OpenClaw-style decay:
|
|
26
|
+
// TRANSACTIONAL (high volume, decays fast): INSIGHT, CONVERSATION
|
|
27
|
+
// OPERATIONAL (low volume, persists): DECISION, CORRECTION, CONVENTION, BUG_FIX
|
|
28
|
+
const OPERATIONAL_TYPES = new Set(['DECISION', 'CORRECTION', 'CONVENTION', 'BUG_FIX', 'PROVEN_PATTERN']);
|
|
29
|
+
const TRANSACTIONAL_MAX_AGE = 5 * DAY; // 5 days for junk
|
|
30
|
+
const OPERATIONAL_MAX_AGE = 60 * DAY; // 60 days for gold (if 0 access)
|
|
31
|
+
const staleInsights = memoryStore.getStaleMemories(TRANSACTIONAL_MAX_AGE, 500);
|
|
15
32
|
for (const m of staleInsights) {
|
|
16
|
-
if (m.type
|
|
33
|
+
if (!OPERATIONAL_TYPES.has(m.type)) {
|
|
17
34
|
memoryStore.deactivate(m.id);
|
|
18
35
|
cleaned++;
|
|
19
36
|
}
|
|
20
37
|
}
|
|
21
|
-
// 2. Deactivate
|
|
22
|
-
const staleAll = memoryStore.getStaleMemories(
|
|
38
|
+
// 2. Deactivate operational memories > 60 days with 0 access (very old, never used)
|
|
39
|
+
const staleAll = memoryStore.getStaleMemories(OPERATIONAL_MAX_AGE, 500);
|
|
23
40
|
for (const m of staleAll) {
|
|
24
41
|
memoryStore.deactivate(m.id);
|
|
25
42
|
cleaned++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-decay.js","sourceRoot":"","sources":["../../src/memory/memory-decay.ts"],"names":[],"mappings":";;AAYA,
|
|
1
|
+
{"version":3,"file":"memory-decay.js","sourceRoot":"","sources":["../../src/memory/memory-decay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MemoryStore } from '../db/memory-store';
|
|
2
|
+
/**
|
|
3
|
+
* Generate MEMORY.md from the top memories in the store.
|
|
4
|
+
* Only includes high-importance, frequently-accessed, active memories.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateMemoryMd(memoryStore: MemoryStore, workspaceRoot: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Import user-edited MEMORY.md back into the memory store.
|
|
9
|
+
* Only imports NEW lines that don't already exist in the store.
|
|
10
|
+
*/
|
|
11
|
+
export declare function importMemoryMd(workspaceRoot: string, memoryStore: MemoryStore): number;
|
|
12
|
+
//# sourceMappingURL=memory-export-md.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-export-md.d.ts","sourceRoot":"","sources":["../../src/memory/memory-export-md.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAkExF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CA2DtF"}
|
|
@@ -0,0 +1,188 @@
|
|
|
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.generateMemoryMd = generateMemoryMd;
|
|
37
|
+
exports.importMemoryMd = importMemoryMd;
|
|
38
|
+
/**
|
|
39
|
+
* Memory Export MD — OpenClaw-style human-readable knowledge base.
|
|
40
|
+
*
|
|
41
|
+
* Auto-generates a MEMORY.md file with curated, high-value memories.
|
|
42
|
+
* Users can read and edit this file — changes are imported back on next startup.
|
|
43
|
+
*
|
|
44
|
+
* Like OpenClaw's MEMORY.md: the "truth" the agent carries across sessions,
|
|
45
|
+
* stored in plain Markdown that any human can read.
|
|
46
|
+
*
|
|
47
|
+
* Stored in: .cortex/MEMORY.md
|
|
48
|
+
*/
|
|
49
|
+
const fs = __importStar(require("fs"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
/**
|
|
52
|
+
* Generate MEMORY.md from the top memories in the store.
|
|
53
|
+
* Only includes high-importance, frequently-accessed, active memories.
|
|
54
|
+
*/
|
|
55
|
+
function generateMemoryMd(memoryStore, workspaceRoot) {
|
|
56
|
+
const outPath = path.join(workspaceRoot, '.cortex', 'MEMORY.md');
|
|
57
|
+
try {
|
|
58
|
+
const dir = path.dirname(outPath);
|
|
59
|
+
if (!fs.existsSync(dir))
|
|
60
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
61
|
+
const all = memoryStore.getActive(200);
|
|
62
|
+
// Sort by importance * access count (most valuable first)
|
|
63
|
+
const ranked = all
|
|
64
|
+
.filter(m => m.importance >= 0.6 || (m.accessCount || 0) >= 2)
|
|
65
|
+
.sort((a, b) => {
|
|
66
|
+
const scoreA = (a.importance || 0.5) * (1 + (a.accessCount || 0) * 0.2);
|
|
67
|
+
const scoreB = (b.importance || 0.5) * (1 + (b.accessCount || 0) * 0.2);
|
|
68
|
+
return scoreB - scoreA;
|
|
69
|
+
})
|
|
70
|
+
.slice(0, 50);
|
|
71
|
+
// Group by type
|
|
72
|
+
const groups = {};
|
|
73
|
+
for (const m of ranked) {
|
|
74
|
+
if (!groups[m.type])
|
|
75
|
+
groups[m.type] = [];
|
|
76
|
+
groups[m.type].push(m);
|
|
77
|
+
}
|
|
78
|
+
// Build markdown
|
|
79
|
+
const lines = [
|
|
80
|
+
'# 🧠 Cortex Memory — Curated Knowledge',
|
|
81
|
+
'',
|
|
82
|
+
'> Auto-generated by Cortex. You can edit this file — changes will be imported back.',
|
|
83
|
+
`> Last updated: ${new Date().toISOString().split('T')[0]}`,
|
|
84
|
+
`> Total memories: ${all.length} active, ${ranked.length} shown here`,
|
|
85
|
+
'',
|
|
86
|
+
];
|
|
87
|
+
const typeEmoji = {
|
|
88
|
+
DECISION: '📌',
|
|
89
|
+
CORRECTION: '🔴',
|
|
90
|
+
BUG_FIX: '🐛',
|
|
91
|
+
CONVENTION: '📏',
|
|
92
|
+
INSIGHT: '💡',
|
|
93
|
+
PROVEN_PATTERN: '✅',
|
|
94
|
+
FAILED_SUGGESTION: '❌',
|
|
95
|
+
CONVERSATION: '💬',
|
|
96
|
+
};
|
|
97
|
+
for (const [type, memories] of Object.entries(groups)) {
|
|
98
|
+
const emoji = typeEmoji[type] || '📝';
|
|
99
|
+
lines.push(`## ${emoji} ${type}`);
|
|
100
|
+
lines.push('');
|
|
101
|
+
for (const m of memories) {
|
|
102
|
+
const reason = m.reason && !m.reason.startsWith('Auto-detected')
|
|
103
|
+
? ` — _${m.reason}_` : '';
|
|
104
|
+
const age = formatAge(m.timestamp);
|
|
105
|
+
lines.push(`- ${m.intent}${reason} _(${age})_`);
|
|
106
|
+
}
|
|
107
|
+
lines.push('');
|
|
108
|
+
}
|
|
109
|
+
const content = lines.join('\n');
|
|
110
|
+
fs.writeFileSync(outPath, content, 'utf-8');
|
|
111
|
+
return content;
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return `Error generating MEMORY.md: ${err.message}`;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Import user-edited MEMORY.md back into the memory store.
|
|
119
|
+
* Only imports NEW lines that don't already exist in the store.
|
|
120
|
+
*/
|
|
121
|
+
function importMemoryMd(workspaceRoot, memoryStore) {
|
|
122
|
+
const mdPath = path.join(workspaceRoot, '.cortex', 'MEMORY.md');
|
|
123
|
+
let imported = 0;
|
|
124
|
+
try {
|
|
125
|
+
if (!fs.existsSync(mdPath))
|
|
126
|
+
return 0;
|
|
127
|
+
const content = fs.readFileSync(mdPath, 'utf-8');
|
|
128
|
+
const lines = content.split('\n');
|
|
129
|
+
let currentType = 'INSIGHT';
|
|
130
|
+
const typeMap = {
|
|
131
|
+
'DECISION': 'DECISION',
|
|
132
|
+
'CORRECTION': 'CORRECTION',
|
|
133
|
+
'BUG_FIX': 'BUG_FIX',
|
|
134
|
+
'CONVENTION': 'CONVENTION',
|
|
135
|
+
'INSIGHT': 'INSIGHT',
|
|
136
|
+
'PROVEN_PATTERN': 'PROVEN_PATTERN',
|
|
137
|
+
};
|
|
138
|
+
for (const line of lines) {
|
|
139
|
+
// Detect section headers
|
|
140
|
+
const headerMatch = line.match(/^## .+ (.+)$/);
|
|
141
|
+
if (headerMatch) {
|
|
142
|
+
const typeName = headerMatch[1].trim();
|
|
143
|
+
if (typeMap[typeName])
|
|
144
|
+
currentType = typeMap[typeName];
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
// Only process bullet lines
|
|
148
|
+
if (!line.startsWith('- '))
|
|
149
|
+
continue;
|
|
150
|
+
// Extract intent (before the reason/age markers)
|
|
151
|
+
let intent = line.slice(2).trim();
|
|
152
|
+
intent = intent.replace(/\s*—\s*_.+?_\s*/g, '').replace(/\s*\(_\d+[dhm]\s+ago_\)\s*/g, '').trim();
|
|
153
|
+
if (intent.length < 10)
|
|
154
|
+
continue;
|
|
155
|
+
// Check if already exists
|
|
156
|
+
const existing = memoryStore.searchFTS(intent.slice(0, 50), 3);
|
|
157
|
+
const isDuplicate = existing.some(e => e.memory.intent.toLowerCase().includes(intent.toLowerCase().slice(0, 30)));
|
|
158
|
+
if (!isDuplicate) {
|
|
159
|
+
try {
|
|
160
|
+
memoryStore.add({
|
|
161
|
+
type: currentType,
|
|
162
|
+
intent: intent.slice(0, 300),
|
|
163
|
+
action: `Imported from MEMORY.md`,
|
|
164
|
+
importance: 0.8,
|
|
165
|
+
confidence: 0.9,
|
|
166
|
+
});
|
|
167
|
+
imported++;
|
|
168
|
+
}
|
|
169
|
+
catch { /* duplicate or quality gate */ }
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch { /* file not found or parse error */ }
|
|
174
|
+
return imported;
|
|
175
|
+
}
|
|
176
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
177
|
+
function formatAge(timestamp) {
|
|
178
|
+
const diff = Date.now() - timestamp;
|
|
179
|
+
const mins = Math.floor(diff / 60000);
|
|
180
|
+
if (mins < 60)
|
|
181
|
+
return `${mins}m ago`;
|
|
182
|
+
const hours = Math.floor(mins / 60);
|
|
183
|
+
if (hours < 24)
|
|
184
|
+
return `${hours}h ago`;
|
|
185
|
+
const days = Math.floor(hours / 24);
|
|
186
|
+
return `${days}d ago`;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=memory-export-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-export-md.js","sourceRoot":"","sources":["../../src/memory/memory-export-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-ranker.d.ts","sourceRoot":"","sources":["../../src/memory/memory-ranker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory-ranker.d.ts","sourceRoot":"","sources":["../../src/memory/memory-ranker.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACvB,UAAU,EAAE,YAAY,EAAE,EAC1B,aAAa,EAAE,YAAY,EAAE,EAC7B,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACrB,YAAY,EAAE,CA4DhB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ/E"}
|
|
@@ -10,6 +10,7 @@ exports.formatResults = formatResults;
|
|
|
10
10
|
* NEW: File-aware ranking — if query mentions a file, related memories boost.
|
|
11
11
|
*/
|
|
12
12
|
const config_1 = require("../config/config");
|
|
13
|
+
const access_pattern_tracker_1 = require("./access-pattern-tracker");
|
|
13
14
|
/**
|
|
14
15
|
* Merge FTS + Vector results, deduplicate, boost by type + recency + access.
|
|
15
16
|
*/
|
|
@@ -31,9 +32,11 @@ function rankResults(ftsResults, vectorResults, maxResults, currentFile) {
|
|
|
31
32
|
const fileBoost = currentFile && r.memory.relatedFiles?.some((f) => f.includes(currentFile) || currentFile.includes(f)) ? 1.5 : 1.0;
|
|
32
33
|
// NEW: Resolved penalty — completed/resolved memories score much lower
|
|
33
34
|
const resolvedPenalty = r.memory.tags?.includes('resolved') ? 0.15 : 1.0;
|
|
35
|
+
// NEW: Personal boost — types the user accesses most get 1.0-1.8x
|
|
36
|
+
const personalBoost = (0, access_pattern_tracker_1.getPersonalBoost)(r.memory.type);
|
|
34
37
|
merged.push({
|
|
35
38
|
memory: r.memory,
|
|
36
|
-
score: r.score * boost * accessBoost * recencyBoost * fileBoost * resolvedPenalty,
|
|
39
|
+
score: r.score * boost * accessBoost * recencyBoost * fileBoost * resolvedPenalty * personalBoost,
|
|
37
40
|
});
|
|
38
41
|
}
|
|
39
42
|
for (const r of vectorResults) {
|
|
@@ -47,9 +50,11 @@ function rankResults(ftsResults, vectorResults, maxResults, currentFile) {
|
|
|
47
50
|
const fileBoost = currentFile && r.memory.relatedFiles?.some((f) => f.includes(currentFile) || currentFile.includes(f)) ? 1.5 : 1.0;
|
|
48
51
|
// Resolved penalty (same as FTS block)
|
|
49
52
|
const resolvedPenalty = r.memory.tags?.includes('resolved') ? 0.15 : 1.0;
|
|
53
|
+
// Personal boost (same as FTS block)
|
|
54
|
+
const personalBoost = (0, access_pattern_tracker_1.getPersonalBoost)(r.memory.type);
|
|
50
55
|
merged.push({
|
|
51
56
|
memory: r.memory,
|
|
52
|
-
score: r.score * boost * accessBoost * recencyBoost * fileBoost * resolvedPenalty,
|
|
57
|
+
score: r.score * boost * accessBoost * recencyBoost * fileBoost * resolvedPenalty * personalBoost,
|
|
53
58
|
});
|
|
54
59
|
}
|
|
55
60
|
merged.sort((a, b) => b.score - a.score);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-ranker.js","sourceRoot":"","sources":["../../src/memory/memory-ranker.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"memory-ranker.js","sourceRoot":"","sources":["../../src/memory/memory-ranker.ts"],"names":[],"mappings":"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"}
|