codehere 0.1.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 (159) hide show
  1. package/ARCHITECTURE.md +240 -0
  2. package/CHANGELOG.md +44 -0
  3. package/CONTRIBUTING.md +171 -0
  4. package/LICENSE +22 -0
  5. package/README.md +203 -0
  6. package/dist/ast-parser.d.ts +55 -0
  7. package/dist/ast-parser.d.ts.map +1 -0
  8. package/dist/ast-parser.js +331 -0
  9. package/dist/ast-parser.js.map +1 -0
  10. package/dist/benchmark.d.ts +39 -0
  11. package/dist/benchmark.d.ts.map +1 -0
  12. package/dist/benchmark.js +195 -0
  13. package/dist/benchmark.js.map +1 -0
  14. package/dist/cache.d.ts +45 -0
  15. package/dist/cache.d.ts.map +1 -0
  16. package/dist/cache.js +182 -0
  17. package/dist/cache.js.map +1 -0
  18. package/dist/chat.d.ts +4 -0
  19. package/dist/chat.d.ts.map +1 -0
  20. package/dist/chat.js +132 -0
  21. package/dist/chat.js.map +1 -0
  22. package/dist/code-analysis.d.ts +50 -0
  23. package/dist/code-analysis.d.ts.map +1 -0
  24. package/dist/code-analysis.js +327 -0
  25. package/dist/code-analysis.js.map +1 -0
  26. package/dist/context.d.ts +44 -0
  27. package/dist/context.d.ts.map +1 -0
  28. package/dist/context.js +187 -0
  29. package/dist/context.js.map +1 -0
  30. package/dist/docs.d.ts +21 -0
  31. package/dist/docs.d.ts.map +1 -0
  32. package/dist/docs.js +147 -0
  33. package/dist/docs.js.map +1 -0
  34. package/dist/edit.d.ts +38 -0
  35. package/dist/edit.d.ts.map +1 -0
  36. package/dist/edit.js +594 -0
  37. package/dist/edit.js.map +1 -0
  38. package/dist/embed.d.ts +18 -0
  39. package/dist/embed.d.ts.map +1 -0
  40. package/dist/embed.js +479 -0
  41. package/dist/embed.js.map +1 -0
  42. package/dist/error-handler.d.ts +76 -0
  43. package/dist/error-handler.d.ts.map +1 -0
  44. package/dist/error-handler.js +213 -0
  45. package/dist/error-handler.js.map +1 -0
  46. package/dist/formatter.d.ts +25 -0
  47. package/dist/formatter.d.ts.map +1 -0
  48. package/dist/formatter.js +148 -0
  49. package/dist/formatter.js.map +1 -0
  50. package/dist/git.d.ts +55 -0
  51. package/dist/git.d.ts.map +1 -0
  52. package/dist/git.js +198 -0
  53. package/dist/git.js.map +1 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +964 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/intelligent-retrieval.d.ts +41 -0
  59. package/dist/intelligent-retrieval.d.ts.map +1 -0
  60. package/dist/intelligent-retrieval.js +265 -0
  61. package/dist/intelligent-retrieval.js.map +1 -0
  62. package/dist/iterative-refinement.d.ts +31 -0
  63. package/dist/iterative-refinement.d.ts.map +1 -0
  64. package/dist/iterative-refinement.js +172 -0
  65. package/dist/iterative-refinement.js.map +1 -0
  66. package/dist/learning.d.ts +69 -0
  67. package/dist/learning.d.ts.map +1 -0
  68. package/dist/learning.js +233 -0
  69. package/dist/learning.js.map +1 -0
  70. package/dist/log.d.ts +4 -0
  71. package/dist/log.d.ts.map +1 -0
  72. package/dist/log.js +31 -0
  73. package/dist/log.js.map +1 -0
  74. package/dist/migrate.d.ts +33 -0
  75. package/dist/migrate.d.ts.map +1 -0
  76. package/dist/migrate.js +133 -0
  77. package/dist/migrate.js.map +1 -0
  78. package/dist/monitoring.d.ts +75 -0
  79. package/dist/monitoring.d.ts.map +1 -0
  80. package/dist/monitoring.js +248 -0
  81. package/dist/monitoring.js.map +1 -0
  82. package/dist/parallel-processor.d.ts +43 -0
  83. package/dist/parallel-processor.d.ts.map +1 -0
  84. package/dist/parallel-processor.js +308 -0
  85. package/dist/parallel-processor.js.map +1 -0
  86. package/dist/planner.d.ts +47 -0
  87. package/dist/planner.d.ts.map +1 -0
  88. package/dist/planner.js +198 -0
  89. package/dist/planner.js.map +1 -0
  90. package/dist/policy.d.ts +3 -0
  91. package/dist/policy.d.ts.map +1 -0
  92. package/dist/policy.js +26 -0
  93. package/dist/policy.js.map +1 -0
  94. package/dist/query-optimizer.d.ts +32 -0
  95. package/dist/query-optimizer.d.ts.map +1 -0
  96. package/dist/query-optimizer.js +205 -0
  97. package/dist/query-optimizer.js.map +1 -0
  98. package/dist/refactor.d.ts +27 -0
  99. package/dist/refactor.d.ts.map +1 -0
  100. package/dist/refactor.js +118 -0
  101. package/dist/refactor.js.map +1 -0
  102. package/dist/review.d.ts +31 -0
  103. package/dist/review.d.ts.map +1 -0
  104. package/dist/review.js +206 -0
  105. package/dist/review.js.map +1 -0
  106. package/dist/scaffold.d.ts +14 -0
  107. package/dist/scaffold.d.ts.map +1 -0
  108. package/dist/scaffold.js +85 -0
  109. package/dist/scaffold.js.map +1 -0
  110. package/dist/search.d.ts +19 -0
  111. package/dist/search.d.ts.map +1 -0
  112. package/dist/search.js +198 -0
  113. package/dist/search.js.map +1 -0
  114. package/dist/session.d.ts +17 -0
  115. package/dist/session.d.ts.map +1 -0
  116. package/dist/session.js +301 -0
  117. package/dist/session.js.map +1 -0
  118. package/dist/task-verification.d.ts +39 -0
  119. package/dist/task-verification.d.ts.map +1 -0
  120. package/dist/task-verification.js +336 -0
  121. package/dist/task-verification.js.map +1 -0
  122. package/dist/test_cohere.d.ts +2 -0
  123. package/dist/test_cohere.d.ts.map +1 -0
  124. package/dist/test_cohere.js +68 -0
  125. package/dist/test_cohere.js.map +1 -0
  126. package/dist/test_env.d.ts +2 -0
  127. package/dist/test_env.d.ts.map +1 -0
  128. package/dist/test_env.js +24 -0
  129. package/dist/test_env.js.map +1 -0
  130. package/dist/test_retrieval.d.ts +2 -0
  131. package/dist/test_retrieval.d.ts.map +1 -0
  132. package/dist/test_retrieval.js +84 -0
  133. package/dist/test_retrieval.js.map +1 -0
  134. package/dist/testgen.d.ts +24 -0
  135. package/dist/testgen.d.ts.map +1 -0
  136. package/dist/testgen.js +167 -0
  137. package/dist/testgen.js.map +1 -0
  138. package/dist/token-optimizer.d.ts +20 -0
  139. package/dist/token-optimizer.d.ts.map +1 -0
  140. package/dist/token-optimizer.js +277 -0
  141. package/dist/token-optimizer.js.map +1 -0
  142. package/dist/types.d.ts +36 -0
  143. package/dist/types.d.ts.map +1 -0
  144. package/dist/types.js +2 -0
  145. package/dist/types.js.map +1 -0
  146. package/dist/ui.d.ts +54 -0
  147. package/dist/ui.d.ts.map +1 -0
  148. package/dist/ui.js +295 -0
  149. package/dist/ui.js.map +1 -0
  150. package/dist/verify_db.d.ts +2 -0
  151. package/dist/verify_db.d.ts.map +1 -0
  152. package/dist/verify_db.js +52 -0
  153. package/dist/verify_db.js.map +1 -0
  154. package/package.json +71 -0
  155. package/templates/next-page/app/layout.tsx +19 -0
  156. package/templates/next-page/app/page.tsx +10 -0
  157. package/templates/next-page/package.json +22 -0
  158. package/templates/node-api/index.js +57 -0
  159. package/templates/node-api/package.json +13 -0
