@vybestack/llxprt-code-core 0.1.16 → 0.1.17
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/dist/src/config/config.js +19 -9
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +63 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +6 -1
- package/dist/src/core/coreToolScheduler.js +96 -61
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +142 -0
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +9 -0
- package/dist/src/core/geminiChat.js +121 -1
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +1 -0
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/ide/detect-ide.js +6 -3
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/ide-installer.d.ts +0 -1
- package/dist/src/ide/ide-installer.js +5 -7
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/ide-installer.test.js +1 -24
- package/dist/src/ide/ide-installer.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.js +12 -4
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/providers/integration/multi-provider.integration.test.js +1 -1
- package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +1 -1
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +1 -1
- package/dist/src/tools/glob.js +9 -1
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +1 -0
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.js +49 -10
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +3 -0
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.js +9 -1
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +1 -0
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +1 -1
- package/dist/src/tools/mcp-client.js +53 -25
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/read-many-files.js +135 -3
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +280 -0
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.js +11 -2
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.multibyte.test.js +1 -0
- package/dist/src/tools/shell.multibyte.test.js.map +1 -1
- package/dist/src/tools/shell.test.js +3 -0
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +5 -0
- package/dist/src/tools/tool-registry.js +24 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +49 -0
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/types/modelParams.d.ts +12 -0
- package/dist/src/utils/paths.d.ts +11 -2
- package/dist/src/utils/paths.js +24 -7
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.d.ts +6 -0
- package/dist/src/utils/paths.test.js +153 -0
- package/dist/src/utils/paths.test.js.map +1 -0
- package/dist/src/utils/toolOutputLimiter.d.ts +34 -0
- package/dist/src/utils/toolOutputLimiter.js +115 -0
- package/dist/src/utils/toolOutputLimiter.js.map +1 -0
- package/dist/src/utils/toolOutputLimiter.test.d.ts +6 -0
- package/dist/src/utils/toolOutputLimiter.test.js +164 -0
- package/dist/src/utils/toolOutputLimiter.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -13,6 +13,11 @@ import { detectFileType, processSingleFileContent, DEFAULT_ENCODING, getSpecific
|
|
|
13
13
|
import { Type } from '@google/genai';
|
|
14
14
|
import { DEFAULT_FILE_FILTERING_OPTIONS } from '../config/config.js';
|
|
15
15
|
import { recordFileOperationMetric, FileOperation, } from '../telemetry/metrics.js';
|
|
16
|
+
import { stat } from 'fs/promises';
|
|
17
|
+
// Simple token estimation - roughly 4 characters per token
|
|
18
|
+
function estimateTokens(text) {
|
|
19
|
+
return Math.ceil(text.length / 4);
|
|
20
|
+
}
|
|
16
21
|
/**
|
|
17
22
|
* Default exclusion patterns for commonly ignored directories and binary file types.
|
|
18
23
|
* These are compatible with glob ignore patterns.
|
|
@@ -58,6 +63,11 @@ const DEFAULT_EXCLUDES = [
|
|
|
58
63
|
`**/${getCurrentLlxprtMdFilename()}`,
|
|
59
64
|
];
|
|
60
65
|
const DEFAULT_OUTPUT_SEPARATOR_FORMAT = '--- {filePath} ---';
|
|
66
|
+
// Default limits for ReadManyFiles
|
|
67
|
+
const DEFAULT_MAX_FILE_COUNT = 50;
|
|
68
|
+
const DEFAULT_MAX_TOKENS = 50000;
|
|
69
|
+
const DEFAULT_TRUNCATE_MODE = 'warn';
|
|
70
|
+
const DEFAULT_FILE_SIZE_LIMIT = 524288; // 512KB
|
|
61
71
|
/**
|
|
62
72
|
* Tool implementation for finding and reading multiple text files from the local filesystem
|
|
63
73
|
* within a specified target directory. The content is concatenated.
|
|
@@ -134,7 +144,13 @@ This tool is useful when you need to understand or analyze a collection of files
|
|
|
134
144
|
- Gathering context from multiple configuration files.
|
|
135
145
|
- When the user asks to "read all files in X directory" or "show me the content of all Y files".
|
|
136
146
|
|
|
137
|
-
Use this tool when the user's query implies needing the content of several files simultaneously for context, analysis, or summarization. For text files, it uses default UTF-8 encoding and a '--- {filePath} ---' separator between file contents. Ensure paths are relative to the target directory. Glob patterns like 'src/**/*.js' are supported. Avoid using for single files if a more specific single-file reading tool is available, unless the user specifically requests to process a list containing just one file via this tool. Other binary files (not explicitly requested as image/PDF) are generally skipped. Default excludes apply to common non-text files (except for explicitly requested images/PDFs) and large dependency directories unless 'useDefaultExcludes' is false
|
|
147
|
+
Use this tool when the user's query implies needing the content of several files simultaneously for context, analysis, or summarization. For text files, it uses default UTF-8 encoding and a '--- {filePath} ---' separator between file contents. Ensure paths are relative to the target directory. Glob patterns like 'src/**/*.js' are supported. Avoid using for single files if a more specific single-file reading tool is available, unless the user specifically requests to process a list containing just one file via this tool. Other binary files (not explicitly requested as image/PDF) are generally skipped. Default excludes apply to common non-text files (except for explicitly requested images/PDFs) and large dependency directories unless 'useDefaultExcludes' is false.
|
|
148
|
+
|
|
149
|
+
IMPORTANT LIMITS:
|
|
150
|
+
- Maximum files: 50 (default, configurable via 'tool-output-max-items' setting)
|
|
151
|
+
- Maximum tokens: 50,000 (default, configurable via 'tool-output-max-tokens' setting)
|
|
152
|
+
- Maximum file size: 512KB per file (configurable via 'tool-output-item-size-limit' setting)
|
|
153
|
+
- If limits are exceeded, the tool will warn and suggest more specific patterns (configurable behavior via 'tool-output-truncate-mode')`, Icon.FileSearch, parameterSchema);
|
|
138
154
|
this.config = config;
|
|
139
155
|
this.llxprtIgnorePatterns = config
|
|
140
156
|
.getFileService()
|
|
@@ -286,10 +302,73 @@ Use this tool when the user's query implies needing the content of several files
|
|
|
286
302
|
};
|
|
287
303
|
}
|
|
288
304
|
const sortedFiles = Array.from(filesToConsider).sort();
|
|
305
|
+
// Get limits from ephemeral settings
|
|
306
|
+
const ephemeralSettings = this.config.getEphemeralSettings();
|
|
307
|
+
const maxFileCount = ephemeralSettings['tool-output-max-items'] ??
|
|
308
|
+
DEFAULT_MAX_FILE_COUNT;
|
|
309
|
+
const maxTokens = ephemeralSettings['tool-output-max-tokens'] ??
|
|
310
|
+
DEFAULT_MAX_TOKENS;
|
|
311
|
+
const truncateMode = ephemeralSettings['tool-output-truncate-mode'] ?? DEFAULT_TRUNCATE_MODE;
|
|
312
|
+
const fileSizeLimit = ephemeralSettings['tool-output-item-size-limit'] ?? DEFAULT_FILE_SIZE_LIMIT;
|
|
313
|
+
// Check file count limit
|
|
314
|
+
if (sortedFiles.length > maxFileCount) {
|
|
315
|
+
if (truncateMode === 'warn') {
|
|
316
|
+
const warnMessage = `Found ${sortedFiles.length} files matching your pattern, but limiting to ${maxFileCount} files. Please use more specific patterns to narrow your search.`;
|
|
317
|
+
return {
|
|
318
|
+
llmContent: warnMessage,
|
|
319
|
+
returnDisplay: `## File Count Limit Exceeded\n\n${warnMessage}\n\n**Matched files:** ${sortedFiles.length}\n**Limit:** ${maxFileCount}\n\n**Suggestion:** Use more specific glob patterns or paths to reduce the number of matched files.`,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
else if (truncateMode === 'sample') {
|
|
323
|
+
// Sample evenly across the files
|
|
324
|
+
const step = Math.ceil(sortedFiles.length / maxFileCount);
|
|
325
|
+
const sampledFiles = [];
|
|
326
|
+
for (let i = 0; i < sortedFiles.length; i += step) {
|
|
327
|
+
if (sampledFiles.length < maxFileCount) {
|
|
328
|
+
sampledFiles.push(sortedFiles[i]);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
const originalCount = sortedFiles.length;
|
|
332
|
+
sortedFiles.length = 0;
|
|
333
|
+
sortedFiles.push(...sampledFiles);
|
|
334
|
+
skippedFiles.push({
|
|
335
|
+
path: `${originalCount - sampledFiles.length} file(s)`,
|
|
336
|
+
reason: `sampling to stay within ${maxFileCount} file limit`,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
// truncate mode - just limit the array
|
|
341
|
+
const truncatedCount = sortedFiles.length - maxFileCount;
|
|
342
|
+
sortedFiles.length = maxFileCount;
|
|
343
|
+
skippedFiles.push({
|
|
344
|
+
path: `${truncatedCount} file(s)`,
|
|
345
|
+
reason: `truncated to stay within ${maxFileCount} file limit`,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
let totalTokens = 0;
|
|
289
350
|
for (const filePath of sortedFiles) {
|
|
290
351
|
const relativePathForDisplay = path
|
|
291
352
|
.relative(this.config.getTargetDir(), filePath)
|
|
292
353
|
.replace(/\\/g, '/');
|
|
354
|
+
// Check file size limit
|
|
355
|
+
try {
|
|
356
|
+
const stats = await stat(filePath);
|
|
357
|
+
if (stats.size > fileSizeLimit) {
|
|
358
|
+
skippedFiles.push({
|
|
359
|
+
path: relativePathForDisplay,
|
|
360
|
+
reason: `file size (${Math.round(stats.size / 1024)}KB) exceeds limit (${Math.round(fileSizeLimit / 1024)}KB)`,
|
|
361
|
+
});
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
skippedFiles.push({
|
|
367
|
+
path: relativePathForDisplay,
|
|
368
|
+
reason: `stat error: ${getErrorMessage(error)}`,
|
|
369
|
+
});
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
293
372
|
const fileType = await detectFileType(filePath);
|
|
294
373
|
if (fileType === 'image' || fileType === 'pdf') {
|
|
295
374
|
const fileExtension = path.extname(filePath).toLowerCase();
|
|
@@ -313,11 +392,60 @@ Use this tool when the user's query implies needing the content of several files
|
|
|
313
392
|
});
|
|
314
393
|
}
|
|
315
394
|
else {
|
|
395
|
+
// Check token limit before adding content
|
|
316
396
|
if (typeof fileReadResult.llmContent === 'string') {
|
|
317
397
|
const separator = DEFAULT_OUTPUT_SEPARATOR_FORMAT.replace('{filePath}', filePath);
|
|
318
|
-
|
|
398
|
+
const contentToAdd = `${separator}\n\n${fileReadResult.llmContent}\n\n`;
|
|
399
|
+
const contentTokens = estimateTokens(contentToAdd);
|
|
400
|
+
if (totalTokens + contentTokens > maxTokens) {
|
|
401
|
+
if (truncateMode === 'warn') {
|
|
402
|
+
// Stop processing and warn
|
|
403
|
+
skippedFiles.push({
|
|
404
|
+
path: `${sortedFiles.length - processedFilesRelativePaths.length} remaining file(s)`,
|
|
405
|
+
reason: `would exceed token limit of ${maxTokens}`,
|
|
406
|
+
});
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
else if (truncateMode === 'truncate') {
|
|
410
|
+
// Truncate the content to fit
|
|
411
|
+
const remainingTokens = maxTokens - totalTokens;
|
|
412
|
+
if (remainingTokens > 100) {
|
|
413
|
+
// Only add if we have reasonable space
|
|
414
|
+
const truncatedContent = contentToAdd.substring(0, remainingTokens * 4); // Rough estimate: 4 chars per token
|
|
415
|
+
contentParts.push(truncatedContent +
|
|
416
|
+
'\n\n[CONTENT TRUNCATED DUE TO TOKEN LIMIT]');
|
|
417
|
+
processedFilesRelativePaths.push(relativePathForDisplay);
|
|
418
|
+
skippedFiles.push({
|
|
419
|
+
path: relativePathForDisplay,
|
|
420
|
+
reason: 'content truncated to fit token limit',
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
// sample mode - skip this file and continue
|
|
427
|
+
skippedFiles.push({
|
|
428
|
+
path: relativePathForDisplay,
|
|
429
|
+
reason: 'skipped to stay within token limit',
|
|
430
|
+
});
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
totalTokens += contentTokens;
|
|
435
|
+
contentParts.push(contentToAdd);
|
|
319
436
|
}
|
|
320
437
|
else {
|
|
438
|
+
// For non-text content (images/PDFs), estimate token usage
|
|
439
|
+
// Images typically use ~85 tokens per image
|
|
440
|
+
const estimatedTokens = 85;
|
|
441
|
+
if (totalTokens + estimatedTokens > maxTokens) {
|
|
442
|
+
skippedFiles.push({
|
|
443
|
+
path: relativePathForDisplay,
|
|
444
|
+
reason: 'would exceed token limit (non-text content)',
|
|
445
|
+
});
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
totalTokens += estimatedTokens;
|
|
321
449
|
contentParts.push(fileReadResult.llmContent); // This is a Part for image/pdf
|
|
322
450
|
}
|
|
323
451
|
processedFilesRelativePaths.push(relativePathForDisplay);
|
|
@@ -330,7 +458,11 @@ Use this tool when the user's query implies needing the content of several files
|
|
|
330
458
|
}
|
|
331
459
|
let displayMessage = `### ReadManyFiles Result (Target Dir: \`${this.config.getTargetDir()}\`)\n\n`;
|
|
332
460
|
if (processedFilesRelativePaths.length > 0) {
|
|
333
|
-
displayMessage += `Successfully read and concatenated content from **${processedFilesRelativePaths.length} file(s)
|
|
461
|
+
displayMessage += `Successfully read and concatenated content from **${processedFilesRelativePaths.length} file(s)**`;
|
|
462
|
+
if (totalTokens > 0) {
|
|
463
|
+
displayMessage += ` (approximately ${totalTokens.toLocaleString()} tokens)`;
|
|
464
|
+
}
|
|
465
|
+
displayMessage += `.\n`;
|
|
334
466
|
if (processedFilesRelativePaths.length <= 10) {
|
|
335
467
|
displayMessage += `\n**Processed Files:**\n`;
|
|
336
468
|
processedFilesRelativePaths.forEach((p) => (displayMessage += `- \`${p}\`\n`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-many-files.js","sourceRoot":"","sources":["../../../src/tools/read-many-files.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"read-many-files.js","sourceRoot":"","sources":["../../../src/tools/read-many-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,6 +56,7 @@ describe('ReadManyFilesTool', () => {
|
|
|
56
56
|
getTargetDir: () => tempRootDir,
|
|
57
57
|
getWorkspaceDirs: () => [tempRootDir],
|
|
58
58
|
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
59
|
+
getEphemeralSettings: () => ({}), // Return empty settings for default behavior
|
|
59
60
|
};
|
|
60
61
|
tool = new ReadManyFilesTool(mockConfig);
|
|
61
62
|
mockReadFileFn = mockControl.mockReadFile;
|
|
@@ -325,6 +326,7 @@ describe('ReadManyFilesTool', () => {
|
|
|
325
326
|
}),
|
|
326
327
|
getWorkspaceContext: () => new WorkspaceContext(tempDir1, [tempDir2]),
|
|
327
328
|
getTargetDir: () => tempDir1,
|
|
329
|
+
getEphemeralSettings: () => ({}), // Return empty settings for default behavior
|
|
328
330
|
};
|
|
329
331
|
tool = new ReadManyFilesTool(mockConfig);
|
|
330
332
|
fs.writeFileSync(path.join(tempDir1, 'file1.txt'), 'Content1');
|
|
@@ -344,5 +346,283 @@ describe('ReadManyFilesTool', () => {
|
|
|
344
346
|
fs.rmSync(tempDir2, { recursive: true, force: true });
|
|
345
347
|
});
|
|
346
348
|
});
|
|
349
|
+
describe('limits functionality', () => {
|
|
350
|
+
const createFile = (filePath, content = '') => {
|
|
351
|
+
const fullPath = path.join(tempRootDir, filePath);
|
|
352
|
+
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
353
|
+
fs.writeFileSync(fullPath, content);
|
|
354
|
+
};
|
|
355
|
+
describe('file count limits', () => {
|
|
356
|
+
it('should warn and stop when exceeding file count limit in warn mode', async () => {
|
|
357
|
+
// Create 60 files (limit is 50 by default)
|
|
358
|
+
for (let i = 1; i <= 60; i++) {
|
|
359
|
+
createFile(`file${i}.txt`, `Content of file ${i}`);
|
|
360
|
+
}
|
|
361
|
+
const mockConfig = {
|
|
362
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
363
|
+
getFileFilteringOptions: () => ({
|
|
364
|
+
respectGitIgnore: true,
|
|
365
|
+
respectLlxprtIgnore: true,
|
|
366
|
+
}),
|
|
367
|
+
getTargetDir: () => tempRootDir,
|
|
368
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
369
|
+
getEphemeralSettings: () => ({
|
|
370
|
+
'tool-output-max-items': 50,
|
|
371
|
+
'tool-output-truncate-mode': 'warn',
|
|
372
|
+
}),
|
|
373
|
+
};
|
|
374
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
375
|
+
const params = { paths: ['*.txt'] };
|
|
376
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
377
|
+
expect(result.llmContent).toBe('Found 60 files matching your pattern, but limiting to 50 files. Please use more specific patterns to narrow your search.');
|
|
378
|
+
expect(result.returnDisplay).toContain('## File Count Limit Exceeded');
|
|
379
|
+
expect(result.returnDisplay).toContain('**Matched files:** 60');
|
|
380
|
+
expect(result.returnDisplay).toContain('**Limit:** 50');
|
|
381
|
+
});
|
|
382
|
+
it('should truncate files when exceeding limit in truncate mode', async () => {
|
|
383
|
+
// Create 10 files
|
|
384
|
+
for (let i = 1; i <= 10; i++) {
|
|
385
|
+
createFile(`file${i}.txt`, `Content of file ${i}`);
|
|
386
|
+
}
|
|
387
|
+
const mockConfig = {
|
|
388
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
389
|
+
getFileFilteringOptions: () => ({
|
|
390
|
+
respectGitIgnore: true,
|
|
391
|
+
respectLlxprtIgnore: true,
|
|
392
|
+
}),
|
|
393
|
+
getTargetDir: () => tempRootDir,
|
|
394
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
395
|
+
getEphemeralSettings: () => ({
|
|
396
|
+
'tool-output-max-items': 5,
|
|
397
|
+
'tool-output-truncate-mode': 'truncate',
|
|
398
|
+
}),
|
|
399
|
+
};
|
|
400
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
401
|
+
const params = { paths: ['*.txt'] };
|
|
402
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
403
|
+
const content = result.llmContent;
|
|
404
|
+
expect(content.length).toBe(5); // Only 5 files processed
|
|
405
|
+
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **5 file(s)**');
|
|
406
|
+
expect(result.returnDisplay).toContain('**Skipped 1 item(s):**');
|
|
407
|
+
expect(result.returnDisplay).toContain('`5 file(s)` (Reason: truncated to stay within 5 file limit)');
|
|
408
|
+
});
|
|
409
|
+
it('should sample files evenly when exceeding limit in sample mode', async () => {
|
|
410
|
+
// Create 20 files
|
|
411
|
+
for (let i = 1; i <= 20; i++) {
|
|
412
|
+
createFile(`file${i.toString().padStart(2, '0')}.txt`, `Content of file ${i}`);
|
|
413
|
+
}
|
|
414
|
+
const mockConfig = {
|
|
415
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
416
|
+
getFileFilteringOptions: () => ({
|
|
417
|
+
respectGitIgnore: true,
|
|
418
|
+
respectLlxprtIgnore: true,
|
|
419
|
+
}),
|
|
420
|
+
getTargetDir: () => tempRootDir,
|
|
421
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
422
|
+
getEphemeralSettings: () => ({
|
|
423
|
+
'tool-output-max-items': 5,
|
|
424
|
+
'tool-output-truncate-mode': 'sample',
|
|
425
|
+
}),
|
|
426
|
+
};
|
|
427
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
428
|
+
const params = { paths: ['*.txt'] };
|
|
429
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
430
|
+
const content = result.llmContent;
|
|
431
|
+
expect(content.length).toBe(5); // Only 5 files processed
|
|
432
|
+
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **5 file(s)**');
|
|
433
|
+
expect(result.returnDisplay).toContain('**Skipped 1 item(s):**');
|
|
434
|
+
expect(result.returnDisplay).toContain('`15 file(s)` (Reason: sampling to stay within 5 file limit)');
|
|
435
|
+
// Check that we sampled evenly (should get files 1, 5, 9, 13, 17 approximately)
|
|
436
|
+
const processedFiles = result.returnDisplay.match(/file\d+\.txt/g) || [];
|
|
437
|
+
expect(processedFiles.length).toBe(5);
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
describe('token limits', () => {
|
|
441
|
+
it('should warn and stop when exceeding token limit in warn mode', async () => {
|
|
442
|
+
// Create files with enough content to exceed token limit
|
|
443
|
+
createFile('file1.txt', 'a'.repeat(1000)); // ~250 tokens
|
|
444
|
+
createFile('file2.txt', 'b'.repeat(1000)); // ~250 tokens
|
|
445
|
+
createFile('file3.txt', 'c'.repeat(1000)); // ~250 tokens
|
|
446
|
+
createFile('file4.txt', 'd'.repeat(1000)); // ~250 tokens
|
|
447
|
+
const mockConfig = {
|
|
448
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
449
|
+
getFileFilteringOptions: () => ({
|
|
450
|
+
respectGitIgnore: true,
|
|
451
|
+
respectLlxprtIgnore: true,
|
|
452
|
+
}),
|
|
453
|
+
getTargetDir: () => tempRootDir,
|
|
454
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
455
|
+
getEphemeralSettings: () => ({
|
|
456
|
+
'tool-output-max-tokens': 500, // Very low token limit
|
|
457
|
+
'tool-output-truncate-mode': 'warn',
|
|
458
|
+
}),
|
|
459
|
+
};
|
|
460
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
461
|
+
const params = { paths: ['*.txt'] };
|
|
462
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
463
|
+
const content = result.llmContent;
|
|
464
|
+
expect(content.length).toBeLessThan(4); // Should stop before processing all files
|
|
465
|
+
expect(result.returnDisplay).toContain('Successfully read and concatenated content from');
|
|
466
|
+
expect(result.returnDisplay).toContain('**Skipped');
|
|
467
|
+
expect(result.returnDisplay).toContain('would exceed token limit of 500');
|
|
468
|
+
});
|
|
469
|
+
it('should truncate content when exceeding token limit in truncate mode', async () => {
|
|
470
|
+
// Create a file with long content
|
|
471
|
+
const longContent = 'This is a very long content. '.repeat(200); // ~1600 tokens
|
|
472
|
+
createFile('file1.txt', longContent);
|
|
473
|
+
createFile('file2.txt', 'Short content');
|
|
474
|
+
const mockConfig = {
|
|
475
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
476
|
+
getFileFilteringOptions: () => ({
|
|
477
|
+
respectGitIgnore: true,
|
|
478
|
+
respectLlxprtIgnore: true,
|
|
479
|
+
}),
|
|
480
|
+
getTargetDir: () => tempRootDir,
|
|
481
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
482
|
+
getEphemeralSettings: () => ({
|
|
483
|
+
'tool-output-max-tokens': 500,
|
|
484
|
+
'tool-output-truncate-mode': 'truncate',
|
|
485
|
+
}),
|
|
486
|
+
};
|
|
487
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
488
|
+
const params = { paths: ['*.txt'] };
|
|
489
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
490
|
+
const content = result.llmContent;
|
|
491
|
+
expect(content.some((c) => c.includes('[CONTENT TRUNCATED DUE TO TOKEN LIMIT]'))).toBe(true);
|
|
492
|
+
expect(result.returnDisplay).toContain('content truncated to fit token limit');
|
|
493
|
+
});
|
|
494
|
+
it('should skip files when exceeding token limit in sample mode', async () => {
|
|
495
|
+
// Create multiple files
|
|
496
|
+
for (let i = 1; i <= 5; i++) {
|
|
497
|
+
createFile(`file${i}.txt`, 'Content '.repeat(200)); // ~400 tokens each
|
|
498
|
+
}
|
|
499
|
+
const mockConfig = {
|
|
500
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
501
|
+
getFileFilteringOptions: () => ({
|
|
502
|
+
respectGitIgnore: true,
|
|
503
|
+
respectLlxprtIgnore: true,
|
|
504
|
+
}),
|
|
505
|
+
getTargetDir: () => tempRootDir,
|
|
506
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
507
|
+
getEphemeralSettings: () => ({
|
|
508
|
+
'tool-output-max-tokens': 1000,
|
|
509
|
+
'tool-output-truncate-mode': 'sample',
|
|
510
|
+
}),
|
|
511
|
+
};
|
|
512
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
513
|
+
const params = { paths: ['*.txt'] };
|
|
514
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
515
|
+
expect(result.returnDisplay).toContain('skipped to stay within token limit');
|
|
516
|
+
const content = result.llmContent;
|
|
517
|
+
// Should have processed some files but not all
|
|
518
|
+
expect(content.length).toBeGreaterThan(0);
|
|
519
|
+
expect(content.length).toBeLessThan(5);
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
describe('file size limits', () => {
|
|
523
|
+
it('should skip files exceeding size limit', async () => {
|
|
524
|
+
// Create a small file and a large file
|
|
525
|
+
createFile('small.txt', 'Small content');
|
|
526
|
+
const largeContent = 'x'.repeat(600 * 1024); // 600KB
|
|
527
|
+
createFile('large.txt', largeContent);
|
|
528
|
+
const mockConfig = {
|
|
529
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
530
|
+
getFileFilteringOptions: () => ({
|
|
531
|
+
respectGitIgnore: true,
|
|
532
|
+
respectLlxprtIgnore: true,
|
|
533
|
+
}),
|
|
534
|
+
getTargetDir: () => tempRootDir,
|
|
535
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
536
|
+
getEphemeralSettings: () => ({
|
|
537
|
+
'tool-output-item-size-limit': 524288, // 512KB
|
|
538
|
+
}),
|
|
539
|
+
};
|
|
540
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
541
|
+
const params = { paths: ['*.txt'] };
|
|
542
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
543
|
+
const content = result.llmContent;
|
|
544
|
+
expect(content.length).toBe(1); // Only small file processed
|
|
545
|
+
expect(content[0]).toContain('Small content');
|
|
546
|
+
expect(result.returnDisplay).toContain('file size (600KB) exceeds limit (512KB)');
|
|
547
|
+
});
|
|
548
|
+
it('should respect custom file size limit from ephemeral settings', async () => {
|
|
549
|
+
// Create files of various sizes
|
|
550
|
+
createFile('tiny.txt', 'x'.repeat(10));
|
|
551
|
+
createFile('medium.txt', 'x'.repeat(200 * 1024)); // 200KB
|
|
552
|
+
createFile('large.txt', 'x'.repeat(300 * 1024)); // 300KB
|
|
553
|
+
const mockConfig = {
|
|
554
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
555
|
+
getFileFilteringOptions: () => ({
|
|
556
|
+
respectGitIgnore: true,
|
|
557
|
+
respectLlxprtIgnore: true,
|
|
558
|
+
}),
|
|
559
|
+
getTargetDir: () => tempRootDir,
|
|
560
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
561
|
+
getEphemeralSettings: () => ({
|
|
562
|
+
'tool-output-item-size-limit': 256 * 1024, // 256KB
|
|
563
|
+
}),
|
|
564
|
+
};
|
|
565
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
566
|
+
const params = { paths: ['*.txt'] };
|
|
567
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
568
|
+
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **2 file(s)**');
|
|
569
|
+
expect(result.returnDisplay).toContain('file size (300KB) exceeds limit (256KB)');
|
|
570
|
+
});
|
|
571
|
+
});
|
|
572
|
+
describe('combined limits', () => {
|
|
573
|
+
it('should handle multiple limits simultaneously', async () => {
|
|
574
|
+
// Create many files with varying sizes
|
|
575
|
+
for (let i = 1; i <= 10; i++) {
|
|
576
|
+
const content = 'x'.repeat(i * 100); // Increasing sizes
|
|
577
|
+
createFile(`file${i}.txt`, content);
|
|
578
|
+
}
|
|
579
|
+
const mockConfig = {
|
|
580
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
581
|
+
getFileFilteringOptions: () => ({
|
|
582
|
+
respectGitIgnore: true,
|
|
583
|
+
respectLlxprtIgnore: true,
|
|
584
|
+
}),
|
|
585
|
+
getTargetDir: () => tempRootDir,
|
|
586
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
587
|
+
getEphemeralSettings: () => ({
|
|
588
|
+
'tool-output-max-items': 5,
|
|
589
|
+
'tool-output-max-tokens': 500,
|
|
590
|
+
'tool-output-item-size-limit': 512,
|
|
591
|
+
'tool-output-truncate-mode': 'sample',
|
|
592
|
+
}),
|
|
593
|
+
};
|
|
594
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
595
|
+
const params = { paths: ['*.txt'] };
|
|
596
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
597
|
+
// Should be limited by multiple factors
|
|
598
|
+
const content = result.llmContent;
|
|
599
|
+
expect(content.length).toBeLessThanOrEqual(5); // File count limit
|
|
600
|
+
expect(result.returnDisplay).toMatch(/Successfully read and concatenated content from \*\*\d+ file\(s\)\*\*/);
|
|
601
|
+
});
|
|
602
|
+
});
|
|
603
|
+
describe('default values', () => {
|
|
604
|
+
it('should use default limits when ephemeral settings are not provided', async () => {
|
|
605
|
+
// Create 55 files (default limit is 50)
|
|
606
|
+
for (let i = 1; i <= 55; i++) {
|
|
607
|
+
createFile(`file${i}.txt`, `Content ${i}`);
|
|
608
|
+
}
|
|
609
|
+
const mockConfig = {
|
|
610
|
+
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
611
|
+
getFileFilteringOptions: () => ({
|
|
612
|
+
respectGitIgnore: true,
|
|
613
|
+
respectLlxprtIgnore: true,
|
|
614
|
+
}),
|
|
615
|
+
getTargetDir: () => tempRootDir,
|
|
616
|
+
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
617
|
+
getEphemeralSettings: () => ({}), // Empty settings
|
|
618
|
+
};
|
|
619
|
+
tool = new ReadManyFilesTool(mockConfig);
|
|
620
|
+
const params = { paths: ['*.txt'] };
|
|
621
|
+
const result = await tool.execute(params, new AbortController().signal);
|
|
622
|
+
// Should use default warn mode and stop at 50 files
|
|
623
|
+
expect(result.llmContent).toContain('Found 55 files matching your pattern, but limiting to 50 files');
|
|
624
|
+
});
|
|
625
|
+
});
|
|
626
|
+
});
|
|
347
627
|
});
|
|
348
628
|
//# sourceMappingURL=read-many-files.test.js.map
|