@pencil-agent/nano-mem 0.0.1

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 (93) hide show
  1. package/CLAUDE.md +258 -0
  2. package/README.md +146 -0
  3. package/dist/cli.d.ts +8 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +90 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +46 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +48 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/consolidation.d.ts +13 -0
  12. package/dist/consolidation.d.ts.map +1 -0
  13. package/dist/consolidation.js +111 -0
  14. package/dist/consolidation.js.map +1 -0
  15. package/dist/engine.d.ts +67 -0
  16. package/dist/engine.d.ts.map +1 -0
  17. package/dist/engine.js +492 -0
  18. package/dist/engine.js.map +1 -0
  19. package/dist/eviction.d.ts +16 -0
  20. package/dist/eviction.d.ts.map +1 -0
  21. package/dist/eviction.js +22 -0
  22. package/dist/eviction.js.map +1 -0
  23. package/dist/extension.d.ts +11 -0
  24. package/dist/extension.d.ts.map +1 -0
  25. package/dist/extension.js +264 -0
  26. package/dist/extension.js.map +1 -0
  27. package/dist/extraction.d.ts +10 -0
  28. package/dist/extraction.d.ts.map +1 -0
  29. package/dist/extraction.js +136 -0
  30. package/dist/extraction.js.map +1 -0
  31. package/dist/full-insights-html.d.ts +8 -0
  32. package/dist/full-insights-html.d.ts.map +1 -0
  33. package/dist/full-insights-html.js +311 -0
  34. package/dist/full-insights-html.js.map +1 -0
  35. package/dist/full-insights.d.ts +21 -0
  36. package/dist/full-insights.d.ts.map +1 -0
  37. package/dist/full-insights.js +327 -0
  38. package/dist/full-insights.js.map +1 -0
  39. package/dist/i18n.d.ts +50 -0
  40. package/dist/i18n.d.ts.map +1 -0
  41. package/dist/i18n.js +169 -0
  42. package/dist/i18n.js.map +1 -0
  43. package/dist/index.d.ts +18 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +14 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/insights-html.d.ts +8 -0
  48. package/dist/insights-html.d.ts.map +1 -0
  49. package/dist/insights-html.js +431 -0
  50. package/dist/insights-html.js.map +1 -0
  51. package/dist/linking.d.ts +11 -0
  52. package/dist/linking.d.ts.map +1 -0
  53. package/dist/linking.js +40 -0
  54. package/dist/linking.js.map +1 -0
  55. package/dist/privacy.d.ts +16 -0
  56. package/dist/privacy.d.ts.map +1 -0
  57. package/dist/privacy.js +52 -0
  58. package/dist/privacy.js.map +1 -0
  59. package/dist/scoring.d.ts +25 -0
  60. package/dist/scoring.d.ts.map +1 -0
  61. package/dist/scoring.js +63 -0
  62. package/dist/scoring.js.map +1 -0
  63. package/dist/store.d.ts +16 -0
  64. package/dist/store.d.ts.map +1 -0
  65. package/dist/store.js +68 -0
  66. package/dist/store.js.map +1 -0
  67. package/dist/types.d.ts +191 -0
  68. package/dist/types.d.ts.map +1 -0
  69. package/dist/types.js +7 -0
  70. package/dist/types.js.map +1 -0
  71. package/dist/update.d.ts +14 -0
  72. package/dist/update.d.ts.map +1 -0
  73. package/dist/update.js +126 -0
  74. package/dist/update.js.map +1 -0
  75. package/package.json +60 -0
  76. package/src/cli.ts +99 -0
  77. package/src/config.ts +72 -0
  78. package/src/consolidation.ts +127 -0
  79. package/src/engine.ts +699 -0
  80. package/src/eviction.ts +30 -0
  81. package/src/extension.ts +290 -0
  82. package/src/extraction.ts +152 -0
  83. package/src/full-insights-html.ts +342 -0
  84. package/src/full-insights.ts +396 -0
  85. package/src/i18n.ts +233 -0
  86. package/src/index.ts +50 -0
  87. package/src/insights-html.ts +476 -0
  88. package/src/linking.ts +43 -0
  89. package/src/privacy.ts +52 -0
  90. package/src/scoring.ts +94 -0
  91. package/src/store.ts +84 -0
  92. package/src/types.ts +209 -0
  93. package/src/update.ts +141 -0
