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.
- package/CHANGELOG.md +139 -0
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +294 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/capture.d.ts +12 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +191 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/import.d.ts +28 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +356 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index.d.ts +12 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +82 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +142 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/lifecycle.d.ts +21 -0
- package/dist/commands/lifecycle.d.ts.map +1 -0
- package/dist/commands/lifecycle.js +106 -0
- package/dist/commands/lifecycle.js.map +1 -0
- package/dist/commands/map.d.ts +10 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +72 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/onboarding.d.ts +10 -0
- package/dist/commands/onboarding.d.ts.map +1 -0
- package/dist/commands/onboarding.js +420 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/recall.d.ts +13 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +89 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/review.d.ts +11 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +66 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/search.d.ts +13 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +107 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup.d.ts +9 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +354 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/write.d.ts +14 -0
- package/dist/commands/write.d.ts.map +1 -0
- package/dist/commands/write.js +247 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +147 -0
- package/dist/config.js.map +1 -0
- package/dist/core/decay-engine.d.ts +16 -0
- package/dist/core/decay-engine.d.ts.map +1 -0
- package/dist/core/decay-engine.js +91 -0
- package/dist/core/decay-engine.js.map +1 -0
- package/dist/core/embedding.d.ts +60 -0
- package/dist/core/embedding.d.ts.map +1 -0
- package/dist/core/embedding.js +169 -0
- package/dist/core/embedding.js.map +1 -0
- package/dist/core/lifecycle-manager.d.ts +105 -0
- package/dist/core/lifecycle-manager.d.ts.map +1 -0
- package/dist/core/lifecycle-manager.js +332 -0
- package/dist/core/lifecycle-manager.js.map +1 -0
- package/dist/core/memory-template.d.ts +70 -0
- package/dist/core/memory-template.d.ts.map +1 -0
- package/dist/core/memory-template.js +496 -0
- package/dist/core/memory-template.js.map +1 -0
- package/dist/core/noise-filter.d.ts +39 -0
- package/dist/core/noise-filter.d.ts.map +1 -0
- package/dist/core/noise-filter.js +168 -0
- package/dist/core/noise-filter.js.map +1 -0
- package/dist/core/retriever.d.ts +21 -0
- package/dist/core/retriever.d.ts.map +1 -0
- package/dist/core/retriever.js +77 -0
- package/dist/core/retriever.js.map +1 -0
- package/dist/core/sanitizer.d.ts +9 -0
- package/dist/core/sanitizer.d.ts.map +1 -0
- package/dist/core/sanitizer.js +57 -0
- package/dist/core/sanitizer.js.map +1 -0
- package/dist/core/smart-extractor.d.ts +12 -0
- package/dist/core/smart-extractor.d.ts.map +1 -0
- package/dist/core/smart-extractor.js +102 -0
- package/dist/core/smart-extractor.js.map +1 -0
- package/dist/core/store.d.ts +40 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +233 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/tool-config.d.ts +33 -0
- package/dist/core/tool-config.d.ts.map +1 -0
- package/dist/core/tool-config.js +253 -0
- package/dist/core/tool-config.js.map +1 -0
- package/dist/engines/engine-adapter.d.ts +22 -0
- package/dist/engines/engine-adapter.d.ts.map +1 -0
- package/dist/engines/engine-adapter.js +7 -0
- package/dist/engines/engine-adapter.js.map +1 -0
- package/dist/engines/lancedb-engine.d.ts +55 -0
- package/dist/engines/lancedb-engine.d.ts.map +1 -0
- package/dist/engines/lancedb-engine.js +279 -0
- package/dist/engines/lancedb-engine.js.map +1 -0
- package/dist/engines/text-engine.d.ts +30 -0
- package/dist/engines/text-engine.d.ts.map +1 -0
- package/dist/engines/text-engine.js +100 -0
- package/dist/engines/text-engine.js.map +1 -0
- package/dist/platforms/claude-code.d.ts +13 -0
- package/dist/platforms/claude-code.d.ts.map +1 -0
- package/dist/platforms/claude-code.js +85 -0
- package/dist/platforms/claude-code.js.map +1 -0
- package/dist/platforms/codex.d.ts +9 -0
- package/dist/platforms/codex.d.ts.map +1 -0
- package/dist/platforms/codex.js +102 -0
- package/dist/platforms/codex.js.map +1 -0
- package/dist/platforms/cursor.d.ts +9 -0
- package/dist/platforms/cursor.d.ts.map +1 -0
- package/dist/platforms/cursor.js +112 -0
- package/dist/platforms/cursor.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LanceDB Engine
|
|
4
|
+
* Vector search engine using LanceDB with hybrid BM25 + vector search
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.LanceDbEngine = void 0;
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const decay_engine_1 = require("../core/decay-engine");
|
|
43
|
+
// LanceDB types (dynamic import)
|
|
44
|
+
let lancedb = null;
|
|
45
|
+
class LanceDbEngine {
|
|
46
|
+
dbPath;
|
|
47
|
+
embeddingGenerator;
|
|
48
|
+
db = null;
|
|
49
|
+
table = null;
|
|
50
|
+
tableName = 'memories';
|
|
51
|
+
indexDirName = '.lancedb';
|
|
52
|
+
constructor(dbPath, embeddingGenerator) {
|
|
53
|
+
this.dbPath = dbPath;
|
|
54
|
+
this.embeddingGenerator = embeddingGenerator;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Initialize LanceDB connection and table
|
|
58
|
+
*/
|
|
59
|
+
async init() {
|
|
60
|
+
if (this.db !== null) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
// Dynamic import for optional dependency
|
|
65
|
+
lancedb = await Promise.resolve().then(() => __importStar(require('@lancedb/lancedb')));
|
|
66
|
+
const uri = path.join(this.dbPath, this.indexDirName);
|
|
67
|
+
this.db = await lancedb.connect(uri);
|
|
68
|
+
// Try to open existing table
|
|
69
|
+
try {
|
|
70
|
+
this.table = await this.db.openTable(this.tableName);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Table doesn't exist - will be created on first index
|
|
74
|
+
this.table = null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw new Error(`Failed to initialize LanceDB: ${error.message}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Index memories into LanceDB
|
|
83
|
+
* @param memories - Memories to index
|
|
84
|
+
* @param incremental - Whether to update incrementally or rebuild
|
|
85
|
+
*/
|
|
86
|
+
async index(memories, incremental) {
|
|
87
|
+
await this.init();
|
|
88
|
+
if (memories.length === 0) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Generate embeddings for all memories
|
|
92
|
+
const texts = memories.map((m) => this.getEmbeddingText(m));
|
|
93
|
+
const embeddings = await this.embeddingGenerator.generateEmbeddings(texts);
|
|
94
|
+
// Prepare data for insertion (filter out undefined embeddings)
|
|
95
|
+
const dataToInsert = memories
|
|
96
|
+
.map((memory, i) => ({
|
|
97
|
+
id: this.memoryId(memory),
|
|
98
|
+
path: memory.path,
|
|
99
|
+
name: memory.name,
|
|
100
|
+
description: memory.description,
|
|
101
|
+
tags: memory.tags.join(', '),
|
|
102
|
+
content: memory.content,
|
|
103
|
+
vector: embeddings[i] ?? [],
|
|
104
|
+
created: memory.created,
|
|
105
|
+
updated: memory.updated || memory.created,
|
|
106
|
+
confidence: memory.confidence || 'medium',
|
|
107
|
+
}))
|
|
108
|
+
.filter((item) => item.vector.length > 0);
|
|
109
|
+
// Create table if it doesn't exist
|
|
110
|
+
if (this.table === null) {
|
|
111
|
+
if (dataToInsert.length === 0) {
|
|
112
|
+
console.log('No valid memories to index (embeddings failed)');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
this.table = await this.db.createTable(this.tableName, dataToInsert);
|
|
116
|
+
console.log(`Created table with ${dataToInsert.length} records`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Get existing indexed paths for incremental update
|
|
120
|
+
let existingPaths = new Set();
|
|
121
|
+
if (incremental) {
|
|
122
|
+
try {
|
|
123
|
+
const allData = await this.table.query().limit(10000).toArray();
|
|
124
|
+
existingPaths = new Set(allData.map((row) => row.path));
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Table empty or error
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Filter memories that need indexing
|
|
131
|
+
const memoriesToIndex = memories.filter((m) => !incremental || !existingPaths.has(m.path) || this.isMemoryUpdated(m));
|
|
132
|
+
if (memoriesToIndex.length === 0) {
|
|
133
|
+
console.log('No new memories to index');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Generate embeddings for new/updated memories
|
|
137
|
+
const newTexts = memoriesToIndex.map((m) => this.getEmbeddingText(m));
|
|
138
|
+
const newEmbeddings = await this.embeddingGenerator.generateEmbeddings(newTexts);
|
|
139
|
+
// Prepare data for insertion (filter out undefined embeddings)
|
|
140
|
+
const newDataToInsert = memoriesToIndex
|
|
141
|
+
.map((memory, i) => ({
|
|
142
|
+
id: this.memoryId(memory),
|
|
143
|
+
path: memory.path,
|
|
144
|
+
name: memory.name,
|
|
145
|
+
description: memory.description,
|
|
146
|
+
tags: memory.tags.join(', '),
|
|
147
|
+
content: memory.content,
|
|
148
|
+
vector: newEmbeddings[i] ?? [],
|
|
149
|
+
created: memory.created,
|
|
150
|
+
updated: memory.updated || memory.created,
|
|
151
|
+
confidence: memory.confidence || 'medium',
|
|
152
|
+
}))
|
|
153
|
+
.filter((item) => item.vector.length > 0);
|
|
154
|
+
// Delete old entries for updated memories
|
|
155
|
+
if (incremental) {
|
|
156
|
+
const updatedPaths = memoriesToIndex
|
|
157
|
+
.filter((m) => this.isMemoryUpdated(m))
|
|
158
|
+
.map((m) => m.path);
|
|
159
|
+
for (const p of updatedPaths) {
|
|
160
|
+
try {
|
|
161
|
+
await this.table.delete(`path = '${p.replace(/'/g, "''")}'`);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Ignore delete errors
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Insert new data
|
|
169
|
+
await this.table.add(newDataToInsert);
|
|
170
|
+
console.log(`Added ${newDataToInsert.length} records`);
|
|
171
|
+
// Create index for vector search (if not exists)
|
|
172
|
+
try {
|
|
173
|
+
await this.table.createIndex('vector', {
|
|
174
|
+
config: lancedb.Index.ivfPq({
|
|
175
|
+
numPartitions: Math.max(1, Math.floor(memories.length / 100)),
|
|
176
|
+
numSubVectors: Math.floor(this.embeddingGenerator['config'].dimensions / 8),
|
|
177
|
+
}),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Index may already exist, ignore
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Search for memories using hybrid vector + BM25 search
|
|
186
|
+
* @param query - Search query string
|
|
187
|
+
* @param memories - All memories (fallback for text search)
|
|
188
|
+
* @param topK - Maximum number of results
|
|
189
|
+
* @returns Array of recall results sorted by score
|
|
190
|
+
*/
|
|
191
|
+
async search(query, memories, topK) {
|
|
192
|
+
await this.init();
|
|
193
|
+
// If table doesn't exist yet, return empty results
|
|
194
|
+
if (this.table === null) {
|
|
195
|
+
return [];
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
// Generate query embedding
|
|
199
|
+
const queryEmbedding = await this.embeddingGenerator.generateEmbedding(query);
|
|
200
|
+
// Vector search using nearestTo
|
|
201
|
+
const queryResult = await this.table
|
|
202
|
+
.query()
|
|
203
|
+
.nearestTo(queryEmbedding)
|
|
204
|
+
.limit(topK * 2)
|
|
205
|
+
.toArray();
|
|
206
|
+
// Convert to RecallResult with hybrid scoring
|
|
207
|
+
const results = queryResult.map((row) => {
|
|
208
|
+
const memory = this.rowToMemory(row);
|
|
209
|
+
const vectorScore = 1 - (row._distance || 0); // Convert distance to similarity
|
|
210
|
+
// Combine with decay score
|
|
211
|
+
const decayScore = (0, decay_engine_1.computeDecayScore)(memory);
|
|
212
|
+
const finalScore = vectorScore * 0.7 + decayScore * 0.3;
|
|
213
|
+
return { memory, score: finalScore };
|
|
214
|
+
});
|
|
215
|
+
// Sort by score descending
|
|
216
|
+
results.sort((a, b) => b.score - a.score);
|
|
217
|
+
// Return top-K
|
|
218
|
+
return results.slice(0, topK);
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
console.warn(`LanceDB search failed, falling back to text engine: ${error.message}`);
|
|
222
|
+
// Return empty results, caller should handle fallback
|
|
223
|
+
return [];
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get combined text for embedding generation
|
|
228
|
+
*/
|
|
229
|
+
getEmbeddingText(memory) {
|
|
230
|
+
return `${memory.name} ${memory.description} ${memory.tags.join(' ')} ${memory.content}`.slice(0, 8000);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Generate unique memory ID
|
|
234
|
+
*/
|
|
235
|
+
memoryId(memory) {
|
|
236
|
+
const hash = require('crypto').createHash('md5').update(memory.path).digest('hex');
|
|
237
|
+
return hash.slice(0, 16);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Check if memory has been updated since last indexing
|
|
241
|
+
*/
|
|
242
|
+
isMemoryUpdated(memory) {
|
|
243
|
+
// Simple check based on updated timestamp
|
|
244
|
+
return memory.updated !== undefined && memory.updated !== memory.created;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Convert LanceDB row to MemoryFile
|
|
248
|
+
*/
|
|
249
|
+
rowToMemory(row) {
|
|
250
|
+
return {
|
|
251
|
+
path: row.path,
|
|
252
|
+
name: row.name,
|
|
253
|
+
type: this.inferType(row.name),
|
|
254
|
+
description: row.description,
|
|
255
|
+
tags: row.tags.split(', ').filter((t) => t.length > 0),
|
|
256
|
+
created: row.created,
|
|
257
|
+
updated: row.updated,
|
|
258
|
+
confidence: row.confidence,
|
|
259
|
+
content: row.content,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Infer memory type from name/path
|
|
264
|
+
*/
|
|
265
|
+
inferType(name) {
|
|
266
|
+
const lower = name.toLowerCase();
|
|
267
|
+
if (lower.includes('lesson'))
|
|
268
|
+
return 'lesson';
|
|
269
|
+
if (lower.includes('decision'))
|
|
270
|
+
return 'decision';
|
|
271
|
+
if (lower.includes('workflow'))
|
|
272
|
+
return 'workflow';
|
|
273
|
+
if (lower.includes('architecture'))
|
|
274
|
+
return 'architecture';
|
|
275
|
+
return 'lesson'; // default
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
exports.LanceDbEngine = LanceDbEngine;
|
|
279
|
+
//# sourceMappingURL=lancedb-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lancedb-engine.js","sourceRoot":"","sources":["../../src/engines/lancedb-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text-based search engine
|
|
3
|
+
* Uses keyword matching, tag filtering, and decay scoring
|
|
4
|
+
* Zero external dependencies
|
|
5
|
+
*/
|
|
6
|
+
import { MemoryFile, RecallResult } from '../types';
|
|
7
|
+
import { EngineAdapter } from './engine-adapter';
|
|
8
|
+
export declare class TextEngine implements EngineAdapter {
|
|
9
|
+
/**
|
|
10
|
+
* Search for memories using keyword matching + decay scoring
|
|
11
|
+
*/
|
|
12
|
+
search(query: string, memories: MemoryFile[], topK: number): Promise<RecallResult[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Tokenize a string into lowercase words
|
|
15
|
+
*/
|
|
16
|
+
private tokenize;
|
|
17
|
+
/**
|
|
18
|
+
* Compute text match score for a memory (0-1)
|
|
19
|
+
*/
|
|
20
|
+
private computeTextScore;
|
|
21
|
+
/**
|
|
22
|
+
* Compute match score for query tokens against field tokens (0-1)
|
|
23
|
+
*/
|
|
24
|
+
private computeFieldMatchScore;
|
|
25
|
+
/**
|
|
26
|
+
* Index is a no-op for text engine - searches live files directly
|
|
27
|
+
*/
|
|
28
|
+
index(memories: MemoryFile[], incremental: boolean): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=text-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-engine.d.ts","sourceRoot":"","sources":["../../src/engines/text-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,qBAAa,UAAW,YAAW,aAAa;IAC9C;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA6B1F;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Text-based search engine
|
|
4
|
+
* Uses keyword matching, tag filtering, and decay scoring
|
|
5
|
+
* Zero external dependencies
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.TextEngine = void 0;
|
|
9
|
+
const decay_engine_1 = require("../core/decay-engine");
|
|
10
|
+
class TextEngine {
|
|
11
|
+
/**
|
|
12
|
+
* Search for memories using keyword matching + decay scoring
|
|
13
|
+
*/
|
|
14
|
+
async search(query, memories, topK) {
|
|
15
|
+
// 1. Tokenize query
|
|
16
|
+
const queryTokens = this.tokenize(query);
|
|
17
|
+
if (queryTokens.length === 0) {
|
|
18
|
+
return memories.slice(0, topK).map((memory) => ({
|
|
19
|
+
memory,
|
|
20
|
+
score: (0, decay_engine_1.computeDecayScore)(memory),
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
// 2. Score each memory
|
|
24
|
+
const scored = memories.map((memory) => {
|
|
25
|
+
const textScore = this.computeTextScore(memory, queryTokens);
|
|
26
|
+
const decayScore = (0, decay_engine_1.computeDecayScore)(memory);
|
|
27
|
+
// Final: (text_score × 0.6) + (decay_score × 0.4)
|
|
28
|
+
const finalScore = textScore * 0.6 + decayScore * 0.4;
|
|
29
|
+
return { memory, score: finalScore };
|
|
30
|
+
});
|
|
31
|
+
// 3. Sort by score descending
|
|
32
|
+
scored.sort((a, b) => b.score - a.score);
|
|
33
|
+
// 4. Return top-K
|
|
34
|
+
return scored.slice(0, topK);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Tokenize a string into lowercase words
|
|
38
|
+
*/
|
|
39
|
+
tokenize(text) {
|
|
40
|
+
return text
|
|
41
|
+
.toLowerCase()
|
|
42
|
+
.replace(/[^\w\s-]/g, ' ')
|
|
43
|
+
.split(/\s+/)
|
|
44
|
+
.filter((token) => token.length > 0);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Compute text match score for a memory (0-1)
|
|
48
|
+
*/
|
|
49
|
+
computeTextScore(memory, queryTokens) {
|
|
50
|
+
let totalScore = 0;
|
|
51
|
+
let totalWeight = 0;
|
|
52
|
+
// Search fields with their weights
|
|
53
|
+
const fields = [
|
|
54
|
+
{ text: memory.name, weight: 1.0 },
|
|
55
|
+
{ text: memory.description, weight: 0.8 },
|
|
56
|
+
{ text: memory.tags.join(' '), weight: 0.9 },
|
|
57
|
+
{ text: memory.content, weight: 0.5 },
|
|
58
|
+
];
|
|
59
|
+
for (const field of fields) {
|
|
60
|
+
const fieldTokens = this.tokenize(field.text);
|
|
61
|
+
const fieldScore = this.computeFieldMatchScore(queryTokens, fieldTokens);
|
|
62
|
+
totalScore += fieldScore * field.weight;
|
|
63
|
+
totalWeight += field.weight;
|
|
64
|
+
}
|
|
65
|
+
return totalWeight > 0 ? totalScore / totalWeight : 0;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Compute match score for query tokens against field tokens (0-1)
|
|
69
|
+
*/
|
|
70
|
+
computeFieldMatchScore(queryTokens, fieldTokens) {
|
|
71
|
+
if (queryTokens.length === 0) {
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
let matchedTokens = 0;
|
|
75
|
+
const fieldTokenSet = new Set(fieldTokens);
|
|
76
|
+
for (const queryToken of queryTokens) {
|
|
77
|
+
// Check for exact match
|
|
78
|
+
if (fieldTokenSet.has(queryToken)) {
|
|
79
|
+
matchedTokens++;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Check for partial match (contains)
|
|
83
|
+
for (const fieldToken of fieldTokens) {
|
|
84
|
+
if (fieldToken.includes(queryToken) || queryToken.includes(fieldToken)) {
|
|
85
|
+
matchedTokens += 0.5; // Partial match gets half credit
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return Math.min(1, matchedTokens / queryTokens.length);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Index is a no-op for text engine - searches live files directly
|
|
94
|
+
*/
|
|
95
|
+
async index(memories, incremental) {
|
|
96
|
+
// No-op - text engine doesn't need indexing
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.TextEngine = TextEngine;
|
|
100
|
+
//# sourceMappingURL=text-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-engine.js","sourceRoot":"","sources":["../../src/engines/text-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code platform install helper
|
|
3
|
+
* Sets autoMemoryDirectory in ~/.claude/settings.json
|
|
4
|
+
*/
|
|
5
|
+
export interface ClaudeCodeSettings {
|
|
6
|
+
autoMemoryDirectory?: string;
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Install memobank for Claude Code
|
|
11
|
+
*/
|
|
12
|
+
export declare function installClaudeCode(repoRoot: string): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/platforms/claude-code.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAUD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkC1E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code platform install helper
|
|
4
|
+
* Sets autoMemoryDirectory in ~/.claude/settings.json
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.installClaudeCode = installClaudeCode;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
/**
|
|
44
|
+
* Get Claude Code settings path
|
|
45
|
+
*/
|
|
46
|
+
function getSettingsPath() {
|
|
47
|
+
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
48
|
+
return path.join(home, '.claude', 'settings.json');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Install memobank for Claude Code
|
|
52
|
+
*/
|
|
53
|
+
async function installClaudeCode(repoRoot) {
|
|
54
|
+
const settingsPath = getSettingsPath();
|
|
55
|
+
const settingsDir = path.dirname(settingsPath);
|
|
56
|
+
// Ensure .claude directory exists
|
|
57
|
+
if (!fs.existsSync(settingsDir)) {
|
|
58
|
+
fs.mkdirSync(settingsDir, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
// Read or create settings
|
|
61
|
+
let settings = {};
|
|
62
|
+
if (fs.existsSync(settingsPath)) {
|
|
63
|
+
try {
|
|
64
|
+
const content = fs.readFileSync(settingsPath, 'utf-8');
|
|
65
|
+
settings = JSON.parse(content);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.warn(`Could not read Claude settings: ${error.message}`);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Set autoMemoryDirectory
|
|
73
|
+
settings.autoMemoryDirectory = path.join(repoRoot, 'memory');
|
|
74
|
+
// Write settings
|
|
75
|
+
try {
|
|
76
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
77
|
+
console.log(`✓ Claude Code: autoMemoryDirectory configured`);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error(`Could not write Claude settings: ${error.message}`);
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/platforms/claude-code.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBH,8CAkCC;AArDD,uCAAyB;AACzB,2CAA6B;AAO7B;;GAEG;AACH,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/C,kCAAkC;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,0BAA0B;IAC1B,IAAI,QAAQ,GAAuB,EAAE,CAAC;IAEtC,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACvD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,QAAQ,CAAC,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE7D,iBAAiB;IACjB,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oCAAqC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/platforms/codex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwCH;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BhE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Codex platform install helper
|
|
4
|
+
* Injects memory protocol into AGENTS.md
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.installCodex = installCodex;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const MEMORY_PROTOCOL_SECTION = `
|
|
44
|
+
## Memory Protocol
|
|
45
|
+
|
|
46
|
+
This project uses memobank for persistent memory. Before starting work, recall relevant context:
|
|
47
|
+
|
|
48
|
+
\`\`\`bash
|
|
49
|
+
memo recall "project context"
|
|
50
|
+
\`\`\`
|
|
51
|
+
|
|
52
|
+
After finishing significant work, capture learnings:
|
|
53
|
+
|
|
54
|
+
\`\`\`bash
|
|
55
|
+
memo capture --auto
|
|
56
|
+
\`\`\`
|
|
57
|
+
|
|
58
|
+
For more information, run: \`memo --help\`
|
|
59
|
+
`;
|
|
60
|
+
/**
|
|
61
|
+
* Find AGENTS.md in current directory or parents
|
|
62
|
+
*/
|
|
63
|
+
function findAgentsMd(startDir) {
|
|
64
|
+
let current = startDir;
|
|
65
|
+
while (current !== path.dirname(current)) {
|
|
66
|
+
const agentsPath = path.join(current, 'AGENTS.md');
|
|
67
|
+
if (fs.existsSync(agentsPath)) {
|
|
68
|
+
return agentsPath;
|
|
69
|
+
}
|
|
70
|
+
current = path.dirname(current);
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Install memobank for Codex
|
|
76
|
+
*/
|
|
77
|
+
async function installCodex(cwd) {
|
|
78
|
+
const agentsPath = findAgentsMd(cwd);
|
|
79
|
+
if (!agentsPath) {
|
|
80
|
+
console.log('⊘ Codex: AGENTS.md not found (skipping)');
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
// Read AGENTS.md
|
|
84
|
+
const content = fs.readFileSync(agentsPath, 'utf-8');
|
|
85
|
+
// Check if memobank is already present
|
|
86
|
+
if (content.includes('## Memory Protocol') && content.includes('memo recall')) {
|
|
87
|
+
console.log('⊘ Codex: Memory protocol already exists in AGENTS.md');
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
// Append memory protocol
|
|
91
|
+
const updated = content + MEMORY_PROTOCOL_SECTION;
|
|
92
|
+
try {
|
|
93
|
+
fs.writeFileSync(agentsPath, updated, 'utf-8');
|
|
94
|
+
console.log(`✓ Codex: Memory protocol added to AGENTS.md`);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error(`Could not write AGENTS.md: ${error.message}`);
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/platforms/codex.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CH,oCA4BC;AArED,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;CAgB/B,CAAC;AAEF;;GAEG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,OAAO,GAAG,QAAQ,CAAC;IAEvB,OAAO,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB;IACjB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAErD,uCAAuC;IACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAG,OAAO,GAAG,uBAAuB,CAAC;IAElD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA+B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|