@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.
- package/LICENSE +191 -0
- package/dist/extractor.d.ts +40 -0
- package/dist/extractor.d.ts.map +1 -0
- package/dist/extractor.js +130 -0
- package/dist/extractor.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/partition.d.ts +25 -0
- package/dist/partition.d.ts.map +1 -0
- package/dist/partition.js +104 -0
- package/dist/partition.js.map +1 -0
- package/dist/pattern-detector.d.ts +27 -0
- package/dist/pattern-detector.d.ts.map +1 -0
- package/dist/pattern-detector.js +260 -0
- package/dist/pattern-detector.js.map +1 -0
- package/dist/personality-adapter.d.ts +10 -0
- package/dist/personality-adapter.d.ts.map +1 -0
- package/dist/personality-adapter.js +72 -0
- package/dist/personality-adapter.js.map +1 -0
- package/dist/retriever.d.ts +15 -0
- package/dist/retriever.d.ts.map +1 -0
- package/dist/retriever.js +179 -0
- package/dist/retriever.js.map +1 -0
- package/dist/sentiment.d.ts +7 -0
- package/dist/sentiment.d.ts.map +1 -0
- package/dist/sentiment.js +118 -0
- package/dist/sentiment.js.map +1 -0
- package/dist/store.d.ts +41 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +352 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +80 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +26 -0
- package/src/extractor.ts +212 -0
- package/src/index.ts +22 -0
- package/src/partition.ts +123 -0
- package/src/pattern-detector.ts +304 -0
- package/src/personality-adapter.ts +82 -0
- package/src/retriever.ts +213 -0
- package/src/sentiment.ts +129 -0
- package/src/store.ts +384 -0
- package/src/types.ts +92 -0
- package/tests/extractor.test.ts +247 -0
- package/tests/partition.test.ts +168 -0
- package/tests/pattern-detector.test.ts +150 -0
- package/tests/personality-adapter.test.ts +155 -0
- package/tests/retriever.test.ts +240 -0
- package/tests/sentiment.test.ts +207 -0
- package/tests/store.test.ts +390 -0
- package/tsconfig.json +13 -0
- 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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"}
|
package/dist/store.d.ts
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|