cortex-mcp 2.7.6 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +305 -58
- package/README.md +394 -224
- package/dist/cli/setup.js +58 -60
- package/dist/cli/setup.js.map +1 -1
- package/dist/config/config.js +2 -2
- package/dist/config/config.js.map +1 -1
- package/dist/db/database.d.ts +8 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +35 -54
- package/dist/db/database.js.map +1 -1
- package/dist/db/event-log.d.ts +4 -0
- package/dist/db/event-log.d.ts.map +1 -1
- package/dist/db/event-log.js +14 -10
- package/dist/db/event-log.js.map +1 -1
- package/dist/db/memory-store.d.ts +30 -3
- package/dist/db/memory-store.d.ts.map +1 -1
- package/dist/db/memory-store.js +153 -55
- package/dist/db/memory-store.js.map +1 -1
- package/dist/embedding-worker.js +1 -1
- package/dist/embedding-worker.js.map +1 -1
- package/dist/hooks/git-capture.js +3 -3
- package/dist/hooks/git-hooks.js +5 -2
- package/dist/mcp-stdio.js +39 -5
- package/dist/mcp-stdio.js.map +1 -1
- package/dist/memory/access-pattern-tracker.d.ts +51 -0
- package/dist/memory/access-pattern-tracker.d.ts.map +1 -0
- package/dist/memory/access-pattern-tracker.js +92 -0
- package/dist/memory/access-pattern-tracker.js.map +1 -0
- package/dist/memory/anticipation-engine.d.ts.map +1 -1
- package/dist/memory/anticipation-engine.js +18 -10
- package/dist/memory/anticipation-engine.js.map +1 -1
- package/dist/memory/auto-learner.d.ts.map +1 -1
- package/dist/memory/auto-learner.js +192 -45
- package/dist/memory/auto-learner.js.map +1 -1
- package/dist/memory/completion-resolver.d.ts +38 -0
- package/dist/memory/completion-resolver.d.ts.map +1 -0
- package/dist/memory/completion-resolver.js +127 -0
- package/dist/memory/completion-resolver.js.map +1 -0
- package/dist/memory/confidence-decay.d.ts.map +1 -1
- package/dist/memory/confidence-decay.js +13 -9
- package/dist/memory/confidence-decay.js.map +1 -1
- package/dist/memory/convention-detector.d.ts +11 -0
- package/dist/memory/convention-detector.d.ts.map +1 -0
- package/dist/memory/convention-detector.js +294 -0
- package/dist/memory/convention-detector.js.map +1 -0
- package/dist/memory/correction-detector.d.ts +33 -0
- package/dist/memory/correction-detector.d.ts.map +1 -0
- package/dist/memory/correction-detector.js +129 -0
- package/dist/memory/correction-detector.js.map +1 -0
- package/dist/memory/cross-memory-linker.d.ts +18 -0
- package/dist/memory/cross-memory-linker.d.ts.map +1 -0
- package/dist/memory/cross-memory-linker.js +115 -0
- package/dist/memory/cross-memory-linker.js.map +1 -0
- package/dist/memory/daily-diary.d.ts +30 -0
- package/dist/memory/daily-diary.d.ts.map +1 -0
- package/dist/memory/daily-diary.js +159 -0
- package/dist/memory/daily-diary.js.map +1 -0
- package/dist/memory/embedding-cache.d.ts +32 -0
- package/dist/memory/embedding-cache.d.ts.map +1 -0
- package/dist/memory/embedding-cache.js +76 -0
- package/dist/memory/embedding-cache.js.map +1 -0
- package/dist/memory/embedding-manager.d.ts.map +1 -1
- package/dist/memory/embedding-manager.js +6 -4
- package/dist/memory/embedding-manager.js.map +1 -1
- package/dist/memory/error-learner.d.ts +26 -0
- package/dist/memory/error-learner.d.ts.map +1 -0
- package/dist/memory/error-learner.js +145 -0
- package/dist/memory/error-learner.js.map +1 -0
- package/dist/memory/export-import.js +2 -2
- package/dist/memory/export-import.js.map +1 -1
- package/dist/memory/file-relationships.d.ts +47 -0
- package/dist/memory/file-relationships.d.ts.map +1 -0
- package/dist/memory/file-relationships.js +130 -0
- package/dist/memory/file-relationships.js.map +1 -0
- package/dist/memory/git-memory.d.ts.map +1 -1
- package/dist/memory/git-memory.js +20 -26
- package/dist/memory/git-memory.js.map +1 -1
- package/dist/memory/impact-analyzer.d.ts +16 -0
- package/dist/memory/impact-analyzer.d.ts.map +1 -0
- package/dist/memory/impact-analyzer.js +189 -0
- package/dist/memory/impact-analyzer.js.map +1 -0
- package/dist/memory/instructions-generator.d.ts +30 -0
- package/dist/memory/instructions-generator.d.ts.map +1 -0
- package/dist/memory/instructions-generator.js +117 -0
- package/dist/memory/instructions-generator.js.map +1 -0
- package/dist/memory/learning-rate.js +8 -7
- package/dist/memory/learning-rate.js.map +1 -1
- package/dist/memory/llm-enhancer.d.ts +2 -14
- package/dist/memory/llm-enhancer.d.ts.map +1 -1
- package/dist/memory/llm-enhancer.js +66 -46
- package/dist/memory/llm-enhancer.js.map +1 -1
- package/dist/memory/memory-cache.d.ts.map +1 -1
- package/dist/memory/memory-cache.js +10 -0
- package/dist/memory/memory-cache.js.map +1 -1
- package/dist/memory/memory-consolidator.d.ts.map +1 -1
- package/dist/memory/memory-consolidator.js +20 -14
- package/dist/memory/memory-consolidator.js.map +1 -1
- package/dist/memory/memory-decay.d.ts.map +1 -1
- package/dist/memory/memory-decay.js +82 -52
- package/dist/memory/memory-decay.js.map +1 -1
- package/dist/memory/memory-export-md.d.ts +12 -0
- package/dist/memory/memory-export-md.d.ts.map +1 -0
- package/dist/memory/memory-export-md.js +188 -0
- package/dist/memory/memory-export-md.js.map +1 -0
- package/dist/memory/memory-quality.d.ts +1 -1
- package/dist/memory/memory-quality.d.ts.map +1 -1
- package/dist/memory/memory-quality.js +9 -6
- package/dist/memory/memory-quality.js.map +1 -1
- package/dist/memory/memory-ranker.d.ts.map +1 -1
- package/dist/memory/memory-ranker.js +12 -3
- package/dist/memory/memory-ranker.js.map +1 -1
- package/dist/memory/meta-memory.js +3 -3
- package/dist/memory/meta-memory.js.map +1 -1
- package/dist/memory/mmr-reranker.d.ts +39 -0
- package/dist/memory/mmr-reranker.d.ts.map +1 -0
- package/dist/memory/mmr-reranker.js +115 -0
- package/dist/memory/mmr-reranker.js.map +1 -0
- package/dist/memory/pre-flight.d.ts +24 -0
- package/dist/memory/pre-flight.d.ts.map +1 -0
- package/dist/memory/pre-flight.js +121 -0
- package/dist/memory/pre-flight.js.map +1 -0
- package/dist/memory/preference-learner.d.ts +28 -0
- package/dist/memory/preference-learner.d.ts.map +1 -0
- package/dist/memory/preference-learner.js +144 -0
- package/dist/memory/preference-learner.js.map +1 -0
- package/dist/memory/query-expansion.d.ts +28 -0
- package/dist/memory/query-expansion.d.ts.map +1 -0
- package/dist/memory/query-expansion.js +140 -0
- package/dist/memory/query-expansion.js.map +1 -0
- package/dist/memory/regression-guard.d.ts +35 -0
- package/dist/memory/regression-guard.d.ts.map +1 -0
- package/dist/memory/regression-guard.js +90 -0
- package/dist/memory/regression-guard.js.map +1 -0
- package/dist/memory/resume-work.d.ts +37 -0
- package/dist/memory/resume-work.d.ts.map +1 -0
- package/dist/memory/resume-work.js +141 -0
- package/dist/memory/resume-work.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +2 -0
- package/dist/memory/session-tracker.d.ts.map +1 -1
- package/dist/memory/session-tracker.js +26 -8
- package/dist/memory/session-tracker.js.map +1 -1
- package/dist/memory/soul-manager.d.ts +30 -0
- package/dist/memory/soul-manager.d.ts.map +1 -0
- package/dist/memory/soul-manager.js +171 -0
- package/dist/memory/soul-manager.js.map +1 -0
- package/dist/memory/success-tracker.d.ts +33 -0
- package/dist/memory/success-tracker.d.ts.map +1 -0
- package/dist/memory/success-tracker.js +75 -0
- package/dist/memory/success-tracker.js.map +1 -0
- package/dist/memory/temporal-engine.d.ts.map +1 -1
- package/dist/memory/temporal-engine.js +9 -13
- package/dist/memory/temporal-engine.js.map +1 -1
- package/dist/memory/tool-recommender.d.ts +29 -0
- package/dist/memory/tool-recommender.d.ts.map +1 -0
- package/dist/memory/tool-recommender.js +117 -0
- package/dist/memory/tool-recommender.js.map +1 -0
- package/dist/memory/usage-stats.d.ts +98 -0
- package/dist/memory/usage-stats.d.ts.map +1 -0
- package/dist/memory/usage-stats.js +345 -0
- package/dist/memory/usage-stats.js.map +1 -0
- package/dist/retrieval/hybrid-retriever.d.ts +0 -2
- package/dist/retrieval/hybrid-retriever.d.ts.map +1 -1
- package/dist/retrieval/hybrid-retriever.js +3 -13
- package/dist/retrieval/hybrid-retriever.js.map +1 -1
- package/dist/scanners/architecture-graph.js +2 -2
- package/dist/scanners/architecture-graph.js.map +1 -1
- package/dist/scanners/code-verifier.d.ts +1 -0
- package/dist/scanners/code-verifier.d.ts.map +1 -1
- package/dist/scanners/code-verifier.js +14 -14
- package/dist/scanners/code-verifier.js.map +1 -1
- package/dist/scanners/context-builder.d.ts.map +1 -1
- package/dist/scanners/context-builder.js +33 -45
- package/dist/scanners/context-builder.js.map +1 -1
- package/dist/scanners/export-map.js +2 -2
- package/dist/scanners/export-map.js.map +1 -1
- package/dist/scanners/project-scanner.js +2 -2
- package/dist/scanners/project-scanner.js.map +1 -1
- package/dist/security/encryption.js +1 -1
- package/dist/security/encryption.js.map +1 -1
- package/dist/security/feature-gate.d.ts.map +1 -1
- package/dist/security/feature-gate.js +62 -20
- package/dist/security/feature-gate.js.map +1 -1
- package/dist/security/license.js +282 -35
- package/dist/security/license.js.map +1 -1
- package/dist/security/rate-limiter.d.ts +4 -3
- package/dist/security/rate-limiter.d.ts.map +1 -1
- package/dist/security/rate-limiter.js +11 -29
- package/dist/security/rate-limiter.js.map +1 -1
- package/dist/server/dashboard.js +166 -327
- package/dist/server/dashboard.js.map +1 -1
- package/dist/server/mcp-handler.d.ts.map +1 -1
- package/dist/server/mcp-handler.js +1000 -792
- package/dist/server/mcp-handler.js.map +1 -1
- package/dist/utils/extract-tags.d.ts +16 -0
- package/dist/utils/extract-tags.d.ts.map +1 -0
- package/dist/utils/extract-tags.js +40 -0
- package/dist/utils/extract-tags.js.map +1 -0
- package/package.json +18 -8
- package/dist/core/event-bus.d.ts +0 -19
- package/dist/core/event-bus.d.ts.map +0 -1
- package/dist/core/event-bus.js +0 -51
- package/dist/core/event-bus.js.map +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.recordAccess = recordAccess;
|
|
4
|
+
exports.recordBatchAccess = recordBatchAccess;
|
|
5
|
+
exports.getPersonalBoost = getPersonalBoost;
|
|
6
|
+
exports.getAccessProfile = getAccessProfile;
|
|
7
|
+
exports.loadAccessProfile = loadAccessProfile;
|
|
8
|
+
exports.getTopTypes = getTopTypes;
|
|
9
|
+
// In-memory access profile (persisted via session tracker)
|
|
10
|
+
let accessProfile = {
|
|
11
|
+
typeCounts: {},
|
|
12
|
+
totalAccesses: 0,
|
|
13
|
+
lastUpdated: Date.now(),
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Record that the user accessed a memory of a given type.
|
|
17
|
+
* Called whenever recall_memory, force_recall, or pre_check returns results.
|
|
18
|
+
*/
|
|
19
|
+
function recordAccess(type) {
|
|
20
|
+
accessProfile.typeCounts[type] = (accessProfile.typeCounts[type] || 0) + 1;
|
|
21
|
+
accessProfile.totalAccesses++;
|
|
22
|
+
accessProfile.lastUpdated = Date.now();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Record accesses for a batch of recalled memories.
|
|
26
|
+
*/
|
|
27
|
+
function recordBatchAccess(memories) {
|
|
28
|
+
for (const m of memories) {
|
|
29
|
+
recordAccess(m.type);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get a personalized boost multiplier for a memory type.
|
|
34
|
+
* Types the user accesses frequently get boosted (up to 1.8x).
|
|
35
|
+
* Types never accessed stay at 1.0x (neutral).
|
|
36
|
+
*
|
|
37
|
+
* Uses frequency ratio: (type_count / total) normalized to 1.0-1.8 range.
|
|
38
|
+
*/
|
|
39
|
+
function getPersonalBoost(type) {
|
|
40
|
+
if (accessProfile.totalAccesses < 10)
|
|
41
|
+
return 1.0; // Not enough data yet
|
|
42
|
+
const typeCount = accessProfile.typeCounts[type] || 0;
|
|
43
|
+
const frequency = typeCount / accessProfile.totalAccesses;
|
|
44
|
+
// Expected frequency if all types were equal (~20% with 5 types)
|
|
45
|
+
const expectedFreq = 0.2;
|
|
46
|
+
// Boost = 1.0 + (frequency - expected) * scale, clamped to [0.7, 1.8]
|
|
47
|
+
const boost = 1.0 + (frequency - expectedFreq) * 4.0;
|
|
48
|
+
return Math.max(0.7, Math.min(1.8, boost));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the full access profile (for dashboard/stats).
|
|
52
|
+
*/
|
|
53
|
+
function getAccessProfile() {
|
|
54
|
+
return { ...accessProfile };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Try to load access profile from stored memories (persistence across restarts).
|
|
58
|
+
*/
|
|
59
|
+
function loadAccessProfile(memoryStore) {
|
|
60
|
+
try {
|
|
61
|
+
const _profileMemories = memoryStore.getByType('INSIGHT', 100);
|
|
62
|
+
// Reconstruct from access_count of each type
|
|
63
|
+
const all = memoryStore.getActive(500);
|
|
64
|
+
const typeCounts = {};
|
|
65
|
+
let total = 0;
|
|
66
|
+
for (const m of all) {
|
|
67
|
+
const count = m.accessCount || 0;
|
|
68
|
+
if (count > 0) {
|
|
69
|
+
typeCounts[m.type] = (typeCounts[m.type] || 0) + count;
|
|
70
|
+
total += count;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (total > 0) {
|
|
74
|
+
accessProfile = { typeCounts, totalAccesses: total, lastUpdated: Date.now() };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch { /* fresh install, no data yet */ }
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get top accessed types (for diagnostics).
|
|
81
|
+
*/
|
|
82
|
+
function getTopTypes(n = 5) {
|
|
83
|
+
return Object.entries(accessProfile.typeCounts)
|
|
84
|
+
.sort(([, a], [, b]) => b - a)
|
|
85
|
+
.slice(0, n)
|
|
86
|
+
.map(([type, count]) => ({
|
|
87
|
+
type,
|
|
88
|
+
count,
|
|
89
|
+
boost: getPersonalBoost(type),
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=access-pattern-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-pattern-tracker.js","sourceRoot":"","sources":["../../src/memory/access-pattern-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anticipation-engine.d.ts","sourceRoot":"","sources":["../../src/memory/anticipation-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAc,YAAY,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAC/B,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,mBAAmB,EAAE,YAAY,EAAE,CAAC;CACvC;AAED,wBAAgB,UAAU,CACtB,WAAW,EAAE,WAAW,EACxB,WAAW,CAAC,EAAE,MAAM,GACrB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"anticipation-engine.d.ts","sourceRoot":"","sources":["../../src/memory/anticipation-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAc,YAAY,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAC/B,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,mBAAmB,EAAE,YAAY,EAAE,CAAC;CACvC;AAED,wBAAgB,UAAU,CACtB,WAAW,EAAE,WAAW,EACxB,WAAW,CAAC,EAAE,MAAM,GACrB,kBAAkB,CA6DpB;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAiBrE"}
|
|
@@ -21,9 +21,8 @@ function anticipate(memoryStore, currentFile) {
|
|
|
21
21
|
// 2. Directory memories — same folder = likely related
|
|
22
22
|
const dir = currentFile.replace(/[\\/][^\\/]+$/, '');
|
|
23
23
|
if (dir && dir !== currentFile) {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
result.directoryMemories = dirMemories.slice(0, 5).map((m, i) => ({
|
|
24
|
+
const dirMemories = memoryStore.getByDirectory(dir, 5);
|
|
25
|
+
result.directoryMemories = dirMemories.map((m, i) => ({
|
|
27
26
|
memory: m,
|
|
28
27
|
score: 0.7 - (i * 0.05),
|
|
29
28
|
matchMethod: 'anticipation:directory',
|
|
@@ -43,13 +42,22 @@ function anticipate(memoryStore, currentFile) {
|
|
|
43
42
|
};
|
|
44
43
|
const keywords = typeKeywords[ext];
|
|
45
44
|
if (keywords) {
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
// Use FTS search for keywords instead of loading all conventions and filtering in JS
|
|
46
|
+
const searchQuery = keywords.join(' OR ');
|
|
47
|
+
try {
|
|
48
|
+
const ftsResults = memoryStore.searchFTS(searchQuery, 10);
|
|
49
|
+
const matched = ftsResults
|
|
50
|
+
.filter(r => r.memory.type === types_1.MemoryType.CONVENTION)
|
|
51
|
+
.slice(0, 3);
|
|
52
|
+
result.relatedTypeMemories = matched.map((r, i) => ({
|
|
53
|
+
memory: r.memory,
|
|
54
|
+
score: 0.5 - (i * 0.05),
|
|
55
|
+
matchMethod: 'anticipation:filetype',
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// FTS failed — fallback silently
|
|
60
|
+
}
|
|
53
61
|
}
|
|
54
62
|
}
|
|
55
63
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anticipation-engine.js","sourceRoot":"","sources":["../../src/memory/anticipation-engine.ts"],"names":[],"mappings":";;AAiBA,
|
|
1
|
+
{"version":3,"file":"anticipation-engine.js","sourceRoot":"","sources":["../../src/memory/anticipation-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-learner.d.ts","sourceRoot":"","sources":["../../src/memory/auto-learner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GACnF,gBAAgB,GAAG,eAAe,GAAG,QAAQ,GAAG,cAAc,CAAC;AAErE,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"auto-learner.d.ts","sourceRoot":"","sources":["../../src/memory/auto-learner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GACnF,gBAAgB,GAAG,eAAe,GAAG,QAAQ,GAAG,cAAc,CAAC;AAErE,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AAmRD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CA0D/D"}
|
|
@@ -21,22 +21,40 @@ const PATTERNS = [
|
|
|
21
21
|
/\b(don'?t|do not|never|avoid|stop using|instead of|rather than)\b.{5,80}/gi,
|
|
22
22
|
/\b(wrong|incorrect|mistake|bug|error|issue|problem)\b.{5,60}(fix|correct|should|use|replace)/gi,
|
|
23
23
|
/\b(fixed|corrected|resolved)\b.{5,60}/gi,
|
|
24
|
+
/\b(should have|should've|that was wrong|my bad|oops|actually no)\b.{5,80}/gi,
|
|
25
|
+
/\b(I was wrong|we were wrong|that's not right|not correct)\b.{5,60}/gi,
|
|
26
|
+
/\b(better approach|better way|improved by|changed to)\b.{5,80}/gi,
|
|
24
27
|
],
|
|
25
28
|
confidence: 0.75,
|
|
26
29
|
reason: 'Auto-detected correction pattern',
|
|
27
30
|
},
|
|
28
|
-
// DECISION — "we decided", "
|
|
31
|
+
// DECISION — "we decided", "I used", "going with", "chosen"
|
|
29
32
|
{
|
|
30
33
|
type: 'DECISION',
|
|
31
34
|
signals: [
|
|
32
|
-
/\b(we('ll| will| are going to| decided to)?)\s+(use|adopt|switch|go with|choose|pick|implement)\b.{5,80}/gi,
|
|
35
|
+
/\b((?:we|I)('ll| will| are going to| decided to| have decided)?)\s+(use|adopt|switch|go with|choose|pick|implement)\b.{5,80}/gi,
|
|
36
|
+
/\b((?:we|I)\s+(?:used|chose|picked|adopted|switched to|went with|opted for))\b.{5,80}/gi,
|
|
33
37
|
/\b(decided|chosen|selected|picked|going with|sticking with)\b.{5,80}/gi,
|
|
34
38
|
/\b(use|using)\s+\w+\s+(instead of|over|rather than)\s+\w+/gi,
|
|
39
|
+
/\b(chose|opted for|went with|settled on|landed on)\b.{5,80}/gi,
|
|
40
|
+
/\b(changed? from|switch(ed|ing) from|migrat(ed|ing) from)\b.{5,80}/gi,
|
|
41
|
+
/\b(the plan is|approach is|strategy is|our approach)\b.{5,80}/gi,
|
|
35
42
|
],
|
|
36
|
-
confidence: 0.
|
|
43
|
+
confidence: 0.78,
|
|
37
44
|
reason: 'Auto-detected decision pattern',
|
|
38
45
|
},
|
|
39
|
-
// CONVENTION —
|
|
46
|
+
// CONVENTION (specific) — high confidence, specific phrases
|
|
47
|
+
{
|
|
48
|
+
type: 'CONVENTION',
|
|
49
|
+
signals: [
|
|
50
|
+
/\b(best practice|recommended|idiomatic|canonical|proper way)\b.{5,80}/gi,
|
|
51
|
+
/\b(we always|our convention|preferred way|house rule|team rule)\b.{5,80}/gi,
|
|
52
|
+
/\b(in this (project|codebase|repo)|across the (project|codebase))\b.{5,80}/gi,
|
|
53
|
+
],
|
|
54
|
+
confidence: 0.85,
|
|
55
|
+
reason: 'Auto-detected convention pattern (specific)',
|
|
56
|
+
},
|
|
57
|
+
// CONVENTION (generic) — lower confidence
|
|
40
58
|
{
|
|
41
59
|
type: 'CONVENTION',
|
|
42
60
|
signals: [
|
|
@@ -54,11 +72,26 @@ const PATTERNS = [
|
|
|
54
72
|
/\b(bug|the (issue|problem|cause) was|root cause|was causing|the fix)\b.{5,80}/gi,
|
|
55
73
|
/\b(fixed by|resolved by|the solution (is|was))\b.{5,80}/gi,
|
|
56
74
|
/\b(crash|exception|error|fail(ed|ure)?)\b.{5,60}(because|due to|caused by|fixed)/gi,
|
|
75
|
+
/\b(the fix was|worked after|the trick was|solved by)\b.{5,80}/gi,
|
|
76
|
+
/\b(turns out|it was because|the real issue)\b.{5,80}/gi,
|
|
77
|
+
/\b(workaround|hack|temporary fix|quick fix)\b.{5,80}/gi,
|
|
57
78
|
],
|
|
58
79
|
confidence: 0.80,
|
|
59
80
|
reason: 'Auto-detected bug fix pattern',
|
|
60
81
|
},
|
|
61
|
-
// INSIGHT —
|
|
82
|
+
// INSIGHT (specific) — high confidence, clear phrases
|
|
83
|
+
{
|
|
84
|
+
type: 'INSIGHT',
|
|
85
|
+
signals: [
|
|
86
|
+
/\b(for future reference|next time|in the future)\b.{5,80}/gi,
|
|
87
|
+
/\b(learned that|realized|discovered|found out|it turns out)\b.{5,80}/gi,
|
|
88
|
+
/\b(the key is|the secret is|the trick is|pro tip)\b.{5,80}/gi,
|
|
89
|
+
/\b(interestingly|surprisingly|counterintuitively|unexpectedly)\b.{5,80}/gi,
|
|
90
|
+
],
|
|
91
|
+
confidence: 0.85,
|
|
92
|
+
reason: 'Auto-detected insight pattern (specific)',
|
|
93
|
+
},
|
|
94
|
+
// INSIGHT (generic) — lower confidence
|
|
62
95
|
{
|
|
63
96
|
type: 'INSIGHT',
|
|
64
97
|
signals: [
|
|
@@ -119,15 +152,104 @@ const PATTERNS = [
|
|
|
119
152
|
confidence: 0.60,
|
|
120
153
|
reason: 'Auto-detected current task / priority',
|
|
121
154
|
},
|
|
155
|
+
// IMPLICIT DECISION — "let's go with", "I'll use", "we're using", "going to use"
|
|
156
|
+
{
|
|
157
|
+
type: 'DECISION',
|
|
158
|
+
signals: [
|
|
159
|
+
/\b(let'?s (go with|use|try|do|build|implement))\b.{5,80}/gi,
|
|
160
|
+
/\b(I'?ll (use|go with|try|implement|build|create|set up))\b.{5,80}/gi,
|
|
161
|
+
/\b(we'?re (using|going with|building with|switching to))\b.{5,80}/gi,
|
|
162
|
+
/\b(going to use|plan to use|want to use)\b.{5,80}/gi,
|
|
163
|
+
/\b(set up|configured|installed)\s+\w+\s+(for|as|to handle)\b.{5,60}/gi,
|
|
164
|
+
],
|
|
165
|
+
confidence: 0.68,
|
|
166
|
+
reason: 'Auto-detected implicit decision',
|
|
167
|
+
},
|
|
168
|
+
// COMPARISON — "X works better than Y", "X is faster", "prefer X over Y"
|
|
169
|
+
{
|
|
170
|
+
type: 'DECISION',
|
|
171
|
+
signals: [
|
|
172
|
+
/\b\w+\s+(works? better|is (better|faster|simpler|cleaner|safer)|outperforms?)\s+(than\s+)?\w+/gi,
|
|
173
|
+
/\b(prefer|recommend)\s+\w+\s+(over|instead of|rather than)\s+\w+/gi,
|
|
174
|
+
/\b(X|the|this)\s+(approach|solution|method|pattern)\s+is\s+(better|worse|simpler|faster)/gi,
|
|
175
|
+
/\b(more (reliable|scalable|maintainable|readable|performant))\b.{5,60}/gi,
|
|
176
|
+
],
|
|
177
|
+
confidence: 0.65,
|
|
178
|
+
reason: 'Auto-detected comparison / preference',
|
|
179
|
+
},
|
|
180
|
+
// PREFERENCE — "I like", "I want", "please always", user style preferences
|
|
181
|
+
{
|
|
182
|
+
type: 'CONVENTION',
|
|
183
|
+
signals: [
|
|
184
|
+
/\b(I (like|want|prefer|need) (you to|it to|the))\b.{5,80}/gi,
|
|
185
|
+
/\b(please (always|never|don'?t|make sure))\b.{5,80}/gi,
|
|
186
|
+
/\b(be more (concise|verbose|detailed|careful|specific))\b.{5,60}/gi,
|
|
187
|
+
/\b(I don'?t (like|want|need))\b.{5,80}/gi,
|
|
188
|
+
/\b(from now on|going forward|in the future)\b.{5,80}/gi,
|
|
189
|
+
],
|
|
190
|
+
confidence: 0.72,
|
|
191
|
+
reason: 'Auto-detected user preference',
|
|
192
|
+
},
|
|
193
|
+
// ENVIRONMENT — "runs on", "deployed to", "uses port", config knowledge
|
|
194
|
+
{
|
|
195
|
+
type: 'INSIGHT',
|
|
196
|
+
signals: [
|
|
197
|
+
/\b(runs? on|deployed to|hosted on|hosted at)\b.{5,80}/gi,
|
|
198
|
+
/\b(port\s+\d+|localhost:\d+|\.env)\b.{5,60}/gi,
|
|
199
|
+
/\b(database is|DB is|using\s+(postgres|mysql|mongo|redis|sqlite))\b.{5,80}/gi,
|
|
200
|
+
/\b(API (key|token|secret|endpoint) is)\b.{5,60}/gi,
|
|
201
|
+
/\b(production|staging|development)\s+(server|environment|URL|database)\b.{5,60}/gi,
|
|
202
|
+
],
|
|
203
|
+
confidence: 0.70,
|
|
204
|
+
reason: 'Auto-detected environment/config knowledge',
|
|
205
|
+
},
|
|
206
|
+
// ARCHITECTURE — "X calls Y", "X depends on", "flow is", structure knowledge
|
|
207
|
+
{
|
|
208
|
+
type: 'INSIGHT',
|
|
209
|
+
signals: [
|
|
210
|
+
/\b(depends? on|imports? from|calls?|wraps?|extends?|inherits? from)\b.{5,80}/gi,
|
|
211
|
+
/\b(the flow is|data flows?|pipeline is|architecture is)\b.{5,80}/gi,
|
|
212
|
+
/\b(entry point|main file|bootstrap|initialization)\b.{5,60}/gi,
|
|
213
|
+
/\b(this (file|module|component|service) (handles?|manages?|is responsible))\b.{5,80}/gi,
|
|
214
|
+
/\b(layer|tier|service|controller|middleware|handler)\s+(for|handles?|processes?)\b.{5,60}/gi,
|
|
215
|
+
],
|
|
216
|
+
confidence: 0.60,
|
|
217
|
+
reason: 'Auto-detected architecture knowledge',
|
|
218
|
+
},
|
|
219
|
+
// ERROR FINGERPRINT — captures error codes, stack traces, error messages for recall
|
|
220
|
+
{
|
|
221
|
+
type: 'BUG_FIX',
|
|
222
|
+
signals: [
|
|
223
|
+
/\b(Error|TypeError|ReferenceError|SyntaxError|RangeError):\s*.{10,100}/gi,
|
|
224
|
+
/\b(ERR_|ENOENT|EACCES|ECONNREFUSED|EPERM|EISDIR)\b.{5,80}/gi,
|
|
225
|
+
/\b(HTTP\s*(4\d\d|5\d\d))\b.{5,80}/gi,
|
|
226
|
+
/\b(npm ERR|build failed|compilation error|test failed)\b.{5,80}/gi,
|
|
227
|
+
/\b(stack trace|at\s+\w+\s+\()/gi,
|
|
228
|
+
/\b(exit code\s*[1-9]|process exited|segfault|out of memory)\b.{5,60}/gi,
|
|
229
|
+
/\b(cannot find module|module not found|import error|no such file)\b.{5,80}/gi,
|
|
230
|
+
],
|
|
231
|
+
confidence: 0.82,
|
|
232
|
+
reason: 'Auto-detected error fingerprint — enables instant fix recall when same error recurs',
|
|
233
|
+
},
|
|
122
234
|
];
|
|
123
235
|
// ─── Sentence Splitter ────────────────────────────────────────────────────────
|
|
124
236
|
function splitSentences(text) {
|
|
125
|
-
// Split on sentence boundaries
|
|
237
|
+
// CRITICAL FIX: Split on BOTH sentence boundaries AND newlines/bullets
|
|
238
|
+
// AI responses use markdown bullets (- ), numbered lists (1. ), and newlines
|
|
239
|
+
// — not just periods. Without this, markdown bullets merge into one giant
|
|
240
|
+
// sentence and only the strongest pattern fires.
|
|
126
241
|
return text
|
|
127
|
-
.replace(
|
|
128
|
-
.
|
|
242
|
+
.replace(/```[\s\S]*?```/g, '') // Strip code blocks (don't learn from code)
|
|
243
|
+
.replace(/`[^`]+`/g, '') // Strip inline code
|
|
244
|
+
.split(/\n+/) // Split on newlines FIRST
|
|
245
|
+
.flatMap(line => {
|
|
246
|
+
// Strip markdown bullet prefixes: "- ", "* ", "1. ", "> "
|
|
247
|
+
const cleaned = line.replace(/^\s*[-*>]\s+/, '').replace(/^\s*\d+\.\s+/, '').trim();
|
|
248
|
+
// Then split remaining on sentence boundaries
|
|
249
|
+
return cleaned.split(/(?<=[.!?])\s+/);
|
|
250
|
+
})
|
|
129
251
|
.map(s => s.trim())
|
|
130
|
-
.filter(s => s.length >
|
|
252
|
+
.filter(s => s.length > 10 && s.length < 500);
|
|
131
253
|
}
|
|
132
254
|
// ─── Dedup Filter ─────────────────────────────────────────────────────────────
|
|
133
255
|
function normalize(text) {
|
|
@@ -140,7 +262,10 @@ function extractMemories(text) {
|
|
|
140
262
|
const sentences = splitSentences(text);
|
|
141
263
|
const results = [];
|
|
142
264
|
const seen = new Set();
|
|
143
|
-
for (
|
|
265
|
+
for (let i = 0; i < sentences.length; i++) {
|
|
266
|
+
const sentence = sentences[i];
|
|
267
|
+
// Collect ALL matching patterns for this sentence
|
|
268
|
+
const candidates = [];
|
|
144
269
|
for (const pattern of PATTERNS) {
|
|
145
270
|
let matched = false;
|
|
146
271
|
for (const signal of pattern.signals) {
|
|
@@ -150,43 +275,65 @@ function extractMemories(text) {
|
|
|
150
275
|
break;
|
|
151
276
|
}
|
|
152
277
|
}
|
|
153
|
-
if (
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const content = sentence
|
|
157
|
-
.replace(/^(so|and|but|also|note that|remember that|keep in mind that)\s+/i, '')
|
|
158
|
-
.replace(/\s+/g, ' ')
|
|
159
|
-
.trim();
|
|
160
|
-
// Quality gate: reject low-value content
|
|
161
|
-
if (content.length < 40)
|
|
162
|
-
continue;
|
|
163
|
-
// Reject questions — they are not facts to remember
|
|
164
|
-
if (content.trim().endsWith('?'))
|
|
165
|
-
continue;
|
|
166
|
-
// Reject pure conversational filler that adds no value
|
|
167
|
-
const fillerPatterns = [
|
|
168
|
-
/^(you might|you should consider|i would suggest|please note|it's worth|it is worth|feel free to|don't hesitate)/i,
|
|
169
|
-
/^(as mentioned|as noted|as discussed|as i said|as we discussed)/i,
|
|
170
|
-
/^(in general|generally speaking|typically|usually|often|sometimes)/i,
|
|
171
|
-
/^(let me know|let us know|feel free|if you have|if you need)/i,
|
|
172
|
-
];
|
|
173
|
-
if (fillerPatterns.some(p => p.test(content)))
|
|
174
|
-
continue;
|
|
175
|
-
// Dedup by normalized content
|
|
176
|
-
const key = `${pattern.type}:${normalize(content).slice(0, 60)}`;
|
|
177
|
-
if (seen.has(key))
|
|
178
|
-
continue;
|
|
179
|
-
seen.add(key);
|
|
180
|
-
results.push({
|
|
181
|
-
type: pattern.type,
|
|
182
|
-
content,
|
|
183
|
-
confidence: pattern.confidence,
|
|
184
|
-
reason: pattern.reason,
|
|
185
|
-
});
|
|
186
|
-
break; // One match per sentence is enough
|
|
278
|
+
if (matched) {
|
|
279
|
+
candidates.push({ pattern });
|
|
280
|
+
}
|
|
187
281
|
}
|
|
282
|
+
if (candidates.length === 0)
|
|
283
|
+
continue;
|
|
284
|
+
// Pick the highest-confidence match (most specific wins)
|
|
285
|
+
candidates.sort((a, b) => b.pattern.confidence - a.pattern.confidence);
|
|
286
|
+
const best = candidates[0].pattern;
|
|
287
|
+
// Clean up the sentence for storage
|
|
288
|
+
const content = sentence
|
|
289
|
+
.replace(/^(so|and|but|also|note that|remember that|keep in mind that)\s+/i, '')
|
|
290
|
+
.replace(/\s+/g, ' ')
|
|
291
|
+
.trim();
|
|
292
|
+
if (content.length < 10)
|
|
293
|
+
continue;
|
|
294
|
+
// Dedup by normalized content
|
|
295
|
+
const key = `${best.type}:${normalize(content).slice(0, 60)}`;
|
|
296
|
+
if (seen.has(key))
|
|
297
|
+
continue;
|
|
298
|
+
seen.add(key);
|
|
299
|
+
// --- NEW: Extract real reasoning from context ---
|
|
300
|
+
const reason = extractReason(sentence, sentences, i) || best.reason;
|
|
301
|
+
results.push({
|
|
302
|
+
type: best.type,
|
|
303
|
+
content,
|
|
304
|
+
confidence: best.confidence,
|
|
305
|
+
reason,
|
|
306
|
+
});
|
|
188
307
|
}
|
|
189
308
|
// Return only high-confidence matches (avoid noise)
|
|
190
|
-
return results.filter(r => r.confidence >= 0.
|
|
309
|
+
return results.filter(r => r.confidence >= 0.50);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Extract the REAL reason from context — looks for "because", "since", "due to" etc.
|
|
313
|
+
* If the reason clause is in the same sentence, extract it.
|
|
314
|
+
* If it's in the next sentence, grab that as context.
|
|
315
|
+
*/
|
|
316
|
+
function extractReason(sentence, allSentences, index) {
|
|
317
|
+
// Check for inline reasoning: "X because Y", "X since Y", "X due to Y"
|
|
318
|
+
const reasonPatterns = [
|
|
319
|
+
/\b(?:because|since|as)\s+(.{10,120})/i,
|
|
320
|
+
/\b(?:due to|caused by|in order to|so that)\s+(.{10,100})/i,
|
|
321
|
+
/\b(?:the reason (?:is|was|being))\s+(.{10,100})/i,
|
|
322
|
+
/\b(?:this (?:is|was) (?:because|needed|required|necessary))\s+(.{10,100})/i,
|
|
323
|
+
];
|
|
324
|
+
for (const pat of reasonPatterns) {
|
|
325
|
+
const match = sentence.match(pat);
|
|
326
|
+
if (match && match[1]) {
|
|
327
|
+
return match[1].replace(/\s+/g, ' ').trim().slice(0, 120);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// Check next sentence for reasoning context
|
|
331
|
+
if (index + 1 < allSentences.length) {
|
|
332
|
+
const next = allSentences[index + 1];
|
|
333
|
+
if (/^(because|since|this is because|the reason|due to|otherwise)/i.test(next.trim())) {
|
|
334
|
+
return next.trim().slice(0, 120);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return null;
|
|
191
338
|
}
|
|
192
339
|
//# sourceMappingURL=auto-learner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-learner.js","sourceRoot":"","sources":["../../src/memory/auto-learner.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;
|
|
1
|
+
{"version":3,"file":"auto-learner.js","sourceRoot":"","sources":["../../src/memory/auto-learner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Completion Resolver — Detects when work is DONE and demotes old related memories.
|
|
3
|
+
*
|
|
4
|
+
* THE CRITICAL GAP: Cortex stores PROBLEMS ("need SEO", "fix auth bug") but
|
|
5
|
+
* never marks them as RESOLVED. So force_recall keeps suggesting old tasks
|
|
6
|
+
* that were already completed — making the AI feel "dumb" and repetitive.
|
|
7
|
+
*
|
|
8
|
+
* How it works:
|
|
9
|
+
* 1. Scans text for completion signals: "done", "finished", "completed", "shipped"
|
|
10
|
+
* 2. Extracts the TOPIC of what was completed (e.g., "SEO", "auth", "refactoring")
|
|
11
|
+
* 3. Searches existing memories for that topic
|
|
12
|
+
* 4. Demotes old memories about the completed topic (importance → 0.2)
|
|
13
|
+
* 5. Tags them as "resolved" so force_recall can deprioritize
|
|
14
|
+
*
|
|
15
|
+
* This makes Cortex behave like a real brain — once you finish something,
|
|
16
|
+
* it stops nagging you about it.
|
|
17
|
+
*/
|
|
18
|
+
import { MemoryStore } from '../db/memory-store';
|
|
19
|
+
export interface CompletionSignal {
|
|
20
|
+
topic: string;
|
|
21
|
+
trigger: string;
|
|
22
|
+
confidence: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Detect completion signals from text.
|
|
26
|
+
* Returns topics that were identified as "done/completed".
|
|
27
|
+
*/
|
|
28
|
+
export declare function detectCompletion(text: string): CompletionSignal[];
|
|
29
|
+
/**
|
|
30
|
+
* Resolve (demote) old memories about a completed topic.
|
|
31
|
+
*
|
|
32
|
+
* Searches for active memories whose intent mentions the topic,
|
|
33
|
+
* then demotes their importance and tags them as "resolved".
|
|
34
|
+
*
|
|
35
|
+
* Returns the number of memories resolved.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveRelatedMemories(memoryStore: MemoryStore, topic: string, _confidence?: number): number;
|
|
38
|
+
//# sourceMappingURL=completion-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-resolver.d.ts","sourceRoot":"","sources":["../../src/memory/completion-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACtB;AAsBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAqBjE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAClC,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,MAAa,GAC3B,MAAM,CAoDR"}
|