cortex-mcp 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/dist/cli/setup.d.ts +12 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +293 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config/config.d.ts +13 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +33 -0
- package/dist/config/config.js.map +1 -0
- package/dist/core/event-bus.d.ts +19 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +51 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/db/database.d.ts +19 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +254 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/event-log.d.ts +28 -0
- package/dist/db/event-log.d.ts.map +1 -0
- package/dist/db/event-log.js +87 -0
- package/dist/db/event-log.js.map +1 -0
- package/dist/db/memory-store.d.ts +65 -0
- package/dist/db/memory-store.d.ts.map +1 -0
- package/dist/db/memory-store.js +370 -0
- package/dist/db/memory-store.js.map +1 -0
- package/dist/embedding-worker.d.ts +3 -0
- package/dist/embedding-worker.d.ts.map +1 -0
- package/dist/embedding-worker.js +94 -0
- package/dist/embedding-worker.js.map +1 -0
- package/dist/hooks/cortex-run.d.ts +15 -0
- package/dist/hooks/cortex-run.d.ts.map +1 -0
- package/dist/hooks/cortex-run.js +148 -0
- package/dist/hooks/cortex-run.js.map +1 -0
- package/dist/hooks/git-capture.d.ts +21 -0
- package/dist/hooks/git-capture.d.ts.map +1 -0
- package/dist/hooks/git-capture.js +178 -0
- package/dist/hooks/git-capture.js.map +1 -0
- package/dist/hooks/git-hooks.d.ts +12 -0
- package/dist/hooks/git-hooks.d.ts.map +1 -0
- package/dist/hooks/git-hooks.js +130 -0
- package/dist/hooks/git-hooks.js.map +1 -0
- package/dist/mcp-stdio.d.ts +10 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +247 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/memory/anticipation-engine.d.ts +19 -0
- package/dist/memory/anticipation-engine.d.ts.map +1 -0
- package/dist/memory/anticipation-engine.js +76 -0
- package/dist/memory/anticipation-engine.js.map +1 -0
- package/dist/memory/attention-ranker.d.ts +19 -0
- package/dist/memory/attention-ranker.d.ts.map +1 -0
- package/dist/memory/attention-ranker.js +97 -0
- package/dist/memory/attention-ranker.js.map +1 -0
- package/dist/memory/auto-learner.d.ts +20 -0
- package/dist/memory/auto-learner.d.ts.map +1 -0
- package/dist/memory/auto-learner.js +179 -0
- package/dist/memory/auto-learner.js.map +1 -0
- package/dist/memory/confidence-decay.d.ts +22 -0
- package/dist/memory/confidence-decay.d.ts.map +1 -0
- package/dist/memory/confidence-decay.js +54 -0
- package/dist/memory/confidence-decay.js.map +1 -0
- package/dist/memory/embedding-manager.d.ts +5 -0
- package/dist/memory/embedding-manager.d.ts.map +1 -0
- package/dist/memory/embedding-manager.js +118 -0
- package/dist/memory/embedding-manager.js.map +1 -0
- package/dist/memory/export-import.d.ts +49 -0
- package/dist/memory/export-import.d.ts.map +1 -0
- package/dist/memory/export-import.js +131 -0
- package/dist/memory/export-import.js.map +1 -0
- package/dist/memory/git-memory.d.ts +15 -0
- package/dist/memory/git-memory.d.ts.map +1 -0
- package/dist/memory/git-memory.js +178 -0
- package/dist/memory/git-memory.js.map +1 -0
- package/dist/memory/learning-rate.d.ts +24 -0
- package/dist/memory/learning-rate.d.ts.map +1 -0
- package/dist/memory/learning-rate.js +95 -0
- package/dist/memory/learning-rate.js.map +1 -0
- package/dist/memory/llm-enhancer.d.ts +54 -0
- package/dist/memory/llm-enhancer.d.ts.map +1 -0
- package/dist/memory/llm-enhancer.js +270 -0
- package/dist/memory/llm-enhancer.js.map +1 -0
- package/dist/memory/memory-cache.d.ts +5 -0
- package/dist/memory/memory-cache.d.ts.map +1 -0
- package/dist/memory/memory-cache.js +37 -0
- package/dist/memory/memory-cache.js.map +1 -0
- package/dist/memory/memory-consolidator.d.ts +14 -0
- package/dist/memory/memory-consolidator.d.ts.map +1 -0
- package/dist/memory/memory-consolidator.js +156 -0
- package/dist/memory/memory-consolidator.js.map +1 -0
- package/dist/memory/memory-decay.d.ts +10 -0
- package/dist/memory/memory-decay.d.ts.map +1 -0
- package/dist/memory/memory-decay.js +79 -0
- package/dist/memory/memory-decay.js.map +1 -0
- package/dist/memory/memory-quality.d.ts +37 -0
- package/dist/memory/memory-quality.d.ts.map +1 -0
- package/dist/memory/memory-quality.js +203 -0
- package/dist/memory/memory-quality.js.map +1 -0
- package/dist/memory/memory-ranker.d.ts +14 -0
- package/dist/memory/memory-ranker.d.ts.map +1 -0
- package/dist/memory/memory-ranker.js +68 -0
- package/dist/memory/memory-ranker.js.map +1 -0
- package/dist/memory/meta-memory.d.ts +11 -0
- package/dist/memory/meta-memory.d.ts.map +1 -0
- package/dist/memory/meta-memory.js +141 -0
- package/dist/memory/meta-memory.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +39 -0
- package/dist/memory/session-tracker.d.ts.map +1 -0
- package/dist/memory/session-tracker.js +127 -0
- package/dist/memory/session-tracker.js.map +1 -0
- package/dist/memory/temporal-engine.d.ts +25 -0
- package/dist/memory/temporal-engine.d.ts.map +1 -0
- package/dist/memory/temporal-engine.js +106 -0
- package/dist/memory/temporal-engine.js.map +1 -0
- package/dist/retrieval/hybrid-retriever.d.ts +23 -0
- package/dist/retrieval/hybrid-retriever.d.ts.map +1 -0
- package/dist/retrieval/hybrid-retriever.js +120 -0
- package/dist/retrieval/hybrid-retriever.js.map +1 -0
- package/dist/scanners/architecture-graph.d.ts +30 -0
- package/dist/scanners/architecture-graph.d.ts.map +1 -0
- package/dist/scanners/architecture-graph.js +315 -0
- package/dist/scanners/architecture-graph.js.map +1 -0
- package/dist/scanners/code-verifier.d.ts +70 -0
- package/dist/scanners/code-verifier.d.ts.map +1 -0
- package/dist/scanners/code-verifier.js +374 -0
- package/dist/scanners/code-verifier.js.map +1 -0
- package/dist/scanners/context-builder.d.ts +19 -0
- package/dist/scanners/context-builder.d.ts.map +1 -0
- package/dist/scanners/context-builder.js +102 -0
- package/dist/scanners/context-builder.js.map +1 -0
- package/dist/scanners/export-map.d.ts +22 -0
- package/dist/scanners/export-map.d.ts.map +1 -0
- package/dist/scanners/export-map.js +249 -0
- package/dist/scanners/export-map.js.map +1 -0
- package/dist/scanners/file-verifier.d.ts +22 -0
- package/dist/scanners/file-verifier.d.ts.map +1 -0
- package/dist/scanners/file-verifier.js +140 -0
- package/dist/scanners/file-verifier.js.map +1 -0
- package/dist/scanners/project-scanner.d.ts +31 -0
- package/dist/scanners/project-scanner.d.ts.map +1 -0
- package/dist/scanners/project-scanner.js +398 -0
- package/dist/scanners/project-scanner.js.map +1 -0
- package/dist/security/encryption.d.ts +15 -0
- package/dist/security/encryption.d.ts.map +1 -0
- package/dist/security/encryption.js +116 -0
- package/dist/security/encryption.js.map +1 -0
- package/dist/security/feature-gate.d.ts +30 -0
- package/dist/security/feature-gate.d.ts.map +1 -0
- package/dist/security/feature-gate.js +91 -0
- package/dist/security/feature-gate.js.map +1 -0
- package/dist/security/license.d.ts +24 -0
- package/dist/security/license.d.ts.map +1 -0
- package/dist/security/license.js +168 -0
- package/dist/security/license.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +20 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +60 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/server/dashboard.d.ts +3 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +258 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/mcp-handler.d.ts +12 -0
- package/dist/server/mcp-handler.d.ts.map +1 -0
- package/dist/server/mcp-handler.js +1392 -0
- package/dist/server/mcp-handler.js.map +1 -0
- package/dist/strategies/embedders/local-minilm.d.ts +35 -0
- package/dist/strategies/embedders/local-minilm.d.ts.map +1 -0
- package/dist/strategies/embedders/local-minilm.js +176 -0
- package/dist/strategies/embedders/local-minilm.js.map +1 -0
- package/dist/types.d.ts +207 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,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"}
|