vesper-memory 0.3.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 (206) hide show
  1. package/.env.example +28 -0
  2. package/CHANGELOG.md +137 -0
  3. package/LICENSE +21 -0
  4. package/README.md +665 -0
  5. package/config/sqlite-schema.sql +413 -0
  6. package/dist/benchmark/index.d.ts +18 -0
  7. package/dist/benchmark/index.d.ts.map +1 -0
  8. package/dist/benchmark/index.js +19 -0
  9. package/dist/benchmark/index.js.map +1 -0
  10. package/dist/benchmark/metrics-collector.d.ts +90 -0
  11. package/dist/benchmark/metrics-collector.d.ts.map +1 -0
  12. package/dist/benchmark/metrics-collector.js +196 -0
  13. package/dist/benchmark/metrics-collector.js.map +1 -0
  14. package/dist/benchmark/report-generator.d.ts +35 -0
  15. package/dist/benchmark/report-generator.d.ts.map +1 -0
  16. package/dist/benchmark/report-generator.js +221 -0
  17. package/dist/benchmark/report-generator.js.map +1 -0
  18. package/dist/benchmark/runner.d.ts +30 -0
  19. package/dist/benchmark/runner.d.ts.map +1 -0
  20. package/dist/benchmark/runner.js +308 -0
  21. package/dist/benchmark/runner.js.map +1 -0
  22. package/dist/benchmark/scenarios/context-recall.d.ts +65 -0
  23. package/dist/benchmark/scenarios/context-recall.d.ts.map +1 -0
  24. package/dist/benchmark/scenarios/context-recall.js +180 -0
  25. package/dist/benchmark/scenarios/context-recall.js.map +1 -0
  26. package/dist/benchmark/scenarios/index.d.ts +34 -0
  27. package/dist/benchmark/scenarios/index.d.ts.map +1 -0
  28. package/dist/benchmark/scenarios/index.js +230 -0
  29. package/dist/benchmark/scenarios/index.js.map +1 -0
  30. package/dist/benchmark/statistics.d.ts +125 -0
  31. package/dist/benchmark/statistics.d.ts.map +1 -0
  32. package/dist/benchmark/statistics.js +520 -0
  33. package/dist/benchmark/statistics.js.map +1 -0
  34. package/dist/benchmark/types.d.ts +458 -0
  35. package/dist/benchmark/types.d.ts.map +1 -0
  36. package/dist/benchmark/types.js +297 -0
  37. package/dist/benchmark/types.js.map +1 -0
  38. package/dist/cli 2.js +583 -0
  39. package/dist/cli.d 2.ts +8 -0
  40. package/dist/cli.d.ts +8 -0
  41. package/dist/cli.d.ts 2.map +1 -0
  42. package/dist/cli.d.ts.map +1 -0
  43. package/dist/cli.js +583 -0
  44. package/dist/cli.js 2.map +1 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/config/rate-limits.d.ts +76 -0
  47. package/dist/config/rate-limits.d.ts.map +1 -0
  48. package/dist/config/rate-limits.js +161 -0
  49. package/dist/config/rate-limits.js.map +1 -0
  50. package/dist/config 2/rate-limits.d.ts +76 -0
  51. package/dist/config 2/rate-limits.d.ts.map +1 -0
  52. package/dist/config 2/rate-limits.js +161 -0
  53. package/dist/config 2/rate-limits.js.map +1 -0
  54. package/dist/consolidation/pipeline.d.ts +52 -0
  55. package/dist/consolidation/pipeline.d.ts.map +1 -0
  56. package/dist/consolidation/pipeline.js +193 -0
  57. package/dist/consolidation/pipeline.js.map +1 -0
  58. package/dist/consolidation 2/pipeline.d.ts +52 -0
  59. package/dist/consolidation 2/pipeline.d.ts.map +1 -0
  60. package/dist/consolidation 2/pipeline.js +193 -0
  61. package/dist/consolidation 2/pipeline.js.map +1 -0
  62. package/dist/embeddings/client.d.ts +95 -0
  63. package/dist/embeddings/client.d.ts.map +1 -0
  64. package/dist/embeddings/client.js +162 -0
  65. package/dist/embeddings/client.js.map +1 -0
  66. package/dist/embeddings 2/client.d.ts +94 -0
  67. package/dist/embeddings 2/client.d.ts.map +1 -0
  68. package/dist/embeddings 2/client.js +144 -0
  69. package/dist/embeddings 2/client.js.map +1 -0
  70. package/dist/memory-layers/semantic-memory.d.ts +76 -0
  71. package/dist/memory-layers/semantic-memory.d.ts.map +1 -0
  72. package/dist/memory-layers/semantic-memory.js +231 -0
  73. package/dist/memory-layers/semantic-memory.js.map +1 -0
  74. package/dist/memory-layers/skill-library.d.ts +25 -0
  75. package/dist/memory-layers/skill-library.d.ts.map +1 -0
  76. package/dist/memory-layers/skill-library.js +54 -0
  77. package/dist/memory-layers/skill-library.js.map +1 -0
  78. package/dist/memory-layers/working-memory.d.ts +57 -0
  79. package/dist/memory-layers/working-memory.d.ts.map +1 -0
  80. package/dist/memory-layers/working-memory.js +153 -0
  81. package/dist/memory-layers/working-memory.js.map +1 -0
  82. package/dist/memory-layers 2/semantic-memory.d.ts +33 -0
  83. package/dist/memory-layers 2/semantic-memory.d.ts.map +1 -0
  84. package/dist/memory-layers 2/semantic-memory.js +114 -0
  85. package/dist/memory-layers 2/semantic-memory.js.map +1 -0
  86. package/dist/memory-layers 2/skill-library.d.ts +25 -0
  87. package/dist/memory-layers 2/skill-library.d.ts.map +1 -0
  88. package/dist/memory-layers 2/skill-library.js +54 -0
  89. package/dist/memory-layers 2/skill-library.js.map +1 -0
  90. package/dist/memory-layers 2/working-memory.d.ts +57 -0
  91. package/dist/memory-layers 2/working-memory.d.ts.map +1 -0
  92. package/dist/memory-layers 2/working-memory.js +153 -0
  93. package/dist/memory-layers 2/working-memory.js.map +1 -0
  94. package/dist/middleware/auth.d.ts +287 -0
  95. package/dist/middleware/auth.d.ts.map +1 -0
  96. package/dist/middleware/auth.js +610 -0
  97. package/dist/middleware/auth.js.map +1 -0
  98. package/dist/middleware 2/auth.d.ts +287 -0
  99. package/dist/middleware 2/auth.d.ts.map +1 -0
  100. package/dist/middleware 2/auth.js +610 -0
  101. package/dist/middleware 2/auth.js.map +1 -0
  102. package/dist/monitoring/health.d.ts +241 -0
  103. package/dist/monitoring/health.d.ts.map +1 -0
  104. package/dist/monitoring/health.js +649 -0
  105. package/dist/monitoring/health.js.map +1 -0
  106. package/dist/monitoring/metrics.d.ts +153 -0
  107. package/dist/monitoring/metrics.d.ts.map +1 -0
  108. package/dist/monitoring/metrics.js +349 -0
  109. package/dist/monitoring/metrics.js.map +1 -0
  110. package/dist/monitoring 2/health.d.ts +241 -0
  111. package/dist/monitoring 2/health.d.ts.map +1 -0
  112. package/dist/monitoring 2/health.js +649 -0
  113. package/dist/monitoring 2/health.js.map +1 -0
  114. package/dist/monitoring 2/metrics.d.ts +153 -0
  115. package/dist/monitoring 2/metrics.d.ts.map +1 -0
  116. package/dist/monitoring 2/metrics.js +349 -0
  117. package/dist/monitoring 2/metrics.js.map +1 -0
  118. package/dist/retrieval/hybrid-search.d.ts +186 -0
  119. package/dist/retrieval/hybrid-search.d.ts.map +1 -0
  120. package/dist/retrieval/hybrid-search.js +330 -0
  121. package/dist/retrieval/hybrid-search.js.map +1 -0
  122. package/dist/retrieval 2/hybrid-search.d.ts +186 -0
  123. package/dist/retrieval 2/hybrid-search.d.ts.map +1 -0
  124. package/dist/retrieval 2/hybrid-search.js +327 -0
  125. package/dist/retrieval 2/hybrid-search.js.map +1 -0
  126. package/dist/router/smart-router.d.ts +157 -0
  127. package/dist/router/smart-router.d.ts.map +1 -0
  128. package/dist/router/smart-router.js +524 -0
  129. package/dist/router/smart-router.js.map +1 -0
  130. package/dist/router 2/smart-router.d.ts +111 -0
  131. package/dist/router 2/smart-router.d.ts.map +1 -0
  132. package/dist/router 2/smart-router.js +383 -0
  133. package/dist/router 2/smart-router.js.map +1 -0
  134. package/dist/security/rate-limit-middleware.d.ts +119 -0
  135. package/dist/security/rate-limit-middleware.d.ts.map +1 -0
  136. package/dist/security/rate-limit-middleware.js +193 -0
  137. package/dist/security/rate-limit-middleware.js.map +1 -0
  138. package/dist/security 2/rate-limit-middleware.d.ts +119 -0
  139. package/dist/security 2/rate-limit-middleware.d.ts.map +1 -0
  140. package/dist/security 2/rate-limit-middleware.js +193 -0
  141. package/dist/security 2/rate-limit-middleware.js.map +1 -0
  142. package/dist/server 2.js +861 -0
  143. package/dist/server-wrapper 2.js +170 -0
  144. package/dist/server-wrapper.d 2.ts +12 -0
  145. package/dist/server-wrapper.d.ts +12 -0
  146. package/dist/server-wrapper.d.ts 2.map +1 -0
  147. package/dist/server-wrapper.d.ts.map +1 -0
  148. package/dist/server-wrapper.js +170 -0
  149. package/dist/server-wrapper.js 2.map +1 -0
  150. package/dist/server-wrapper.js.map +1 -0
  151. package/dist/server.d 2.ts +14 -0
  152. package/dist/server.d.ts +14 -0
  153. package/dist/server.d.ts 2.map +1 -0
  154. package/dist/server.d.ts.map +1 -0
  155. package/dist/server.js +656 -0
  156. package/dist/server.js 2.map +1 -0
  157. package/dist/server.js.map +1 -0
  158. package/dist/synthesis/conflict-detector.d.ts +43 -0
  159. package/dist/synthesis/conflict-detector.d.ts.map +1 -0
  160. package/dist/synthesis/conflict-detector.js +125 -0
  161. package/dist/synthesis/conflict-detector.js.map +1 -0
  162. package/dist/synthesis 2/conflict-detector.d.ts +43 -0
  163. package/dist/synthesis 2/conflict-detector.d.ts.map +1 -0
  164. package/dist/synthesis 2/conflict-detector.js +125 -0
  165. package/dist/synthesis 2/conflict-detector.js.map +1 -0
  166. package/dist/utils/monitoring.d.ts +25 -0
  167. package/dist/utils/monitoring.d.ts.map +1 -0
  168. package/dist/utils/monitoring.js +41 -0
  169. package/dist/utils/monitoring.js.map +1 -0
  170. package/dist/utils/rate-limiter.d.ts +97 -0
  171. package/dist/utils/rate-limiter.d.ts.map +1 -0
  172. package/dist/utils/rate-limiter.js +166 -0
  173. package/dist/utils/rate-limiter.js.map +1 -0
  174. package/dist/utils/validation.d.ts +139 -0
  175. package/dist/utils/validation.d.ts.map +1 -0
  176. package/dist/utils/validation.js +195 -0
  177. package/dist/utils/validation.js.map +1 -0
  178. package/dist/utils 2/monitoring.d.ts +25 -0
  179. package/dist/utils 2/monitoring.d.ts.map +1 -0
  180. package/dist/utils 2/monitoring.js +41 -0
  181. package/dist/utils 2/monitoring.js.map +1 -0
  182. package/dist/utils 2/rate-limiter.d.ts +97 -0
  183. package/dist/utils 2/rate-limiter.d.ts.map +1 -0
  184. package/dist/utils 2/rate-limiter.js +166 -0
  185. package/dist/utils 2/rate-limiter.js.map +1 -0
  186. package/dist/utils 2/validation.d.ts +139 -0
  187. package/dist/utils 2/validation.d.ts.map +1 -0
  188. package/dist/utils 2/validation.js +195 -0
  189. package/dist/utils 2/validation.js.map +1 -0
  190. package/docker-compose.yml +65 -0
  191. package/embedding-service/Dockerfile +29 -0
  192. package/embedding-service/README.md +68 -0
  193. package/embedding-service/requirements.txt +6 -0
  194. package/embedding-service/server.py +110 -0
  195. package/package.json +92 -0
  196. package/scripts/FRESH_INSTALL.md +280 -0
  197. package/scripts/README.md +101 -0
  198. package/scripts/ensure-infrastructure.sh +38 -0
  199. package/scripts/fresh-install-auto.sh +96 -0
  200. package/scripts/fresh-install.sh +167 -0
  201. package/scripts/health-check.sh +72 -0
  202. package/scripts/init-qdrant.ts +201 -0
  203. package/scripts/postinstall.js +94 -0
  204. package/scripts/run-accuracy-benchmark.ts +1237 -0
  205. package/scripts/run-real-benchmark.ts +581 -0
  206. package/scripts/test-mcp-server.sh +38 -0
