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,199 @@
1
+ /**
2
+ * [WHO]: consolidateEpisodes, extractFactsFromEpisodes, extractLessonsFromEpisodes
3
+ * [FROM]: Depends on ./config.js, ./diagnostics.js, ./i18n.js, ./llm-json.js, ./scoring.js, ./store.js, ./types.js
4
+ * [TO]: Consumed by packages/mem-core/src/index.ts
5
+ * [HERE]: packages/mem-core/src/consolidation.ts - episodic→semantic consolidation, heart of multi-store memory model
6
+ */
7
+ import { reportDiagnostic } from "./diagnostics.js";
8
+ import { PROMPTS } from "./i18n.js";
9
+ import { parseLlmJson } from "./llm-json.js";
10
+ import { extractTags } from "./scoring.js";
11
+ import { deriveNameFromContent, deriveSummaryFromContent } from "./store.js";
12
+ function makeId() {
13
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
14
+ }
15
+ export async function consolidateEpisodes(episodes, cfg, llmFn, options) {
16
+ const unconsolidated = episodes.filter((ep) => !ep.consolidated);
17
+ if (unconsolidated.length < cfg.consolidationThreshold)
18
+ return [];
19
+ if (options?.signal?.aborted) {
20
+ throw new Error("AbortError");
21
+ }
22
+ let newEntries;
23
+ if (llmFn) {
24
+ newEntries = await llmConsolidation(unconsolidated, cfg, llmFn, options?.signal);
25
+ }
26
+ else {
27
+ newEntries = heuristicConsolidation(unconsolidated, cfg);
28
+ }
29
+ if (options?.signal?.aborted) {
30
+ throw new Error("AbortError");
31
+ }
32
+ for (const ep of unconsolidated)
33
+ ep.consolidated = true;
34
+ return newEntries;
35
+ }
36
+ async function llmConsolidation(episodes, cfg, llmFn, signal) {
37
+ const p = PROMPTS[cfg.locale] ?? PROMPTS.en;
38
+ const summary = episodes
39
+ .map((ep) => `[${ep.date}] ${ep.project}: ${ep.summary}\nFiles: ${ep.filesModified.join(", ")}\nErrors: ${ep.errors.join("; ") || "none"}`)
40
+ .join("\n\n");
41
+ if (signal?.aborted)
42
+ throw new Error("AbortError");
43
+ const raw = await llmFn(p.consolidationSystem, summary);
44
+ if (signal?.aborted)
45
+ throw new Error("AbortError");
46
+ try {
47
+ const items = parseLlmJson(raw);
48
+ if (!Array.isArray(items))
49
+ throw new Error("LLM consolidation response must be a JSON array");
50
+ const now = new Date().toISOString();
51
+ return items.map((item) => {
52
+ const type = item.type === "lesson" ? "lesson" : item.type === "event" ? "event" : "fact";
53
+ const detail = item.detail || item.content || "";
54
+ const name = item.name || deriveNameFromContent(detail);
55
+ const summary = item.summary || deriveSummaryFromContent(detail);
56
+ return {
57
+ id: makeId(),
58
+ type,
59
+ name,
60
+ summary,
61
+ detail,
62
+ content: detail,
63
+ tags: extractTags(`${name} ${summary} ${detail}`),
64
+ project: episodes[0]?.project ?? "unknown",
65
+ importance: item.importance ?? 6,
66
+ strength: cfg.halfLife[type] ?? 30,
67
+ created: now,
68
+ eventTime: now,
69
+ accessCount: 0,
70
+ relatedIds: [],
71
+ retention: type === "event" ? "key-event" : type === "lesson" ? "key-event" : "ambient",
72
+ salience: type === "event" ? Math.max(8, item.importance ?? 8) : item.importance ?? 6,
73
+ stability: type === "event" ? "stable" : type === "lesson" ? "stable" : "situational",
74
+ scope: cfg.defaultScope,
75
+ };
76
+ });
77
+ }
78
+ catch (err) {
79
+ reportDiagnostic({
80
+ source: "mem-core.consolidate",
81
+ severity: "warning",
82
+ category: "fallback",
83
+ message: "consolidateWithLLM failed, falling back to heuristic",
84
+ detail: { error: formatFallbackError(err) },
85
+ fingerprint: "mem-core.consolidate:fallback:llm-failure",
86
+ });
87
+ return heuristicConsolidation(episodes, cfg);
88
+ }
89
+ }
90
+ function formatFallbackError(err) {
91
+ if (err instanceof Error)
92
+ return `${err.name}: ${err.message}`;
93
+ return String(err);
94
+ }
95
+ function heuristicConsolidation(episodes, cfg) {
96
+ const now = new Date().toISOString();
97
+ const result = [];
98
+ const fileCounts = new Map();
99
+ for (const ep of episodes) {
100
+ for (const f of ep.filesModified)
101
+ fileCounts.set(f, (fileCounts.get(f) ?? 0) + 1);
102
+ }
103
+ const hotFiles = [...fileCounts.entries()]
104
+ .filter(([, c]) => c >= 3)
105
+ .sort((a, b) => b[1] - a[1])
106
+ .slice(0, 5);
107
+ if (hotFiles.length) {
108
+ const detail = `Frequently modified files: ${hotFiles.map(([f, c]) => `${f} (${c}x)`).join(", ")}`;
109
+ const name = deriveNameFromContent(detail);
110
+ const summary = deriveSummaryFromContent(detail);
111
+ result.push({
112
+ id: makeId(),
113
+ type: "fact",
114
+ name,
115
+ summary,
116
+ detail,
117
+ content: detail,
118
+ tags: extractTags(detail),
119
+ project: episodes[0]?.project ?? "unknown",
120
+ importance: 5,
121
+ strength: cfg.halfLife.fact ?? 60,
122
+ created: now,
123
+ eventTime: now,
124
+ accessCount: 0,
125
+ relatedIds: [],
126
+ stability: "situational",
127
+ scope: cfg.defaultScope,
128
+ });
129
+ }
130
+ const allErrors = episodes.flatMap((ep) => ep.errors).filter(Boolean);
131
+ if (allErrors.length) {
132
+ const errorSet = [...new Set(allErrors)].slice(0, 5);
133
+ const detail = `Recurring issues: ${errorSet.join("; ")}`;
134
+ const name = deriveNameFromContent(detail);
135
+ const summary = deriveSummaryFromContent(detail);
136
+ result.push({
137
+ id: makeId(),
138
+ type: "lesson",
139
+ name,
140
+ summary,
141
+ detail,
142
+ content: detail,
143
+ tags: extractTags(detail),
144
+ project: episodes[0]?.project ?? "unknown",
145
+ importance: 7,
146
+ strength: cfg.halfLife.lesson ?? 90,
147
+ created: now,
148
+ eventTime: now,
149
+ accessCount: 0,
150
+ relatedIds: [],
151
+ retention: "key-event",
152
+ salience: 8,
153
+ stability: "stable",
154
+ scope: cfg.defaultScope,
155
+ });
156
+ }
157
+ const significantEpisodes = [...episodes]
158
+ .filter((ep) => ep.importance >= 8 || ep.errors.length >= 2)
159
+ .sort((a, b) => b.importance - a.importance)
160
+ .slice(0, 3);
161
+ for (const ep of significantEpisodes) {
162
+ const detailParts = [
163
+ ep.summary,
164
+ ep.userGoal ? `Goal: ${ep.userGoal}` : "",
165
+ ep.errors.length ? `Errors: ${ep.errors.join("; ")}` : "",
166
+ ep.keyObservations.length ? `Observations: ${ep.keyObservations.slice(0, 4).join("; ")}` : "",
167
+ ].filter(Boolean);
168
+ const detail = detailParts.join("\n");
169
+ const name = ep.userGoal ? deriveNameFromContent(ep.userGoal) : deriveNameFromContent(ep.summary);
170
+ const summary = deriveSummaryFromContent(ep.summary || ep.userGoal || detail);
171
+ result.push({
172
+ id: makeId(),
173
+ type: "event",
174
+ name,
175
+ summary,
176
+ detail,
177
+ content: detail,
178
+ tags: extractTags(`${ep.project} ${ep.summary} ${ep.userGoal || ""} ${ep.errors.join(" ")}`),
179
+ project: ep.project || "unknown",
180
+ importance: Math.min(10, Math.max(8, ep.importance)),
181
+ strength: cfg.halfLife.event ?? 180,
182
+ created: now,
183
+ eventTime: ep.date ? new Date(ep.date).toISOString() : now,
184
+ accessCount: 0,
185
+ relatedIds: [],
186
+ retention: "key-event",
187
+ salience: Math.min(10, Math.max(8, ep.importance + ep.errors.length)),
188
+ stability: ep.errors.length ? "situational" : "stable",
189
+ eventData: {
190
+ kind: ep.errors.length ? "incident" : "milestone",
191
+ outcome: ep.errors.length ? "Captured from a high-friction session" : "Captured from a high-importance session",
192
+ emotionalWeight: Math.min(10, ep.importance),
193
+ },
194
+ scope: cfg.defaultScope,
195
+ });
196
+ }
197
+ return result;
198
+ }
199
+ //# sourceMappingURL=consolidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidation.js","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * [WHO]: dedupeMemoryEntries, dedupeWorkEntries, mergeRelatedIds
3
+ * [FROM]: Depends on ./scoring.js, ./types.js, ./update.js
4
+ * [TO]: Consumed by packages/mem-core/src/index.ts
5
+ * [HERE]: packages/mem-core/src/dedup.ts - batch deduplication and cross-entry merge logic
6
+ */
7
+ import type { MemoryEntry, WorkEntry } from "./types.js";
8
+ /** Deduplicate MemoryEntry array. Keeps best of each duplicate group, merges relatedIds. */
9
+ export declare function deduplicateMemoryEntries(entries: MemoryEntry[]): {
10
+ deduped: MemoryEntry[];
11
+ removedCount: number;
12
+ };
13
+ /** Deduplicate WorkEntry array. */
14
+ export declare function deduplicateWorkEntries(entries: WorkEntry[]): {
15
+ deduped: WorkEntry[];
16
+ removedCount: number;
17
+ };
18
+ //# sourceMappingURL=dedup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiDzD,4FAA4F;AAC5F,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAcjH;AAED,mCAAmC;AACnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG;IAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAc3G"}
package/dist/dedup.js ADDED
@@ -0,0 +1,85 @@
1
+ /**
2
+ * [WHO]: dedupeMemoryEntries, dedupeWorkEntries, mergeRelatedIds
3
+ * [FROM]: Depends on ./scoring.js, ./types.js, ./update.js
4
+ * [TO]: Consumed by packages/mem-core/src/index.ts
5
+ * [HERE]: packages/mem-core/src/dedup.ts - batch deduplication and cross-entry merge logic
6
+ */
7
+ import { tagOverlap } from "./scoring.js";
8
+ import { contentSimilarity } from "./update.js";
9
+ const NOOP_TAG_THRESHOLD = 0.75;
10
+ const NOOP_CONTENT_THRESHOLD = 0.8;
11
+ function isMemoryDuplicate(a, b) {
12
+ if (a.type !== b.type)
13
+ return false;
14
+ const aText = `${a.name || ""} ${a.summary || ""} ${a.content || ""}`.trim();
15
+ const bText = `${b.name || ""} ${b.summary || ""} ${b.content || ""}`.trim();
16
+ const tagMatch = tagOverlap(a.tags, b.tags) >= NOOP_TAG_THRESHOLD;
17
+ const contentMatch = contentSimilarity(aText, bText) >= NOOP_CONTENT_THRESHOLD;
18
+ return tagMatch || contentMatch;
19
+ }
20
+ function isWorkDuplicate(a, b) {
21
+ const aText = `${a.goal} ${a.summary}`.trim();
22
+ const bText = `${b.goal} ${b.summary}`.trim();
23
+ const tagMatch = tagOverlap(a.tags, b.tags) >= NOOP_TAG_THRESHOLD;
24
+ const contentMatch = contentSimilarity(aText, bText) >= NOOP_CONTENT_THRESHOLD;
25
+ return tagMatch || contentMatch;
26
+ }
27
+ /** Merge duplicate into keeper: relatedIds union, max importance/accessCount, latest lastAccessed */
28
+ function mergeMemoryInto(keeper, duplicate) {
29
+ const ids = new Set([...(keeper.relatedIds || []), ...(duplicate.relatedIds || []), duplicate.id]);
30
+ keeper.relatedIds = [...ids];
31
+ keeper.importance = Math.max(keeper.importance, duplicate.importance);
32
+ keeper.accessCount = Math.max(keeper.accessCount, duplicate.accessCount);
33
+ if ((duplicate.lastAccessed || "") > (keeper.lastAccessed || ""))
34
+ keeper.lastAccessed = duplicate.lastAccessed;
35
+ }
36
+ function mergeWorkInto(keeper, duplicate) {
37
+ const ids = new Set([...(keeper.relatedIds || []), ...(duplicate.relatedIds || []), duplicate.id]);
38
+ keeper.relatedIds = [...ids];
39
+ keeper.importance = Math.max(keeper.importance, duplicate.importance);
40
+ keeper.accessCount = Math.max(keeper.accessCount, duplicate.accessCount);
41
+ if ((duplicate.lastAccessed || "") > (keeper.lastAccessed || ""))
42
+ keeper.lastAccessed = duplicate.lastAccessed;
43
+ }
44
+ /** Sort by quality (best first) so we keep the best of each duplicate group */
45
+ function memoryQuality(e) {
46
+ return (e.accessCount + 1) * e.importance;
47
+ }
48
+ function workQuality(w) {
49
+ return (w.accessCount + 1) * w.importance;
50
+ }
51
+ /** Deduplicate MemoryEntry array. Keeps best of each duplicate group, merges relatedIds. */
52
+ export function deduplicateMemoryEntries(entries) {
53
+ const sorted = [...entries].sort((a, b) => memoryQuality(b) - memoryQuality(a));
54
+ const kept = [];
55
+ let removedCount = 0;
56
+ for (const e of sorted) {
57
+ const existing = kept.find((k) => isMemoryDuplicate(k, e));
58
+ if (existing) {
59
+ mergeMemoryInto(existing, e);
60
+ removedCount++;
61
+ }
62
+ else {
63
+ kept.push(e);
64
+ }
65
+ }
66
+ return { deduped: kept, removedCount };
67
+ }
68
+ /** Deduplicate WorkEntry array. */
69
+ export function deduplicateWorkEntries(entries) {
70
+ const sorted = [...entries].sort((a, b) => workQuality(b) - workQuality(a));
71
+ const kept = [];
72
+ let removedCount = 0;
73
+ for (const e of sorted) {
74
+ const existing = kept.find((k) => isWorkDuplicate(k, e));
75
+ if (existing) {
76
+ mergeWorkInto(existing, e);
77
+ removedCount++;
78
+ }
79
+ else {
80
+ kept.push(e);
81
+ }
82
+ }
83
+ return { deduped: kept, removedCount };
84
+ }
85
+ //# sourceMappingURL=dedup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * [WHO]: Thin shell exporting reportDiagnostic / isDevRuntime for mem-core
3
+ * [FROM]: Uses a browser-local event bus
4
+ * [TO]: Consumed by mem-core internals (extension.ts, extraction.ts, consolidation.ts, …) so deep utilities can report background failures without threading api.events
5
+ * [HERE]: packages/mem-core/src/diagnostics.ts - mirrors utils/diagnostics.ts; explicit dev/debug mode prints to console, and both copies bind to the same Symbol.for slot on globalThis at runtime so the diagnostics extension subscribed via utils/diagnostics.ts receives mem-core events too
6
+ *
7
+ * Keep this file structurally identical to utils/diagnostics.ts. mem-core is a
8
+ * separately-compiled package, so we cannot import the canonical helper. The
9
+ * Symbol.for(...) slot is the runtime contract that ties both copies together.
10
+ */
11
+ export type DiagnosticSeverity = "debug" | "info" | "warning" | "error";
12
+ export type DiagnosticCategory = "network" | "fallback" | "persistence" | "config" | "extension_timeout" | "schema" | "unknown";
13
+ export interface DiagnosticEvent {
14
+ source: string;
15
+ severity: DiagnosticSeverity;
16
+ category: DiagnosticCategory;
17
+ message: string;
18
+ detail?: unknown;
19
+ fingerprint?: string;
20
+ context?: Record<string, unknown>;
21
+ }
22
+ export declare function isDevRuntime(): boolean;
23
+ export declare function reportDiagnostic(event: DiagnosticEvent): void;
24
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAExE,MAAM,MAAM,kBAAkB,GAC3B,SAAS,GACT,UAAU,GACV,aAAa,GACb,QAAQ,GACR,mBAAmB,GACnB,QAAQ,GACR,SAAS,CAAC;AAEb,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAqBD,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAmB7D"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * [WHO]: Thin shell exporting reportDiagnostic / isDevRuntime for mem-core
3
+ * [FROM]: Uses a browser-local event bus
4
+ * [TO]: Consumed by mem-core internals (extension.ts, extraction.ts, consolidation.ts, …) so deep utilities can report background failures without threading api.events
5
+ * [HERE]: packages/mem-core/src/diagnostics.ts - mirrors utils/diagnostics.ts; explicit dev/debug mode prints to console, and both copies bind to the same Symbol.for slot on globalThis at runtime so the diagnostics extension subscribed via utils/diagnostics.ts receives mem-core events too
6
+ *
7
+ * Keep this file structurally identical to utils/diagnostics.ts. mem-core is a
8
+ * separately-compiled package, so we cannot import the canonical helper. The
9
+ * Symbol.for(...) slot is the runtime contract that ties both copies together.
10
+ */
11
+ class EventEmitter {
12
+ listeners = new Map();
13
+ listenerCount(name) { return this.listeners.get(name)?.length || 0; }
14
+ emit(name, value) { for (const listener of this.listeners.get(name) || [])
15
+ listener(value); }
16
+ }
17
+ const SLOT_KEY = Symbol.for("catui.diagnostic.bus.v1");
18
+ const QUEUE_LIMIT = 100;
19
+ const CHANNEL = "diagnostic:event";
20
+ function getSlot() {
21
+ const holder = globalThis;
22
+ let slot = holder[SLOT_KEY];
23
+ if (!slot) {
24
+ slot = { bus: new EventEmitter(), queue: [] };
25
+ holder[SLOT_KEY] = slot;
26
+ }
27
+ return slot;
28
+ }
29
+ export function isDevRuntime() {
30
+ return Boolean(import.meta.env?.DEV);
31
+ }
32
+ export function reportDiagnostic(event) {
33
+ if (isDevRuntime()) {
34
+ const tag = `[${event.source}]`;
35
+ const fn = event.severity === "error" ? console.error :
36
+ event.severity === "warning" ? console.warn :
37
+ console.log;
38
+ if (event.detail !== undefined) {
39
+ fn(`${tag} ${event.message}`, event.detail);
40
+ }
41
+ else {
42
+ fn(`${tag} ${event.message}`);
43
+ }
44
+ }
45
+ const slot = getSlot();
46
+ if (slot.bus.listenerCount(CHANNEL) > 0) {
47
+ slot.bus.emit(CHANNEL, event);
48
+ }
49
+ else if (slot.queue.length < QUEUE_LIMIT) {
50
+ slot.queue.push(event);
51
+ }
52
+ }
53
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,YAAY;IACT,SAAS,GAAG,IAAI,GAAG,EAAmD,CAAC;IAC/E,aAAa,CAAC,IAAY,IAAY,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACrF,IAAI,CAAC,IAAY,EAAE,KAAsB,IAAU,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CAC5H;AA4BD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,OAAO,GAAG,kBAAkB,CAAC;AAEnC,SAAS,OAAO;IACf,MAAM,MAAM,GAAG,UAA4D,CAAC;IAC5E,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,OAAO,OAAO,CAAE,MAAM,CAAC,IAAiD,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACtD,IAAI,YAAY,EAAE,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAChC,MAAM,EAAE,GACP,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC;QACb,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;AACF,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * [WHO]: loadEmbeddingIndex, saveEmbeddingIndex, syncEmbeddingIndex, queryEmbeddingIndex, cosineSimilarity
3
+ * [FROM]: Depends on browser-fs.ts, Web Crypto, ./store.js, ./types-v2.js
4
+ * [TO]: Consumed by packages/mem-core/src/extension.ts
5
+ * [HERE]: packages/mem-core/src/embedding-index.ts - lightweight JSON embedding index for NanoMem v2 semantic recall
6
+ */
7
+ import type { EmbeddingFn, EmbeddingIndexRecord } from "./types-v2.js";
8
+ export interface EmbeddingSourceItem {
9
+ memoryId: string;
10
+ memoryKind: "episode" | "facet" | "semantic" | "procedural";
11
+ text: string;
12
+ }
13
+ export interface EmbeddingIndexFile {
14
+ model: string;
15
+ updatedAt: string;
16
+ records: EmbeddingIndexRecord[];
17
+ }
18
+ export declare function getEmbeddingIndexPath(memoryDir: string): string;
19
+ export declare function loadEmbeddingIndex(memoryDir: string): Promise<EmbeddingIndexFile>;
20
+ export declare function saveEmbeddingIndex(memoryDir: string, index: EmbeddingIndexFile): Promise<void>;
21
+ export declare function checksumText(text: string): Promise<string>;
22
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
23
+ export declare function syncEmbeddingIndex(memoryDir: string, model: string, items: EmbeddingSourceItem[], embedFn: EmbeddingFn): Promise<EmbeddingIndexFile>;
24
+ export declare function queryEmbeddingIndex(memoryDir: string, model: string, queryText: string, embedFn: EmbeddingFn, topK?: number): Promise<Array<EmbeddingIndexRecord & {
25
+ score: number;
26
+ }>>;
27
+ //# sourceMappingURL=embedding-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-index.d.ts","sourceRoot":"","sources":["../src/embedding-index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,CAAC;IAC5D,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAMvF;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpG;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYjE;AAED,wBAAsB,kBAAkB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,mBAAmB,EAAE,EAC5B,OAAO,EAAE,WAAW,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAsD7B;AAED,wBAAsB,mBAAmB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,EACpB,IAAI,SAAI,GACN,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAY1D"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * [WHO]: loadEmbeddingIndex, saveEmbeddingIndex, syncEmbeddingIndex, queryEmbeddingIndex, cosineSimilarity
3
+ * [FROM]: Depends on browser-fs.ts, Web Crypto, ./store.js, ./types-v2.js
4
+ * [TO]: Consumed by packages/mem-core/src/extension.ts
5
+ * [HERE]: packages/mem-core/src/embedding-index.ts - lightweight JSON embedding index for NanoMem v2 semantic recall
6
+ */
7
+ import { join } from "./browser-fs.js";
8
+ import { readJson, writeJson } from "./store.js";
9
+ export function getEmbeddingIndexPath(memoryDir) {
10
+ return join(memoryDir, "v2", "embeddings.json");
11
+ }
12
+ export async function loadEmbeddingIndex(memoryDir) {
13
+ return readJson(getEmbeddingIndexPath(memoryDir), {
14
+ model: "unknown",
15
+ updatedAt: "",
16
+ records: [],
17
+ });
18
+ }
19
+ export async function saveEmbeddingIndex(memoryDir, index) {
20
+ await writeJson(getEmbeddingIndexPath(memoryDir), index);
21
+ }
22
+ export async function checksumText(text) {
23
+ const bytes = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(text));
24
+ return [...new Uint8Array(bytes)].map(byte => byte.toString(16).padStart(2, "0")).join("");
25
+ }
26
+ export function cosineSimilarity(a, b) {
27
+ if (!a.length || !b.length || a.length !== b.length)
28
+ return 0;
29
+ let dot = 0;
30
+ let magA = 0;
31
+ let magB = 0;
32
+ for (let i = 0; i < a.length; i++) {
33
+ dot += a[i] * b[i];
34
+ magA += a[i] * a[i];
35
+ magB += b[i] * b[i];
36
+ }
37
+ if (!magA || !magB)
38
+ return 0;
39
+ return dot / (Math.sqrt(magA) * Math.sqrt(magB));
40
+ }
41
+ export async function syncEmbeddingIndex(memoryDir, model, items, embedFn) {
42
+ const current = await loadEmbeddingIndex(memoryDir);
43
+ const byKey = new Map(current.records.map((record) => [`${record.memoryKind}:${record.memoryId}`, record]));
44
+ const nextRecords = [];
45
+ const toEmbed = [];
46
+ for (const item of items) {
47
+ const text = item.text.trim();
48
+ if (!text)
49
+ continue;
50
+ const checksum = await checksumText(text);
51
+ const key = `${item.memoryKind}:${item.memoryId}`;
52
+ const existing = byKey.get(key);
53
+ if (existing && existing.checksum === checksum && existing.model === model) {
54
+ nextRecords.push(existing);
55
+ continue;
56
+ }
57
+ toEmbed.push({ ...item, text });
58
+ }
59
+ if (toEmbed.length) {
60
+ const vectors = await embedFn(toEmbed.map((item) => item.text));
61
+ const now = new Date().toISOString();
62
+ for (let i = 0; i < toEmbed.length; i++) {
63
+ const item = toEmbed[i];
64
+ const vector = vectors[i] ?? [];
65
+ nextRecords.push({
66
+ id: `${item.memoryKind}:${item.memoryId}`,
67
+ memoryId: item.memoryId,
68
+ memoryKind: item.memoryKind,
69
+ model,
70
+ dim: vector.length,
71
+ checksum: await checksumText(item.text),
72
+ text: item.text,
73
+ vector,
74
+ updatedAt: now,
75
+ });
76
+ }
77
+ }
78
+ const itemKeys = new Set(items.map((item) => `${item.memoryKind}:${item.memoryId}`));
79
+ for (const record of current.records) {
80
+ const key = `${record.memoryKind}:${record.memoryId}`;
81
+ if (!itemKeys.has(key))
82
+ continue;
83
+ if (nextRecords.some((candidate) => candidate.id === record.id))
84
+ continue;
85
+ nextRecords.push(record);
86
+ }
87
+ const index = {
88
+ model,
89
+ updatedAt: new Date().toISOString(),
90
+ records: nextRecords.sort((a, b) => a.id.localeCompare(b.id)),
91
+ };
92
+ await saveEmbeddingIndex(memoryDir, index);
93
+ return index;
94
+ }
95
+ export async function queryEmbeddingIndex(memoryDir, model, queryText, embedFn, topK = 8) {
96
+ const index = await loadEmbeddingIndex(memoryDir);
97
+ if (!index.records.length)
98
+ return [];
99
+ const compatible = index.records.filter((record) => record.model === model);
100
+ if (!compatible.length)
101
+ return [];
102
+ const [queryVector] = await embedFn([queryText]);
103
+ if (!queryVector?.length)
104
+ return [];
105
+ return compatible
106
+ .map((record) => ({ ...record, score: cosineSimilarity(queryVector, record.vector) }))
107
+ .filter((record) => record.score > 0)
108
+ .sort((a, b) => b.score - a.score)
109
+ .slice(0, topK);
110
+ }
111
+ //# sourceMappingURL=embedding-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-index.js","sourceRoot":"","sources":["../src/embedding-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * [WHO]: Provides mergeArchivedEntries/Work/V2, partitionArchivedEntries/Work/Semantic/Procedural, get*ArchiveReason helpers
3
+ * [FROM]: Depends on ./scoring.js for daysSince; ./types.js, ./types-v2.js for memory types
4
+ * [TO]: Consumed by engine.ts (archiveStaleMemories, restoreArchivedEntry)
5
+ * [HERE]: packages/mem-core/src/engine-archive.ts - archive partitioning, merging, and staleness detection
6
+ */
7
+ import type { MemoryEntry, WorkEntry } from "./types.js";
8
+ import type { ProceduralMemory, SemanticMemory } from "./types-v2.js";
9
+ export interface ForgettingConfig {
10
+ ambientTtlDays: number;
11
+ workTtlDays: number;
12
+ reviveCooldownDays: number;
13
+ }
14
+ export declare function mergeArchivedEntries(existing: MemoryEntry[], incoming: MemoryEntry[]): MemoryEntry[];
15
+ export declare function mergeArchivedWork(existing: WorkEntry[], incoming: WorkEntry[]): WorkEntry[];
16
+ export declare function mergeArchivedV2<T extends {
17
+ id: string;
18
+ createdAt: string;
19
+ archivedAt?: string;
20
+ }>(existing: T[], incoming: T[]): T[];
21
+ export declare function partitionArchivedEntries(entries: MemoryEntry[], now: string, forgetting: ForgettingConfig): {
22
+ active: MemoryEntry[];
23
+ archived: MemoryEntry[];
24
+ };
25
+ export declare function partitionArchivedWork(entries: WorkEntry[], now: string, forgetting: ForgettingConfig): {
26
+ active: WorkEntry[];
27
+ archived: WorkEntry[];
28
+ };
29
+ export declare function partitionArchivedSemantic(entries: SemanticMemory[], now: string, forgetting: ForgettingConfig): {
30
+ active: SemanticMemory[];
31
+ archived: SemanticMemory[];
32
+ };
33
+ export declare function partitionArchivedProcedural(entries: ProceduralMemory[], now: string, forgetting: ForgettingConfig): {
34
+ active: ProceduralMemory[];
35
+ archived: ProceduralMemory[];
36
+ };
37
+ //# sourceMappingURL=engine-archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-archive.d.ts","sourceRoot":"","sources":["../src/engine-archive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;CAC3B;AAQD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAIpG;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAI3F;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAInI;AA0DD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,CAgB9J;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG;IAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,QAAQ,EAAE,SAAS,EAAE,CAAA;CAAE,CAgBrJ;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG;IAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;CAAE,CAgBxK;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG;IAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAgBhL"}