@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.
Files changed (71) hide show
  1. package/dist/src/config/config.js +19 -9
  2. package/dist/src/config/config.js.map +1 -1
  3. package/dist/src/config/config.test.js +63 -0
  4. package/dist/src/config/config.test.js.map +1 -1
  5. package/dist/src/core/coreToolScheduler.d.ts +6 -1
  6. package/dist/src/core/coreToolScheduler.js +96 -61
  7. package/dist/src/core/coreToolScheduler.js.map +1 -1
  8. package/dist/src/core/coreToolScheduler.test.js +142 -0
  9. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  10. package/dist/src/core/geminiChat.d.ts +9 -0
  11. package/dist/src/core/geminiChat.js +121 -1
  12. package/dist/src/core/geminiChat.js.map +1 -1
  13. package/dist/src/core/geminiChat.test.js +1 -0
  14. package/dist/src/core/geminiChat.test.js.map +1 -1
  15. package/dist/src/ide/detect-ide.js +6 -3
  16. package/dist/src/ide/detect-ide.js.map +1 -1
  17. package/dist/src/ide/ide-installer.d.ts +0 -1
  18. package/dist/src/ide/ide-installer.js +5 -7
  19. package/dist/src/ide/ide-installer.js.map +1 -1
  20. package/dist/src/ide/ide-installer.test.js +1 -24
  21. package/dist/src/ide/ide-installer.test.js.map +1 -1
  22. package/dist/src/mcp/oauth-utils.js +12 -4
  23. package/dist/src/mcp/oauth-utils.js.map +1 -1
  24. package/dist/src/providers/integration/multi-provider.integration.test.js +1 -1
  25. package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -1
  26. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +1 -1
  27. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +1 -1
  28. package/dist/src/tools/glob.js +9 -1
  29. package/dist/src/tools/glob.js.map +1 -1
  30. package/dist/src/tools/glob.test.js +1 -0
  31. package/dist/src/tools/glob.test.js.map +1 -1
  32. package/dist/src/tools/grep.js +49 -10
  33. package/dist/src/tools/grep.js.map +1 -1
  34. package/dist/src/tools/grep.test.js +3 -0
  35. package/dist/src/tools/grep.test.js.map +1 -1
  36. package/dist/src/tools/ls.js +9 -1
  37. package/dist/src/tools/ls.js.map +1 -1
  38. package/dist/src/tools/ls.test.js +1 -0
  39. package/dist/src/tools/ls.test.js.map +1 -1
  40. package/dist/src/tools/mcp-client.d.ts +1 -1
  41. package/dist/src/tools/mcp-client.js +53 -25
  42. package/dist/src/tools/mcp-client.js.map +1 -1
  43. package/dist/src/tools/read-many-files.js +135 -3
  44. package/dist/src/tools/read-many-files.js.map +1 -1
  45. package/dist/src/tools/read-many-files.test.js +280 -0
  46. package/dist/src/tools/read-many-files.test.js.map +1 -1
  47. package/dist/src/tools/shell.js +11 -2
  48. package/dist/src/tools/shell.js.map +1 -1
  49. package/dist/src/tools/shell.multibyte.test.js +1 -0
  50. package/dist/src/tools/shell.multibyte.test.js.map +1 -1
  51. package/dist/src/tools/shell.test.js +3 -0
  52. package/dist/src/tools/shell.test.js.map +1 -1
  53. package/dist/src/tools/tool-registry.d.ts +5 -0
  54. package/dist/src/tools/tool-registry.js +24 -1
  55. package/dist/src/tools/tool-registry.js.map +1 -1
  56. package/dist/src/tools/tool-registry.test.js +49 -0
  57. package/dist/src/tools/tool-registry.test.js.map +1 -1
  58. package/dist/src/types/modelParams.d.ts +12 -0
  59. package/dist/src/utils/paths.d.ts +11 -2
  60. package/dist/src/utils/paths.js +24 -7
  61. package/dist/src/utils/paths.js.map +1 -1
  62. package/dist/src/utils/paths.test.d.ts +6 -0
  63. package/dist/src/utils/paths.test.js +153 -0
  64. package/dist/src/utils/paths.test.js.map +1 -0
  65. package/dist/src/utils/toolOutputLimiter.d.ts +34 -0
  66. package/dist/src/utils/toolOutputLimiter.js +115 -0
  67. package/dist/src/utils/toolOutputLimiter.js.map +1 -0
  68. package/dist/src/utils/toolOutputLimiter.test.d.ts +6 -0
  69. package/dist/src/utils/toolOutputLimiter.test.js +164 -0
  70. package/dist/src/utils/toolOutputLimiter.test.js.map +1 -0
  71. 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.`, Icon.FileSearch, parameterSchema);
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
- contentParts.push(`${separator}\n\n${fileReadResult.llmContent}\n\n`);
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)**.\n`;
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