package/dist/engine.js ADDED
@@ -0,0 +1,492 @@
1
+ /**
2
+ * [INPUT]: NanomemConfig, optional LlmFn
3
+ * [OUTPUT]: NanoMemEngine — unified API for memory CRUD, injection, consolidation
4
+ * [POS]: Facade layer — composes store, scoring, eviction, update, linking, privacy, extraction, consolidation
5
+ *
6
+ * Host products create an engine instance and call its methods.
7
+ * No dependency on any specific AI framework — LLM is pluggable.
8
+ */
9
+ import { join } from "node:path";
10
+ import { getConfig } from "./config.js";
11
+ import { consolidateEpisodes } from "./consolidation.js";
12
+ import { utilityEntry, utilityWork } from "./eviction.js";
13
+ import { extractMemories, extractWork } from "./extraction.js";
14
+ import { PROMPTS } from "./i18n.js";
15
+ import { getRelatedSummaries, linkNewEntry } from "./linking.js";
16
+ import { evictExpiredEntries, evictExpiredWork, filterByScope, filterPII } from "./privacy.js";
17
+ import { extractTags, pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tagOverlap } from "./scoring.js";
18
+ import { loadEntries, loadEpisodes, loadMeta, loadWork, saveEpisode as persistEpisode, saveEntries, saveWork, writeJson, } from "./store.js";
19
+ import { buildFullInsightsReport } from "./full-insights.js";
20
+ import { applyExtraction } from "./update.js";
21
+ export class NanoMemEngine {
22
+ cfg;
23
+ llmFn;
24
+ knowledgePath;
25
+ lessonsPath;
26
+ preferencesPath;
27
+ facetsPath;
28
+ workPath;
29
+ metaPath;
30
+ episodesDir;
31
+ constructor(overrides, llmFn) {
32
+ this.cfg = getConfig(overrides);
33
+ this.llmFn = llmFn;
34
+ this.knowledgePath = join(this.cfg.memoryDir, "knowledge.json");
35
+ this.lessonsPath = join(this.cfg.memoryDir, "lessons.json");
36
+ this.preferencesPath = join(this.cfg.memoryDir, "preferences.json");
37
+ this.facetsPath = join(this.cfg.memoryDir, "facets.json");
38
+ this.workPath = join(this.cfg.memoryDir, "work.json");
39
+ this.metaPath = join(this.cfg.memoryDir, "meta.json");
40
+ this.episodesDir = join(this.cfg.memoryDir, "episodes");
41
+ }
42
+ setLlmFn(fn) {
43
+ this.llmFn = fn;
44
+ }
45
+ // ─── Extraction ──────────────────────────────────────────────
46
+ async extractAndStore(conversation, project) {
47
+ const items = await extractMemories(conversation, this.cfg, this.llmFn);
48
+ if (!items.length)
49
+ return [];
50
+ const knowledge = await loadEntries(this.knowledgePath);
51
+ const lessons = await loadEntries(this.lessonsPath);
52
+ const prefs = await loadEntries(this.preferencesPath);
53
+ const facets = await loadEntries(this.facetsPath);
54
+ for (const item of items) {
55
+ const target = item.type === "lesson"
56
+ ? lessons
57
+ : item.type === "preference"
58
+ ? prefs
59
+ : item.type === "pattern" || item.type === "struggle"
60
+ ? facets
61
+ : knowledge;
62
+ applyExtraction(target, item, project, this.cfg);
63
+ }
64
+ const hl = this.cfg.halfLife;
65
+ const ew = this.cfg.evictionWeights;
66
+ await Promise.all([
67
+ saveEntries(this.knowledgePath, knowledge, this.cfg.maxEntries.knowledge, (e) => utilityEntry(e, hl, ew)),
68
+ saveEntries(this.lessonsPath, lessons, this.cfg.maxEntries.lessons, (e) => utilityEntry(e, hl, ew)),
69
+ saveEntries(this.preferencesPath, prefs, this.cfg.maxEntries.preferences, (e) => utilityEntry(e, hl, ew)),
70
+ saveEntries(this.facetsPath, facets, this.cfg.maxEntries.facets, (e) => utilityEntry(e, hl, ew)),
71
+ ]);
72
+ return items;
73
+ }
74
+ async extractAndStoreWork(conversation, project, sessionGoal) {
75
+ const extracted = await extractWork(conversation, this.cfg, this.llmFn);
76
+ if (!extracted || (!extracted.goal && !extracted.summary))
77
+ return;
78
+ const entries = await loadWork(this.workPath);
79
+ const now = new Date().toISOString();
80
+ const newWork = {
81
+ id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
82
+ goal: sessionGoal || extracted.goal,
83
+ summary: filterPII(extracted.summary),
84
+ project,
85
+ tags: extractTags(`${extracted.goal} ${extracted.summary}`),
86
+ importance: 6,
87
+ strength: this.cfg.halfLife.work ?? 45,
88
+ created: now,
89
+ eventTime: now,
90
+ accessCount: 0,
91
+ relatedIds: [],
92
+ scope: this.cfg.defaultScope,
93
+ };
94
+ entries.push(newWork);
95
+ await saveWork(this.workPath, entries, this.cfg.maxEntries.work, (w) => utilityWork(w, this.cfg.halfLife, this.cfg.evictionWeights));
96
+ }
97
+ // ─── Episode Management ──────────────────────────────────────
98
+ async saveEpisode(ep) {
99
+ await persistEpisode(this.episodesDir, ep);
100
+ const meta = await loadMeta(this.metaPath);
101
+ meta.totalSessions++;
102
+ await writeJson(this.metaPath, meta);
103
+ }
104
+ async consolidate() {
105
+ const episodes = await loadEpisodes(this.episodesDir);
106
+ const newEntries = await consolidateEpisodes(episodes, this.cfg, this.llmFn);
107
+ if (!newEntries.length)
108
+ return [];
109
+ const knowledge = await loadEntries(this.knowledgePath);
110
+ const lessons = await loadEntries(this.lessonsPath);
111
+ for (const entry of newEntries) {
112
+ linkNewEntry(entry, [...knowledge, ...lessons]);
113
+ if (entry.type === "lesson")
114
+ lessons.push(entry);
115
+ else
116
+ knowledge.push(entry);
117
+ }
118
+ const hl = this.cfg.halfLife;
119
+ const ew = this.cfg.evictionWeights;
120
+ await Promise.all([
121
+ saveEntries(this.knowledgePath, knowledge, this.cfg.maxEntries.knowledge, (e) => utilityEntry(e, hl, ew)),
122
+ saveEntries(this.lessonsPath, lessons, this.cfg.maxEntries.lessons, (e) => utilityEntry(e, hl, ew)),
123
+ ]);
124
+ for (const ep of episodes) {
125
+ if (ep.consolidated)
126
+ await persistEpisode(this.episodesDir, ep);
127
+ }
128
+ const meta = await loadMeta(this.metaPath);
129
+ meta.lastConsolidation = new Date().toISOString();
130
+ await writeJson(this.metaPath, meta);
131
+ return newEntries;
132
+ }
133
+ // ─── Retrieval & Injection ───────────────────────────────────
134
+ async getMemoryInjection(project, contextTags, scope) {
135
+ const [allKnowledge, allLessons, allPrefs, allFacets, allEpisodes, allWork] = await Promise.all([
136
+ loadEntries(this.knowledgePath),
137
+ loadEntries(this.lessonsPath),
138
+ loadEntries(this.preferencesPath),
139
+ loadEntries(this.facetsPath),
140
+ loadEpisodes(this.episodesDir),
141
+ loadWork(this.workPath),
142
+ ]);
143
+ const knowledge = this.filterAndCleanEntries(allKnowledge, scope);
144
+ const lessons = this.filterAndCleanEntries(allLessons, scope);
145
+ const prefs = this.filterAndCleanEntries(allPrefs, scope);
146
+ const facets = this.filterAndCleanEntries(allFacets, scope);
147
+ const work = this.filterAndCleanWork(allWork, scope);
148
+ const episodes = filterByScope(allEpisodes, scope);
149
+ const totalBudget = this.cfg.tokenBudget;
150
+ const b = this.cfg.budget;
151
+ const hl = this.cfg.halfLife;
152
+ const sw = this.cfg.scoreWeights;
153
+ const p = PROMPTS[this.cfg.locale] ?? PROMPTS.en;
154
+ const charBudget = (ratio) => Math.floor(totalBudget * 4 * ratio);
155
+ const topLessons = pickTop(lessons, (e) => scoreEntry(e, project, contextTags, hl, sw), (e) => e.content.length, charBudget(b.lessons));
156
+ const topKnowledge = pickTop(knowledge, (e) => scoreEntry(e, project, contextTags, hl, sw), (e) => e.content.length, charBudget(b.knowledge));
157
+ const topPrefs = pickTop(prefs, (e) => scoreEntry(e, project, contextTags, hl, sw), (e) => e.content.length, charBudget(b.preferences));
158
+ const topFacets = pickTop(facets, (e) => scoreEntry(e, project, contextTags, hl, sw), (e) => e.content.length, charBudget(b.facets));
159
+ const topEpisodes = pickTop(episodes, (ep) => scoreEpisode(ep, project, contextTags, hl, sw), (ep) => ep.summary.length, charBudget(b.episodes));
160
+ const topWork = pickTop(work, (w) => scoreWorkEntry(w, project, contextTags, hl, sw), (w) => w.goal.length + w.summary.length, charBudget(b.work));
161
+ await this.reinforceEntries(topLessons, allLessons, this.lessonsPath);
162
+ await this.reinforceEntries(topKnowledge, allKnowledge, this.knowledgePath);
163
+ await this.reinforceEntries(topPrefs, allPrefs, this.preferencesPath);
164
+ await this.reinforceEntries(topFacets, allFacets, this.facetsPath);
165
+ await this.reinforceWork(topWork, allWork);
166
+ if (this.llmFn) {
167
+ await this.reconsolidateIfNeeded(topKnowledge, contextTags, allKnowledge);
168
+ await this.reconsolidateIfNeeded(topLessons, contextTags, allLessons);
169
+ }
170
+ return this.buildInjectionText(topLessons, topKnowledge, topEpisodes, topPrefs, topWork, topFacets, allKnowledge, p);
171
+ }
172
+ // ─── Stats ───────────────────────────────────────────────────
173
+ async getStats() {
174
+ const [knowledge, lessons, prefs, facets, episodes, work, meta] = await Promise.all([
175
+ loadEntries(this.knowledgePath),
176
+ loadEntries(this.lessonsPath),
177
+ loadEntries(this.preferencesPath),
178
+ loadEntries(this.facetsPath),
179
+ loadEpisodes(this.episodesDir),
180
+ loadWork(this.workPath),
181
+ loadMeta(this.metaPath),
182
+ ]);
183
+ return {
184
+ knowledge: knowledge.length,
185
+ lessons: lessons.length,
186
+ preferences: prefs.length,
187
+ facets: facets.length,
188
+ episodes: episodes.length,
189
+ work: work.length,
190
+ totalSessions: meta.totalSessions,
191
+ };
192
+ }
193
+ // ─── Direct Access (for CLI, testing) ────────────────────────
194
+ async getAllEntries() {
195
+ return {
196
+ knowledge: await loadEntries(this.knowledgePath),
197
+ lessons: await loadEntries(this.lessonsPath),
198
+ preferences: await loadEntries(this.preferencesPath),
199
+ facets: await loadEntries(this.facetsPath),
200
+ };
201
+ }
202
+ async getAllWork() {
203
+ return loadWork(this.workPath);
204
+ }
205
+ async getAllEpisodes() {
206
+ return loadEpisodes(this.episodesDir);
207
+ }
208
+ async searchEntries(query, scope) {
209
+ const tags = extractTags(query);
210
+ const { knowledge, lessons, preferences, facets } = await this.getAllEntries();
211
+ const all = [...knowledge, ...lessons, ...preferences, ...facets];
212
+ return filterByScope(all, scope)
213
+ .map((e) => ({ entry: e, score: tagOverlap(e.tags, tags) }))
214
+ .filter((x) => x.score > 0)
215
+ .sort((a, b) => b.score - a.score)
216
+ .map((x) => x.entry);
217
+ }
218
+ async forgetEntry(id) {
219
+ const paths = [this.knowledgePath, this.lessonsPath, this.preferencesPath, this.facetsPath];
220
+ for (const path of paths) {
221
+ const entries = await loadEntries(path);
222
+ const idx = entries.findIndex((e) => e.id === id);
223
+ if (idx >= 0) {
224
+ entries.splice(idx, 1);
225
+ const hl = this.cfg.halfLife;
226
+ const ew = this.cfg.evictionWeights;
227
+ await saveEntries(path, entries, Infinity, (e) => utilityEntry(e, hl, ew));
228
+ return true;
229
+ }
230
+ }
231
+ return false;
232
+ }
233
+ async exportAll() {
234
+ const [knowledge, lessons, preferences, facets, work, episodes, meta] = await Promise.all([
235
+ loadEntries(this.knowledgePath),
236
+ loadEntries(this.lessonsPath),
237
+ loadEntries(this.preferencesPath),
238
+ loadEntries(this.facetsPath),
239
+ loadWork(this.workPath),
240
+ loadEpisodes(this.episodesDir),
241
+ loadMeta(this.metaPath),
242
+ ]);
243
+ return { knowledge, lessons, preferences, facets, work, episodes, meta };
244
+ }
245
+ // ─── Full Insights Report ────────────────────────────────────────
246
+ async generateFullInsights() {
247
+ const all = await this.exportAll();
248
+ return buildFullInsightsReport(all, this.llmFn, this.cfg.locale);
249
+ }
250
+ // ─── Insights Generation ─────────────────────────────────────
251
+ async generateInsights() {
252
+ const all = await this.exportAll();
253
+ const stats = {
254
+ knowledge: all.knowledge.length,
255
+ lessons: all.lessons.length,
256
+ preferences: all.preferences.length,
257
+ facets: all.facets.length,
258
+ episodes: all.episodes.length,
259
+ work: all.work.length,
260
+ totalSessions: all.meta.totalSessions,
261
+ };
262
+ // Separate patterns and struggles from facets
263
+ const patternEntries = all.facets.filter((e) => e.type === "pattern");
264
+ const struggleEntries = all.facets.filter((e) => e.type === "struggle");
265
+ // Weight calculation: (accessCount + 1) × (importance / 10)
266
+ const calcWeight = (e, unresolvedBonus = false) => {
267
+ const base = (e.accessCount + 1) * (e.importance / 10);
268
+ return unresolvedBonus ? base * 1.5 : base;
269
+ };
270
+ // Build PatternInsight[]
271
+ const patterns = patternEntries
272
+ .map((e) => ({
273
+ entry: e,
274
+ weight: calcWeight(e),
275
+ trigger: e.facetData?.kind === "pattern" ? e.facetData.trigger : e.content.slice(0, 50),
276
+ behavior: e.facetData?.kind === "pattern" ? e.facetData.behavior : e.content,
277
+ }))
278
+ .sort((a, b) => b.weight - a.weight);
279
+ // Build StruggleInsight[]
280
+ const struggles = struggleEntries
281
+ .map((e) => {
282
+ const isResolved = e.facetData?.kind === "struggle" ? !!e.facetData.solution : false;
283
+ return {
284
+ entry: e,
285
+ weight: calcWeight(e, !isResolved),
286
+ problem: e.facetData?.kind === "struggle" ? e.facetData.problem : e.content,
287
+ attempts: e.facetData?.kind === "struggle" ? e.facetData.attempts : [],
288
+ solution: e.facetData?.kind === "struggle" ? e.facetData.solution : "",
289
+ resolved: isResolved,
290
+ };
291
+ })
292
+ .sort((a, b) => {
293
+ // Unresolved first, then by weight
294
+ if (a.resolved !== b.resolved)
295
+ return a.resolved ? 1 : -1;
296
+ return b.weight - a.weight;
297
+ });
298
+ // Top lessons and knowledge by importance × accessCount
299
+ const sortByRelevance = (arr) => [...arr].sort((a, b) => b.importance * (b.accessCount + 1) - a.importance * (a.accessCount + 1));
300
+ const topLessons = sortByRelevance(all.lessons).slice(0, 10);
301
+ const topKnowledge = sortByRelevance(all.knowledge).slice(0, 10);
302
+ // Generate recommendations (LLM or rules-based fallback)
303
+ const recommendations = await this.generateRecommendations(patterns, struggles, topLessons);
304
+ return {
305
+ patterns,
306
+ struggles,
307
+ topLessons,
308
+ topKnowledge,
309
+ preferences: all.preferences,
310
+ stats,
311
+ recommendations,
312
+ generatedAt: new Date().toISOString(),
313
+ };
314
+ }
315
+ async generateRecommendations(patterns, struggles, lessons) {
316
+ // Try LLM-based recommendations if available
317
+ if (this.llmFn) {
318
+ try {
319
+ const p = PROMPTS[this.cfg.locale] ?? PROMPTS.en;
320
+ const input = JSON.stringify({
321
+ patterns: patterns.slice(0, 5).map((pa) => ({ trigger: pa.trigger, behavior: pa.behavior })),
322
+ struggles: struggles.slice(0, 5).map((s) => ({ problem: s.problem, resolved: s.resolved })),
323
+ lessons: lessons.slice(0, 5).map((l) => l.content),
324
+ });
325
+ const raw = await this.llmFn(p.insightsRecommendationSystem, input);
326
+ const cleaned = raw
327
+ .replace(/```json?\n?/g, "")
328
+ .replace(/```/g, "")
329
+ .trim();
330
+ const result = JSON.parse(cleaned);
331
+ if (Array.isArray(result) && result.length > 0) {
332
+ return result.slice(0, 5);
333
+ }
334
+ }
335
+ catch {
336
+ // Fall through to rules-based
337
+ }
338
+ }
339
+ // Rules-based fallback recommendations
340
+ return this.generateRulesBasedRecommendations(patterns, struggles, lessons);
341
+ }
342
+ generateRulesBasedRecommendations(patterns, struggles, lessons) {
343
+ const recommendations = [];
344
+ const isZh = this.cfg.locale === "zh";
345
+ // High-weight patterns → automation suggestion
346
+ if (patterns.length > 0) {
347
+ const top = patterns[0];
348
+ recommendations.push(isZh
349
+ ? `你在「${top.trigger}」时稳定执行「${top.behavior}」,考虑将此行为自动化`
350
+ : `You consistently ${top.behavior} when ${top.trigger}. Consider automating this behavior.`);
351
+ }
352
+ // Unresolved struggles → systematic review suggestion
353
+ const unresolved = struggles.filter((s) => !s.resolved);
354
+ if (unresolved.length >= 2) {
355
+ recommendations.push(isZh
356
+ ? `有 ${unresolved.length} 个未解决的问题,建议系统性地逐个攻克`
357
+ : `You have ${unresolved.length} unresolved issues. Consider tackling them systematically.`);
358
+ }
359
+ // Recurring tag patterns in struggles → domain-specific review
360
+ const struggleTags = struggles.flatMap((s) => s.entry.tags);
361
+ const tagCounts = struggleTags.reduce((acc, tag) => {
362
+ acc[tag] = (acc[tag] || 0) + 1;
363
+ return acc;
364
+ }, {});
365
+ const topTag = Object.entries(tagCounts).sort((a, b) => b[1] - a[1])[0];
366
+ if (topTag && topTag[1] >= 3) {
367
+ recommendations.push(isZh
368
+ ? `「${topTag[0]}」相关的问题反复出现,建议深入学习该领域`
369
+ : `Issues related to "${topTag[0]}" appear frequently. Consider deeper learning in this area.`);
370
+ }
371
+ // Lessons accumulation → expertise recognition
372
+ if (lessons.length >= 5) {
373
+ recommendations.push(isZh
374
+ ? `你已积累 ${lessons.length} 条经验教训,这是宝贵的知识财富`
375
+ : `You've accumulated ${lessons.length} lessons. This is valuable expertise.`);
376
+ }
377
+ // No data → encouragement
378
+ if (patterns.length === 0 && struggles.length === 0 && lessons.length === 0) {
379
+ recommendations.push(isZh ? `继续使用系统,让它学习你的工作习惯` : `Keep using the system to let it learn your work habits.`);
380
+ }
381
+ return recommendations.slice(0, 5);
382
+ }
383
+ // ─── Private Helpers ─────────────────────────────────────────
384
+ filterAndCleanEntries(entries, scope) {
385
+ return filterByScope(evictExpiredEntries(entries), scope);
386
+ }
387
+ filterAndCleanWork(entries, scope) {
388
+ return filterByScope(evictExpiredWork(entries), scope);
389
+ }
390
+ async reinforceEntries(recalled, all, savePath) {
391
+ const ids = new Set(recalled.map((e) => e.id));
392
+ const now = new Date().toISOString();
393
+ for (const entry of all) {
394
+ if (ids.has(entry.id)) {
395
+ entry.accessCount = (entry.accessCount ?? 0) + 1;
396
+ entry.lastAccessed = now;
397
+ entry.strength = (entry.strength || 30) * this.cfg.strengthGrowthFactor;
398
+ }
399
+ }
400
+ const hl = this.cfg.halfLife;
401
+ const ew = this.cfg.evictionWeights;
402
+ await saveEntries(savePath, all, savePath === this.lessonsPath
403
+ ? this.cfg.maxEntries.lessons
404
+ : savePath === this.preferencesPath
405
+ ? this.cfg.maxEntries.preferences
406
+ : savePath === this.facetsPath
407
+ ? this.cfg.maxEntries.facets
408
+ : this.cfg.maxEntries.knowledge, (e) => utilityEntry(e, hl, ew));
409
+ }
410
+ async reinforceWork(recalled, all) {
411
+ const ids = new Set(recalled.map((w) => w.id));
412
+ const now = new Date().toISOString();
413
+ for (const w of all) {
414
+ if (ids.has(w.id)) {
415
+ w.accessCount = (w.accessCount ?? 0) + 1;
416
+ w.lastAccessed = now;
417
+ w.strength = (w.strength || 45) * this.cfg.strengthGrowthFactor;
418
+ }
419
+ }
420
+ await saveWork(this.workPath, all, this.cfg.maxEntries.work, (w) => utilityWork(w, this.cfg.halfLife, this.cfg.evictionWeights));
421
+ }
422
+ async reconsolidateIfNeeded(recalled, contextTags, _allEntries) {
423
+ if (!this.llmFn)
424
+ return;
425
+ const p = PROMPTS[this.cfg.locale];
426
+ for (const entry of recalled) {
427
+ const overlap = tagOverlap(entry.tags, contextTags);
428
+ if (overlap >= 0.3)
429
+ continue;
430
+ try {
431
+ const updated = await this.llmFn(p.reconsolidationSystem, `Original memory: ${entry.content}\n\nCurrent context tags: ${contextTags.join(", ")}`);
432
+ if (updated && updated.length > 10) {
433
+ entry.content = updated.trim();
434
+ entry.tags = extractTags(entry.content);
435
+ }
436
+ }
437
+ catch {
438
+ /* graceful degradation */
439
+ }
440
+ }
441
+ }
442
+ buildInjectionText(lessons, knowledge, episodes, prefs, work, facets, allKnowledge, p) {
443
+ const sections = [];
444
+ if (lessons.length) {
445
+ sections.push(`### ${p.sectionLessons}\n${lessons.map((e) => `- ${e.content}`).join("\n")}`);
446
+ }
447
+ if (knowledge.length) {
448
+ const lines = knowledge.map((e) => {
449
+ const related = getRelatedSummaries(e, allKnowledge, 2);
450
+ const suffix = related.length ? ` [→ ${related.join("; ")}]` : "";
451
+ return `- ${e.content}${suffix}`;
452
+ });
453
+ sections.push(`### ${p.sectionKnowledge}\n${lines.join("\n")}`);
454
+ }
455
+ if (episodes.length) {
456
+ const lines = episodes.map((ep) => `- [${ep.date}] ${ep.project}: ${ep.summary}${ep.userGoal ? ` (Goal: ${ep.userGoal})` : ""}`);
457
+ sections.push(`### ${p.sectionEpisodes}\n${lines.join("\n")}`);
458
+ }
459
+ if (prefs.length) {
460
+ sections.push(`### ${p.sectionPreferences}\n${prefs.map((e) => `- ${e.content}`).join("\n")}`);
461
+ }
462
+ if (work.length) {
463
+ const lines = work.map((w) => `- [${w.created.slice(0, 10)}] ${w.goal}: ${w.summary}`);
464
+ sections.push(`### ${p.sectionWork}\n${lines.join("\n")}`);
465
+ }
466
+ // Facets: patterns and struggles
467
+ const patterns = facets.filter((e) => e.type === "pattern");
468
+ const struggles = facets.filter((e) => e.type === "struggle");
469
+ if (patterns.length) {
470
+ const lines = patterns.map((e) => {
471
+ if (e.facetData?.kind === "pattern") {
472
+ return `- When ${e.facetData.trigger} → ${e.facetData.behavior}`;
473
+ }
474
+ return `- ${e.content}`;
475
+ });
476
+ sections.push(`### ${p.sectionPatterns}\n${lines.join("\n")}`);
477
+ }
478
+ if (struggles.length) {
479
+ const lines = struggles.map((e) => {
480
+ if (e.facetData?.kind === "struggle") {
481
+ return `- Problem: ${e.facetData.problem} | Tried: ${e.facetData.attempts.join(", ")} | Solved: ${e.facetData.solution}`;
482
+ }
483
+ return `- ${e.content}`;
484
+ });
485
+ sections.push(`### ${p.sectionStruggles}\n${lines.join("\n")}`);
486
+ }
487
+ if (!sections.length)
488
+ return "";
489
+ return `## ${p.injectionHeader}\n\n${sections.join("\n\n")}\n\n---\n${p.memoryBehavior}`;
490
+ }
491
+ }
492
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * [INPUT]: MemoryEntry/WorkEntry, config weights
3
+ * [OUTPUT]: utility score for eviction ordering
4
+ * [POS]: Implements Utility-Weighted Memory eviction (Ebbinghaus-aligned)
5
+ *
6
+ * Formula: Utility = (w_freq * AccessFrequency + w_impact * BaseImpact) * e^(-lambda * Age)
7
+ * Uses per-entry adaptive strength for the decay component.
8
+ */
9
+ import type { MemoryEntry, WorkEntry } from "./types.js";
10
+ export interface EvictionWeights {
11
+ accessFrequency: number;
12
+ baseImpact: number;
13
+ }
14
+ export declare function utilityEntry(e: MemoryEntry, defaultHalfLife: Record<string, number>, w: EvictionWeights): number;
15
+ export declare function utilityWork(w: WorkEntry, defaultHalfLife: Record<string, number>, ew: EvictionWeights): number;
16
+ //# sourceMappingURL=eviction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eviction.d.ts","sourceRoot":"","sources":["../src/eviction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,eAAe,GAAG,MAAM,CAKhH;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,eAAe,GAAG,MAAM,CAK9G"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * [INPUT]: MemoryEntry/WorkEntry, config weights
3
+ * [OUTPUT]: utility score for eviction ordering
4
+ * [POS]: Implements Utility-Weighted Memory eviction (Ebbinghaus-aligned)
5
+ *
6
+ * Formula: Utility = (w_freq * AccessFrequency + w_impact * BaseImpact) * e^(-lambda * Age)
7
+ * Uses per-entry adaptive strength for the decay component.
8
+ */
9
+ import { daysSince, decay } from "./scoring.js";
10
+ export function utilityEntry(e, defaultHalfLife, w) {
11
+ const strength = e.strength || defaultHalfLife[e.type] || 30;
12
+ const accessNorm = Math.min(1, (e.accessCount ?? 0) / 10);
13
+ const impactNorm = Math.min(1, e.importance / 10);
14
+ return (w.accessFrequency * accessNorm + w.baseImpact * impactNorm) * decay(daysSince(e.created), strength);
15
+ }
16
+ export function utilityWork(w, defaultHalfLife, ew) {
17
+ const strength = w.strength || defaultHalfLife.work || 45;
18
+ const accessNorm = Math.min(1, (w.accessCount ?? 0) / 10);
19
+ const impactNorm = Math.min(1, w.importance / 10);
20
+ return (ew.accessFrequency * accessNorm + ew.baseImpact * impactNorm) * decay(daysSince(w.created), strength);
21
+ }
22
+ //# sourceMappingURL=eviction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eviction.js","sourceRoot":"","sources":["../src/eviction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAQhD,MAAM,UAAU,YAAY,CAAC,CAAc,EAAE,eAAuC,EAAE,CAAkB;IACvG,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC,CAAC,eAAe,GAAG,UAAU,GAAG,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC7G,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAY,EAAE,eAAuC,EAAE,EAAmB;IACrG,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,eAAe,GAAG,UAAU,GAAG,EAAE,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC/G,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * [INPUT]: NanoPencil ExtensionAPI
3
+ * [OUTPUT]: Registers lifecycle hooks that drive NanoMemEngine
4
+ * [POS]: Thin adapter — bridges NanoPencil events to the host-agnostic engine
5
+ *
6
+ * This file is the ONLY module that depends on @pencil-agent/nano-pencil types.
7
+ * For non-NanoPencil hosts, import from the package root instead.
8
+ */
9
+ import type { ExtensionAPI } from "@pencil-agent/nano-pencil";
10
+ export default function nanomemExtension(pi: ExtensionAPI): void;
11
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,2BAA2B,CAAC;AA6GhF,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,YAAY,QAyKxD"}