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.
Files changed (176) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +202 -0
  4. package/dist/cli/setup.d.ts +12 -0
  5. package/dist/cli/setup.d.ts.map +1 -0
  6. package/dist/cli/setup.js +293 -0
  7. package/dist/cli/setup.js.map +1 -0
  8. package/dist/config/config.d.ts +13 -0
  9. package/dist/config/config.d.ts.map +1 -0
  10. package/dist/config/config.js +33 -0
  11. package/dist/config/config.js.map +1 -0
  12. package/dist/core/event-bus.d.ts +19 -0
  13. package/dist/core/event-bus.d.ts.map +1 -0
  14. package/dist/core/event-bus.js +51 -0
  15. package/dist/core/event-bus.js.map +1 -0
  16. package/dist/db/database.d.ts +19 -0
  17. package/dist/db/database.d.ts.map +1 -0
  18. package/dist/db/database.js +254 -0
  19. package/dist/db/database.js.map +1 -0
  20. package/dist/db/event-log.d.ts +28 -0
  21. package/dist/db/event-log.d.ts.map +1 -0
  22. package/dist/db/event-log.js +87 -0
  23. package/dist/db/event-log.js.map +1 -0
  24. package/dist/db/memory-store.d.ts +65 -0
  25. package/dist/db/memory-store.d.ts.map +1 -0
  26. package/dist/db/memory-store.js +370 -0
  27. package/dist/db/memory-store.js.map +1 -0
  28. package/dist/embedding-worker.d.ts +3 -0
  29. package/dist/embedding-worker.d.ts.map +1 -0
  30. package/dist/embedding-worker.js +94 -0
  31. package/dist/embedding-worker.js.map +1 -0
  32. package/dist/hooks/cortex-run.d.ts +15 -0
  33. package/dist/hooks/cortex-run.d.ts.map +1 -0
  34. package/dist/hooks/cortex-run.js +148 -0
  35. package/dist/hooks/cortex-run.js.map +1 -0
  36. package/dist/hooks/git-capture.d.ts +21 -0
  37. package/dist/hooks/git-capture.d.ts.map +1 -0
  38. package/dist/hooks/git-capture.js +178 -0
  39. package/dist/hooks/git-capture.js.map +1 -0
  40. package/dist/hooks/git-hooks.d.ts +12 -0
  41. package/dist/hooks/git-hooks.d.ts.map +1 -0
  42. package/dist/hooks/git-hooks.js +130 -0
  43. package/dist/hooks/git-hooks.js.map +1 -0
  44. package/dist/mcp-stdio.d.ts +10 -0
  45. package/dist/mcp-stdio.d.ts.map +1 -0
  46. package/dist/mcp-stdio.js +247 -0
  47. package/dist/mcp-stdio.js.map +1 -0
  48. package/dist/memory/anticipation-engine.d.ts +19 -0
  49. package/dist/memory/anticipation-engine.d.ts.map +1 -0
  50. package/dist/memory/anticipation-engine.js +76 -0
  51. package/dist/memory/anticipation-engine.js.map +1 -0
  52. package/dist/memory/attention-ranker.d.ts +19 -0
  53. package/dist/memory/attention-ranker.d.ts.map +1 -0
  54. package/dist/memory/attention-ranker.js +97 -0
  55. package/dist/memory/attention-ranker.js.map +1 -0
  56. package/dist/memory/auto-learner.d.ts +20 -0
  57. package/dist/memory/auto-learner.d.ts.map +1 -0
  58. package/dist/memory/auto-learner.js +179 -0
  59. package/dist/memory/auto-learner.js.map +1 -0
  60. package/dist/memory/confidence-decay.d.ts +22 -0
  61. package/dist/memory/confidence-decay.d.ts.map +1 -0
  62. package/dist/memory/confidence-decay.js +54 -0
  63. package/dist/memory/confidence-decay.js.map +1 -0
  64. package/dist/memory/embedding-manager.d.ts +5 -0
  65. package/dist/memory/embedding-manager.d.ts.map +1 -0
  66. package/dist/memory/embedding-manager.js +118 -0
  67. package/dist/memory/embedding-manager.js.map +1 -0
  68. package/dist/memory/export-import.d.ts +49 -0
  69. package/dist/memory/export-import.d.ts.map +1 -0
  70. package/dist/memory/export-import.js +131 -0
  71. package/dist/memory/export-import.js.map +1 -0
  72. package/dist/memory/git-memory.d.ts +15 -0
  73. package/dist/memory/git-memory.d.ts.map +1 -0
  74. package/dist/memory/git-memory.js +178 -0
  75. package/dist/memory/git-memory.js.map +1 -0
  76. package/dist/memory/learning-rate.d.ts +24 -0
  77. package/dist/memory/learning-rate.d.ts.map +1 -0
  78. package/dist/memory/learning-rate.js +95 -0
  79. package/dist/memory/learning-rate.js.map +1 -0
  80. package/dist/memory/llm-enhancer.d.ts +54 -0
  81. package/dist/memory/llm-enhancer.d.ts.map +1 -0
  82. package/dist/memory/llm-enhancer.js +270 -0
  83. package/dist/memory/llm-enhancer.js.map +1 -0
  84. package/dist/memory/memory-cache.d.ts +5 -0
  85. package/dist/memory/memory-cache.d.ts.map +1 -0
  86. package/dist/memory/memory-cache.js +37 -0
  87. package/dist/memory/memory-cache.js.map +1 -0
  88. package/dist/memory/memory-consolidator.d.ts +14 -0
  89. package/dist/memory/memory-consolidator.d.ts.map +1 -0
  90. package/dist/memory/memory-consolidator.js +156 -0
  91. package/dist/memory/memory-consolidator.js.map +1 -0
  92. package/dist/memory/memory-decay.d.ts +10 -0
  93. package/dist/memory/memory-decay.d.ts.map +1 -0
  94. package/dist/memory/memory-decay.js +79 -0
  95. package/dist/memory/memory-decay.js.map +1 -0
  96. package/dist/memory/memory-quality.d.ts +37 -0
  97. package/dist/memory/memory-quality.d.ts.map +1 -0
  98. package/dist/memory/memory-quality.js +203 -0
  99. package/dist/memory/memory-quality.js.map +1 -0
  100. package/dist/memory/memory-ranker.d.ts +14 -0
  101. package/dist/memory/memory-ranker.d.ts.map +1 -0
  102. package/dist/memory/memory-ranker.js +68 -0
  103. package/dist/memory/memory-ranker.js.map +1 -0
  104. package/dist/memory/meta-memory.d.ts +11 -0
  105. package/dist/memory/meta-memory.d.ts.map +1 -0
  106. package/dist/memory/meta-memory.js +141 -0
  107. package/dist/memory/meta-memory.js.map +1 -0
  108. package/dist/memory/session-tracker.d.ts +39 -0
  109. package/dist/memory/session-tracker.d.ts.map +1 -0
  110. package/dist/memory/session-tracker.js +127 -0
  111. package/dist/memory/session-tracker.js.map +1 -0
  112. package/dist/memory/temporal-engine.d.ts +25 -0
  113. package/dist/memory/temporal-engine.d.ts.map +1 -0
  114. package/dist/memory/temporal-engine.js +106 -0
  115. package/dist/memory/temporal-engine.js.map +1 -0
  116. package/dist/retrieval/hybrid-retriever.d.ts +23 -0
  117. package/dist/retrieval/hybrid-retriever.d.ts.map +1 -0
  118. package/dist/retrieval/hybrid-retriever.js +120 -0
  119. package/dist/retrieval/hybrid-retriever.js.map +1 -0
  120. package/dist/scanners/architecture-graph.d.ts +30 -0
  121. package/dist/scanners/architecture-graph.d.ts.map +1 -0
  122. package/dist/scanners/architecture-graph.js +315 -0
  123. package/dist/scanners/architecture-graph.js.map +1 -0
  124. package/dist/scanners/code-verifier.d.ts +70 -0
  125. package/dist/scanners/code-verifier.d.ts.map +1 -0
  126. package/dist/scanners/code-verifier.js +374 -0
  127. package/dist/scanners/code-verifier.js.map +1 -0
  128. package/dist/scanners/context-builder.d.ts +19 -0
  129. package/dist/scanners/context-builder.d.ts.map +1 -0
  130. package/dist/scanners/context-builder.js +102 -0
  131. package/dist/scanners/context-builder.js.map +1 -0
  132. package/dist/scanners/export-map.d.ts +22 -0
  133. package/dist/scanners/export-map.d.ts.map +1 -0
  134. package/dist/scanners/export-map.js +249 -0
  135. package/dist/scanners/export-map.js.map +1 -0
  136. package/dist/scanners/file-verifier.d.ts +22 -0
  137. package/dist/scanners/file-verifier.d.ts.map +1 -0
  138. package/dist/scanners/file-verifier.js +140 -0
  139. package/dist/scanners/file-verifier.js.map +1 -0
  140. package/dist/scanners/project-scanner.d.ts +31 -0
  141. package/dist/scanners/project-scanner.d.ts.map +1 -0
  142. package/dist/scanners/project-scanner.js +398 -0
  143. package/dist/scanners/project-scanner.js.map +1 -0
  144. package/dist/security/encryption.d.ts +15 -0
  145. package/dist/security/encryption.d.ts.map +1 -0
  146. package/dist/security/encryption.js +116 -0
  147. package/dist/security/encryption.js.map +1 -0
  148. package/dist/security/feature-gate.d.ts +30 -0
  149. package/dist/security/feature-gate.d.ts.map +1 -0
  150. package/dist/security/feature-gate.js +91 -0
  151. package/dist/security/feature-gate.js.map +1 -0
  152. package/dist/security/license.d.ts +24 -0
  153. package/dist/security/license.d.ts.map +1 -0
  154. package/dist/security/license.js +168 -0
  155. package/dist/security/license.js.map +1 -0
  156. package/dist/security/rate-limiter.d.ts +20 -0
  157. package/dist/security/rate-limiter.d.ts.map +1 -0
  158. package/dist/security/rate-limiter.js +60 -0
  159. package/dist/security/rate-limiter.js.map +1 -0
  160. package/dist/server/dashboard.d.ts +3 -0
  161. package/dist/server/dashboard.d.ts.map +1 -0
  162. package/dist/server/dashboard.js +258 -0
  163. package/dist/server/dashboard.js.map +1 -0
  164. package/dist/server/mcp-handler.d.ts +12 -0
  165. package/dist/server/mcp-handler.d.ts.map +1 -0
  166. package/dist/server/mcp-handler.js +1392 -0
  167. package/dist/server/mcp-handler.js.map +1 -0
  168. package/dist/strategies/embedders/local-minilm.d.ts +35 -0
  169. package/dist/strategies/embedders/local-minilm.d.ts.map +1 -0
  170. package/dist/strategies/embedders/local-minilm.js +176 -0
  171. package/dist/strategies/embedders/local-minilm.js.map +1 -0
  172. package/dist/types.d.ts +207 -0
  173. package/dist/types.d.ts.map +1 -0
  174. package/dist/types.js +83 -0
  175. package/dist/types.js.map +1 -0
  176. 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"}