@getanima/core 0.3.3 → 0.5.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/episodes.d.ts +109 -0
- package/dist/episodes.d.ts.map +1 -0
- package/dist/episodes.js +589 -0
- package/dist/episodes.js.map +1 -0
- package/dist/esm/episodes.js +585 -0
- package/dist/esm/episodes.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/state.js +595 -0
- package/dist/esm/state.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/state.d.ts +178 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +599 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +162 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/episodes.js
ADDED
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Episodic Memory Engine — structured records of experiences.
|
|
4
|
+
*
|
|
5
|
+
* Unlike flat memories, episodes capture the full context of an experience:
|
|
6
|
+
* who was involved, what happened, how important it was, what was learned,
|
|
7
|
+
* and how it connects to other memories, opinions, and knowledge.
|
|
8
|
+
*
|
|
9
|
+
* Episodes decay based on importance and emotional weight.
|
|
10
|
+
* High-importance episodes get promoted to semantic knowledge automatically.
|
|
11
|
+
*
|
|
12
|
+
* Zero external dependencies. File-based persistence.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.EpisodicMemory = void 0;
|
|
16
|
+
const utils_1 = require("./utils");
|
|
17
|
+
const validation_1 = require("./validation");
|
|
18
|
+
const path_1 = require("path");
|
|
19
|
+
/** Limits specific to episodes */
|
|
20
|
+
const EPISODE_LIMITS = {
|
|
21
|
+
MAX_EPISODES: 50_000,
|
|
22
|
+
MAX_TITLE_LENGTH: 500,
|
|
23
|
+
MAX_SUMMARY_LENGTH: 50_000,
|
|
24
|
+
MAX_LESSONS: 50,
|
|
25
|
+
MAX_LESSON_LENGTH: 2_000,
|
|
26
|
+
MAX_PARTICIPANTS: 100,
|
|
27
|
+
MAX_CONNECTIONS: 200,
|
|
28
|
+
MAX_KNOWLEDGE_ENTRIES: 50_000,
|
|
29
|
+
MAX_INSIGHT_LENGTH: 10_000,
|
|
30
|
+
MAX_TOPIC_LENGTH: 500,
|
|
31
|
+
MAX_SOURCE_REFS: 50,
|
|
32
|
+
};
|
|
33
|
+
class EpisodicMemory {
|
|
34
|
+
storagePath;
|
|
35
|
+
episodesDir;
|
|
36
|
+
knowledgeDir;
|
|
37
|
+
episodes = [];
|
|
38
|
+
knowledge = [];
|
|
39
|
+
loaded = false;
|
|
40
|
+
knowledgeLoaded = false;
|
|
41
|
+
constructor(storagePath) {
|
|
42
|
+
this.storagePath = (0, validation_1.validateStoragePath)(storagePath);
|
|
43
|
+
this.episodesDir = (0, path_1.join)(this.storagePath, 'memory', 'episodes');
|
|
44
|
+
this.knowledgeDir = (0, path_1.join)(this.storagePath, 'memory', 'knowledge');
|
|
45
|
+
}
|
|
46
|
+
// ============ EPISODES: Record ============
|
|
47
|
+
/**
|
|
48
|
+
* Record a new episode — a structured experience.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* await episodes.record({
|
|
53
|
+
* title: 'Customer escalation resolved',
|
|
54
|
+
* summary: 'User was frustrated about billing. De-escalated with empathy first.',
|
|
55
|
+
* emotionalWeight: 0.7,
|
|
56
|
+
* participants: ['user-123'],
|
|
57
|
+
* tags: ['customer-service', 'conflict'],
|
|
58
|
+
* lessons: ['Empathy before solutions works better than jumping to fixes'],
|
|
59
|
+
* });
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
async record(input) {
|
|
63
|
+
await this.load();
|
|
64
|
+
// Validate all inputs
|
|
65
|
+
const title = (0, validation_1.validateString)(input.title, 'title', { maxLength: EPISODE_LIMITS.MAX_TITLE_LENGTH });
|
|
66
|
+
const summary = (0, validation_1.validateString)(input.summary, 'summary', { maxLength: EPISODE_LIMITS.MAX_SUMMARY_LENGTH });
|
|
67
|
+
const emotionalWeight = input.emotionalWeight !== undefined
|
|
68
|
+
? (0, validation_1.validateConfidence)(input.emotionalWeight, 'emotionalWeight')
|
|
69
|
+
: 0.5;
|
|
70
|
+
const participants = input.participants
|
|
71
|
+
? (0, validation_1.validateStringArray)(input.participants, 'participants', {
|
|
72
|
+
maxItems: EPISODE_LIMITS.MAX_PARTICIPANTS,
|
|
73
|
+
maxItemLength: validation_1.LIMITS.MAX_NAME_LENGTH,
|
|
74
|
+
})
|
|
75
|
+
: [];
|
|
76
|
+
const tags = input.tags
|
|
77
|
+
? (0, validation_1.validateStringArray)(input.tags, 'tags', {
|
|
78
|
+
maxItems: validation_1.LIMITS.MAX_TAGS,
|
|
79
|
+
maxItemLength: validation_1.LIMITS.MAX_TAG_LENGTH,
|
|
80
|
+
})
|
|
81
|
+
: [];
|
|
82
|
+
const lessons = input.lessons
|
|
83
|
+
? (0, validation_1.validateStringArray)(input.lessons, 'lessons', {
|
|
84
|
+
maxItems: EPISODE_LIMITS.MAX_LESSONS,
|
|
85
|
+
maxItemLength: EPISODE_LIMITS.MAX_LESSON_LENGTH,
|
|
86
|
+
})
|
|
87
|
+
: [];
|
|
88
|
+
const connections = input.connections
|
|
89
|
+
? this.validateConnections(input.connections)
|
|
90
|
+
: { episodeIds: [], opinionIds: [], memoryIds: [] };
|
|
91
|
+
// Enforce episode limit
|
|
92
|
+
if (this.episodes.length >= EPISODE_LIMITS.MAX_EPISODES) {
|
|
93
|
+
// Auto-archive lowest importance episodes
|
|
94
|
+
const archivable = this.episodes
|
|
95
|
+
.filter(e => !e.archived && e.importance < 0.3)
|
|
96
|
+
.sort((a, b) => a.importance - b.importance);
|
|
97
|
+
if (archivable.length > 0) {
|
|
98
|
+
archivable[0].archived = true;
|
|
99
|
+
archivable[0].archivedAt = (0, utils_1.now)();
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
throw new validation_1.AnimaValidationError('episodes', `maximum of ${EPISODE_LIMITS.MAX_EPISODES} episodes reached`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const episode = {
|
|
106
|
+
id: `ep-${(0, utils_1.uid)()}`,
|
|
107
|
+
title,
|
|
108
|
+
summary,
|
|
109
|
+
timestamp: input.timestamp || (0, utils_1.now)(),
|
|
110
|
+
emotionalWeight,
|
|
111
|
+
importance: this.calculateImportance(emotionalWeight, lessons.length, connections, participants.length),
|
|
112
|
+
participants,
|
|
113
|
+
tags,
|
|
114
|
+
lessons,
|
|
115
|
+
connections,
|
|
116
|
+
accessCount: 0,
|
|
117
|
+
archived: false,
|
|
118
|
+
createdAt: (0, utils_1.now)(),
|
|
119
|
+
updatedAt: (0, utils_1.now)(),
|
|
120
|
+
};
|
|
121
|
+
this.episodes.push(episode);
|
|
122
|
+
await this.save();
|
|
123
|
+
// Auto-extract lessons to knowledge if episode is important enough
|
|
124
|
+
if (episode.importance >= 0.6 && lessons.length > 0) {
|
|
125
|
+
for (const lesson of lessons) {
|
|
126
|
+
await this.learn({
|
|
127
|
+
topic: this.extractTopicFromLesson(lesson, tags),
|
|
128
|
+
insight: lesson,
|
|
129
|
+
confidence: Math.min(0.9, episode.importance),
|
|
130
|
+
sourceEpisodeIds: [episode.id],
|
|
131
|
+
tags,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return episode;
|
|
136
|
+
}
|
|
137
|
+
// ============ EPISODES: Query ============
|
|
138
|
+
/**
|
|
139
|
+
* Search episodes by various criteria.
|
|
140
|
+
* Returns episodes sorted by relevance (importance * recency * match).
|
|
141
|
+
*/
|
|
142
|
+
async query(q) {
|
|
143
|
+
await this.load();
|
|
144
|
+
let results = this.episodes.filter(e => !e.archived);
|
|
145
|
+
// Filter by text search (title + summary + lessons)
|
|
146
|
+
if (q.text) {
|
|
147
|
+
const textLower = q.text.toLowerCase();
|
|
148
|
+
const words = textLower.split(/\s+/).filter(w => w.length > 2);
|
|
149
|
+
results = results.filter(e => {
|
|
150
|
+
const searchable = `${e.title} ${e.summary} ${e.lessons.join(' ')}`.toLowerCase();
|
|
151
|
+
return words.some(w => searchable.includes(w));
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// Filter by tags
|
|
155
|
+
if (q.tags && q.tags.length > 0) {
|
|
156
|
+
const queryTags = q.tags.map(t => t.toLowerCase());
|
|
157
|
+
results = results.filter(e => e.tags.some(t => queryTags.includes(t.toLowerCase())));
|
|
158
|
+
}
|
|
159
|
+
// Filter by participants
|
|
160
|
+
if (q.participants && q.participants.length > 0) {
|
|
161
|
+
const queryParts = q.participants.map(p => p.toLowerCase());
|
|
162
|
+
results = results.filter(e => e.participants.some(p => queryParts.includes(p.toLowerCase())));
|
|
163
|
+
}
|
|
164
|
+
// Filter by time range
|
|
165
|
+
if (q.after) {
|
|
166
|
+
const afterMs = new Date(q.after).getTime();
|
|
167
|
+
if (!isNaN(afterMs)) {
|
|
168
|
+
results = results.filter(e => new Date(e.timestamp).getTime() >= afterMs);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (q.before) {
|
|
172
|
+
const beforeMs = new Date(q.before).getTime();
|
|
173
|
+
if (!isNaN(beforeMs)) {
|
|
174
|
+
results = results.filter(e => new Date(e.timestamp).getTime() <= beforeMs);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Filter by minimum importance
|
|
178
|
+
if (q.minImportance !== undefined) {
|
|
179
|
+
const min = (0, validation_1.validateConfidence)(q.minImportance, 'minImportance');
|
|
180
|
+
results = results.filter(e => e.importance >= min);
|
|
181
|
+
}
|
|
182
|
+
// Filter by minimum emotional weight
|
|
183
|
+
if (q.minEmotionalWeight !== undefined) {
|
|
184
|
+
const min = (0, validation_1.validateConfidence)(q.minEmotionalWeight, 'minEmotionalWeight');
|
|
185
|
+
results = results.filter(e => e.emotionalWeight >= min);
|
|
186
|
+
}
|
|
187
|
+
// Score and sort by relevance
|
|
188
|
+
const scored = results.map(e => {
|
|
189
|
+
let score = e.importance;
|
|
190
|
+
// Recency boost (last 24h = +0.3, last week = +0.1)
|
|
191
|
+
const ageMs = Date.now() - new Date(e.timestamp).getTime();
|
|
192
|
+
const ageHours = ageMs / (1000 * 60 * 60);
|
|
193
|
+
if (ageHours < 24)
|
|
194
|
+
score += 0.3;
|
|
195
|
+
else if (ageHours < 168)
|
|
196
|
+
score += 0.1;
|
|
197
|
+
// Emotional weight boost
|
|
198
|
+
score += e.emotionalWeight * 0.2;
|
|
199
|
+
// Access count boost (frequently accessed = important)
|
|
200
|
+
score += Math.min(0.2, (e.accessCount || 0) * 0.05);
|
|
201
|
+
// Text match quality boost
|
|
202
|
+
if (q.text) {
|
|
203
|
+
const textLower = q.text.toLowerCase();
|
|
204
|
+
if (e.title.toLowerCase().includes(textLower))
|
|
205
|
+
score += 0.3;
|
|
206
|
+
if (e.summary.toLowerCase().includes(textLower))
|
|
207
|
+
score += 0.1;
|
|
208
|
+
}
|
|
209
|
+
return { episode: e, score };
|
|
210
|
+
});
|
|
211
|
+
scored.sort((a, b) => b.score - a.score);
|
|
212
|
+
// Track access
|
|
213
|
+
const limit = q.limit || 20;
|
|
214
|
+
const topResults = scored.slice(0, limit);
|
|
215
|
+
for (const { episode } of topResults) {
|
|
216
|
+
episode.accessCount = (episode.accessCount || 0) + 1;
|
|
217
|
+
}
|
|
218
|
+
if (topResults.length > 0)
|
|
219
|
+
await this.save();
|
|
220
|
+
return topResults.map(({ episode }) => episode);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get a single episode by ID.
|
|
224
|
+
*/
|
|
225
|
+
async get(id) {
|
|
226
|
+
await this.load();
|
|
227
|
+
const ep = this.episodes.find(e => e.id === id);
|
|
228
|
+
if (ep) {
|
|
229
|
+
ep.accessCount = (ep.accessCount || 0) + 1;
|
|
230
|
+
await this.save();
|
|
231
|
+
}
|
|
232
|
+
return ep || null;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get the most recent N episodes.
|
|
236
|
+
*/
|
|
237
|
+
async recent(limit = 10) {
|
|
238
|
+
await this.load();
|
|
239
|
+
return [...this.episodes]
|
|
240
|
+
.filter(e => !e.archived)
|
|
241
|
+
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime())
|
|
242
|
+
.slice(0, limit);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get episodes connected to a specific episode.
|
|
246
|
+
*/
|
|
247
|
+
async related(episodeId) {
|
|
248
|
+
await this.load();
|
|
249
|
+
const source = this.episodes.find(e => e.id === episodeId);
|
|
250
|
+
if (!source)
|
|
251
|
+
return [];
|
|
252
|
+
const relatedIds = new Set(source.connections.episodeIds || []);
|
|
253
|
+
// Also find episodes that reference this one
|
|
254
|
+
for (const ep of this.episodes) {
|
|
255
|
+
if (ep.connections.episodeIds?.includes(episodeId)) {
|
|
256
|
+
relatedIds.add(ep.id);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
relatedIds.delete(episodeId); // Don't include self
|
|
260
|
+
return this.episodes.filter(e => relatedIds.has(e.id));
|
|
261
|
+
}
|
|
262
|
+
// ============ EPISODES: Update ============
|
|
263
|
+
/**
|
|
264
|
+
* Add a lesson learned to an existing episode.
|
|
265
|
+
* Use when you realize something new about a past experience.
|
|
266
|
+
*/
|
|
267
|
+
async addLesson(episodeId, lesson) {
|
|
268
|
+
await this.load();
|
|
269
|
+
const ep = this.episodes.find(e => e.id === episodeId);
|
|
270
|
+
if (!ep)
|
|
271
|
+
return null;
|
|
272
|
+
const validated = (0, validation_1.validateString)(lesson, 'lesson', { maxLength: EPISODE_LIMITS.MAX_LESSON_LENGTH });
|
|
273
|
+
if (ep.lessons.length >= EPISODE_LIMITS.MAX_LESSONS) {
|
|
274
|
+
throw new validation_1.AnimaValidationError('lessons', `maximum of ${EPISODE_LIMITS.MAX_LESSONS} lessons per episode`);
|
|
275
|
+
}
|
|
276
|
+
// Prevent duplicates
|
|
277
|
+
if (ep.lessons.some(l => l.toLowerCase() === validated.toLowerCase())) {
|
|
278
|
+
return ep;
|
|
279
|
+
}
|
|
280
|
+
ep.lessons.push(validated);
|
|
281
|
+
ep.importance = this.calculateImportance(ep.emotionalWeight, ep.lessons.length, ep.connections, ep.participants.length);
|
|
282
|
+
ep.updatedAt = (0, utils_1.now)();
|
|
283
|
+
await this.save();
|
|
284
|
+
return ep;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Connect two episodes together.
|
|
288
|
+
*/
|
|
289
|
+
async connect(episodeIdA, episodeIdB) {
|
|
290
|
+
await this.load();
|
|
291
|
+
const a = this.episodes.find(e => e.id === episodeIdA);
|
|
292
|
+
const b = this.episodes.find(e => e.id === episodeIdB);
|
|
293
|
+
if (!a || !b)
|
|
294
|
+
return false;
|
|
295
|
+
if (!a.connections.episodeIds)
|
|
296
|
+
a.connections.episodeIds = [];
|
|
297
|
+
if (!b.connections.episodeIds)
|
|
298
|
+
b.connections.episodeIds = [];
|
|
299
|
+
if (!a.connections.episodeIds.includes(episodeIdB)) {
|
|
300
|
+
a.connections.episodeIds.push(episodeIdB);
|
|
301
|
+
}
|
|
302
|
+
if (!b.connections.episodeIds.includes(episodeIdA)) {
|
|
303
|
+
b.connections.episodeIds.push(episodeIdA);
|
|
304
|
+
}
|
|
305
|
+
a.updatedAt = (0, utils_1.now)();
|
|
306
|
+
b.updatedAt = (0, utils_1.now)();
|
|
307
|
+
await this.save();
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
// ============ EPISODES: Archive ============
|
|
311
|
+
/**
|
|
312
|
+
* Archive an episode (soft delete). Can be restored.
|
|
313
|
+
*/
|
|
314
|
+
async archive(episodeId) {
|
|
315
|
+
await this.load();
|
|
316
|
+
const ep = this.episodes.find(e => e.id === episodeId);
|
|
317
|
+
if (!ep)
|
|
318
|
+
return false;
|
|
319
|
+
ep.archived = true;
|
|
320
|
+
ep.archivedAt = (0, utils_1.now)();
|
|
321
|
+
await this.save();
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Restore an archived episode.
|
|
326
|
+
*/
|
|
327
|
+
async restore(episodeId) {
|
|
328
|
+
await this.load();
|
|
329
|
+
const ep = this.episodes.find(e => e.id === episodeId);
|
|
330
|
+
if (!ep || !ep.archived)
|
|
331
|
+
return false;
|
|
332
|
+
ep.archived = false;
|
|
333
|
+
ep.archivedAt = undefined;
|
|
334
|
+
await this.save();
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
// ============ KNOWLEDGE: Learn ============
|
|
338
|
+
/**
|
|
339
|
+
* Store a distilled lesson — semantic knowledge not tied to a specific moment.
|
|
340
|
+
*
|
|
341
|
+
* @example
|
|
342
|
+
* ```ts
|
|
343
|
+
* await episodes.learn({
|
|
344
|
+
* topic: 'customer-retention',
|
|
345
|
+
* insight: 'Users who get a callback within 2 hours have 3x retention',
|
|
346
|
+
* confidence: 0.8,
|
|
347
|
+
* tags: ['business', 'retention'],
|
|
348
|
+
* });
|
|
349
|
+
* ```
|
|
350
|
+
*/
|
|
351
|
+
async learn(input) {
|
|
352
|
+
await this.loadKnowledge();
|
|
353
|
+
const topic = (0, validation_1.validateString)(input.topic, 'topic', { maxLength: EPISODE_LIMITS.MAX_TOPIC_LENGTH });
|
|
354
|
+
const insight = (0, validation_1.validateString)(input.insight, 'insight', { maxLength: EPISODE_LIMITS.MAX_INSIGHT_LENGTH });
|
|
355
|
+
const confidence = input.confidence !== undefined
|
|
356
|
+
? (0, validation_1.validateConfidence)(input.confidence, 'confidence')
|
|
357
|
+
: 0.7;
|
|
358
|
+
const tags = input.tags
|
|
359
|
+
? (0, validation_1.validateStringArray)(input.tags, 'tags', { maxItems: validation_1.LIMITS.MAX_TAGS, maxItemLength: validation_1.LIMITS.MAX_TAG_LENGTH })
|
|
360
|
+
: [];
|
|
361
|
+
const sourceEpisodeIds = input.sourceEpisodeIds
|
|
362
|
+
? (0, validation_1.validateStringArray)(input.sourceEpisodeIds, 'sourceEpisodeIds', { maxItems: EPISODE_LIMITS.MAX_SOURCE_REFS })
|
|
363
|
+
: [];
|
|
364
|
+
// Check for existing knowledge on the same topic
|
|
365
|
+
const existing = this.knowledge.find(k => k.topic.toLowerCase() === topic.toLowerCase());
|
|
366
|
+
if (existing) {
|
|
367
|
+
// Update existing knowledge — track history
|
|
368
|
+
if (!existing.previousInsights)
|
|
369
|
+
existing.previousInsights = [];
|
|
370
|
+
existing.previousInsights.push({
|
|
371
|
+
insight: existing.insight,
|
|
372
|
+
confidence: existing.confidence,
|
|
373
|
+
date: existing.updatedAt,
|
|
374
|
+
});
|
|
375
|
+
existing.insight = insight;
|
|
376
|
+
existing.confidence = confidence;
|
|
377
|
+
existing.tags = [...new Set([...existing.tags, ...tags])];
|
|
378
|
+
existing.sourceEpisodeIds = [...new Set([...existing.sourceEpisodeIds, ...sourceEpisodeIds])];
|
|
379
|
+
existing.updatedAt = (0, utils_1.now)();
|
|
380
|
+
await this.saveKnowledge();
|
|
381
|
+
return existing;
|
|
382
|
+
}
|
|
383
|
+
// Enforce limit
|
|
384
|
+
if (this.knowledge.length >= EPISODE_LIMITS.MAX_KNOWLEDGE_ENTRIES) {
|
|
385
|
+
// Remove lowest confidence entry
|
|
386
|
+
const lowest = [...this.knowledge].sort((a, b) => a.confidence - b.confidence)[0];
|
|
387
|
+
if (lowest && lowest.confidence < confidence) {
|
|
388
|
+
this.knowledge = this.knowledge.filter(k => k.id !== lowest.id);
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
throw new validation_1.AnimaValidationError('knowledge', `maximum of ${EPISODE_LIMITS.MAX_KNOWLEDGE_ENTRIES} entries reached`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
const entry = {
|
|
395
|
+
id: `k-${(0, utils_1.uid)()}`,
|
|
396
|
+
topic,
|
|
397
|
+
insight,
|
|
398
|
+
confidence,
|
|
399
|
+
tags,
|
|
400
|
+
sourceEpisodeIds,
|
|
401
|
+
previousInsights: [],
|
|
402
|
+
createdAt: (0, utils_1.now)(),
|
|
403
|
+
updatedAt: (0, utils_1.now)(),
|
|
404
|
+
};
|
|
405
|
+
this.knowledge.push(entry);
|
|
406
|
+
await this.saveKnowledge();
|
|
407
|
+
return entry;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Search knowledge by topic or text.
|
|
411
|
+
*/
|
|
412
|
+
async recall(query, limit = 10) {
|
|
413
|
+
await this.loadKnowledge();
|
|
414
|
+
const queryLower = query.toLowerCase();
|
|
415
|
+
const words = queryLower.split(/\s+/).filter(w => w.length > 2);
|
|
416
|
+
const scored = this.knowledge.map(k => {
|
|
417
|
+
const searchable = `${k.topic} ${k.insight} ${k.tags.join(' ')}`.toLowerCase();
|
|
418
|
+
let score = 0;
|
|
419
|
+
for (const word of words) {
|
|
420
|
+
if (k.topic.toLowerCase().includes(word))
|
|
421
|
+
score += 3;
|
|
422
|
+
if (searchable.includes(word))
|
|
423
|
+
score += 1;
|
|
424
|
+
}
|
|
425
|
+
// Boost by confidence
|
|
426
|
+
score += k.confidence * 0.5;
|
|
427
|
+
return { entry: k, score };
|
|
428
|
+
})
|
|
429
|
+
.filter(({ score }) => score > 0)
|
|
430
|
+
.sort((a, b) => b.score - a.score)
|
|
431
|
+
.slice(0, limit);
|
|
432
|
+
return scored.map(({ entry }) => entry);
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Get all knowledge entries.
|
|
436
|
+
*/
|
|
437
|
+
async getAllKnowledge() {
|
|
438
|
+
await this.loadKnowledge();
|
|
439
|
+
return [...this.knowledge];
|
|
440
|
+
}
|
|
441
|
+
// ============ CONSOLIDATION ============
|
|
442
|
+
/**
|
|
443
|
+
* Consolidate episodes — decay old ones, promote lessons, clean up.
|
|
444
|
+
* Call this periodically (e.g., during heartbeats or sleep).
|
|
445
|
+
*/
|
|
446
|
+
async consolidate() {
|
|
447
|
+
await this.load();
|
|
448
|
+
await this.loadKnowledge();
|
|
449
|
+
let archived = 0;
|
|
450
|
+
let promoted = 0;
|
|
451
|
+
let kept = 0;
|
|
452
|
+
for (const ep of this.episodes) {
|
|
453
|
+
if (ep.archived)
|
|
454
|
+
continue;
|
|
455
|
+
const ageMs = Date.now() - new Date(ep.timestamp).getTime();
|
|
456
|
+
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
457
|
+
// Decay based on age, importance, and emotional weight
|
|
458
|
+
const decayResistance = (ep.importance * 0.5) + (ep.emotionalWeight * 0.3) + (Math.min(1, (ep.accessCount || 0) * 0.1) * 0.2);
|
|
459
|
+
// Archive episodes older than 30 days with low resistance
|
|
460
|
+
if (ageDays > 30 && decayResistance < 0.3) {
|
|
461
|
+
ep.archived = true;
|
|
462
|
+
ep.archivedAt = (0, utils_1.now)();
|
|
463
|
+
archived++;
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
// Promote unextracted lessons from important episodes
|
|
467
|
+
if (ep.importance >= 0.5 && ep.lessons.length > 0) {
|
|
468
|
+
for (const lesson of ep.lessons) {
|
|
469
|
+
const alreadyKnown = this.knowledge.some(k => k.sourceEpisodeIds.includes(ep.id) &&
|
|
470
|
+
k.insight.toLowerCase() === lesson.toLowerCase());
|
|
471
|
+
if (!alreadyKnown) {
|
|
472
|
+
await this.learn({
|
|
473
|
+
topic: this.extractTopicFromLesson(lesson, ep.tags),
|
|
474
|
+
insight: lesson,
|
|
475
|
+
confidence: Math.min(0.85, ep.importance),
|
|
476
|
+
sourceEpisodeIds: [ep.id],
|
|
477
|
+
tags: ep.tags,
|
|
478
|
+
});
|
|
479
|
+
promoted++;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
kept++;
|
|
484
|
+
}
|
|
485
|
+
await this.save();
|
|
486
|
+
await this.saveKnowledge();
|
|
487
|
+
return {
|
|
488
|
+
totalEpisodes: this.episodes.length,
|
|
489
|
+
activeEpisodes: this.episodes.filter(e => !e.archived).length,
|
|
490
|
+
archivedEpisodes: this.episodes.filter(e => e.archived).length,
|
|
491
|
+
totalKnowledge: this.knowledge.length,
|
|
492
|
+
decayedThisRun: archived,
|
|
493
|
+
promotedThisRun: promoted,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
// ============ STATS ============
|
|
497
|
+
async stats() {
|
|
498
|
+
await this.load();
|
|
499
|
+
await this.loadKnowledge();
|
|
500
|
+
return {
|
|
501
|
+
totalEpisodes: this.episodes.length,
|
|
502
|
+
activeEpisodes: this.episodes.filter(e => !e.archived).length,
|
|
503
|
+
archivedEpisodes: this.episodes.filter(e => e.archived).length,
|
|
504
|
+
totalKnowledge: this.knowledge.length,
|
|
505
|
+
decayedThisRun: 0,
|
|
506
|
+
promotedThisRun: 0,
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
// ============ INTERNAL ============
|
|
510
|
+
calculateImportance(emotionalWeight, lessonCount, connections, participantCount) {
|
|
511
|
+
let score = 0;
|
|
512
|
+
// Emotional weight is the strongest signal (0-0.4)
|
|
513
|
+
score += emotionalWeight * 0.4;
|
|
514
|
+
// Lessons learned make episodes more important (0-0.25)
|
|
515
|
+
score += Math.min(0.25, lessonCount * 0.05);
|
|
516
|
+
// Connections make episodes more important (0-0.2)
|
|
517
|
+
const totalConnections = (connections.episodeIds?.length || 0) +
|
|
518
|
+
(connections.opinionIds?.length || 0) +
|
|
519
|
+
(connections.memoryIds?.length || 0);
|
|
520
|
+
score += Math.min(0.2, totalConnections * 0.04);
|
|
521
|
+
// Multiple participants = social event = more important (0-0.15)
|
|
522
|
+
score += Math.min(0.15, participantCount * 0.05);
|
|
523
|
+
return Math.max(0, Math.min(1, score));
|
|
524
|
+
}
|
|
525
|
+
validateConnections(connections) {
|
|
526
|
+
if (!connections || typeof connections !== 'object') {
|
|
527
|
+
return { episodeIds: [], opinionIds: [], memoryIds: [] };
|
|
528
|
+
}
|
|
529
|
+
const c = connections;
|
|
530
|
+
return {
|
|
531
|
+
episodeIds: c.episodeIds
|
|
532
|
+
? (0, validation_1.validateStringArray)(c.episodeIds, 'connections.episodeIds', { maxItems: EPISODE_LIMITS.MAX_CONNECTIONS })
|
|
533
|
+
: [],
|
|
534
|
+
opinionIds: c.opinionIds
|
|
535
|
+
? (0, validation_1.validateStringArray)(c.opinionIds, 'connections.opinionIds', { maxItems: EPISODE_LIMITS.MAX_CONNECTIONS })
|
|
536
|
+
: [],
|
|
537
|
+
memoryIds: c.memoryIds
|
|
538
|
+
? (0, validation_1.validateStringArray)(c.memoryIds, 'connections.memoryIds', { maxItems: EPISODE_LIMITS.MAX_CONNECTIONS })
|
|
539
|
+
: [],
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
extractTopicFromLesson(lesson, tags) {
|
|
543
|
+
// Use first tag as topic if available, otherwise extract from lesson
|
|
544
|
+
if (tags.length > 0)
|
|
545
|
+
return tags[0];
|
|
546
|
+
// Take first 50 chars of lesson as topic
|
|
547
|
+
return lesson.length > 50 ? lesson.substring(0, 50).trim() + '...' : lesson;
|
|
548
|
+
}
|
|
549
|
+
async load() {
|
|
550
|
+
if (this.loaded)
|
|
551
|
+
return;
|
|
552
|
+
await (0, utils_1.ensureDir)(this.episodesDir);
|
|
553
|
+
const raw = await (0, utils_1.readFileSafe)((0, path_1.join)(this.episodesDir, 'index.json'));
|
|
554
|
+
if (raw) {
|
|
555
|
+
try {
|
|
556
|
+
this.episodes = JSON.parse(raw);
|
|
557
|
+
}
|
|
558
|
+
catch {
|
|
559
|
+
this.episodes = [];
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
this.loaded = true;
|
|
563
|
+
}
|
|
564
|
+
async save() {
|
|
565
|
+
await (0, utils_1.ensureDir)(this.episodesDir);
|
|
566
|
+
await (0, utils_1.writeFileSafe)((0, path_1.join)(this.episodesDir, 'index.json'), JSON.stringify(this.episodes, null, 2));
|
|
567
|
+
}
|
|
568
|
+
async loadKnowledge() {
|
|
569
|
+
if (this.knowledgeLoaded)
|
|
570
|
+
return;
|
|
571
|
+
await (0, utils_1.ensureDir)(this.knowledgeDir);
|
|
572
|
+
const raw = await (0, utils_1.readFileSafe)((0, path_1.join)(this.knowledgeDir, 'index.json'));
|
|
573
|
+
if (raw) {
|
|
574
|
+
try {
|
|
575
|
+
this.knowledge = JSON.parse(raw);
|
|
576
|
+
}
|
|
577
|
+
catch {
|
|
578
|
+
this.knowledge = [];
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
this.knowledgeLoaded = true;
|
|
582
|
+
}
|
|
583
|
+
async saveKnowledge() {
|
|
584
|
+
await (0, utils_1.ensureDir)(this.knowledgeDir);
|
|
585
|
+
await (0, utils_1.writeFileSafe)((0, path_1.join)(this.knowledgeDir, 'index.json'), JSON.stringify(this.knowledge, null, 2));
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
exports.EpisodicMemory = EpisodicMemory;
|
|
589
|
+
//# sourceMappingURL=episodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"episodes.js","sourceRoot":"","sources":["../src/episodes.ts"],"names":[],"mappings":"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"}
|