memobank-cli 0.2.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 (128) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/LICENSE +21 -0
  3. package/README.md +300 -0
  4. package/dist/cli.d.ts +7 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +294 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/capture.d.ts +12 -0
  9. package/dist/commands/capture.d.ts.map +1 -0
  10. package/dist/commands/capture.js +191 -0
  11. package/dist/commands/capture.js.map +1 -0
  12. package/dist/commands/import.d.ts +28 -0
  13. package/dist/commands/import.d.ts.map +1 -0
  14. package/dist/commands/import.js +356 -0
  15. package/dist/commands/import.js.map +1 -0
  16. package/dist/commands/index.d.ts +12 -0
  17. package/dist/commands/index.d.ts.map +1 -0
  18. package/dist/commands/index.js +82 -0
  19. package/dist/commands/index.js.map +1 -0
  20. package/dist/commands/install.d.ts +16 -0
  21. package/dist/commands/install.d.ts.map +1 -0
  22. package/dist/commands/install.js +142 -0
  23. package/dist/commands/install.js.map +1 -0
  24. package/dist/commands/lifecycle.d.ts +21 -0
  25. package/dist/commands/lifecycle.d.ts.map +1 -0
  26. package/dist/commands/lifecycle.js +106 -0
  27. package/dist/commands/lifecycle.js.map +1 -0
  28. package/dist/commands/map.d.ts +10 -0
  29. package/dist/commands/map.d.ts.map +1 -0
  30. package/dist/commands/map.js +72 -0
  31. package/dist/commands/map.js.map +1 -0
  32. package/dist/commands/onboarding.d.ts +10 -0
  33. package/dist/commands/onboarding.d.ts.map +1 -0
  34. package/dist/commands/onboarding.js +420 -0
  35. package/dist/commands/onboarding.js.map +1 -0
  36. package/dist/commands/recall.d.ts +13 -0
  37. package/dist/commands/recall.d.ts.map +1 -0
  38. package/dist/commands/recall.js +89 -0
  39. package/dist/commands/recall.js.map +1 -0
  40. package/dist/commands/review.d.ts +11 -0
  41. package/dist/commands/review.d.ts.map +1 -0
  42. package/dist/commands/review.js +66 -0
  43. package/dist/commands/review.js.map +1 -0
  44. package/dist/commands/search.d.ts +13 -0
  45. package/dist/commands/search.d.ts.map +1 -0
  46. package/dist/commands/search.js +107 -0
  47. package/dist/commands/search.js.map +1 -0
  48. package/dist/commands/setup.d.ts +9 -0
  49. package/dist/commands/setup.d.ts.map +1 -0
  50. package/dist/commands/setup.js +354 -0
  51. package/dist/commands/setup.js.map +1 -0
  52. package/dist/commands/write.d.ts +14 -0
  53. package/dist/commands/write.d.ts.map +1 -0
  54. package/dist/commands/write.js +247 -0
  55. package/dist/commands/write.js.map +1 -0
  56. package/dist/config.d.ts +19 -0
  57. package/dist/config.d.ts.map +1 -0
  58. package/dist/config.js +147 -0
  59. package/dist/config.js.map +1 -0
  60. package/dist/core/decay-engine.d.ts +16 -0
  61. package/dist/core/decay-engine.d.ts.map +1 -0
  62. package/dist/core/decay-engine.js +91 -0
  63. package/dist/core/decay-engine.js.map +1 -0
  64. package/dist/core/embedding.d.ts +60 -0
  65. package/dist/core/embedding.d.ts.map +1 -0
  66. package/dist/core/embedding.js +169 -0
  67. package/dist/core/embedding.js.map +1 -0
  68. package/dist/core/lifecycle-manager.d.ts +105 -0
  69. package/dist/core/lifecycle-manager.d.ts.map +1 -0
  70. package/dist/core/lifecycle-manager.js +332 -0
  71. package/dist/core/lifecycle-manager.js.map +1 -0
  72. package/dist/core/memory-template.d.ts +70 -0
  73. package/dist/core/memory-template.d.ts.map +1 -0
  74. package/dist/core/memory-template.js +496 -0
  75. package/dist/core/memory-template.js.map +1 -0
  76. package/dist/core/noise-filter.d.ts +39 -0
  77. package/dist/core/noise-filter.d.ts.map +1 -0
  78. package/dist/core/noise-filter.js +168 -0
  79. package/dist/core/noise-filter.js.map +1 -0
  80. package/dist/core/retriever.d.ts +21 -0
  81. package/dist/core/retriever.d.ts.map +1 -0
  82. package/dist/core/retriever.js +77 -0
  83. package/dist/core/retriever.js.map +1 -0
  84. package/dist/core/sanitizer.d.ts +9 -0
  85. package/dist/core/sanitizer.d.ts.map +1 -0
  86. package/dist/core/sanitizer.js +57 -0
  87. package/dist/core/sanitizer.js.map +1 -0
  88. package/dist/core/smart-extractor.d.ts +12 -0
  89. package/dist/core/smart-extractor.d.ts.map +1 -0
  90. package/dist/core/smart-extractor.js +102 -0
  91. package/dist/core/smart-extractor.js.map +1 -0
  92. package/dist/core/store.d.ts +40 -0
  93. package/dist/core/store.d.ts.map +1 -0
  94. package/dist/core/store.js +233 -0
  95. package/dist/core/store.js.map +1 -0
  96. package/dist/core/tool-config.d.ts +33 -0
  97. package/dist/core/tool-config.d.ts.map +1 -0
  98. package/dist/core/tool-config.js +253 -0
  99. package/dist/core/tool-config.js.map +1 -0
  100. package/dist/engines/engine-adapter.d.ts +22 -0
  101. package/dist/engines/engine-adapter.d.ts.map +1 -0
  102. package/dist/engines/engine-adapter.js +7 -0
  103. package/dist/engines/engine-adapter.js.map +1 -0
  104. package/dist/engines/lancedb-engine.d.ts +55 -0
  105. package/dist/engines/lancedb-engine.d.ts.map +1 -0
  106. package/dist/engines/lancedb-engine.js +279 -0
  107. package/dist/engines/lancedb-engine.js.map +1 -0
  108. package/dist/engines/text-engine.d.ts +30 -0
  109. package/dist/engines/text-engine.d.ts.map +1 -0
  110. package/dist/engines/text-engine.js +100 -0
  111. package/dist/engines/text-engine.js.map +1 -0
  112. package/dist/platforms/claude-code.d.ts +13 -0
  113. package/dist/platforms/claude-code.d.ts.map +1 -0
  114. package/dist/platforms/claude-code.js +85 -0
  115. package/dist/platforms/claude-code.js.map +1 -0
  116. package/dist/platforms/codex.d.ts +9 -0
  117. package/dist/platforms/codex.d.ts.map +1 -0
  118. package/dist/platforms/codex.js +102 -0
  119. package/dist/platforms/codex.js.map +1 -0
  120. package/dist/platforms/cursor.d.ts +9 -0
  121. package/dist/platforms/cursor.d.ts.map +1 -0
  122. package/dist/platforms/cursor.js +112 -0
  123. package/dist/platforms/cursor.js.map +1 -0
  124. package/dist/types.d.ts +55 -0
  125. package/dist/types.d.ts.map +1 -0
  126. package/dist/types.js +6 -0
  127. package/dist/types.js.map +1 -0
  128. package/package.json +87 -0
