universal-agent-memory 1.0.25 → 1.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/dist/cli/generate.js +119 -14
- package/dist/cli/generate.js.map +1 -1
- package/dist/generators/claude-md.js +64 -4
- package/dist/generators/claude-md.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/adaptive-context.d.ts +3 -1
- package/dist/memory/adaptive-context.d.ts.map +1 -1
- package/dist/memory/adaptive-context.js +71 -42
- package/dist/memory/adaptive-context.js.map +1 -1
- package/dist/memory/context-compressor.d.ts +3 -1
- package/dist/memory/context-compressor.d.ts.map +1 -1
- package/dist/memory/context-compressor.js +21 -12
- package/dist/memory/context-compressor.js.map +1 -1
- package/dist/memory/dynamic-retrieval.d.ts.map +1 -1
- package/dist/memory/dynamic-retrieval.js +96 -51
- package/dist/memory/dynamic-retrieval.js.map +1 -1
- package/dist/memory/hierarchical-memory.d.ts +15 -2
- package/dist/memory/hierarchical-memory.d.ts.map +1 -1
- package/dist/memory/hierarchical-memory.js +118 -8
- package/dist/memory/hierarchical-memory.js.map +1 -1
- package/dist/memory/model-router.d.ts +17 -0
- package/dist/memory/model-router.d.ts.map +1 -1
- package/dist/memory/model-router.js +60 -2
- package/dist/memory/model-router.js.map +1 -1
- package/dist/memory/semantic-compression.d.ts.map +1 -1
- package/dist/memory/semantic-compression.js +11 -17
- package/dist/memory/semantic-compression.js.map +1 -1
- package/dist/memory/short-term/factory.d.ts +4 -1
- package/dist/memory/short-term/factory.d.ts.map +1 -1
- package/dist/memory/short-term/indexeddb.d.ts +1 -1
- package/dist/memory/short-term/indexeddb.d.ts.map +1 -1
- package/dist/memory/short-term/indexeddb.js +1 -1
- package/dist/memory/short-term/indexeddb.js.map +1 -1
- package/dist/memory/short-term/schema.d.ts.map +1 -1
- package/dist/memory/short-term/schema.js +14 -1
- package/dist/memory/short-term/schema.js.map +1 -1
- package/dist/memory/short-term/sqlite.d.ts +9 -1
- package/dist/memory/short-term/sqlite.d.ts.map +1 -1
- package/dist/memory/short-term/sqlite.js +35 -17
- package/dist/memory/short-term/sqlite.js.map +1 -1
- package/dist/memory/speculative-cache.d.ts +1 -0
- package/dist/memory/speculative-cache.d.ts.map +1 -1
- package/dist/memory/speculative-cache.js +36 -1
- package/dist/memory/speculative-cache.js.map +1 -1
- package/dist/memory/terminal-bench-knowledge.d.ts +14 -0
- package/dist/memory/terminal-bench-knowledge.d.ts.map +1 -1
- package/dist/memory/terminal-bench-knowledge.js +82 -3
- package/dist/memory/terminal-bench-knowledge.js.map +1 -1
- package/dist/utils/string-similarity.d.ts +37 -0
- package/dist/utils/string-similarity.d.ts.map +1 -0
- package/dist/utils/string-similarity.js +114 -0
- package/dist/utils/string-similarity.js.map +1 -0
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* - extract-elf: ELF format knowledge enabled correct parsing
|
|
9
9
|
* - password-recovery: hashcat/john guidance led to successful recovery
|
|
10
10
|
*/
|
|
11
|
+
import { fuzzyKeywordMatch } from '../utils/string-similarity.js';
|
|
11
12
|
export const TERMINAL_BENCH_KNOWLEDGE = [
|
|
12
13
|
// Security - Password Cracking (proven +1 task improvement)
|
|
13
14
|
{
|
|
@@ -153,20 +154,25 @@ export const TERMINAL_BENCH_KNOWLEDGE = [
|
|
|
153
154
|
];
|
|
154
155
|
/**
|
|
155
156
|
* Get domain knowledge relevant to a task
|
|
157
|
+
* Uses fuzzy/stemming matching for better recall
|
|
156
158
|
*/
|
|
157
159
|
export function getRelevantKnowledge(taskInstruction, category) {
|
|
158
|
-
const lower = taskInstruction.toLowerCase();
|
|
159
160
|
const relevant = [];
|
|
160
161
|
for (const knowledge of TERMINAL_BENCH_KNOWLEDGE) {
|
|
161
162
|
// Category filter
|
|
162
163
|
if (category && knowledge.category !== category)
|
|
163
164
|
continue;
|
|
164
|
-
// Score by keyword matches
|
|
165
|
+
// Score by keyword matches using fuzzy matching
|
|
165
166
|
let score = 0;
|
|
166
167
|
for (const keyword of knowledge.keywords) {
|
|
167
|
-
|
|
168
|
+
// Exact match gets full point
|
|
169
|
+
if (taskInstruction.toLowerCase().includes(keyword.toLowerCase())) {
|
|
168
170
|
score += 1;
|
|
169
171
|
}
|
|
172
|
+
// Fuzzy/stemmed match gets partial point
|
|
173
|
+
else if (fuzzyKeywordMatch(taskInstruction, keyword)) {
|
|
174
|
+
score += 0.5;
|
|
175
|
+
}
|
|
170
176
|
}
|
|
171
177
|
if (score > 0) {
|
|
172
178
|
relevant.push({ ...knowledge, score });
|
|
@@ -190,9 +196,82 @@ export function formatKnowledgeForContext(knowledge) {
|
|
|
190
196
|
}
|
|
191
197
|
return lines.join('\n');
|
|
192
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Record knowledge outcome and optionally persist to long-term memory.
|
|
201
|
+
* Call this when a task succeeds or fails to improve future accuracy.
|
|
202
|
+
*
|
|
203
|
+
* @param taskPattern - Keywords describing the task (e.g., "password 7z crack")
|
|
204
|
+
* @param success - Whether the task succeeded
|
|
205
|
+
* @param learnedKnowledge - Optional new knowledge to persist (only on success)
|
|
206
|
+
* @param persistPath - Path to long_term_prepopulated.json (optional)
|
|
207
|
+
*/
|
|
208
|
+
export function recordKnowledgeOutcome(taskPattern, success, learnedKnowledge, persistPath) {
|
|
209
|
+
// Update relevance/importance of existing knowledge based on outcome
|
|
210
|
+
const matchedKnowledge = getRelevantKnowledge(taskPattern);
|
|
211
|
+
for (const k of matchedKnowledge) {
|
|
212
|
+
// Find in main array and adjust importance
|
|
213
|
+
const original = TERMINAL_BENCH_KNOWLEDGE.find(tk => tk.content === k.content && tk.category === k.category);
|
|
214
|
+
if (original) {
|
|
215
|
+
if (success) {
|
|
216
|
+
// Boost importance on success (max 10)
|
|
217
|
+
original.importance = Math.min(10, original.importance + 0.5);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
// Slightly reduce importance on failure (min 3)
|
|
221
|
+
original.importance = Math.max(3, original.importance - 0.2);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Add new knowledge if provided and task succeeded
|
|
226
|
+
if (success && learnedKnowledge) {
|
|
227
|
+
const newEntry = {
|
|
228
|
+
...learnedKnowledge,
|
|
229
|
+
importance: learnedKnowledge.importance ?? 7,
|
|
230
|
+
};
|
|
231
|
+
// Check if similar knowledge already exists
|
|
232
|
+
const exists = TERMINAL_BENCH_KNOWLEDGE.some(k => k.content === newEntry.content ||
|
|
233
|
+
(k.category === newEntry.category &&
|
|
234
|
+
k.keywords.some(kw => newEntry.keywords.includes(kw))));
|
|
235
|
+
if (!exists) {
|
|
236
|
+
TERMINAL_BENCH_KNOWLEDGE.push(newEntry);
|
|
237
|
+
// Persist to file if path provided (fire-and-forget, don't block)
|
|
238
|
+
if (persistPath) {
|
|
239
|
+
persistNewKnowledge(newEntry, persistPath).catch(() => { });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Persist new knowledge to long_term_prepopulated.json
|
|
246
|
+
*/
|
|
247
|
+
async function persistNewKnowledge(knowledge, filePath) {
|
|
248
|
+
try {
|
|
249
|
+
const fs = await import('fs');
|
|
250
|
+
let data = { memories: [] };
|
|
251
|
+
if (fs.existsSync(filePath)) {
|
|
252
|
+
try {
|
|
253
|
+
data = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
// Start fresh if parse fails
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (!data.memories)
|
|
260
|
+
data.memories = [];
|
|
261
|
+
data.memories.push({
|
|
262
|
+
...knowledge,
|
|
263
|
+
addedAt: new Date().toISOString(),
|
|
264
|
+
});
|
|
265
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Silently fail persistence - don't break the main flow
|
|
269
|
+
}
|
|
270
|
+
}
|
|
193
271
|
export default {
|
|
194
272
|
TERMINAL_BENCH_KNOWLEDGE,
|
|
195
273
|
getRelevantKnowledge,
|
|
196
274
|
formatKnowledgeForContext,
|
|
275
|
+
recordKnowledgeOutcome,
|
|
197
276
|
};
|
|
198
277
|
//# sourceMappingURL=terminal-bench-knowledge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-bench-knowledge.js","sourceRoot":"","sources":["../../src/memory/terminal-bench-knowledge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"terminal-bench-knowledge.js","sourceRoot":"","sources":["../../src/memory/terminal-bench-knowledge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String Similarity Utilities for UAM
|
|
3
|
+
*
|
|
4
|
+
* Shared text comparison functions used across memory compression,
|
|
5
|
+
* deduplication, and retrieval systems.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Calculate Jaccard similarity between two strings (word-level)
|
|
9
|
+
* Returns a value between 0 (no overlap) and 1 (identical)
|
|
10
|
+
*/
|
|
11
|
+
export declare function jaccardSimilarity(a: string, b: string): number;
|
|
12
|
+
/**
|
|
13
|
+
* Calculate content hash for deduplication
|
|
14
|
+
* Uses SHA-256 for reliable collision resistance
|
|
15
|
+
*/
|
|
16
|
+
export declare function contentHash(text: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Improved token estimation
|
|
19
|
+
* More accurate than simple length/4 for mixed code and prose
|
|
20
|
+
*/
|
|
21
|
+
export declare function estimateTokensAccurate(text: string): number;
|
|
22
|
+
/**
|
|
23
|
+
* Simple stemming for keyword matching
|
|
24
|
+
* Handles common English suffixes for better fuzzy matching
|
|
25
|
+
*/
|
|
26
|
+
export declare function simpleStem(word: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Fuzzy keyword match using stemming
|
|
29
|
+
* Returns true if any stemmed form matches
|
|
30
|
+
*/
|
|
31
|
+
export declare function fuzzyKeywordMatch(text: string, keyword: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Calculate text similarity using multiple methods
|
|
34
|
+
* Returns weighted average for more robust comparison
|
|
35
|
+
*/
|
|
36
|
+
export declare function textSimilarity(a: string, b: string): number;
|
|
37
|
+
//# sourceMappingURL=string-similarity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-similarity.d.ts","sourceRoot":"","sources":["../../src/utils/string-similarity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW9D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuB3D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkB/C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAkBxE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAa3D"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String Similarity Utilities for UAM
|
|
3
|
+
*
|
|
4
|
+
* Shared text comparison functions used across memory compression,
|
|
5
|
+
* deduplication, and retrieval systems.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'crypto';
|
|
8
|
+
/**
|
|
9
|
+
* Calculate Jaccard similarity between two strings (word-level)
|
|
10
|
+
* Returns a value between 0 (no overlap) and 1 (identical)
|
|
11
|
+
*/
|
|
12
|
+
export function jaccardSimilarity(a, b) {
|
|
13
|
+
const setA = new Set(a.toLowerCase().split(/\s+/).filter(w => w.length > 1));
|
|
14
|
+
const setB = new Set(b.toLowerCase().split(/\s+/).filter(w => w.length > 1));
|
|
15
|
+
if (setA.size === 0 && setB.size === 0)
|
|
16
|
+
return 1;
|
|
17
|
+
if (setA.size === 0 || setB.size === 0)
|
|
18
|
+
return 0;
|
|
19
|
+
const intersection = new Set([...setA].filter(x => setB.has(x)));
|
|
20
|
+
const union = new Set([...setA, ...setB]);
|
|
21
|
+
return intersection.size / union.size;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Calculate content hash for deduplication
|
|
25
|
+
* Uses SHA-256 for reliable collision resistance
|
|
26
|
+
*/
|
|
27
|
+
export function contentHash(text) {
|
|
28
|
+
return createHash('sha256')
|
|
29
|
+
.update(text.toLowerCase().replace(/\s+/g, ' ').trim())
|
|
30
|
+
.digest('hex')
|
|
31
|
+
.slice(0, 16); // 16 hex chars = 64 bits, sufficient for dedup
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Improved token estimation
|
|
35
|
+
* More accurate than simple length/4 for mixed code and prose
|
|
36
|
+
*/
|
|
37
|
+
export function estimateTokensAccurate(text) {
|
|
38
|
+
if (!text || text.length === 0)
|
|
39
|
+
return 0;
|
|
40
|
+
// Split by whitespace and count
|
|
41
|
+
const words = text.split(/\s+/).filter(w => w.length > 0);
|
|
42
|
+
// Count special characters that typically become separate tokens
|
|
43
|
+
const specialChars = (text.match(/[{}()\[\]<>:;,."'`@#$%^&*+=|\\/?!~-]/g) || []).length;
|
|
44
|
+
// Code tokens: variable names split on camelCase/snake_case
|
|
45
|
+
const codeTokens = (text.match(/[a-z][A-Z]|_[a-z]/g) || []).length;
|
|
46
|
+
// Numbers often tokenize separately
|
|
47
|
+
const numbers = (text.match(/\d+/g) || []).length;
|
|
48
|
+
// Base: words + adjustments
|
|
49
|
+
// Average English word is ~1.3 tokens, code identifiers ~1.5
|
|
50
|
+
const baseTokens = words.length * 1.3;
|
|
51
|
+
const specialTokens = specialChars * 0.5;
|
|
52
|
+
const extraCodeTokens = codeTokens * 0.3;
|
|
53
|
+
const numberTokens = numbers * 0.5;
|
|
54
|
+
return Math.ceil(baseTokens + specialTokens + extraCodeTokens + numberTokens);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Simple stemming for keyword matching
|
|
58
|
+
* Handles common English suffixes for better fuzzy matching
|
|
59
|
+
*/
|
|
60
|
+
export function simpleStem(word) {
|
|
61
|
+
const lower = word.toLowerCase();
|
|
62
|
+
// Common suffixes to strip
|
|
63
|
+
const suffixes = ['ing', 'ed', 'es', 's', 'er', 'est', 'ly', 'tion', 'ment', 'ness', 'able', 'ible'];
|
|
64
|
+
for (const suffix of suffixes) {
|
|
65
|
+
if (lower.endsWith(suffix) && lower.length > suffix.length + 2) {
|
|
66
|
+
const stem = lower.slice(0, -suffix.length);
|
|
67
|
+
// Handle doubling (e.g., "running" -> "run")
|
|
68
|
+
if (stem.length > 2 && stem[stem.length - 1] === stem[stem.length - 2]) {
|
|
69
|
+
return stem.slice(0, -1);
|
|
70
|
+
}
|
|
71
|
+
return stem;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return lower;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Fuzzy keyword match using stemming
|
|
78
|
+
* Returns true if any stemmed form matches
|
|
79
|
+
*/
|
|
80
|
+
export function fuzzyKeywordMatch(text, keyword) {
|
|
81
|
+
const textLower = text.toLowerCase();
|
|
82
|
+
const keywordLower = keyword.toLowerCase();
|
|
83
|
+
// Exact match first
|
|
84
|
+
if (textLower.includes(keywordLower))
|
|
85
|
+
return true;
|
|
86
|
+
// Stemmed match
|
|
87
|
+
const keywordStem = simpleStem(keywordLower);
|
|
88
|
+
const textWords = textLower.split(/\s+/);
|
|
89
|
+
for (const word of textWords) {
|
|
90
|
+
if (simpleStem(word) === keywordStem)
|
|
91
|
+
return true;
|
|
92
|
+
// Also check if the stem is contained in the word (for compound words)
|
|
93
|
+
if (word.includes(keywordStem) && keywordStem.length >= 3)
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Calculate text similarity using multiple methods
|
|
100
|
+
* Returns weighted average for more robust comparison
|
|
101
|
+
*/
|
|
102
|
+
export function textSimilarity(a, b) {
|
|
103
|
+
// Jaccard on words
|
|
104
|
+
const jaccard = jaccardSimilarity(a, b);
|
|
105
|
+
// Character-level containment
|
|
106
|
+
const aLower = a.toLowerCase();
|
|
107
|
+
const bLower = b.toLowerCase();
|
|
108
|
+
const shorter = aLower.length < bLower.length ? aLower : bLower;
|
|
109
|
+
const longer = aLower.length >= bLower.length ? aLower : bLower;
|
|
110
|
+
const containment = shorter.length > 0 && longer.includes(shorter) ? 0.8 : 0;
|
|
111
|
+
// Weighted combination
|
|
112
|
+
return Math.max(jaccard, containment);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=string-similarity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-similarity.js","sourceRoot":"","sources":["../../src/utils/string-similarity.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "universal-agent-memory",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Universal AI agent memory system - CLAUDE.md templates, memory, worktrees for Claude Code, Factory.AI, VSCode, OpenCode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|