cortex-mcp 2.7.6 → 2.9.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.
- package/CHANGELOG.md +305 -58
- package/README.md +394 -224
- package/dist/cli/setup.js +58 -60
- package/dist/cli/setup.js.map +1 -1
- package/dist/config/config.js +2 -2
- package/dist/config/config.js.map +1 -1
- package/dist/db/database.d.ts +8 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +35 -54
- package/dist/db/database.js.map +1 -1
- package/dist/db/event-log.d.ts +4 -0
- package/dist/db/event-log.d.ts.map +1 -1
- package/dist/db/event-log.js +14 -10
- package/dist/db/event-log.js.map +1 -1
- package/dist/db/memory-store.d.ts +30 -3
- package/dist/db/memory-store.d.ts.map +1 -1
- package/dist/db/memory-store.js +153 -55
- package/dist/db/memory-store.js.map +1 -1
- package/dist/embedding-worker.js +1 -1
- package/dist/embedding-worker.js.map +1 -1
- package/dist/hooks/git-capture.js +3 -3
- package/dist/hooks/git-hooks.js +5 -2
- package/dist/mcp-stdio.js +39 -5
- package/dist/mcp-stdio.js.map +1 -1
- package/dist/memory/access-pattern-tracker.d.ts +51 -0
- package/dist/memory/access-pattern-tracker.d.ts.map +1 -0
- package/dist/memory/access-pattern-tracker.js +92 -0
- package/dist/memory/access-pattern-tracker.js.map +1 -0
- package/dist/memory/anticipation-engine.d.ts.map +1 -1
- package/dist/memory/anticipation-engine.js +18 -10
- package/dist/memory/anticipation-engine.js.map +1 -1
- package/dist/memory/auto-learner.d.ts.map +1 -1
- package/dist/memory/auto-learner.js +192 -45
- package/dist/memory/auto-learner.js.map +1 -1
- package/dist/memory/completion-resolver.d.ts +38 -0
- package/dist/memory/completion-resolver.d.ts.map +1 -0
- package/dist/memory/completion-resolver.js +127 -0
- package/dist/memory/completion-resolver.js.map +1 -0
- package/dist/memory/confidence-decay.d.ts.map +1 -1
- package/dist/memory/confidence-decay.js +13 -9
- package/dist/memory/confidence-decay.js.map +1 -1
- package/dist/memory/convention-detector.d.ts +11 -0
- package/dist/memory/convention-detector.d.ts.map +1 -0
- package/dist/memory/convention-detector.js +294 -0
- package/dist/memory/convention-detector.js.map +1 -0
- package/dist/memory/correction-detector.d.ts +33 -0
- package/dist/memory/correction-detector.d.ts.map +1 -0
- package/dist/memory/correction-detector.js +129 -0
- package/dist/memory/correction-detector.js.map +1 -0
- package/dist/memory/cross-memory-linker.d.ts +18 -0
- package/dist/memory/cross-memory-linker.d.ts.map +1 -0
- package/dist/memory/cross-memory-linker.js +115 -0
- package/dist/memory/cross-memory-linker.js.map +1 -0
- package/dist/memory/daily-diary.d.ts +30 -0
- package/dist/memory/daily-diary.d.ts.map +1 -0
- package/dist/memory/daily-diary.js +159 -0
- package/dist/memory/daily-diary.js.map +1 -0
- package/dist/memory/embedding-cache.d.ts +32 -0
- package/dist/memory/embedding-cache.d.ts.map +1 -0
- package/dist/memory/embedding-cache.js +76 -0
- package/dist/memory/embedding-cache.js.map +1 -0
- package/dist/memory/embedding-manager.d.ts.map +1 -1
- package/dist/memory/embedding-manager.js +6 -4
- package/dist/memory/embedding-manager.js.map +1 -1
- package/dist/memory/error-learner.d.ts +26 -0
- package/dist/memory/error-learner.d.ts.map +1 -0
- package/dist/memory/error-learner.js +145 -0
- package/dist/memory/error-learner.js.map +1 -0
- package/dist/memory/export-import.js +2 -2
- package/dist/memory/export-import.js.map +1 -1
- package/dist/memory/file-relationships.d.ts +47 -0
- package/dist/memory/file-relationships.d.ts.map +1 -0
- package/dist/memory/file-relationships.js +130 -0
- package/dist/memory/file-relationships.js.map +1 -0
- package/dist/memory/git-memory.d.ts.map +1 -1
- package/dist/memory/git-memory.js +20 -26
- package/dist/memory/git-memory.js.map +1 -1
- package/dist/memory/impact-analyzer.d.ts +16 -0
- package/dist/memory/impact-analyzer.d.ts.map +1 -0
- package/dist/memory/impact-analyzer.js +189 -0
- package/dist/memory/impact-analyzer.js.map +1 -0
- package/dist/memory/instructions-generator.d.ts +30 -0
- package/dist/memory/instructions-generator.d.ts.map +1 -0
- package/dist/memory/instructions-generator.js +117 -0
- package/dist/memory/instructions-generator.js.map +1 -0
- package/dist/memory/learning-rate.js +8 -7
- package/dist/memory/learning-rate.js.map +1 -1
- package/dist/memory/llm-enhancer.d.ts +2 -14
- package/dist/memory/llm-enhancer.d.ts.map +1 -1
- package/dist/memory/llm-enhancer.js +66 -46
- package/dist/memory/llm-enhancer.js.map +1 -1
- package/dist/memory/memory-cache.d.ts.map +1 -1
- package/dist/memory/memory-cache.js +10 -0
- package/dist/memory/memory-cache.js.map +1 -1
- package/dist/memory/memory-consolidator.d.ts.map +1 -1
- package/dist/memory/memory-consolidator.js +20 -14
- package/dist/memory/memory-consolidator.js.map +1 -1
- package/dist/memory/memory-decay.d.ts.map +1 -1
- package/dist/memory/memory-decay.js +82 -52
- package/dist/memory/memory-decay.js.map +1 -1
- package/dist/memory/memory-export-md.d.ts +12 -0
- package/dist/memory/memory-export-md.d.ts.map +1 -0
- package/dist/memory/memory-export-md.js +188 -0
- package/dist/memory/memory-export-md.js.map +1 -0
- package/dist/memory/memory-quality.d.ts +1 -1
- package/dist/memory/memory-quality.d.ts.map +1 -1
- package/dist/memory/memory-quality.js +9 -6
- package/dist/memory/memory-quality.js.map +1 -1
- package/dist/memory/memory-ranker.d.ts.map +1 -1
- package/dist/memory/memory-ranker.js +12 -3
- package/dist/memory/memory-ranker.js.map +1 -1
- package/dist/memory/meta-memory.js +3 -3
- package/dist/memory/meta-memory.js.map +1 -1
- package/dist/memory/mmr-reranker.d.ts +39 -0
- package/dist/memory/mmr-reranker.d.ts.map +1 -0
- package/dist/memory/mmr-reranker.js +115 -0
- package/dist/memory/mmr-reranker.js.map +1 -0
- package/dist/memory/pre-flight.d.ts +24 -0
- package/dist/memory/pre-flight.d.ts.map +1 -0
- package/dist/memory/pre-flight.js +121 -0
- package/dist/memory/pre-flight.js.map +1 -0
- package/dist/memory/preference-learner.d.ts +28 -0
- package/dist/memory/preference-learner.d.ts.map +1 -0
- package/dist/memory/preference-learner.js +144 -0
- package/dist/memory/preference-learner.js.map +1 -0
- package/dist/memory/query-expansion.d.ts +28 -0
- package/dist/memory/query-expansion.d.ts.map +1 -0
- package/dist/memory/query-expansion.js +140 -0
- package/dist/memory/query-expansion.js.map +1 -0
- package/dist/memory/regression-guard.d.ts +35 -0
- package/dist/memory/regression-guard.d.ts.map +1 -0
- package/dist/memory/regression-guard.js +90 -0
- package/dist/memory/regression-guard.js.map +1 -0
- package/dist/memory/resume-work.d.ts +37 -0
- package/dist/memory/resume-work.d.ts.map +1 -0
- package/dist/memory/resume-work.js +141 -0
- package/dist/memory/resume-work.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +2 -0
- package/dist/memory/session-tracker.d.ts.map +1 -1
- package/dist/memory/session-tracker.js +26 -8
- package/dist/memory/session-tracker.js.map +1 -1
- package/dist/memory/soul-manager.d.ts +30 -0
- package/dist/memory/soul-manager.d.ts.map +1 -0
- package/dist/memory/soul-manager.js +171 -0
- package/dist/memory/soul-manager.js.map +1 -0
- package/dist/memory/success-tracker.d.ts +33 -0
- package/dist/memory/success-tracker.d.ts.map +1 -0
- package/dist/memory/success-tracker.js +75 -0
- package/dist/memory/success-tracker.js.map +1 -0
- package/dist/memory/temporal-engine.d.ts.map +1 -1
- package/dist/memory/temporal-engine.js +9 -13
- package/dist/memory/temporal-engine.js.map +1 -1
- package/dist/memory/tool-recommender.d.ts +29 -0
- package/dist/memory/tool-recommender.d.ts.map +1 -0
- package/dist/memory/tool-recommender.js +117 -0
- package/dist/memory/tool-recommender.js.map +1 -0
- package/dist/memory/usage-stats.d.ts +98 -0
- package/dist/memory/usage-stats.d.ts.map +1 -0
- package/dist/memory/usage-stats.js +345 -0
- package/dist/memory/usage-stats.js.map +1 -0
- package/dist/retrieval/hybrid-retriever.d.ts +0 -2
- package/dist/retrieval/hybrid-retriever.d.ts.map +1 -1
- package/dist/retrieval/hybrid-retriever.js +3 -13
- package/dist/retrieval/hybrid-retriever.js.map +1 -1
- package/dist/scanners/architecture-graph.js +2 -2
- package/dist/scanners/architecture-graph.js.map +1 -1
- package/dist/scanners/code-verifier.d.ts +1 -0
- package/dist/scanners/code-verifier.d.ts.map +1 -1
- package/dist/scanners/code-verifier.js +14 -14
- package/dist/scanners/code-verifier.js.map +1 -1
- package/dist/scanners/context-builder.d.ts.map +1 -1
- package/dist/scanners/context-builder.js +33 -45
- package/dist/scanners/context-builder.js.map +1 -1
- package/dist/scanners/export-map.js +2 -2
- package/dist/scanners/export-map.js.map +1 -1
- package/dist/scanners/project-scanner.js +2 -2
- package/dist/scanners/project-scanner.js.map +1 -1
- package/dist/security/encryption.js +1 -1
- package/dist/security/encryption.js.map +1 -1
- package/dist/security/feature-gate.d.ts.map +1 -1
- package/dist/security/feature-gate.js +62 -20
- package/dist/security/feature-gate.js.map +1 -1
- package/dist/security/license.js +282 -35
- package/dist/security/license.js.map +1 -1
- package/dist/security/rate-limiter.d.ts +4 -3
- package/dist/security/rate-limiter.d.ts.map +1 -1
- package/dist/security/rate-limiter.js +11 -29
- package/dist/security/rate-limiter.js.map +1 -1
- package/dist/server/dashboard.js +166 -327
- package/dist/server/dashboard.js.map +1 -1
- package/dist/server/mcp-handler.d.ts.map +1 -1
- package/dist/server/mcp-handler.js +1000 -792
- package/dist/server/mcp-handler.js.map +1 -1
- package/dist/utils/extract-tags.d.ts +16 -0
- package/dist/utils/extract-tags.d.ts.map +1 -0
- package/dist/utils/extract-tags.js +40 -0
- package/dist/utils/extract-tags.js.map +1 -0
- package/package.json +18 -8
- package/dist/core/event-bus.d.ts +0 -19
- package/dist/core/event-bus.d.ts.map +0 -1
- package/dist/core/event-bus.js +0 -51
- package/dist/core/event-bus.js.map +0 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tool Recommender — Suggests which Cortex tools to use based on context.
|
|
4
|
+
*
|
|
5
|
+
* THE GAP THIS FILLS:
|
|
6
|
+
* The AI has 20 tools but often doesn't know WHEN to use which.
|
|
7
|
+
* This module analyzes the current situation and recommends the right tools.
|
|
8
|
+
*
|
|
9
|
+
* Like a flight checklist: "Before takeoff: check instruments, fuel, clearance."
|
|
10
|
+
* Here: "Before editing auth.ts: run pre_check, check_impact, verify_code."
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.recommendTools = recommendTools;
|
|
14
|
+
exports.formatRecommendations = formatRecommendations;
|
|
15
|
+
/**
|
|
16
|
+
* Recommend tools based on what the user is doing.
|
|
17
|
+
*/
|
|
18
|
+
function recommendTools(context) {
|
|
19
|
+
const recommendations = [];
|
|
20
|
+
// ─── New conversation? Always force_recall first ────────────────
|
|
21
|
+
if (context.isNewConversation) {
|
|
22
|
+
recommendations.push({
|
|
23
|
+
tool: 'force_recall',
|
|
24
|
+
reason: 'Start of conversation — load all context (corrections, decisions, conventions)',
|
|
25
|
+
priority: 'must',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// ─── About to edit a file? Pre-check it ────────────────────────
|
|
29
|
+
if (context.currentFile) {
|
|
30
|
+
recommendations.push({
|
|
31
|
+
tool: 'pre_check',
|
|
32
|
+
reason: `Check conventions, gotchas, and past bugs for ${context.currentFile}`,
|
|
33
|
+
priority: 'should',
|
|
34
|
+
});
|
|
35
|
+
recommendations.push({
|
|
36
|
+
tool: 'check_impact',
|
|
37
|
+
reason: `See what depends on ${context.currentFile} before changing it`,
|
|
38
|
+
priority: 'should',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// ─── Topic suggests specific tools ─────────────────────────────
|
|
42
|
+
if (context.topic) {
|
|
43
|
+
const lower = context.topic.toLowerCase();
|
|
44
|
+
if (lower.includes('debug') || lower.includes('error') || lower.includes('bug') || lower.includes('fix')) {
|
|
45
|
+
recommendations.push({
|
|
46
|
+
tool: 'recall_memory',
|
|
47
|
+
reason: 'Search for similar past bugs and failed attempts',
|
|
48
|
+
priority: 'must',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (lower.includes('review') || lower.includes('check')) {
|
|
52
|
+
recommendations.push({
|
|
53
|
+
tool: 'review_code',
|
|
54
|
+
reason: 'Review against stored conventions and past bug patterns',
|
|
55
|
+
priority: 'should',
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (lower.includes('new') || lower.includes('create') || lower.includes('build') || lower.includes('add')) {
|
|
59
|
+
recommendations.push({
|
|
60
|
+
tool: 'scan_project',
|
|
61
|
+
reason: 'Ensure project context is loaded before building new features',
|
|
62
|
+
priority: 'could',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (lower.includes('import') || lower.includes('package') || lower.includes('dependency')) {
|
|
66
|
+
recommendations.push({
|
|
67
|
+
tool: 'verify_code',
|
|
68
|
+
reason: 'Check if imports are valid and packages exist',
|
|
69
|
+
priority: 'must',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (lower.includes('where') || lower.includes('left off') || lower.includes('continue') || lower.includes('resume')) {
|
|
73
|
+
recommendations.push({
|
|
74
|
+
tool: 'resume_work',
|
|
75
|
+
reason: 'Recover context from previous session',
|
|
76
|
+
priority: 'must',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// ─── After making changes ──────────────────────────────────────
|
|
81
|
+
if (context.recentAction === 'code_written') {
|
|
82
|
+
recommendations.push({
|
|
83
|
+
tool: 'auto_learn',
|
|
84
|
+
reason: 'Store decisions and patterns from this response',
|
|
85
|
+
priority: 'must',
|
|
86
|
+
});
|
|
87
|
+
recommendations.push({
|
|
88
|
+
tool: 'verify_code',
|
|
89
|
+
reason: 'Verify imports and exports in the code you just wrote',
|
|
90
|
+
priority: 'should',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// Deduplicate by tool name, keeping highest priority
|
|
94
|
+
const seen = new Map();
|
|
95
|
+
const priorityOrder = { must: 0, should: 1, could: 2 };
|
|
96
|
+
for (const rec of recommendations) {
|
|
97
|
+
const existing = seen.get(rec.tool);
|
|
98
|
+
if (!existing || priorityOrder[rec.priority] < priorityOrder[existing.priority]) {
|
|
99
|
+
seen.set(rec.tool, rec);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return [...seen.values()].sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Format tool recommendations for injection.
|
|
106
|
+
*/
|
|
107
|
+
function formatRecommendations(recs) {
|
|
108
|
+
if (recs.length === 0)
|
|
109
|
+
return '';
|
|
110
|
+
const lines = ['## 🛠️ Recommended Tools'];
|
|
111
|
+
for (const rec of recs) {
|
|
112
|
+
const badge = rec.priority === 'must' ? '🔴' : rec.priority === 'should' ? '🟡' : '🟢';
|
|
113
|
+
lines.push(`- ${badge} **${rec.tool}** — ${rec.reason}`);
|
|
114
|
+
}
|
|
115
|
+
return lines.join('\n');
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=tool-recommender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-recommender.js","sourceRoot":"","sources":["../../src/memory/tool-recommender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Stats — Tracks Cortex usage metrics for impact visibility.
|
|
3
|
+
*
|
|
4
|
+
* THE KEY TO ADDICTION: Users must SEE the value Cortex provides.
|
|
5
|
+
* Every force_recall response now ends with a stats footer showing:
|
|
6
|
+
* - "Cortex Saved You X times"
|
|
7
|
+
* - "Brain Health: 87/100"
|
|
8
|
+
* - Time saved estimate
|
|
9
|
+
* - Memory milestones
|
|
10
|
+
*
|
|
11
|
+
* Stats are PERSISTED in the database so they survive restarts.
|
|
12
|
+
*/
|
|
13
|
+
import { MemoryStore } from '../db/memory-store';
|
|
14
|
+
declare const lifetimeStats: {
|
|
15
|
+
totalRecalls: number;
|
|
16
|
+
totalMemoriesServed: number;
|
|
17
|
+
totalHallucationsCaught: number;
|
|
18
|
+
totalMemoriesStored: number;
|
|
19
|
+
totalSessions: number;
|
|
20
|
+
savedYouCount: number;
|
|
21
|
+
totalAutoLearns: number;
|
|
22
|
+
totalMilestonesHit: number;
|
|
23
|
+
firstUsed: number;
|
|
24
|
+
currentStreak: number;
|
|
25
|
+
longestStreak: number;
|
|
26
|
+
lastActiveDate: string;
|
|
27
|
+
totalSuccessPatterns: number;
|
|
28
|
+
totalErrorsLearned: number;
|
|
29
|
+
};
|
|
30
|
+
/** Record a recall event */
|
|
31
|
+
export declare function trackRecall(memoriesReturned: number): void;
|
|
32
|
+
/** Record a memory store event — checks for milestones */
|
|
33
|
+
export declare function trackStore(): string;
|
|
34
|
+
/** Record a hallucination catch — this is a "saved you" moment */
|
|
35
|
+
export declare function trackCatch(): void;
|
|
36
|
+
/** Record a "saved you" moment (correction recalled → mistake prevented) */
|
|
37
|
+
export declare function trackSaved(): void;
|
|
38
|
+
/** Record a scan */
|
|
39
|
+
export declare function trackScan(): void;
|
|
40
|
+
/** Record a code review */
|
|
41
|
+
export declare function trackReview(): void;
|
|
42
|
+
/** Record an auto_learn */
|
|
43
|
+
export declare function trackAutoLearn(): void;
|
|
44
|
+
/** Record a success pattern learned */
|
|
45
|
+
export declare function trackSuccess(): void;
|
|
46
|
+
/** Record an error pattern learned */
|
|
47
|
+
export declare function trackErrorLearned(): void;
|
|
48
|
+
/** Get streak display string */
|
|
49
|
+
export declare function getStreakDisplay(): string;
|
|
50
|
+
export declare function getTipOfTheDay(memoryStore: MemoryStore): string;
|
|
51
|
+
export declare function calculateBrainHealth(memoryStore: MemoryStore): {
|
|
52
|
+
score: number;
|
|
53
|
+
grade: string;
|
|
54
|
+
tips: string[];
|
|
55
|
+
};
|
|
56
|
+
export declare function estimateTimeSaved(): {
|
|
57
|
+
seconds: number;
|
|
58
|
+
formatted: string;
|
|
59
|
+
};
|
|
60
|
+
export declare function formatStatsFooter(memoryStore?: MemoryStore): string;
|
|
61
|
+
export declare function getUsageStats(): {
|
|
62
|
+
session: {
|
|
63
|
+
recallCount: number;
|
|
64
|
+
memoriesServed: number;
|
|
65
|
+
hallucationsCaught: number;
|
|
66
|
+
memoriesStored: number;
|
|
67
|
+
projectsScanned: number;
|
|
68
|
+
codeReviews: number;
|
|
69
|
+
sessionStart: number;
|
|
70
|
+
};
|
|
71
|
+
lifetime: {
|
|
72
|
+
totalRecalls: number;
|
|
73
|
+
totalMemoriesServed: number;
|
|
74
|
+
totalHallucationsCaught: number;
|
|
75
|
+
totalMemoriesStored: number;
|
|
76
|
+
totalSessions: number;
|
|
77
|
+
savedYouCount: number;
|
|
78
|
+
totalAutoLearns: number;
|
|
79
|
+
totalMilestonesHit: number;
|
|
80
|
+
firstUsed: number;
|
|
81
|
+
currentStreak: number;
|
|
82
|
+
longestStreak: number;
|
|
83
|
+
lastActiveDate: string;
|
|
84
|
+
totalSuccessPatterns: number;
|
|
85
|
+
totalErrorsLearned: number;
|
|
86
|
+
};
|
|
87
|
+
timeSaved: {
|
|
88
|
+
seconds: number;
|
|
89
|
+
formatted: string;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
export declare function resetSessionStats(): void;
|
|
93
|
+
/** Initialize lifetime stats from stored data */
|
|
94
|
+
export declare function initLifetimeStats(stored: Partial<typeof lifetimeStats>): void;
|
|
95
|
+
/** Get raw lifetime stats for persistence */
|
|
96
|
+
export declare function getLifetimeStats(): typeof lifetimeStats;
|
|
97
|
+
export {};
|
|
98
|
+
//# sourceMappingURL=usage-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-stats.d.ts","sourceRoot":"","sources":["../../src/memory/usage-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAgBjD,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;CAgBlB,CAAC;AAIF,4BAA4B;AAC5B,wBAAgB,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAK1D;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,IAAI,MAAM,CAInC;AAED,kEAAkE;AAClE,wBAAgB,UAAU,IAAI,IAAI,CAIjC;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,oBAAoB;AACpB,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,2BAA2B;AAC3B,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,2BAA2B;AAC3B,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED,uCAAuC;AACvC,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,sCAAsC;AACtC,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AA4BD,gCAAgC;AAChC,wBAAgB,gBAAgB,IAAI,MAAM,CAQzC;AAKD,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAe/D;AAMD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;CAClB,CAkDA;AA2BD,wBAAgB,iBAAiB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAU1E;AAID,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,MAAM,CA4CnE;AAID,wBAAgB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA9DmB,MAAM;mBAAa,MAAM;;EAoExE;AAID,wBAAgB,iBAAiB,IAAI,IAAI,CAWxC;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,aAAa,CAAC,GAAG,IAAI,CAU7E;AAED,6CAA6C;AAC7C,wBAAgB,gBAAgB,IAAI,OAAO,aAAa,CAEvD"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Usage Stats — Tracks Cortex usage metrics for impact visibility.
|
|
4
|
+
*
|
|
5
|
+
* THE KEY TO ADDICTION: Users must SEE the value Cortex provides.
|
|
6
|
+
* Every force_recall response now ends with a stats footer showing:
|
|
7
|
+
* - "Cortex Saved You X times"
|
|
8
|
+
* - "Brain Health: 87/100"
|
|
9
|
+
* - Time saved estimate
|
|
10
|
+
* - Memory milestones
|
|
11
|
+
*
|
|
12
|
+
* Stats are PERSISTED in the database so they survive restarts.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.trackRecall = trackRecall;
|
|
16
|
+
exports.trackStore = trackStore;
|
|
17
|
+
exports.trackCatch = trackCatch;
|
|
18
|
+
exports.trackSaved = trackSaved;
|
|
19
|
+
exports.trackScan = trackScan;
|
|
20
|
+
exports.trackReview = trackReview;
|
|
21
|
+
exports.trackAutoLearn = trackAutoLearn;
|
|
22
|
+
exports.trackSuccess = trackSuccess;
|
|
23
|
+
exports.trackErrorLearned = trackErrorLearned;
|
|
24
|
+
exports.getStreakDisplay = getStreakDisplay;
|
|
25
|
+
exports.getTipOfTheDay = getTipOfTheDay;
|
|
26
|
+
exports.calculateBrainHealth = calculateBrainHealth;
|
|
27
|
+
exports.estimateTimeSaved = estimateTimeSaved;
|
|
28
|
+
exports.formatStatsFooter = formatStatsFooter;
|
|
29
|
+
exports.getUsageStats = getUsageStats;
|
|
30
|
+
exports.resetSessionStats = resetSessionStats;
|
|
31
|
+
exports.initLifetimeStats = initLifetimeStats;
|
|
32
|
+
exports.getLifetimeStats = getLifetimeStats;
|
|
33
|
+
// ─── Session Stats (in-memory, per session) ──────────────────────────────────
|
|
34
|
+
let sessionStats = {
|
|
35
|
+
recallCount: 0,
|
|
36
|
+
memoriesServed: 0,
|
|
37
|
+
hallucationsCaught: 0,
|
|
38
|
+
memoriesStored: 0,
|
|
39
|
+
projectsScanned: 0,
|
|
40
|
+
codeReviews: 0,
|
|
41
|
+
sessionStart: Date.now(),
|
|
42
|
+
};
|
|
43
|
+
// ─── Lifetime Stats (persisted via special DB memory) ────────────────────────
|
|
44
|
+
const lifetimeStats = {
|
|
45
|
+
totalRecalls: 0,
|
|
46
|
+
totalMemoriesServed: 0,
|
|
47
|
+
totalHallucationsCaught: 0,
|
|
48
|
+
totalMemoriesStored: 0,
|
|
49
|
+
totalSessions: 0,
|
|
50
|
+
savedYouCount: 0,
|
|
51
|
+
totalAutoLearns: 0,
|
|
52
|
+
totalMilestonesHit: 0,
|
|
53
|
+
firstUsed: Date.now(),
|
|
54
|
+
// STREAK TRACKING — "Don't break the chain!"
|
|
55
|
+
currentStreak: 0, // Days in a row Cortex was used
|
|
56
|
+
longestStreak: 0, // Personal best streak
|
|
57
|
+
lastActiveDate: '', // ISO date string 'YYYY-MM-DD'
|
|
58
|
+
totalSuccessPatterns: 0, // Proven approaches tracked
|
|
59
|
+
totalErrorsLearned: 0, // Error patterns captured
|
|
60
|
+
};
|
|
61
|
+
// ─── Track Events ────────────────────────────────────────────────────────────
|
|
62
|
+
/** Record a recall event */
|
|
63
|
+
function trackRecall(memoriesReturned) {
|
|
64
|
+
sessionStats.recallCount++;
|
|
65
|
+
sessionStats.memoriesServed += memoriesReturned;
|
|
66
|
+
lifetimeStats.totalRecalls++;
|
|
67
|
+
lifetimeStats.totalMemoriesServed += memoriesReturned;
|
|
68
|
+
}
|
|
69
|
+
/** Record a memory store event — checks for milestones */
|
|
70
|
+
function trackStore() {
|
|
71
|
+
sessionStats.memoriesStored++;
|
|
72
|
+
lifetimeStats.totalMemoriesStored++;
|
|
73
|
+
return checkMilestone(lifetimeStats.totalMemoriesStored, 'memories stored');
|
|
74
|
+
}
|
|
75
|
+
/** Record a hallucination catch — this is a "saved you" moment */
|
|
76
|
+
function trackCatch() {
|
|
77
|
+
sessionStats.hallucationsCaught++;
|
|
78
|
+
lifetimeStats.totalHallucationsCaught++;
|
|
79
|
+
lifetimeStats.savedYouCount++;
|
|
80
|
+
}
|
|
81
|
+
/** Record a "saved you" moment (correction recalled → mistake prevented) */
|
|
82
|
+
function trackSaved() {
|
|
83
|
+
lifetimeStats.savedYouCount++;
|
|
84
|
+
}
|
|
85
|
+
/** Record a scan */
|
|
86
|
+
function trackScan() {
|
|
87
|
+
sessionStats.projectsScanned++;
|
|
88
|
+
}
|
|
89
|
+
/** Record a code review */
|
|
90
|
+
function trackReview() {
|
|
91
|
+
sessionStats.codeReviews++;
|
|
92
|
+
}
|
|
93
|
+
/** Record an auto_learn */
|
|
94
|
+
function trackAutoLearn() {
|
|
95
|
+
lifetimeStats.totalAutoLearns++;
|
|
96
|
+
updateStreak();
|
|
97
|
+
}
|
|
98
|
+
/** Record a success pattern learned */
|
|
99
|
+
function trackSuccess() {
|
|
100
|
+
lifetimeStats.totalSuccessPatterns++;
|
|
101
|
+
}
|
|
102
|
+
/** Record an error pattern learned */
|
|
103
|
+
function trackErrorLearned() {
|
|
104
|
+
lifetimeStats.totalErrorsLearned++;
|
|
105
|
+
}
|
|
106
|
+
// ─── Daily Streak ────────────────────────────────────────────────────────────
|
|
107
|
+
// Users LOVE streaks. "7 day streak! 🔥" makes them come back.
|
|
108
|
+
function updateStreak() {
|
|
109
|
+
const today = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
|
|
110
|
+
const lastDate = lifetimeStats.lastActiveDate;
|
|
111
|
+
if (lastDate === today)
|
|
112
|
+
return; // Already tracked today
|
|
113
|
+
if (lastDate) {
|
|
114
|
+
const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];
|
|
115
|
+
if (lastDate === yesterday) {
|
|
116
|
+
lifetimeStats.currentStreak++;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
lifetimeStats.currentStreak = 1; // Streak broken
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
lifetimeStats.currentStreak = 1; // First day
|
|
124
|
+
}
|
|
125
|
+
lifetimeStats.lastActiveDate = today;
|
|
126
|
+
if (lifetimeStats.currentStreak > lifetimeStats.longestStreak) {
|
|
127
|
+
lifetimeStats.longestStreak = lifetimeStats.currentStreak;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Get streak display string */
|
|
131
|
+
function getStreakDisplay() {
|
|
132
|
+
const s = lifetimeStats.currentStreak;
|
|
133
|
+
if (s <= 0)
|
|
134
|
+
return '';
|
|
135
|
+
if (s >= 30)
|
|
136
|
+
return `🔥 ${s}-day streak! LEGENDARY!`;
|
|
137
|
+
if (s >= 14)
|
|
138
|
+
return `🔥 ${s}-day streak! On fire!`;
|
|
139
|
+
if (s >= 7)
|
|
140
|
+
return `🔥 ${s}-day streak!`;
|
|
141
|
+
if (s >= 3)
|
|
142
|
+
return `✨ ${s}-day streak`;
|
|
143
|
+
return `Day ${s}`;
|
|
144
|
+
}
|
|
145
|
+
// ─── Tip of the Day ──────────────────────────────────────────────────────────
|
|
146
|
+
// Surface a random useful memory to remind users of past knowledge
|
|
147
|
+
function getTipOfTheDay(memoryStore) {
|
|
148
|
+
try {
|
|
149
|
+
const memories = memoryStore.getActive(100);
|
|
150
|
+
const useful = memories.filter(m => ['DECISION', 'CONVENTION', 'BUG_FIX', 'INSIGHT'].includes(m.type) &&
|
|
151
|
+
m.intent && m.intent.length > 20);
|
|
152
|
+
if (useful.length === 0)
|
|
153
|
+
return '';
|
|
154
|
+
// Deterministic daily pick (same tip all day)
|
|
155
|
+
const dayIndex = Math.floor(Date.now() / 86400000) % useful.length;
|
|
156
|
+
const tip = useful[dayIndex];
|
|
157
|
+
return `\n> 💡 **Tip of the day:** [${tip.type}] ${tip.intent}`;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return '';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// ─── Brain Health Score ──────────────────────────────────────────────────────
|
|
164
|
+
// Composite score 0-100 based on how well Cortex is being used.
|
|
165
|
+
// Higher score = more addictive (users want to keep it high)
|
|
166
|
+
function calculateBrainHealth(memoryStore) {
|
|
167
|
+
const tips = [];
|
|
168
|
+
let score = 0;
|
|
169
|
+
const activeCount = memoryStore.activeCount();
|
|
170
|
+
// 1. Memory count (0-25 pts) — more memories = healthier brain
|
|
171
|
+
if (activeCount >= 100)
|
|
172
|
+
score += 25;
|
|
173
|
+
else if (activeCount >= 50)
|
|
174
|
+
score += 20;
|
|
175
|
+
else if (activeCount >= 20)
|
|
176
|
+
score += 15;
|
|
177
|
+
else if (activeCount >= 5)
|
|
178
|
+
score += 10;
|
|
179
|
+
else {
|
|
180
|
+
score += Math.min(activeCount * 2, 5);
|
|
181
|
+
tips.push('Store more memories to improve brain health');
|
|
182
|
+
}
|
|
183
|
+
// 2. Memory diversity (0-25 pts) — multiple types = better coverage
|
|
184
|
+
const typeCount = getMemoryTypeDiversity(memoryStore);
|
|
185
|
+
score += Math.min(typeCount * 5, 25);
|
|
186
|
+
if (typeCount < 3)
|
|
187
|
+
tips.push('Add different memory types (decisions, corrections, conventions)');
|
|
188
|
+
// 3. Usage frequency (0-25 pts) — regular use = healthier
|
|
189
|
+
if (lifetimeStats.totalSessions >= 20)
|
|
190
|
+
score += 25;
|
|
191
|
+
else if (lifetimeStats.totalSessions >= 10)
|
|
192
|
+
score += 20;
|
|
193
|
+
else if (lifetimeStats.totalSessions >= 5)
|
|
194
|
+
score += 15;
|
|
195
|
+
else if (lifetimeStats.totalSessions >= 2)
|
|
196
|
+
score += 10;
|
|
197
|
+
else {
|
|
198
|
+
score += lifetimeStats.totalSessions * 5;
|
|
199
|
+
tips.push('Use Cortex regularly — memory quality improves with each session');
|
|
200
|
+
}
|
|
201
|
+
// 4. Auto-learn engagement (0-25 pts) — AI is learning from conversations
|
|
202
|
+
if (lifetimeStats.totalAutoLearns >= 50)
|
|
203
|
+
score += 25;
|
|
204
|
+
else if (lifetimeStats.totalAutoLearns >= 20)
|
|
205
|
+
score += 20;
|
|
206
|
+
else if (lifetimeStats.totalAutoLearns >= 10)
|
|
207
|
+
score += 15;
|
|
208
|
+
else if (lifetimeStats.totalAutoLearns >= 3)
|
|
209
|
+
score += 10;
|
|
210
|
+
else {
|
|
211
|
+
score += lifetimeStats.totalAutoLearns * 3;
|
|
212
|
+
tips.push('Make sure auto_learn is called after every response');
|
|
213
|
+
}
|
|
214
|
+
// Grade
|
|
215
|
+
let grade;
|
|
216
|
+
if (score >= 90)
|
|
217
|
+
grade = '🧠 Genius';
|
|
218
|
+
else if (score >= 75)
|
|
219
|
+
grade = '🔥 Sharp';
|
|
220
|
+
else if (score >= 50)
|
|
221
|
+
grade = '💡 Growing';
|
|
222
|
+
else if (score >= 25)
|
|
223
|
+
grade = '🌱 Seedling';
|
|
224
|
+
else
|
|
225
|
+
grade = '🥚 Newborn';
|
|
226
|
+
return { score: Math.min(score, 100), grade, tips };
|
|
227
|
+
}
|
|
228
|
+
function getMemoryTypeDiversity(memoryStore) {
|
|
229
|
+
try {
|
|
230
|
+
const memories = memoryStore.getActive(200);
|
|
231
|
+
const types = new Set(memories.map(m => m.type));
|
|
232
|
+
return types.size;
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
return 1;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// ─── Memory Milestones ───────────────────────────────────────────────────────
|
|
239
|
+
// Celebrate: 10, 25, 50, 100, 250, 500, 1000, 2500, 5000
|
|
240
|
+
const MILESTONES = [10, 25, 50, 100, 250, 500, 1000, 2500, 5000];
|
|
241
|
+
function checkMilestone(count, label) {
|
|
242
|
+
if (MILESTONES.includes(count)) {
|
|
243
|
+
lifetimeStats.totalMilestonesHit++;
|
|
244
|
+
return `\n🎉 **Milestone!** ${count} ${label}! Your AI brain is getting stronger.`;
|
|
245
|
+
}
|
|
246
|
+
return '';
|
|
247
|
+
}
|
|
248
|
+
// ─── Time Saved ──────────────────────────────────────────────────────────────
|
|
249
|
+
function estimateTimeSaved() {
|
|
250
|
+
// Each recalled memory ≈ 15s of re-explanation
|
|
251
|
+
// Each hallucination caught ≈ 5min of debugging
|
|
252
|
+
const recallSeconds = lifetimeStats.totalMemoriesServed * 15;
|
|
253
|
+
const catchSeconds = lifetimeStats.totalHallucationsCaught * 300;
|
|
254
|
+
const totalSeconds = recallSeconds + catchSeconds;
|
|
255
|
+
if (totalSeconds < 60)
|
|
256
|
+
return { seconds: totalSeconds, formatted: `${totalSeconds}s` };
|
|
257
|
+
if (totalSeconds < 3600)
|
|
258
|
+
return { seconds: totalSeconds, formatted: `${Math.round(totalSeconds / 60)} min` };
|
|
259
|
+
return { seconds: totalSeconds, formatted: `${(totalSeconds / 3600).toFixed(1)} hours` };
|
|
260
|
+
}
|
|
261
|
+
// ─── Stats Footer (shown in every force_recall) ─────────────────────────────
|
|
262
|
+
function formatStatsFooter(memoryStore) {
|
|
263
|
+
const parts = [];
|
|
264
|
+
const timeSaved = estimateTimeSaved();
|
|
265
|
+
// "Saved You" counter (the most addictive metric)
|
|
266
|
+
if (lifetimeStats.savedYouCount > 0) {
|
|
267
|
+
parts.push(`🛡️ Saved you ${lifetimeStats.savedYouCount} time${lifetimeStats.savedYouCount > 1 ? 's' : ''}`);
|
|
268
|
+
}
|
|
269
|
+
// Brain Health Score
|
|
270
|
+
if (memoryStore) {
|
|
271
|
+
const health = calculateBrainHealth(memoryStore);
|
|
272
|
+
parts.push(`${health.grade} Brain: ${health.score}/100`);
|
|
273
|
+
}
|
|
274
|
+
// Memories + Time saved
|
|
275
|
+
if (lifetimeStats.totalMemoriesServed > 0) {
|
|
276
|
+
parts.push(`${lifetimeStats.totalMemoriesServed} memories served`);
|
|
277
|
+
}
|
|
278
|
+
if (timeSaved.seconds > 0) {
|
|
279
|
+
parts.push(`~${timeSaved.formatted} saved`);
|
|
280
|
+
}
|
|
281
|
+
// Hallucinations caught
|
|
282
|
+
if (lifetimeStats.totalHallucationsCaught > 0) {
|
|
283
|
+
parts.push(`${lifetimeStats.totalHallucationsCaught} hallucination${lifetimeStats.totalHallucationsCaught > 1 ? 's' : ''} caught`);
|
|
284
|
+
}
|
|
285
|
+
if (parts.length === 0) {
|
|
286
|
+
return '\n> 🧠 Cortex is active — memories will build up as you work.';
|
|
287
|
+
}
|
|
288
|
+
// Add streak
|
|
289
|
+
const streak = getStreakDisplay();
|
|
290
|
+
if (streak)
|
|
291
|
+
parts.push(streak);
|
|
292
|
+
let footer = `\n> 🧠 Cortex: ${parts.join(' | ')}`;
|
|
293
|
+
// Add tip of the day
|
|
294
|
+
if (memoryStore) {
|
|
295
|
+
footer += getTipOfTheDay(memoryStore);
|
|
296
|
+
}
|
|
297
|
+
return footer;
|
|
298
|
+
}
|
|
299
|
+
// ─── Full Stats ──────────────────────────────────────────────────────────────
|
|
300
|
+
function getUsageStats() {
|
|
301
|
+
return {
|
|
302
|
+
session: { ...sessionStats },
|
|
303
|
+
lifetime: { ...lifetimeStats },
|
|
304
|
+
timeSaved: estimateTimeSaved(),
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
// ─── Session Management ──────────────────────────────────────────────────────
|
|
308
|
+
function resetSessionStats() {
|
|
309
|
+
lifetimeStats.totalSessions++;
|
|
310
|
+
sessionStats = {
|
|
311
|
+
recallCount: 0,
|
|
312
|
+
memoriesServed: 0,
|
|
313
|
+
hallucationsCaught: 0,
|
|
314
|
+
memoriesStored: 0,
|
|
315
|
+
projectsScanned: 0,
|
|
316
|
+
codeReviews: 0,
|
|
317
|
+
sessionStart: Date.now(),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/** Initialize lifetime stats from stored data */
|
|
321
|
+
function initLifetimeStats(stored) {
|
|
322
|
+
if (stored.totalRecalls)
|
|
323
|
+
lifetimeStats.totalRecalls = stored.totalRecalls;
|
|
324
|
+
if (stored.totalMemoriesServed)
|
|
325
|
+
lifetimeStats.totalMemoriesServed = stored.totalMemoriesServed;
|
|
326
|
+
if (stored.totalHallucationsCaught)
|
|
327
|
+
lifetimeStats.totalHallucationsCaught = stored.totalHallucationsCaught;
|
|
328
|
+
if (stored.totalMemoriesStored)
|
|
329
|
+
lifetimeStats.totalMemoriesStored = stored.totalMemoriesStored;
|
|
330
|
+
if (stored.totalSessions)
|
|
331
|
+
lifetimeStats.totalSessions = stored.totalSessions;
|
|
332
|
+
if (stored.savedYouCount)
|
|
333
|
+
lifetimeStats.savedYouCount = stored.savedYouCount;
|
|
334
|
+
if (stored.totalAutoLearns)
|
|
335
|
+
lifetimeStats.totalAutoLearns = stored.totalAutoLearns;
|
|
336
|
+
if (stored.totalMilestonesHit)
|
|
337
|
+
lifetimeStats.totalMilestonesHit = stored.totalMilestonesHit;
|
|
338
|
+
if (stored.firstUsed)
|
|
339
|
+
lifetimeStats.firstUsed = stored.firstUsed;
|
|
340
|
+
}
|
|
341
|
+
/** Get raw lifetime stats for persistence */
|
|
342
|
+
function getLifetimeStats() {
|
|
343
|
+
return { ...lifetimeStats };
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=usage-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-stats.js","sourceRoot":"","sources":["../../src/memory/usage-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;YAUb,UAAU;IASxB,8DAA8D;IAC9D,OAAO,CAAC,YAAY;IA6BpB,0BAA0B;IAC1B,OAAO,CAAC,YAAY;CAYvB"}
|
|
@@ -10,7 +10,7 @@ class HybridRetriever {
|
|
|
10
10
|
}
|
|
11
11
|
/** Recall memories relevant to a query */
|
|
12
12
|
async recall(query) {
|
|
13
|
-
const
|
|
13
|
+
const _startTime = Date.now();
|
|
14
14
|
const limit = query.maxResults || 20;
|
|
15
15
|
// Run all search methods in parallel
|
|
16
16
|
const [vectorResults, ftsResults, fileResults] = await Promise.all([
|
|
@@ -46,9 +46,8 @@ class HybridRetriever {
|
|
|
46
46
|
}
|
|
47
47
|
async keywordSearch(query, limit) {
|
|
48
48
|
try {
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
return this.memoryStore.searchFTS(ftsQuery, limit);
|
|
49
|
+
// searchFTS already sanitizes FTS5 special chars internally
|
|
50
|
+
return this.memoryStore.searchFTS(query, limit);
|
|
52
51
|
}
|
|
53
52
|
catch (err) {
|
|
54
53
|
console.error('[CognitiveMemory] FTS search error:', err);
|
|
@@ -106,15 +105,6 @@ class HybridRetriever {
|
|
|
106
105
|
return true;
|
|
107
106
|
});
|
|
108
107
|
}
|
|
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
108
|
}
|
|
119
109
|
exports.HybridRetriever = HybridRetriever;
|
|
120
110
|
//# sourceMappingURL=hybrid-retriever.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid-retriever.js","sourceRoot":"","sources":["../../src/retrieval/hybrid-retriever.ts"],"names":[],"mappings":";;;AAOA,MAAa,eAAe;IAChB,WAAW,CAAc;IACzB,QAAQ,CAAmB;IAEnC,YAAY,WAAwB,EAAE,QAA0B;QAC5D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,0CAA0C;IAC1C,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC3B,MAAM,
|
|
1
|
+
{"version":3,"file":"hybrid-retriever.js","sourceRoot":"","sources":["../../src/retrieval/hybrid-retriever.ts"],"names":[],"mappings":"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"}
|