cortex-mcp 2.8.0 → 3.0.0

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