@@ -0,0 +1,496 @@
1
+ "use strict";
2
+ /**
3
+ * Memory Template Module
4
+ * Provides templates and sanitization for memobank memories
5
+ * Aligned with: https://github.com/clawde-agent/memobank/blob/master/docs/specs/2026-03-17-memobank-design.md
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.sanitizeContent = sanitizeContent;
9
+ exports.checkSensitiveTopics = checkSensitiveTopics;
10
+ exports.validateMemoryContent = validateMemoryContent;
11
+ exports.generateMemorySlug = generateMemorySlug;
12
+ exports.generateMemoryFile = generateMemoryFile;
13
+ exports.getTemplateByType = getTemplateByType;
14
+ exports.checkAbstractionLevel = checkAbstractionLevel;
15
+ /**
16
+ * Patterns for sensitive information detection
17
+ * Design Goal: Safe to share - No secrets, no embeddings, no binary blobs
18
+ */
19
+ const SENSITIVE_PATTERNS = [
20
+ // API Keys (various formats)
21
+ { pattern: /sk-[a-zA-Z0-9]{20,}/g, label: 'API Key', replacement: '[REDACTED_API_KEY]' },
22
+ {
23
+ pattern: /api[_-]?key\s*[=:]\s*['"]?[a-zA-Z0-9]{16,}['"]?/gi,
24
+ label: 'API Key',
25
+ replacement: 'api_key=[REDACTED_API_KEY]',
26
+ },
27
+ {
28
+ pattern: /apikey\s*[=:]\s*['"]?[a-zA-Z0-9]{16,}['"]?/gi,
29
+ label: 'API Key',
30
+ replacement: 'apikey=[REDACTED_API_KEY]',
31
+ },
32
+ // AWS
33
+ { pattern: /AKIA[0-9A-Z]{16}/g, label: 'AWS Access Key', replacement: '[REDACTED_AWS_KEY]' },
34
+ {
35
+ pattern: /aws[_-]?access[_-]?key[_-]?id\s*[=:]\s*['"]?[A-Z0-9]{16,}['"]?/gi,
36
+ label: 'AWS Key',
37
+ replacement: 'aws_access_key_id=[REDACTED]',
38
+ },
39
+ {
40
+ pattern: /aws[_-]?secret[_-]?access[_-]?key\s*[=:]\s*['"]?[a-zA-Z0-9/+=]{30,}['"]?/gi,
41
+ label: 'AWS Secret',
42
+ replacement: 'aws_secret_access_key=[REDACTED]',
43
+ },
44
+ // GitHub/GitLab tokens
45
+ {
46
+ pattern: /ghp_[a-zA-Z0-9]{36}/g,
47
+ label: 'GitHub Token',
48
+ replacement: '[REDACTED_GITHUB_TOKEN]',
49
+ },
50
+ {
51
+ pattern: /gho_[a-zA-Z0-9]{36}/g,
52
+ label: 'GitHub OAuth Token',
53
+ replacement: '[REDACTED_GITHUB_TOKEN]',
54
+ },
55
+ {
56
+ pattern: /glpat-[a-zA-Z0-9-]{20,}/g,
57
+ label: 'GitLab Token',
58
+ replacement: '[REDACTED_GITLAB_TOKEN]',
59
+ },
60
+ // Generic tokens
61
+ {
62
+ pattern: /token\s*[=:]\s*['"]?[a-zA-Z0-9_-]{20,}['"]?/gi,
63
+ label: 'Token',
64
+ replacement: 'token=[REDACTED_TOKEN]',
65
+ },
66
+ {
67
+ pattern: /bearer\s+[a-zA-Z0-9_-]{20,}/gi,
68
+ label: 'Bearer Token',
69
+ replacement: 'bearer [REDACTED_TOKEN]',
70
+ },
71
+ // Passwords
72
+ {
73
+ pattern: /password\s*[=:]\s*['"]?[^\s'"]{4,}['"]?/gi,
74
+ label: 'Password',
75
+ replacement: 'password=[REDACTED_PASSWORD]',
76
+ },
77
+ {
78
+ pattern: /passwd\s*[=:]\s*['"]?[^\s'"]{4,}['"]?/gi,
79
+ label: 'Password',
80
+ replacement: 'passwd=[REDACTED_PASSWORD]',
81
+ },
82
+ {
83
+ pattern: /pwd\s*[=:]\s*['"]?[^\s'"]{4,}['"]?/gi,
84
+ label: 'Password',
85
+ replacement: 'pwd=[REDACTED_PASSWORD]',
86
+ },
87
+ // Private keys
88
+ {
89
+ pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |DSA )?PRIVATE KEY-----/g,
90
+ label: 'Private Key',
91
+ replacement: '[REDACTED_PRIVATE_KEY]',
92
+ },
93
+ // IP addresses (internal and external)
94
+ {
95
+ pattern: /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g,
96
+ label: 'IP Address',
97
+ replacement: '[REDACTED_IP]',
98
+ },
99
+ // Email addresses (PII)
100
+ {
101
+ pattern: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,
102
+ label: 'Email',
103
+ replacement: '[REDACTED_EMAIL]',
104
+ },
105
+ // Phone numbers (PII)
106
+ {
107
+ pattern: /(?:\+?1[-.\s]?)?(?:\(?\d{3}\)?)[-.\s]?\d{3}[-.\s]?\d{4}/g,
108
+ label: 'Phone',
109
+ replacement: '[REDACTED_PHONE]',
110
+ },
111
+ // Social Security Numbers (PII)
112
+ { pattern: /\b\d{3}-\d{2}-\d{4}\b/g, label: 'SSN', replacement: '[REDACTED_SSN]' },
113
+ // Credit card numbers (PII)
114
+ { pattern: /\b(?:\d{4}[-\s]?){3}\d{4}\b/g, label: 'Credit Card', replacement: '[REDACTED_CC]' },
115
+ // Database connection strings
116
+ {
117
+ pattern: /mongodb(?:\+srv)?:\/\/[^\s'"]+/g,
118
+ label: 'MongoDB URI',
119
+ replacement: '[REDACTED_DB_URI]',
120
+ },
121
+ {
122
+ pattern: /postgres(?:ql)?:\/\/[^\s'"]+/g,
123
+ label: 'PostgreSQL URI',
124
+ replacement: '[REDACTED_DB_URI]',
125
+ },
126
+ { pattern: /mysql:\/\/[^\s'"]+/g, label: 'MySQL URI', replacement: '[REDACTED_DB_URI]' },
127
+ { pattern: /redis:\/\/[^\s'"]+/g, label: 'Redis URI', replacement: '[REDACTED_DB_URI]' },
128
+ // JWT tokens
129
+ {
130
+ pattern: /eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*/g,
131
+ label: 'JWT',
132
+ replacement: '[REDACTED_JWT]',
133
+ },
134
+ // Secret/Key generic
135
+ {
136
+ pattern: /secret\s*[=:]\s*['"]?[a-zA-Z0-9_-]{16,}['"]?/gi,
137
+ label: 'Secret',
138
+ replacement: 'secret=[REDACTED_SECRET]',
139
+ },
140
+ ];
141
+ /**
142
+ * High-level topics that are safe to store
143
+ */
144
+ const SAFE_HIGH_LEVEL_TOPICS = [
145
+ 'architecture',
146
+ 'design pattern',
147
+ 'system design',
148
+ 'microservices',
149
+ 'api design',
150
+ 'database schema',
151
+ 'data model',
152
+ 'technology stack',
153
+ 'framework',
154
+ 'library',
155
+ 'tool',
156
+ 'infrastructure',
157
+ 'deployment',
158
+ 'ci/cd',
159
+ 'pipeline',
160
+ 'workflow',
161
+ 'process',
162
+ 'methodology',
163
+ 'best practice',
164
+ 'guideline',
165
+ 'principle',
166
+ 'convention',
167
+ 'standard',
168
+ ];
169
+ /**
170
+ * Middle-level topics that are generally safe
171
+ */
172
+ const SAFE_MIDDLE_LEVEL_TOPICS = [
173
+ 'configuration',
174
+ 'setting',
175
+ 'option',
176
+ 'parameter',
177
+ 'environment',
178
+ 'connection pool',
179
+ 'cache',
180
+ 'timeout',
181
+ 'retry',
182
+ 'error handling',
183
+ 'logging',
184
+ 'monitoring',
185
+ 'testing',
186
+ 'debugging',
187
+ 'performance',
188
+ 'optimization',
189
+ 'scaling',
190
+ 'load balancing',
191
+ 'rate limiting',
192
+ 'authentication',
193
+ 'authorization',
194
+ 'permission',
195
+ 'role',
196
+ 'access control',
197
+ ];
198
+ /**
199
+ * Sensitive topics that should NOT be stored
200
+ */
201
+ const SENSITIVE_TOPICS = [
202
+ 'credential',
203
+ 'password',
204
+ 'secret',
205
+ 'token',
206
+ 'key',
207
+ 'certificate',
208
+ 'private key',
209
+ 'api key',
210
+ 'access token',
211
+ 'refresh token',
212
+ ];
213
+ /**
214
+ * Sanitize content by removing sensitive information
215
+ */
216
+ function sanitizeContent(content) {
217
+ const redacted = [];
218
+ let sanitized = content;
219
+ for (const { pattern, label, replacement } of SENSITIVE_PATTERNS) {
220
+ const matches = sanitized.match(pattern);
221
+ if (matches && matches.length > 0) {
222
+ redacted.push(...matches.map((m) => `${label}: ${m.substring(0, 20)}...`));
223
+ sanitized = sanitized.replace(pattern, replacement);
224
+ }
225
+ }
226
+ return { sanitized, redacted };
227
+ }
228
+ /**
229
+ * Check if content contains sensitive topics
230
+ */
231
+ function checkSensitiveTopics(content) {
232
+ const found = [];
233
+ const lowerContent = content.toLowerCase();
234
+ for (const topic of SENSITIVE_TOPICS) {
235
+ if (lowerContent.includes(topic)) {
236
+ found.push(topic);
237
+ }
238
+ }
239
+ return found;
240
+ }
241
+ /**
242
+ * Validate memory content for safety
243
+ */
244
+ function validateMemoryContent(content) {
245
+ const warnings = [];
246
+ const errors = [];
247
+ // Check for sensitive patterns
248
+ const { redacted } = sanitizeContent(content);
249
+ if (redacted.length > 0) {
250
+ errors.push(`Found ${redacted.length} sensitive information item(s) that must be removed`);
251
+ }
252
+ // Check for sensitive topics
253
+ const sensitiveTopics = checkSensitiveTopics(content);
254
+ if (sensitiveTopics.length > 0) {
255
+ warnings.push(`Content mentions sensitive topics: ${sensitiveTopics.join(', ')}. Ensure no actual secrets are included.`);
256
+ }
257
+ // Check abstraction level
258
+ const lowerContent = content.toLowerCase();
259
+ const hasHighLevel = SAFE_HIGH_LEVEL_TOPICS.some((t) => lowerContent.includes(t));
260
+ const hasMiddleLevel = SAFE_MIDDLE_LEVEL_TOPICS.some((t) => lowerContent.includes(t));
261
+ if (!hasHighLevel && !hasMiddleLevel) {
262
+ warnings.push('Content may be too specific. Consider documenting at a higher abstraction level.');
263
+ }
264
+ // Check for file paths (potential security risk)
265
+ const filePathPattern = /(?:\/[a-zA-Z0-9._-]+)+\/[a-zA-Z0-9._-]+\.[a-zA-Z0-9]+/g;
266
+ const filePaths = content.match(filePathPattern);
267
+ if (filePaths && filePaths.length > 3) {
268
+ warnings.push('Content contains many file paths. Ensure they are relative and not system-specific.');
269
+ }
270
+ // Check for code snippets with potential secrets
271
+ const codeBlockPattern = /```[\s\S]*?```/g;
272
+ const codeBlocks = content.match(codeBlockPattern);
273
+ if (codeBlocks) {
274
+ for (const block of codeBlocks) {
275
+ const blockLower = block.toLowerCase();
276
+ if (blockLower.includes('password') ||
277
+ blockLower.includes('secret') ||
278
+ blockLower.includes('key')) {
279
+ warnings.push('Code block may contain sensitive variable names. Review before saving.');
280
+ }
281
+ }
282
+ }
283
+ return {
284
+ valid: errors.length === 0,
285
+ warnings,
286
+ errors,
287
+ };
288
+ }
289
+ /**
290
+ * Generate memory file name (slug format)
291
+ */
292
+ function generateMemorySlug(name) {
293
+ return name
294
+ .toLowerCase()
295
+ .replace(/[^a-z0-9]+/g, '-')
296
+ .replace(/^-+|-+$/g, '')
297
+ .slice(0, 60);
298
+ }
299
+ /**
300
+ * Generate memory file content with frontmatter
301
+ * Aligned with memobank design spec:
302
+ * - Filename: <date>-<name>.md
303
+ * - Frontmatter: YAML with required fields
304
+ * - Body: Free-form Markdown
305
+ * - Design Goal: Human-readable, Git-native, Portable
306
+ */
307
+ function generateMemoryFile(template) {
308
+ const slug = generateMemorySlug(template.name);
309
+ const date = template.created.split('T')[0]; // Extract YYYY-MM-DD from ISO date
310
+ const fileName = `${date}-${slug}.md`;
311
+ // Build frontmatter aligned with memobank spec
312
+ const frontmatterFields = {
313
+ name: slug,
314
+ type: template.type,
315
+ description: template.description,
316
+ tags: template.tags,
317
+ created: date, // Use date-only format for readability
318
+ };
319
+ // Add optional fields
320
+ if (template.updated) {
321
+ frontmatterFields.updated = template.updated.split('T')[0];
322
+ }
323
+ if (template.reviewAfter) {
324
+ frontmatterFields.review_after = template.reviewAfter;
325
+ }
326
+ if (template.confidence) {
327
+ frontmatterFields.confidence = template.confidence;
328
+ }
329
+ // Generate YAML frontmatter manually (no external dependency)
330
+ const frontmatter = '---\n' +
331
+ Object.entries(frontmatterFields)
332
+ .map(([key, value]) => {
333
+ if (Array.isArray(value)) {
334
+ return `${key}: [${value.join(', ')}]`;
335
+ }
336
+ return `${key}: ${value}`;
337
+ })
338
+ .join('\n') +
339
+ '\n---\n\n';
340
+ const content = template.content.trim();
341
+ return {
342
+ fileName,
343
+ content: frontmatter + content,
344
+ };
345
+ }
346
+ /**
347
+ * Get template by type
348
+ * Aligned with memobank design spec directory semantics:
349
+ * - lessons/: Post-mortems, bugs fixed, gotchas
350
+ * - decisions/: ADRs: context, options, decision, consequences
351
+ * - workflows/: Step-by-step runbooks, deploy flows, onboarding
352
+ * - architecture/: System diagrams, component descriptions, data flows
353
+ */
354
+ function getTemplateByType(type) {
355
+ const templates = {
356
+ lesson: `## Problem
357
+
358
+ [Describe the problem or challenge encountered]
359
+
360
+ ## Solution
361
+
362
+ [Describe the solution or approach that worked]
363
+
364
+ ## Key Takeaways
365
+
366
+ - [Key insight 1]
367
+ - [Key insight 2]
368
+ - [Key insight 3]
369
+
370
+ ## Related
371
+
372
+ - Tags: #topic #technology
373
+ - See also: [related memories or documentation]`,
374
+ decision: `## Context
375
+
376
+ [Describe the situation requiring a decision]
377
+
378
+ ## Options Considered
379
+
380
+ 1. **[Option A]**
381
+ - Pros: [...]
382
+ - Cons: [...]
383
+
384
+ 2. **[Option B]**
385
+ - Pros: [...]
386
+ - Cons: [...]
387
+
388
+ ## Decision
389
+
390
+ [State the decision made]
391
+
392
+ ## Rationale
393
+
394
+ [Explain why this decision was made]
395
+
396
+ ## Consequences
397
+
398
+ [Document expected outcomes and trade-offs]
399
+
400
+ ## Review Date
401
+
402
+ [When should this decision be reviewed?]`,
403
+ workflow: `## Purpose
404
+
405
+ [What does this workflow accomplish?]
406
+
407
+ ## Prerequisites
408
+
409
+ - [Required setup or dependencies]
410
+
411
+ ## Steps
412
+
413
+ 1. **[Step 1]** [Description]
414
+ \`\`\`bash
415
+ [command if applicable]
416
+ \`\`\`
417
+
418
+ 2. **[Step 2]** [Description]
419
+
420
+ 3. **[Step 3]** [Description]
421
+
422
+ ## Troubleshooting
423
+
424
+ - **Issue**: [Common problem]
425
+ - **Solution**: [How to fix]
426
+
427
+ ## Related
428
+
429
+ - Commands: \`[relevant commands]\`
430
+ - Documentation: [links]`,
431
+ architecture: `## Overview
432
+
433
+ [High-level description of the architecture]
434
+
435
+ ## Components
436
+
437
+ ### [Component A]
438
+
439
+ - **Purpose**: [What it does]
440
+ - **Technology**: [Tools/frameworks used]
441
+ - **Interfaces**: [How it connects to other components]
442
+
443
+ ### [Component B]
444
+
445
+ - **Purpose**: [What it does]
446
+ - **Technology**: [Tools/frameworks used]
447
+ - **Interfaces**: [How it connects to other components]
448
+
449
+ ## Data Flow
450
+
451
+ [Describe how data moves through the system]
452
+
453
+ ## Design Decisions
454
+
455
+ - **[Decision 1]**: [Rationale]
456
+ - **[Decision 2]**: [Rationale]
457
+
458
+ ## Scalability
459
+
460
+ [How the architecture handles growth]
461
+
462
+ ## Security
463
+
464
+ [Security considerations and measures]`,
465
+ };
466
+ return templates[type];
467
+ }
468
+ /**
469
+ * Validate memory abstraction level
470
+ */
471
+ function checkAbstractionLevel(content) {
472
+ const lowerContent = content.toLowerCase();
473
+ // Check for high-level indicators
474
+ const highLevelCount = SAFE_HIGH_LEVEL_TOPICS.filter((t) => lowerContent.includes(t)).length;
475
+ const middleLevelCount = SAFE_MIDDLE_LEVEL_TOPICS.filter((t) => lowerContent.includes(t)).length;
476
+ // Check for overly specific indicators
477
+ const specificPatterns = [
478
+ /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, // IP addresses
479
+ /\b[a-f0-9]{32,}\b/, // Hashes/tokens
480
+ /localhost:\d+/, // Localhost with port
481
+ /\/Users\/[a-zA-Z0-9]+/, // User paths
482
+ /\/home\/[a-zA-Z0-9]+/, // Home directories
483
+ ];
484
+ const specificCount = specificPatterns.filter((p) => p.test(content)).length;
485
+ if (specificCount >= 2) {
486
+ return 'too-specific';
487
+ }
488
+ if (highLevelCount >= 3) {
489
+ return 'high';
490
+ }
491
+ if (highLevelCount >= 1 || middleLevelCount >= 2) {
492
+ return 'medium';
493
+ }
494
+ return 'low';
495
+ }
496
+ //# sourceMappingURL=memory-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-template.js","sourceRoot":"","sources":["../../src/core/memory-template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAkPH,0CAaC;AAKD,oDAWC;AAKD,sDA+DC;AAKD,gDAMC;AAUD,gDA+CC;AAUD,8CAqHC;AAKD,sDA+BC;AApiBD;;;GAGG;AACH,MAAM,kBAAkB,GAA8D;IACpF,6BAA6B;IAC7B,EAAE,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACxF;QACE,OAAO,EAAE,mDAAmD;QAC5D,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,4BAA4B;KAC1C;IACD;QACE,OAAO,EAAE,8CAA8C;QACvD,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,2BAA2B;KACzC;IAED,MAAM;IACN,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAC5F;QACE,OAAO,EAAE,kEAAkE;QAC3E,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,8BAA8B;KAC5C;IACD;QACE,OAAO,EAAE,4EAA4E;QACrF,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,kCAAkC;KAChD;IAED,uBAAuB;IACvB;QACE,OAAO,EAAE,sBAAsB;QAC/B,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,yBAAyB;KACvC;IACD;QACE,OAAO,EAAE,sBAAsB;QAC/B,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,yBAAyB;KACvC;IACD;QACE,OAAO,EAAE,0BAA0B;QACnC,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,yBAAyB;KACvC;IAED,iBAAiB;IACjB;QACE,OAAO,EAAE,+CAA+C;QACxD,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,OAAO,EAAE,+BAA+B;QACxC,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,yBAAyB;KACvC;IAED,YAAY;IACZ;QACE,OAAO,EAAE,2CAA2C;QACpD,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,8BAA8B;KAC5C;IACD;QACE,OAAO,EAAE,yCAAyC;QAClD,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,4BAA4B;KAC1C;IACD;QACE,OAAO,EAAE,sCAAsC;QAC/C,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,yBAAyB;KACvC;IAED,eAAe;IACf;QACE,OAAO,EACL,mGAAmG;QACrG,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,wBAAwB;KACtC;IAED,uCAAuC;IACvC;QACE,OAAO,EACL,gGAAgG;QAClG,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,eAAe;KAC7B;IAED,wBAAwB;IACxB;QACE,OAAO,EAAE,iDAAiD;QAC1D,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,kBAAkB;KAChC;IAED,sBAAsB;IACtB;QACE,OAAO,EAAE,0DAA0D;QACnE,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,kBAAkB;KAChC;IAED,gCAAgC;IAChC,EAAE,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAElF,4BAA4B;IAC5B,EAAE,OAAO,EAAE,8BAA8B,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE;IAE/F,8BAA8B;IAC9B;QACE,OAAO,EAAE,iCAAiC;QAC1C,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,mBAAmB;KACjC;IACD;QACE,OAAO,EAAE,+BAA+B;QACxC,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,mBAAmB;KACjC;IACD,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACxF,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE;IAExF,aAAa;IACb;QACE,OAAO,EAAE,uDAAuD;QAChE,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,gBAAgB;KAC9B;IAED,qBAAqB;IACrB;QACE,OAAO,EAAE,gDAAgD;QACzD,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,0BAA0B;KACxC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,sBAAsB,GAAG;IAC7B,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,YAAY;IACZ,iBAAiB;IACjB,YAAY;IACZ,kBAAkB;IAClB,WAAW;IACX,SAAS;IACT,MAAM;IACN,gBAAgB;IAChB,YAAY;IACZ,OAAO;IACP,UAAU;IACV,UAAU;IACV,SAAS;IACT,aAAa;IACb,eAAe;IACf,WAAW;IACX,WAAW;IACX,YAAY;IACZ,UAAU;CACX,CAAC;AAEF;;GAEG;AACH,MAAM,wBAAwB,GAAG;IAC/B,eAAe;IACf,SAAS;IACT,QAAQ;IACR,WAAW;IACX,aAAa;IACb,iBAAiB;IACjB,OAAO;IACP,SAAS;IACT,OAAO;IACP,gBAAgB;IAChB,SAAS;IACT,YAAY;IACZ,SAAS;IACT,WAAW;IACX,aAAa;IACb,cAAc;IACd,SAAS;IACT,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,MAAM;IACN,gBAAgB;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACvB,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,OAAO;IACP,KAAK;IACL,aAAa;IACb,aAAa;IACb,SAAS;IACT,cAAc;IACd,eAAe;CAChB,CAAC;AAEF;;GAEG;AACH,SAAgB,eAAe,CAAC,OAAe;IAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,GAAG,OAAO,CAAC;IAExB,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3E,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,OAAe;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAE3C,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAe;IAKnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,+BAA+B;IAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,MAAM,qDAAqD,CAAC,CAAC;IAC7F,CAAC;IAED,6BAA6B;IAC7B,MAAM,eAAe,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CACX,sCAAsC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,CAC3G,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,cAAc,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtF,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CACX,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,eAAe,GAAG,wDAAwD,CAAC;IACjF,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACjD,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CACX,qFAAqF,CACtF,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;IAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnD,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACvC,IACE,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC/B,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC7B,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC1B,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,QAAwB;IAIzD,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAmC;IAChF,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,CAAC;IAEtC,+CAA+C;IAC/C,MAAM,iBAAiB,GAAwB;QAC7C,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,IAAI,EAAE,uCAAuC;KACvD,CAAC;IAEF,sBAAsB;IACtB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,iBAAiB,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,iBAAiB,CAAC,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC;IACxD,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,iBAAiB,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACrD,CAAC;IAED,8DAA8D;IAC9D,MAAM,WAAW,GACf,OAAO;QACP,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACzC,CAAC;YACD,OAAO,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC;QAC5B,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC;QACb,WAAW,CAAC;IAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAExC,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,WAAW,GAAG,OAAO;KAC/B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAAC,IAAgB;IAChD,MAAM,SAAS,GAA+B;QAC5C,MAAM,EAAE;;;;;;;;;;;;;;;;;gDAiBoC;QAE5C,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCA4B2B;QAErC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA2BW;QAErB,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCAiCqB;KACpC,CAAC;IAEF,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAe;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAE3C,kCAAkC;IAClC,MAAM,cAAc,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7F,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAEjG,uCAAuC;IACvC,MAAM,gBAAgB,GAAG;QACvB,wCAAwC,EAAE,eAAe;QACzD,mBAAmB,EAAE,gBAAgB;QACrC,eAAe,EAAE,sBAAsB;QACvC,uBAAuB,EAAE,aAAa;QACtC,sBAAsB,EAAE,mBAAmB;KAC5C,CAAC;IAEF,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAE7E,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,cAAc,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Noise Filter Module
3
+ * Filters out low-value content before capturing as memory
4
+ * Ported from memory-lancedb-pro
5
+ */
6
+ /**
7
+ * Check if content is likely noise
8
+ */
9
+ export declare function isNoise(content: string): boolean;
10
+ /**
11
+ * Check if content has high value indicators
12
+ */
13
+ export declare function hasHighValueIndicators(content: string): boolean;
14
+ /**
15
+ * Calculate content value score (0-1)
16
+ */
17
+ export declare function calculateValueScore(content: string): number;
18
+ /**
19
+ * Filter and rank memories by value
20
+ */
21
+ export interface FilteredMemory {
22
+ content: string;
23
+ score: number;
24
+ reason: string;
25
+ }
26
+ export declare function filterAndRank(memories: Array<{
27
+ content: string;
28
+ name?: string;
29
+ description?: string;
30
+ }>): FilteredMemory[];
31
+ /**
32
+ * Get recommendation for whether to capture
33
+ */
34
+ export declare function getCaptureRecommendation(score: number): {
35
+ shouldCapture: boolean;
36
+ confidence: 'high' | 'medium' | 'low';
37
+ reason: string;
38
+ };
39
+ //# sourceMappingURL=noise-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise-filter.d.ts","sourceRoot":"","sources":["../../src/core/noise-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0CH;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAgBhD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA2B3D;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACxE,cAAc,EAAE,CAkClB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG;IACvD,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB,CA0BA"}