@monoes/memory 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +902 -0
  2. package/dist/agent-memory-scope.d.ts +131 -0
  3. package/dist/agent-memory-scope.d.ts.map +1 -0
  4. package/dist/agent-memory-scope.js +230 -0
  5. package/dist/agent-memory-scope.js.map +1 -0
  6. package/dist/agentdb-adapter.d.ts +165 -0
  7. package/dist/agentdb-adapter.d.ts.map +1 -0
  8. package/dist/agentdb-adapter.js +836 -0
  9. package/dist/agentdb-adapter.js.map +1 -0
  10. package/dist/agentdb-backend.d.ts +218 -0
  11. package/dist/agentdb-backend.d.ts.map +1 -0
  12. package/dist/agentdb-backend.js +879 -0
  13. package/dist/agentdb-backend.js.map +1 -0
  14. package/dist/auto-memory-bridge.d.ts +230 -0
  15. package/dist/auto-memory-bridge.d.ts.map +1 -0
  16. package/dist/auto-memory-bridge.js +730 -0
  17. package/dist/auto-memory-bridge.js.map +1 -0
  18. package/dist/cache-manager.d.ts +134 -0
  19. package/dist/cache-manager.d.ts.map +1 -0
  20. package/dist/cache-manager.js +410 -0
  21. package/dist/cache-manager.js.map +1 -0
  22. package/dist/checkpointer.d.ts +78 -0
  23. package/dist/checkpointer.d.ts.map +1 -0
  24. package/dist/checkpointer.js +174 -0
  25. package/dist/checkpointer.js.map +1 -0
  26. package/dist/controller-registry.d.ts +216 -0
  27. package/dist/controller-registry.d.ts.map +1 -0
  28. package/dist/controller-registry.js +897 -0
  29. package/dist/controller-registry.js.map +1 -0
  30. package/dist/database-provider.d.ts +87 -0
  31. package/dist/database-provider.d.ts.map +1 -0
  32. package/dist/database-provider.js +434 -0
  33. package/dist/database-provider.js.map +1 -0
  34. package/dist/diskann-backend.d.ts +126 -0
  35. package/dist/diskann-backend.d.ts.map +1 -0
  36. package/dist/diskann-backend.js +324 -0
  37. package/dist/diskann-backend.js.map +1 -0
  38. package/dist/episodic-store.d.ts +58 -0
  39. package/dist/episodic-store.d.ts.map +1 -0
  40. package/dist/episodic-store.js +160 -0
  41. package/dist/episodic-store.js.map +1 -0
  42. package/dist/hnsw-index.d.ts +111 -0
  43. package/dist/hnsw-index.d.ts.map +1 -0
  44. package/dist/hnsw-index.js +778 -0
  45. package/dist/hnsw-index.js.map +1 -0
  46. package/dist/hnsw-lite.d.ts +29 -0
  47. package/dist/hnsw-lite.d.ts.map +1 -0
  48. package/dist/hnsw-lite.js +236 -0
  49. package/dist/hnsw-lite.js.map +1 -0
  50. package/dist/hybrid-backend.d.ts +299 -0
  51. package/dist/hybrid-backend.d.ts.map +1 -0
  52. package/dist/hybrid-backend.js +804 -0
  53. package/dist/hybrid-backend.js.map +1 -0
  54. package/dist/index.d.ts +228 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +379 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/knowledge/document-chunker.d.ts +22 -0
  59. package/dist/knowledge/document-chunker.d.ts.map +1 -0
  60. package/dist/knowledge/document-chunker.js +52 -0
  61. package/dist/knowledge/document-chunker.js.map +1 -0
  62. package/dist/knowledge/index.d.ts +12 -0
  63. package/dist/knowledge/index.d.ts.map +1 -0
  64. package/dist/knowledge/index.js +9 -0
  65. package/dist/knowledge/index.js.map +1 -0
  66. package/dist/knowledge/knowledge-retriever.d.ts +48 -0
  67. package/dist/knowledge/knowledge-retriever.d.ts.map +1 -0
  68. package/dist/knowledge/knowledge-retriever.js +80 -0
  69. package/dist/knowledge/knowledge-retriever.js.map +1 -0
  70. package/dist/knowledge/knowledge-store.d.ts +58 -0
  71. package/dist/knowledge/knowledge-store.d.ts.map +1 -0
  72. package/dist/knowledge/knowledge-store.js +121 -0
  73. package/dist/knowledge/knowledge-store.js.map +1 -0
  74. package/dist/learning-bridge.d.ts +162 -0
  75. package/dist/learning-bridge.d.ts.map +1 -0
  76. package/dist/learning-bridge.js +522 -0
  77. package/dist/learning-bridge.js.map +1 -0
  78. package/dist/memory-graph.d.ts +123 -0
  79. package/dist/memory-graph.d.ts.map +1 -0
  80. package/dist/memory-graph.js +412 -0
  81. package/dist/memory-graph.js.map +1 -0
  82. package/dist/migration.d.ts +68 -0
  83. package/dist/migration.d.ts.map +1 -0
  84. package/dist/migration.js +513 -0
  85. package/dist/migration.js.map +1 -0
  86. package/dist/partitioned-hnsw.d.ts +65 -0
  87. package/dist/partitioned-hnsw.d.ts.map +1 -0
  88. package/dist/partitioned-hnsw.js +209 -0
  89. package/dist/partitioned-hnsw.js.map +1 -0
  90. package/dist/persistent-sona.d.ts +144 -0
  91. package/dist/persistent-sona.d.ts.map +1 -0
  92. package/dist/persistent-sona.js +333 -0
  93. package/dist/persistent-sona.js.map +1 -0
  94. package/dist/procedural/action-record.d.ts +19 -0
  95. package/dist/procedural/action-record.d.ts.map +1 -0
  96. package/dist/procedural/action-record.js +51 -0
  97. package/dist/procedural/action-record.js.map +1 -0
  98. package/dist/procedural/action-sequence-extractor.d.ts +25 -0
  99. package/dist/procedural/action-sequence-extractor.d.ts.map +1 -0
  100. package/dist/procedural/action-sequence-extractor.js +91 -0
  101. package/dist/procedural/action-sequence-extractor.js.map +1 -0
  102. package/dist/procedural/index.d.ts +14 -0
  103. package/dist/procedural/index.d.ts.map +1 -0
  104. package/dist/procedural/index.js +13 -0
  105. package/dist/procedural/index.js.map +1 -0
  106. package/dist/procedural/learned-skill.d.ts +17 -0
  107. package/dist/procedural/learned-skill.d.ts.map +1 -0
  108. package/dist/procedural/learned-skill.js +73 -0
  109. package/dist/procedural/learned-skill.js.map +1 -0
  110. package/dist/procedural/procedure-extractor-worker.d.ts +27 -0
  111. package/dist/procedural/procedure-extractor-worker.d.ts.map +1 -0
  112. package/dist/procedural/procedure-extractor-worker.js +39 -0
  113. package/dist/procedural/procedure-extractor-worker.js.map +1 -0
  114. package/dist/procedural/skill-registry.d.ts +25 -0
  115. package/dist/procedural/skill-registry.d.ts.map +1 -0
  116. package/dist/procedural/skill-registry.js +56 -0
  117. package/dist/procedural/skill-registry.js.map +1 -0
  118. package/dist/procedural/types.d.ts +67 -0
  119. package/dist/procedural/types.d.ts.map +1 -0
  120. package/dist/procedural/types.js +15 -0
  121. package/dist/procedural/types.js.map +1 -0
  122. package/dist/prompt-version-store.d.ts +59 -0
  123. package/dist/prompt-version-store.d.ts.map +1 -0
  124. package/dist/prompt-version-store.js +175 -0
  125. package/dist/prompt-version-store.js.map +1 -0
  126. package/dist/query-builder.d.ts +52 -0
  127. package/dist/query-builder.d.ts.map +1 -0
  128. package/dist/query-builder.js +134 -0
  129. package/dist/query-builder.js.map +1 -0
  130. package/dist/rvf-backend.d.ts +51 -0
  131. package/dist/rvf-backend.d.ts.map +1 -0
  132. package/dist/rvf-backend.js +499 -0
  133. package/dist/rvf-backend.js.map +1 -0
  134. package/dist/rvf-learning-store.d.ts +141 -0
  135. package/dist/rvf-learning-store.d.ts.map +1 -0
  136. package/dist/rvf-learning-store.js +344 -0
  137. package/dist/rvf-learning-store.js.map +1 -0
  138. package/dist/rvf-migration.d.ts +45 -0
  139. package/dist/rvf-migration.d.ts.map +1 -0
  140. package/dist/rvf-migration.js +254 -0
  141. package/dist/rvf-migration.js.map +1 -0
  142. package/dist/sqlite-backend.d.ts +127 -0
  143. package/dist/sqlite-backend.d.ts.map +1 -0
  144. package/dist/sqlite-backend.js +618 -0
  145. package/dist/sqlite-backend.js.map +1 -0
  146. package/dist/sqljs-backend.d.ts +128 -0
  147. package/dist/sqljs-backend.d.ts.map +1 -0
  148. package/dist/sqljs-backend.js +611 -0
  149. package/dist/sqljs-backend.js.map +1 -0
  150. package/dist/tier-manager.d.ts +79 -0
  151. package/dist/tier-manager.d.ts.map +1 -0
  152. package/dist/tier-manager.js +169 -0
  153. package/dist/tier-manager.js.map +1 -0
  154. package/dist/tiers/contextual.d.ts +43 -0
  155. package/dist/tiers/contextual.d.ts.map +1 -0
  156. package/dist/tiers/contextual.js +102 -0
  157. package/dist/tiers/contextual.js.map +1 -0
  158. package/dist/tiers/entity.d.ts +46 -0
  159. package/dist/tiers/entity.d.ts.map +1 -0
  160. package/dist/tiers/entity.js +106 -0
  161. package/dist/tiers/entity.js.map +1 -0
  162. package/dist/tiers/index.d.ts +4 -0
  163. package/dist/tiers/index.d.ts.map +1 -0
  164. package/dist/tiers/index.js +4 -0
  165. package/dist/tiers/index.js.map +1 -0
  166. package/dist/tiers/short-term.d.ts +42 -0
  167. package/dist/tiers/short-term.d.ts.map +1 -0
  168. package/dist/tiers/short-term.js +89 -0
  169. package/dist/tiers/short-term.js.map +1 -0
  170. package/dist/types/checkpoint.d.ts +44 -0
  171. package/dist/types/checkpoint.d.ts.map +1 -0
  172. package/dist/types/checkpoint.js +8 -0
  173. package/dist/types/checkpoint.js.map +1 -0
  174. package/dist/types.d.ts +526 -0
  175. package/dist/types.d.ts.map +1 -0
  176. package/dist/types.js +58 -0
  177. package/dist/types.js.map +1 -0
  178. package/package.json +46 -0
