memobank-cli 0.2.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 +139 -0
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +294 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/capture.d.ts +12 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +191 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/import.d.ts +28 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +356 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index.d.ts +12 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +82 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +142 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/lifecycle.d.ts +21 -0
- package/dist/commands/lifecycle.d.ts.map +1 -0
- package/dist/commands/lifecycle.js +106 -0
- package/dist/commands/lifecycle.js.map +1 -0
- package/dist/commands/map.d.ts +10 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +72 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/onboarding.d.ts +10 -0
- package/dist/commands/onboarding.d.ts.map +1 -0
- package/dist/commands/onboarding.js +420 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/recall.d.ts +13 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +89 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/review.d.ts +11 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +66 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/search.d.ts +13 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +107 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup.d.ts +9 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +354 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/write.d.ts +14 -0
- package/dist/commands/write.d.ts.map +1 -0
- package/dist/commands/write.js +247 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +147 -0
- package/dist/config.js.map +1 -0
- package/dist/core/decay-engine.d.ts +16 -0
- package/dist/core/decay-engine.d.ts.map +1 -0
- package/dist/core/decay-engine.js +91 -0
- package/dist/core/decay-engine.js.map +1 -0
- package/dist/core/embedding.d.ts +60 -0
- package/dist/core/embedding.d.ts.map +1 -0
- package/dist/core/embedding.js +169 -0
- package/dist/core/embedding.js.map +1 -0
- package/dist/core/lifecycle-manager.d.ts +105 -0
- package/dist/core/lifecycle-manager.d.ts.map +1 -0
- package/dist/core/lifecycle-manager.js +332 -0
- package/dist/core/lifecycle-manager.js.map +1 -0
- package/dist/core/memory-template.d.ts +70 -0
- package/dist/core/memory-template.d.ts.map +1 -0
- package/dist/core/memory-template.js +496 -0
- package/dist/core/memory-template.js.map +1 -0
- package/dist/core/noise-filter.d.ts +39 -0
- package/dist/core/noise-filter.d.ts.map +1 -0
- package/dist/core/noise-filter.js +168 -0
- package/dist/core/noise-filter.js.map +1 -0
- package/dist/core/retriever.d.ts +21 -0
- package/dist/core/retriever.d.ts.map +1 -0
- package/dist/core/retriever.js +77 -0
- package/dist/core/retriever.js.map +1 -0
- package/dist/core/sanitizer.d.ts +9 -0
- package/dist/core/sanitizer.d.ts.map +1 -0
- package/dist/core/sanitizer.js +57 -0
- package/dist/core/sanitizer.js.map +1 -0
- package/dist/core/smart-extractor.d.ts +12 -0
- package/dist/core/smart-extractor.d.ts.map +1 -0
- package/dist/core/smart-extractor.js +102 -0
- package/dist/core/smart-extractor.js.map +1 -0
- package/dist/core/store.d.ts +40 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +233 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/tool-config.d.ts +33 -0
- package/dist/core/tool-config.d.ts.map +1 -0
- package/dist/core/tool-config.js +253 -0
- package/dist/core/tool-config.js.map +1 -0
- package/dist/engines/engine-adapter.d.ts +22 -0
- package/dist/engines/engine-adapter.d.ts.map +1 -0
- package/dist/engines/engine-adapter.js +7 -0
- package/dist/engines/engine-adapter.js.map +1 -0
- package/dist/engines/lancedb-engine.d.ts +55 -0
- package/dist/engines/lancedb-engine.d.ts.map +1 -0
- package/dist/engines/lancedb-engine.js +279 -0
- package/dist/engines/lancedb-engine.js.map +1 -0
- package/dist/engines/text-engine.d.ts +30 -0
- package/dist/engines/text-engine.d.ts.map +1 -0
- package/dist/engines/text-engine.js +100 -0
- package/dist/engines/text-engine.js.map +1 -0
- package/dist/platforms/claude-code.d.ts +13 -0
- package/dist/platforms/claude-code.d.ts.map +1 -0
- package/dist/platforms/claude-code.js +85 -0
- package/dist/platforms/claude-code.js.map +1 -0
- package/dist/platforms/codex.d.ts +9 -0
- package/dist/platforms/codex.d.ts.map +1 -0
- package/dist/platforms/codex.js +102 -0
- package/dist/platforms/codex.js.map +1 -0
- package/dist/platforms/cursor.d.ts +9 -0
- package/dist/platforms/cursor.d.ts.map +1 -0
- package/dist/platforms/cursor.js +112 -0
- package/dist/platforms/cursor.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Noise Filter Module
|
|
4
|
+
* Filters out low-value content before capturing as memory
|
|
5
|
+
* Ported from memory-lancedb-pro
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.isNoise = isNoise;
|
|
9
|
+
exports.hasHighValueIndicators = hasHighValueIndicators;
|
|
10
|
+
exports.calculateValueScore = calculateValueScore;
|
|
11
|
+
exports.filterAndRank = filterAndRank;
|
|
12
|
+
exports.getCaptureRecommendation = getCaptureRecommendation;
|
|
13
|
+
/**
|
|
14
|
+
* Patterns that indicate low-value content
|
|
15
|
+
*/
|
|
16
|
+
const LOW_VALUE_PATTERNS = [
|
|
17
|
+
// Greetings and farewells
|
|
18
|
+
/^(hi|hello|hey|goodbye|see you|thanks|thank you)/i,
|
|
19
|
+
// Simple acknowledgments
|
|
20
|
+
/^(ok|okay|sure|yes|no|yeah|yep|nope)/i,
|
|
21
|
+
// Meta-questions about the AI
|
|
22
|
+
/^(are you|can you|do you|will you)/i,
|
|
23
|
+
// File operations without context
|
|
24
|
+
/^(opened|closed|saved|created|deleted) file/i,
|
|
25
|
+
// Simple commands
|
|
26
|
+
/^(run|execute|test|build|lint)/i,
|
|
27
|
+
// Trivial changes
|
|
28
|
+
/^(fixed typo|updated comment|reformatted)/i,
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* High-value indicators
|
|
32
|
+
*/
|
|
33
|
+
const HIGH_VALUE_PATTERNS = [
|
|
34
|
+
// Problem-solving
|
|
35
|
+
/(problem|issue|bug|error|fix|solution|resolved)/i,
|
|
36
|
+
// Decisions and rationale
|
|
37
|
+
/(decided|choice|trade.?off|rationale|because|therefore)/i,
|
|
38
|
+
// Learnings and insights
|
|
39
|
+
/(learned|discovered|realized|insight|understand|now i know)/i,
|
|
40
|
+
// Patterns and best practices
|
|
41
|
+
/(pattern|practice|principle|guideline|rule|strategy)/i,
|
|
42
|
+
// Architecture and design
|
|
43
|
+
/(architecture|design|structure|component|system|module)/i,
|
|
44
|
+
// Performance and optimization
|
|
45
|
+
/(performance|optimize|speed|memory|efficient|scalability)/i,
|
|
46
|
+
// Security
|
|
47
|
+
/(security|vulnerability|authentication|authorization|encryption)/i,
|
|
48
|
+
// Workflows and processes
|
|
49
|
+
/(workflow|process|pipeline|deployment|ci.?cd|automation)/i,
|
|
50
|
+
];
|
|
51
|
+
/**
|
|
52
|
+
* Check if content is likely noise
|
|
53
|
+
*/
|
|
54
|
+
function isNoise(content) {
|
|
55
|
+
const trimmed = content.trim();
|
|
56
|
+
// Too short
|
|
57
|
+
if (trimmed.length < 50) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
// Check low-value patterns
|
|
61
|
+
for (const pattern of LOW_VALUE_PATTERNS) {
|
|
62
|
+
if (pattern.test(trimmed)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if content has high value indicators
|
|
70
|
+
*/
|
|
71
|
+
function hasHighValueIndicators(content) {
|
|
72
|
+
for (const pattern of HIGH_VALUE_PATTERNS) {
|
|
73
|
+
if (pattern.test(content)) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Calculate content value score (0-1)
|
|
81
|
+
*/
|
|
82
|
+
function calculateValueScore(content) {
|
|
83
|
+
let score = 0.5; // Base score
|
|
84
|
+
// Length factor (longer content tends to be more detailed)
|
|
85
|
+
const lengthFactor = Math.min(1, content.length / 500);
|
|
86
|
+
score += lengthFactor * 0.2;
|
|
87
|
+
// High-value pattern matches
|
|
88
|
+
const highValueMatches = HIGH_VALUE_PATTERNS.filter((p) => p.test(content)).length;
|
|
89
|
+
score += Math.min(0.3, highValueMatches * 0.05);
|
|
90
|
+
// Low-value pattern matches (penalty)
|
|
91
|
+
const lowValueMatches = LOW_VALUE_PATTERNS.filter((p) => p.test(content)).length;
|
|
92
|
+
score -= lowValueMatches * 0.2;
|
|
93
|
+
// Code block presence (often indicates concrete examples)
|
|
94
|
+
if (content.includes('```')) {
|
|
95
|
+
score += 0.1;
|
|
96
|
+
}
|
|
97
|
+
// Structured content (headers, lists)
|
|
98
|
+
if (content.includes('##') || content.includes('- ') || content.includes('1.')) {
|
|
99
|
+
score += 0.1;
|
|
100
|
+
}
|
|
101
|
+
// Clamp to 0-1
|
|
102
|
+
return Math.max(0, Math.min(1, score));
|
|
103
|
+
}
|
|
104
|
+
function filterAndRank(memories) {
|
|
105
|
+
const filtered = [];
|
|
106
|
+
for (const memory of memories) {
|
|
107
|
+
const { content } = memory;
|
|
108
|
+
// Skip obvious noise
|
|
109
|
+
if (isNoise(content)) {
|
|
110
|
+
console.log(`⊘ Skipped (noise): ${memory.name || memory.description || 'unnamed'}`);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
// Calculate score
|
|
114
|
+
const score = calculateValueScore(content);
|
|
115
|
+
// Determine reason
|
|
116
|
+
let reason = '';
|
|
117
|
+
if (score >= 0.7) {
|
|
118
|
+
reason = 'High value - significant learning or decision';
|
|
119
|
+
}
|
|
120
|
+
else if (score >= 0.5) {
|
|
121
|
+
reason = 'Medium value - useful context';
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
reason = 'Low value - consider skipping';
|
|
125
|
+
}
|
|
126
|
+
filtered.push({
|
|
127
|
+
content,
|
|
128
|
+
score,
|
|
129
|
+
reason,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// Sort by score descending
|
|
133
|
+
return filtered.sort((a, b) => b.score - a.score);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get recommendation for whether to capture
|
|
137
|
+
*/
|
|
138
|
+
function getCaptureRecommendation(score) {
|
|
139
|
+
if (score >= 0.7) {
|
|
140
|
+
return {
|
|
141
|
+
shouldCapture: true,
|
|
142
|
+
confidence: 'high',
|
|
143
|
+
reason: 'High-value content worth remembering',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
else if (score >= 0.5) {
|
|
147
|
+
return {
|
|
148
|
+
shouldCapture: true,
|
|
149
|
+
confidence: 'medium',
|
|
150
|
+
reason: 'Potentially useful context',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
else if (score >= 0.3) {
|
|
154
|
+
return {
|
|
155
|
+
shouldCapture: false,
|
|
156
|
+
confidence: 'medium',
|
|
157
|
+
reason: 'Low-value content, consider skipping',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
return {
|
|
162
|
+
shouldCapture: false,
|
|
163
|
+
confidence: 'high',
|
|
164
|
+
reason: 'Very low-value content, likely noise',
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=noise-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noise-filter.js","sourceRoot":"","sources":["../../src/core/noise-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retriever module
|
|
3
|
+
* Orchestrates engine search and formats output for MEMORY.md injection
|
|
4
|
+
* Tracks access patterns for lifecycle management
|
|
5
|
+
*/
|
|
6
|
+
import { RecallResult, MemoConfig } from '../types';
|
|
7
|
+
import { EngineAdapter } from '../engines/engine-adapter';
|
|
8
|
+
/**
|
|
9
|
+
* Recall memories for a query
|
|
10
|
+
* Returns both the results and formatted markdown
|
|
11
|
+
* Records access for lifecycle tracking
|
|
12
|
+
*/
|
|
13
|
+
export declare function recall(query: string, repoRoot: string, config: MemoConfig, engine?: EngineAdapter): Promise<{
|
|
14
|
+
results: RecallResult[];
|
|
15
|
+
markdown: string;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Write recall results to MEMORY.md
|
|
19
|
+
*/
|
|
20
|
+
export declare function writeRecallResults(repoRoot: string, results: RecallResult[], query: string, engine: string): void;
|
|
21
|
+
//# sourceMappingURL=retriever.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retriever.d.ts","sourceRoot":"","sources":["../../src/core/retriever.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAU1D;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BxD;AAoCD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,IAAI,CAEN"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Retriever module
|
|
4
|
+
* Orchestrates engine search and formats output for MEMORY.md injection
|
|
5
|
+
* Tracks access patterns for lifecycle management
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.recall = recall;
|
|
9
|
+
exports.writeRecallResults = writeRecallResults;
|
|
10
|
+
const store_1 = require("./store");
|
|
11
|
+
const text_engine_1 = require("../engines/text-engine");
|
|
12
|
+
const lifecycle_manager_1 = require("./lifecycle-manager");
|
|
13
|
+
// Simple token estimation (rough approximation: ~4 chars per token)
|
|
14
|
+
function estimateTokenCount(text) {
|
|
15
|
+
return Math.ceil(text.length / 4);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Recall memories for a query
|
|
19
|
+
* Returns both the results and formatted markdown
|
|
20
|
+
* Records access for lifecycle tracking
|
|
21
|
+
*/
|
|
22
|
+
async function recall(query, repoRoot, config, engine) {
|
|
23
|
+
// Load all memories
|
|
24
|
+
const memories = (0, store_1.loadAll)(repoRoot);
|
|
25
|
+
// Use provided engine or default to text engine
|
|
26
|
+
const searchEngine = engine || new text_engine_1.TextEngine();
|
|
27
|
+
// Run search
|
|
28
|
+
let results = await searchEngine.search(query, memories, config.memory.top_k);
|
|
29
|
+
// Record access for each recalled memory
|
|
30
|
+
for (const result of results) {
|
|
31
|
+
(0, lifecycle_manager_1.recordAccess)(repoRoot, result.memory.path, query);
|
|
32
|
+
}
|
|
33
|
+
// Truncate if over token budget
|
|
34
|
+
let markdown = formatResultsAsMarkdown(results, query, config.embedding.engine, memories.length);
|
|
35
|
+
let tokenCount = estimateTokenCount(markdown);
|
|
36
|
+
if (tokenCount > config.memory.token_budget) {
|
|
37
|
+
// Remove results until under budget
|
|
38
|
+
while (results.length > 0 && tokenCount > config.memory.token_budget) {
|
|
39
|
+
results.pop();
|
|
40
|
+
markdown = formatResultsAsMarkdown(results, query, config.embedding.engine, memories.length);
|
|
41
|
+
tokenCount = estimateTokenCount(markdown);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { results, markdown };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Format recall results as markdown for MEMORY.md
|
|
48
|
+
*/
|
|
49
|
+
function formatResultsAsMarkdown(results, query, engine, totalMemories) {
|
|
50
|
+
let markdown = `<!-- Last updated: ${new Date().toISOString()} | query: "${query}" | engine: ${engine} | top ${results.length} of ${totalMemories} -->\n\n`;
|
|
51
|
+
markdown += `## Recalled Memory\n\n`;
|
|
52
|
+
if (results.length === 0) {
|
|
53
|
+
markdown += `*No memories found for "${query}"*\n`;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
for (const result of results) {
|
|
57
|
+
const { memory, score } = result;
|
|
58
|
+
const confidenceStr = memory.confidence ? ` · ${memory.confidence} confidence` : '';
|
|
59
|
+
const tagStr = memory.tags.length > 0 ? ` · tags: ${memory.tags.join(', ')}` : '';
|
|
60
|
+
const relativePath = memory.path.replace(/^.*\/memobank\//, '');
|
|
61
|
+
markdown += `### [${memory.type}] ${memory.name}${confidenceStr}\n`;
|
|
62
|
+
markdown += `> ${memory.description}\n`;
|
|
63
|
+
markdown += `> \`${relativePath}\`${tagStr}\n\n`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const tokenCount = estimateTokenCount(markdown);
|
|
67
|
+
markdown += `---\n`;
|
|
68
|
+
markdown += `*${results.length} of ${totalMemories} memories · engine: ${engine} · ~${tokenCount} tokens*`;
|
|
69
|
+
return markdown;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Write recall results to MEMORY.md
|
|
73
|
+
*/
|
|
74
|
+
function writeRecallResults(repoRoot, results, query, engine) {
|
|
75
|
+
(0, store_1.writeMemoryMd)(repoRoot, results, query, engine);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=retriever.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../src/core/retriever.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitizer module
|
|
3
|
+
* Strips secrets and sensitive information from content before writing to memory
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Sanitize content by replacing sensitive patterns with [REDACTED]
|
|
7
|
+
*/
|
|
8
|
+
export declare function sanitize(content: string): string;
|
|
9
|
+
//# sourceMappingURL=sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../../src/core/sanitizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyDhD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sanitizer module
|
|
4
|
+
* Strips secrets and sensitive information from content before writing to memory
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.sanitize = sanitize;
|
|
8
|
+
/**
|
|
9
|
+
* Sanitize content by replacing sensitive patterns with [REDACTED]
|
|
10
|
+
*/
|
|
11
|
+
function sanitize(content) {
|
|
12
|
+
let sanitized = content;
|
|
13
|
+
// 1. API keys
|
|
14
|
+
// OpenAI: sk-...
|
|
15
|
+
sanitized = sanitized.replace(/sk-[A-Za-z0-9]{20,}/g, '[REDACTED]');
|
|
16
|
+
// GitHub personal access tokens: ghp_...
|
|
17
|
+
sanitized = sanitized.replace(/ghp_[A-Za-z0-9]{36}/g, '[REDACTED]');
|
|
18
|
+
// Bearer tokens
|
|
19
|
+
sanitized = sanitized.replace(/Bearer [A-Za-z0-9._-]{20,}/g, 'Bearer [REDACTED]');
|
|
20
|
+
// 2. IP addresses
|
|
21
|
+
// IPv4
|
|
22
|
+
sanitized = sanitized.replace(/\b\d{1,3}(\.\d{1,3}){3}\b/g, (match) => {
|
|
23
|
+
const parts = match.split('.');
|
|
24
|
+
// Check if it's a valid IP (all parts 0-255)
|
|
25
|
+
if (parts.every((part) => {
|
|
26
|
+
const num = parseInt(part, 10);
|
|
27
|
+
return num >= 0 && num <= 255;
|
|
28
|
+
})) {
|
|
29
|
+
return '[REDACTED]';
|
|
30
|
+
}
|
|
31
|
+
return match;
|
|
32
|
+
});
|
|
33
|
+
// IPv6 (simplified pattern)
|
|
34
|
+
sanitized = sanitized.replace(/\b([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b/g, '[REDACTED]');
|
|
35
|
+
// 3. JWT tokens
|
|
36
|
+
sanitized = sanitized.replace(/eyJ[A-Za-z0-9._-]{50,}\.[A-Za-z0-9._-]+\.[A-Za-z0-9._-]+/g, '[REDACTED]');
|
|
37
|
+
// 4. .env-style variables with long values
|
|
38
|
+
sanitized = sanitized.replace(/[A-Z_]+=["']?[A-Za-z0-9/+]{20,}["']?/g, (match) => {
|
|
39
|
+
// Replace the value part only
|
|
40
|
+
return match.replace(/=["']?[A-Za-z0-9/+]{20,}["']?/, '=[REDACTED]');
|
|
41
|
+
});
|
|
42
|
+
// 5. AWS Access Keys
|
|
43
|
+
sanitized = sanitized.replace(/AKIA[0-9A-Z]{16}/g, '[REDACTED]');
|
|
44
|
+
// 6. Generic API keys (alphanumeric with special chars, 20+ chars)
|
|
45
|
+
sanitized = sanitized.replace(/\b[A-Za-z0-9_\-]{20,}\b/g, (match) => {
|
|
46
|
+
// Skip common non-secret patterns
|
|
47
|
+
if (/^[a-f0-9]{32}$/.test(match))
|
|
48
|
+
return match; // MD5 hashes
|
|
49
|
+
if (/^[a-f0-9]{40}$/.test(match))
|
|
50
|
+
return match; // SHA1 hashes
|
|
51
|
+
if (/^[a-f0-9]{64}$/.test(match))
|
|
52
|
+
return match; // SHA256 hashes
|
|
53
|
+
return '[REDACTED]';
|
|
54
|
+
});
|
|
55
|
+
return sanitized;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../../src/core/sanitizer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAKH,4BAyDC;AA5DD;;GAEG;AACH,SAAgB,QAAQ,CAAC,OAAe;IACtC,IAAI,SAAS,GAAG,OAAO,CAAC;IAExB,cAAc;IACd,iBAAiB;IACjB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;IAEpE,yCAAyC;IACzC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;IAEpE,gBAAgB;IAChB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,6BAA6B,EAAE,mBAAmB,CAAC,CAAC;IAElF,kBAAkB;IAClB,OAAO;IACP,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,KAAK,EAAE,EAAE;QACpE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,6CAA6C;QAC7C,IACE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;QAChC,CAAC,CAAC,EACF,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,6CAA6C,EAAE,YAAY,CAAC,CAAC;IAE3F,gBAAgB;IAChB,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,2DAA2D,EAC3D,YAAY,CACb,CAAC;IAEF,2CAA2C;IAC3C,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,uCAAuC,EAAE,CAAC,KAAK,EAAE,EAAE;QAC/E,8BAA8B;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,+BAA+B,EAAE,aAAa,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAEjE,mEAAmE;IACnE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,KAAK,EAAE,EAAE;QAClE,kCAAkC;QAClC,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,aAAa;QAC7D,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,cAAc;QAC9D,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,gBAAgB;QAChE,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Extractor module
|
|
3
|
+
* LLM-powered extraction for memo capture
|
|
4
|
+
* Ported from memory-lancedb-pro
|
|
5
|
+
*/
|
|
6
|
+
import { ExtractionResult } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Extract memories from session text using LLM
|
|
9
|
+
* Falls back to no-op if no API key is configured
|
|
10
|
+
*/
|
|
11
|
+
export declare function extract(sessionText: string, apiKey?: string, model?: string): Promise<ExtractionResult[]>;
|
|
12
|
+
//# sourceMappingURL=smart-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-extractor.d.ts","sourceRoot":"","sources":["../../src/core/smart-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAoC5C;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,GAAE,MAAqC,GAC3C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA+D7B"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Smart Extractor module
|
|
4
|
+
* LLM-powered extraction for memo capture
|
|
5
|
+
* Ported from memory-lancedb-pro
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.extract = extract;
|
|
9
|
+
const SYSTEM_PROMPT = `You extract structured memories from AI coding session summaries.
|
|
10
|
+
Return a JSON array. Each item:
|
|
11
|
+
{
|
|
12
|
+
"name": "slug-format",
|
|
13
|
+
"type": "lesson|decision|workflow|architecture",
|
|
14
|
+
"description": "one sentence summary",
|
|
15
|
+
"tags": ["tag1", "tag2"],
|
|
16
|
+
"confidence": "low|medium|high",
|
|
17
|
+
"content": "markdown body with the full insight"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
## Extraction Criteria
|
|
21
|
+
|
|
22
|
+
### DO Extract (High Value):
|
|
23
|
+
- Problems solved and solutions found
|
|
24
|
+
- Architectural decisions and rationale
|
|
25
|
+
- Workflows and processes discovered
|
|
26
|
+
- Best practices and patterns learned
|
|
27
|
+
- Bug fixes with root cause analysis
|
|
28
|
+
- Performance optimizations
|
|
29
|
+
- Security considerations
|
|
30
|
+
- Trade-offs and their reasoning
|
|
31
|
+
|
|
32
|
+
### DO NOT Extract (Low Value):
|
|
33
|
+
- Simple file operations (opened, closed, saved)
|
|
34
|
+
- Running commands (test, build, lint)
|
|
35
|
+
- Greetings and acknowledgments
|
|
36
|
+
- Trivial changes (typos, formatting)
|
|
37
|
+
- Questions without answers
|
|
38
|
+
- Meta-discussions about the AI
|
|
39
|
+
|
|
40
|
+
Extract only significant learnings. Skip trivial actions. Max 3 items per session.`;
|
|
41
|
+
/**
|
|
42
|
+
* Extract memories from session text using LLM
|
|
43
|
+
* Falls back to no-op if no API key is configured
|
|
44
|
+
*/
|
|
45
|
+
async function extract(sessionText, apiKey, model = 'claude-3-5-sonnet-20241022') {
|
|
46
|
+
// Check for API key
|
|
47
|
+
const effectiveApiKey = apiKey || process.env.ANTHROPIC_API_KEY;
|
|
48
|
+
if (!effectiveApiKey) {
|
|
49
|
+
console.warn('No API key configured. Skipping LLM extraction.');
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
// Call Claude API
|
|
54
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: {
|
|
57
|
+
'Content-Type': 'application/json',
|
|
58
|
+
'x-api-key': effectiveApiKey,
|
|
59
|
+
'anthropic-version': '2023-06-01',
|
|
60
|
+
},
|
|
61
|
+
body: JSON.stringify({
|
|
62
|
+
model,
|
|
63
|
+
max_tokens: 4096,
|
|
64
|
+
system: SYSTEM_PROMPT,
|
|
65
|
+
messages: [
|
|
66
|
+
{
|
|
67
|
+
role: 'user',
|
|
68
|
+
content: `Extract memories from this session:\n\n${sessionText}`,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
}),
|
|
72
|
+
});
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
const error = await response.text();
|
|
75
|
+
console.error(`LLM extraction failed: ${error}`);
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
const data = (await response.json());
|
|
79
|
+
const content = data.content[0]?.text || '';
|
|
80
|
+
// Parse JSON from response
|
|
81
|
+
const jsonMatch = content.match(/\[[\s\S]*\]/);
|
|
82
|
+
if (!jsonMatch) {
|
|
83
|
+
console.error('Could not parse JSON from LLM response');
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
const extracted = JSON.parse(jsonMatch[0]);
|
|
87
|
+
// Validate and filter
|
|
88
|
+
return extracted.filter((item) => {
|
|
89
|
+
return (item.name &&
|
|
90
|
+
item.type &&
|
|
91
|
+
item.description &&
|
|
92
|
+
Array.isArray(item.tags) &&
|
|
93
|
+
item.confidence &&
|
|
94
|
+
item.content);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error(`LLM extraction error: ${error.message}`);
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=smart-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-extractor.js","sourceRoot":"","sources":["../../src/core/smart-extractor.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA0CH,0BAmEC;AAxGD,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mFA+B6D,CAAC;AAEpF;;;GAGG;AACI,KAAK,UAAU,OAAO,CAC3B,WAAmB,EACnB,MAAe,EACf,QAAgB,4BAA4B;IAE5C,oBAAoB;IACpB,MAAM,eAAe,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAChE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAChE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;YACpE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,eAAe;gBAC5B,mBAAmB,EAAE,YAAY;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,aAAa;gBACrB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,0CAA0C,WAAW,EAAE;qBACjE;iBACF;aACF,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;YACjD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAE5C,2BAA2B;QAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAuB,CAAC;QAEjE,sBAAsB;QACtB,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/B,OAAO,CACL,IAAI,CAAC,IAAI;gBACT,IAAI,CAAC,IAAI;gBACT,IAAI,CAAC,WAAW;gBAChB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,UAAU;gBACf,IAAI,CAAC,OAAO,CACb,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAA0B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File I/O layer for memobank
|
|
3
|
+
* Reads and writes .md files with YAML frontmatter
|
|
4
|
+
*/
|
|
5
|
+
import { MemoryFile } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* Find memobank root directory
|
|
8
|
+
* Resolution order:
|
|
9
|
+
* 1. --repo CLI flag (passed as parameter)
|
|
10
|
+
* 2. MEMOBANK_REPO env var
|
|
11
|
+
* 3. meta/config.yaml in cwd or parent dirs (walk up)
|
|
12
|
+
* 4. ~/.memobank/<git-repo-name>/
|
|
13
|
+
* 5. ~/.memobank/default/
|
|
14
|
+
*/
|
|
15
|
+
export declare function findRepoRoot(cwd: string, repoFlag?: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Load all memory files from a repo
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadAll(repoRoot: string): MemoryFile[];
|
|
20
|
+
/**
|
|
21
|
+
* Load a single memory file
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadFile(filePath: string): MemoryFile;
|
|
24
|
+
/**
|
|
25
|
+
* Write a new memory file
|
|
26
|
+
* Creates filename from name + created date
|
|
27
|
+
*/
|
|
28
|
+
export declare function writeMemory(repoRoot: string, memory: Omit<MemoryFile, 'path'>): string;
|
|
29
|
+
/**
|
|
30
|
+
* Update MEMORY.md with recall results
|
|
31
|
+
*/
|
|
32
|
+
export declare function writeMemoryMd(repoRoot: string, results: Array<{
|
|
33
|
+
memory: MemoryFile;
|
|
34
|
+
score: number;
|
|
35
|
+
}>, query: string, engine: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Read MEMORY.md content
|
|
38
|
+
*/
|
|
39
|
+
export declare function readMemoryMd(repoRoot: string): string | null;
|
|
40
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,UAAU,EAA0B,MAAM,UAAU,CAAC;AAI9D;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAwCnE;AASD;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAmBtD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CA4BrD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,CAoCtF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACrD,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,IAAI,CA8BN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5D"}
|