@@ -0,0 +1,413 @@
1
+ -- AI Memory System v3.0 - SQLite Schema
2
+ -- Core graph structure for semantic memory layer
3
+ -- Includes entities, relationships, facts, conflicts, and procedural skills
4
+
5
+ -- ============================================================================
6
+ -- ENTITIES TABLE
7
+ -- Represents semantic concepts: people, projects, preferences, general concepts
8
+ -- ============================================================================
9
+
10
+ CREATE TABLE IF NOT EXISTS entities (
11
+ id TEXT PRIMARY KEY,
12
+ name TEXT NOT NULL,
13
+ type TEXT NOT NULL, -- 'person', 'project', 'concept', 'preference'
14
+ description TEXT,
15
+ embedding BLOB, -- Vector for Qdrant synchronization (binary-encoded)
16
+ confidence REAL DEFAULT 1.0, -- 0.0-1.0, decreases when conflicts detected
17
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
18
+ last_accessed TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
19
+ access_count INTEGER DEFAULT 1,
20
+
21
+ -- Metadata for tracking
22
+ last_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
23
+ is_archived BOOLEAN DEFAULT 0,
24
+ metadata TEXT -- JSON for extensibility
25
+ );
26
+
27
+ -- Entity indexes for fast lookup and retrieval
28
+ CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
29
+ CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type);
30
+ CREATE INDEX IF NOT EXISTS idx_entities_confidence ON entities(confidence DESC);
31
+ CREATE INDEX IF NOT EXISTS idx_entities_created_at ON entities(created_at DESC);
32
+ CREATE INDEX IF NOT EXISTS idx_entities_last_accessed ON entities(last_accessed DESC);
33
+ CREATE INDEX IF NOT EXISTS idx_entities_access_count ON entities(access_count DESC);
34
+
35
+ -- Optimized index for preference queries (direct SQLite lookup optimization)
36
+ -- Used by handlePreferenceQueryDirect for fast preference retrieval
37
+ CREATE INDEX IF NOT EXISTS idx_entities_preference_lookup
38
+ ON entities(type, last_accessed DESC, confidence DESC)
39
+ WHERE type = 'preference';
40
+
41
+ -- ============================================================================
42
+ -- RELATIONSHIPS TABLE
43
+ -- Represents connections between entities with temporal decay
44
+ -- ============================================================================
45
+
46
+ CREATE TABLE IF NOT EXISTS relationships (
47
+ id TEXT PRIMARY KEY,
48
+ source_id TEXT NOT NULL,
49
+ target_id TEXT NOT NULL,
50
+ relation_type TEXT NOT NULL, -- 'worked_on', 'prefers', 'mentioned', 'related_to', etc.
51
+ strength REAL NOT NULL DEFAULT 1.0, -- 0.0-1.0, decays over time with exponential formula
52
+ evidence TEXT, -- JSON array of conversation IDs supporting this relationship
53
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
54
+ last_reinforced TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
55
+ last_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
56
+
57
+ -- Access tracking for decay calculation
58
+ access_count INTEGER DEFAULT 1,
59
+
60
+ -- Metadata
61
+ is_archived BOOLEAN DEFAULT 0,
62
+ metadata TEXT, -- JSON for extensibility
63
+
64
+ -- Foreign key constraints
65
+ FOREIGN KEY (source_id) REFERENCES entities(id) ON DELETE CASCADE,
66
+ FOREIGN KEY (target_id) REFERENCES entities(id) ON DELETE CASCADE,
67
+ CONSTRAINT unique_relationship UNIQUE(source_id, target_id, relation_type)
68
+ );
69
+
70
+ -- Relationship indexes for efficient traversal and decay updates
71
+ CREATE INDEX IF NOT EXISTS idx_relationships_source ON relationships(source_id);
72
+ CREATE INDEX IF NOT EXISTS idx_relationships_target ON relationships(target_id);
73
+ CREATE INDEX IF NOT EXISTS idx_relationships_type ON relationships(relation_type);
74
+ CREATE INDEX IF NOT EXISTS idx_relationships_strength ON relationships(strength DESC);
75
+ CREATE INDEX IF NOT EXISTS idx_relationships_last_reinforced ON relationships(last_reinforced DESC);
76
+ CREATE INDEX IF NOT EXISTS idx_relationships_created_at ON relationships(created_at DESC);
77
+
78
+ -- Index for finding relationships that need decay updates (consolidation process)
79
+ CREATE INDEX IF NOT EXISTS idx_relationships_decay_candidates
80
+ ON relationships(last_reinforced, access_count)
81
+ WHERE strength > 0.0 AND is_archived = 0;
82
+
83
+ -- ============================================================================
84
+ -- FACTS TABLE
85
+ -- Represents temporal properties of entities with validity windows
86
+ -- Tracks confidence and detected contradictions
87
+ -- ============================================================================
88
+
89
+ CREATE TABLE IF NOT EXISTS facts (
90
+ id TEXT PRIMARY KEY,
91
+ entity_id TEXT NOT NULL,
92
+ property TEXT NOT NULL,
93
+ value TEXT NOT NULL,
94
+ confidence REAL NOT NULL DEFAULT 1.0, -- 0.0-1.0, lowered when contradictions detected
95
+ valid_from TIMESTAMP NOT NULL, -- When this fact became true
96
+ valid_until TIMESTAMP, -- When this fact became false (NULL if currently valid)
97
+ source_conversation TEXT, -- ID of conversation where fact was learned
98
+ contradicts TEXT, -- JSON array of fact IDs that contradict this one
99
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
100
+ last_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
101
+
102
+ -- Metadata for tracking
103
+ is_archived BOOLEAN DEFAULT 0,
104
+ notes TEXT, -- Explanation of why this fact was lowered/disputed
105
+ metadata TEXT, -- JSON for extensibility
106
+
107
+ -- Foreign key constraint
108
+ FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE,
109
+
110
+ -- Ensure no exact duplicates
111
+ CONSTRAINT unique_fact UNIQUE(entity_id, property, value, valid_from)
112
+ );
113
+
114
+ -- Fact indexes for retrieval and conflict detection
115
+ CREATE INDEX IF NOT EXISTS idx_facts_entity ON facts(entity_id);
116
+ CREATE INDEX IF NOT EXISTS idx_facts_property ON facts(property);
117
+ CREATE INDEX IF NOT EXISTS idx_facts_confidence ON facts(confidence DESC);
118
+ CREATE INDEX IF NOT EXISTS idx_facts_valid_from ON facts(valid_from DESC);
119
+ CREATE INDEX IF NOT EXISTS idx_facts_valid_until ON facts(valid_until DESC);
120
+ CREATE INDEX IF NOT EXISTS idx_facts_source ON facts(source_conversation);
121
+ CREATE INDEX IF NOT EXISTS idx_facts_created_at ON facts(created_at DESC);
122
+
123
+ -- Composite index for finding currently valid facts (used in retrieval)
124
+ CREATE INDEX IF NOT EXISTS idx_facts_valid_temporal
125
+ ON facts(entity_id, property, valid_from DESC)
126
+ WHERE valid_until IS NULL AND is_archived = 0;
127
+
128
+ -- Index for conflict detection queries
129
+ CREATE INDEX IF NOT EXISTS idx_facts_conflicts
130
+ ON facts(entity_id, property)
131
+ WHERE contradicts IS NOT NULL AND is_archived = 0;
132
+
133
+ -- ============================================================================
134
+ -- CONFLICTS TABLE
135
+ -- Tracks detected contradictions between facts
136
+ -- Never auto-resolves, only flags for user clarification
137
+ -- ============================================================================
138
+
139
+ CREATE TABLE IF NOT EXISTS conflicts (
140
+ id TEXT PRIMARY KEY,
141
+ fact_id_1 TEXT NOT NULL,
142
+ fact_id_2 TEXT NOT NULL,
143
+ conflict_type TEXT NOT NULL, -- 'temporal_overlap', 'contradiction', 'preference_shift', 'unknown'
144
+ entity_id TEXT NOT NULL, -- The entity involved in both facts
145
+ property TEXT, -- If applicable, the property being contradicted
146
+ description TEXT, -- Human-readable description of the conflict
147
+ severity TEXT DEFAULT 'medium', -- 'low', 'medium', 'high'
148
+ resolution_status TEXT DEFAULT 'flagged', -- 'flagged', 'acknowledged', 'resolved'
149
+ user_resolution TEXT, -- User's clarification of which fact is correct
150
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
151
+ last_reviewed TIMESTAMP,
152
+
153
+ -- Metadata
154
+ metadata TEXT, -- JSON for extensibility
155
+
156
+ -- Foreign key constraints
157
+ FOREIGN KEY (fact_id_1) REFERENCES facts(id) ON DELETE CASCADE,
158
+ FOREIGN KEY (fact_id_2) REFERENCES facts(id) ON DELETE CASCADE,
159
+ FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
160
+ );
161
+
162
+ -- Conflict indexes for efficient detection and resolution
163
+ CREATE INDEX IF NOT EXISTS idx_conflicts_entity ON conflicts(entity_id);
164
+ CREATE INDEX IF NOT EXISTS idx_conflicts_fact_1 ON conflicts(fact_id_1);
165
+ CREATE INDEX IF NOT EXISTS idx_conflicts_fact_2 ON conflicts(fact_id_2);
166
+ CREATE INDEX IF NOT EXISTS idx_conflicts_type ON conflicts(conflict_type);
167
+ CREATE INDEX IF NOT EXISTS idx_conflicts_status ON conflicts(resolution_status);
168
+ CREATE INDEX IF NOT EXISTS idx_conflicts_created_at ON conflicts(created_at DESC);
169
+
170
+ -- Index for finding unresolved conflicts (used during consolidation)
171
+ CREATE INDEX IF NOT EXISTS idx_conflicts_unresolved
172
+ ON conflicts(entity_id, created_at DESC)
173
+ WHERE resolution_status IN ('flagged', 'acknowledged');
174
+
175
+ -- ============================================================================
176
+ -- SKILLS TABLE
177
+ -- Voyager-style procedural memory: reusable patterns that work well
178
+ -- Tracks executable logic, success rates, and dependencies
179
+ -- ============================================================================
180
+
181
+ CREATE TABLE IF NOT EXISTS skills (
182
+ id TEXT PRIMARY KEY,
183
+ name TEXT NOT NULL UNIQUE,
184
+ description TEXT NOT NULL,
185
+ category TEXT, -- Optional categorization: 'data_analysis', 'writing', 'coding', etc.
186
+
187
+ -- Executable logic (references or code)
188
+ code TEXT, -- The actual implementation (TypeScript or reference)
189
+ code_type TEXT DEFAULT 'reference', -- 'inline' or 'reference'
190
+
191
+ -- Triggering conditions
192
+ triggers TEXT NOT NULL, -- JSON array of semantic descriptions for when to use
193
+ prerequisites TEXT, -- JSON array of required context/skills
194
+
195
+ -- Success tracking
196
+ success_count INTEGER DEFAULT 0,
197
+ failure_count INTEGER DEFAULT 0,
198
+ avg_user_satisfaction REAL DEFAULT 0.5, -- 0.0-1.0, from feedback
199
+
200
+ -- Dependency tracking (for composition)
201
+ uses_skills TEXT, -- JSON array of skill IDs this skill depends on
202
+ used_by_skills TEXT, -- JSON array of skill IDs that use this skill
203
+
204
+ -- Metadata
205
+ created_from TEXT, -- Conversation ID where skill was extracted
206
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
207
+ last_used TIMESTAMP,
208
+ last_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
209
+ version INTEGER DEFAULT 1,
210
+ is_archived BOOLEAN DEFAULT 0,
211
+ notes TEXT,
212
+ metadata TEXT -- JSON for extensibility
213
+ );
214
+
215
+ -- Skill indexes for efficient retrieval
216
+ CREATE INDEX IF NOT EXISTS idx_skills_name ON skills(name);
217
+ CREATE INDEX IF NOT EXISTS idx_skills_category ON skills(category);
218
+ CREATE INDEX IF NOT EXISTS idx_skills_created_at ON skills(created_at DESC);
219
+ CREATE INDEX IF NOT EXISTS idx_skills_last_used ON skills(last_used DESC);
220
+ CREATE INDEX IF NOT EXISTS idx_skills_success_rate ON skills(success_count, failure_count);
221
+
222
+ -- Index for finding high-confidence skills (used in skill-based retrieval)
223
+ CREATE INDEX IF NOT EXISTS idx_skills_reliability
224
+ ON skills(avg_user_satisfaction DESC, success_count DESC)
225
+ WHERE is_archived = 0;
226
+
227
+ -- ============================================================================
228
+ -- CONSOLIDATION METADATA TABLE
229
+ -- Tracks the consolidation process for recovery and monitoring
230
+ -- ============================================================================
231
+
232
+ CREATE TABLE IF NOT EXISTS consolidation_log (
233
+ id TEXT PRIMARY KEY,
234
+ consolidation_id TEXT NOT NULL UNIQUE,
235
+ started_at TIMESTAMP NOT NULL,
236
+ completed_at TIMESTAMP,
237
+ status TEXT NOT NULL, -- 'in_progress', 'completed', 'failed'
238
+
239
+ -- Statistics
240
+ entities_processed INTEGER DEFAULT 0,
241
+ relationships_processed INTEGER DEFAULT 0,
242
+ facts_processed INTEGER DEFAULT 0,
243
+ conflicts_detected INTEGER DEFAULT 0,
244
+ relationships_pruned INTEGER DEFAULT 0,
245
+ skills_extracted INTEGER DEFAULT 0,
246
+
247
+ -- Recovery information
248
+ last_checkpoint TIMESTAMP,
249
+ checkpoint_entity_count INTEGER DEFAULT 0,
250
+ error_message TEXT,
251
+
252
+ -- Performance tracking
253
+ duration_seconds INTEGER,
254
+
255
+ -- Metadata
256
+ notes TEXT,
257
+ metadata TEXT -- JSON for extensibility
258
+ );
259
+
260
+ -- Consolidation log indexes for monitoring
261
+ CREATE INDEX IF NOT EXISTS idx_consolidation_started ON consolidation_log(started_at DESC);
262
+ CREATE INDEX IF NOT EXISTS idx_consolidation_status ON consolidation_log(status);
263
+
264
+ -- ============================================================================
265
+ -- BACKUP METADATA TABLE
266
+ -- Tracks backups for rollback capability
267
+ -- ============================================================================
268
+
269
+ CREATE TABLE IF NOT EXISTS backup_metadata (
270
+ id TEXT PRIMARY KEY,
271
+ backup_timestamp TIMESTAMP NOT NULL,
272
+ backup_type TEXT NOT NULL, -- 'daily', 'pre_consolidation', 'manual'
273
+ status TEXT NOT NULL, -- 'completed', 'failed'
274
+
275
+ -- Backup information
276
+ backup_path TEXT,
277
+ file_size_bytes INTEGER,
278
+
279
+ -- Backup contents summary
280
+ entities_count INTEGER,
281
+ relationships_count INTEGER,
282
+ facts_count INTEGER,
283
+
284
+ -- Retention
285
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
286
+ expires_at TIMESTAMP, -- Auto-delete after 7 days
287
+
288
+ -- Metadata
289
+ notes TEXT,
290
+ metadata TEXT
291
+ );
292
+
293
+ -- Backup metadata indexes
294
+ CREATE INDEX IF NOT EXISTS idx_backup_timestamp ON backup_metadata(backup_timestamp DESC);
295
+ CREATE INDEX IF NOT EXISTS idx_backup_status ON backup_metadata(status);
296
+ CREATE INDEX IF NOT EXISTS idx_backup_expiry ON backup_metadata(expires_at);
297
+
298
+ -- ============================================================================
299
+ -- VIEWS FOR COMMON QUERIES
300
+ -- Provide convenient access patterns for application code
301
+ -- ============================================================================
302
+
303
+ -- View: Currently valid facts (no longer temporal lookup needed in code)
304
+ CREATE VIEW IF NOT EXISTS valid_facts AS
305
+ SELECT f.*
306
+ FROM facts f
307
+ WHERE f.valid_until IS NULL
308
+ AND f.is_archived = 0
309
+ AND f.confidence > 0.0;
310
+
311
+ -- View: Active relationships (not archived, still have strength)
312
+ CREATE VIEW IF NOT EXISTS active_relationships AS
313
+ SELECT r.*,
314
+ e1.name as source_name,
315
+ e2.name as target_name
316
+ FROM relationships r
317
+ JOIN entities e1 ON r.source_id = e1.id
318
+ JOIN entities e2 ON r.target_id = e2.id
319
+ WHERE r.is_archived = 0
320
+ AND r.strength > 0.0;
321
+
322
+ -- View: Unresolved conflicts for consolidation
323
+ CREATE VIEW IF NOT EXISTS unresolved_conflicts AS
324
+ SELECT c.*,
325
+ f1.property as property_1,
326
+ f1.value as value_1,
327
+ f2.property as property_2,
328
+ f2.value as value_2
329
+ FROM conflicts c
330
+ JOIN facts f1 ON c.fact_id_1 = f1.id
331
+ JOIN facts f2 ON c.fact_id_2 = f2.id
332
+ WHERE c.resolution_status IN ('flagged', 'acknowledged');
333
+
334
+ -- View: High-confidence skills ready for use
335
+ CREATE VIEW IF NOT EXISTS reliable_skills AS
336
+ SELECT s.*,
337
+ CASE
338
+ WHEN (s.success_count + s.failure_count) = 0 THEN 0.5
339
+ ELSE CAST(s.success_count AS REAL) / (s.success_count + s.failure_count)
340
+ END as success_rate
341
+ FROM skills s
342
+ WHERE s.is_archived = 0
343
+ ORDER BY s.avg_user_satisfaction DESC, s.success_count DESC;
344
+
345
+ -- View: Entities with connection counts
346
+ CREATE VIEW IF NOT EXISTS entity_stats AS
347
+ SELECT
348
+ e.id,
349
+ e.name,
350
+ e.type,
351
+ e.confidence,
352
+ COUNT(DISTINCT r.id) as relationship_count,
353
+ COUNT(DISTINCT f.id) as fact_count,
354
+ e.access_count,
355
+ e.last_accessed
356
+ FROM entities e
357
+ LEFT JOIN relationships r ON (e.id = r.source_id OR e.id = r.target_id) AND r.is_archived = 0
358
+ LEFT JOIN facts f ON e.id = f.entity_id AND f.is_archived = 0
359
+ GROUP BY e.id;
360
+
361
+ -- ============================================================================
362
+ -- INITIALIZATION NOTES
363
+ -- ============================================================================
364
+ --
365
+ -- This schema supports the AI Memory System v3.0 architecture:
366
+ --
367
+ -- 1. ENTITIES: Semantic concepts (people, projects, preferences)
368
+ -- - Embedding field enables Qdrant vector search integration
369
+ -- - Confidence tracks reliability (lowered when conflicts detected)
370
+ -- - Access patterns tracked for eviction decisions
371
+ --
372
+ -- 2. RELATIONSHIPS: Temporal connections between entities
373
+ -- - strength: Decays over time using exponential formula
374
+ -- - evidence: Links to source conversations for traceability
375
+ -- - Indexed for efficient graph traversal (HippoRAG support)
376
+ --
377
+ -- 3. FACTS: Temporal properties with validity windows
378
+ -- - valid_from/valid_until: Enables temporal reasoning
379
+ -- - contradicts: Links to conflicting facts for detection
380
+ -- - confidence: Lowered when contradictions detected
381
+ --
382
+ -- 4. CONFLICTS: Flagged contradictions (never auto-resolved)
383
+ -- - Types: temporal_overlap, contradiction, preference_shift
384
+ -- - Resolution: Manual user clarification required
385
+ --
386
+ -- 5. SKILLS: Procedural memory (Voyager-style)
387
+ -- - triggers: Semantic descriptions for skill matching
388
+ -- - Dependency tracking for composition
389
+ -- - Success/satisfaction metrics for ranking
390
+ --
391
+ -- CONSOLIDATION PROCESS (Nightly at 3 AM):
392
+ -- 1. Extract entities/relationships from working memory
393
+ -- 2. Upsert to semantic layer (entities, relationships, facts)
394
+ -- 3. Apply exponential decay to all relationships
395
+ -- 4. Detect conflicts (temporal, semantic, preference shifts)
396
+ -- 5. Prune low-strength, rarely-accessed memories
397
+ -- 6. Extract skills from positive interactions
398
+ -- 7. Create backup for recovery
399
+ --
400
+ -- DECAY FORMULA (exponential):
401
+ -- strength(t) = strength(0) * e^(-t/30)
402
+ -- - Decays to 50% in ~21 days
403
+ -- - Decays to 10% in ~69 days
404
+ -- - Pruning threshold: strength < 0.05 AND access_count < 3
405
+ --
406
+ -- PERFORMANCE TARGETS:
407
+ -- - Entity lookup: <1ms (indexed by name, type)
408
+ -- - Relationship traversal: <10ms (indexed for HippoRAG)
409
+ -- - Fact retrieval: <5ms (indexed by entity, temporal)
410
+ -- - Conflict detection: <100ms (indexed for query efficiency)
411
+ -- - Consolidation: <15min for 10K memories
412
+ --
413
+ -- ============================================================================
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Scientific Benchmark System for Vesper Memory
3
+ *
4
+ * Main entry point for the benchmark module.
5
+ * Provides A/B testing with statistical analysis.
6
+ */
7
+ export { BenchmarkConfigSchema, BenchmarkResultSchema, MetricsSnapshotSchema, ScenarioResultSchema, ComparisonResultSchema, validateBenchmarkConfig, validateBenchmarkResult, validateMetricsSnapshot, createDefaultConfig, SCENARIO_DESCRIPTIONS, getScenarioDescription, } from "./types.js";
8
+ export type { BenchmarkConfig, BenchmarkResult, MetricsSnapshot, ScenarioResult, ComparisonResult, AggregateMetrics, StatisticalComparison, BenchmarkSummary, TTestResult, EffectSize, ScenarioType, BenchmarkPhase, Winner, } from "./types.js";
9
+ export { mean, median, percentile, variance, standardDeviation, confidenceInterval, welchTTest, cohensD, interpretEffectSize, StatisticsError, } from "./statistics.js";
10
+ export type { ConfidenceIntervalResult, WelchTTestResult, } from "./statistics.js";
11
+ export { createMetricsCollector, measureLatency, estimateTokens, evaluateResponseQuality, aggregateMetrics, MetricsCollectorError, } from "./metrics-collector.js";
12
+ export type { MetricsCollector, LatencyMeasurement, ContentType, QualityEvaluationOptions, } from "./metrics-collector.js";
13
+ export { createScenario, createContextRecallScenario, CONTEXT_RECALL_TEST_DATA, } from "./scenarios/index.js";
14
+ export type { BenchmarkScenario, MCPClient, ContextRecallScenario, ContextRecallTestCase, } from "./scenarios/index.js";
15
+ export { createBenchmarkRunner, comparePhasesStatistically, } from "./runner.js";
16
+ export type { BenchmarkRunner } from "./runner.js";
17
+ export { generateMarkdownReport, formatNumber, formatPercentage, formatDuration, generateSummaryTable, generateComparisonSection, } from "./report-generator.js";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/benchmark/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,YAAY,EACZ,cAAc,EACd,MAAM,GACP,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,IAAI,EACJ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,mBAAmB,EACnB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,cAAc,EACd,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,iBAAiB,EACjB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Scientific Benchmark System for Vesper Memory
3
+ *
4
+ * Main entry point for the benchmark module.
5
+ * Provides A/B testing with statistical analysis.
6
+ */
7
+ // Types
8
+ export { BenchmarkConfigSchema, BenchmarkResultSchema, MetricsSnapshotSchema, ScenarioResultSchema, ComparisonResultSchema, validateBenchmarkConfig, validateBenchmarkResult, validateMetricsSnapshot, createDefaultConfig, SCENARIO_DESCRIPTIONS, getScenarioDescription, } from "./types.js";
9
+ // Statistics
10
+ export { mean, median, percentile, variance, standardDeviation, confidenceInterval, welchTTest, cohensD, interpretEffectSize, StatisticsError, } from "./statistics.js";
11
+ // Metrics Collector
12
+ export { createMetricsCollector, measureLatency, estimateTokens, evaluateResponseQuality, aggregateMetrics, MetricsCollectorError, } from "./metrics-collector.js";
13
+ // Scenarios
14
+ export { createScenario, createContextRecallScenario, CONTEXT_RECALL_TEST_DATA, } from "./scenarios/index.js";
15
+ // Runner
16
+ export { createBenchmarkRunner, comparePhasesStatistically, } from "./runner.js";
17
+ // Report Generator
18
+ export { generateMarkdownReport, formatNumber, formatPercentage, formatDuration, generateSummaryTable, generateComparisonSection, } from "./report-generator.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/benchmark/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,QAAQ;AACR,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAkBpB,aAAa;AACb,OAAO,EACL,IAAI,EACJ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,mBAAmB,EACnB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAOzB,oBAAoB;AACpB,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAShC,YAAY;AACZ,OAAO,EACL,cAAc,EACd,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAS9B,SAAS;AACT,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAIrB,mBAAmB;AACnB,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Metrics Collector for Scientific Benchmarks
3
+ *
4
+ * Real-time collection and aggregation of benchmark metrics.
5
+ * Provides accurate latency measurement, token estimation, and quality evaluation.
6
+ */
7
+ import type { MetricsSnapshot, AggregateMetrics } from "./types.js";
8
+ /**
9
+ * Error class for metrics collection errors
10
+ */
11
+ export declare class MetricsCollectorError extends Error {
12
+ constructor(message: string);
13
+ }
14
+ /**
15
+ * Metrics collector interface
16
+ */
17
+ export interface MetricsCollector {
18
+ /** Record a new metrics snapshot */
19
+ record(snapshot: MetricsSnapshot): void;
20
+ /** Get all recorded metrics */
21
+ getMetrics(): MetricsSnapshot[];
22
+ /** Get count of recorded metrics */
23
+ getCount(): number;
24
+ /** Clear all recorded metrics */
25
+ clear(): void;
26
+ /** Aggregate all recorded metrics into summary statistics */
27
+ aggregate(): AggregateMetrics;
28
+ }
29
+ /**
30
+ * Create a new metrics collector
31
+ */
32
+ export declare function createMetricsCollector(): MetricsCollector;
33
+ /**
34
+ * Result of latency measurement
35
+ */
36
+ export interface LatencyMeasurement<T> {
37
+ result: T;
38
+ latencyMs: number;
39
+ }
40
+ /**
41
+ * Measure the latency of a function execution
42
+ *
43
+ * @param fn - Function to measure (can be sync or async)
44
+ * @returns Object containing the result and latency in milliseconds
45
+ */
46
+ export declare function measureLatency<T>(fn: () => T | Promise<T>): Promise<LatencyMeasurement<T>>;
47
+ /**
48
+ * Content type hint for token estimation
49
+ */
50
+ export type ContentType = "prose" | "code" | "mixed";
51
+ /**
52
+ * Estimate the number of tokens in a text string
53
+ *
54
+ * Uses a heuristic approximation:
55
+ * - English prose: ~4 characters per token
56
+ * - Code: ~3 characters per token (more punctuation)
57
+ * - Mixed: ~3.5 characters per token
58
+ *
59
+ * @param text - The text to estimate tokens for
60
+ * @param contentType - Optional hint about content type
61
+ * @returns Estimated token count
62
+ */
63
+ export declare function estimateTokens(text: string, contentType?: ContentType): number;
64
+ /**
65
+ * Options for response quality evaluation
66
+ */
67
+ export interface QualityEvaluationOptions {
68
+ /** Evaluation mode: 'similarity' (default) or 'keywords' */
69
+ mode?: "similarity" | "keywords";
70
+ /** Minimum similarity threshold (0-1) */
71
+ minThreshold?: number;
72
+ }
73
+ /**
74
+ * Evaluate the quality of a response against expected content
75
+ *
76
+ * @param actual - The actual response
77
+ * @param expected - Expected response (string) or keywords (array)
78
+ * @param options - Evaluation options
79
+ * @returns Quality score from 0.0 to 1.0
80
+ */
81
+ export declare function evaluateResponseQuality(actual: string, expected: string | string[], options?: QualityEvaluationOptions): number;
82
+ /**
83
+ * Aggregate an array of metrics snapshots into summary statistics
84
+ *
85
+ * @param metrics - Array of metrics snapshots
86
+ * @returns Aggregated metrics
87
+ * @throws MetricsCollectorError if metrics array is empty
88
+ */
89
+ export declare function aggregateMetrics(metrics: MetricsSnapshot[]): AggregateMetrics;
90
+ //# sourceMappingURL=metrics-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-collector.d.ts","sourceRoot":"","sources":["../../src/benchmark/metrics-collector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpE;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,MAAM,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IAExC,+BAA+B;IAC/B,UAAU,IAAI,eAAe,EAAE,CAAC;IAEhC,oCAAoC;IACpC,QAAQ,IAAI,MAAM,CAAC;IAEnB,iCAAiC;IACjC,KAAK,IAAI,IAAI,CAAC;IAEd,6DAA6D;IAC7D,SAAS,IAAI,gBAAgB,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CA6BzD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAYhC;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,WAAqB,GACjC,MAAM,CAoCR;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,4DAA4D;IAC5D,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACjC,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,GAAE,wBAA6B,GACrC,MAAM,CA0DR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,gBAAgB,CA4C7E"}