anno-extension 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +30 -0
  3. package/THIRD_PARTY_NOTICES.md +8 -0
  4. package/dist/browser-fs.d.ts +14 -0
  5. package/dist/browser-fs.d.ts.map +1 -0
  6. package/dist/browser-fs.js +69 -0
  7. package/dist/browser-fs.js.map +1 -0
  8. package/dist/config.d.ts +81 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +82 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/consolidate-v2.d.ts +15 -0
  13. package/dist/consolidate-v2.d.ts.map +1 -0
  14. package/dist/consolidate-v2.js +125 -0
  15. package/dist/consolidate-v2.js.map +1 -0
  16. package/dist/consolidation.d.ts +12 -0
  17. package/dist/consolidation.d.ts.map +1 -0
  18. package/dist/consolidation.js +199 -0
  19. package/dist/consolidation.js.map +1 -0
  20. package/dist/dedup.d.ts +18 -0
  21. package/dist/dedup.d.ts.map +1 -0
  22. package/dist/dedup.js +85 -0
  23. package/dist/dedup.js.map +1 -0
  24. package/dist/diagnostics.d.ts +24 -0
  25. package/dist/diagnostics.d.ts.map +1 -0
  26. package/dist/diagnostics.js +53 -0
  27. package/dist/diagnostics.js.map +1 -0
  28. package/dist/embedding-index.d.ts +27 -0
  29. package/dist/embedding-index.d.ts.map +1 -0
  30. package/dist/embedding-index.js +111 -0
  31. package/dist/embedding-index.js.map +1 -0
  32. package/dist/engine-archive.d.ts +37 -0
  33. package/dist/engine-archive.d.ts.map +1 -0
  34. package/dist/engine-archive.js +155 -0
  35. package/dist/engine-archive.js.map +1 -0
  36. package/dist/engine-episode-sync.d.ts +19 -0
  37. package/dist/engine-episode-sync.d.ts.map +1 -0
  38. package/dist/engine-episode-sync.js +186 -0
  39. package/dist/engine-episode-sync.js.map +1 -0
  40. package/dist/engine-injection-text.d.ts +46 -0
  41. package/dist/engine-injection-text.d.ts.map +1 -0
  42. package/dist/engine-injection-text.js +271 -0
  43. package/dist/engine-injection-text.js.map +1 -0
  44. package/dist/engine-insights.d.ts +22 -0
  45. package/dist/engine-insights.d.ts.map +1 -0
  46. package/dist/engine-insights.js +127 -0
  47. package/dist/engine-insights.js.map +1 -0
  48. package/dist/engine-links.d.ts +43 -0
  49. package/dist/engine-links.d.ts.map +1 -0
  50. package/dist/engine-links.js +223 -0
  51. package/dist/engine-links.js.map +1 -0
  52. package/dist/engine-recall-select.d.ts +84 -0
  53. package/dist/engine-recall-select.d.ts.map +1 -0
  54. package/dist/engine-recall-select.js +127 -0
  55. package/dist/engine-recall-select.js.map +1 -0
  56. package/dist/engine-reinforce.d.ts +18 -0
  57. package/dist/engine-reinforce.d.ts.map +1 -0
  58. package/dist/engine-reinforce.js +116 -0
  59. package/dist/engine-reinforce.js.map +1 -0
  60. package/dist/engine-scoring-v2.d.ts +35 -0
  61. package/dist/engine-scoring-v2.d.ts.map +1 -0
  62. package/dist/engine-scoring-v2.js +178 -0
  63. package/dist/engine-scoring-v2.js.map +1 -0
  64. package/dist/engine-v2-mapping.d.ts +17 -0
  65. package/dist/engine-v2-mapping.d.ts.map +1 -0
  66. package/dist/engine-v2-mapping.js +190 -0
  67. package/dist/engine-v2-mapping.js.map +1 -0
  68. package/dist/engine.d.ts +339 -0
  69. package/dist/engine.d.ts.map +1 -0
  70. package/dist/engine.js +1964 -0
  71. package/dist/engine.js.map +1 -0
  72. package/dist/eviction.d.ts +14 -0
  73. package/dist/eviction.d.ts.map +1 -0
  74. package/dist/eviction.js +26 -0
  75. package/dist/eviction.js.map +1 -0
  76. package/dist/extraction.d.ts +11 -0
  77. package/dist/extraction.d.ts.map +1 -0
  78. package/dist/extraction.js +261 -0
  79. package/dist/extraction.js.map +1 -0
  80. package/dist/full-insights-html.d.ts +9 -0
  81. package/dist/full-insights-html.d.ts.map +1 -0
  82. package/dist/full-insights-html.js +422 -0
  83. package/dist/full-insights-html.js.map +1 -0
  84. package/dist/full-insights-sections.d.ts +48 -0
  85. package/dist/full-insights-sections.d.ts.map +1 -0
  86. package/dist/full-insights-sections.js +231 -0
  87. package/dist/full-insights-sections.js.map +1 -0
  88. package/dist/full-insights.d.ts +22 -0
  89. package/dist/full-insights.d.ts.map +1 -0
  90. package/dist/full-insights.js +370 -0
  91. package/dist/full-insights.js.map +1 -0
  92. package/dist/hash-embedding.d.ts +9 -0
  93. package/dist/hash-embedding.d.ts.map +1 -0
  94. package/dist/hash-embedding.js +44 -0
  95. package/dist/hash-embedding.js.map +1 -0
  96. package/dist/human-insights.d.ts +28 -0
  97. package/dist/human-insights.d.ts.map +1 -0
  98. package/dist/human-insights.js +260 -0
  99. package/dist/human-insights.js.map +1 -0
  100. package/dist/i18n.d.ts +64 -0
  101. package/dist/i18n.d.ts.map +1 -0
  102. package/dist/i18n.js +367 -0
  103. package/dist/i18n.js.map +1 -0
  104. package/dist/index.d.ts +27 -0
  105. package/dist/index.d.ts.map +1 -0
  106. package/dist/index.js +21 -0
  107. package/dist/index.js.map +1 -0
  108. package/dist/insights-html.d.ts +9 -0
  109. package/dist/insights-html.d.ts.map +1 -0
  110. package/dist/insights-html.js +432 -0
  111. package/dist/insights-html.js.map +1 -0
  112. package/dist/linking.d.ts +22 -0
  113. package/dist/linking.d.ts.map +1 -0
  114. package/dist/linking.js +192 -0
  115. package/dist/linking.js.map +1 -0
  116. package/dist/llm-json.d.ts +10 -0
  117. package/dist/llm-json.d.ts.map +1 -0
  118. package/dist/llm-json.js +193 -0
  119. package/dist/llm-json.js.map +1 -0
  120. package/dist/privacy.d.ts +17 -0
  121. package/dist/privacy.d.ts.map +1 -0
  122. package/dist/privacy.js +53 -0
  123. package/dist/privacy.js.map +1 -0
  124. package/dist/procedural-v2.d.ts +9 -0
  125. package/dist/procedural-v2.d.ts.map +1 -0
  126. package/dist/procedural-v2.js +123 -0
  127. package/dist/procedural-v2.js.map +1 -0
  128. package/dist/reconsolidate-v2.d.ts +19 -0
  129. package/dist/reconsolidate-v2.d.ts.map +1 -0
  130. package/dist/reconsolidate-v2.js +115 -0
  131. package/dist/reconsolidate-v2.js.map +1 -0
  132. package/dist/scoring.d.ts +32 -0
  133. package/dist/scoring.d.ts.map +1 -0
  134. package/dist/scoring.js +108 -0
  135. package/dist/scoring.js.map +1 -0
  136. package/dist/store-v2.d.ts +35 -0
  137. package/dist/store-v2.d.ts.map +1 -0
  138. package/dist/store-v2.js +98 -0
  139. package/dist/store-v2.js.map +1 -0
  140. package/dist/store.d.ts +22 -0
  141. package/dist/store.d.ts.map +1 -0
  142. package/dist/store.js +116 -0
  143. package/dist/store.js.map +1 -0
  144. package/dist/turn-context.d.ts +37 -0
  145. package/dist/turn-context.d.ts.map +1 -0
  146. package/dist/turn-context.js +31 -0
  147. package/dist/turn-context.js.map +1 -0
  148. package/dist/types-v2.d.ts +190 -0
  149. package/dist/types-v2.d.ts.map +1 -0
  150. package/dist/types-v2.js +8 -0
  151. package/dist/types-v2.js.map +1 -0
  152. package/dist/types.d.ts +330 -0
  153. package/dist/types.d.ts.map +1 -0
  154. package/dist/types.js +8 -0
  155. package/dist/types.js.map +1 -0
  156. package/dist/update.d.ts +31 -0
  157. package/dist/update.d.ts.map +1 -0
  158. package/dist/update.js +250 -0
  159. package/dist/update.js.map +1 -0
  160. package/package.json +34 -0
  161. package/src/browser-fs.ts +67 -0
  162. package/src/config.ts +138 -0
  163. package/src/consolidate-v2.ts +158 -0
  164. package/src/consolidation.ts +229 -0
  165. package/src/dedup.ts +91 -0
  166. package/src/diagnostics.ts +81 -0
  167. package/src/embedding-index.ts +138 -0
  168. package/src/engine-archive.ts +167 -0
  169. package/src/engine-episode-sync.ts +237 -0
  170. package/src/engine-injection-text.ts +334 -0
  171. package/src/engine-insights.ts +182 -0
  172. package/src/engine-links.ts +311 -0
  173. package/src/engine-recall-select.ts +298 -0
  174. package/src/engine-reinforce.ts +154 -0
  175. package/src/engine-scoring-v2.ts +188 -0
  176. package/src/engine-v2-mapping.ts +204 -0
  177. package/src/engine.ts +2499 -0
  178. package/src/eviction.ts +38 -0
  179. package/src/extraction.ts +300 -0
  180. package/src/full-insights-html.ts +474 -0
  181. package/src/full-insights-sections.ts +305 -0
  182. package/src/full-insights.ts +423 -0
  183. package/src/hash-embedding.ts +48 -0
  184. package/src/human-insights.ts +345 -0
  185. package/src/i18n.ts +455 -0
  186. package/src/index.ts +117 -0
  187. package/src/insights-html.ts +478 -0
  188. package/src/linking.ts +228 -0
  189. package/src/llm-json.ts +194 -0
  190. package/src/privacy.ts +54 -0
  191. package/src/procedural-v2.ts +142 -0
  192. package/src/reconsolidate-v2.ts +145 -0
  193. package/src/scoring.ts +156 -0
  194. package/src/store-v2.ts +138 -0
  195. package/src/store.ts +137 -0
  196. package/src/turn-context.ts +56 -0
  197. package/src/types-v2.ts +244 -0
  198. package/src/types.ts +372 -0
  199. package/src/update.ts +271 -0
