cortex-mcp 2.8.0 → 3.0.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 -227
- 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 +70 -15
- 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 +13 -27
- 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 +991 -1019
- 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,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Completion Resolver — Detects when work is DONE and demotes old related memories.
|
|
4
|
+
*
|
|
5
|
+
* THE CRITICAL GAP: Cortex stores PROBLEMS ("need SEO", "fix auth bug") but
|
|
6
|
+
* never marks them as RESOLVED. So force_recall keeps suggesting old tasks
|
|
7
|
+
* that were already completed — making the AI feel "dumb" and repetitive.
|
|
8
|
+
*
|
|
9
|
+
* How it works:
|
|
10
|
+
* 1. Scans text for completion signals: "done", "finished", "completed", "shipped"
|
|
11
|
+
* 2. Extracts the TOPIC of what was completed (e.g., "SEO", "auth", "refactoring")
|
|
12
|
+
* 3. Searches existing memories for that topic
|
|
13
|
+
* 4. Demotes old memories about the completed topic (importance → 0.2)
|
|
14
|
+
* 5. Tags them as "resolved" so force_recall can deprioritize
|
|
15
|
+
*
|
|
16
|
+
* This makes Cortex behave like a real brain — once you finish something,
|
|
17
|
+
* it stops nagging you about it.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.detectCompletion = detectCompletion;
|
|
21
|
+
exports.resolveRelatedMemories = resolveRelatedMemories;
|
|
22
|
+
const types_1 = require("../types");
|
|
23
|
+
// ─── Completion Detection Patterns ───────────────────────────────────────────
|
|
24
|
+
const COMPLETION_PATTERNS = [
|
|
25
|
+
// Explicit completion: "I finished X", "X is done", "completed the X"
|
|
26
|
+
{ regex: /\b(?:I|we)\s+(?:finished|completed|done with|wrapped up|shipped)\s+(?:the\s+)?(.{3,60})/i, confidence: 0.90 },
|
|
27
|
+
{ regex: /\b(?:the\s+)?(.{3,40})\s+(?:is|are)\s+(?:done|finished|completed|shipped|deployed|live)\b/i, confidence: 0.90 },
|
|
28
|
+
{ regex: /\b(?:just|already|finally)\s+(?:finished|completed|fixed|done with)\s+(?:the\s+)?(.{3,60})/i, confidence: 0.90 },
|
|
29
|
+
// Task-specific completion: "fixed the SEO", "resolved the bug"
|
|
30
|
+
{ regex: /\b(?:fixed|resolved|addressed|handled|took care of)\s+(?:the\s+|all\s+(?:the\s+)?)?(.{3,60})/i, confidence: 0.85 },
|
|
31
|
+
{ regex: /\b(?:the\s+)?(.{3,40})\s+(?:has been|have been|was|were)\s+(?:fixed|resolved|completed|addressed|handled)\b/i, confidence: 0.85 },
|
|
32
|
+
// Implicit completion: "SEO is working now", "auth works fine"
|
|
33
|
+
{ regex: /\b(?:the\s+)?(.{3,40})\s+(?:is|are)\s+(?:working|running|passing|good)\s+(?:now|fine|great|properly)\b/i, confidence: 0.80 },
|
|
34
|
+
{ regex: /\b(?:no more|no longer any?)\s+(?:issues?|problems?|bugs?)\s+(?:with|in|on)\s+(?:the\s+)?(.{3,40})\b/i, confidence: 0.80 },
|
|
35
|
+
// Past tense markers: "we already did X", "X was already done"
|
|
36
|
+
{ regex: /\b(?:already|previously)\s+(?:did|done|fixed|handled|completed|finished)\s+(?:the\s+)?(.{3,60})/i, confidence: 0.85 },
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* Detect completion signals from text.
|
|
40
|
+
* Returns topics that were identified as "done/completed".
|
|
41
|
+
*/
|
|
42
|
+
function detectCompletion(text) {
|
|
43
|
+
const signals = [];
|
|
44
|
+
const seenTopics = new Set();
|
|
45
|
+
for (const pattern of COMPLETION_PATTERNS) {
|
|
46
|
+
const match = text.match(pattern.regex);
|
|
47
|
+
if (match && match[1]) {
|
|
48
|
+
const topic = cleanTopic(match[1]);
|
|
49
|
+
if (topic.length < 3 || topic.length > 50)
|
|
50
|
+
continue;
|
|
51
|
+
if (seenTopics.has(topic.toLowerCase()))
|
|
52
|
+
continue;
|
|
53
|
+
seenTopics.add(topic.toLowerCase());
|
|
54
|
+
signals.push({
|
|
55
|
+
topic,
|
|
56
|
+
trigger: match[0].trim(),
|
|
57
|
+
confidence: pattern.confidence,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return signals;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve (demote) old memories about a completed topic.
|
|
65
|
+
*
|
|
66
|
+
* Searches for active memories whose intent mentions the topic,
|
|
67
|
+
* then demotes their importance and tags them as "resolved".
|
|
68
|
+
*
|
|
69
|
+
* Returns the number of memories resolved.
|
|
70
|
+
*/
|
|
71
|
+
function resolveRelatedMemories(memoryStore, topic, _confidence = 0.85) {
|
|
72
|
+
const topicLower = topic.toLowerCase();
|
|
73
|
+
const topicWords = topicLower.split(/\s+/).filter(w => w.length > 2);
|
|
74
|
+
if (topicWords.length === 0)
|
|
75
|
+
return 0;
|
|
76
|
+
// Search by FTS for the topic
|
|
77
|
+
let candidates;
|
|
78
|
+
try {
|
|
79
|
+
candidates = memoryStore.searchFTS(topic, 50);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// FTS failed, fall back to getActive
|
|
83
|
+
candidates = memoryStore.getActive(200).map(m => ({
|
|
84
|
+
memory: m,
|
|
85
|
+
score: 0,
|
|
86
|
+
matchMethod: 'fallback',
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
let resolved = 0;
|
|
90
|
+
for (const candidate of candidates) {
|
|
91
|
+
const m = candidate.memory;
|
|
92
|
+
const intentLower = m.intent.toLowerCase();
|
|
93
|
+
// Check if this memory's intent is about the completed topic
|
|
94
|
+
const matchingWords = topicWords.filter(w => intentLower.includes(w));
|
|
95
|
+
const matchRatio = matchingWords.length / topicWords.length;
|
|
96
|
+
// Require at least half the topic words to match, minimum 1
|
|
97
|
+
if (matchRatio < 0.5 || matchingWords.length === 0)
|
|
98
|
+
continue;
|
|
99
|
+
// Don't demote if already resolved or very recent (< 1 hour)
|
|
100
|
+
if (m.tags?.includes('resolved'))
|
|
101
|
+
continue;
|
|
102
|
+
if (Date.now() - m.createdAt < 3600000)
|
|
103
|
+
continue;
|
|
104
|
+
// Don't demote high-confidence CORRECTION or CONVENTION memories
|
|
105
|
+
// (those are permanent lessons, not tasks)
|
|
106
|
+
if ((m.type === types_1.MemoryType.CORRECTION || m.type === types_1.MemoryType.CONVENTION) && m.confidence >= 0.8)
|
|
107
|
+
continue;
|
|
108
|
+
// Demote importance and tag as resolved
|
|
109
|
+
const newTags = [...(m.tags || []), 'resolved'];
|
|
110
|
+
const demotedImportance = Math.min(m.importance, 0.2);
|
|
111
|
+
memoryStore.update(m.id, {
|
|
112
|
+
importance: demotedImportance,
|
|
113
|
+
tags: newTags,
|
|
114
|
+
});
|
|
115
|
+
resolved++;
|
|
116
|
+
}
|
|
117
|
+
return resolved;
|
|
118
|
+
}
|
|
119
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
120
|
+
function cleanTopic(raw) {
|
|
121
|
+
return raw
|
|
122
|
+
.replace(/[.!?,;:'"()[\]{}]/g, '')
|
|
123
|
+
.replace(/\b(the|a|an|this|that|those|these|some|any|all|my|our|your)\b/gi, '')
|
|
124
|
+
.replace(/\s+/g, ' ')
|
|
125
|
+
.trim();
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=completion-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-resolver.js","sourceRoot":"","sources":["../../src/memory/completion-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confidence-decay.d.ts","sourceRoot":"","sources":["../../src/memory/confidence-decay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAOxC,kEAAkE;AAClE,wBAAgB,mBAAmB,CAC/B,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,GACtB,MAAM,CAmBR;AAED,4DAA4D;AAC5D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAc7E;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"confidence-decay.d.ts","sourceRoot":"","sources":["../../src/memory/confidence-decay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAOxC,kEAAkE;AAClE,wBAAgB,mBAAmB,CAC/B,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,GACtB,MAAM,CAmBR;AAED,4DAA4D;AAC5D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAc7E;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAyBpE"}
|
|
@@ -38,17 +38,21 @@ function applyConfidenceDecay(memories) {
|
|
|
38
38
|
}
|
|
39
39
|
/** Run periodic maintenance — decay old, unused memories */
|
|
40
40
|
function runDecayMaintenance(memoryStore) {
|
|
41
|
-
|
|
41
|
+
// Target only memories with 0 access older than 1 day (most likely to need decay)
|
|
42
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
43
|
+
const active = memoryStore.getStaleMemories(DAY, 500);
|
|
42
44
|
let decayed = 0;
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
memoryStore.runTransaction(() => {
|
|
46
|
+
for (const m of active) {
|
|
47
|
+
const current = m.importance;
|
|
48
|
+
const effective = effectiveImportance(current, m.timestamp, m.accessCount, m.lastAccessed);
|
|
49
|
+
// Only update if significant change (>5% difference)
|
|
50
|
+
if (Math.abs(current - effective) > 0.05) {
|
|
51
|
+
memoryStore.update(m.id, { importance: effective });
|
|
52
|
+
decayed++;
|
|
53
|
+
}
|
|
50
54
|
}
|
|
51
|
-
}
|
|
55
|
+
});
|
|
52
56
|
return decayed;
|
|
53
57
|
}
|
|
54
58
|
//# sourceMappingURL=confidence-decay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confidence-decay.js","sourceRoot":"","sources":["../../src/memory/confidence-decay.ts"],"names":[],"mappings":";;AAsBA,kDAwBC;AAGD,oDAcC;AAGD,
|
|
1
|
+
{"version":3,"file":"confidence-decay.js","sourceRoot":"","sources":["../../src/memory/confidence-decay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface DetectedConvention {
|
|
2
|
+
pattern: string;
|
|
3
|
+
evidence: string;
|
|
4
|
+
confidence: number;
|
|
5
|
+
category: 'functions' | 'variables' | 'imports' | 'errors' | 'naming' | 'structure';
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Scan source files and detect coding conventions.
|
|
9
|
+
*/
|
|
10
|
+
export declare function detectConventions(workspaceRoot: string): DetectedConvention[];
|
|
11
|
+
//# sourceMappingURL=convention-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convention-detector.d.ts","sourceRoot":"","sources":["../../src/memory/convention-detector.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;CACvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAuN7E"}
|
|
@@ -0,0 +1,294 @@
|
|
|
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.detectConventions = detectConventions;
|
|
37
|
+
/**
|
|
38
|
+
* Convention Detector — Auto-discovers coding patterns from source code.
|
|
39
|
+
*
|
|
40
|
+
* Scans actual project code to detect coding conventions:
|
|
41
|
+
* - Arrow functions vs function declarations
|
|
42
|
+
* - const vs let vs var usage
|
|
43
|
+
* - Error handling patterns (try/catch, .catch(), Result type)
|
|
44
|
+
* - Import style (named vs default, relative vs absolute)
|
|
45
|
+
* - Naming conventions (camelCase, PascalCase, snake_case)
|
|
46
|
+
* - File organization patterns
|
|
47
|
+
*
|
|
48
|
+
* Stores detected patterns as CONVENTION memories so the AI follows
|
|
49
|
+
* the project's actual style, not generic defaults.
|
|
50
|
+
*/
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
/**
|
|
54
|
+
* Scan source files and detect coding conventions.
|
|
55
|
+
*/
|
|
56
|
+
function detectConventions(workspaceRoot) {
|
|
57
|
+
const conventions = [];
|
|
58
|
+
const files = getSourceFiles(workspaceRoot);
|
|
59
|
+
if (files.length === 0)
|
|
60
|
+
return conventions;
|
|
61
|
+
// Counters for pattern detection
|
|
62
|
+
const counts = {
|
|
63
|
+
arrowFunctions: 0,
|
|
64
|
+
functionDeclarations: 0,
|
|
65
|
+
constUsage: 0,
|
|
66
|
+
letUsage: 0,
|
|
67
|
+
varUsage: 0,
|
|
68
|
+
tryCatch: 0,
|
|
69
|
+
dotCatch: 0,
|
|
70
|
+
namedImports: 0,
|
|
71
|
+
defaultImports: 0,
|
|
72
|
+
relativeImports: 0,
|
|
73
|
+
absoluteImports: 0,
|
|
74
|
+
semicolons: 0,
|
|
75
|
+
noSemicolons: 0,
|
|
76
|
+
singleQuotes: 0,
|
|
77
|
+
doubleQuotes: 0,
|
|
78
|
+
asyncAwait: 0,
|
|
79
|
+
thenChain: 0,
|
|
80
|
+
typeAnnotations: 0,
|
|
81
|
+
interfaceCount: 0,
|
|
82
|
+
enumCount: 0,
|
|
83
|
+
classCount: 0,
|
|
84
|
+
};
|
|
85
|
+
// Sample up to 20 files for speed
|
|
86
|
+
const sampleFiles = files.slice(0, 20);
|
|
87
|
+
let _totalLines = 0;
|
|
88
|
+
for (const file of sampleFiles) {
|
|
89
|
+
try {
|
|
90
|
+
const content = fs.readFileSync(path.join(workspaceRoot, file), 'utf-8');
|
|
91
|
+
const lines = content.split('\n');
|
|
92
|
+
_totalLines += lines.length;
|
|
93
|
+
// Count patterns
|
|
94
|
+
counts.arrowFunctions += (content.match(/=>\s*{/g) || []).length;
|
|
95
|
+
counts.functionDeclarations += (content.match(/function\s+\w+/g) || []).length;
|
|
96
|
+
counts.constUsage += (content.match(/\bconst\s+/g) || []).length;
|
|
97
|
+
counts.letUsage += (content.match(/\blet\s+/g) || []).length;
|
|
98
|
+
counts.varUsage += (content.match(/\bvar\s+/g) || []).length;
|
|
99
|
+
counts.tryCatch += (content.match(/try\s*{/g) || []).length;
|
|
100
|
+
counts.dotCatch += (content.match(/\.catch\(/g) || []).length;
|
|
101
|
+
counts.namedImports += (content.match(/import\s+{/g) || []).length;
|
|
102
|
+
counts.defaultImports += (content.match(/import\s+\w+\s+from/g) || []).length;
|
|
103
|
+
counts.relativeImports += (content.match(/from\s+['"]\.\//g) || []).length;
|
|
104
|
+
counts.absoluteImports += (content.match(/from\s+['"](?!\.)/g) || []).length;
|
|
105
|
+
counts.asyncAwait += (content.match(/\basync\s+/g) || []).length;
|
|
106
|
+
counts.thenChain += (content.match(/\.then\(/g) || []).length;
|
|
107
|
+
counts.typeAnnotations += (content.match(/:\s*(string|number|boolean|any|void|never)/g) || []).length;
|
|
108
|
+
counts.interfaceCount += (content.match(/\binterface\s+\w+/g) || []).length;
|
|
109
|
+
counts.enumCount += (content.match(/\benum\s+\w+/g) || []).length;
|
|
110
|
+
counts.classCount += (content.match(/\bclass\s+\w+/g) || []).length;
|
|
111
|
+
// Sample lines for semicolon and quote detection
|
|
112
|
+
for (const line of lines.slice(0, 50)) {
|
|
113
|
+
const trimmed = line.trim();
|
|
114
|
+
if (trimmed.length > 5 && !trimmed.startsWith('//') && !trimmed.startsWith('*')) {
|
|
115
|
+
if (trimmed.endsWith(';'))
|
|
116
|
+
counts.semicolons++;
|
|
117
|
+
else
|
|
118
|
+
counts.noSemicolons++;
|
|
119
|
+
if (trimmed.includes("'"))
|
|
120
|
+
counts.singleQuotes++;
|
|
121
|
+
if (trimmed.includes('"'))
|
|
122
|
+
counts.doubleQuotes++;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch { /* skip unreadable files */ }
|
|
127
|
+
}
|
|
128
|
+
// ─── Derive Conventions ──────────────────────────────────────────────────
|
|
129
|
+
const total = (a, b) => a + b || 1;
|
|
130
|
+
const ratio = (a, b) => a / total(a, b);
|
|
131
|
+
// Function style
|
|
132
|
+
const arrowRatio = ratio(counts.arrowFunctions, counts.functionDeclarations);
|
|
133
|
+
if (arrowRatio > 0.7) {
|
|
134
|
+
conventions.push({
|
|
135
|
+
pattern: 'Use arrow functions (=>) — this project strongly prefers arrow functions over function declarations',
|
|
136
|
+
evidence: `${counts.arrowFunctions} arrow functions vs ${counts.functionDeclarations} function declarations (${Math.round(arrowRatio * 100)}% arrow)`,
|
|
137
|
+
confidence: Math.min(0.9, 0.6 + arrowRatio * 0.3),
|
|
138
|
+
category: 'functions',
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
else if (arrowRatio < 0.3) {
|
|
142
|
+
conventions.push({
|
|
143
|
+
pattern: 'Use function declarations — this project prefers traditional function declarations over arrow functions',
|
|
144
|
+
evidence: `${counts.functionDeclarations} function declarations vs ${counts.arrowFunctions} arrow functions`,
|
|
145
|
+
confidence: Math.min(0.9, 0.6 + (1 - arrowRatio) * 0.3),
|
|
146
|
+
category: 'functions',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// Variable declarations
|
|
150
|
+
if (counts.varUsage > 0 && counts.constUsage + counts.letUsage > 0) {
|
|
151
|
+
const varRatio = counts.varUsage / total(counts.varUsage, counts.constUsage + counts.letUsage);
|
|
152
|
+
if (varRatio < 0.1) {
|
|
153
|
+
conventions.push({
|
|
154
|
+
pattern: 'Never use var — this project uses const/let exclusively',
|
|
155
|
+
evidence: `${counts.constUsage} const, ${counts.letUsage} let, only ${counts.varUsage} var`,
|
|
156
|
+
confidence: 0.90,
|
|
157
|
+
category: 'variables',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (counts.constUsage > 0 && counts.letUsage > 0) {
|
|
162
|
+
const constRatio = ratio(counts.constUsage, counts.letUsage);
|
|
163
|
+
if (constRatio > 0.8) {
|
|
164
|
+
conventions.push({
|
|
165
|
+
pattern: 'Prefer const over let — this project heavily favors immutable bindings',
|
|
166
|
+
evidence: `${counts.constUsage} const vs ${counts.letUsage} let (${Math.round(constRatio * 100)}% const)`,
|
|
167
|
+
confidence: 0.80,
|
|
168
|
+
category: 'variables',
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Async patterns
|
|
173
|
+
const asyncRatio = ratio(counts.asyncAwait, counts.thenChain);
|
|
174
|
+
if (asyncRatio > 0.8 && counts.asyncAwait > 3) {
|
|
175
|
+
conventions.push({
|
|
176
|
+
pattern: 'Use async/await — this project uses async/await pattern, avoid .then() chains',
|
|
177
|
+
evidence: `${counts.asyncAwait} async/await vs ${counts.thenChain} .then() chains`,
|
|
178
|
+
confidence: 0.85,
|
|
179
|
+
category: 'functions',
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// Error handling
|
|
183
|
+
if (counts.tryCatch > 3) {
|
|
184
|
+
conventions.push({
|
|
185
|
+
pattern: 'Use try/catch for error handling — project uses structured error handling',
|
|
186
|
+
evidence: `${counts.tryCatch} try/catch blocks, ${counts.dotCatch} .catch() handlers`,
|
|
187
|
+
confidence: 0.75,
|
|
188
|
+
category: 'errors',
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
// Import style
|
|
192
|
+
if (counts.namedImports > counts.defaultImports * 2) {
|
|
193
|
+
conventions.push({
|
|
194
|
+
pattern: 'Prefer named imports over default imports: import { X } from "..."',
|
|
195
|
+
evidence: `${counts.namedImports} named imports vs ${counts.defaultImports} default imports`,
|
|
196
|
+
confidence: 0.75,
|
|
197
|
+
category: 'imports',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// TypeScript strictness
|
|
201
|
+
if (counts.typeAnnotations > 10 && counts.interfaceCount > 3) {
|
|
202
|
+
conventions.push({
|
|
203
|
+
pattern: 'Use explicit TypeScript types — project uses strong typing with interfaces',
|
|
204
|
+
evidence: `${counts.typeAnnotations} type annotations, ${counts.interfaceCount} interfaces, ${counts.enumCount} enums`,
|
|
205
|
+
confidence: 0.85,
|
|
206
|
+
category: 'naming',
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
// Semicolons
|
|
210
|
+
const semiRatio = ratio(counts.semicolons, counts.noSemicolons);
|
|
211
|
+
if (semiRatio > 0.8) {
|
|
212
|
+
conventions.push({
|
|
213
|
+
pattern: 'Always use semicolons at end of statements',
|
|
214
|
+
evidence: `${Math.round(semiRatio * 100)}% of lines end with semicolons`,
|
|
215
|
+
confidence: 0.80,
|
|
216
|
+
category: 'structure',
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
else if (semiRatio < 0.2) {
|
|
220
|
+
conventions.push({
|
|
221
|
+
pattern: 'No semicolons — project uses ASI (automatic semicolon insertion)',
|
|
222
|
+
evidence: `Only ${Math.round(semiRatio * 100)}% of lines have semicolons`,
|
|
223
|
+
confidence: 0.80,
|
|
224
|
+
category: 'structure',
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// Quote style
|
|
228
|
+
const quoteRatio = ratio(counts.singleQuotes, counts.doubleQuotes);
|
|
229
|
+
if (quoteRatio > 0.7) {
|
|
230
|
+
conventions.push({
|
|
231
|
+
pattern: 'Use single quotes for strings',
|
|
232
|
+
evidence: `${counts.singleQuotes} single-quoted vs ${counts.doubleQuotes} double-quoted strings`,
|
|
233
|
+
confidence: 0.75,
|
|
234
|
+
category: 'structure',
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
else if (quoteRatio < 0.3) {
|
|
238
|
+
conventions.push({
|
|
239
|
+
pattern: 'Use double quotes for strings',
|
|
240
|
+
evidence: `${counts.doubleQuotes} double-quoted vs ${counts.singleQuotes} single-quoted strings`,
|
|
241
|
+
confidence: 0.75,
|
|
242
|
+
category: 'structure',
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
// Class vs functional style
|
|
246
|
+
if (counts.classCount > 5) {
|
|
247
|
+
conventions.push({
|
|
248
|
+
pattern: 'Uses class-based architecture (OOP style)',
|
|
249
|
+
evidence: `${counts.classCount} classes found across ${sampleFiles.length} files`,
|
|
250
|
+
confidence: 0.70,
|
|
251
|
+
category: 'structure',
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
else if (counts.classCount === 0 && counts.arrowFunctions > 10) {
|
|
255
|
+
conventions.push({
|
|
256
|
+
pattern: 'Uses functional architecture — no classes, prefer pure functions',
|
|
257
|
+
evidence: `0 classes, ${counts.arrowFunctions} arrow functions`,
|
|
258
|
+
confidence: 0.70,
|
|
259
|
+
category: 'structure',
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
return conventions;
|
|
263
|
+
}
|
|
264
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
265
|
+
function getSourceFiles(root) {
|
|
266
|
+
const files = [];
|
|
267
|
+
const ignore = new Set(['node_modules', '.git', 'dist', 'coverage', '.next', 'build']);
|
|
268
|
+
const exts = new Set(['.ts', '.tsx', '.js', '.jsx']);
|
|
269
|
+
function walk(dir, depth) {
|
|
270
|
+
if (depth > 3 || files.length >= 30)
|
|
271
|
+
return;
|
|
272
|
+
try {
|
|
273
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
274
|
+
for (const entry of entries) {
|
|
275
|
+
if (ignore.has(entry.name) || entry.name.startsWith('.'))
|
|
276
|
+
continue;
|
|
277
|
+
const full = path.join(dir, entry.name);
|
|
278
|
+
if (entry.isDirectory()) {
|
|
279
|
+
walk(full, depth + 1);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
const ext = path.extname(entry.name);
|
|
283
|
+
if (exts.has(ext) && !entry.name.endsWith('.d.ts')) {
|
|
284
|
+
files.push(path.relative(root, full).replace(/\\/g, '/'));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch { /* ignore */ }
|
|
290
|
+
}
|
|
291
|
+
walk(root, 0);
|
|
292
|
+
return files;
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=convention-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convention-detector.js","sourceRoot":"","sources":["../../src/memory/convention-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correction Detector — Catches user corrections automatically.
|
|
3
|
+
*
|
|
4
|
+
* The #1 gap in Cortex: when a user says "no, use X instead of Y",
|
|
5
|
+
* that correction is LOST when the conversation ends.
|
|
6
|
+
*
|
|
7
|
+
* This module scans text (both AI responses and user context) for
|
|
8
|
+
* correction patterns and auto-stores them as high-importance CORRECTION memories.
|
|
9
|
+
*
|
|
10
|
+
* Examples it catches:
|
|
11
|
+
* - "no, use vectors not vectorCache"
|
|
12
|
+
* - "that's wrong, it should be const"
|
|
13
|
+
* - "actually the file is in src/db/"
|
|
14
|
+
* - "I meant to use path.join"
|
|
15
|
+
*/
|
|
16
|
+
export interface DetectedCorrection {
|
|
17
|
+
original: string;
|
|
18
|
+
corrected: string;
|
|
19
|
+
fullContext: string;
|
|
20
|
+
confidence: number;
|
|
21
|
+
source: 'user_correction' | 'ai_acknowledgment';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Detect corrections from user context text.
|
|
25
|
+
* Call this when auto_learn receives context about what the user said.
|
|
26
|
+
*/
|
|
27
|
+
export declare function detectUserCorrections(userText: string): DetectedCorrection[];
|
|
28
|
+
/**
|
|
29
|
+
* Detect when the AI acknowledges a mistake in its own response.
|
|
30
|
+
* Call this from auto_learn on the AI's response text.
|
|
31
|
+
*/
|
|
32
|
+
export declare function detectAIAcknowledgments(aiText: string): DetectedCorrection[];
|
|
33
|
+
//# sourceMappingURL=correction-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correction-detector.d.ts","sourceRoot":"","sources":["../../src/memory/correction-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,GAAG,mBAAmB,CAAC;CACnD;AA4DD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAyB5E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAuB5E"}
|