cmp-memory-system 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 (161) hide show
  1. package/README.md +541 -0
  2. package/dist/analytics/index.d.ts +5 -0
  3. package/dist/analytics/index.d.ts.map +1 -0
  4. package/dist/analytics/index.js +5 -0
  5. package/dist/analytics/index.js.map +1 -0
  6. package/dist/analytics/tracker.d.ts +107 -0
  7. package/dist/analytics/tracker.d.ts.map +1 -0
  8. package/dist/analytics/tracker.js +333 -0
  9. package/dist/analytics/tracker.js.map +1 -0
  10. package/dist/auto-improve/eslint-generator.d.ts +36 -0
  11. package/dist/auto-improve/eslint-generator.d.ts.map +1 -0
  12. package/dist/auto-improve/eslint-generator.js +280 -0
  13. package/dist/auto-improve/eslint-generator.js.map +1 -0
  14. package/dist/auto-improve/index.d.ts +6 -0
  15. package/dist/auto-improve/index.d.ts.map +1 -0
  16. package/dist/auto-improve/index.js +6 -0
  17. package/dist/auto-improve/index.js.map +1 -0
  18. package/dist/auto-improve/pattern-detector.d.ts +92 -0
  19. package/dist/auto-improve/pattern-detector.d.ts.map +1 -0
  20. package/dist/auto-improve/pattern-detector.js +231 -0
  21. package/dist/auto-improve/pattern-detector.js.map +1 -0
  22. package/dist/cli/index.d.ts +16 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +636 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/dashboard/index.d.ts +6 -0
  27. package/dist/dashboard/index.d.ts.map +1 -0
  28. package/dist/dashboard/index.js +6 -0
  29. package/dist/dashboard/index.js.map +1 -0
  30. package/dist/dashboard/server.d.ts +15 -0
  31. package/dist/dashboard/server.d.ts.map +1 -0
  32. package/dist/dashboard/server.js +373 -0
  33. package/dist/dashboard/server.js.map +1 -0
  34. package/dist/dashboard/ui.d.ts +9 -0
  35. package/dist/dashboard/ui.d.ts.map +1 -0
  36. package/dist/dashboard/ui.js +530 -0
  37. package/dist/dashboard/ui.js.map +1 -0
  38. package/dist/db/client.d.ts +66 -0
  39. package/dist/db/client.d.ts.map +1 -0
  40. package/dist/db/client.js +159 -0
  41. package/dist/db/client.js.map +1 -0
  42. package/dist/db/drizzle-client.d.ts +302 -0
  43. package/dist/db/drizzle-client.d.ts.map +1 -0
  44. package/dist/db/drizzle-client.js +404 -0
  45. package/dist/db/drizzle-client.js.map +1 -0
  46. package/dist/db/index.d.ts +5 -0
  47. package/dist/db/index.d.ts.map +1 -0
  48. package/dist/db/index.js +5 -0
  49. package/dist/db/index.js.map +1 -0
  50. package/dist/feedback/collector.d.ts +74 -0
  51. package/dist/feedback/collector.d.ts.map +1 -0
  52. package/dist/feedback/collector.js +231 -0
  53. package/dist/feedback/collector.js.map +1 -0
  54. package/dist/feedback/index.d.ts +5 -0
  55. package/dist/feedback/index.d.ts.map +1 -0
  56. package/dist/feedback/index.js +5 -0
  57. package/dist/feedback/index.js.map +1 -0
  58. package/dist/hooks/index.d.ts +8 -0
  59. package/dist/hooks/index.d.ts.map +1 -0
  60. package/dist/hooks/index.js +8 -0
  61. package/dist/hooks/index.js.map +1 -0
  62. package/dist/hooks/memory-checkpoint.d.ts +43 -0
  63. package/dist/hooks/memory-checkpoint.d.ts.map +1 -0
  64. package/dist/hooks/memory-checkpoint.js +257 -0
  65. package/dist/hooks/memory-checkpoint.js.map +1 -0
  66. package/dist/hooks/post-tool-use.d.ts +61 -0
  67. package/dist/hooks/post-tool-use.d.ts.map +1 -0
  68. package/dist/hooks/post-tool-use.js +262 -0
  69. package/dist/hooks/post-tool-use.js.map +1 -0
  70. package/dist/hooks/pre-tool-use.d.ts +34 -0
  71. package/dist/hooks/pre-tool-use.d.ts.map +1 -0
  72. package/dist/hooks/pre-tool-use.js +358 -0
  73. package/dist/hooks/pre-tool-use.js.map +1 -0
  74. package/dist/hooks/session-start.d.ts +38 -0
  75. package/dist/hooks/session-start.d.ts.map +1 -0
  76. package/dist/hooks/session-start.js +274 -0
  77. package/dist/hooks/session-start.js.map +1 -0
  78. package/dist/index.d.ts +29 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +39 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/mcp/index.d.ts +5 -0
  83. package/dist/mcp/index.d.ts.map +1 -0
  84. package/dist/mcp/index.js +5 -0
  85. package/dist/mcp/index.js.map +1 -0
  86. package/dist/mcp/server.d.ts +42 -0
  87. package/dist/mcp/server.d.ts.map +1 -0
  88. package/dist/mcp/server.js +599 -0
  89. package/dist/mcp/server.js.map +1 -0
  90. package/dist/registry/embeddings.d.ts +38 -0
  91. package/dist/registry/embeddings.d.ts.map +1 -0
  92. package/dist/registry/embeddings.js +110 -0
  93. package/dist/registry/embeddings.js.map +1 -0
  94. package/dist/registry/generator.d.ts +41 -0
  95. package/dist/registry/generator.d.ts.map +1 -0
  96. package/dist/registry/generator.js +323 -0
  97. package/dist/registry/generator.js.map +1 -0
  98. package/dist/registry/index.d.ts +6 -0
  99. package/dist/registry/index.d.ts.map +1 -0
  100. package/dist/registry/index.js +6 -0
  101. package/dist/registry/index.js.map +1 -0
  102. package/dist/services/IdeaCollector.d.ts +103 -0
  103. package/dist/services/IdeaCollector.d.ts.map +1 -0
  104. package/dist/services/IdeaCollector.js +371 -0
  105. package/dist/services/IdeaCollector.js.map +1 -0
  106. package/dist/services/TaskTracker.d.ts +89 -0
  107. package/dist/services/TaskTracker.d.ts.map +1 -0
  108. package/dist/services/TaskTracker.js +324 -0
  109. package/dist/services/TaskTracker.js.map +1 -0
  110. package/dist/services/WorkPlanManager.d.ts +107 -0
  111. package/dist/services/WorkPlanManager.d.ts.map +1 -0
  112. package/dist/services/WorkPlanManager.js +440 -0
  113. package/dist/services/WorkPlanManager.js.map +1 -0
  114. package/dist/services/auto-inject.d.ts +77 -0
  115. package/dist/services/auto-inject.d.ts.map +1 -0
  116. package/dist/services/auto-inject.js +289 -0
  117. package/dist/services/auto-inject.js.map +1 -0
  118. package/dist/services/auto-tag.d.ts +61 -0
  119. package/dist/services/auto-tag.d.ts.map +1 -0
  120. package/dist/services/auto-tag.js +203 -0
  121. package/dist/services/auto-tag.js.map +1 -0
  122. package/dist/services/cross-project-sync.d.ts +76 -0
  123. package/dist/services/cross-project-sync.d.ts.map +1 -0
  124. package/dist/services/cross-project-sync.js +235 -0
  125. package/dist/services/cross-project-sync.js.map +1 -0
  126. package/dist/services/index.d.ts +15 -0
  127. package/dist/services/index.d.ts.map +1 -0
  128. package/dist/services/index.js +18 -0
  129. package/dist/services/index.js.map +1 -0
  130. package/dist/services/memory-consolidation.d.ts +77 -0
  131. package/dist/services/memory-consolidation.d.ts.map +1 -0
  132. package/dist/services/memory-consolidation.js +298 -0
  133. package/dist/services/memory-consolidation.js.map +1 -0
  134. package/dist/services/semantic-search.d.ts +93 -0
  135. package/dist/services/semantic-search.d.ts.map +1 -0
  136. package/dist/services/semantic-search.js +278 -0
  137. package/dist/services/semantic-search.js.map +1 -0
  138. package/dist/services/weekly-digest.d.ts +105 -0
  139. package/dist/services/weekly-digest.d.ts.map +1 -0
  140. package/dist/services/weekly-digest.js +292 -0
  141. package/dist/services/weekly-digest.js.map +1 -0
  142. package/dist/types/index.d.ts +274 -0
  143. package/dist/types/index.d.ts.map +1 -0
  144. package/dist/types/index.js +84 -0
  145. package/dist/types/index.js.map +1 -0
  146. package/dist/utils/config.d.ts +21 -0
  147. package/dist/utils/config.d.ts.map +1 -0
  148. package/dist/utils/config.js +89 -0
  149. package/dist/utils/config.js.map +1 -0
  150. package/dist/utils/index.d.ts +6 -0
  151. package/dist/utils/index.d.ts.map +1 -0
  152. package/dist/utils/index.js +6 -0
  153. package/dist/utils/index.js.map +1 -0
  154. package/dist/utils/paths.d.ts +28 -0
  155. package/dist/utils/paths.d.ts.map +1 -0
  156. package/dist/utils/paths.js +80 -0
  157. package/dist/utils/paths.js.map +1 -0
  158. package/package.json +89 -0
  159. package/templates/memory-config.json +82 -0
  160. package/templates/memory-config.schema.json +212 -0
  161. package/templates/settings.json +58 -0
