@auxiora/memory 1.0.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 (56) hide show
  1. package/LICENSE +191 -0
  2. package/dist/extractor.d.ts +40 -0
  3. package/dist/extractor.d.ts.map +1 -0
  4. package/dist/extractor.js +130 -0
  5. package/dist/extractor.js.map +1 -0
  6. package/dist/index.d.ts +11 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +8 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/partition.d.ts +25 -0
  11. package/dist/partition.d.ts.map +1 -0
  12. package/dist/partition.js +104 -0
  13. package/dist/partition.js.map +1 -0
  14. package/dist/pattern-detector.d.ts +27 -0
  15. package/dist/pattern-detector.d.ts.map +1 -0
  16. package/dist/pattern-detector.js +260 -0
  17. package/dist/pattern-detector.js.map +1 -0
  18. package/dist/personality-adapter.d.ts +10 -0
  19. package/dist/personality-adapter.d.ts.map +1 -0
  20. package/dist/personality-adapter.js +72 -0
  21. package/dist/personality-adapter.js.map +1 -0
  22. package/dist/retriever.d.ts +15 -0
  23. package/dist/retriever.d.ts.map +1 -0
  24. package/dist/retriever.js +179 -0
  25. package/dist/retriever.js.map +1 -0
  26. package/dist/sentiment.d.ts +7 -0
  27. package/dist/sentiment.d.ts.map +1 -0
  28. package/dist/sentiment.js +118 -0
  29. package/dist/sentiment.js.map +1 -0
  30. package/dist/store.d.ts +41 -0
  31. package/dist/store.d.ts.map +1 -0
  32. package/dist/store.js +352 -0
  33. package/dist/store.js.map +1 -0
  34. package/dist/types.d.ts +80 -0
  35. package/dist/types.d.ts.map +1 -0
  36. package/dist/types.js +2 -0
  37. package/dist/types.js.map +1 -0
  38. package/package.json +26 -0
  39. package/src/extractor.ts +212 -0
  40. package/src/index.ts +22 -0
  41. package/src/partition.ts +123 -0
  42. package/src/pattern-detector.ts +304 -0
  43. package/src/personality-adapter.ts +82 -0
  44. package/src/retriever.ts +213 -0
  45. package/src/sentiment.ts +129 -0
  46. package/src/store.ts +384 -0
  47. package/src/types.ts +92 -0
  48. package/tests/extractor.test.ts +247 -0
  49. package/tests/partition.test.ts +168 -0
  50. package/tests/pattern-detector.test.ts +150 -0
  51. package/tests/personality-adapter.test.ts +155 -0
  52. package/tests/retriever.test.ts +240 -0
  53. package/tests/sentiment.test.ts +207 -0
  54. package/tests/store.test.ts +390 -0
  55. package/tsconfig.json +13 -0
  56. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,118 @@
