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.
- package/ARCHITECTURE.md +240 -0
- package/CHANGELOG.md +44 -0
- package/CONTRIBUTING.md +171 -0
- package/LICENSE +22 -0
- package/README.md +203 -0
- package/dist/ast-parser.d.ts +55 -0
- package/dist/ast-parser.d.ts.map +1 -0
- package/dist/ast-parser.js +331 -0
- package/dist/ast-parser.js.map +1 -0
- package/dist/benchmark.d.ts +39 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +195 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/cache.d.ts +45 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +182 -0
- package/dist/cache.js.map +1 -0
- package/dist/chat.d.ts +4 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +132 -0
- package/dist/chat.js.map +1 -0
- package/dist/code-analysis.d.ts +50 -0
- package/dist/code-analysis.d.ts.map +1 -0
- package/dist/code-analysis.js +327 -0
- package/dist/code-analysis.js.map +1 -0
- package/dist/context.d.ts +44 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +187 -0
- package/dist/context.js.map +1 -0
- package/dist/docs.d.ts +21 -0
- package/dist/docs.d.ts.map +1 -0
- package/dist/docs.js +147 -0
- package/dist/docs.js.map +1 -0
- package/dist/edit.d.ts +38 -0
- package/dist/edit.d.ts.map +1 -0
- package/dist/edit.js +594 -0
- package/dist/edit.js.map +1 -0
- package/dist/embed.d.ts +18 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/embed.js +479 -0
- package/dist/embed.js.map +1 -0
- package/dist/error-handler.d.ts +76 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +213 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/formatter.d.ts +25 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +148 -0
- package/dist/formatter.js.map +1 -0
- package/dist/git.d.ts +55 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +198 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +964 -0
- package/dist/index.js.map +1 -0
- package/dist/intelligent-retrieval.d.ts +41 -0
- package/dist/intelligent-retrieval.d.ts.map +1 -0
- package/dist/intelligent-retrieval.js +265 -0
- package/dist/intelligent-retrieval.js.map +1 -0
- package/dist/iterative-refinement.d.ts +31 -0
- package/dist/iterative-refinement.d.ts.map +1 -0
- package/dist/iterative-refinement.js +172 -0
- package/dist/iterative-refinement.js.map +1 -0
- package/dist/learning.d.ts +69 -0
- package/dist/learning.d.ts.map +1 -0
- package/dist/learning.js +233 -0
- package/dist/learning.js.map +1 -0
- package/dist/log.d.ts +4 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +31 -0
- package/dist/log.js.map +1 -0
- package/dist/migrate.d.ts +33 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +133 -0
- package/dist/migrate.js.map +1 -0
- package/dist/monitoring.d.ts +75 -0
- package/dist/monitoring.d.ts.map +1 -0
- package/dist/monitoring.js +248 -0
- package/dist/monitoring.js.map +1 -0
- package/dist/parallel-processor.d.ts +43 -0
- package/dist/parallel-processor.d.ts.map +1 -0
- package/dist/parallel-processor.js +308 -0
- package/dist/parallel-processor.js.map +1 -0
- package/dist/planner.d.ts +47 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +198 -0
- package/dist/planner.js.map +1 -0
- package/dist/policy.d.ts +3 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +26 -0
- package/dist/policy.js.map +1 -0
- package/dist/query-optimizer.d.ts +32 -0
- package/dist/query-optimizer.d.ts.map +1 -0
- package/dist/query-optimizer.js +205 -0
- package/dist/query-optimizer.js.map +1 -0
- package/dist/refactor.d.ts +27 -0
- package/dist/refactor.d.ts.map +1 -0
- package/dist/refactor.js +118 -0
- package/dist/refactor.js.map +1 -0
- package/dist/review.d.ts +31 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +206 -0
- package/dist/review.js.map +1 -0
- package/dist/scaffold.d.ts +14 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +85 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/search.d.ts +19 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +198 -0
- package/dist/search.js.map +1 -0
- package/dist/session.d.ts +17 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +301 -0
- package/dist/session.js.map +1 -0
- package/dist/task-verification.d.ts +39 -0
- package/dist/task-verification.d.ts.map +1 -0
- package/dist/task-verification.js +336 -0
- package/dist/task-verification.js.map +1 -0
- package/dist/test_cohere.d.ts +2 -0
- package/dist/test_cohere.d.ts.map +1 -0
- package/dist/test_cohere.js +68 -0
- package/dist/test_cohere.js.map +1 -0
- package/dist/test_env.d.ts +2 -0
- package/dist/test_env.d.ts.map +1 -0
- package/dist/test_env.js +24 -0
- package/dist/test_env.js.map +1 -0
- package/dist/test_retrieval.d.ts +2 -0
- package/dist/test_retrieval.d.ts.map +1 -0
- package/dist/test_retrieval.js +84 -0
- package/dist/test_retrieval.js.map +1 -0
- package/dist/testgen.d.ts +24 -0
- package/dist/testgen.d.ts.map +1 -0
- package/dist/testgen.js +167 -0
- package/dist/testgen.js.map +1 -0
- package/dist/token-optimizer.d.ts +20 -0
- package/dist/token-optimizer.d.ts.map +1 -0
- package/dist/token-optimizer.js +277 -0
- package/dist/token-optimizer.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui.d.ts +54 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +295 -0
- package/dist/ui.js.map +1 -0
- package/dist/verify_db.d.ts +2 -0
- package/dist/verify_db.d.ts.map +1 -0
- package/dist/verify_db.js +52 -0
- package/dist/verify_db.js.map +1 -0
- package/package.json +71 -0
- package/templates/next-page/app/layout.tsx +19 -0
- package/templates/next-page/app/page.tsx +10 -0
- package/templates/next-page/package.json +22 -0
- package/templates/node-api/index.js +57 -0
- 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":"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"}
|
|
@@ -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"}
|