@@ -0,0 +1,358 @@
1
+ /**
2
+ * PreToolUse Hook - Executable
3
+ *
4
+ * Validates tool calls against configured guards:
5
+ * 1. Schema protection (block modifications to protected files)
6
+ * 2. Pattern validation (warn about bad patterns)
7
+ * 3. Embedding injection (inject relevant knowledge for Task tool)
8
+ */
9
+ import fs from 'fs/promises';
10
+ import path from 'path';
11
+ import { loadConfig } from '../utils/config.js';
12
+ import { getProjectRoot, matchesPattern } from '../utils/paths.js';
13
+ // =============================================================================
14
+ // GUARD VALIDATION
15
+ // =============================================================================
16
+ /**
17
+ * Check if content matches a regex pattern
18
+ */
19
+ function matchesContentTrigger(content, trigger) {
20
+ try {
21
+ const regex = new RegExp(trigger, 'gm');
22
+ return regex.test(content);
23
+ }
24
+ catch {
25
+ // Invalid regex, treat as literal match
26
+ return content.includes(trigger);
27
+ }
28
+ }
29
+ /**
30
+ * Validate a single guard rule against file and content
31
+ */
32
+ function validateGuard(rule, filePath, content) {
33
+ // Check file pattern
34
+ if (!matchesPattern(filePath, [rule.filePattern])) {
35
+ return null;
36
+ }
37
+ // Check excluded files
38
+ if (rule.excludeFiles && matchesPattern(filePath, rule.excludeFiles)) {
39
+ return null;
40
+ }
41
+ // Check content trigger if specified
42
+ if (rule.contentTrigger && content) {
43
+ if (!matchesContentTrigger(content, rule.contentTrigger)) {
44
+ return null;
45
+ }
46
+ }
47
+ // Guard triggered
48
+ return {
49
+ ruleId: rule.id,
50
+ type: rule.type,
51
+ message: rule.message,
52
+ file: filePath,
53
+ };
54
+ }
55
+ /**
56
+ * Run all guards against a file operation
57
+ */
58
+ function runGuards(config, filePath, content) {
59
+ if (!config.guards.enabled) {
60
+ return [];
61
+ }
62
+ const violations = [];
63
+ for (const rule of config.guards.rules) {
64
+ const violation = validateGuard(rule, filePath, content);
65
+ if (violation) {
66
+ violations.push(violation);
67
+ }
68
+ }
69
+ return violations;
70
+ }
71
+ // =============================================================================
72
+ // EMBEDDING INJECTION
73
+ // =============================================================================
74
+ /**
75
+ * Generate embedding using OpenAI or Gemini
76
+ */
77
+ async function generateEmbedding(text) {
78
+ const openaiKey = process.env.OPENAI_API_KEY;
79
+ const geminiKey = process.env.GEMINI_API_KEY;
80
+ // Try OpenAI first
81
+ if (openaiKey) {
82
+ try {
83
+ const response = await fetch('https://api.openai.com/v1/embeddings', {
84
+ method: 'POST',
85
+ headers: {
86
+ 'Content-Type': 'application/json',
87
+ 'Authorization': `Bearer ${openaiKey}`
88
+ },
89
+ body: JSON.stringify({
90
+ model: 'text-embedding-3-small',
91
+ input: text.slice(0, 8000 * 4),
92
+ encoding_format: 'float'
93
+ })
94
+ });
95
+ if (response.ok) {
96
+ const data = await response.json();
97
+ return data.data[0]?.embedding ?? null;
98
+ }
99
+ }
100
+ catch {
101
+ // Fall through to Gemini
102
+ }
103
+ }
104
+ // Try Gemini
105
+ if (geminiKey) {
106
+ try {
107
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1/models/text-embedding-004:embedContent?key=${geminiKey}`, {
108
+ method: 'POST',
109
+ headers: { 'Content-Type': 'application/json' },
110
+ body: JSON.stringify({
111
+ content: { parts: [{ text: text.slice(0, 10000) }] }
112
+ })
113
+ });
114
+ if (response.ok) {
115
+ const data = await response.json();
116
+ return data.embedding.values;
117
+ }
118
+ }
119
+ catch {
120
+ // No embedding available
121
+ }
122
+ }
123
+ return null;
124
+ }
125
+ /**
126
+ * Compute cosine similarity between two vectors
127
+ */
128
+ function cosineSimilarity(a, b) {
129
+ if (a.length !== b.length)
130
+ return 0;
131
+ let dotProduct = 0;
132
+ let magnitudeA = 0;
133
+ let magnitudeB = 0;
134
+ for (let i = 0; i < a.length; i++) {
135
+ dotProduct += a[i] * b[i];
136
+ magnitudeA += a[i] * a[i];
137
+ magnitudeB += b[i] * b[i];
138
+ }
139
+ const magnitude = Math.sqrt(magnitudeA) * Math.sqrt(magnitudeB);
140
+ return magnitude === 0 ? 0 : dotProduct / magnitude;
141
+ }
142
+ /**
143
+ * Load embedding registry
144
+ */
145
+ async function loadRegistry(projectRoot) {
146
+ const registryPath = path.join(projectRoot, '.claude/knowledge/registry.json');
147
+ try {
148
+ const content = await fs.readFile(registryPath, 'utf-8');
149
+ return JSON.parse(content);
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ }
155
+ /**
156
+ * Find matching knowledge sections for a query
157
+ */
158
+ async function findMatchingSections(projectRoot, queryText, config) {
159
+ if (!config.embedding.enabled) {
160
+ return [];
161
+ }
162
+ const registry = await loadRegistry(projectRoot);
163
+ if (!registry || registry.sections.length === 0) {
164
+ return [];
165
+ }
166
+ const queryEmbedding = await generateEmbedding(queryText);
167
+ if (!queryEmbedding) {
168
+ return [];
169
+ }
170
+ // Find matches
171
+ const matches = registry.sections
172
+ .map(section => ({
173
+ ...section,
174
+ similarity: cosineSimilarity(queryEmbedding, section.embedding)
175
+ }))
176
+ .filter(s => s.similarity >= config.embedding.threshold)
177
+ .sort((a, b) => {
178
+ // Prioritize CRITICAL sections if configured
179
+ if (config.embedding.prioritizeCritical) {
180
+ if (a.criticality === 'CRITICAL' && b.criticality !== 'CRITICAL')
181
+ return -1;
182
+ if (b.criticality === 'CRITICAL' && a.criticality !== 'CRITICAL')
183
+ return 1;
184
+ }
185
+ return b.similarity - a.similarity;
186
+ })
187
+ .slice(0, config.embedding.maxSections);
188
+ return matches;
189
+ }
190
+ /**
191
+ * Load content of a knowledge section
192
+ */
193
+ async function loadSectionContent(projectRoot, sectionPath) {
194
+ const fullPath = path.join(projectRoot, sectionPath);
195
+ return fs.readFile(fullPath, 'utf-8');
196
+ }
197
+ /**
198
+ * Format matching sections as injectable context
199
+ */
200
+ function formatInjectedContext(matches, contents, system) {
201
+ const totalTokens = matches.reduce((sum, m) => sum + m.tokens, 0);
202
+ const criticalityBadges = {
203
+ CRITICAL: '🔴 CRITICAL',
204
+ HIGH: '🟡 HIGH',
205
+ MEDIUM: '🟢 MEDIUM',
206
+ LOW: '⚪ LOW'
207
+ };
208
+ const sections = matches
209
+ .map((match, i) => {
210
+ const badge = criticalityBadges[match.criticality] ?? '';
211
+ const similarity = Math.round(match.similarity * 100);
212
+ return `## ${match.title} (${similarity}% match) ${badge}\n\n${contents[i]}\n\n---`;
213
+ })
214
+ .join('\n\n');
215
+ return `<relevant_knowledge source="metanautical-memory" system="${system}" sections="${matches.length}" tokens="${totalTokens}">
216
+
217
+ ${sections}
218
+
219
+ </relevant_knowledge>
220
+
221
+ **System Note**: Loaded ${matches.length} knowledge sections (${totalTokens.toLocaleString()} tokens) via semantic matching.`;
222
+ }
223
+ // =============================================================================
224
+ // MAIN HOOK CLASS
225
+ // =============================================================================
226
+ export class PreToolUseHook {
227
+ config = null;
228
+ projectRoot = null;
229
+ /**
230
+ * Initialize the hook
231
+ */
232
+ async init(projectRoot) {
233
+ this.projectRoot = projectRoot ?? await getProjectRoot();
234
+ this.config = await loadConfig(this.projectRoot);
235
+ }
236
+ /**
237
+ * Execute the hook for a tool call
238
+ */
239
+ async execute(event) {
240
+ if (!this.config || !this.projectRoot) {
241
+ await this.init();
242
+ }
243
+ const config = this.config;
244
+ const projectRoot = this.projectRoot;
245
+ const toolName = event.tool_name;
246
+ // Handle different tools
247
+ switch (toolName) {
248
+ case 'Edit':
249
+ case 'Write':
250
+ return this.handleFileOperation(event, config);
251
+ case 'Task':
252
+ return this.handleTaskTool(event, config, projectRoot);
253
+ default:
254
+ return { mode: 'proceed' };
255
+ }
256
+ }
257
+ /**
258
+ * Handle Edit/Write tool calls - run guards
259
+ */
260
+ handleFileOperation(event, config) {
261
+ const filePath = event.parameters.file_path;
262
+ const content = (event.parameters.new_string ?? event.parameters.content);
263
+ if (!filePath) {
264
+ return { mode: 'proceed' };
265
+ }
266
+ // Run guards
267
+ const violations = runGuards(config, filePath, content);
268
+ if (violations.length === 0) {
269
+ return { mode: 'proceed' };
270
+ }
271
+ // Check for blocking violations
272
+ const blockingViolations = violations.filter(v => v.type === 'block');
273
+ const warnings = violations.filter(v => v.type === 'warn' || v.type === 'suggest');
274
+ if (blockingViolations.length > 0) {
275
+ const messages = blockingViolations.map(v => `⛔ ${v.ruleId.toUpperCase()}: ${v.message}`);
276
+ return {
277
+ mode: 'block',
278
+ message: messages.join('\n\n'),
279
+ violations: blockingViolations,
280
+ };
281
+ }
282
+ if (warnings.length > 0) {
283
+ const messages = warnings.map(v => `⚠️ ${v.ruleId}: ${v.message}`);
284
+ return {
285
+ mode: 'warn',
286
+ message: messages.join('\n\n'),
287
+ violations: warnings,
288
+ };
289
+ }
290
+ return { mode: 'proceed' };
291
+ }
292
+ /**
293
+ * Handle Task tool calls - inject knowledge
294
+ */
295
+ async handleTaskTool(event, config, projectRoot) {
296
+ const prompt = event.parameters.prompt;
297
+ const description = event.parameters.description;
298
+ if (!prompt && !description) {
299
+ return { mode: 'proceed' };
300
+ }
301
+ const queryText = `${description ?? ''}\n\n${prompt ?? ''}`.trim();
302
+ if (queryText.length < 20) {
303
+ return { mode: 'proceed' };
304
+ }
305
+ try {
306
+ // Find matching sections
307
+ const matches = await findMatchingSections(projectRoot, queryText, config);
308
+ if (matches.length === 0) {
309
+ return { mode: 'proceed' };
310
+ }
311
+ // Load section contents
312
+ const contents = await Promise.all(matches.map(m => loadSectionContent(projectRoot, m.path)));
313
+ // Format context
314
+ const context = formatInjectedContext(matches, contents, config.system);
315
+ console.log(`📚 [${config.system}] Injected ${matches.length} knowledge sections`);
316
+ return {
317
+ mode: 'inject_context',
318
+ context,
319
+ };
320
+ }
321
+ catch (error) {
322
+ console.error('[PreToolUse] Embedding error:', error);
323
+ return { mode: 'proceed' };
324
+ }
325
+ }
326
+ }
327
+ // =============================================================================
328
+ // STANDALONE EXECUTION
329
+ // =============================================================================
330
+ /**
331
+ * Run hook as standalone script (reads event from stdin)
332
+ */
333
+ export async function runPreToolUseHook() {
334
+ const hook = new PreToolUseHook();
335
+ // Read event from stdin or args
336
+ let event;
337
+ if (process.argv[2]) {
338
+ // Event passed as argument
339
+ event = JSON.parse(process.argv[2]);
340
+ }
341
+ else {
342
+ // Read from stdin
343
+ const chunks = [];
344
+ for await (const chunk of process.stdin) {
345
+ chunks.push(chunk);
346
+ }
347
+ const input = Buffer.concat(chunks).toString('utf-8');
348
+ event = JSON.parse(input);
349
+ }
350
+ const result = await hook.execute(event);
351
+ // Output result as JSON
352
+ console.log(JSON.stringify(result));
353
+ }
354
+ // Execute if run directly
355
+ if (import.meta.url === `file://${process.argv[1]}`) {
356
+ runPreToolUseHook().catch(console.error);
357
+ }
358
+ //# sourceMappingURL=pre-tool-use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../src/hooks/pre-tool-use.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * SessionStart Hook - Executable
3
+ *
4
+ * Loads relevant context when a Claude session starts:
5
+ * 1. Detects which module user is working on (via git diff)
6
+ * 2. Queries DEV_Items for recent memories of that module
7
+ * 3. Returns formatted context for injection
8
+ */
9
+ import type { HookResult, MemoryConfig } from '../types/index.js';
10
+ export declare class SessionStartHook {
11
+ private config;
12
+ private projectRoot;
13
+ /**
14
+ * Initialize the hook
15
+ */
16
+ init(projectRoot?: string): Promise<void>;
17
+ /**
18
+ * Execute the session start hook
19
+ */
20
+ execute(): Promise<HookResult>;
21
+ /**
22
+ * Load workflow context (plan, tasks, ideas)
23
+ */
24
+ private loadWorkflowContext;
25
+ /**
26
+ * Get current configuration
27
+ */
28
+ getConfig(): MemoryConfig | null;
29
+ /**
30
+ * Get detected project root
31
+ */
32
+ getProjectRoot(): string | null;
33
+ }
34
+ /**
35
+ * Run hook as standalone script
36
+ */
37
+ export declare function runSessionStartHook(): Promise<void>;
38
+ //# sourceMappingURL=session-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAEV,UAAU,EAEV,YAAY,EAEb,MAAM,mBAAmB,CAAA;AA8O1B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAAsB;IAEzC;;OAEG;IACG,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IA0CpC;;OAEG;YACW,mBAAmB;IAoCjC;;OAEG;IACH,SAAS,IAAI,YAAY,GAAG,IAAI;IAIhC;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;CAGhC;AAMD;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOzD"}