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
|
@@ -4,6 +4,10 @@ exports.qualityCheck = qualityCheck;
|
|
|
4
4
|
exports.findContradiction = findContradiction;
|
|
5
5
|
exports.storeWithQuality = storeWithQuality;
|
|
6
6
|
const types_1 = require("../types");
|
|
7
|
+
/** Module-level stopwords for contradiction detection — avoid recreation per call */
|
|
8
|
+
const CONTRADICTION_STOP_WORDS = new Set([
|
|
9
|
+
'should', 'would', 'could', 'about', 'their', 'these', 'those', 'which', 'there', 'where', 'while'
|
|
10
|
+
]);
|
|
7
11
|
// --- Quality Gate ---
|
|
8
12
|
const TOO_GENERIC = new Set([
|
|
9
13
|
'use best practices',
|
|
@@ -20,7 +24,7 @@ const TOO_GENERIC = new Set([
|
|
|
20
24
|
* Check if a memory is worth storing.
|
|
21
25
|
* Returns null if good, or a rejection reason if bad.
|
|
22
26
|
*/
|
|
23
|
-
function qualityCheck(intent,
|
|
27
|
+
function qualityCheck(intent, _type) {
|
|
24
28
|
// Too short
|
|
25
29
|
if (!intent || intent.trim().length < 15) {
|
|
26
30
|
return 'Too short (< 15 chars)';
|
|
@@ -142,12 +146,11 @@ function findContradiction(memoryStore, newIntent, newType) {
|
|
|
142
146
|
for (const existing of decisions) {
|
|
143
147
|
const existLower = existing.intent.toLowerCase();
|
|
144
148
|
// Extract key nouns (words > 4 chars, not stopwords)
|
|
145
|
-
const
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
// Count overlapping nouns
|
|
149
|
+
const newNouns = newLower.split(/\s+/).filter(w => w.length > 4 && !CONTRADICTION_STOP_WORDS.has(w));
|
|
150
|
+
const existNouns = existLower.split(/\s+/).filter(w => w.length > 4 && !CONTRADICTION_STOP_WORDS.has(w));
|
|
151
|
+
// Count overlapping nouns — require 3+ to reduce false positives
|
|
149
152
|
const overlap = newNouns.filter(w => existNouns.includes(w));
|
|
150
|
-
if (overlap.length >=
|
|
153
|
+
if (overlap.length >= 3) {
|
|
151
154
|
// Same topic detected. Check if conclusion differs.
|
|
152
155
|
// Simple: if both are decisions about the same topic, flag it
|
|
153
156
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-quality.js","sourceRoot":"","sources":["../../src/memory/memory-quality.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"memory-quality.js","sourceRoot":"","sources":["../../src/memory/memory-quality.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
|
*/
|
|
@@ -29,9 +30,13 @@ function rankResults(ftsResults, vectorResults, maxResults, currentFile) {
|
|
|
29
30
|
const recencyBoost = ageMs < DAY ? 1.5 : ageMs < 7 * DAY ? 1.2 : 1.0;
|
|
30
31
|
// NEW: File-aware boost — if memory is related to current file, boost 1.5x
|
|
31
32
|
const fileBoost = currentFile && r.memory.relatedFiles?.some((f) => f.includes(currentFile) || currentFile.includes(f)) ? 1.5 : 1.0;
|
|
33
|
+
// NEW: Resolved penalty — completed/resolved memories score much lower
|
|
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);
|
|
32
37
|
merged.push({
|
|
33
38
|
memory: r.memory,
|
|
34
|
-
score: r.score * boost * accessBoost * recencyBoost * fileBoost,
|
|
39
|
+
score: r.score * boost * accessBoost * recencyBoost * fileBoost * resolvedPenalty * personalBoost,
|
|
35
40
|
});
|
|
36
41
|
}
|
|
37
42
|
for (const r of vectorResults) {
|
|
@@ -43,9 +48,13 @@ function rankResults(ftsResults, vectorResults, maxResults, currentFile) {
|
|
|
43
48
|
const ageMs = now - (r.memory.createdAt || r.memory.timestamp || 0);
|
|
44
49
|
const recencyBoost = ageMs < DAY ? 1.5 : ageMs < 7 * DAY ? 1.2 : 1.0;
|
|
45
50
|
const fileBoost = currentFile && r.memory.relatedFiles?.some((f) => f.includes(currentFile) || currentFile.includes(f)) ? 1.5 : 1.0;
|
|
51
|
+
// Resolved penalty (same as FTS block)
|
|
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);
|
|
46
55
|
merged.push({
|
|
47
56
|
memory: r.memory,
|
|
48
|
-
score: r.score * boost * accessBoost * recencyBoost * fileBoost,
|
|
57
|
+
score: r.score * boost * accessBoost * recencyBoost * fileBoost * resolvedPenalty * personalBoost,
|
|
49
58
|
});
|
|
50
59
|
}
|
|
51
60
|
merged.sort((a, b) => b.score - a.score);
|
|
@@ -57,7 +66,7 @@ function rankResults(ftsResults, vectorResults, maxResults, currentFile) {
|
|
|
57
66
|
function formatResults(ranked, queryText) {
|
|
58
67
|
const lines = [];
|
|
59
68
|
for (const r of ranked) {
|
|
60
|
-
lines.push(`[${r.memory.type}] ${r.memory.intent}
|
|
69
|
+
lines.push(`[${r.memory.type}] ${r.memory.intent}`);
|
|
61
70
|
if (r.memory.action)
|
|
62
71
|
lines.push(` → ${r.memory.action}`);
|
|
63
72
|
if (r.memory.reason)
|
|
@@ -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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"}
|
|
@@ -49,9 +49,9 @@ const path = __importStar(require("path"));
|
|
|
49
49
|
/** Detect knowledge gaps in the project */
|
|
50
50
|
function detectKnowledgeGaps(memoryStore, workspaceRoot) {
|
|
51
51
|
const gaps = [];
|
|
52
|
-
// Get all memories' related files
|
|
52
|
+
// Get all memories' related files — use smaller limit since we only need file refs
|
|
53
53
|
const knownFiles = new Set();
|
|
54
|
-
const active = memoryStore.getActive(
|
|
54
|
+
const active = memoryStore.getActive(200);
|
|
55
55
|
for (const m of active) {
|
|
56
56
|
if (m.relatedFiles) {
|
|
57
57
|
for (const f of m.relatedFiles) {
|
|
@@ -59,7 +59,7 @@ function detectKnowledgeGaps(memoryStore, workspaceRoot) {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
// Also check intent for file references
|
|
62
|
-
const fileRefs = m.intent.match(/[\w
|
|
62
|
+
const fileRefs = m.intent.match(/[\w\-/]+\.(ts|js|tsx|jsx|py|css|json|sql)/g);
|
|
63
63
|
if (fileRefs) {
|
|
64
64
|
for (const ref of fileRefs) {
|
|
65
65
|
knownFiles.add(normalize(ref));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta-memory.js","sourceRoot":"","sources":["../../src/memory/meta-memory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,kDAiDC;AAGD,kDAaC;AArFD;;;;;;;;GAQG;AACH,uCAAyB;AACzB,2CAA6B;AAS7B,2CAA2C;AAC3C,SAAgB,mBAAmB,CAC/B,WAAwB,EACxB,aAAqB;IAErB,MAAM,IAAI,GAAmB,EAAE,CAAC;IAEhC,
|
|
1
|
+
{"version":3,"file":"meta-memory.js","sourceRoot":"","sources":["../../src/memory/meta-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MMR Re-ranking — Maximal Marginal Relevance.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from OpenClaw's mmr.ts architecture.
|
|
5
|
+
*
|
|
6
|
+
* Problem: Without MMR, recall might return 5 memories all saying
|
|
7
|
+
* "use TypeScript strict mode." That's redundant.
|
|
8
|
+
*
|
|
9
|
+
* Solution: MMR balances RELEVANCE (how well it matches the query)
|
|
10
|
+
* with DIVERSITY (how different it is from already-selected results).
|
|
11
|
+
*
|
|
12
|
+
* Formula: MMR(d) = λ * relevance(d) - (1-λ) * max_similarity(d, selected)
|
|
13
|
+
* Where λ = 0.7 means "70% relevance, 30% diversity"
|
|
14
|
+
*/
|
|
15
|
+
export interface MMRConfig {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
lambda: number;
|
|
18
|
+
diversityWeight: number;
|
|
19
|
+
}
|
|
20
|
+
export declare const DEFAULT_MMR_CONFIG: MMRConfig;
|
|
21
|
+
export interface ScoredItem {
|
|
22
|
+
score: number;
|
|
23
|
+
memory: {
|
|
24
|
+
id: string;
|
|
25
|
+
intent: string;
|
|
26
|
+
type: string;
|
|
27
|
+
tags?: string[];
|
|
28
|
+
files?: string[];
|
|
29
|
+
};
|
|
30
|
+
matchMethod: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Apply MMR re-ranking to search results.
|
|
34
|
+
* Keeps the top result unchanged, then iteratively picks
|
|
35
|
+
* the next result that maximizes relevance while being
|
|
36
|
+
* different from already-selected results.
|
|
37
|
+
*/
|
|
38
|
+
export declare function applyMMR<T extends ScoredItem>(results: T[], config?: Partial<MMRConfig>): T[];
|
|
39
|
+
//# sourceMappingURL=mmr-reranker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mmr-reranker.d.ts","sourceRoot":"","sources":["../../src/memory/mmr-reranker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,kBAAkB,EAAE,SAIhC,CAAC;AAEF,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,UAAU,EACzC,OAAO,EAAE,CAAC,EAAE,EACZ,MAAM,GAAE,OAAO,CAAC,SAAS,CAAM,GAChC,CAAC,EAAE,CAuCL"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MMR Re-ranking — Maximal Marginal Relevance.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from OpenClaw's mmr.ts architecture.
|
|
6
|
+
*
|
|
7
|
+
* Problem: Without MMR, recall might return 5 memories all saying
|
|
8
|
+
* "use TypeScript strict mode." That's redundant.
|
|
9
|
+
*
|
|
10
|
+
* Solution: MMR balances RELEVANCE (how well it matches the query)
|
|
11
|
+
* with DIVERSITY (how different it is from already-selected results).
|
|
12
|
+
*
|
|
13
|
+
* Formula: MMR(d) = λ * relevance(d) - (1-λ) * max_similarity(d, selected)
|
|
14
|
+
* Where λ = 0.7 means "70% relevance, 30% diversity"
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.DEFAULT_MMR_CONFIG = void 0;
|
|
18
|
+
exports.applyMMR = applyMMR;
|
|
19
|
+
exports.DEFAULT_MMR_CONFIG = {
|
|
20
|
+
enabled: true,
|
|
21
|
+
lambda: 0.7, // OpenClaw default: 70% relevance, 30% diversity
|
|
22
|
+
diversityWeight: 0.3,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Apply MMR re-ranking to search results.
|
|
26
|
+
* Keeps the top result unchanged, then iteratively picks
|
|
27
|
+
* the next result that maximizes relevance while being
|
|
28
|
+
* different from already-selected results.
|
|
29
|
+
*/
|
|
30
|
+
function applyMMR(results, config = {}) {
|
|
31
|
+
const cfg = { ...exports.DEFAULT_MMR_CONFIG, ...config };
|
|
32
|
+
if (!cfg.enabled || results.length <= 2)
|
|
33
|
+
return results;
|
|
34
|
+
const lambda = cfg.lambda;
|
|
35
|
+
const selected = [];
|
|
36
|
+
const remaining = [...results];
|
|
37
|
+
// Always pick the top result first
|
|
38
|
+
selected.push(remaining.shift());
|
|
39
|
+
while (remaining.length > 0 && selected.length < results.length) {
|
|
40
|
+
let bestIdx = 0;
|
|
41
|
+
let bestMMR = -Infinity;
|
|
42
|
+
for (let i = 0; i < remaining.length; i++) {
|
|
43
|
+
const candidate = remaining[i];
|
|
44
|
+
// Relevance score (normalized)
|
|
45
|
+
const relevance = candidate.score;
|
|
46
|
+
// Max similarity to any already-selected result
|
|
47
|
+
const maxSim = Math.max(...selected.map(s => computeSimilarity(candidate, s)));
|
|
48
|
+
// MMR formula
|
|
49
|
+
const mmrScore = lambda * relevance - (1 - lambda) * maxSim;
|
|
50
|
+
if (mmrScore > bestMMR) {
|
|
51
|
+
bestMMR = mmrScore;
|
|
52
|
+
bestIdx = i;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
selected.push(remaining.splice(bestIdx, 1)[0]);
|
|
56
|
+
}
|
|
57
|
+
return selected;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Compute similarity between two memories.
|
|
61
|
+
* Uses a combination of:
|
|
62
|
+
* 1. Word overlap (Jaccard similarity on intent words)
|
|
63
|
+
* 2. Type match (same type = more similar)
|
|
64
|
+
* 3. File overlap (shared files = more similar)
|
|
65
|
+
*/
|
|
66
|
+
function computeSimilarity(a, b) {
|
|
67
|
+
let sim = 0;
|
|
68
|
+
// 1. Word overlap (Jaccard) — main signal
|
|
69
|
+
const wordsA = new Set(extractWords(a.memory.intent));
|
|
70
|
+
const wordsB = new Set(extractWords(b.memory.intent));
|
|
71
|
+
if (wordsA.size > 0 && wordsB.size > 0) {
|
|
72
|
+
let intersection = 0;
|
|
73
|
+
for (const w of wordsA) {
|
|
74
|
+
if (wordsB.has(w))
|
|
75
|
+
intersection++;
|
|
76
|
+
}
|
|
77
|
+
const union = wordsA.size + wordsB.size - intersection;
|
|
78
|
+
sim += (intersection / union) * 0.6; // 60% weight on word overlap
|
|
79
|
+
}
|
|
80
|
+
// 2. Same type = similar
|
|
81
|
+
if (a.memory.type === b.memory.type) {
|
|
82
|
+
sim += 0.2;
|
|
83
|
+
}
|
|
84
|
+
// 3. File overlap
|
|
85
|
+
const filesA = new Set(a.memory.files || []);
|
|
86
|
+
const filesB = new Set(b.memory.files || []);
|
|
87
|
+
if (filesA.size > 0 && filesB.size > 0) {
|
|
88
|
+
let fileOverlap = 0;
|
|
89
|
+
for (const f of filesA) {
|
|
90
|
+
if (filesB.has(f))
|
|
91
|
+
fileOverlap++;
|
|
92
|
+
}
|
|
93
|
+
if (fileOverlap > 0) {
|
|
94
|
+
sim += 0.2 * (fileOverlap / Math.max(filesA.size, filesB.size));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return Math.min(sim, 1.0);
|
|
98
|
+
}
|
|
99
|
+
// Stop words to ignore in similarity computation
|
|
100
|
+
const STOP_WORDS = new Set([
|
|
101
|
+
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
102
|
+
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
103
|
+
'should', 'may', 'might', 'can', 'shall', 'to', 'of', 'in', 'for',
|
|
104
|
+
'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',
|
|
105
|
+
'use', 'used', 'using', 'this', 'that', 'these', 'those', 'it', 'its',
|
|
106
|
+
'not', 'no', 'nor', 'but', 'or', 'and', 'if', 'then', 'else', 'when',
|
|
107
|
+
'up', 'out', 'about', 'so', 'all', 'each', 'every', 'both', 'few',
|
|
108
|
+
]);
|
|
109
|
+
function extractWords(text) {
|
|
110
|
+
return text.toLowerCase()
|
|
111
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
112
|
+
.split(/\s+/)
|
|
113
|
+
.filter(w => w.length > 2 && !STOP_WORDS.has(w));
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=mmr-reranker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mmr-reranker.js","sourceRoot":"","sources":["../../src/memory/mmr-reranker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-Flight Checks — Convention check BEFORE writing code.
|
|
3
|
+
*
|
|
4
|
+
* Instead of reviewing code AFTER it's written (review_code),
|
|
5
|
+
* this tells the AI what conventions and gotchas exist for a file/task
|
|
6
|
+
* BEFORE a single line is written.
|
|
7
|
+
*
|
|
8
|
+
* Like a pilot's pre-flight checklist — don't take off without checking.
|
|
9
|
+
*/
|
|
10
|
+
import { MemoryStore } from '../db/memory-store';
|
|
11
|
+
export interface PreFlightResult {
|
|
12
|
+
conventions: string[];
|
|
13
|
+
gotchas: string[];
|
|
14
|
+
pastBugs: string[];
|
|
15
|
+
fileNotes: string[];
|
|
16
|
+
recentCorrections: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get everything the AI needs to know BEFORE writing/editing code for a file.
|
|
20
|
+
*/
|
|
21
|
+
export declare function preFlightCheck(memoryStore: MemoryStore, filename?: string, task?: string): PreFlightResult;
|
|
22
|
+
/** Format pre-flight results for AI consumption */
|
|
23
|
+
export declare function formatPreFlight(result: PreFlightResult): string;
|
|
24
|
+
//# sourceMappingURL=pre-flight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-flight.d.ts","sourceRoot":"","sources":["../../src/memory/pre-flight.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC1B,WAAW,EAAE,WAAW,EACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACd,eAAe,CA4EjB;AAED,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CA8C/D"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.preFlightCheck = preFlightCheck;
|
|
4
|
+
exports.formatPreFlight = formatPreFlight;
|
|
5
|
+
/**
|
|
6
|
+
* Get everything the AI needs to know BEFORE writing/editing code for a file.
|
|
7
|
+
*/
|
|
8
|
+
function preFlightCheck(memoryStore, filename, task) {
|
|
9
|
+
const result = {
|
|
10
|
+
conventions: [],
|
|
11
|
+
gotchas: [],
|
|
12
|
+
pastBugs: [],
|
|
13
|
+
fileNotes: [],
|
|
14
|
+
recentCorrections: [],
|
|
15
|
+
};
|
|
16
|
+
// 1. Get ALL conventions (these apply everywhere)
|
|
17
|
+
const conventions = memoryStore.getByType('CONVENTION', 50);
|
|
18
|
+
for (const conv of conventions) {
|
|
19
|
+
// Filter by relevance to file type if filename provided
|
|
20
|
+
if (filename) {
|
|
21
|
+
const ext = filename.split('.').pop()?.toLowerCase() || '';
|
|
22
|
+
const intentLower = conv.intent.toLowerCase();
|
|
23
|
+
const fileTypeKeywords = {
|
|
24
|
+
ts: ['typescript', 'type', 'interface', 'const', 'let', 'var', 'import', 'export'],
|
|
25
|
+
tsx: ['react', 'component', 'hook', 'jsx', 'state', 'prop'],
|
|
26
|
+
css: ['style', 'css', 'class', 'color', 'font'],
|
|
27
|
+
py: ['python', 'def', 'class', 'import'],
|
|
28
|
+
js: ['javascript', 'require', 'module', 'function'],
|
|
29
|
+
};
|
|
30
|
+
const keywords = fileTypeKeywords[ext] || [];
|
|
31
|
+
const isRelevant = keywords.length === 0 || keywords.some(k => intentLower.includes(k))
|
|
32
|
+
|| !Object.values(fileTypeKeywords).flat().some(k => intentLower.includes(k)); // Generic convention
|
|
33
|
+
if (!isRelevant)
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
result.conventions.push(`[${conv.id.slice(0, 8)}] ${conv.intent}`);
|
|
37
|
+
}
|
|
38
|
+
// 2. Get GOTCHA memories (dangerous patterns)
|
|
39
|
+
const gotchas = memoryStore.getByType('GOTCHA', 20);
|
|
40
|
+
for (const g of gotchas) {
|
|
41
|
+
result.gotchas.push(`⚠️ [${g.id.slice(0, 8)}] ${g.intent}`);
|
|
42
|
+
}
|
|
43
|
+
// 3. Get past BUG_FIX patterns for this file
|
|
44
|
+
const bugFixes = memoryStore.getByType('BUG_FIX', 30);
|
|
45
|
+
for (const bug of bugFixes) {
|
|
46
|
+
if (filename && bug.relatedFiles?.some(f => f.includes(filename.split(/[\\/]/).pop() || ''))) {
|
|
47
|
+
result.pastBugs.push(`🐛 [${bug.id.slice(0, 8)}] ${bug.intent}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// 4. File-specific memories
|
|
51
|
+
if (filename) {
|
|
52
|
+
const fileMemories = memoryStore.getByFile(filename, 10);
|
|
53
|
+
for (const fm of fileMemories) {
|
|
54
|
+
result.fileNotes.push(`📄 [${fm.type}] ${fm.intent}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// 5. Recent CORRECTIONS (last 20 — most likely to be repeated)
|
|
58
|
+
const corrections = memoryStore.getByType('CORRECTION', 20);
|
|
59
|
+
for (const corr of corrections) {
|
|
60
|
+
// Only include recent ones (last 7 days)
|
|
61
|
+
if (Date.now() - corr.timestamp < 7 * 24 * 60 * 60 * 1000) {
|
|
62
|
+
result.recentCorrections.push(`🔄 [${corr.id.slice(0, 8)}] ${corr.intent}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Task-specific memories via FTS search
|
|
66
|
+
if (task) {
|
|
67
|
+
try {
|
|
68
|
+
const taskResults = memoryStore.searchFTS(task, 5);
|
|
69
|
+
for (const r of taskResults) {
|
|
70
|
+
const m = r.memory;
|
|
71
|
+
if (m.type === 'FAILED_ATTEMPT') {
|
|
72
|
+
result.gotchas.push(`❌ [FAILED] ${m.intent}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch { /* FTS failure is non-fatal */ }
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
/** Format pre-flight results for AI consumption */
|
|
81
|
+
function formatPreFlight(result) {
|
|
82
|
+
const sections = ['# ✈️ Pre-Flight Check\n'];
|
|
83
|
+
let hasContent = false;
|
|
84
|
+
if (result.recentCorrections.length > 0) {
|
|
85
|
+
sections.push('## 🔴 Recent Corrections (DON\'T repeat these)\n');
|
|
86
|
+
result.recentCorrections.forEach(c => sections.push(c));
|
|
87
|
+
sections.push('');
|
|
88
|
+
hasContent = true;
|
|
89
|
+
}
|
|
90
|
+
if (result.gotchas.length > 0) {
|
|
91
|
+
sections.push('## ⚠️ Gotchas & Failed Attempts\n');
|
|
92
|
+
result.gotchas.forEach(g => sections.push(g));
|
|
93
|
+
sections.push('');
|
|
94
|
+
hasContent = true;
|
|
95
|
+
}
|
|
96
|
+
if (result.pastBugs.length > 0) {
|
|
97
|
+
sections.push('## 🐛 Past Bugs in This File\n');
|
|
98
|
+
result.pastBugs.forEach(b => sections.push(b));
|
|
99
|
+
sections.push('');
|
|
100
|
+
hasContent = true;
|
|
101
|
+
}
|
|
102
|
+
if (result.fileNotes.length > 0) {
|
|
103
|
+
sections.push('## 📄 File Context\n');
|
|
104
|
+
result.fileNotes.forEach(f => sections.push(f));
|
|
105
|
+
sections.push('');
|
|
106
|
+
hasContent = true;
|
|
107
|
+
}
|
|
108
|
+
if (result.conventions.length > 0) {
|
|
109
|
+
sections.push(`## 📏 Conventions (${result.conventions.length})\n`);
|
|
110
|
+
result.conventions.slice(0, 10).forEach(c => sections.push(c));
|
|
111
|
+
if (result.conventions.length > 10) {
|
|
112
|
+
sections.push(`_...and ${result.conventions.length - 10} more_`);
|
|
113
|
+
}
|
|
114
|
+
hasContent = true;
|
|
115
|
+
}
|
|
116
|
+
if (!hasContent) {
|
|
117
|
+
return '# ✈️ Pre-Flight Check\n\n✅ No conventions, gotchas, or past bugs found. Clear for takeoff.';
|
|
118
|
+
}
|
|
119
|
+
return sections.join('\n');
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=pre-flight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-flight.js","sourceRoot":"","sources":["../../src/memory/pre-flight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preference Learner — Learns how the user likes to work.
|
|
3
|
+
*
|
|
4
|
+
* Detects communication and coding preferences from user messages:
|
|
5
|
+
* - Verbose vs concise responses
|
|
6
|
+
* - Asks before changing vs just do it
|
|
7
|
+
* - Wants explanations vs just code
|
|
8
|
+
* - Framework/library preferences
|
|
9
|
+
*
|
|
10
|
+
* Stores as PREFERENCE memories for AI to adapt to.
|
|
11
|
+
*/
|
|
12
|
+
import { MemoryStore } from '../db/memory-store';
|
|
13
|
+
export interface DetectedPreference {
|
|
14
|
+
category: 'communication' | 'coding' | 'workflow' | 'style';
|
|
15
|
+
preference: string;
|
|
16
|
+
confidence: number;
|
|
17
|
+
evidence: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Detect user preferences from their message text.
|
|
21
|
+
* Call this from auto_learn when context is provided.
|
|
22
|
+
*/
|
|
23
|
+
export declare function detectPreferences(userText: string): DetectedPreference[];
|
|
24
|
+
/**
|
|
25
|
+
* Get all stored preferences for injection into force_recall.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getStoredPreferences(memoryStore: MemoryStore): string;
|
|
28
|
+
//# sourceMappingURL=preference-learner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preference-learner.d.ts","sourceRoot":"","sources":["../../src/memory/preference-learner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAyGD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAwBxE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAkBrE"}
|