universal-agent-memory 1.0.25 → 1.1.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 +19 -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 +55 -41
- 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 +59 -44
- 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 +11 -0
- package/dist/memory/model-router.d.ts.map +1 -1
- package/dist/memory/model-router.js +32 -0
- 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 +2 -10
- package/dist/memory/semantic-compression.js.map +1 -1
- package/dist/memory/terminal-bench-knowledge.d.ts +1 -0
- package/dist/memory/terminal-bench-knowledge.d.ts.map +1 -1
- package/dist/memory/terminal-bench-knowledge.js +9 -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
|
@@ -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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAS,EAAE,CAAS;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAE7E,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAE1C,OAAO,YAAY,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;SACtD,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,+CAA+C;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEzC,gCAAgC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1D,iEAAiE;IACjE,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAExF,4DAA4D;IAC5D,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAEnE,oCAAoC;IACpC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAElD,4BAA4B;IAC5B,6DAA6D;IAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IACtC,MAAM,aAAa,GAAG,YAAY,GAAG,GAAG,CAAC;IACzC,MAAM,eAAe,GAAG,UAAU,GAAG,GAAG,CAAC;IACzC,MAAM,YAAY,GAAG,OAAO,GAAG,GAAG,CAAC;IAEnC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,aAAa,GAAG,eAAe,GAAG,YAAY,CAAC,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEjC,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAErG,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5C,6CAA6C;YAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBACvE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAe;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAE3C,oBAAoB;IACpB,IAAI,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,gBAAgB;IAChB,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAClD,uEAAuE;QACvE,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACzE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IACjD,mBAAmB;IACnB,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAExC,8BAA8B;IAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,uBAAuB;IACvB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "universal-agent-memory",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.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",
|