@@ -0,0 +1,160 @@
1
+ /**
2
+ * EpisodicStore — JSON-lines file-based episodic memory.
3
+ *
4
+ * Stores episodes as one JSON object per line in a .jsonl file,
5
+ * following the same pattern as CostTracker and SwarmCheckpointer.
6
+ *
7
+ * @module v1/memory/episodic-store
8
+ */
9
+ import { randomUUID } from 'node:crypto';
10
+ import { existsSync, readFileSync, appendFileSync, mkdirSync } from 'node:fs';
11
+ import { dirname } from 'node:path';
12
+ /** Default summarizer: first 500 chars + ellipsis */
13
+ function defaultSummarizer(content) {
14
+ const trimmed = content.trim();
15
+ if (trimmed.length <= 500)
16
+ return Promise.resolve(trimmed);
17
+ return Promise.resolve(trimmed.slice(0, 500) + '...');
18
+ }
19
+ /**
20
+ * Accumulates agent runs into episodes and persists them as JSON-lines.
21
+ */
22
+ export class EpisodicStore {
23
+ filePath;
24
+ maxRunsPerEpisode;
25
+ summarizer;
26
+ // Current in-progress episode state
27
+ currentEpisodeId = null;
28
+ currentSessionId = '';
29
+ currentRunIds = [];
30
+ currentAgentSlugs = new Set();
31
+ currentTaskTypes = new Set();
32
+ currentContent = [];
33
+ currentStartedAt = 0;
34
+ constructor(config) {
35
+ this.filePath = config.filePath;
36
+ this.maxRunsPerEpisode = config.maxRunsPerEpisode ?? 20;
37
+ this.summarizer = config.summarizer ?? defaultSummarizer;
38
+ // Ensure parent directory exists
39
+ const dir = dirname(this.filePath);
40
+ if (!existsSync(dir)) {
41
+ mkdirSync(dir, { recursive: true });
42
+ }
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // File helpers
46
+ // ---------------------------------------------------------------------------
47
+ /** Read all episodes from the JSONL file (oldest-first). */
48
+ readAll() {
49
+ if (!existsSync(this.filePath))
50
+ return [];
51
+ const raw = readFileSync(this.filePath, 'utf-8').trim();
52
+ if (!raw)
53
+ return [];
54
+ return raw
55
+ .split('\n')
56
+ .filter(Boolean)
57
+ .map((line) => JSON.parse(line));
58
+ }
59
+ /** Append a single episode to the file. */
60
+ append(episode) {
61
+ appendFileSync(this.filePath, JSON.stringify(episode) + '\n', 'utf-8');
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // Public API
65
+ // ---------------------------------------------------------------------------
66
+ /**
67
+ * Add a run to the current episode. Starts a new episode if none is open.
68
+ * Auto-closes the episode when maxRunsPerEpisode is reached.
69
+ *
70
+ * @returns The closed Episode if auto-close triggered, otherwise null.
71
+ */
72
+ async addRun(runId, agentSlug, taskType, content, sessionId) {
73
+ // Start new episode if needed
74
+ if (this.currentEpisodeId === null) {
75
+ this.currentEpisodeId = randomUUID();
76
+ this.currentSessionId = sessionId ?? '';
77
+ this.currentRunIds = [];
78
+ this.currentAgentSlugs = new Set();
79
+ this.currentTaskTypes = new Set();
80
+ this.currentContent = [];
81
+ this.currentStartedAt = Date.now();
82
+ }
83
+ // Update session if provided
84
+ if (sessionId) {
85
+ this.currentSessionId = sessionId;
86
+ }
87
+ this.currentRunIds.push(runId);
88
+ this.currentAgentSlugs.add(agentSlug);
89
+ this.currentTaskTypes.add(taskType);
90
+ this.currentContent.push(content);
91
+ // Auto-close when limit reached
92
+ if (this.currentRunIds.length >= this.maxRunsPerEpisode) {
93
+ return this.closeEpisode();
94
+ }
95
+ return null;
96
+ }
97
+ /**
98
+ * Close the current episode, persist it, and return it.
99
+ * Returns null if there is no open episode.
100
+ */
101
+ async closeEpisode() {
102
+ if (this.currentEpisodeId === null || this.currentRunIds.length === 0) {
103
+ return null;
104
+ }
105
+ const combined = this.currentContent.join('\n');
106
+ const summary = await this.summarizer(combined);
107
+ const episode = {
108
+ episodeId: this.currentEpisodeId,
109
+ sessionId: this.currentSessionId,
110
+ runIds: [...this.currentRunIds],
111
+ summary,
112
+ startedAt: this.currentStartedAt,
113
+ endedAt: Date.now(),
114
+ agentSlugs: [...this.currentAgentSlugs],
115
+ taskTypes: [...this.currentTaskTypes],
116
+ tokenEstimate: Math.ceil(combined.length / 4),
117
+ };
118
+ this.append(episode);
119
+ // Reset state
120
+ this.currentEpisodeId = null;
121
+ this.currentRunIds = [];
122
+ this.currentAgentSlugs = new Set();
123
+ this.currentTaskTypes = new Set();
124
+ this.currentContent = [];
125
+ this.currentStartedAt = 0;
126
+ this.currentSessionId = '';
127
+ return episode;
128
+ }
129
+ /**
130
+ * Simple substring search on episode summaries.
131
+ */
132
+ search(query, maxEpisodes = 10) {
133
+ const all = this.readAll();
134
+ const lower = query.toLowerCase();
135
+ return all
136
+ .filter((ep) => ep.summary.toLowerCase().includes(lower))
137
+ .slice(-maxEpisodes);
138
+ }
139
+ /**
140
+ * Retrieve an episode by its ID.
141
+ */
142
+ getById(episodeId) {
143
+ const all = this.readAll();
144
+ return all.find((ep) => ep.episodeId === episodeId);
145
+ }
146
+ /**
147
+ * List all episodes for a given session.
148
+ */
149
+ listBySession(sessionId) {
150
+ const all = this.readAll();
151
+ return all.filter((ep) => ep.sessionId === sessionId);
152
+ }
153
+ /**
154
+ * Check whether an episode is currently open.
155
+ */
156
+ hasOpenEpisode() {
157
+ return this.currentEpisodeId !== null && this.currentRunIds.length > 0;
158
+ }
159
+ }
160
+ //# sourceMappingURL=episodic-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episodic-store.js","sourceRoot":"","sources":["../src/episodic-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * V1 HNSW Vector Index
3
+ *
4
+ * High-performance Hierarchical Navigable Small World (HNSW) index for
5
+ * 150x-12,500x faster vector similarity search compared to brute force.
6
+ *
7
+ * OPTIMIZATIONS:
8
+ * - BinaryMinHeap/BinaryMaxHeap for O(log n) operations (vs O(n log n) Array.sort)
9
+ * - Pre-normalized vectors for O(1) cosine similarity (no sqrt needed)
10
+ * - Bounded max-heap for efficient top-k tracking
11
+ *
12
+ * @module v1/memory/hnsw-index
13
+ */
14
+ import { EventEmitter } from 'node:events';
15
+ import { HNSWConfig, HNSWStats } from './types.js';
16
+ /**
17
+ * HNSW Index implementation for ultra-fast vector similarity search
18
+ *
19
+ * Performance characteristics:
20
+ * - Search: O(log n) approximate nearest neighbor
21
+ * - Insert: O(log n) amortized
22
+ * - Memory: O(n * M * L) where M is max connections, L is layers
23
+ */
24
+ export declare class HNSWIndex extends EventEmitter {
25
+ private config;
26
+ private nodes;
27
+ private entryPoint;
28
+ private maxLevel;
29
+ private levelMult;
30
+ private stats;
31
+ private quantizer;
32
+ constructor(config?: Partial<HNSWConfig>);
33
+ /**
34
+ * Add a vector to the index
35
+ */
36
+ addPoint(id: string, vector: Float32Array): Promise<void>;
37
+ /**
38
+ * Search for k nearest neighbors
39
+ */
40
+ search(query: Float32Array, k: number, ef?: number): Promise<Array<{
41
+ id: string;
42
+ distance: number;
43
+ }>>;
44
+ /**
45
+ * Search with filters applied post-retrieval
46
+ */
47
+ searchWithFilters(query: Float32Array, k: number, filter: (id: string) => boolean, ef?: number): Promise<Array<{
48
+ id: string;
49
+ distance: number;
50
+ }>>;
51
+ /**
52
+ * Remove a point from the index
53
+ */
54
+ removePoint(id: string): Promise<boolean>;
55
+ /**
56
+ * Rebuild the index from scratch
57
+ */
58
+ rebuild(entries: Array<{
59
+ id: string;
60
+ vector: Float32Array;
61
+ }>): Promise<void>;
62
+ /**
63
+ * Get index statistics
64
+ */
65
+ getStats(): HNSWStats;
66
+ /**
67
+ * Clear the index
68
+ */
69
+ clear(): void;
70
+ /**
71
+ * Check if an ID exists in the index
72
+ */
73
+ has(id: string): boolean;
74
+ /**
75
+ * Get the number of vectors in the index
76
+ */
77
+ get size(): number;
78
+ private mergeConfig;
79
+ private getRandomLevel;
80
+ private insertNode;
81
+ private searchLayer;
82
+ /**
83
+ * OPTIMIZED searchLayer using heap-based priority queues
84
+ * Performance: O(log n) per operation vs O(n log n) for Array.sort()
85
+ * Expected speedup: 3-5x for large result sets
86
+ */
87
+ private searchLayerOptimized;
88
+ private selectNeighbors;
89
+ private pruneConnections;
90
+ private distance;
91
+ private cosineDistance;
92
+ /**
93
+ * OPTIMIZED: Cosine distance using pre-normalized vectors
94
+ * Only requires dot product (no sqrt operations)
95
+ * Performance: O(n) with ~2x speedup over standard cosine
96
+ */
97
+ private cosineDistanceNormalized;
98
+ /**
99
+ * Normalize a vector to unit length for O(1) cosine similarity
100
+ */
101
+ private normalizeVector;
102
+ /**
103
+ * OPTIMIZED distance calculation that uses pre-normalized vectors when available
104
+ */
105
+ private distanceOptimized;
106
+ private euclideanDistance;
107
+ private dotProductDistance;
108
+ private manhattanDistance;
109
+ }
110
+ export default HNSWIndex;
111
+ //# sourceMappingURL=hnsw-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hnsw-index.d.ts","sourceRoot":"","sources":["../src/hnsw-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAEL,UAAU,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAwLpB;;;;;;;GAOG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAS;IAG1B,OAAO,CAAC,KAAK,CAYX;IAGF,OAAO,CAAC,SAAS,CAA0B;gBAE/B,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM;IAU5C;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD/D;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,YAAY,EACnB,CAAC,EAAE,MAAM,EACT,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAqEnD;;OAEG;IACG,iBAAiB,CACrB,KAAK,EAAE,YAAY,EACnB,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,EAC/B,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAUnD;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6C/C;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC;IAmBhB;;OAEG;IACH,QAAQ,IAAI,SAAS;IAqBrB;;OAEG;IACH,KAAK,IAAI,IAAI;IAab;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAID,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,cAAc;YAMR,UAAU;YAmEV,WAAW;IA2DzB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAgE5B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,cAAc;IAiBtB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,iBAAiB;CAO1B;AAwGD,eAAe,SAAS,CAAC"}