@@ -0,0 +1,223 @@
1
+ /**
2
+ * [WHO]: Provides AUTO_V2_LINK_PREFIX, buildProceduralChains, materializeV2Links, detectProceduralConflicts, detectSemanticConflicts, detectAlignmentConflicts, suggestConflictAction, explainConflictAction
3
+ * [FROM]: Depends on ./scoring.js for daysSince, extractTags, tagOverlap; ./types.js, ./types-v2.js
4
+ * [TO]: Consumed by engine.ts (rebuildV2Links, inspectV2Memory, getAlignmentSnapshot)
5
+ * [HERE]: packages/mem-core/src/engine-links.ts - V2 link materialization, conflict detection, procedural chain building
6
+ */
7
+ import { daysSince, extractTags, tagOverlap } from "./scoring.js";
8
+ export const AUTO_V2_LINK_PREFIX = "auto:v2:";
9
+ // ── Procedural chains ──────────────────────────────────────
10
+ export function buildProceduralChains(entries) {
11
+ const byId = new Map(entries.map((entry) => [entry.id, entry]));
12
+ const roots = entries.filter((entry) => !entry.supersededById || !byId.has(entry.supersededById));
13
+ return roots
14
+ .map((root) => {
15
+ const ids = new Set();
16
+ const stack = [root.id];
17
+ while (stack.length) {
18
+ const currentId = stack.pop();
19
+ if (!currentId || ids.has(currentId))
20
+ continue;
21
+ ids.add(currentId);
22
+ for (const entry of entries) {
23
+ if (entry.supersededById === currentId)
24
+ stack.push(entry.id);
25
+ if (entry.supersedesIds?.includes(currentId))
26
+ stack.push(entry.id);
27
+ }
28
+ }
29
+ const chainEntries = [...ids].map((id) => byId.get(id)).filter((entry) => Boolean(entry));
30
+ return {
31
+ rootId: root.id,
32
+ name: root.name,
33
+ status: root.status,
34
+ versionDepth: chainEntries.length,
35
+ ids: chainEntries
36
+ .sort((a, b) => {
37
+ const aVersion = a.version ?? 0;
38
+ const bVersion = b.version ?? 0;
39
+ if (aVersion !== bVersion)
40
+ return bVersion - aVersion;
41
+ return a.updatedAt.localeCompare(b.updatedAt);
42
+ })
43
+ .map((entry) => entry.id),
44
+ };
45
+ })
46
+ .filter((chain) => chain.versionDepth > 1)
47
+ .sort((a, b) => b.versionDepth - a.versionDepth || a.name.localeCompare(b.name));
48
+ }
49
+ // ── V2 link materialization ────────────────────────────────
50
+ export function materializeV2Links(semantic, procedural, existingLinks, autoLinkPrefix, now = new Date().toISOString()) {
51
+ const manualLinks = existingLinks.filter((link) => !link.id.startsWith(autoLinkPrefix));
52
+ const autoLinks = new Map();
53
+ const proceduralConflicts = detectProceduralConflicts(procedural.filter((entry) => entry.status !== "deprecated" && entry.status !== "superseded"));
54
+ const semanticConflicts = detectSemanticConflicts(semantic);
55
+ const addAutoLink = (fromId, toId, type, weight, evidence = []) => {
56
+ if (!fromId || !toId || fromId === toId)
57
+ return;
58
+ const directional = type === "supersedes";
59
+ const [normalizedFrom, normalizedTo] = directional || fromId < toId ? [fromId, toId] : [toId, fromId];
60
+ const id = `${autoLinkPrefix}${type}:${normalizedFrom}->${normalizedTo}`;
61
+ autoLinks.set(id, {
62
+ id,
63
+ fromId: normalizedFrom,
64
+ toId: normalizedTo,
65
+ type,
66
+ weight,
67
+ explicit: false,
68
+ createdAt: autoLinks.get(id)?.createdAt ?? now,
69
+ updatedAt: now,
70
+ evidence,
71
+ });
72
+ };
73
+ for (const entry of semantic) {
74
+ for (const supersededId of entry.supersedesIds ?? []) {
75
+ addAutoLink(entry.id, supersededId, "supersedes", 0.92);
76
+ }
77
+ if (entry.supersededById) {
78
+ addAutoLink(entry.supersededById, entry.id, "supersedes", 0.92);
79
+ }
80
+ }
81
+ for (const entry of procedural) {
82
+ for (const supersededId of entry.supersedesIds ?? []) {
83
+ addAutoLink(entry.id, supersededId, "supersedes", 0.94);
84
+ }
85
+ if (entry.supersededById) {
86
+ addAutoLink(entry.supersededById, entry.id, "supersedes", 0.94);
87
+ }
88
+ }
89
+ for (const conflict of semanticConflicts) {
90
+ addAutoLink(conflict.aId, conflict.bId, "conflicts-with", 0.88);
91
+ }
92
+ for (const conflict of proceduralConflicts) {
93
+ addAutoLink(conflict.aId, conflict.bId, "conflicts-with", Math.max(0.72, conflict.score));
94
+ }
95
+ return [...manualLinks, ...autoLinks.values()].sort((a, b) => a.id.localeCompare(b.id));
96
+ }
97
+ // ── Conflict detection ─────────────────────────────────────
98
+ export function detectProceduralConflicts(entries) {
99
+ const conflicts = [];
100
+ for (let i = 0; i < entries.length; i++) {
101
+ for (let j = i + 1; j < entries.length; j++) {
102
+ const a = entries[i];
103
+ const b = entries[j];
104
+ if (!a || !b || a.id === b.id)
105
+ continue;
106
+ const tagScore = tagOverlap(a.tags ?? [], b.tags ?? []);
107
+ const lexicalScore = tagOverlap(extractTags(`${a.name} ${a.searchText} ${a.summary}`), extractTags(`${b.name} ${b.searchText} ${b.summary}`));
108
+ const similarity = Math.max(tagScore, lexicalScore);
109
+ const sameIntent = a.searchText.trim().toLowerCase() === b.searchText.trim().toLowerCase() ||
110
+ a.name.trim().toLowerCase() === b.name.trim().toLowerCase();
111
+ const boundariesDiffer = (a.boundaries ?? "").trim().toLowerCase() !== (b.boundaries ?? "").trim().toLowerCase() ||
112
+ (a.contextText ?? "").trim().toLowerCase() !== (b.contextText ?? "").trim().toLowerCase();
113
+ if ((similarity >= 0.72 || sameIntent) && boundariesDiffer) {
114
+ conflicts.push({
115
+ aId: a.id,
116
+ bId: b.id,
117
+ aName: a.name,
118
+ bName: b.name,
119
+ score: Number(similarity.toFixed(3)),
120
+ reason: "High-overlap active procedures differ in boundaries or context.",
121
+ });
122
+ }
123
+ }
124
+ }
125
+ return conflicts.sort((a, b) => b.score - a.score || a.aName.localeCompare(b.aName));
126
+ }
127
+ export function detectSemanticConflicts(entries) {
128
+ const byId = new Map(entries.map((entry) => [entry.id, entry]));
129
+ const seen = new Set();
130
+ const conflicts = [];
131
+ for (const entry of entries) {
132
+ for (const conflictId of entry.conflictWithIds ?? []) {
133
+ const other = byId.get(conflictId);
134
+ if (!other)
135
+ continue;
136
+ const pairKey = [entry.id, other.id].sort().join("::");
137
+ if (seen.has(pairKey))
138
+ continue;
139
+ seen.add(pairKey);
140
+ conflicts.push({
141
+ aId: entry.id,
142
+ bId: other.id,
143
+ aName: entry.name,
144
+ bName: other.name,
145
+ reason: "Explicit semantic conflict link.",
146
+ });
147
+ }
148
+ }
149
+ return conflicts.sort((a, b) => a.aName.localeCompare(b.aName) || a.bName.localeCompare(b.bName));
150
+ }
151
+ // ── Alignment conflict detection ───────────────────────────
152
+ export function detectAlignmentConflicts(entries) {
153
+ const candidates = entries.filter((entry) => entry.stability !== "situational" &&
154
+ (entry.retention === "core" || entry.retention === "key-event") &&
155
+ !!(entry.summary || entry.detail || entry.name));
156
+ const conflicts = [];
157
+ const seen = new Set();
158
+ const positiveMarkers = ["prefer", "always", "use", "enable", "include", "like", "keep", "should"];
159
+ const negativeMarkers = ["avoid", "never", "disable", "remove", "dislike", "hate", "stop", "do not", "don't"];
160
+ const getText = (entry) => `${entry.name || ""} ${entry.summary || ""} ${entry.detail || ""}`.toLowerCase();
161
+ const polarity = (text) => {
162
+ const hasPositive = positiveMarkers.some((marker) => text.includes(marker));
163
+ const hasNegative = negativeMarkers.some((marker) => text.includes(marker));
164
+ if (hasPositive && !hasNegative)
165
+ return "positive";
166
+ if (hasNegative && !hasPositive)
167
+ return "negative";
168
+ return "neutral";
169
+ };
170
+ for (let i = 0; i < candidates.length; i++) {
171
+ for (let j = i + 1; j < candidates.length; j++) {
172
+ const a = candidates[i];
173
+ const b = candidates[j];
174
+ if (a.id === b.id)
175
+ continue;
176
+ const overlap = tagOverlap(a.tags, b.tags);
177
+ if (overlap < 0.45)
178
+ continue;
179
+ const aPolarity = polarity(getText(a));
180
+ const bPolarity = polarity(getText(b));
181
+ if (aPolarity === "neutral" || bPolarity === "neutral" || aPolarity === bPolarity)
182
+ continue;
183
+ const pairKey = [a.id, b.id].sort().join(":");
184
+ if (seen.has(pairKey))
185
+ continue;
186
+ seen.add(pairKey);
187
+ const severity = Math.min(1, overlap * 0.6 + ((a.salience ?? a.importance) + (b.salience ?? b.importance)) / 20 * 0.4);
188
+ const reason = `Potential conflict on shared context: ${aPolarity} vs ${bPolarity}`;
189
+ const recommendation = suggestConflictAction(a, b, severity);
190
+ const rationale = explainConflictAction(a, b, recommendation);
191
+ conflicts.push({ aId: a.id, bId: b.id, reason, severity, recommendation, rationale });
192
+ }
193
+ }
194
+ return conflicts.sort((a, b) => b.severity - a.severity);
195
+ }
196
+ export function suggestConflictAction(a, b, severity) {
197
+ const aStable = a.stability !== "situational";
198
+ const bStable = b.stability !== "situational";
199
+ const aRecent = daysSince(a.created) <= 14;
200
+ const bRecent = daysSince(b.created) <= 14;
201
+ const aLowSignal = (a.salience ?? a.importance) <= 4;
202
+ const bLowSignal = (b.salience ?? b.importance) <= 4;
203
+ if (aStable !== bStable)
204
+ return "mark-situational";
205
+ if (severity >= 0.8 && (aLowSignal || bLowSignal))
206
+ return "forget";
207
+ if (severity >= 0.65 && (aRecent || bRecent))
208
+ return "demote";
209
+ return "merge";
210
+ }
211
+ export function explainConflictAction(a, b, action) {
212
+ switch (action) {
213
+ case "mark-situational":
214
+ return "One side looks more temporary than the other, so this conflict likely comes from short-term context rather than true identity drift.";
215
+ case "forget":
216
+ return "One side has weak signal compared with the conflict risk, so forgetting the weaker memory is safer than keeping both.";
217
+ case "demote":
218
+ return "At least one side is recent enough that it may be an overfit; demoting it reduces the chance of personality drift.";
219
+ default:
220
+ return "Both memories may describe the same preference from different angles, so a merged memory is likely safer than keeping them separate.";
221
+ }
222
+ }
223
+ //# sourceMappingURL=engine-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-links.js","sourceRoot":"","sources":["../src/engine-links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * [WHO]: Provides selectRecallEntries — budget/tier/pick logic for progressive recall
3
+ * [FROM]: Depends on ./scoring.js for pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tierEntries; ./linking.js for getGraphNeighborhoodBySeeds; ./engine-scoring-v2.js for V2 scoring; ./engine-injection-text.js for conversation prefs
4
+ * [TO]: Consumed by engine.ts (getMemoryInjection)
5
+ * [HERE]: packages/mem-core/src/engine-recall-select.ts - recall entry selection and budget allocation
6
+ */
7
+ import { type GraphNeighbor } from "./linking.js";
8
+ import type { ProgressiveRecallConfig } from "./config.js";
9
+ import type { MemoryEntry, WorkEntry, Episode } from "./types.js";
10
+ import type { EpisodeFacet, EpisodeMemory, ProceduralMemory, SemanticMemory } from "./types-v2.js";
11
+ export interface RecallSelectionResult {
12
+ active: {
13
+ knowledge: MemoryEntry[];
14
+ lessons: MemoryEntry[];
15
+ events: MemoryEntry[];
16
+ preferences: MemoryEntry[];
17
+ facets: MemoryEntry[];
18
+ episodeMemories: EpisodeMemory[];
19
+ episodeFacets: EpisodeFacet[];
20
+ semanticMemories: SemanticMemory[];
21
+ procedural: ProceduralMemory[];
22
+ };
23
+ cue: {
24
+ knowledge: MemoryEntry[];
25
+ lessons: MemoryEntry[];
26
+ events: MemoryEntry[];
27
+ preferences: MemoryEntry[];
28
+ facets: MemoryEntry[];
29
+ episodes: Episode[];
30
+ work: WorkEntry[];
31
+ episodeMemories: EpisodeMemory[];
32
+ episodeFacets: EpisodeFacet[];
33
+ semanticMemories: SemanticMemory[];
34
+ procedural: ProceduralMemory[];
35
+ };
36
+ allEntries: MemoryEntry[];
37
+ graphContext: GraphNeighbor[];
38
+ injectedActiveKnowledge: MemoryEntry[];
39
+ injectedActiveLessons: MemoryEntry[];
40
+ injectedActiveEvents: MemoryEntry[];
41
+ injectedActivePrefs: MemoryEntry[];
42
+ injectedCueKnowledge: MemoryEntry[];
43
+ injectedCueLessons: MemoryEntry[];
44
+ injectedCueEvents: MemoryEntry[];
45
+ injectedCuePrefs: MemoryEntry[];
46
+ injectedCueEpisodes: Episode[];
47
+ legacyFacetBridgeActive: MemoryEntry[];
48
+ legacyFacetBridgeCue: MemoryEntry[];
49
+ }
50
+ export declare function selectRecallEntries(params: {
51
+ knowledge: MemoryEntry[];
52
+ lessons: MemoryEntry[];
53
+ events: MemoryEntry[];
54
+ prefs: MemoryEntry[];
55
+ facets: MemoryEntry[];
56
+ work: WorkEntry[];
57
+ episodes: Episode[];
58
+ v2Episodes: EpisodeMemory[];
59
+ v2EpisodeFacets: EpisodeFacet[];
60
+ v2Semantic: SemanticMemory[];
61
+ procedural: ProceduralMemory[];
62
+ allKnowledge: MemoryEntry[];
63
+ allLessons: MemoryEntry[];
64
+ allEvents: MemoryEntry[];
65
+ allPrefs: MemoryEntry[];
66
+ allFacets: MemoryEntry[];
67
+ semanticCandidates: Array<{
68
+ memoryId: string;
69
+ memoryKind: string;
70
+ score: number;
71
+ }>;
72
+ halfLife: Record<string, number>;
73
+ scoreWeights: {
74
+ recency: number;
75
+ importance: number;
76
+ relevance: number;
77
+ };
78
+ progressiveRecall: ProgressiveRecallConfig;
79
+ tokenBudget: number;
80
+ structuralWeight: number;
81
+ project: string;
82
+ contextTags: string[];
83
+ }): RecallSelectionResult;
84
+ //# sourceMappingURL=engine-recall-select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-recall-select.d.ts","sourceRoot":"","sources":["../src/engine-recall-select.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * [WHO]: Provides selectRecallEntries — budget/tier/pick logic for progressive recall
3
+ * [FROM]: Depends on ./scoring.js for pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tierEntries; ./linking.js for getGraphNeighborhoodBySeeds; ./engine-scoring-v2.js for V2 scoring; ./engine-injection-text.js for conversation prefs
4
+ * [TO]: Consumed by engine.ts (getMemoryInjection)
5
+ * [HERE]: packages/mem-core/src/engine-recall-select.ts - recall entry selection and budget allocation
6
+ */
7
+ import { selectConversationPreferences, mergeUniqueEntries } from "./engine-injection-text.js";
8
+ import { scoreEpisodeMemory, scoreEpisodeFacet, scoreV2SemanticMemory, scoreProceduralMemory, } from "./engine-scoring-v2.js";
9
+ import { getGraphNeighborhoodBySeeds } from "./linking.js";
10
+ import { pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tierEntries, } from "./scoring.js";
11
+ export function selectRecallEntries(params) {
12
+ const { knowledge, lessons, events, prefs, facets, work, episodes, v2Episodes, v2EpisodeFacets, v2Semantic, procedural, allKnowledge, allLessons, allEvents, allPrefs, allFacets, semanticCandidates, halfLife: hl, scoreWeights: sw, progressiveRecall: pr, tokenBudget, structuralWeight, project, contextTags, } = params;
13
+ const semanticEpisodeIds = new Set(semanticCandidates.filter((item) => item.memoryKind === "episode").map((item) => item.memoryId));
14
+ const semanticFacetIds = new Set(semanticCandidates.filter((item) => item.memoryKind === "facet").map((item) => item.memoryId));
15
+ const semanticProcedureIds = new Set(semanticCandidates.filter((item) => item.memoryKind === "procedural").map((item) => item.memoryId));
16
+ const semanticV2SemanticIds = new Set(semanticCandidates.filter((item) => item.memoryKind === "semantic").map((item) => item.memoryId));
17
+ // Tier all MemoryEntry categories
18
+ const tieredKnowledge = tierEntries(knowledge, project, contextTags, hl, sw, pr);
19
+ const tieredLessons = tierEntries(lessons, project, contextTags, hl, sw, pr);
20
+ const tieredEvents = tierEntries(events, project, contextTags, hl, sw, pr);
21
+ const tieredPrefs = tierEntries(prefs, project, contextTags, hl, sw, pr);
22
+ const tieredFacets = tierEntries(facets, project, contextTags, hl, sw, pr);
23
+ const forcedConversationPrefs = selectConversationPreferences(prefs);
24
+ // Budget calculation
25
+ const totalChars = tokenBudget * 4;
26
+ const activeChars = Math.floor(totalChars * pr.budgetActive);
27
+ const cueChars = Math.floor(totalChars * pr.budgetCue);
28
+ const proceduralChars = Math.floor(totalChars * 0.18);
29
+ // Entry length helpers
30
+ const activeLen = (e) => (e.name?.length || 0) + (e.summary?.length || 0) + (e.detail?.length || 0) + 30;
31
+ const cueLen = (e) => (e.name?.length || 0) + (e.summary?.length || 0) + 30;
32
+ const scoreFn = (e) => scoreEntry(e, project, contextTags, hl, sw);
33
+ const proceduralLen = (pItem) => (pItem.name?.length || 0) + (pItem.summary?.length || 0) + pItem.steps.reduce((sum, step) => sum + step.text.length, 0) + 60;
34
+ const proceduralCueLen = (pItem) => (pItem.name?.length || 0) + (pItem.summary?.length || 0) + 40;
35
+ const proceduralScoreFn = (pItem) => scoreProceduralMemory(pItem, project, contextTags, structuralWeight);
36
+ const episodeMemoryLen = (item) => (item.title?.length || 0) + item.summary.length + 40;
37
+ const episodeFacetLen = (item) => item.searchText.length + (item.anchorText?.length || 0) + (item.summary?.length || 0) + 40;
38
+ const episodeCueLen = (item) => (item.title?.length || 0) + item.summary.length + 36;
39
+ const episodeFacetCueLen = (item) => item.searchText.length + (item.summary?.length || 0) + (item.anchorText?.length || 0) + 36;
40
+ const semanticMemoryLen = (item) => (item.name?.length || 0) + item.summary.length + (item.detail?.length || 0) + 40;
41
+ const semanticMemoryCueLen = (item) => (item.name?.length || 0) + item.summary.length + 36;
42
+ const episodeScoreFn = (item) => scoreEpisodeMemory(item, project, contextTags, structuralWeight);
43
+ const episodeFacetScoreFn = (item) => scoreEpisodeFacet(item, project, contextTags, structuralWeight);
44
+ const semanticMemoryScoreFn = (item) => scoreV2SemanticMemory(item, project, contextTags, structuralWeight);
45
+ // Active tier
46
+ const activeBudgetPer = Math.floor(activeChars / 5);
47
+ const activeKnowledge = pickTop(tieredKnowledge.active, scoreFn, activeLen, activeBudgetPer);
48
+ const activeLessons = pickTop(tieredLessons.active, scoreFn, activeLen, activeBudgetPer);
49
+ const activeEvents = pickTop(tieredEvents.active, scoreFn, activeLen, activeBudgetPer);
50
+ const activePrefs = mergeUniqueEntries(forcedConversationPrefs, pickTop(tieredPrefs.active, scoreFn, activeLen, activeBudgetPer));
51
+ const activeFacets = pickTop(tieredFacets.active, scoreFn, activeLen, activeBudgetPer);
52
+ const activeProcedural = pickTop(procedural.filter((item) => semanticProcedureIds.has(item.id) || proceduralScoreFn(item) >= 0.45), proceduralScoreFn, proceduralLen, Math.max(400, Math.floor(proceduralChars * 0.55)));
53
+ const activeEpisodeMemories = pickTop(v2Episodes.filter((item) => semanticEpisodeIds.has(item.id) || episodeScoreFn(item) >= 0.45), episodeScoreFn, episodeMemoryLen, Math.max(320, Math.floor(activeChars * 0.18)));
54
+ const activeEpisodeFacets = pickTop(v2EpisodeFacets.filter((item) => semanticFacetIds.has(item.id) || episodeFacetScoreFn(item) >= 0.42), episodeFacetScoreFn, episodeFacetLen, Math.max(320, Math.floor(activeChars * 0.18)));
55
+ const activeSemanticMemories = pickTop(v2Semantic.filter((item) => semanticV2SemanticIds.has(item.id) || semanticMemoryScoreFn(item) >= 0.42), semanticMemoryScoreFn, semanticMemoryLen, Math.max(280, Math.floor(activeChars * 0.16)));
56
+ const activeSeeds = [...activeKnowledge, ...activeLessons, ...activeEvents, ...activePrefs, ...activeFacets];
57
+ const allEntries = [...allKnowledge, ...allLessons, ...allEvents, ...allPrefs, ...allFacets];
58
+ const activeIds = new Set(activeSeeds.map((entry) => entry.id));
59
+ const graphContext = getGraphNeighborhoodBySeeds(activeSeeds, allEntries, 8).filter((neighbor) => !activeIds.has(neighbor.entry.id));
60
+ // Cue tier
61
+ const cueBudgetPer = Math.floor(cueChars / 7);
62
+ const cueKnowledge = pickTop(tieredKnowledge.cue, scoreFn, cueLen, cueBudgetPer);
63
+ const cueLessons = pickTop(tieredLessons.cue, scoreFn, cueLen, cueBudgetPer);
64
+ const cueEvents = pickTop(tieredEvents.cue, scoreFn, cueLen, cueBudgetPer);
65
+ const forcedConversationPrefIds = new Set(forcedConversationPrefs.map((entry) => entry.id));
66
+ const cuePrefs = pickTop(tieredPrefs.cue.filter((entry) => !forcedConversationPrefIds.has(entry.id)), scoreFn, cueLen, cueBudgetPer);
67
+ const cueFacets = pickTop(tieredFacets.cue, scoreFn, cueLen, cueBudgetPer);
68
+ const graphContextIds = new Set(graphContext.map((neighbor) => neighbor.entry.id));
69
+ const dedupeCue = (entries) => entries.filter((entry) => !graphContextIds.has(entry.id));
70
+ const dedupedCueKnowledge = dedupeCue(cueKnowledge);
71
+ const dedupedCueLessons = dedupeCue(cueLessons);
72
+ const dedupedCueEvents = dedupeCue(cueEvents);
73
+ const dedupedCuePrefs = dedupeCue(cuePrefs);
74
+ const dedupedCueFacets = dedupeCue(cueFacets);
75
+ const topEpisodes = pickTop(episodes, (ep) => scoreEpisode(ep, project, contextTags, hl, sw), (ep) => ep.summary.length + 30, cueBudgetPer);
76
+ const topWork = pickTop(work, (w) => scoreWorkEntry(w, project, contextTags, hl, sw), (w) => w.goal.length + w.summary.length + 30, cueBudgetPer);
77
+ const cueProcedural = pickTop(procedural.filter((item) => !activeProcedural.some((activeItem) => activeItem.id === item.id)), proceduralScoreFn, proceduralCueLen, Math.max(280, Math.floor(proceduralChars * 0.45)));
78
+ const cueEpisodeMemories = pickTop(v2Episodes.filter((item) => !activeEpisodeMemories.some((activeItem) => activeItem.id === item.id)), episodeScoreFn, episodeCueLen, Math.max(220, Math.floor(cueChars * 0.12)));
79
+ const cueEpisodeFacets = pickTop(v2EpisodeFacets.filter((item) => !activeEpisodeFacets.some((activeItem) => activeItem.id === item.id)), episodeFacetScoreFn, episodeFacetCueLen, Math.max(220, Math.floor(cueChars * 0.12)));
80
+ const cueSemanticMemories = pickTop(v2Semantic.filter((item) => !activeSemanticMemories.some((activeItem) => activeItem.id === item.id)), semanticMemoryScoreFn, semanticMemoryCueLen, Math.max(220, Math.floor(cueChars * 0.12)));
81
+ const legacyFacetBridgeActive = activeFacets.filter((entry) => entry.facetData?.kind === "pattern" || entry.facetData?.kind === "struggle");
82
+ const legacyFacetBridgeCue = dedupedCueFacets.filter((entry) => entry.facetData?.kind === "pattern" || entry.facetData?.kind === "struggle");
83
+ const v2SignalCount = activeEpisodeMemories.length + activeEpisodeFacets.length + activeSemanticMemories.length + activeProcedural.length +
84
+ cueEpisodeMemories.length + cueEpisodeFacets.length + cueSemanticMemories.length + cueProcedural.length;
85
+ const useLegacyFallback = v2SignalCount === 0;
86
+ const injectedActiveKnowledge = useLegacyFallback ? activeKnowledge : [];
87
+ const injectedActiveLessons = useLegacyFallback ? activeLessons : [];
88
+ const injectedActiveEvents = useLegacyFallback ? activeEvents : [];
89
+ const injectedActivePrefs = useLegacyFallback ? activePrefs : [];
90
+ const injectedCueKnowledge = useLegacyFallback ? dedupedCueKnowledge : [];
91
+ const injectedCueLessons = useLegacyFallback ? dedupedCueLessons : [];
92
+ const injectedCueEvents = useLegacyFallback ? dedupedCueEvents : [];
93
+ const injectedCuePrefs = useLegacyFallback ? dedupedCuePrefs : [];
94
+ const injectedCueEpisodes = useLegacyFallback ? topEpisodes : [];
95
+ return {
96
+ active: {
97
+ knowledge: injectedActiveKnowledge,
98
+ lessons: injectedActiveLessons,
99
+ events: injectedActiveEvents,
100
+ preferences: injectedActivePrefs,
101
+ facets: legacyFacetBridgeActive,
102
+ episodeMemories: activeEpisodeMemories,
103
+ episodeFacets: activeEpisodeFacets,
104
+ semanticMemories: activeSemanticMemories,
105
+ procedural: activeProcedural,
106
+ },
107
+ cue: {
108
+ knowledge: injectedCueKnowledge,
109
+ lessons: injectedCueLessons,
110
+ events: injectedCueEvents,
111
+ preferences: injectedCuePrefs,
112
+ facets: legacyFacetBridgeCue,
113
+ episodes: injectedCueEpisodes,
114
+ work: topWork,
115
+ episodeMemories: cueEpisodeMemories,
116
+ episodeFacets: cueEpisodeFacets,
117
+ semanticMemories: cueSemanticMemories,
118
+ procedural: cueProcedural,
119
+ },
120
+ allEntries,
121
+ graphContext,
122
+ injectedActiveKnowledge, injectedActiveLessons, injectedActiveEvents, injectedActivePrefs,
123
+ injectedCueKnowledge, injectedCueLessons, injectedCueEvents, injectedCuePrefs, injectedCueEpisodes,
124
+ legacyFacetBridgeActive, legacyFacetBridgeCue,
125
+ };
126
+ }
127
+ //# sourceMappingURL=engine-recall-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-recall-select.js","sourceRoot":"","sources":["../src/engine-recall-select.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * [WHO]: Provides reinforceProcedural, reinforceEpisodeMemories, reinforceEpisodeFacets, reinforceV2SemanticMemories, reinforceWork, reconsolidateV2AfterRecall, reconsolidateIfNeeded
3
+ * [FROM]: Depends on ./store.js, ./store-v2.js, ./eviction.js, ./linking.js, ./scoring.js, ./reconsolidate-v2.js, ./i18n.js, ./types.js, ./types-v2.js
4
+ * [TO]: Consumed by engine.ts (getMemoryInjection)
5
+ * [HERE]: packages/mem-core/src/engine-reinforce.ts - memory reinforcement and reconsolidation after recall
6
+ */
7
+ import { type NanoMemV2Paths } from "./store-v2.js";
8
+ import type { LlmFn, MemoryEntry, WorkEntry } from "./types.js";
9
+ import type { EpisodeFacet, EpisodeMemory, ProceduralMemory, SemanticMemory } from "./types-v2.js";
10
+ import type { NanomemConfig } from "./config.js";
11
+ export declare function reinforceProcedural(recalled: ProceduralMemory[], all: ProceduralMemory[], v2Paths: NanoMemV2Paths): Promise<void>;
12
+ export declare function reinforceEpisodeMemories(recalled: EpisodeMemory[], all: EpisodeMemory[], v2Paths: NanoMemV2Paths): Promise<void>;
13
+ export declare function reinforceEpisodeFacets(recalled: EpisodeFacet[], all: EpisodeFacet[], v2Paths: NanoMemV2Paths): Promise<void>;
14
+ export declare function reinforceV2SemanticMemories(recalled: SemanticMemory[], all: SemanticMemory[], v2Paths: NanoMemV2Paths): Promise<void>;
15
+ export declare function reinforceWork(recalled: WorkEntry[], all: WorkEntry[], workPath: string, cfg: NanomemConfig): Promise<void>;
16
+ export declare function reconsolidateV2AfterRecall(episodes: EpisodeMemory[], facets: EpisodeFacet[], procedural: ProceduralMemory[], recalledEpisodes: EpisodeMemory[], recalledFacets: EpisodeFacet[], recalledProcedural: ProceduralMemory[], v2Paths: NanoMemV2Paths, rebuildLinksFn: () => Promise<void>): Promise<void>;
17
+ export declare function reconsolidateIfNeeded(recalled: MemoryEntry[], contextTags: string[], locale: string, llmFn: LlmFn): Promise<void>;
18
+ //# sourceMappingURL=engine-reinforce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-reinforce.d.ts","sourceRoot":"","sources":["../src/engine-reinforce.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAON,KAAK,cAAc,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvI;AAED,wBAAsB,wBAAwB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAWtI;AAED,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlI;AAED,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3I;AAED,wBAAsB,aAAa,CAClC,QAAQ,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EACvC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAClC,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,0BAA0B,CAC/C,QAAQ,EAAE,aAAa,EAAE,EACzB,MAAM,EAAE,YAAY,EAAE,EACtB,UAAU,EAAE,gBAAgB,EAAE,EAC9B,gBAAgB,EAAE,aAAa,EAAE,EACjC,cAAc,EAAE,YAAY,EAAE,EAC9B,kBAAkB,EAAE,gBAAgB,EAAE,EACtC,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,qBAAqB,CAC1C,QAAQ,EAAE,WAAW,EAAE,EACvB,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * [WHO]: Provides reinforceProcedural, reinforceEpisodeMemories, reinforceEpisodeFacets, reinforceV2SemanticMemories, reinforceWork, reconsolidateV2AfterRecall, reconsolidateIfNeeded
3
+ * [FROM]: Depends on ./store.js, ./store-v2.js, ./eviction.js, ./linking.js, ./scoring.js, ./reconsolidate-v2.js, ./i18n.js, ./types.js, ./types-v2.js
4
+ * [TO]: Consumed by engine.ts (getMemoryInjection)
5
+ * [HERE]: packages/mem-core/src/engine-reinforce.ts - memory reinforcement and reconsolidation after recall
6
+ */
7
+ import { PROMPTS } from "./i18n.js";
8
+ import { reconsolidateV2Memories } from "./reconsolidate-v2.js";
9
+ import { extractTags, tagOverlap } from "./scoring.js";
10
+ import { saveWork } from "./store.js";
11
+ import { loadV2Meta, saveV2Episodes, saveV2Facets, saveV2Meta, saveV2Procedural, saveV2Semantic, } from "./store-v2.js";
12
+ import { utilityWork } from "./eviction.js";
13
+ export async function reinforceProcedural(recalled, all, v2Paths) {
14
+ if (!recalled.length)
15
+ return;
16
+ const ids = new Set(recalled.map((entry) => entry.id));
17
+ const now = new Date().toISOString();
18
+ for (const entry of all) {
19
+ if (!ids.has(entry.id))
20
+ continue;
21
+ entry.accessCount = (entry.accessCount ?? 0) + 1;
22
+ entry.lastAccessedAt = now;
23
+ entry.updatedAt = entry.updatedAt || now;
24
+ }
25
+ await saveV2Procedural(v2Paths, all);
26
+ }
27
+ export async function reinforceEpisodeMemories(recalled, all, v2Paths) {
28
+ if (!recalled.length)
29
+ return;
30
+ const ids = new Set(recalled.map((entry) => entry.id));
31
+ const now = new Date().toISOString();
32
+ for (const entry of all) {
33
+ if (!ids.has(entry.id))
34
+ continue;
35
+ entry.accessCount = (entry.accessCount ?? 0) + 1;
36
+ entry.lastAccessedAt = now;
37
+ entry.updatedAt = entry.updatedAt || now;
38
+ }
39
+ await saveV2Episodes(v2Paths, all);
40
+ }
41
+ export async function reinforceEpisodeFacets(recalled, all, v2Paths) {
42
+ if (!recalled.length)
43
+ return;
44
+ const ids = new Set(recalled.map((entry) => entry.id));
45
+ const now = new Date().toISOString();
46
+ for (const entry of all) {
47
+ if (!ids.has(entry.id))
48
+ continue;
49
+ entry.accessCount = (entry.accessCount ?? 0) + 1;
50
+ entry.lastAccessedAt = now;
51
+ entry.updatedAt = entry.updatedAt || now;
52
+ }
53
+ await saveV2Facets(v2Paths, all);
54
+ }
55
+ export async function reinforceV2SemanticMemories(recalled, all, v2Paths) {
56
+ if (!recalled.length)
57
+ return;
58
+ const ids = new Set(recalled.map((entry) => entry.id));
59
+ const now = new Date().toISOString();
60
+ for (const entry of all) {
61
+ if (!ids.has(entry.id))
62
+ continue;
63
+ entry.accessCount = (entry.accessCount ?? 0) + 1;
64
+ entry.lastAccessedAt = now;
65
+ entry.updatedAt = entry.updatedAt || now;
66
+ }
67
+ await saveV2Semantic(v2Paths, all);
68
+ }
69
+ export async function reinforceWork(recalled, all, workPath, cfg) {
70
+ const ids = new Set(recalled.map((w) => w.id));
71
+ const now = new Date().toISOString();
72
+ for (const w of all) {
73
+ if (ids.has(w.id)) {
74
+ w.accessCount = (w.accessCount ?? 0) + 1;
75
+ w.lastAccessed = now;
76
+ w.strength = (w.strength || 45) * cfg.strengthGrowthFactor;
77
+ }
78
+ }
79
+ await saveWork(workPath, all, cfg.maxEntries.work, (w) => utilityWork(w, cfg.halfLife, cfg.evictionWeights));
80
+ }
81
+ export async function reconsolidateV2AfterRecall(episodes, facets, procedural, recalledEpisodes, recalledFacets, recalledProcedural, v2Paths, rebuildLinksFn) {
82
+ const reconsolidated = reconsolidateV2Memories(episodes, facets, procedural, recalledEpisodes.map((entry) => entry.id), recalledFacets.map((entry) => entry.id), recalledProcedural.map((entry) => entry.id));
83
+ await Promise.all([
84
+ saveV2Episodes(v2Paths, reconsolidated.episodes),
85
+ saveV2Facets(v2Paths, reconsolidated.facets),
86
+ saveV2Procedural(v2Paths, reconsolidated.procedural),
87
+ saveV2Meta(v2Paths, {
88
+ ...(await loadV2Meta(v2Paths)),
89
+ lastReconsolidationAt: new Date().toISOString(),
90
+ }),
91
+ ]);
92
+ await rebuildLinksFn();
93
+ }
94
+ export async function reconsolidateIfNeeded(recalled, contextTags, locale, llmFn) {
95
+ const p = PROMPTS[locale];
96
+ for (const entry of recalled) {
97
+ const overlap = tagOverlap(entry.tags, contextTags);
98
+ if (overlap >= 0.3)
99
+ continue;
100
+ try {
101
+ const memText = entry.detail || entry.summary || entry.content || "";
102
+ const updated = await llmFn(p.reconsolidationSystem, `Original memory: ${memText}\n\nCurrent context tags: ${contextTags.join(", ")}`);
103
+ if (updated && updated.length > 10) {
104
+ const trimmed = updated.trim();
105
+ entry.detail = trimmed;
106
+ entry.content = trimmed;
107
+ entry.summary = trimmed.length <= 150 ? trimmed : `${trimmed.slice(0, 147)}...`;
108
+ entry.tags = extractTags(trimmed);
109
+ }
110
+ }
111
+ catch {
112
+ /* graceful degradation */
113
+ }
114
+ }
115
+ }
116
+ //# sourceMappingURL=engine-reinforce.js.map