1
+ const POSITIVE_WORDS = new Set([
2
+ 'good', 'great', 'awesome', 'amazing', 'excellent', 'fantastic', 'wonderful',
3
+ 'love', 'happy', 'glad', 'pleased', 'perfect', 'beautiful', 'brilliant',
4
+ 'thanks', 'thank', 'appreciate', 'helpful', 'nice', 'cool', 'best',
5
+ 'excited', 'enjoy', 'impressive', 'incredible', 'outstanding', 'superb',
6
+ 'delighted', 'thrilled', 'grateful', 'marvelous', 'terrific', 'splendid',
7
+ 'like', 'yes', 'agree', 'right', 'correct', 'exactly', 'absolutely',
8
+ 'well', 'fine', 'okay', 'sure', 'works', 'solved', 'fixed', 'done',
9
+ ]);
10
+ const NEGATIVE_WORDS = new Set([
11
+ 'bad', 'terrible', 'awful', 'horrible', 'wrong', 'broken', 'error',
12
+ 'fail', 'failed', 'failure', 'bug', 'crash', 'issue', 'problem',
13
+ 'hate', 'angry', 'frustrated', 'annoyed', 'disappointed', 'confused',
14
+ 'ugly', 'slow', 'stuck', 'impossible', 'useless', 'waste', 'stupid',
15
+ 'worse', 'worst', 'never', 'nothing', 'nobody', 'nowhere', 'ugh',
16
+ 'damn', 'crap', 'sucks', 'annoying', 'painful', 'difficult', 'hard',
17
+ 'unfortunately', 'sadly', 'regret', 'sorry', 'no', 'not', 'cannot',
18
+ ]);
19
+ const POSITIVE_EMOJI_PATTERNS = /[:\)]|:\)|:D|;\)|<3|❤|😊|😄|👍|🎉|✨|🙌|💯|🔥|⭐|😁|🥳|💪/g;
20
+ const NEGATIVE_EMOJI_PATTERNS = /[:\(]|:\(|:\/|😢|😡|😤|👎|💔|😞|😠|🤬|😭|😩|😫/g;
21
+ export class SentimentAnalyzer {
22
+ analyzeSentiment(text) {
23
+ const lower = text.toLowerCase();
24
+ const words = lower.replace(/[^a-z0-9\s'-]/g, '').split(/\s+/).filter(Boolean);
25
+ let positiveScore = 0;
26
+ let negativeScore = 0;
27
+ const matchedKeywords = [];
28
+ // Word-based scoring
29
+ for (const word of words) {
30
+ if (POSITIVE_WORDS.has(word)) {
31
+ positiveScore += 1;
32
+ matchedKeywords.push(word);
33
+ }
34
+ if (NEGATIVE_WORDS.has(word)) {
35
+ negativeScore += 1;
36
+ matchedKeywords.push(word);
37
+ }
38
+ }
39
+ // Emoji-based scoring
40
+ const positiveEmojis = text.match(POSITIVE_EMOJI_PATTERNS);
41
+ const negativeEmojis = text.match(NEGATIVE_EMOJI_PATTERNS);
42
+ if (positiveEmojis)
43
+ positiveScore += positiveEmojis.length * 1.5;
44
+ if (negativeEmojis)
45
+ negativeScore += negativeEmojis.length * 1.5;
46
+ // Punctuation patterns
47
+ const exclamationCount = (text.match(/!/g) || []).length;
48
+ const questionCount = (text.match(/\?/g) || []).length;
49
+ const capsRatio = this.getCapsRatio(text);
50
+ // Exclamation marks boost existing sentiment
51
+ if (exclamationCount > 0) {
52
+ if (positiveScore > negativeScore) {
53
+ positiveScore += exclamationCount * 0.3;
54
+ }
55
+ else if (negativeScore > positiveScore) {
56
+ negativeScore += exclamationCount * 0.3;
57
+ }
58
+ }
59
+ // ALL CAPS can indicate strong sentiment (frustration or excitement)
60
+ if (capsRatio > 0.5 && words.length > 2) {
61
+ if (negativeScore > positiveScore) {
62
+ negativeScore += 1;
63
+ }
64
+ else if (positiveScore > negativeScore) {
65
+ positiveScore += 1;
66
+ }
67
+ }
68
+ // Negation handling: "not good", "don't like", etc.
69
+ const negationCount = this.countNegations(lower);
70
+ if (negationCount > 0 && positiveScore > negativeScore) {
71
+ // Negation flips positive sentiment partially
72
+ const flip = Math.min(negationCount, positiveScore);
73
+ positiveScore -= flip;
74
+ negativeScore += flip * 0.5;
75
+ }
76
+ const totalScore = positiveScore + negativeScore;
77
+ let sentiment;
78
+ let confidence;
79
+ if (totalScore === 0) {
80
+ sentiment = 'neutral';
81
+ confidence = 0.5;
82
+ }
83
+ else {
84
+ const ratio = positiveScore / totalScore;
85
+ if (ratio > 0.6) {
86
+ sentiment = 'positive';
87
+ confidence = Math.min(0.4 + (ratio - 0.5) * 1.2, 0.95);
88
+ }
89
+ else if (ratio < 0.4) {
90
+ sentiment = 'negative';
91
+ confidence = Math.min(0.4 + (0.5 - ratio) * 1.2, 0.95);
92
+ }
93
+ else {
94
+ sentiment = 'neutral';
95
+ confidence = Math.max(0.3, 0.5 - Math.abs(0.5 - ratio) * 2);
96
+ }
97
+ // Boost confidence with more evidence
98
+ if (totalScore >= 3) {
99
+ confidence = Math.min(confidence + 0.1, 0.95);
100
+ }
101
+ }
102
+ // Deduplicate keywords
103
+ const uniqueKeywords = [...new Set(matchedKeywords)];
104
+ return { sentiment, confidence, keywords: uniqueKeywords };
105
+ }
106
+ getCapsRatio(text) {
107
+ const letters = text.replace(/[^a-zA-Z]/g, '');
108
+ if (letters.length === 0)
109
+ return 0;
110
+ const upperCount = (text.match(/[A-Z]/g) || []).length;
111
+ return upperCount / letters.length;
112
+ }
113
+ countNegations(text) {
114
+ const negations = text.match(/\b(not|no|never|don't|doesn't|didn't|won't|wouldn't|can't|cannot|isn't|aren't|wasn't|weren't)\b/g);
115
+ return negations ? negations.length : 0;
116
+ }
117
+ }
118
+ //# sourceMappingURL=sentiment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentiment.js","sourceRoot":"","sources":["../src/sentiment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { MemoryEntry, MemoryCategory, LivingMemoryState } from './types.js';
2
+ export declare class MemoryStore {
3
+ private filePath;
4
+ private maxEntries;
5
+ constructor(options?: {
6
+ dir?: string;
7
+ maxEntries?: number;
8
+ });
9
+ add(content: string, category: MemoryCategory, source: MemoryEntry['source'], extra?: Partial<Pick<MemoryEntry, 'importance' | 'confidence' | 'sentiment' | 'expiresAt' | 'encrypted' | 'relatedMemories' | 'partitionId' | 'sourceUserId'>>): Promise<MemoryEntry>;
10
+ remove(id: string): Promise<boolean>;
11
+ update(id: string, updates: Partial<Pick<MemoryEntry, 'content' | 'category' | 'importance' | 'confidence' | 'sentiment' | 'expiresAt' | 'encrypted'>>): Promise<MemoryEntry | undefined>;
12
+ getAll(): Promise<MemoryEntry[]>;
13
+ search(query: string): Promise<MemoryEntry[]>;
14
+ getByCategory(category: MemoryCategory, partitionId?: string): Promise<MemoryEntry[]>;
15
+ getByPartition(partitionId: string): Promise<MemoryEntry[]>;
16
+ getByPartitions(partitionIds: string[]): Promise<MemoryEntry[]>;
17
+ getExpired(): Promise<MemoryEntry[]>;
18
+ cleanExpired(): Promise<number>;
19
+ merge(id1: string, id2: string, mergedContent: string): Promise<MemoryEntry>;
20
+ getStats(): Promise<LivingMemoryState['stats']>;
21
+ exportAll(): Promise<{
22
+ version: string;
23
+ memories: MemoryEntry[];
24
+ exportedAt: number;
25
+ }>;
26
+ importAll(data: {
27
+ memories: MemoryEntry[];
28
+ }): Promise<{
29
+ imported: number;
30
+ skipped: number;
31
+ }>;
32
+ setImportance(id: string, importance: number): Promise<void>;
33
+ linkMemories(id1: string, id2: string): Promise<void>;
34
+ extractTags(text: string): string[];
35
+ private findOverlap;
36
+ /** Apply defaults for new fields when loading legacy entries */
37
+ private applyDefaults;
38
+ private readFile;
39
+ private writeFile;
40
+ }
41
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAmB,MAAM,YAAY,CAAC;AAIlG,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAMrD,GAAG,CACP,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC7B,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,iBAAiB,GAAG,aAAa,GAAG,cAAc,CAAC,CAAC,GAC7J,OAAO,CAAC,WAAW,CAAC;IAmDjB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAqBzL,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAIhC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA2B7C,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAQrF,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAK3D,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAM/D,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAMpC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAa/B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsC5E,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAyC/C,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAStF,SAAS,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA4B5F,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5D,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAwBnC,OAAO,CAAC,WAAW;IAWnB,gEAAgE;IAChE,OAAO,CAAC,aAAa;YAWP,QAAQ;YAcR,SAAS;CAKxB"}
package/dist/store.js ADDED
@@ -0,0 +1,352 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import * as crypto from 'node:crypto';
4
+ import { getLogger } from '@auxiora/logger';
5
+ import { audit } from '@auxiora/audit';
6
+ import { getMemoryDir } from '@auxiora/core';
7
+ const logger = getLogger('memory:store');
8
+ export class MemoryStore {
9
+ filePath;
10
+ maxEntries;
11
+ constructor(options) {
12
+ const dir = options?.dir ?? getMemoryDir();
13
+ this.filePath = path.join(dir, 'memories.json');
14
+ this.maxEntries = options?.maxEntries ?? 1000;
15
+ }
16
+ async add(content, category, source, extra) {
17
+ const memories = await this.readFile();
18
+ const tags = this.extractTags(content);
19
+ // Dedup: check for >50% tag overlap with existing entries
20
+ const existing = this.findOverlap(memories, tags);
21
+ if (existing) {
22
+ existing.content = content;
23
+ existing.updatedAt = Date.now();
24
+ existing.tags = tags;
25
+ if (extra?.importance !== undefined)
26
+ existing.importance = extra.importance;
27
+ if (extra?.confidence !== undefined)
28
+ existing.confidence = extra.confidence;
29
+ if (extra?.sentiment !== undefined)
30
+ existing.sentiment = extra.sentiment;
31
+ await this.writeFile(memories);
32
+ logger.debug('Updated existing memory (dedup)', { id: existing.id });
33
+ return existing;
34
+ }
35
+ const entry = {
36
+ id: `mem-${crypto.randomUUID().slice(0, 8)}`,
37
+ content,
38
+ category,
39
+ source,
40
+ createdAt: Date.now(),
41
+ updatedAt: Date.now(),
42
+ accessCount: 0,
43
+ tags,
44
+ importance: extra?.importance ?? 0.5,
45
+ confidence: extra?.confidence ?? 0.8,
46
+ sentiment: extra?.sentiment ?? 'neutral',
47
+ encrypted: extra?.encrypted ?? false,
48
+ partitionId: extra?.partitionId ?? 'global',
49
+ ...(extra?.sourceUserId !== undefined ? { sourceUserId: extra.sourceUserId } : {}),
50
+ ...(extra?.expiresAt !== undefined ? { expiresAt: extra.expiresAt } : {}),
51
+ ...(extra?.relatedMemories !== undefined ? { relatedMemories: extra.relatedMemories } : {}),
52
+ };
53
+ memories.push(entry);
54
+ // Enforce max entries: remove oldest by updatedAt
55
+ if (memories.length > this.maxEntries) {
56
+ memories.sort((a, b) => b.updatedAt - a.updatedAt);
57
+ memories.length = this.maxEntries;
58
+ }
59
+ await this.writeFile(memories);
60
+ void audit('memory.saved', { id: entry.id, category, source });
61
+ logger.debug('Saved memory', { id: entry.id, category });
62
+ return entry;
63
+ }
64
+ async remove(id) {
65
+ const memories = await this.readFile();
66
+ const filtered = memories.filter(m => m.id !== id);
67
+ if (filtered.length === memories.length)
68
+ return false;
69
+ await this.writeFile(filtered);
70
+ void audit('memory.deleted', { id });
71
+ logger.debug('Removed memory', { id });
72
+ return true;
73
+ }
74
+ async update(id, updates) {
75
+ const memories = await this.readFile();
76
+ const entry = memories.find(m => m.id === id);
77
+ if (!entry)
78
+ return undefined;
79
+ if (updates.content !== undefined) {
80
+ entry.content = updates.content;
81
+ entry.tags = this.extractTags(updates.content);
82
+ }
83
+ if (updates.category !== undefined)
84
+ entry.category = updates.category;
85
+ if (updates.importance !== undefined)
86
+ entry.importance = updates.importance;
87
+ if (updates.confidence !== undefined)
88
+ entry.confidence = updates.confidence;
89
+ if (updates.sentiment !== undefined)
90
+ entry.sentiment = updates.sentiment;
91
+ if (updates.expiresAt !== undefined)
92
+ entry.expiresAt = updates.expiresAt;
93
+ if (updates.encrypted !== undefined)
94
+ entry.encrypted = updates.encrypted;
95
+ entry.updatedAt = Date.now();
96
+ await this.writeFile(memories);
97
+ return entry;
98
+ }
99
+ async getAll() {
100
+ return this.readFile();
101
+ }
102
+ async search(query) {
103
+ const memories = await this.readFile();
104
+ const queryTags = this.extractTags(query);
105
+ if (queryTags.length === 0)
106
+ return memories;
107
+ // Score by tag overlap
108
+ const scored = memories.map(m => {
109
+ const overlap = m.tags.filter(t => queryTags.includes(t)).length;
110
+ return { entry: m, score: overlap };
111
+ });
112
+ const results = scored
113
+ .filter(s => s.score > 0)
114
+ .sort((a, b) => b.score - a.score)
115
+ .map(s => {
116
+ s.entry.accessCount++;
117
+ return s.entry;
118
+ });
119
+ // Fix: persist accessCount increments
120
+ if (results.length > 0) {
121
+ await this.writeFile(memories);
122
+ }
123
+ return results;
124
+ }
125
+ async getByCategory(category, partitionId) {
126
+ const memories = await this.readFile();
127
+ return memories.filter(m => m.category === category &&
128
+ (partitionId === undefined || (m.partitionId ?? 'global') === partitionId));
129
+ }
130
+ async getByPartition(partitionId) {
131
+ const memories = await this.readFile();
132
+ return memories.filter(m => (m.partitionId ?? 'global') === partitionId);
133
+ }
134
+ async getByPartitions(partitionIds) {
135
+ const memories = await this.readFile();
136
+ const idSet = new Set(partitionIds);
137
+ return memories.filter(m => idSet.has(m.partitionId ?? 'global'));
138
+ }
139
+ async getExpired() {
140
+ const memories = await this.readFile();
141
+ const now = Date.now();
142
+ return memories.filter(m => m.expiresAt !== undefined && m.expiresAt <= now);
143
+ }
144
+ async cleanExpired() {
145
+ const memories = await this.readFile();
146
+ const now = Date.now();
147
+ const before = memories.length;
148
+ const kept = memories.filter(m => m.expiresAt === undefined || m.expiresAt > now);
149
+ const removed = before - kept.length;
150
+ if (removed > 0) {
151
+ await this.writeFile(kept);
152
+ logger.debug('Cleaned expired memories', { removed });
153
+ }
154
+ return removed;
155
+ }
156
+ async merge(id1, id2, mergedContent) {
157
+ const memories = await this.readFile();
158
+ const entry1 = memories.find(m => m.id === id1);
159
+ const entry2 = memories.find(m => m.id === id2);
160
+ if (!entry1)
161
+ throw new Error(`Memory not found: ${id1}`);
162
+ if (!entry2)
163
+ throw new Error(`Memory not found: ${id2}`);
164
+ // Keep the older entry's id, merge fields
165
+ const merged = {
166
+ id: entry1.id,
167
+ content: mergedContent,
168
+ category: entry1.category,
169
+ source: entry1.source,
170
+ createdAt: Math.min(entry1.createdAt, entry2.createdAt),
171
+ updatedAt: Date.now(),
172
+ accessCount: entry1.accessCount + entry2.accessCount,
173
+ tags: this.extractTags(mergedContent),
174
+ importance: Math.max(entry1.importance, entry2.importance),
175
+ confidence: Math.max(entry1.confidence, entry2.confidence),
176
+ sentiment: entry1.sentiment,
177
+ encrypted: entry1.encrypted || entry2.encrypted,
178
+ relatedMemories: [
179
+ ...new Set([
180
+ ...(entry1.relatedMemories ?? []),
181
+ ...(entry2.relatedMemories ?? []),
182
+ ]),
183
+ ],
184
+ };
185
+ // Remove both originals and add merged
186
+ const filtered = memories.filter(m => m.id !== id1 && m.id !== id2);
187
+ filtered.push(merged);
188
+ await this.writeFile(filtered);
189
+ logger.debug('Merged memories', { id1, id2, mergedId: merged.id });
190
+ return merged;
191
+ }
192
+ async getStats() {
193
+ const memories = await this.readFile();
194
+ if (memories.length === 0) {
195
+ return {
196
+ totalMemories: 0,
197
+ oldestMemory: 0,
198
+ newestMemory: 0,
199
+ averageImportance: 0,
200
+ topTags: [],
201
+ };
202
+ }
203
+ const tagCounts = new Map();
204
+ let totalImportance = 0;
205
+ let oldest = Infinity;
206
+ let newest = 0;
207
+ for (const m of memories) {
208
+ totalImportance += m.importance;
209
+ if (m.createdAt < oldest)
210
+ oldest = m.createdAt;
211
+ if (m.createdAt > newest)
212
+ newest = m.createdAt;
213
+ for (const tag of m.tags) {
214
+ tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
215
+ }
216
+ }
217
+ const topTags = Array.from(tagCounts.entries())
218
+ .sort((a, b) => b[1] - a[1])
219
+ .slice(0, 10)
220
+ .map(([tag, count]) => ({ tag, count }));
221
+ return {
222
+ totalMemories: memories.length,
223
+ oldestMemory: oldest,
224
+ newestMemory: newest,
225
+ averageImportance: totalImportance / memories.length,
226
+ topTags,
227
+ };
228
+ }
229
+ async exportAll() {
230
+ const memories = await this.readFile();
231
+ return {
232
+ version: '1.0',
233
+ memories,
234
+ exportedAt: Date.now(),
235
+ };
236
+ }
237
+ async importAll(data) {
238
+ const existing = await this.readFile();
239
+ const existingIds = new Set(existing.map(m => m.id));
240
+ let imported = 0;
241
+ let skipped = 0;
242
+ for (const entry of data.memories) {
243
+ if (existingIds.has(entry.id)) {
244
+ skipped++;
245
+ continue;
246
+ }
247
+ // Ensure new fields have defaults for legacy imports
248
+ existing.push(this.applyDefaults(entry));
249
+ existingIds.add(entry.id);
250
+ imported++;
251
+ }
252
+ // Enforce max entries
253
+ if (existing.length > this.maxEntries) {
254
+ existing.sort((a, b) => b.updatedAt - a.updatedAt);
255
+ existing.length = this.maxEntries;
256
+ }
257
+ await this.writeFile(existing);
258
+ logger.debug('Imported memories', { imported, skipped });
259
+ return { imported, skipped };
260
+ }
261
+ async setImportance(id, importance) {
262
+ if (importance < 0 || importance > 1) {
263
+ throw new Error('Importance must be between 0 and 1');
264
+ }
265
+ const result = await this.update(id, { importance });
266
+ if (!result)
267
+ throw new Error(`Memory not found: ${id}`);
268
+ }
269
+ async linkMemories(id1, id2) {
270
+ const memories = await this.readFile();
271
+ const entry1 = memories.find(m => m.id === id1);
272
+ const entry2 = memories.find(m => m.id === id2);
273
+ if (!entry1)
274
+ throw new Error(`Memory not found: ${id1}`);
275
+ if (!entry2)
276
+ throw new Error(`Memory not found: ${id2}`);
277
+ if (!entry1.relatedMemories)
278
+ entry1.relatedMemories = [];
279
+ if (!entry2.relatedMemories)
280
+ entry2.relatedMemories = [];
281
+ if (!entry1.relatedMemories.includes(id2))
282
+ entry1.relatedMemories.push(id2);
283
+ if (!entry2.relatedMemories.includes(id1))
284
+ entry2.relatedMemories.push(id1);
285
+ await this.writeFile(memories);
286
+ logger.debug('Linked memories', { id1, id2 });
287
+ }
288
+ extractTags(text) {
289
+ const stopWords = new Set([
290
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
291
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
292
+ 'should', 'may', 'might', 'can', 'shall', 'to', 'of', 'in', 'for',
293
+ 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',
294
+ 'before', 'after', 'above', 'below', 'between', 'and', 'but', 'or',
295
+ 'nor', 'not', 'so', 'yet', 'both', 'either', 'neither', 'each',
296
+ 'every', 'all', 'any', 'few', 'more', 'most', 'other', 'some',
297
+ 'such', 'no', 'only', 'own', 'same', 'than', 'too', 'very',
298
+ 'just', 'about', 'also', 'that', 'this', 'it', 'its', 'i', 'my',
299
+ 'me', 'we', 'our', 'you', 'your', 'he', 'she', 'they', 'them',
300
+ 'their', 'what', 'which', 'who', 'when', 'where', 'how', 'like',
301
+ 'user', 'prefers', 'uses', 'wants', 'likes',
302
+ ]);
303
+ return text
304
+ .toLowerCase()
305
+ .replace(/[^a-z0-9\s-]/g, '')
306
+ .split(/\s+/)
307
+ .filter(w => w.length > 2 && !stopWords.has(w))
308
+ .filter((w, i, arr) => arr.indexOf(w) === i); // unique
309
+ }
310
+ findOverlap(memories, tags) {
311
+ if (tags.length === 0)
312
+ return undefined;
313
+ for (const m of memories) {
314
+ const overlap = m.tags.filter(t => tags.includes(t)).length;
315
+ const ratio = overlap / Math.max(m.tags.length, tags.length);
316
+ if (ratio > 0.5)
317
+ return m;
318
+ }
319
+ return undefined;
320
+ }
321
+ /** Apply defaults for new fields when loading legacy entries */
322
+ applyDefaults(entry) {
323
+ return {
324
+ ...entry,
325
+ importance: entry.importance ?? 0.5,
326
+ confidence: entry.confidence ?? 0.8,
327
+ sentiment: entry.sentiment ?? 'neutral',
328
+ encrypted: entry.encrypted ?? false,
329
+ partitionId: entry.partitionId ?? 'global',
330
+ };
331
+ }
332
+ async readFile() {
333
+ try {
334
+ const content = await fs.readFile(this.filePath, 'utf-8');
335
+ const raw = JSON.parse(content);
336
+ // Apply defaults for legacy entries that lack new fields
337
+ return raw.map(e => this.applyDefaults(e));
338
+ }
339
+ catch (error) {
340
+ if (error.code === 'ENOENT') {
341
+ return [];
342
+ }
343
+ throw error;
344
+ }
345
+ }
346
+ async writeFile(memories) {
347
+ const dir = path.dirname(this.filePath);
348
+ await fs.mkdir(dir, { recursive: true });
349
+ await fs.writeFile(this.filePath, JSON.stringify(memories, null, 2), 'utf-8');
350
+ }
351
+ }
352
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export type MemoryCategory = 'preference' | 'fact' | 'context' | 'relationship' | 'pattern' | 'personality';
2
+ export type MemorySource = 'extracted' | 'explicit' | 'observed';
3
+ export interface MemoryEntry {
4
+ id: string;
5
+ content: string;
6
+ category: MemoryCategory;
7
+ source: MemorySource;
8
+ createdAt: number;
9
+ updatedAt: number;
10
+ accessCount: number;
11
+ tags: string[];
12
+ importance: number;
13
+ confidence: number;
14
+ expiresAt?: number;
15
+ relatedMemories?: string[];
16
+ sentiment?: 'positive' | 'negative' | 'neutral';
17
+ encrypted?: boolean;
18
+ /** Partition this memory belongs to. Defaults to 'global'. */
19
+ partitionId?: string;
20
+ /** User ID that created this memory. */
21
+ sourceUserId?: string;
22
+ }
23
+ /** A memory partition for per-user or shared storage. */
24
+ export interface MemoryPartition {
25
+ id: string;
26
+ name: string;
27
+ type: 'private' | 'shared' | 'global';
28
+ ownerId?: string;
29
+ memberIds?: string[];
30
+ createdAt: number;
31
+ }
32
+ export interface RelationshipMemory {
33
+ type: 'inside_joke' | 'shared_experience' | 'milestone' | 'callback';
34
+ originalContext?: string;
35
+ useCount: number;
36
+ lastUsed: number;
37
+ }
38
+ export interface PatternMemory {
39
+ type: 'communication' | 'schedule' | 'topic' | 'mood';
40
+ pattern: string;
41
+ observations: number;
42
+ confidence: number;
43
+ examples?: string[];
44
+ }
45
+ export interface PersonalityAdaptation {
46
+ trait: string;
47
+ adjustment: number;
48
+ reason: string;
49
+ signalCount: number;
50
+ }
51
+ export type SentimentLabel = 'positive' | 'negative' | 'neutral';
52
+ export interface SentimentResult {
53
+ sentiment: SentimentLabel;
54
+ confidence: number;
55
+ keywords: string[];
56
+ }
57
+ export interface SentimentSnapshot {
58
+ sentiment: SentimentLabel;
59
+ confidence: number;
60
+ timestamp: number;
61
+ hour: number;
62
+ dayOfWeek: number;
63
+ }
64
+ export interface LivingMemoryState {
65
+ facts: MemoryEntry[];
66
+ relationships: MemoryEntry[];
67
+ patterns: MemoryEntry[];
68
+ adaptations: PersonalityAdaptation[];
69
+ stats: {
70
+ totalMemories: number;
71
+ oldestMemory: number;
72
+ newestMemory: number;
73
+ averageImportance: number;
74
+ topTags: Array<{
75
+ tag: string;
76
+ count: number;
77
+ }>;
78
+ };
79
+ }
80
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}