cortex-mcp 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/dist/cli/setup.d.ts +12 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +293 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config/config.d.ts +13 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +33 -0
- package/dist/config/config.js.map +1 -0
- package/dist/core/event-bus.d.ts +19 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +51 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/db/database.d.ts +19 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +254 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/event-log.d.ts +28 -0
- package/dist/db/event-log.d.ts.map +1 -0
- package/dist/db/event-log.js +87 -0
- package/dist/db/event-log.js.map +1 -0
- package/dist/db/memory-store.d.ts +65 -0
- package/dist/db/memory-store.d.ts.map +1 -0
- package/dist/db/memory-store.js +370 -0
- package/dist/db/memory-store.js.map +1 -0
- package/dist/embedding-worker.d.ts +3 -0
- package/dist/embedding-worker.d.ts.map +1 -0
- package/dist/embedding-worker.js +94 -0
- package/dist/embedding-worker.js.map +1 -0
- package/dist/hooks/cortex-run.d.ts +15 -0
- package/dist/hooks/cortex-run.d.ts.map +1 -0
- package/dist/hooks/cortex-run.js +148 -0
- package/dist/hooks/cortex-run.js.map +1 -0
- package/dist/hooks/git-capture.d.ts +21 -0
- package/dist/hooks/git-capture.d.ts.map +1 -0
- package/dist/hooks/git-capture.js +178 -0
- package/dist/hooks/git-capture.js.map +1 -0
- package/dist/hooks/git-hooks.d.ts +12 -0
- package/dist/hooks/git-hooks.d.ts.map +1 -0
- package/dist/hooks/git-hooks.js +130 -0
- package/dist/hooks/git-hooks.js.map +1 -0
- package/dist/mcp-stdio.d.ts +10 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +247 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/memory/anticipation-engine.d.ts +19 -0
- package/dist/memory/anticipation-engine.d.ts.map +1 -0
- package/dist/memory/anticipation-engine.js +76 -0
- package/dist/memory/anticipation-engine.js.map +1 -0
- package/dist/memory/attention-ranker.d.ts +19 -0
- package/dist/memory/attention-ranker.d.ts.map +1 -0
- package/dist/memory/attention-ranker.js +97 -0
- package/dist/memory/attention-ranker.js.map +1 -0
- package/dist/memory/auto-learner.d.ts +20 -0
- package/dist/memory/auto-learner.d.ts.map +1 -0
- package/dist/memory/auto-learner.js +179 -0
- package/dist/memory/auto-learner.js.map +1 -0
- package/dist/memory/confidence-decay.d.ts +22 -0
- package/dist/memory/confidence-decay.d.ts.map +1 -0
- package/dist/memory/confidence-decay.js +54 -0
- package/dist/memory/confidence-decay.js.map +1 -0
- package/dist/memory/embedding-manager.d.ts +5 -0
- package/dist/memory/embedding-manager.d.ts.map +1 -0
- package/dist/memory/embedding-manager.js +118 -0
- package/dist/memory/embedding-manager.js.map +1 -0
- package/dist/memory/export-import.d.ts +49 -0
- package/dist/memory/export-import.d.ts.map +1 -0
- package/dist/memory/export-import.js +131 -0
- package/dist/memory/export-import.js.map +1 -0
- package/dist/memory/git-memory.d.ts +15 -0
- package/dist/memory/git-memory.d.ts.map +1 -0
- package/dist/memory/git-memory.js +178 -0
- package/dist/memory/git-memory.js.map +1 -0
- package/dist/memory/learning-rate.d.ts +24 -0
- package/dist/memory/learning-rate.d.ts.map +1 -0
- package/dist/memory/learning-rate.js +95 -0
- package/dist/memory/learning-rate.js.map +1 -0
- package/dist/memory/llm-enhancer.d.ts +54 -0
- package/dist/memory/llm-enhancer.d.ts.map +1 -0
- package/dist/memory/llm-enhancer.js +270 -0
- package/dist/memory/llm-enhancer.js.map +1 -0
- package/dist/memory/memory-cache.d.ts +5 -0
- package/dist/memory/memory-cache.d.ts.map +1 -0
- package/dist/memory/memory-cache.js +37 -0
- package/dist/memory/memory-cache.js.map +1 -0
- package/dist/memory/memory-consolidator.d.ts +14 -0
- package/dist/memory/memory-consolidator.d.ts.map +1 -0
- package/dist/memory/memory-consolidator.js +156 -0
- package/dist/memory/memory-consolidator.js.map +1 -0
- package/dist/memory/memory-decay.d.ts +10 -0
- package/dist/memory/memory-decay.d.ts.map +1 -0
- package/dist/memory/memory-decay.js +79 -0
- package/dist/memory/memory-decay.js.map +1 -0
- package/dist/memory/memory-quality.d.ts +37 -0
- package/dist/memory/memory-quality.d.ts.map +1 -0
- package/dist/memory/memory-quality.js +203 -0
- package/dist/memory/memory-quality.js.map +1 -0
- package/dist/memory/memory-ranker.d.ts +14 -0
- package/dist/memory/memory-ranker.d.ts.map +1 -0
- package/dist/memory/memory-ranker.js +68 -0
- package/dist/memory/memory-ranker.js.map +1 -0
- package/dist/memory/meta-memory.d.ts +11 -0
- package/dist/memory/meta-memory.d.ts.map +1 -0
- package/dist/memory/meta-memory.js +141 -0
- package/dist/memory/meta-memory.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +39 -0
- package/dist/memory/session-tracker.d.ts.map +1 -0
- package/dist/memory/session-tracker.js +127 -0
- package/dist/memory/session-tracker.js.map +1 -0
- package/dist/memory/temporal-engine.d.ts +25 -0
- package/dist/memory/temporal-engine.d.ts.map +1 -0
- package/dist/memory/temporal-engine.js +106 -0
- package/dist/memory/temporal-engine.js.map +1 -0
- package/dist/retrieval/hybrid-retriever.d.ts +23 -0
- package/dist/retrieval/hybrid-retriever.d.ts.map +1 -0
- package/dist/retrieval/hybrid-retriever.js +120 -0
- package/dist/retrieval/hybrid-retriever.js.map +1 -0
- package/dist/scanners/architecture-graph.d.ts +30 -0
- package/dist/scanners/architecture-graph.d.ts.map +1 -0
- package/dist/scanners/architecture-graph.js +315 -0
- package/dist/scanners/architecture-graph.js.map +1 -0
- package/dist/scanners/code-verifier.d.ts +70 -0
- package/dist/scanners/code-verifier.d.ts.map +1 -0
- package/dist/scanners/code-verifier.js +374 -0
- package/dist/scanners/code-verifier.js.map +1 -0
- package/dist/scanners/context-builder.d.ts +19 -0
- package/dist/scanners/context-builder.d.ts.map +1 -0
- package/dist/scanners/context-builder.js +102 -0
- package/dist/scanners/context-builder.js.map +1 -0
- package/dist/scanners/export-map.d.ts +22 -0
- package/dist/scanners/export-map.d.ts.map +1 -0
- package/dist/scanners/export-map.js +249 -0
- package/dist/scanners/export-map.js.map +1 -0
- package/dist/scanners/file-verifier.d.ts +22 -0
- package/dist/scanners/file-verifier.d.ts.map +1 -0
- package/dist/scanners/file-verifier.js +140 -0
- package/dist/scanners/file-verifier.js.map +1 -0
- package/dist/scanners/project-scanner.d.ts +31 -0
- package/dist/scanners/project-scanner.d.ts.map +1 -0
- package/dist/scanners/project-scanner.js +398 -0
- package/dist/scanners/project-scanner.js.map +1 -0
- package/dist/security/encryption.d.ts +15 -0
- package/dist/security/encryption.d.ts.map +1 -0
- package/dist/security/encryption.js +116 -0
- package/dist/security/encryption.js.map +1 -0
- package/dist/security/feature-gate.d.ts +30 -0
- package/dist/security/feature-gate.d.ts.map +1 -0
- package/dist/security/feature-gate.js +91 -0
- package/dist/security/feature-gate.js.map +1 -0
- package/dist/security/license.d.ts +24 -0
- package/dist/security/license.d.ts.map +1 -0
- package/dist/security/license.js +168 -0
- package/dist/security/license.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +20 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +60 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/server/dashboard.d.ts +3 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +258 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/mcp-handler.d.ts +12 -0
- package/dist/server/mcp-handler.d.ts.map +1 -0
- package/dist/server/mcp-handler.js +1392 -0
- package/dist/server/mcp-handler.js.map +1 -0
- package/dist/strategies/embedders/local-minilm.d.ts +35 -0
- package/dist/strategies/embedders/local-minilm.d.ts.map +1 -0
- package/dist/strategies/embedders/local-minilm.js +176 -0
- package/dist/strategies/embedders/local-minilm.js.map +1 -0
- package/dist/types.d.ts +207 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cleanupMemories = cleanupMemories;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const config_1 = require("../config/config");
|
|
6
|
+
const memory_cache_1 = require("./memory-cache");
|
|
7
|
+
function cleanupMemories(memoryStore) {
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
10
|
+
try {
|
|
11
|
+
let cleaned = 0;
|
|
12
|
+
// 1. Deactivate INSIGHT memories > 14 days with 0 access
|
|
13
|
+
const insights = memoryStore.getByType(types_1.MemoryType.INSIGHT, 5000);
|
|
14
|
+
for (const m of insights) {
|
|
15
|
+
if (m.accessCount === 0 && now - m.createdAt > config_1.CONFIG.INSIGHT_MAX_AGE_DAYS * DAY) {
|
|
16
|
+
memoryStore.deactivate(m.id);
|
|
17
|
+
cleaned++;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// 2. Deactivate any memory > 30 days with 0 access
|
|
21
|
+
const all = memoryStore.getActive(5000);
|
|
22
|
+
for (const m of all) {
|
|
23
|
+
if (m.accessCount === 0 && now - m.createdAt > config_1.CONFIG.UNUSED_MAX_AGE_DAYS * DAY) {
|
|
24
|
+
memoryStore.deactivate(m.id);
|
|
25
|
+
cleaned++;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// 3. Cap at MEMORY_CAP active memories
|
|
29
|
+
const active = memoryStore.getActive(5000);
|
|
30
|
+
if (active.length > config_1.CONFIG.MEMORY_CAP) {
|
|
31
|
+
const sorted = active.sort((a, b) => a.importance - b.importance);
|
|
32
|
+
const toRemove = sorted.slice(0, active.length - config_1.CONFIG.MEMORY_CAP);
|
|
33
|
+
for (const m of toRemove) {
|
|
34
|
+
memoryStore.deactivate(m.id);
|
|
35
|
+
cleaned++;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// 4. NEW: Duplicate detection — find memories with identical intents
|
|
39
|
+
const activeAfterClean = memoryStore.getActive(5000);
|
|
40
|
+
const intentMap = new Map();
|
|
41
|
+
for (const m of activeAfterClean) {
|
|
42
|
+
const key = m.intent.toLowerCase().trim();
|
|
43
|
+
const existing = intentMap.get(key);
|
|
44
|
+
if (existing) {
|
|
45
|
+
existing.push(m);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
intentMap.set(key, [m]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Merge duplicates — keep highest importance, boost it
|
|
52
|
+
for (const [, dupes] of intentMap) {
|
|
53
|
+
if (dupes.length <= 1)
|
|
54
|
+
continue;
|
|
55
|
+
// Sort by importance desc, keep the first
|
|
56
|
+
dupes.sort((a, b) => b.importance - a.importance);
|
|
57
|
+
const keeper = dupes[0];
|
|
58
|
+
// Strengthen the keeper (repeated = more important)
|
|
59
|
+
const strengthBoost = Math.min(dupes.length * 0.05, 0.3);
|
|
60
|
+
memoryStore.update(keeper.id, {
|
|
61
|
+
importance: Math.min(keeper.importance + strengthBoost, 1.0),
|
|
62
|
+
accessCount: keeper.accessCount + dupes.length - 1,
|
|
63
|
+
});
|
|
64
|
+
// Deactivate the rest
|
|
65
|
+
for (let i = 1; i < dupes.length; i++) {
|
|
66
|
+
memoryStore.deactivate(dupes[i].id, keeper.id);
|
|
67
|
+
cleaned++;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (cleaned > 0) {
|
|
71
|
+
console.log(` 🧹 Decay: cleaned ${cleaned} stale/duplicate memories`);
|
|
72
|
+
(0, memory_cache_1.invalidateCache)();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
console.error(' [ERROR] Cleanup error:', err.message);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=memory-decay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-decay.js","sourceRoot":"","sources":["../../src/memory/memory-decay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Quality — Filters, contradiction detection, and quality gates.
|
|
3
|
+
*
|
|
4
|
+
* Prevents junk memories from polluting the database.
|
|
5
|
+
* Detects contradictions between memories.
|
|
6
|
+
*/
|
|
7
|
+
import { MemoryStore } from '../db/memory-store';
|
|
8
|
+
import { MemoryType } from '../types';
|
|
9
|
+
/**
|
|
10
|
+
* Check if a memory is worth storing.
|
|
11
|
+
* Returns null if good, or a rejection reason if bad.
|
|
12
|
+
*/
|
|
13
|
+
export declare function qualityCheck(intent: string, type: string): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a new memory contradicts existing ones.
|
|
16
|
+
* Returns the contradicting memory if found.
|
|
17
|
+
*/
|
|
18
|
+
export declare function findContradiction(memoryStore: MemoryStore, newIntent: string, newType: MemoryType): {
|
|
19
|
+
contradicts: string;
|
|
20
|
+
existingId: string;
|
|
21
|
+
existingIntent: string;
|
|
22
|
+
} | null;
|
|
23
|
+
/**
|
|
24
|
+
* Store a memory with quality + contradiction checks.
|
|
25
|
+
* Returns the stored memory or null if rejected.
|
|
26
|
+
*/
|
|
27
|
+
export declare function storeWithQuality(memoryStore: MemoryStore, params: {
|
|
28
|
+
type: MemoryType;
|
|
29
|
+
intent: string;
|
|
30
|
+
action?: string;
|
|
31
|
+
reason?: string;
|
|
32
|
+
importance: number;
|
|
33
|
+
confidence: number;
|
|
34
|
+
tags: string[];
|
|
35
|
+
relatedFiles?: string[];
|
|
36
|
+
}): any | null;
|
|
37
|
+
//# sourceMappingURL=memory-quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-quality.d.ts","sourceRoot":"","sources":["../../src/memory/memory-quality.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAetC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8ExE;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,GACpB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4E5E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC5B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE;IACJ,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,GACF,GAAG,GAAG,IAAI,CAqCZ"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.qualityCheck = qualityCheck;
|
|
4
|
+
exports.findContradiction = findContradiction;
|
|
5
|
+
exports.storeWithQuality = storeWithQuality;
|
|
6
|
+
const types_1 = require("../types");
|
|
7
|
+
// --- Quality Gate ---
|
|
8
|
+
const TOO_GENERIC = new Set([
|
|
9
|
+
'use best practices',
|
|
10
|
+
'follow conventions',
|
|
11
|
+
'write clean code',
|
|
12
|
+
'be careful',
|
|
13
|
+
'test your code',
|
|
14
|
+
'read the docs',
|
|
15
|
+
'check the documentation',
|
|
16
|
+
'handle errors',
|
|
17
|
+
'add error handling',
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* Check if a memory is worth storing.
|
|
21
|
+
* Returns null if good, or a rejection reason if bad.
|
|
22
|
+
*/
|
|
23
|
+
function qualityCheck(intent, type) {
|
|
24
|
+
// Too short
|
|
25
|
+
if (!intent || intent.trim().length < 15) {
|
|
26
|
+
return 'Too short (< 15 chars)';
|
|
27
|
+
}
|
|
28
|
+
// Too long (probably pasted a whole paragraph)
|
|
29
|
+
if (intent.length > 500) {
|
|
30
|
+
return 'Too long (> 500 chars)';
|
|
31
|
+
}
|
|
32
|
+
// Too generic
|
|
33
|
+
const normalized = intent.toLowerCase().trim();
|
|
34
|
+
if (TOO_GENERIC.has(normalized)) {
|
|
35
|
+
return 'Too generic';
|
|
36
|
+
}
|
|
37
|
+
// All caps (yelling / noise)
|
|
38
|
+
if (intent === intent.toUpperCase() && intent.length > 20) {
|
|
39
|
+
return 'All caps noise';
|
|
40
|
+
}
|
|
41
|
+
// Repeated characters (spam)
|
|
42
|
+
if (/(.)\1{5,}/.test(intent)) {
|
|
43
|
+
return 'Repeated characters';
|
|
44
|
+
}
|
|
45
|
+
// Only URLs or paths
|
|
46
|
+
if (/^https?:\/\/\S+$/.test(intent.trim())) {
|
|
47
|
+
return 'Just a URL';
|
|
48
|
+
}
|
|
49
|
+
// Raw JSON blobs (artifact metadata, config objects, etc.)
|
|
50
|
+
if (normalized.startsWith('{') || normalized.startsWith('[')) {
|
|
51
|
+
return 'Raw JSON blob';
|
|
52
|
+
}
|
|
53
|
+
// Mostly JSON-like content (has lots of quotes and colons)
|
|
54
|
+
const jsonIndicators = (intent.match(/[{}[\]:]/g) || []).length;
|
|
55
|
+
if (jsonIndicators > 6 && jsonIndicators / intent.length > 0.05) {
|
|
56
|
+
return 'JSON-like content';
|
|
57
|
+
}
|
|
58
|
+
// AI response artifacts ("AI response: { artifactType...}")
|
|
59
|
+
if (normalized.startsWith('ai response:') || normalized.startsWith('ai correction:')) {
|
|
60
|
+
return 'AI response artifact';
|
|
61
|
+
}
|
|
62
|
+
// Hallucination guard noise ("Hallucination detected: Referenced file not found:")
|
|
63
|
+
if (normalized.startsWith('hallucination')) {
|
|
64
|
+
return 'Hallucination guard noise';
|
|
65
|
+
}
|
|
66
|
+
// Document dumps (markdown headers — these are full documents, not memories)
|
|
67
|
+
if (normalized.startsWith('# ') && intent.length > 100) {
|
|
68
|
+
return 'Markdown document dump';
|
|
69
|
+
}
|
|
70
|
+
// Prefixed noise patterns from extractors
|
|
71
|
+
const noisePrefixes = ['bug analysis:', 'self-test:', 'test memory', 'roundtrip-'];
|
|
72
|
+
for (const prefix of noisePrefixes) {
|
|
73
|
+
if (normalized.startsWith(prefix)) {
|
|
74
|
+
return `Noise prefix: ${prefix}`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Multi-line content (real memories are single ideas, not paragraphs)
|
|
78
|
+
const lineCount = intent.split('\n').filter(l => l.trim().length > 0).length;
|
|
79
|
+
if (lineCount > 3) {
|
|
80
|
+
return 'Multi-line document (not a single memory)';
|
|
81
|
+
}
|
|
82
|
+
// File path dumps (just listing file references)
|
|
83
|
+
if (normalized.startsWith('file ') && normalized.includes(' was reverted')) {
|
|
84
|
+
return 'File revert notice';
|
|
85
|
+
}
|
|
86
|
+
return null; // Passes quality gate
|
|
87
|
+
}
|
|
88
|
+
// --- Contradiction Detection ---
|
|
89
|
+
/**
|
|
90
|
+
* Check if a new memory contradicts existing ones.
|
|
91
|
+
* Returns the contradicting memory if found.
|
|
92
|
+
*/
|
|
93
|
+
function findContradiction(memoryStore, newIntent, newType) {
|
|
94
|
+
// Only check decisions, corrections, conventions against each other
|
|
95
|
+
const typesToCheck = [types_1.MemoryType.DECISION, types_1.MemoryType.CORRECTION, types_1.MemoryType.CONVENTION];
|
|
96
|
+
if (!typesToCheck.includes(newType))
|
|
97
|
+
return null;
|
|
98
|
+
const newLower = newIntent.toLowerCase();
|
|
99
|
+
// Strategy 1: Direct word-level contradiction
|
|
100
|
+
// "use X" vs "don't use X", "always Y" vs "never Y"
|
|
101
|
+
const useMatch = newLower.match(/\b(?:use|choose|pick|go with|switch to)\s+(\w+(?:\s+\w+)?)/);
|
|
102
|
+
const dontUseMatch = newLower.match(/\b(?:don'?t|never|avoid|stop)\s+(?:use|using)\s+(\w+(?:\s+\w+)?)/);
|
|
103
|
+
if (useMatch || dontUseMatch) {
|
|
104
|
+
const keyword = (useMatch?.[1] || dontUseMatch?.[1] || '').toLowerCase();
|
|
105
|
+
if (keyword.length < 3)
|
|
106
|
+
return null;
|
|
107
|
+
// Search existing memories for the opposite
|
|
108
|
+
for (const type of typesToCheck) {
|
|
109
|
+
const existing = memoryStore.getByType(type, 100);
|
|
110
|
+
for (const m of existing) {
|
|
111
|
+
const existLower = m.intent.toLowerCase();
|
|
112
|
+
if (useMatch) {
|
|
113
|
+
// New says "use X", check if existing says "don't use X"
|
|
114
|
+
if (existLower.includes(keyword) &&
|
|
115
|
+
/\b(?:don'?t|never|avoid|stop)\s+(?:use|using)/i.test(existLower)) {
|
|
116
|
+
return {
|
|
117
|
+
contradicts: `New says "use ${keyword}" but existing says "${m.intent}"`,
|
|
118
|
+
existingId: m.id,
|
|
119
|
+
existingIntent: m.intent,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (dontUseMatch) {
|
|
124
|
+
// New says "don't use X", check if existing says "use X"
|
|
125
|
+
if (existLower.includes(keyword) &&
|
|
126
|
+
/\b(?:use|choose|pick|go with)\b/i.test(existLower) &&
|
|
127
|
+
!/\b(?:don'?t|never|avoid)\b/i.test(existLower)) {
|
|
128
|
+
return {
|
|
129
|
+
contradicts: `New says "don't use ${keyword}" but existing says "${m.intent}"`,
|
|
130
|
+
existingId: m.id,
|
|
131
|
+
existingIntent: m.intent,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Strategy 2: Same topic, different conclusion
|
|
139
|
+
// If two DECISION memories mention the same noun but have different verbs
|
|
140
|
+
if (newType === types_1.MemoryType.DECISION) {
|
|
141
|
+
const decisions = memoryStore.getByType(types_1.MemoryType.DECISION, 200);
|
|
142
|
+
for (const existing of decisions) {
|
|
143
|
+
const existLower = existing.intent.toLowerCase();
|
|
144
|
+
// Extract key nouns (words > 4 chars, not stopwords)
|
|
145
|
+
const stopwords = new Set(['should', 'would', 'could', 'about', 'their', 'these', 'those', 'which', 'there', 'where', 'while']);
|
|
146
|
+
const newNouns = newLower.split(/\s+/).filter(w => w.length > 4 && !stopwords.has(w));
|
|
147
|
+
const existNouns = existLower.split(/\s+/).filter(w => w.length > 4 && !stopwords.has(w));
|
|
148
|
+
// Count overlapping nouns
|
|
149
|
+
const overlap = newNouns.filter(w => existNouns.includes(w));
|
|
150
|
+
if (overlap.length >= 2) {
|
|
151
|
+
// Same topic detected. Check if conclusion differs.
|
|
152
|
+
// Simple: if both are decisions about the same topic, flag it
|
|
153
|
+
return {
|
|
154
|
+
contradicts: `Possible contradiction: both discuss "${overlap.join(', ')}"`,
|
|
155
|
+
existingId: existing.id,
|
|
156
|
+
existingIntent: existing.intent,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Store a memory with quality + contradiction checks.
|
|
165
|
+
* Returns the stored memory or null if rejected.
|
|
166
|
+
*/
|
|
167
|
+
function storeWithQuality(memoryStore, params) {
|
|
168
|
+
// Quality gate
|
|
169
|
+
const rejection = qualityCheck(params.intent, params.type);
|
|
170
|
+
if (rejection) {
|
|
171
|
+
console.log(` [REJECT] Memory rejected: ${rejection} -- "${params.intent.slice(0, 60)}"`);
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
// Contradiction check
|
|
175
|
+
const contradiction = findContradiction(memoryStore, params.intent, params.type);
|
|
176
|
+
if (contradiction) {
|
|
177
|
+
console.log(` [WARN] Contradiction: ${contradiction.contradicts}`);
|
|
178
|
+
console.log(` [WARN] Existing: "${contradiction.existingIntent.slice(0, 80)}"`);
|
|
179
|
+
// Store the NEW one but mark the OLD as less important
|
|
180
|
+
memoryStore.update(contradiction.existingId, {
|
|
181
|
+
importance: 0.3, // Demote old contradicting memory
|
|
182
|
+
tags: ['contradicted'],
|
|
183
|
+
});
|
|
184
|
+
console.log(` [WARN] Demoted old memory, storing new one`);
|
|
185
|
+
}
|
|
186
|
+
// Store
|
|
187
|
+
return memoryStore.add({
|
|
188
|
+
type: params.type,
|
|
189
|
+
intent: params.intent.slice(0, 300),
|
|
190
|
+
action: params.action || `Stored: ${params.intent.slice(0, 200)}`,
|
|
191
|
+
reason: params.reason || undefined,
|
|
192
|
+
relatedFiles: params.relatedFiles || [],
|
|
193
|
+
tags: params.tags,
|
|
194
|
+
confidence: params.confidence,
|
|
195
|
+
importance: params.importance,
|
|
196
|
+
timestamp: Date.now(),
|
|
197
|
+
isActive: true,
|
|
198
|
+
accessCount: 0,
|
|
199
|
+
createdAt: Date.now(),
|
|
200
|
+
id: '',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=memory-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-quality.js","sourceRoot":"","sources":["../../src/memory/memory-quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ScoredMemory } from '../types';
|
|
2
|
+
export interface RankedResult {
|
|
3
|
+
memory: any;
|
|
4
|
+
score: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Merge FTS + Vector results, deduplicate, boost by type + recency + access.
|
|
8
|
+
*/
|
|
9
|
+
export declare function rankResults(ftsResults: ScoredMemory[], vectorResults: RankedResult[], maxResults: number, currentFile?: string): RankedResult[];
|
|
10
|
+
/**
|
|
11
|
+
* Format ranked results into a readable text block for the AI.
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatResults(ranked: RankedResult[], queryText: string): string;
|
|
14
|
+
//# sourceMappingURL=memory-ranker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-ranker.d.ts","sourceRoot":"","sources":["../../src/memory/memory-ranker.ts"],"names":[],"mappings":"AAQA,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,CAgDhB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ/E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rankResults = rankResults;
|
|
4
|
+
exports.formatResults = formatResults;
|
|
5
|
+
/**
|
|
6
|
+
* Memory Ranker — Scoring, merging, and ranking search results.
|
|
7
|
+
* Extracted from standalone.ts L713-885.
|
|
8
|
+
*
|
|
9
|
+
* NEW: Recency bias — newer memories score higher.
|
|
10
|
+
* NEW: File-aware ranking — if query mentions a file, related memories boost.
|
|
11
|
+
*/
|
|
12
|
+
const config_1 = require("../config/config");
|
|
13
|
+
/**
|
|
14
|
+
* Merge FTS + Vector results, deduplicate, boost by type + recency + access.
|
|
15
|
+
*/
|
|
16
|
+
function rankResults(ftsResults, vectorResults, maxResults, currentFile) {
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
const merged = [];
|
|
19
|
+
const now = Date.now();
|
|
20
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
21
|
+
for (const r of ftsResults) {
|
|
22
|
+
if (seen.has(r.memory.id))
|
|
23
|
+
continue;
|
|
24
|
+
seen.add(r.memory.id);
|
|
25
|
+
const boost = config_1.CONFIG.TYPE_BOOST[r.memory.type] || 1.0;
|
|
26
|
+
const accessBoost = 1 + (r.memory.accessCount || 0) * 0.1;
|
|
27
|
+
// NEW: Recency bias — memories from last 24h get 1.5x, last 7d get 1.2x
|
|
28
|
+
const ageMs = now - (r.memory.createdAt || r.memory.timestamp || 0);
|
|
29
|
+
const recencyBoost = ageMs < DAY ? 1.5 : ageMs < 7 * DAY ? 1.2 : 1.0;
|
|
30
|
+
// NEW: File-aware boost — if memory is related to current file, boost 1.5x
|
|
31
|
+
const fileBoost = currentFile && r.memory.relatedFiles?.some((f) => f.includes(currentFile) || currentFile.includes(f)) ? 1.5 : 1.0;
|
|
32
|
+
merged.push({
|
|
33
|
+
memory: r.memory,
|
|
34
|
+
score: r.score * boost * accessBoost * recencyBoost * fileBoost,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
for (const r of vectorResults) {
|
|
38
|
+
if (seen.has(r.memory.id))
|
|
39
|
+
continue;
|
|
40
|
+
seen.add(r.memory.id);
|
|
41
|
+
const boost = config_1.CONFIG.TYPE_BOOST[r.memory.type] || 1.0;
|
|
42
|
+
const accessBoost = 1 + (r.memory.accessCount || 0) * 0.1;
|
|
43
|
+
const ageMs = now - (r.memory.createdAt || r.memory.timestamp || 0);
|
|
44
|
+
const recencyBoost = ageMs < DAY ? 1.5 : ageMs < 7 * DAY ? 1.2 : 1.0;
|
|
45
|
+
const fileBoost = currentFile && r.memory.relatedFiles?.some((f) => f.includes(currentFile) || currentFile.includes(f)) ? 1.5 : 1.0;
|
|
46
|
+
merged.push({
|
|
47
|
+
memory: r.memory,
|
|
48
|
+
score: r.score * boost * accessBoost * recencyBoost * fileBoost,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
merged.sort((a, b) => b.score - a.score);
|
|
52
|
+
return merged.slice(0, maxResults);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Format ranked results into a readable text block for the AI.
|
|
56
|
+
*/
|
|
57
|
+
function formatResults(ranked, queryText) {
|
|
58
|
+
const lines = [];
|
|
59
|
+
for (const r of ranked) {
|
|
60
|
+
lines.push(`[${r.memory.type}] ${r.memory.intent}`);
|
|
61
|
+
if (r.memory.action)
|
|
62
|
+
lines.push(` → ${r.memory.action}`);
|
|
63
|
+
if (r.memory.reason)
|
|
64
|
+
lines.push(` Why: ${r.memory.reason}`);
|
|
65
|
+
}
|
|
66
|
+
return lines.join('\n') || `No memories matching "${queryText}"`;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=memory-ranker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-ranker.js","sourceRoot":"","sources":["../../src/memory/memory-ranker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MemoryStore } from '../db/memory-store';
|
|
2
|
+
export interface KnowledgeGap {
|
|
3
|
+
path: string;
|
|
4
|
+
type: 'file' | 'directory';
|
|
5
|
+
fileCount?: number;
|
|
6
|
+
}
|
|
7
|
+
/** Detect knowledge gaps in the project */
|
|
8
|
+
export declare function detectKnowledgeGaps(memoryStore: MemoryStore, workspaceRoot: string): KnowledgeGap[];
|
|
9
|
+
/** Format knowledge gaps for injection */
|
|
10
|
+
export declare function formatKnowledgeGaps(gaps: KnowledgeGap[]): string;
|
|
11
|
+
//# sourceMappingURL=meta-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-memory.d.ts","sourceRoot":"","sources":["../../src/memory/meta-memory.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,2CAA2C;AAC3C,wBAAgB,mBAAmB,CAC/B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,MAAM,GACtB,YAAY,EAAE,CA8ChB;AAED,0CAA0C;AAC1C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,CAahE"}
|
|
@@ -0,0 +1,141 @@
|
|
|
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.detectKnowledgeGaps = detectKnowledgeGaps;
|
|
37
|
+
exports.formatKnowledgeGaps = formatKnowledgeGaps;
|
|
38
|
+
/**
|
|
39
|
+
* Meta-Memory — Knows what the brain DOESN'T know.
|
|
40
|
+
*
|
|
41
|
+
* Scans the project's source files and compares against stored memories.
|
|
42
|
+
* Files/directories with zero memories = knowledge gaps.
|
|
43
|
+
*
|
|
44
|
+
* Like how a student knows "I haven't studied chapter 5 yet" —
|
|
45
|
+
* self-awareness about what's missing is as important as what's known.
|
|
46
|
+
*/
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
/** Detect knowledge gaps in the project */
|
|
50
|
+
function detectKnowledgeGaps(memoryStore, workspaceRoot) {
|
|
51
|
+
const gaps = [];
|
|
52
|
+
// Get all memories' related files
|
|
53
|
+
const knownFiles = new Set();
|
|
54
|
+
const active = memoryStore.getActive(500);
|
|
55
|
+
for (const m of active) {
|
|
56
|
+
if (m.relatedFiles) {
|
|
57
|
+
for (const f of m.relatedFiles) {
|
|
58
|
+
knownFiles.add(normalize(f));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Also check intent for file references
|
|
62
|
+
const fileRefs = m.intent.match(/[\w\-\/]+\.(ts|js|tsx|jsx|py|css|json|sql)/g);
|
|
63
|
+
if (fileRefs) {
|
|
64
|
+
for (const ref of fileRefs) {
|
|
65
|
+
knownFiles.add(normalize(ref));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Scan project source directories
|
|
70
|
+
const srcDirs = ['src', 'lib', 'app', 'pages', 'components', 'api', 'server'];
|
|
71
|
+
for (const dir of srcDirs) {
|
|
72
|
+
const dirPath = path.join(workspaceRoot, dir);
|
|
73
|
+
if (!fs.existsSync(dirPath))
|
|
74
|
+
continue;
|
|
75
|
+
const files = getSourceFiles(dirPath, workspaceRoot);
|
|
76
|
+
const unknownFiles = files.filter(f => !knownFiles.has(normalize(f)));
|
|
77
|
+
if (unknownFiles.length > 0 && unknownFiles.length === files.length) {
|
|
78
|
+
// Entire directory unknown
|
|
79
|
+
gaps.push({
|
|
80
|
+
path: dir,
|
|
81
|
+
type: 'directory',
|
|
82
|
+
fileCount: unknownFiles.length,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
else if (unknownFiles.length > 2) {
|
|
86
|
+
// Some files unknown
|
|
87
|
+
for (const f of unknownFiles.slice(0, 5)) {
|
|
88
|
+
gaps.push({ path: f, type: 'file' });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return gaps.slice(0, 10); // Limit to top 10 gaps
|
|
93
|
+
}
|
|
94
|
+
/** Format knowledge gaps for injection */
|
|
95
|
+
function formatKnowledgeGaps(gaps) {
|
|
96
|
+
if (gaps.length === 0)
|
|
97
|
+
return '';
|
|
98
|
+
const lines = ['## 🧩 Knowledge Gaps (no memories about these)'];
|
|
99
|
+
for (const gap of gaps) {
|
|
100
|
+
if (gap.type === 'directory') {
|
|
101
|
+
lines.push(`- 📁 **${gap.path}/** (${gap.fileCount} files, no context)`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
lines.push(`- 📄 ${gap.path}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
lines.push('\n> *Consider running `scan_project` or explaining these areas to build context.*');
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
110
|
+
/** Get source files from a directory */
|
|
111
|
+
function getSourceFiles(dir, root, depth = 0) {
|
|
112
|
+
if (depth > 3)
|
|
113
|
+
return [];
|
|
114
|
+
const ignore = new Set(['node_modules', '.git', 'dist', 'coverage', '__tests__', '__mocks__', '.next']);
|
|
115
|
+
const exts = new Set(['.ts', '.js', '.tsx', '.jsx', '.py', '.css', '.sql']);
|
|
116
|
+
const files = [];
|
|
117
|
+
try {
|
|
118
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
if (ignore.has(entry.name) || entry.name.startsWith('.'))
|
|
121
|
+
continue;
|
|
122
|
+
const full = path.join(dir, entry.name);
|
|
123
|
+
if (entry.isDirectory()) {
|
|
124
|
+
files.push(...getSourceFiles(full, root, depth + 1));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const ext = path.extname(entry.name);
|
|
128
|
+
if (exts.has(ext) && !entry.name.endsWith('.d.ts')) {
|
|
129
|
+
files.push(path.relative(root, full).replace(/\\/g, '/'));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch { }
|
|
135
|
+
return files;
|
|
136
|
+
}
|
|
137
|
+
/** Normalize file paths for comparison */
|
|
138
|
+
function normalize(filePath) {
|
|
139
|
+
return filePath.toLowerCase().replace(/\\/g, '/').replace(/^\.\//, '');
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=meta-memory.js.map
|
|
@@ -0,0 +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,kCAAkC;IAClC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;gBAC7B,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC;QACL,CAAC;QACD,wCAAwC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC/E,IAAI,QAAQ,EAAE,CAAC;YACX,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBACzB,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,CAAC;QACL,CAAC;IACL,CAAC;IAED,kCAAkC;IAClC,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9E,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QAEtC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YAClE,2BAA2B;YAC3B,IAAI,CAAC,IAAI,CAAC;gBACN,IAAI,EAAE,GAAG;gBACT,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,YAAY,CAAC,MAAM;aACjC,CAAC,CAAC;QACP,CAAC;aAAM,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,qBAAqB;YACrB,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAuB;AACrD,CAAC;AAED,0CAA0C;AAC1C,SAAgB,mBAAmB,CAAC,IAAoB;IACpD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,KAAK,GAAa,CAAC,gDAAgD,CAAC,CAAC;IAC3E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,SAAS,qBAAqB,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAChG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,wCAAwC;AACxC,SAAS,cAAc,CAAC,GAAW,EAAE,IAAY,EAAE,QAAgB,CAAC;IAChE,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACxG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACnE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAExC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,CAAC;IAEX,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,0CAA0C;AAC1C,SAAS,SAAS,CAAC,QAAgB;IAC/B,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Tracker — Automatically builds session summaries.
|
|
3
|
+
*
|
|
4
|
+
* Tracks what was discussed, what files were changed, what decisions were made,
|
|
5
|
+
* and what's unfinished. Stores a compressed session summary when the session ends.
|
|
6
|
+
*
|
|
7
|
+
* This is the key missing piece that prevents "where did we leave off?" re-explanation.
|
|
8
|
+
*/
|
|
9
|
+
import { MemoryStore } from '../db/memory-store';
|
|
10
|
+
export interface SessionData {
|
|
11
|
+
startTime: number;
|
|
12
|
+
topics: Set<string>;
|
|
13
|
+
decisions: string[];
|
|
14
|
+
filesChanged: Set<string>;
|
|
15
|
+
failedAttempts: string[];
|
|
16
|
+
businessRules: string[];
|
|
17
|
+
gotchas: string[];
|
|
18
|
+
currentTasks: string[];
|
|
19
|
+
autoLearnCount: number;
|
|
20
|
+
lastUpdateTime: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function startSession(): void;
|
|
23
|
+
export declare function getSession(): SessionData | null;
|
|
24
|
+
/** Feed data into the running session — called by auto_learn and other tools */
|
|
25
|
+
export declare function feedSession(data: {
|
|
26
|
+
topic?: string;
|
|
27
|
+
decision?: string;
|
|
28
|
+
fileChanged?: string;
|
|
29
|
+
failedAttempt?: string;
|
|
30
|
+
businessRule?: string;
|
|
31
|
+
gotcha?: string;
|
|
32
|
+
currentTask?: string;
|
|
33
|
+
type?: string;
|
|
34
|
+
}): void;
|
|
35
|
+
/** Build and store the session summary */
|
|
36
|
+
export declare function endSession(memoryStore: MemoryStore): string | null;
|
|
37
|
+
/** Get the last N session summaries for injection at conversation start */
|
|
38
|
+
export declare function getRecentSessions(memoryStore: MemoryStore, count?: number): string[];
|
|
39
|
+
//# sourceMappingURL=session-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-tracker.d.ts","sourceRoot":"","sources":["../../src/memory/session-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAMD,wBAAgB,YAAY,IAAI,IAAI,CAanC;AAED,wBAAgB,UAAU,IAAI,WAAW,GAAG,IAAI,CAE/C;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAaP;AAED,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CA+DlE;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,GAAE,MAAU,GAAG,MAAM,EAAE,CA2BvF"}
|