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,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startSession = startSession;
4
+ exports.getSession = getSession;
5
+ exports.feedSession = feedSession;
6
+ exports.endSession = endSession;
7
+ exports.getRecentSessions = getRecentSessions;
8
+ const types_1 = require("../types");
9
+ let currentSession = null;
10
+ // ─── Session Lifecycle ────────────────────────────────────────────────────────
11
+ function startSession() {
12
+ currentSession = {
13
+ startTime: Date.now(),
14
+ topics: new Set(),
15
+ decisions: [],
16
+ filesChanged: new Set(),
17
+ failedAttempts: [],
18
+ businessRules: [],
19
+ gotchas: [],
20
+ currentTasks: [],
21
+ autoLearnCount: 0,
22
+ lastUpdateTime: Date.now(),
23
+ };
24
+ }
25
+ function getSession() {
26
+ return currentSession;
27
+ }
28
+ /** Feed data into the running session — called by auto_learn and other tools */
29
+ function feedSession(data) {
30
+ if (!currentSession)
31
+ startSession();
32
+ const s = currentSession;
33
+ if (data.topic)
34
+ s.topics.add(data.topic.toLowerCase().slice(0, 80));
35
+ if (data.decision)
36
+ s.decisions.push(data.decision.slice(0, 150));
37
+ if (data.fileChanged)
38
+ s.filesChanged.add(data.fileChanged);
39
+ if (data.failedAttempt)
40
+ s.failedAttempts.push(data.failedAttempt.slice(0, 150));
41
+ if (data.businessRule)
42
+ s.businessRules.push(data.businessRule.slice(0, 150));
43
+ if (data.gotcha)
44
+ s.gotchas.push(data.gotcha.slice(0, 150));
45
+ if (data.currentTask)
46
+ s.currentTasks.push(data.currentTask.slice(0, 150));
47
+ s.autoLearnCount++;
48
+ s.lastUpdateTime = Date.now();
49
+ }
50
+ /** Build and store the session summary */
51
+ function endSession(memoryStore) {
52
+ if (!currentSession)
53
+ return null;
54
+ const s = currentSession;
55
+ const durationMin = Math.round((Date.now() - s.startTime) / 60000);
56
+ if (durationMin < 1 && s.autoLearnCount < 3) {
57
+ currentSession = null;
58
+ return null; // Too short — nothing worth storing
59
+ }
60
+ const parts = [];
61
+ parts.push(`Session duration: ${durationMin} minutes`);
62
+ if (s.topics.size > 0) {
63
+ parts.push(`Topics discussed: ${[...s.topics].slice(0, 5).join(', ')}`);
64
+ }
65
+ if (s.decisions.length > 0) {
66
+ parts.push(`Decisions made: ${s.decisions.slice(0, 5).join('; ')}`);
67
+ }
68
+ if (s.filesChanged.size > 0) {
69
+ parts.push(`Files changed: ${[...s.filesChanged].slice(0, 10).join(', ')}`);
70
+ }
71
+ if (s.failedAttempts.length > 0) {
72
+ parts.push(`Failed attempts: ${s.failedAttempts.slice(0, 3).join('; ')}`);
73
+ }
74
+ if (s.businessRules.length > 0) {
75
+ parts.push(`Business rules captured: ${s.businessRules.slice(0, 3).join('; ')}`);
76
+ }
77
+ if (s.gotchas.length > 0) {
78
+ parts.push(`Gotchas/warnings: ${s.gotchas.slice(0, 3).join('; ')}`);
79
+ }
80
+ if (s.currentTasks.length > 0) {
81
+ const lastTask = s.currentTasks[s.currentTasks.length - 1];
82
+ parts.push(`Current focus: ${lastTask}`);
83
+ }
84
+ const summary = parts.join('\n');
85
+ // Store as a SESSION memory
86
+ const timeStr = new Date(s.startTime).toISOString().slice(0, 16).replace('T', ' ');
87
+ memoryStore.add({
88
+ type: types_1.MemoryType.CONVERSATION,
89
+ intent: `Session summary (${timeStr}): ${[...s.topics].slice(0, 3).join(', ') || 'general development'}`,
90
+ action: summary,
91
+ reason: `Auto-captured session with ${s.autoLearnCount} interactions over ${durationMin} min`,
92
+ tags: ['session-summary', ...([...s.topics].slice(0, 3))],
93
+ confidence: 0.85,
94
+ importance: 0.80,
95
+ timestamp: Date.now(),
96
+ isActive: true,
97
+ accessCount: 0,
98
+ createdAt: Date.now(),
99
+ id: '',
100
+ });
101
+ currentSession = null;
102
+ return summary;
103
+ }
104
+ /** Get the last N session summaries for injection at conversation start */
105
+ function getRecentSessions(memoryStore, count = 3) {
106
+ const sessions = memoryStore.getByType(types_1.MemoryType.CONVERSATION, count * 2)
107
+ .filter(m => m.tags?.includes('session-summary'))
108
+ .slice(0, count);
109
+ // Cross-session threading — detect topic overlap with current session
110
+ const currentTopics = currentSession ? [...currentSession.topics] : [];
111
+ return sessions.map(s => {
112
+ const age = Date.now() - s.timestamp;
113
+ const ageStr = age < 3600000 ? `${Math.round(age / 60000)} min ago`
114
+ : age < 86400000 ? `${Math.round(age / 3600000)} hours ago`
115
+ : `${Math.round(age / 86400000)} days ago`;
116
+ // Cross-session threading — highlight shared topics
117
+ let continuityTag = '';
118
+ if (currentTopics.length > 0 && s.tags) {
119
+ const shared = s.tags.filter(t => t !== 'session-summary' && currentTopics.some(ct => ct.includes(t) || t.includes(ct)));
120
+ if (shared.length > 0) {
121
+ continuityTag = ` [CONT] Continuing: ${shared.join(', ')}`;
122
+ }
123
+ }
124
+ return `[${ageStr}] ${s.action || s.intent}${continuityTag}`;
125
+ });
126
+ }
127
+ //# sourceMappingURL=session-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-tracker.js","sourceRoot":"","sources":["../../src/memory/session-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Temporal Engine — Time-aware memory retrieval.
3
+ *
4
+ * Answers: "What changed today?", "What did we do this week?"
5
+ * Auto-injects a "Recent Activity" section at conversation start.
6
+ *
7
+ * Like how your brain naturally groups events by "today", "yesterday", "last week".
8
+ */
9
+ import { MemoryStore } from '../db/memory-store';
10
+ import { MemoryUnit } from '../types';
11
+ export interface TemporalBucket {
12
+ label: string;
13
+ memories: MemoryUnit[];
14
+ start: number;
15
+ end: number;
16
+ }
17
+ /** Get memories bucketed by time period */
18
+ export declare function getTemporalBuckets(memoryStore: MemoryStore): TemporalBucket[];
19
+ /** Get only recent changes (last N hours) */
20
+ export declare function getRecentChanges(memoryStore: MemoryStore, hours?: number): MemoryUnit[];
21
+ /** Format temporal context for injection into force_recall */
22
+ export declare function formatTemporalContext(memoryStore: MemoryStore): string;
23
+ /** Get workspace changes since last session */
24
+ export declare function getWorkspaceDiff(workspaceRoot: string): string;
25
+ //# sourceMappingURL=temporal-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-engine.d.ts","sourceRoot":"","sources":["../../src/memory/temporal-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf;AAED,2CAA2C;AAC3C,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,cAAc,EAAE,CAuB7E;AAED,6CAA6C;AAC7C,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE,CAG3F;AAED,8DAA8D;AAC9D,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAiBtE;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAmD9D"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTemporalBuckets = getTemporalBuckets;
4
+ exports.getRecentChanges = getRecentChanges;
5
+ exports.formatTemporalContext = formatTemporalContext;
6
+ exports.getWorkspaceDiff = getWorkspaceDiff;
7
+ /** Get memories bucketed by time period */
8
+ function getTemporalBuckets(memoryStore) {
9
+ const now = Date.now();
10
+ const HOUR = 3600000;
11
+ const DAY = 86400000;
12
+ const buckets = [
13
+ { label: 'Last hour', memories: [], start: now - HOUR, end: now },
14
+ { label: 'Today', memories: [], start: now - DAY, end: now - HOUR },
15
+ { label: 'Yesterday', memories: [], start: now - 2 * DAY, end: now - DAY },
16
+ { label: 'This week', memories: [], start: now - 7 * DAY, end: now - 2 * DAY },
17
+ ];
18
+ const active = memoryStore.getActive(200);
19
+ for (const m of active) {
20
+ for (const bucket of buckets) {
21
+ if (m.timestamp >= bucket.start && m.timestamp < bucket.end) {
22
+ bucket.memories.push(m);
23
+ break;
24
+ }
25
+ }
26
+ }
27
+ return buckets.filter(b => b.memories.length > 0);
28
+ }
29
+ /** Get only recent changes (last N hours) */
30
+ function getRecentChanges(memoryStore, hours = 24) {
31
+ const since = Date.now() - (hours * 3600000);
32
+ return memoryStore.getActive(200).filter(m => m.timestamp >= since);
33
+ }
34
+ /** Format temporal context for injection into force_recall */
35
+ function formatTemporalContext(memoryStore) {
36
+ const buckets = getTemporalBuckets(memoryStore);
37
+ if (buckets.length === 0)
38
+ return '';
39
+ const lines = ['## ⏰ Recent Activity'];
40
+ for (const bucket of buckets) {
41
+ if (bucket.memories.length === 0)
42
+ continue;
43
+ lines.push(`\n**${bucket.label}** (${bucket.memories.length} memories):`);
44
+ // Show top 5 per bucket, sorted by importance
45
+ const sorted = bucket.memories.sort((a, b) => b.importance - a.importance);
46
+ for (const m of sorted.slice(0, 5)) {
47
+ lines.push(`- [${m.type}] ${m.intent.slice(0, 100)}`);
48
+ }
49
+ }
50
+ return lines.join('\n');
51
+ }
52
+ /** Get workspace changes since last session */
53
+ function getWorkspaceDiff(workspaceRoot) {
54
+ try {
55
+ const { execSync } = require('child_process');
56
+ // Recent commits
57
+ let commits = '';
58
+ try {
59
+ commits = execSync('git log --oneline -5', {
60
+ cwd: workspaceRoot,
61
+ encoding: 'utf-8',
62
+ timeout: 3000,
63
+ }).trim();
64
+ }
65
+ catch { }
66
+ // Files changed recently
67
+ let diffStat = '';
68
+ try {
69
+ diffStat = execSync('git diff --stat HEAD~3 2>nul || echo "no git history"', {
70
+ cwd: workspaceRoot,
71
+ encoding: 'utf-8',
72
+ timeout: 3000,
73
+ }).trim();
74
+ }
75
+ catch { }
76
+ // Current branch
77
+ let branch = '';
78
+ try {
79
+ branch = execSync('git branch --show-current', {
80
+ cwd: workspaceRoot,
81
+ encoding: 'utf-8',
82
+ timeout: 2000,
83
+ }).trim();
84
+ }
85
+ catch { }
86
+ if (!commits && !diffStat)
87
+ return '';
88
+ const parts = ['## 📂 Workspace State'];
89
+ if (branch)
90
+ parts.push(`Branch: \`${branch}\``);
91
+ if (commits) {
92
+ parts.push('\nRecent commits:');
93
+ for (const line of commits.split('\n').slice(0, 5)) {
94
+ parts.push(`- ${line}`);
95
+ }
96
+ }
97
+ if (diffStat && diffStat !== 'no git history') {
98
+ parts.push(`\nRecent changes:\n\`\`\`\n${diffStat.slice(0, 300)}\n\`\`\``);
99
+ }
100
+ return parts.join('\n');
101
+ }
102
+ catch {
103
+ return '';
104
+ }
105
+ }
106
+ //# sourceMappingURL=temporal-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-engine.js","sourceRoot":"","sources":["../../src/memory/temporal-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Hybrid Retriever — Combines vector search + FTS keyword search.
3
+ * Returns ranked, deduplicated results from multiple search methods.
4
+ */
5
+ import type { RecallQuery, ScoredMemory, EmbedderStrategy } from '../types';
6
+ import { MemoryStore } from '../db/memory-store';
7
+ export declare class HybridRetriever {
8
+ private memoryStore;
9
+ private embedder;
10
+ constructor(memoryStore: MemoryStore, embedder: EmbedderStrategy);
11
+ /** Recall memories relevant to a query */
12
+ recall(query: RecallQuery): Promise<ScoredMemory[]>;
13
+ private vectorSearch;
14
+ private keywordSearch;
15
+ private fileSearch;
16
+ /** Merge results from multiple search methods with weights */
17
+ private mergeResults;
18
+ /** Apply query filters */
19
+ private applyFilters;
20
+ /** Clean user query for FTS5 syntax */
21
+ private cleanFTSQuery;
22
+ }
23
+ //# sourceMappingURL=hybrid-retriever.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-retriever.d.ts","sourceRoot":"","sources":["../../src/retrieval/hybrid-retriever.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,qBAAa,eAAe;IACxB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAmB;gBAEvB,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB;IAKhE,0CAA0C;IACpC,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YA+B3C,YAAY;YAUZ,aAAa;YAWb,UAAU;IASxB,8DAA8D;IAC9D,OAAO,CAAC,YAAY;IA6BpB,0BAA0B;IAC1B,OAAO,CAAC,YAAY;IAapB,uCAAuC;IACvC,OAAO,CAAC,aAAa;CAQxB"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HybridRetriever = void 0;
4
+ class HybridRetriever {
5
+ memoryStore;
6
+ embedder;
7
+ constructor(memoryStore, embedder) {
8
+ this.memoryStore = memoryStore;
9
+ this.embedder = embedder;
10
+ }
11
+ /** Recall memories relevant to a query */
12
+ async recall(query) {
13
+ const startTime = Date.now();
14
+ const limit = query.maxResults || 20;
15
+ // Run all search methods in parallel
16
+ const [vectorResults, ftsResults, fileResults] = await Promise.all([
17
+ this.vectorSearch(query.query, limit),
18
+ this.keywordSearch(query.query, limit),
19
+ query.currentFile ? this.fileSearch(query.currentFile, limit) : Promise.resolve([]),
20
+ ]);
21
+ // Merge and deduplicate
22
+ const merged = this.mergeResults([
23
+ { results: vectorResults, weight: 0.5 },
24
+ { results: ftsResults, weight: 0.35 },
25
+ { results: fileResults, weight: 0.15 },
26
+ ]);
27
+ // Apply filters
28
+ let filtered = merged;
29
+ if (query.filters) {
30
+ filtered = this.applyFilters(merged, query.filters);
31
+ }
32
+ // Sort by final score
33
+ filtered.sort((a, b) => b.score - a.score);
34
+ // Return top results
35
+ return filtered.slice(0, limit);
36
+ }
37
+ async vectorSearch(query, limit) {
38
+ try {
39
+ const queryEmbedding = await this.embedder.embed(query);
40
+ return this.memoryStore.searchVector(queryEmbedding, limit);
41
+ }
42
+ catch (err) {
43
+ console.error('[CognitiveMemory] Vector search error:', err);
44
+ return [];
45
+ }
46
+ }
47
+ async keywordSearch(query, limit) {
48
+ try {
49
+ // Clean query for FTS5 syntax
50
+ const ftsQuery = this.cleanFTSQuery(query);
51
+ return this.memoryStore.searchFTS(ftsQuery, limit);
52
+ }
53
+ catch (err) {
54
+ console.error('[CognitiveMemory] FTS search error:', err);
55
+ return [];
56
+ }
57
+ }
58
+ async fileSearch(filePath, limit) {
59
+ const memories = this.memoryStore.getByFile(filePath, limit);
60
+ return memories.map((m, i) => ({
61
+ memory: m,
62
+ score: 1.0 - (i * 0.05), // Ordered by recency
63
+ matchMethod: 'file',
64
+ }));
65
+ }
66
+ /** Merge results from multiple search methods with weights */
67
+ mergeResults(sources) {
68
+ const scoreMap = new Map();
69
+ for (const { results, weight } of sources) {
70
+ for (const r of results) {
71
+ const existing = scoreMap.get(r.memory.id);
72
+ if (existing) {
73
+ // Combine scores — reciprocal rank fusion inspired
74
+ existing.score += r.score * weight;
75
+ existing.methods.push(r.matchMethod);
76
+ }
77
+ else {
78
+ scoreMap.set(r.memory.id, {
79
+ memory: r.memory,
80
+ score: r.score * weight,
81
+ methods: [r.matchMethod],
82
+ });
83
+ }
84
+ }
85
+ }
86
+ return Array.from(scoreMap.values()).map((v) => ({
87
+ memory: v.memory,
88
+ score: v.score,
89
+ matchMethod: v.methods.join('+'),
90
+ }));
91
+ }
92
+ /** Apply query filters */
93
+ applyFilters(results, filters) {
94
+ return results.filter((r) => {
95
+ if (filters?.types && !filters.types.includes(r.memory.type))
96
+ return false;
97
+ if (filters?.since && r.memory.timestamp < filters.since)
98
+ return false;
99
+ if (filters?.minImportance && r.memory.importance < filters.minImportance)
100
+ return false;
101
+ if (filters?.files) {
102
+ const memFiles = r.memory.relatedFiles || [];
103
+ if (!filters.files.some((f) => memFiles.includes(f)))
104
+ return false;
105
+ }
106
+ return true;
107
+ });
108
+ }
109
+ /** Clean user query for FTS5 syntax */
110
+ cleanFTSQuery(query) {
111
+ // Remove special FTS5 characters, keep words
112
+ return query
113
+ .replace(/[^\w\s]/g, ' ')
114
+ .split(/\s+/)
115
+ .filter((w) => w.length > 2)
116
+ .join(' OR ');
117
+ }
118
+ }
119
+ exports.HybridRetriever = HybridRetriever;
120
+ //# sourceMappingURL=hybrid-retriever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-retriever.js","sourceRoot":"","sources":["../../src/retrieval/hybrid-retriever.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { MemoryStore } from '../db/memory-store';
2
+ export interface ArchNode {
3
+ file: string;
4
+ directory: string;
5
+ imports: string[];
6
+ importedBy: string[];
7
+ isEntryPoint: boolean;
8
+ isLeaf: boolean;
9
+ }
10
+ export interface ArchLayer {
11
+ name: string;
12
+ directories: string[];
13
+ fileCount: number;
14
+ }
15
+ export interface ArchGraph {
16
+ nodes: Map<string, ArchNode>;
17
+ layers: ArchLayer[];
18
+ circularDeps: Array<[string, string]>;
19
+ entryPoints: string[];
20
+ leafNodes: string[];
21
+ apiEndpoints: string[];
22
+ totalFiles: number;
23
+ }
24
+ /** Build full architecture graph for the project */
25
+ export declare function buildArchitectureGraph(workspaceRoot: string): ArchGraph;
26
+ /** Store architecture graph as memories */
27
+ export declare function storeArchitectureGraph(memoryStore: MemoryStore, graph: ArchGraph): number;
28
+ /** Format architecture graph for compact context injection */
29
+ export declare function formatArchitectureGraph(graph: ArchGraph): string;
30
+ //# sourceMappingURL=architecture-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture-graph.d.ts","sourceRoot":"","sources":["../../src/scanners/architecture-graph.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,oDAAoD;AACpD,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAiEvE;AAED,2CAA2C;AAC3C,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAiEzF;AAED,8DAA8D;AAC9D,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CA0BhE"}