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.
Files changed (39) hide show
  1. package/dist/cli/generate.js +119 -14
  2. package/dist/cli/generate.js.map +1 -1
  3. package/dist/generators/claude-md.js +19 -4
  4. package/dist/generators/claude-md.js.map +1 -1
  5. package/dist/index.d.ts +4 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +5 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/memory/adaptive-context.d.ts +3 -1
  10. package/dist/memory/adaptive-context.d.ts.map +1 -1
  11. package/dist/memory/adaptive-context.js +55 -41
  12. package/dist/memory/adaptive-context.js.map +1 -1
  13. package/dist/memory/context-compressor.d.ts +3 -1
  14. package/dist/memory/context-compressor.d.ts.map +1 -1
  15. package/dist/memory/context-compressor.js +21 -12
  16. package/dist/memory/context-compressor.js.map +1 -1
  17. package/dist/memory/dynamic-retrieval.d.ts.map +1 -1
  18. package/dist/memory/dynamic-retrieval.js +59 -44
  19. package/dist/memory/dynamic-retrieval.js.map +1 -1
  20. package/dist/memory/hierarchical-memory.d.ts +15 -2
  21. package/dist/memory/hierarchical-memory.d.ts.map +1 -1
  22. package/dist/memory/hierarchical-memory.js +118 -8
  23. package/dist/memory/hierarchical-memory.js.map +1 -1
  24. package/dist/memory/model-router.d.ts +11 -0
  25. package/dist/memory/model-router.d.ts.map +1 -1
  26. package/dist/memory/model-router.js +32 -0
  27. package/dist/memory/model-router.js.map +1 -1
  28. package/dist/memory/semantic-compression.d.ts.map +1 -1
  29. package/dist/memory/semantic-compression.js +2 -10
  30. package/dist/memory/semantic-compression.js.map +1 -1
  31. package/dist/memory/terminal-bench-knowledge.d.ts +1 -0
  32. package/dist/memory/terminal-bench-knowledge.d.ts.map +1 -1
  33. package/dist/memory/terminal-bench-knowledge.js +9 -3
  34. package/dist/memory/terminal-bench-knowledge.js.map +1 -1
  35. package/dist/utils/string-similarity.d.ts +37 -0
  36. package/dist/utils/string-similarity.d.ts.map +1 -0
  37. package/dist/utils/string-similarity.js +114 -0
  38. package/dist/utils/string-similarity.js.map +1 -0
  39. 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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-agent-memory",
3
- "version": "1.0.25",
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",