package/dist/embed.js ADDED
@@ -0,0 +1,479 @@
1
+ import { readFileSync, readdirSync, statSync, existsSync, writeFileSync } from 'fs';
2
+ import { createHash } from 'crypto';
3
+ import { join, relative, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { config } from 'dotenv';
6
+ import { CohereClient } from 'cohere-ai';
7
+ import initSqlJs from 'sql.js';
8
+ import { encoding_for_model } from 'tiktoken';
9
+ import { indexParallel } from './parallel-processor.js';
10
+ import { colors, createProgressBar, createTable, success, warning, info, formatPath, formatNumber, sectionHeader, newline, statusIndicator, } from './ui.js';
11
+ // Load .env from agent directory
12
+ try {
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ const agentDir = join(__dirname, '..');
16
+ config({ path: join(agentDir, '.env') });
17
+ }
18
+ catch {
19
+ // Fallback
20
+ }
21
+ config(); // Also try current directory
22
+ const cohere = new CohereClient({
23
+ token: process.env.COHERE_API_KEY || '',
24
+ });
25
+ // DB path: use agent/data if in agent directory, otherwise use current directory
26
+ function getDbPath() {
27
+ const __filename = fileURLToPath(import.meta.url);
28
+ const __dirname = dirname(__filename);
29
+ const agentDir = join(__dirname, '..');
30
+ // Check if we're in the agent directory structure
31
+ if (existsSync(join(agentDir, 'package.json'))) {
32
+ return join(agentDir, 'data', 'embeddings.sqlite');
33
+ }
34
+ // Otherwise use current directory
35
+ return join(process.cwd(), 'agent', 'data', 'embeddings.sqlite');
36
+ }
37
+ const DB_PATH = getDbPath();
38
+ const CHUNK_SIZE = 300; // target tokens per chunk
39
+ const OVERLAP = 50; // overlap tokens between chunks
40
+ const enc = encoding_for_model('gpt-3.5-turbo');
41
+ function shouldIgnorePath(filepath) {
42
+ const ignorePatterns = [
43
+ 'node_modules',
44
+ '.git',
45
+ 'dist',
46
+ 'build',
47
+ '.next',
48
+ 'coverage',
49
+ '.env',
50
+ 'embeddings.sqlite',
51
+ 'logs.jsonl',
52
+ 'agent/data',
53
+ 'agent/dist',
54
+ 'agent/node_modules',
55
+ ];
56
+ return ignorePatterns.some(pattern => filepath.includes(pattern));
57
+ }
58
+ function getAllFiles(dir, baseDir = dir) {
59
+ const files = [];
60
+ try {
61
+ const entries = readdirSync(dir);
62
+ for (const entry of entries) {
63
+ const fullPath = join(dir, entry);
64
+ const relPath = relative(baseDir, fullPath);
65
+ if (shouldIgnorePath(relPath)) {
66
+ continue;
67
+ }
68
+ const stat = statSync(fullPath);
69
+ if (stat.isDirectory()) {
70
+ files.push(...getAllFiles(fullPath, baseDir));
71
+ }
72
+ else if (stat.isFile()) {
73
+ // Only process text files
74
+ const ext = entry.split('.').pop()?.toLowerCase();
75
+ const textExtensions = [
76
+ 'ts', 'tsx', 'js', 'jsx', 'json', 'md', 'txt', 'py', 'java', 'cpp', 'c', 'h',
77
+ 'go', 'rs', 'rb', 'php', 'html', 'css', 'scss', 'sql', 'sh', 'yaml', 'yml',
78
+ 'xml', 'toml', 'ini', 'conf', 'config'
79
+ ];
80
+ if (ext && textExtensions.includes(ext)) {
81
+ files.push(fullPath);
82
+ }
83
+ }
84
+ }
85
+ }
86
+ catch (error) {
87
+ // Skip directories we can't read
88
+ }
89
+ return files;
90
+ }
91
+ function chunkText(text, targetTokens, overlap) {
92
+ const tokens = enc.encode(text);
93
+ const chunks = [];
94
+ if (tokens.length <= targetTokens) {
95
+ return [text];
96
+ }
97
+ let start = 0;
98
+ while (start < tokens.length) {
99
+ const end = Math.min(start + targetTokens, tokens.length);
100
+ const chunkTokens = tokens.slice(start, end);
101
+ const decoded = enc.decode(chunkTokens);
102
+ // Handle both string and Uint8Array return types
103
+ const chunkText = typeof decoded === 'string' ? decoded : new TextDecoder().decode(decoded);
104
+ chunks.push(chunkText);
105
+ if (end >= tokens.length)
106
+ break;
107
+ start = end - overlap;
108
+ }
109
+ return chunks;
110
+ }
111
+ async function embedText(text, retries = 3) {
112
+ for (let attempt = 0; attempt < retries; attempt++) {
113
+ try {
114
+ const response = await cohere.embed({
115
+ texts: [text],
116
+ model: 'embed-english-v3.0',
117
+ inputType: 'search_document',
118
+ });
119
+ const embeddings = Array.isArray(response.embeddings)
120
+ ? response.embeddings
121
+ : response.embeddings.embeddings || [];
122
+ return embeddings[0] || [];
123
+ }
124
+ catch (error) {
125
+ const isRateLimit = error?.status === 429 || error?.message?.includes('429') || error?.message?.includes('rate limit');
126
+ if (isRateLimit && attempt < retries - 1) {
127
+ // Exponential backoff: wait 2^attempt seconds, with a max of 60 seconds
128
+ const waitTime = Math.min(Math.pow(2, attempt) * 1000, 60000);
129
+ console.log(warning(`Rate limited, waiting ${waitTime / 1000}s before retry ${attempt + 1}/${retries}...`));
130
+ await new Promise(resolve => setTimeout(resolve, waitTime));
131
+ continue;
132
+ }
133
+ throw new Error(`Embedding error: ${error instanceof Error ? error.message : String(error)}`);
134
+ }
135
+ }
136
+ throw new Error('Embedding failed after retries');
137
+ }
138
+ function cosineSimilarity(a, b) {
139
+ if (a.length !== b.length)
140
+ return 0;
141
+ let dotProduct = 0;
142
+ let normA = 0;
143
+ let normB = 0;
144
+ for (let i = 0; i < a.length; i++) {
145
+ dotProduct += a[i] * b[i];
146
+ normA += a[i] * a[i];
147
+ normB += b[i] * b[i];
148
+ }
149
+ return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
150
+ }
151
+ export async function indexRepository(repoPath = process.cwd()) {
152
+ sectionHeader('Scanning Repository');
153
+ const files = getAllFiles(repoPath, repoPath);
154
+ console.log(info(`Found ${formatNumber(files.length)} files to index`));
155
+ newline();
156
+ // Initialize SQL.js
157
+ const SQL = await initSqlJs();
158
+ let db;
159
+ // Load existing database or create new one
160
+ if (existsSync(DB_PATH)) {
161
+ const buffer = readFileSync(DB_PATH);
162
+ db = new SQL.Database(buffer);
163
+ }
164
+ else {
165
+ db = new SQL.Database();
166
+ }
167
+ // Create tables
168
+ db.run(`
169
+ CREATE TABLE IF NOT EXISTS embeddings (
170
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
171
+ filepath TEXT NOT NULL,
172
+ chunkIndex INTEGER NOT NULL,
173
+ content TEXT NOT NULL,
174
+ embedding TEXT NOT NULL
175
+ )
176
+ `);
177
+ db.run(`
178
+ CREATE TABLE IF NOT EXISTS file_metadata (
179
+ filepath TEXT PRIMARY KEY,
180
+ mtime INTEGER NOT NULL,
181
+ hash TEXT NOT NULL
182
+ )
183
+ `);
184
+ db.run(`
185
+ CREATE INDEX IF NOT EXISTS idx_filepath ON embeddings(filepath)
186
+ `);
187
+ // Get existing file metadata
188
+ const existingFiles = new Map();
189
+ try {
190
+ const metadataStmt = db.prepare('SELECT filepath, mtime, hash FROM file_metadata');
191
+ while (metadataStmt.step()) {
192
+ const row = metadataStmt.getAsObject();
193
+ existingFiles.set(row.filepath, {
194
+ mtime: row.mtime,
195
+ hash: row.hash,
196
+ });
197
+ }
198
+ metadataStmt.free();
199
+ }
200
+ catch {
201
+ // Table might not exist yet, that's okay
202
+ }
203
+ // Determine which files need indexing
204
+ const filesToIndex = [];
205
+ const filesToRemove = [];
206
+ const unchangedCount = { count: 0 };
207
+ for (const filepath of files) {
208
+ const relPath = relative(repoPath, filepath);
209
+ const existing = existingFiles.get(relPath);
210
+ if (!existsSync(filepath)) {
211
+ // File was deleted
212
+ filesToRemove.push(relPath);
213
+ continue;
214
+ }
215
+ try {
216
+ const stats = statSync(filepath);
217
+ const content = readFileSync(filepath, 'utf-8');
218
+ const hash = createHash('md5').update(content).digest('hex');
219
+ if (existing && existing.mtime === stats.mtime.getTime() && existing.hash === hash) {
220
+ // File unchanged
221
+ unchangedCount.count++;
222
+ continue;
223
+ }
224
+ // File changed or new
225
+ filesToIndex.push(filepath);
226
+ }
227
+ catch {
228
+ // Skip files we can't read
229
+ continue;
230
+ }
231
+ }
232
+ // Remove deleted files from embeddings
233
+ if (filesToRemove.length > 0) {
234
+ const deleteStmt = db.prepare('DELETE FROM embeddings WHERE filepath = ?');
235
+ const deleteMetaStmt = db.prepare('DELETE FROM file_metadata WHERE filepath = ?');
236
+ for (const relPath of filesToRemove) {
237
+ deleteStmt.run([relPath]);
238
+ deleteMetaStmt.run([relPath]);
239
+ }
240
+ deleteStmt.free();
241
+ deleteMetaStmt.free();
242
+ }
243
+ // Remove old embeddings for files that changed
244
+ if (filesToIndex.length > 0) {
245
+ const deleteStmt = db.prepare('DELETE FROM embeddings WHERE filepath = ?');
246
+ const deleteMetaStmt = db.prepare('DELETE FROM file_metadata WHERE filepath = ?');
247
+ for (const filepath of filesToIndex) {
248
+ const relPath = relative(repoPath, filepath);
249
+ deleteStmt.run([relPath]);
250
+ deleteMetaStmt.run([relPath]);
251
+ }
252
+ deleteStmt.free();
253
+ deleteMetaStmt.free();
254
+ }
255
+ const insertStmt = db.prepare(`
256
+ INSERT INTO embeddings (filepath, chunkIndex, content, embedding)
257
+ VALUES (?, ?, ?, ?)
258
+ `);
259
+ const insertMetaStmt = db.prepare(`
260
+ INSERT OR REPLACE INTO file_metadata (filepath, mtime, hash)
261
+ VALUES (?, ?, ?)
262
+ `);
263
+ let totalChunks = 0;
264
+ const fileResults = [];
265
+ // Show summary
266
+ newline();
267
+ sectionHeader('Indexing Summary');
268
+ console.log(info(`New files: ${formatNumber(filesToIndex.length)}`));
269
+ console.log(info(`Unchanged: ${formatNumber(unchangedCount.count)}`));
270
+ console.log(info(`Deleted: ${formatNumber(filesToRemove.length)}`));
271
+ newline();
272
+ if (filesToIndex.length === 0) {
273
+ console.log(success('All files are up to date!'));
274
+ db.close();
275
+ return;
276
+ }
277
+ // Create progress bar
278
+ const progressBar = createProgressBar(filesToIndex.length, colors.dim('Processing') + ' |{bar}| ' + colors.cyan('{percentage}%') + ' | {value}/{total}');
279
+ sectionHeader('Processing Files');
280
+ for (let i = 0; i < filesToIndex.length; i++) {
281
+ const filepath = filesToIndex[i];
282
+ const relPath = relative(repoPath, filepath);
283
+ try {
284
+ const content = readFileSync(filepath, 'utf-8');
285
+ const chunks = chunkText(content, CHUNK_SIZE, OVERLAP);
286
+ let fileChunks = 0;
287
+ let fileErrors = 0;
288
+ for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) {
289
+ const chunk = chunks[chunkIdx];
290
+ try {
291
+ const embedding = await embedText(chunk);
292
+ insertStmt.run([
293
+ relPath,
294
+ chunkIdx,
295
+ chunk,
296
+ JSON.stringify(embedding),
297
+ ]);
298
+ fileChunks++;
299
+ // Rate limiting: delay between chunks to stay under 40/min limit
300
+ // 40 calls/min = 1.5s per call, use 2s to be safe
301
+ await new Promise(resolve => setTimeout(resolve, 2000));
302
+ }
303
+ catch (err) {
304
+ fileErrors++;
305
+ // Continue with next chunk instead of failing entire file
306
+ }
307
+ }
308
+ totalChunks += fileChunks;
309
+ // Save file metadata
310
+ try {
311
+ const stats = statSync(filepath);
312
+ const content = readFileSync(filepath, 'utf-8');
313
+ const hash = createHash('md5').update(content).digest('hex');
314
+ insertMetaStmt.run([relPath, stats.mtime.getTime(), hash]);
315
+ }
316
+ catch {
317
+ // Skip metadata if we can't read file
318
+ }
319
+ if (fileErrors === 0) {
320
+ fileResults.push({
321
+ file: relPath,
322
+ chunks: fileChunks,
323
+ status: statusIndicator('success') + ' Done',
324
+ });
325
+ }
326
+ else {
327
+ fileResults.push({
328
+ file: relPath,
329
+ chunks: fileChunks,
330
+ status: statusIndicator('warning') + ` Done (${fileErrors} errors)`,
331
+ });
332
+ }
333
+ progressBar.update(i + 1);
334
+ }
335
+ catch (err) {
336
+ fileResults.push({
337
+ file: relPath,
338
+ chunks: 0,
339
+ status: statusIndicator('error') + ' Failed',
340
+ });
341
+ progressBar.update(i + 1);
342
+ }
343
+ }
344
+ progressBar.stop();
345
+ insertStmt.free();
346
+ // Save database to file
347
+ const data = db.export();
348
+ const buffer = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
349
+ writeFileSync(DB_PATH, buffer);
350
+ db.close();
351
+ newline();
352
+ sectionHeader('Indexing Results');
353
+ // Display file results table
354
+ const fileTable = createTable(['File', 'Chunks', 'Status'], fileResults.map(r => [
355
+ formatPath(r.file),
356
+ formatNumber(r.chunks),
357
+ r.status,
358
+ ]));
359
+ console.log(fileTable.toString());
360
+ newline();
361
+ // Summary
362
+ const successful = fileResults.filter(r => r.status.includes('Done')).length;
363
+ const failed = fileResults.filter(r => r.status.includes('Failed')).length;
364
+ sectionHeader('Summary');
365
+ console.log(createTable(['Metric', 'Value'], [
366
+ ['Total Files', formatNumber(files.length)],
367
+ ['Successful', statusIndicator('success') + ' ' + formatNumber(successful)],
368
+ ['Failed', failed > 0 ? statusIndicator('error') + ' ' + formatNumber(failed) : statusIndicator('success') + ' 0'],
369
+ ['Total Chunks', formatNumber(totalChunks)],
370
+ ['Database Size', colors.cyan(`${(buffer.length / 1024 / 1024).toFixed(2)} MB`)],
371
+ ]).toString());
372
+ newline();
373
+ console.log(success(`Indexing complete: ${formatNumber(totalChunks)} chunks indexed`));
374
+ }
375
+ /**
376
+ * NEW: Parallel indexing with caching
377
+ */
378
+ export async function indexRepositoryParallel(repoPath, options = {}) {
379
+ const targetDir = repoPath || process.cwd();
380
+ // Find all code files
381
+ const files = getAllFiles(targetDir, targetDir);
382
+ if (files.length === 0) {
383
+ console.log(warning('No code files found to index.'));
384
+ return {
385
+ indexed: 0,
386
+ cached: 0,
387
+ totalChunks: 0,
388
+ timeMs: 0,
389
+ };
390
+ }
391
+ console.log(info(`Found ${formatNumber(files.length)} files to index`));
392
+ console.log(info('Using parallel processing with caching...'));
393
+ newline();
394
+ // Use parallel processor
395
+ const result = await indexParallel(files, {
396
+ maxConcurrency: options.maxConcurrency || 5,
397
+ useCache: options.useCache !== false,
398
+ cacheDir: join(targetDir, '.codehere-cache'),
399
+ });
400
+ console.log(success(`Parallel indexing complete:`));
401
+ console.log(` • Indexed: ${formatNumber(result.indexed)} files`);
402
+ console.log(` • Cached: ${formatNumber(result.cached)} files`);
403
+ console.log(` • Total chunks: ${formatNumber(result.totalChunks)}`);
404
+ console.log(` • Time: ${formatNumber(result.timeMs / 1000)}s`);
405
+ return result;
406
+ }
407
+ /**
408
+ * Update embeddings for a single file (after edit)
409
+ */
410
+ export async function updateFileEmbeddings(filepath) {
411
+ const fullPath = join(process.cwd(), filepath);
412
+ if (!existsSync(fullPath)) {
413
+ return; // File doesn't exist, skip
414
+ }
415
+ try {
416
+ const content = readFileSync(fullPath, 'utf-8');
417
+ const chunks = chunkText(content, CHUNK_SIZE, OVERLAP);
418
+ // Load database
419
+ const SQL = await initSqlJs();
420
+ let db;
421
+ if (existsSync(DB_PATH)) {
422
+ const buffer = readFileSync(DB_PATH);
423
+ db = new SQL.Database(buffer);
424
+ }
425
+ else {
426
+ db = new SQL.Database();
427
+ db.run(`
428
+ CREATE TABLE IF NOT EXISTS embeddings (
429
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
430
+ filepath TEXT NOT NULL,
431
+ chunkIndex INTEGER NOT NULL,
432
+ content TEXT NOT NULL,
433
+ embedding TEXT NOT NULL
434
+ )
435
+ `);
436
+ db.run(`CREATE INDEX IF NOT EXISTS idx_filepath ON embeddings(filepath)`);
437
+ }
438
+ // Delete old embeddings for this file
439
+ const deleteStmt = db.prepare('DELETE FROM embeddings WHERE filepath = ?');
440
+ deleteStmt.run([filepath]);
441
+ deleteStmt.free();
442
+ // Insert new embeddings
443
+ const insertStmt = db.prepare(`
444
+ INSERT INTO embeddings (filepath, chunkIndex, content, embedding)
445
+ VALUES (?, ?, ?, ?)
446
+ `);
447
+ for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) {
448
+ const chunk = chunks[chunkIdx];
449
+ try {
450
+ const embedding = await embedText(chunk);
451
+ insertStmt.run([
452
+ filepath,
453
+ chunkIdx,
454
+ chunk,
455
+ JSON.stringify(embedding),
456
+ ]);
457
+ // Rate limiting
458
+ if (chunkIdx < chunks.length - 1) {
459
+ await new Promise(resolve => setTimeout(resolve, 2000));
460
+ }
461
+ }
462
+ catch (err) {
463
+ // Skip failed chunks
464
+ continue;
465
+ }
466
+ }
467
+ insertStmt.free();
468
+ // Save database
469
+ const data = db.export();
470
+ const buffer = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
471
+ writeFileSync(DB_PATH, buffer);
472
+ db.close();
473
+ }
474
+ catch (error) {
475
+ // Silently fail - embedding update is optional
476
+ console.warn(`Failed to update embeddings for ${filepath}: ${error instanceof Error ? error.message : String(error)}`);
477
+ }
478
+ }
479
+ //# sourceMappingURL=embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,SAAuB,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EACL,MAAM,EAEN,iBAAiB,EACjB,WAAW,EACX,OAAO,EAEP,OAAO,EACP,IAAI,EACJ,UAAU,EACV,YAAY,EAEZ,aAAa,EACb,OAAO,EACP,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,iCAAiC;AACjC,IAAI,CAAC;IACH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAAC,MAAM,CAAC;IACP,WAAW;AACb,CAAC;AACD,MAAM,EAAE,CAAC,CAAC,6BAA6B;AAEvC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;CACxC,CAAC,CAAC;AAEH,iFAAiF;AACjF,SAAS,SAAS;IAChB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvC,kDAAkD;IAClD,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACrD,CAAC;IACD,kCAAkC;IAClC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;AAC5B,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,0BAA0B;AAClD,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,gCAAgC;AAEpD,MAAM,GAAG,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;AAEhD,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,cAAc,GAAG;QACrB,cAAc;QACd,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO;QACP,UAAU;QACV,MAAM;QACN,mBAAmB;QACnB,YAAY;QACZ,YAAY;QACZ,YAAY;QACZ,oBAAoB;KACrB,CAAC;IAEF,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,UAAkB,GAAG;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAE5C,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzB,0BAA0B;gBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;gBAClD,MAAM,cAAc,GAAG;oBACrB,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG;oBAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK;oBAC1E,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ;iBACvC,CAAC;gBAEF,IAAI,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iCAAiC;IACnC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,YAAoB,EAAE,OAAe;IACpE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,MAAM,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACxC,iDAAiD;QACjD,MAAM,SAAS,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5F,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEvB,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM;YAAE,MAAM;QAChC,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,UAAkB,CAAC;IACxD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;gBAClC,KAAK,EAAE,CAAC,IAAI,CAAC;gBACb,KAAK,EAAE,oBAAoB;gBAC3B,SAAS,EAAE,iBAAiB;aAC7B,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBACnD,CAAC,CAAC,QAAQ,CAAC,UAAU;gBACrB,CAAC,CAAE,QAAQ,CAAC,UAAkB,CAAC,UAAU,IAAI,EAAE,CAAC;YAElD,OAAQ,UAAU,CAAC,CAAC,CAAc,IAAI,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;YAEvH,IAAI,WAAW,IAAI,OAAO,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;gBACzC,wEAAwE;gBACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,yBAAyB,QAAQ,GAAC,IAAI,kBAAkB,OAAO,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC;gBAC1G,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC5D,SAAS;YACX,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAW,EAAE,CAAW;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAEpC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IACpE,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACxE,OAAO,EAAE,CAAC;IAEV,oBAAoB;IACpB,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,IAAI,EAAY,CAAC;IAEjB,2CAA2C;IAC3C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,gBAAgB;IAChB,EAAE,CAAC,GAAG,CAAC;;;;;;;;GAQN,CAAC,CAAC;IAEH,EAAE,CAAC,GAAG,CAAC;;;;;;GAMN,CAAC,CAAC;IAEH,EAAE,CAAC,GAAG,CAAC;;GAEN,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,aAAa,GAAG,IAAI,GAAG,EAA2C,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC;QACnF,OAAO,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAS,CAAC;YAC9C,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,QAAkB,EAAE;gBACxC,KAAK,EAAE,GAAG,CAAC,KAAe;gBAC1B,IAAI,EAAE,GAAG,CAAC,IAAc;aACzB,CAAC,CAAC;QACL,CAAC;QACD,YAAY,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,sCAAsC;IACtC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAEpC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,mBAAmB;YACnB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE7D,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnF,iBAAiB;gBACjB,cAAc,CAAC,KAAK,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,sBAAsB;YACtB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;YAC3B,SAAS;QACX,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;QAC3E,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;QAClF,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YACpC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1B,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,CAAC;QAClB,cAAc,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,+CAA+C;IAC/C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;QAC3E,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;QAClF,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC7C,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1B,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,CAAC;QAClB,cAAc,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAG7B,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGjC,CAAC,CAAC;IAEH,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,WAAW,GAA0D,EAAE,CAAC;IAE9E,eAAe;IACf,OAAO,EAAE,CAAC;IACV,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,OAAO,EAAE,CAAC;IAEV,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAClD,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,MAAM,WAAW,GAAG,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAEzJ,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAEvD,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,UAAU,GAAG,CAAC,CAAC;YAEnB,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;gBAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAE/B,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;oBAEzC,UAAU,CAAC,GAAG,CAAC;wBACb,OAAO;wBACP,QAAQ;wBACR,KAAK;wBACL,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;qBAC1B,CAAC,CAAC;oBAEH,UAAU,EAAE,CAAC;oBAEb,iEAAiE;oBACjE,kDAAkD;oBAClD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,UAAU,EAAE,CAAC;oBACb,0DAA0D;gBAC5D,CAAC;YACH,CAAC;YAED,WAAW,IAAI,UAAU,CAAC;YAE1B,qBAAqB;YACrB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACjC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7D,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;YAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,OAAO;iBAC7C,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,UAAU,UAAU,UAAU;iBACpE,CAAC,CAAC;YACL,CAAC;YAED,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,CAAC;gBACT,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS;aAC7C,CAAC,CAAC;YACH,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,WAAW,CAAC,IAAI,EAAE,CAAC;IACnB,UAAU,CAAC,IAAI,EAAE,CAAC;IAElB,wBAAwB;IACxB,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1E,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE/B,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,OAAO,EAAE,CAAC;IACV,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAElC,6BAA6B;IAC7B,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC5B,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;QAClB,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;QACtB,CAAC,CAAC,MAAM;KACT,CAAC,CACH,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAElC,OAAO,EAAE,CAAC;IAEV,UAAU;IACV,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7E,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3E,aAAa,CAAC,SAAS,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,WAAW,CACrB,CAAC,QAAQ,EAAE,OAAO,CAAC,EACnB;QACE,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAC3E,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAClH,CAAC,cAAc,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;KACjF,CACF,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEd,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,YAAY,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACzF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAiB,EACjB,UAGI,EAAE;IAON,MAAM,SAAS,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE5C,sBAAsB;IACtB,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEhD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACtD,OAAO;YACL,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,CAAC;SACV,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IAC/D,OAAO,EAAE,CAAC;IAEV,yBAAyB;IACzB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE;QACxC,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC;QAC3C,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,KAAK;QACpC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;KAC7C,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,qBAAqB,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,aAAa,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,2BAA2B;IACrC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAEvD,gBAAgB;QAChB,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,IAAI,EAAY,CAAC;QAEjB,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACrC,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACxB,EAAE,CAAC,GAAG,CAAC;;;;;;;;OAQN,CAAC,CAAC;YACH,EAAE,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC5E,CAAC;QAED,sCAAsC;QACtC,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;QAC3E,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3B,UAAU,CAAC,IAAI,EAAE,CAAC;QAElB,wBAAwB;QACxB,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC;QAEH,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;YAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;gBACzC,UAAU,CAAC,GAAG,CAAC;oBACb,QAAQ;oBACR,QAAQ;oBACR,KAAK;oBACL,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;iBAC1B,CAAC,CAAC;gBAEH,gBAAgB;gBAChB,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAqB;gBACrB,SAAS;YACX,CAAC;QACH,CAAC;QAED,UAAU,CAAC,IAAI,EAAE,CAAC;QAElB,gBAAgB;QAChB,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1E,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+CAA+C;QAC/C,OAAO,CAAC,IAAI,CAAC,mCAAmC,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzH,CAAC;AACH,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Enterprise-Grade Error Handling & Recovery System
3
+ * Ensures 24/7 operation with automatic recovery
4
+ */
5
+ export declare enum ErrorType {
6
+ RETRYABLE = "RETRYABLE",
7
+ FATAL = "FATAL",
8
+ RATE_LIMIT = "RATE_LIMIT",
9
+ NETWORK = "NETWORK",
10
+ API_ERROR = "API_ERROR",
11
+ VALIDATION = "VALIDATION",
12
+ POLICY = "POLICY"
13
+ }
14
+ export interface ErrorContext {
15
+ operation: string;
16
+ filepath?: string;
17
+ attempt?: number;
18
+ maxRetries?: number;
19
+ timestamp: string;
20
+ errorType: ErrorType;
21
+ originalError: Error;
22
+ metadata?: Record<string, any>;
23
+ }
24
+ export declare class EnterpriseError extends Error {
25
+ errorType: ErrorType;
26
+ context: ErrorContext;
27
+ retryable: boolean;
28
+ constructor(message: string, errorType: ErrorType, context: ErrorContext, retryable?: boolean);
29
+ }
30
+ /**
31
+ * Classify error type for appropriate handling
32
+ */
33
+ export declare function classifyError(error: unknown): ErrorType;
34
+ /**
35
+ * Check if error is retryable
36
+ */
37
+ export declare function isRetryable(error: unknown): boolean;
38
+ /**
39
+ * Calculate exponential backoff delay
40
+ */
41
+ export declare function calculateBackoff(attempt: number, baseDelay?: number, maxDelay?: number): number;
42
+ /**
43
+ * Retry with exponential backoff
44
+ */
45
+ export declare function retryWithBackoff<T>(operation: () => Promise<T>, options?: {
46
+ maxRetries?: number;
47
+ baseDelay?: number;
48
+ maxDelay?: number;
49
+ operationName?: string;
50
+ onRetry?: (attempt: number, error: unknown) => void;
51
+ }): Promise<T>;
52
+ /**
53
+ * Circuit breaker pattern for API calls
54
+ */
55
+ export declare class CircuitBreaker {
56
+ private threshold;
57
+ private timeout;
58
+ private resetTimeout;
59
+ private failures;
60
+ private lastFailureTime;
61
+ private state;
62
+ constructor(threshold?: number, timeout?: number, // 1 minute
63
+ resetTimeout?: number);
64
+ execute<T>(operation: () => Promise<T>): Promise<T>;
65
+ getState(): 'CLOSED' | 'OPEN' | 'HALF_OPEN';
66
+ reset(): void;
67
+ }
68
+ /**
69
+ * Global circuit breaker for Cohere API
70
+ */
71
+ export declare const cohereCircuitBreaker: CircuitBreaker;
72
+ /**
73
+ * Graceful error handler with recovery strategies
74
+ */
75
+ export declare function handleError(error: unknown, context: Partial<ErrorContext>): never;
76
+ //# sourceMappingURL=error-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oBAAY,SAAS;IACnB,SAAS,cAAc;IACvB,KAAK,UAAU;IACf,UAAU,eAAe;IACzB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAG/B,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE,OAAO;gBAHzB,OAAO,EAAE,MAAM,EACR,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,YAAY,EACrB,SAAS,GAAE,OAAe;CAKpC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CA8BvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,EAAE,QAAQ,GAAE,MAAc,GAAG,MAAM,CAK5G;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAChD,GACL,OAAO,CAAC,CAAC,CAAC,CAgEZ;AAED;;GAEG;AACH,qBAAa,cAAc;IAMvB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,YAAY;IAPtB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,KAAK,CAA6C;gBAGhD,SAAS,GAAE,MAAU,EACrB,OAAO,GAAE,MAAc,EAAE,WAAW;IACpC,YAAY,GAAE,MAAc;IAGhC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA8CzD,QAAQ,IAAI,QAAQ,GAAG,MAAM,GAAG,WAAW;IAI3C,KAAK,IAAI,IAAI;CAKd;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,gBAAsC,CAAC;AAExE;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK,CAuBjF"}