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,51 @@
1
+ /**
2
+ * Access Pattern Tracker — Learns which memory types each user actually uses.
3
+ *
4
+ * Tracks recall/search patterns and builds a personal preference profile.
5
+ * The ranker uses this to boost memory types the user accesses most often.
6
+ *
7
+ * Example: If a user recalls CORRECTION memories 5x more than INSIGHT,
8
+ * future results boost CORRECTIONs so the brain feels personalized.
9
+ */
10
+ import { MemoryStore } from '../db/memory-store';
11
+ export interface AccessProfile {
12
+ typeCounts: Record<string, number>;
13
+ totalAccesses: number;
14
+ lastUpdated: number;
15
+ }
16
+ /**
17
+ * Record that the user accessed a memory of a given type.
18
+ * Called whenever recall_memory, force_recall, or pre_check returns results.
19
+ */
20
+ export declare function recordAccess(type: string): void;
21
+ /**
22
+ * Record accesses for a batch of recalled memories.
23
+ */
24
+ export declare function recordBatchAccess(memories: Array<{
25
+ type: string;
26
+ }>): void;
27
+ /**
28
+ * Get a personalized boost multiplier for a memory type.
29
+ * Types the user accesses frequently get boosted (up to 1.8x).
30
+ * Types never accessed stay at 1.0x (neutral).
31
+ *
32
+ * Uses frequency ratio: (type_count / total) normalized to 1.0-1.8 range.
33
+ */
34
+ export declare function getPersonalBoost(type: string): number;
35
+ /**
36
+ * Get the full access profile (for dashboard/stats).
37
+ */
38
+ export declare function getAccessProfile(): AccessProfile;
39
+ /**
40
+ * Try to load access profile from stored memories (persistence across restarts).
41
+ */
42
+ export declare function loadAccessProfile(memoryStore: MemoryStore): void;
43
+ /**
44
+ * Get top accessed types (for diagnostics).
45
+ */
46
+ export declare function getTopTypes(n?: number): Array<{
47
+ type: string;
48
+ count: number;
49
+ boost: number;
50
+ }>;
51
+ //# sourceMappingURL=access-pattern-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-pattern-tracker.d.ts","sourceRoot":"","sources":["../../src/memory/access-pattern-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACvB;AASD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAIzE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAkBhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAE,MAAU,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAShG"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.recordAccess = recordAccess;
4
+ exports.recordBatchAccess = recordBatchAccess;
5
+ exports.getPersonalBoost = getPersonalBoost;
6
+ exports.getAccessProfile = getAccessProfile;
7
+ exports.loadAccessProfile = loadAccessProfile;
8
+ exports.getTopTypes = getTopTypes;
9
+ // In-memory access profile (persisted via session tracker)
10
+ let accessProfile = {
11
+ typeCounts: {},
12
+ totalAccesses: 0,
13
+ lastUpdated: Date.now(),
14
+ };
15
+ /**
16
+ * Record that the user accessed a memory of a given type.
17
+ * Called whenever recall_memory, force_recall, or pre_check returns results.
18
+ */
19
+ function recordAccess(type) {
20
+ accessProfile.typeCounts[type] = (accessProfile.typeCounts[type] || 0) + 1;
21
+ accessProfile.totalAccesses++;
22
+ accessProfile.lastUpdated = Date.now();
23
+ }
24
+ /**
25
+ * Record accesses for a batch of recalled memories.
26
+ */
27
+ function recordBatchAccess(memories) {
28
+ for (const m of memories) {
29
+ recordAccess(m.type);
30
+ }
31
+ }
32
+ /**
33
+ * Get a personalized boost multiplier for a memory type.
34
+ * Types the user accesses frequently get boosted (up to 1.8x).
35
+ * Types never accessed stay at 1.0x (neutral).
36
+ *
37
+ * Uses frequency ratio: (type_count / total) normalized to 1.0-1.8 range.
38
+ */
39
+ function getPersonalBoost(type) {
40
+ if (accessProfile.totalAccesses < 10)
41
+ return 1.0; // Not enough data yet
42
+ const typeCount = accessProfile.typeCounts[type] || 0;
43
+ const frequency = typeCount / accessProfile.totalAccesses;
44
+ // Expected frequency if all types were equal (~20% with 5 types)
45
+ const expectedFreq = 0.2;
46
+ // Boost = 1.0 + (frequency - expected) * scale, clamped to [0.7, 1.8]
47
+ const boost = 1.0 + (frequency - expectedFreq) * 4.0;
48
+ return Math.max(0.7, Math.min(1.8, boost));
49
+ }
50
+ /**
51
+ * Get the full access profile (for dashboard/stats).
52
+ */
53
+ function getAccessProfile() {
54
+ return { ...accessProfile };
55
+ }
56
+ /**
57
+ * Try to load access profile from stored memories (persistence across restarts).
58
+ */
59
+ function loadAccessProfile(memoryStore) {
60
+ try {
61
+ const _profileMemories = memoryStore.getByType('INSIGHT', 100);
62
+ // Reconstruct from access_count of each type
63
+ const all = memoryStore.getActive(500);
64
+ const typeCounts = {};
65
+ let total = 0;
66
+ for (const m of all) {
67
+ const count = m.accessCount || 0;
68
+ if (count > 0) {
69
+ typeCounts[m.type] = (typeCounts[m.type] || 0) + count;
70
+ total += count;
71
+ }
72
+ }
73
+ if (total > 0) {
74
+ accessProfile = { typeCounts, totalAccesses: total, lastUpdated: Date.now() };
75
+ }
76
+ }
77
+ catch { /* fresh install, no data yet */ }
78
+ }
79
+ /**
80
+ * Get top accessed types (for diagnostics).
81
+ */
82
+ function getTopTypes(n = 5) {
83
+ return Object.entries(accessProfile.typeCounts)
84
+ .sort(([, a], [, b]) => b - a)
85
+ .slice(0, n)
86
+ .map(([type, count]) => ({
87
+ type,
88
+ count,
89
+ boost: getPersonalBoost(type),
90
+ }));
91
+ }
92
+ //# sourceMappingURL=access-pattern-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-pattern-tracker.js","sourceRoot":"","sources":["../../src/memory/access-pattern-tracker.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"anticipation-engine.d.ts","sourceRoot":"","sources":["../../src/memory/anticipation-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAc,YAAY,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAC/B,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,mBAAmB,EAAE,YAAY,EAAE,CAAC;CACvC;AAED,wBAAgB,UAAU,CACtB,WAAW,EAAE,WAAW,EACxB,WAAW,CAAC,EAAE,MAAM,GACrB,kBAAkB,CA0DpB;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAiBrE"}
1
+ {"version":3,"file":"anticipation-engine.d.ts","sourceRoot":"","sources":["../../src/memory/anticipation-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAc,YAAY,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAC/B,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,mBAAmB,EAAE,YAAY,EAAE,CAAC;CACvC;AAED,wBAAgB,UAAU,CACtB,WAAW,EAAE,WAAW,EACxB,WAAW,CAAC,EAAE,MAAM,GACrB,kBAAkB,CA6DpB;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAiBrE"}
@@ -21,9 +21,8 @@ function anticipate(memoryStore, currentFile) {
21
21
  // 2. Directory memories — same folder = likely related
22
22
  const dir = currentFile.replace(/[\\/][^\\/]+$/, '');
23
23
  if (dir && dir !== currentFile) {
24
- const allActive = memoryStore.getActive(200);
25
- const dirMemories = allActive.filter(m => m.relatedFiles?.some(f => f.startsWith(dir) || f.includes(dir)));
26
- result.directoryMemories = dirMemories.slice(0, 5).map((m, i) => ({
24
+ const dirMemories = memoryStore.getByDirectory(dir, 5);
25
+ result.directoryMemories = dirMemories.map((m, i) => ({
27
26
  memory: m,
28
27
  score: 0.7 - (i * 0.05),
29
28
  matchMethod: 'anticipation:directory',
@@ -43,13 +42,22 @@ function anticipate(memoryStore, currentFile) {
43
42
  };
44
43
  const keywords = typeKeywords[ext];
45
44
  if (keywords) {
46
- const conventions = memoryStore.getByType(types_1.MemoryType.CONVENTION, 50);
47
- const matched = conventions.filter(c => keywords.some(k => c.intent.toLowerCase().includes(k)));
48
- result.relatedTypeMemories = matched.slice(0, 3).map((m, i) => ({
49
- memory: m,
50
- score: 0.5 - (i * 0.05),
51
- matchMethod: 'anticipation:filetype',
52
- }));
45
+ // Use FTS search for keywords instead of loading all conventions and filtering in JS
46
+ const searchQuery = keywords.join(' OR ');
47
+ try {
48
+ const ftsResults = memoryStore.searchFTS(searchQuery, 10);
49
+ const matched = ftsResults
50
+ .filter(r => r.memory.type === types_1.MemoryType.CONVENTION)
51
+ .slice(0, 3);
52
+ result.relatedTypeMemories = matched.map((r, i) => ({
53
+ memory: r.memory,
54
+ score: 0.5 - (i * 0.05),
55
+ matchMethod: 'anticipation:filetype',
56
+ }));
57
+ }
58
+ catch {
59
+ // FTS failed — fallback silently
60
+ }
53
61
  }
54
62
  }
55
63
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"anticipation-engine.js","sourceRoot":"","sources":["../../src/memory/anticipation-engine.ts"],"names":[],"mappings":";;AAiBA,gCA6DC;AAGD,gDAiBC;AAzFD,oCAAoD;AAQpD,SAAgB,UAAU,CACtB,WAAwB,EACxB,WAAoB;IAEpB,MAAM,MAAM,GAAuB;QAC/B,YAAY,EAAE,EAAE;QAChB,iBAAiB,EAAE,EAAE;QACrB,mBAAmB,EAAE,EAAE;KAC1B,CAAC;IAEF,IAAI,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC;IAEhC,6CAA6C;IAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QACvB,WAAW,EAAE,mBAAmB;KACnC,CAAC,CAAC,CAAC;IAEJ,uDAAuD;IACvD,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACrD,IAAI,GAAG,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAClE,CAAC;QACF,MAAM,CAAC,iBAAiB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YACvB,WAAW,EAAE,wBAAwB;SACxC,CAAC,CAAC,CAAC;IACR,CAAC;IAED,mEAAmE;IACnE,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IACxD,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,YAAY,GAA6B;YAC3C,EAAE,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC;YAC/C,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;YACnD,GAAG,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;YAC/C,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC;YACrC,EAAE,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;YAC/C,GAAG,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;YAChD,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;SAC1C,CAAC;QACF,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,kBAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACnC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CACzD,CAAC;YACF,MAAM,CAAC,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5D,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;gBACvB,WAAW,EAAE,uBAAuB;aACvC,CAAC,CAAC,CAAC;QACR,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,gDAAgD;AAChD,SAAgB,kBAAkB,CAAC,MAA0B;IACzD,MAAM,GAAG,GAAG;QACR,GAAG,MAAM,CAAC,YAAY;QACtB,GAAG,MAAM,CAAC,iBAAiB;QAC3B,GAAG,MAAM,CAAC,mBAAmB;KAChC,CAAC;IAEF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAa,CAAC,8CAA8C,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,SAAS;QACpC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"anticipation-engine.js","sourceRoot":"","sources":["../../src/memory/anticipation-engine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auto-learner.d.ts","sourceRoot":"","sources":["../../src/memory/auto-learner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GACnF,gBAAgB,GAAG,eAAe,GAAG,QAAQ,GAAG,cAAc,CAAC;AAErE,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AAiJD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CA8C/D"}
1
+ {"version":3,"file":"auto-learner.d.ts","sourceRoot":"","sources":["../../src/memory/auto-learner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GACnF,gBAAgB,GAAG,eAAe,GAAG,QAAQ,GAAG,cAAc,CAAC;AAErE,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AAmRD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CA0D/D"}
@@ -21,22 +21,40 @@ const PATTERNS = [
21
21
  /\b(don'?t|do not|never|avoid|stop using|instead of|rather than)\b.{5,80}/gi,
22
22
  /\b(wrong|incorrect|mistake|bug|error|issue|problem)\b.{5,60}(fix|correct|should|use|replace)/gi,
23
23
  /\b(fixed|corrected|resolved)\b.{5,60}/gi,
24
+ /\b(should have|should've|that was wrong|my bad|oops|actually no)\b.{5,80}/gi,
25
+ /\b(I was wrong|we were wrong|that's not right|not correct)\b.{5,60}/gi,
26
+ /\b(better approach|better way|improved by|changed to)\b.{5,80}/gi,
24
27
  ],
25
28
  confidence: 0.75,
26
29
  reason: 'Auto-detected correction pattern',
27
30
  },
28
- // DECISION — "we decided", "we'll use", "going with", "chosen"
31
+ // DECISION — "we decided", "I used", "going with", "chosen"
29
32
  {
30
33
  type: 'DECISION',
31
34
  signals: [
32
- /\b(we('ll| will| are going to| decided to)?)\s+(use|adopt|switch|go with|choose|pick|implement)\b.{5,80}/gi,
35
+ /\b((?:we|I)('ll| will| are going to| decided to| have decided)?)\s+(use|adopt|switch|go with|choose|pick|implement)\b.{5,80}/gi,
36
+ /\b((?:we|I)\s+(?:used|chose|picked|adopted|switched to|went with|opted for))\b.{5,80}/gi,
33
37
  /\b(decided|chosen|selected|picked|going with|sticking with)\b.{5,80}/gi,
34
38
  /\b(use|using)\s+\w+\s+(instead of|over|rather than)\s+\w+/gi,
39
+ /\b(chose|opted for|went with|settled on|landed on)\b.{5,80}/gi,
40
+ /\b(changed? from|switch(ed|ing) from|migrat(ed|ing) from)\b.{5,80}/gi,
41
+ /\b(the plan is|approach is|strategy is|our approach)\b.{5,80}/gi,
35
42
  ],
36
- confidence: 0.70,
43
+ confidence: 0.78,
37
44
  reason: 'Auto-detected decision pattern',
38
45
  },
39
- // CONVENTION — "always", "should always", "must", "standard", "convention"
46
+ // CONVENTION (specific) high confidence, specific phrases
47
+ {
48
+ type: 'CONVENTION',
49
+ signals: [
50
+ /\b(best practice|recommended|idiomatic|canonical|proper way)\b.{5,80}/gi,
51
+ /\b(we always|our convention|preferred way|house rule|team rule)\b.{5,80}/gi,
52
+ /\b(in this (project|codebase|repo)|across the (project|codebase))\b.{5,80}/gi,
53
+ ],
54
+ confidence: 0.85,
55
+ reason: 'Auto-detected convention pattern (specific)',
56
+ },
57
+ // CONVENTION (generic) — lower confidence
40
58
  {
41
59
  type: 'CONVENTION',
42
60
  signals: [
@@ -54,11 +72,26 @@ const PATTERNS = [
54
72
  /\b(bug|the (issue|problem|cause) was|root cause|was causing|the fix)\b.{5,80}/gi,
55
73
  /\b(fixed by|resolved by|the solution (is|was))\b.{5,80}/gi,
56
74
  /\b(crash|exception|error|fail(ed|ure)?)\b.{5,60}(because|due to|caused by|fixed)/gi,
75
+ /\b(the fix was|worked after|the trick was|solved by)\b.{5,80}/gi,
76
+ /\b(turns out|it was because|the real issue)\b.{5,80}/gi,
77
+ /\b(workaround|hack|temporary fix|quick fix)\b.{5,80}/gi,
57
78
  ],
58
79
  confidence: 0.80,
59
80
  reason: 'Auto-detected bug fix pattern',
60
81
  },
61
- // INSIGHT — "key insight", "important to note", "worth remembering"
82
+ // INSIGHT (specific) high confidence, clear phrases
83
+ {
84
+ type: 'INSIGHT',
85
+ signals: [
86
+ /\b(for future reference|next time|in the future)\b.{5,80}/gi,
87
+ /\b(learned that|realized|discovered|found out|it turns out)\b.{5,80}/gi,
88
+ /\b(the key is|the secret is|the trick is|pro tip)\b.{5,80}/gi,
89
+ /\b(interestingly|surprisingly|counterintuitively|unexpectedly)\b.{5,80}/gi,
90
+ ],
91
+ confidence: 0.85,
92
+ reason: 'Auto-detected insight pattern (specific)',
93
+ },
94
+ // INSIGHT (generic) — lower confidence
62
95
  {
63
96
  type: 'INSIGHT',
64
97
  signals: [
@@ -119,15 +152,104 @@ const PATTERNS = [
119
152
  confidence: 0.60,
120
153
  reason: 'Auto-detected current task / priority',
121
154
  },
155
+ // IMPLICIT DECISION — "let's go with", "I'll use", "we're using", "going to use"
156
+ {
157
+ type: 'DECISION',
158
+ signals: [
159
+ /\b(let'?s (go with|use|try|do|build|implement))\b.{5,80}/gi,
160
+ /\b(I'?ll (use|go with|try|implement|build|create|set up))\b.{5,80}/gi,
161
+ /\b(we'?re (using|going with|building with|switching to))\b.{5,80}/gi,
162
+ /\b(going to use|plan to use|want to use)\b.{5,80}/gi,
163
+ /\b(set up|configured|installed)\s+\w+\s+(for|as|to handle)\b.{5,60}/gi,
164
+ ],
165
+ confidence: 0.68,
166
+ reason: 'Auto-detected implicit decision',
167
+ },
168
+ // COMPARISON — "X works better than Y", "X is faster", "prefer X over Y"
169
+ {
170
+ type: 'DECISION',
171
+ signals: [
172
+ /\b\w+\s+(works? better|is (better|faster|simpler|cleaner|safer)|outperforms?)\s+(than\s+)?\w+/gi,
173
+ /\b(prefer|recommend)\s+\w+\s+(over|instead of|rather than)\s+\w+/gi,
174
+ /\b(X|the|this)\s+(approach|solution|method|pattern)\s+is\s+(better|worse|simpler|faster)/gi,
175
+ /\b(more (reliable|scalable|maintainable|readable|performant))\b.{5,60}/gi,
176
+ ],
177
+ confidence: 0.65,
178
+ reason: 'Auto-detected comparison / preference',
179
+ },
180
+ // PREFERENCE — "I like", "I want", "please always", user style preferences
181
+ {
182
+ type: 'CONVENTION',
183
+ signals: [
184
+ /\b(I (like|want|prefer|need) (you to|it to|the))\b.{5,80}/gi,
185
+ /\b(please (always|never|don'?t|make sure))\b.{5,80}/gi,
186
+ /\b(be more (concise|verbose|detailed|careful|specific))\b.{5,60}/gi,
187
+ /\b(I don'?t (like|want|need))\b.{5,80}/gi,
188
+ /\b(from now on|going forward|in the future)\b.{5,80}/gi,
189
+ ],
190
+ confidence: 0.72,
191
+ reason: 'Auto-detected user preference',
192
+ },
193
+ // ENVIRONMENT — "runs on", "deployed to", "uses port", config knowledge
194
+ {
195
+ type: 'INSIGHT',
196
+ signals: [
197
+ /\b(runs? on|deployed to|hosted on|hosted at)\b.{5,80}/gi,
198
+ /\b(port\s+\d+|localhost:\d+|\.env)\b.{5,60}/gi,
199
+ /\b(database is|DB is|using\s+(postgres|mysql|mongo|redis|sqlite))\b.{5,80}/gi,
200
+ /\b(API (key|token|secret|endpoint) is)\b.{5,60}/gi,
201
+ /\b(production|staging|development)\s+(server|environment|URL|database)\b.{5,60}/gi,
202
+ ],
203
+ confidence: 0.70,
204
+ reason: 'Auto-detected environment/config knowledge',
205
+ },
206
+ // ARCHITECTURE — "X calls Y", "X depends on", "flow is", structure knowledge
207
+ {
208
+ type: 'INSIGHT',
209
+ signals: [
210
+ /\b(depends? on|imports? from|calls?|wraps?|extends?|inherits? from)\b.{5,80}/gi,
211
+ /\b(the flow is|data flows?|pipeline is|architecture is)\b.{5,80}/gi,
212
+ /\b(entry point|main file|bootstrap|initialization)\b.{5,60}/gi,
213
+ /\b(this (file|module|component|service) (handles?|manages?|is responsible))\b.{5,80}/gi,
214
+ /\b(layer|tier|service|controller|middleware|handler)\s+(for|handles?|processes?)\b.{5,60}/gi,
215
+ ],
216
+ confidence: 0.60,
217
+ reason: 'Auto-detected architecture knowledge',
218
+ },
219
+ // ERROR FINGERPRINT — captures error codes, stack traces, error messages for recall
220
+ {
221
+ type: 'BUG_FIX',
222
+ signals: [
223
+ /\b(Error|TypeError|ReferenceError|SyntaxError|RangeError):\s*.{10,100}/gi,
224
+ /\b(ERR_|ENOENT|EACCES|ECONNREFUSED|EPERM|EISDIR)\b.{5,80}/gi,
225
+ /\b(HTTP\s*(4\d\d|5\d\d))\b.{5,80}/gi,
226
+ /\b(npm ERR|build failed|compilation error|test failed)\b.{5,80}/gi,
227
+ /\b(stack trace|at\s+\w+\s+\()/gi,
228
+ /\b(exit code\s*[1-9]|process exited|segfault|out of memory)\b.{5,60}/gi,
229
+ /\b(cannot find module|module not found|import error|no such file)\b.{5,80}/gi,
230
+ ],
231
+ confidence: 0.82,
232
+ reason: 'Auto-detected error fingerprint — enables instant fix recall when same error recurs',
233
+ },
122
234
  ];
123
235
  // ─── Sentence Splitter ────────────────────────────────────────────────────────
124
236
  function splitSentences(text) {
125
- // Split on sentence boundaries, keeping reasonable length
237
+ // CRITICAL FIX: Split on BOTH sentence boundaries AND newlines/bullets
238
+ // AI responses use markdown bullets (- ), numbered lists (1. ), and newlines
239
+ // — not just periods. Without this, markdown bullets merge into one giant
240
+ // sentence and only the strongest pattern fires.
126
241
  return text
127
- .replace(/\n+/g, ' ')
128
- .split(/(?<=[.!?])\s+/)
242
+ .replace(/```[\s\S]*?```/g, '') // Strip code blocks (don't learn from code)
243
+ .replace(/`[^`]+`/g, '') // Strip inline code
244
+ .split(/\n+/) // Split on newlines FIRST
245
+ .flatMap(line => {
246
+ // Strip markdown bullet prefixes: "- ", "* ", "1. ", "> "
247
+ const cleaned = line.replace(/^\s*[-*>]\s+/, '').replace(/^\s*\d+\.\s+/, '').trim();
248
+ // Then split remaining on sentence boundaries
249
+ return cleaned.split(/(?<=[.!?])\s+/);
250
+ })
129
251
  .map(s => s.trim())
130
- .filter(s => s.length > 20 && s.length < 300);
252
+ .filter(s => s.length > 10 && s.length < 500);
131
253
  }
132
254
  // ─── Dedup Filter ─────────────────────────────────────────────────────────────
133
255
  function normalize(text) {
@@ -140,7 +262,10 @@ function extractMemories(text) {
140
262
  const sentences = splitSentences(text);
141
263
  const results = [];
142
264
  const seen = new Set();
143
- for (const sentence of sentences) {
265
+ for (let i = 0; i < sentences.length; i++) {
266
+ const sentence = sentences[i];
267
+ // Collect ALL matching patterns for this sentence
268
+ const candidates = [];
144
269
  for (const pattern of PATTERNS) {
145
270
  let matched = false;
146
271
  for (const signal of pattern.signals) {
@@ -150,43 +275,65 @@ function extractMemories(text) {
150
275
  break;
151
276
  }
152
277
  }
153
- if (!matched)
154
- continue;
155
- // Clean up the sentence for storage
156
- const content = sentence
157
- .replace(/^(so|and|but|also|note that|remember that|keep in mind that)\s+/i, '')
158
- .replace(/\s+/g, ' ')
159
- .trim();
160
- // Quality gate: reject low-value content
161
- if (content.length < 40)
162
- continue;
163
- // Reject questions — they are not facts to remember
164
- if (content.trim().endsWith('?'))
165
- continue;
166
- // Reject pure conversational filler that adds no value
167
- const fillerPatterns = [
168
- /^(you might|you should consider|i would suggest|please note|it's worth|it is worth|feel free to|don't hesitate)/i,
169
- /^(as mentioned|as noted|as discussed|as i said|as we discussed)/i,
170
- /^(in general|generally speaking|typically|usually|often|sometimes)/i,
171
- /^(let me know|let us know|feel free|if you have|if you need)/i,
172
- ];
173
- if (fillerPatterns.some(p => p.test(content)))
174
- continue;
175
- // Dedup by normalized content
176
- const key = `${pattern.type}:${normalize(content).slice(0, 60)}`;
177
- if (seen.has(key))
178
- continue;
179
- seen.add(key);
180
- results.push({
181
- type: pattern.type,
182
- content,
183
- confidence: pattern.confidence,
184
- reason: pattern.reason,
185
- });
186
- break; // One match per sentence is enough
278
+ if (matched) {
279
+ candidates.push({ pattern });
280
+ }
187
281
  }
282
+ if (candidates.length === 0)
283
+ continue;
284
+ // Pick the highest-confidence match (most specific wins)
285
+ candidates.sort((a, b) => b.pattern.confidence - a.pattern.confidence);
286
+ const best = candidates[0].pattern;
287
+ // Clean up the sentence for storage
288
+ const content = sentence
289
+ .replace(/^(so|and|but|also|note that|remember that|keep in mind that)\s+/i, '')
290
+ .replace(/\s+/g, ' ')
291
+ .trim();
292
+ if (content.length < 10)
293
+ continue;
294
+ // Dedup by normalized content
295
+ const key = `${best.type}:${normalize(content).slice(0, 60)}`;
296
+ if (seen.has(key))
297
+ continue;
298
+ seen.add(key);
299
+ // --- NEW: Extract real reasoning from context ---
300
+ const reason = extractReason(sentence, sentences, i) || best.reason;
301
+ results.push({
302
+ type: best.type,
303
+ content,
304
+ confidence: best.confidence,
305
+ reason,
306
+ });
188
307
  }
189
308
  // Return only high-confidence matches (avoid noise)
190
- return results.filter(r => r.confidence >= 0.55);
309
+ return results.filter(r => r.confidence >= 0.50);
310
+ }
311
+ /**
312
+ * Extract the REAL reason from context — looks for "because", "since", "due to" etc.
313
+ * If the reason clause is in the same sentence, extract it.
314
+ * If it's in the next sentence, grab that as context.
315
+ */
316
+ function extractReason(sentence, allSentences, index) {
317
+ // Check for inline reasoning: "X because Y", "X since Y", "X due to Y"
318
+ const reasonPatterns = [
319
+ /\b(?:because|since|as)\s+(.{10,120})/i,
320
+ /\b(?:due to|caused by|in order to|so that)\s+(.{10,100})/i,
321
+ /\b(?:the reason (?:is|was|being))\s+(.{10,100})/i,
322
+ /\b(?:this (?:is|was) (?:because|needed|required|necessary))\s+(.{10,100})/i,
323
+ ];
324
+ for (const pat of reasonPatterns) {
325
+ const match = sentence.match(pat);
326
+ if (match && match[1]) {
327
+ return match[1].replace(/\s+/g, ' ').trim().slice(0, 120);
328
+ }
329
+ }
330
+ // Check next sentence for reasoning context
331
+ if (index + 1 < allSentences.length) {
332
+ const next = allSentences[index + 1];
333
+ if (/^(because|since|this is because|the reason|due to|otherwise)/i.test(next.trim())) {
334
+ return next.trim().slice(0, 120);
335
+ }
336
+ }
337
+ return null;
191
338
  }
192
339
  //# sourceMappingURL=auto-learner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auto-learner.js","sourceRoot":"","sources":["../../src/memory/auto-learner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-learner.js","sourceRoot":"","sources":["../../src/memory/auto-learner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Completion Resolver — Detects when work is DONE and demotes old related memories.
3
+ *
4
+ * THE CRITICAL GAP: Cortex stores PROBLEMS ("need SEO", "fix auth bug") but
5
+ * never marks them as RESOLVED. So force_recall keeps suggesting old tasks
6
+ * that were already completed — making the AI feel "dumb" and repetitive.
7
+ *
8
+ * How it works:
9
+ * 1. Scans text for completion signals: "done", "finished", "completed", "shipped"
10
+ * 2. Extracts the TOPIC of what was completed (e.g., "SEO", "auth", "refactoring")
11
+ * 3. Searches existing memories for that topic
12
+ * 4. Demotes old memories about the completed topic (importance → 0.2)
13
+ * 5. Tags them as "resolved" so force_recall can deprioritize
14
+ *
15
+ * This makes Cortex behave like a real brain — once you finish something,
16
+ * it stops nagging you about it.
17
+ */
18
+ import { MemoryStore } from '../db/memory-store';
19
+ export interface CompletionSignal {
20
+ topic: string;
21
+ trigger: string;
22
+ confidence: number;
23
+ }
24
+ /**
25
+ * Detect completion signals from text.
26
+ * Returns topics that were identified as "done/completed".
27
+ */
28
+ export declare function detectCompletion(text: string): CompletionSignal[];
29
+ /**
30
+ * Resolve (demote) old memories about a completed topic.
31
+ *
32
+ * Searches for active memories whose intent mentions the topic,
33
+ * then demotes their importance and tags them as "resolved".
34
+ *
35
+ * Returns the number of memories resolved.
36
+ */
37
+ export declare function resolveRelatedMemories(memoryStore: MemoryStore, topic: string, _confidence?: number): number;
38
+ //# sourceMappingURL=completion-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-resolver.d.ts","sourceRoot":"","sources":["../../src/memory/completion-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACtB;AAsBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAqBjE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAClC,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,MAAa,GAC3B,MAAM,CAoDR"}