@vybestack/llxprt-code-core 0.1.18-nightly.250807.306d1939 → 0.1.18-nightly.250808.f9b79d74

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 (167) hide show
  1. package/README.md +1 -0
  2. package/dist/src/config/config.alwaysAllow.test.d.ts +6 -0
  3. package/dist/src/config/config.alwaysAllow.test.js +84 -0
  4. package/dist/src/config/config.alwaysAllow.test.js.map +1 -0
  5. package/dist/src/config/config.d.ts +10 -0
  6. package/dist/src/config/config.js +20 -0
  7. package/dist/src/config/config.js.map +1 -1
  8. package/dist/src/core/client.d.ts +0 -2
  9. package/dist/src/core/client.js +3 -81
  10. package/dist/src/core/client.js.map +1 -1
  11. package/dist/src/core/contentGenerator.js +1 -1
  12. package/dist/src/core/contentGenerator.js.map +1 -1
  13. package/dist/src/core/coreToolScheduler.d.ts +17 -7
  14. package/dist/src/core/coreToolScheduler.js +121 -18
  15. package/dist/src/core/coreToolScheduler.js.map +1 -1
  16. package/dist/src/core/coreToolScheduler.test.js +25 -37
  17. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  18. package/dist/src/core/geminiChat.d.ts +3 -0
  19. package/dist/src/core/geminiChat.js +17 -13
  20. package/dist/src/core/geminiChat.js.map +1 -1
  21. package/dist/src/core/nonInteractiveToolExecutor.js +4 -1
  22. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  23. package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -31
  24. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  25. package/dist/src/core/subagent.d.ts +230 -0
  26. package/dist/src/core/subagent.js +453 -0
  27. package/dist/src/core/subagent.js.map +1 -0
  28. package/dist/src/core/subagent.test.d.ts +6 -0
  29. package/dist/src/core/subagent.test.js +519 -0
  30. package/dist/src/core/subagent.test.js.map +1 -0
  31. package/dist/src/hooks/tool-render-suppression-hook.d.ts +16 -0
  32. package/dist/src/hooks/tool-render-suppression-hook.js +26 -0
  33. package/dist/src/hooks/tool-render-suppression-hook.js.map +1 -0
  34. package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +6 -0
  35. package/dist/src/hooks/tool-render-suppression-hook.test.js +59 -0
  36. package/dist/src/hooks/tool-render-suppression-hook.test.js.map +1 -0
  37. package/dist/src/ide/ide-client.d.ts +21 -0
  38. package/dist/src/ide/ide-client.js +107 -1
  39. package/dist/src/ide/ide-client.js.map +1 -1
  40. package/dist/src/ide/ideContext.d.ts +127 -32
  41. package/dist/src/ide/ideContext.js +45 -0
  42. package/dist/src/ide/ideContext.js.map +1 -1
  43. package/dist/src/index.d.ts +3 -0
  44. package/dist/src/index.js +3 -0
  45. package/dist/src/index.js.map +1 -1
  46. package/dist/src/integration-tests/todo-system.test.js +38 -602
  47. package/dist/src/integration-tests/todo-system.test.js.map +1 -1
  48. package/dist/src/providers/gemini/GeminiProvider.js +5 -5
  49. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  50. package/dist/src/providers/openai/OpenAIProvider.js +8 -1
  51. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  52. package/dist/src/providers/openai/OpenAIProvider.test.js +106 -0
  53. package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -1
  54. package/dist/src/providers/types/IProviderConfig.d.ts +5 -0
  55. package/dist/src/services/shellExecutionService.js +29 -5
  56. package/dist/src/services/shellExecutionService.js.map +1 -1
  57. package/dist/src/services/shellExecutionService.test.js +8 -0
  58. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  59. package/dist/src/services/todo-context-tracker.d.ts +31 -0
  60. package/dist/src/services/todo-context-tracker.js +45 -0
  61. package/dist/src/services/todo-context-tracker.js.map +1 -0
  62. package/dist/src/services/tool-call-tracker-service.d.ts +52 -0
  63. package/dist/src/services/tool-call-tracker-service.js +170 -0
  64. package/dist/src/services/tool-call-tracker-service.js.map +1 -0
  65. package/dist/src/services/tool-call-tracker-service.test.d.ts +6 -0
  66. package/dist/src/services/tool-call-tracker-service.test.js +99 -0
  67. package/dist/src/services/tool-call-tracker-service.test.js.map +1 -0
  68. package/dist/src/telemetry/loggers.test.circular.js +7 -2
  69. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  70. package/dist/src/telemetry/loggers.test.js +5 -1
  71. package/dist/src/telemetry/loggers.test.js.map +1 -1
  72. package/dist/src/telemetry/metrics.d.ts +1 -1
  73. package/dist/src/telemetry/metrics.js.map +1 -1
  74. package/dist/src/telemetry/types.d.ts +2 -1
  75. package/dist/src/telemetry/types.js +3 -1
  76. package/dist/src/telemetry/types.js.map +1 -1
  77. package/dist/src/telemetry/uiTelemetry.d.ts +2 -0
  78. package/dist/src/telemetry/uiTelemetry.js +2 -0
  79. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  80. package/dist/src/telemetry/uiTelemetry.test.js +11 -1
  81. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  82. package/dist/src/test-utils/tools.d.ts +23 -0
  83. package/dist/src/test-utils/tools.js +41 -0
  84. package/dist/src/test-utils/tools.js.map +1 -0
  85. package/dist/src/tools/edit.d.ts +2 -2
  86. package/dist/src/tools/edit.js +18 -0
  87. package/dist/src/tools/edit.js.map +1 -1
  88. package/dist/src/tools/edit.test.js +48 -0
  89. package/dist/src/tools/edit.test.js.map +1 -1
  90. package/dist/src/tools/mcp-client.d.ts +10 -0
  91. package/dist/src/tools/mcp-client.js +59 -0
  92. package/dist/src/tools/mcp-client.js.map +1 -1
  93. package/dist/src/tools/mcp-client.test.js +294 -1
  94. package/dist/src/tools/mcp-client.test.js.map +1 -1
  95. package/dist/src/tools/memoryTool.d.ts +2 -2
  96. package/dist/src/tools/memoryTool.js +1 -0
  97. package/dist/src/tools/memoryTool.js.map +1 -1
  98. package/dist/src/tools/modifiable-tool.d.ts +8 -5
  99. package/dist/src/tools/modifiable-tool.js +4 -1
  100. package/dist/src/tools/modifiable-tool.js.map +1 -1
  101. package/dist/src/tools/modifiable-tool.test.js +3 -3
  102. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  103. package/dist/src/tools/read-file.d.ts +4 -6
  104. package/dist/src/tools/read-file.js +59 -46
  105. package/dist/src/tools/read-file.js.map +1 -1
  106. package/dist/src/tools/read-file.test.js +201 -126
  107. package/dist/src/tools/read-file.test.js.map +1 -1
  108. package/dist/src/tools/read-many-files.js +8 -2
  109. package/dist/src/tools/read-many-files.js.map +1 -1
  110. package/dist/src/tools/read-many-files.test.js +16 -0
  111. package/dist/src/tools/read-many-files.test.js.map +1 -1
  112. package/dist/src/tools/todo-events.d.ts +22 -0
  113. package/dist/src/tools/todo-events.js +24 -0
  114. package/dist/src/tools/todo-events.js.map +1 -0
  115. package/dist/src/tools/todo-read.js.map +1 -1
  116. package/dist/src/tools/todo-schemas.d.ts +232 -4
  117. package/dist/src/tools/todo-schemas.js +13 -0
  118. package/dist/src/tools/todo-schemas.js.map +1 -1
  119. package/dist/src/tools/todo-schemas.test.js +190 -1
  120. package/dist/src/tools/todo-schemas.test.js.map +1 -1
  121. package/dist/src/tools/todo-store.d.ts +1 -4
  122. package/dist/src/tools/todo-store.js +41 -40
  123. package/dist/src/tools/todo-store.js.map +1 -1
  124. package/dist/src/tools/todo-store.test.js +34 -40
  125. package/dist/src/tools/todo-store.test.js.map +1 -1
  126. package/dist/src/tools/todo-write.d.ts +1 -1
  127. package/dist/src/tools/todo-write.js +84 -47
  128. package/dist/src/tools/todo-write.js.map +1 -1
  129. package/dist/src/tools/todo-write.test.js +23 -9
  130. package/dist/src/tools/todo-write.test.js.map +1 -1
  131. package/dist/src/tools/tool-context.d.ts +2 -0
  132. package/dist/src/tools/tool-registry.d.ts +12 -6
  133. package/dist/src/tools/tool-registry.js +16 -1
  134. package/dist/src/tools/tool-registry.js.map +1 -1
  135. package/dist/src/tools/tool-registry.test.js +1 -18
  136. package/dist/src/tools/tool-registry.test.js.map +1 -1
  137. package/dist/src/tools/tools.d.ts +116 -39
  138. package/dist/src/tools/tools.js +100 -10
  139. package/dist/src/tools/tools.js.map +1 -1
  140. package/dist/src/tools/write-file.d.ts +2 -2
  141. package/dist/src/tools/write-file.js +16 -0
  142. package/dist/src/tools/write-file.js.map +1 -1
  143. package/dist/src/tools/write-file.test.js +20 -3
  144. package/dist/src/tools/write-file.test.js.map +1 -1
  145. package/dist/src/types/modelParams.d.ts +2 -0
  146. package/dist/src/utils/environmentContext.d.ts +21 -0
  147. package/dist/src/utils/environmentContext.js +90 -0
  148. package/dist/src/utils/environmentContext.js.map +1 -0
  149. package/dist/src/utils/environmentContext.test.d.ts +6 -0
  150. package/dist/src/utils/environmentContext.test.js +139 -0
  151. package/dist/src/utils/environmentContext.test.js.map +1 -0
  152. package/dist/src/utils/fileUtils.js +2 -10
  153. package/dist/src/utils/fileUtils.js.map +1 -1
  154. package/dist/src/utils/fileUtils.test.js +1 -4
  155. package/dist/src/utils/fileUtils.test.js.map +1 -1
  156. package/dist/src/utils/filesearch/fileSearch.js +15 -1
  157. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  158. package/dist/src/utils/filesearch/fileSearch.test.js +21 -1
  159. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  160. package/dist/src/utils/memoryDiscovery.js +4 -1
  161. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  162. package/dist/src/utils/shell-utils.js +14 -2
  163. package/dist/src/utils/shell-utils.js.map +1 -1
  164. package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +6 -0
  165. package/dist/src/utils/shell-utils.shellReplacement.test.js +149 -0
  166. package/dist/src/utils/shell-utils.shellReplacement.test.js.map +1 -0
  167. package/package.json +2 -1
@@ -6,18 +6,72 @@
6
6
  import path from 'path';
7
7
  import { SchemaValidator } from '../utils/schemaValidator.js';
8
8
  import { makeRelative, shortenPath } from '../utils/paths.js';
9
- import { BaseTool, Icon } from './tools.js';
9
+ import { BaseDeclarativeTool, Icon, } from './tools.js';
10
10
  import { Type } from '@google/genai';
11
11
  import { processSingleFileContent, getSpecificMimeType, } from '../utils/fileUtils.js';
12
12
  import { recordFileOperationMetric, FileOperation, } from '../telemetry/metrics.js';
13
+ class ReadFileToolInvocation {
14
+ config;
15
+ params;
16
+ constructor(config, params) {
17
+ this.config = config;
18
+ this.params = params;
19
+ }
20
+ getDescription() {
21
+ const relativePath = makeRelative(this.params.absolute_path, this.config.getTargetDir());
22
+ return shortenPath(relativePath);
23
+ }
24
+ toolLocations() {
25
+ return [{ path: this.params.absolute_path, line: this.params.offset }];
26
+ }
27
+ shouldConfirmExecute() {
28
+ return Promise.resolve(false);
29
+ }
30
+ async execute() {
31
+ const result = await processSingleFileContent(this.params.absolute_path, this.config.getTargetDir(), this.params.offset, this.params.limit);
32
+ if (result.error) {
33
+ return {
34
+ llmContent: result.error, // The detailed error for LLM
35
+ returnDisplay: result.returnDisplay || 'Error reading file', // User-friendly error
36
+ };
37
+ }
38
+ let llmContent;
39
+ if (result.isTruncated) {
40
+ const [start, end] = result.linesShown;
41
+ const total = result.originalLineCount;
42
+ const nextOffset = this.params.offset
43
+ ? this.params.offset + end - start + 1
44
+ : end;
45
+ llmContent = `
46
+ IMPORTANT: The file content has been truncated.
47
+ Status: Showing lines ${start}-${end} of ${total} total lines.
48
+ Action: To read more of the file, you can use the 'offset' and 'limit' parameters in a subsequent 'read_file' call. For example, to read the next section of the file, use offset: ${nextOffset}.
49
+
50
+ --- FILE CONTENT (truncated) ---
51
+ ${result.llmContent}`;
52
+ }
53
+ else {
54
+ llmContent = result.llmContent || '';
55
+ }
56
+ const lines = typeof result.llmContent === 'string'
57
+ ? result.llmContent.split('\n').length
58
+ : undefined;
59
+ const mimetype = getSpecificMimeType(this.params.absolute_path);
60
+ recordFileOperationMetric(this.config, FileOperation.READ, lines, mimetype, path.extname(this.params.absolute_path));
61
+ return {
62
+ llmContent,
63
+ returnDisplay: result.returnDisplay || '',
64
+ };
65
+ }
66
+ }
13
67
  /**
14
68
  * Implementation of the ReadFile tool logic
15
69
  */
16
- export class ReadFileTool extends BaseTool {
70
+ export class ReadFileTool extends BaseDeclarativeTool {
17
71
  config;
18
72
  static Name = 'read_file';
19
73
  constructor(config) {
20
- super(ReadFileTool.Name, 'ReadFile', 'Reads and returns the content of a specified file from the local filesystem. Handles text, images (PNG, JPG, GIF, WEBP, SVG, BMP), and PDF files. For text files, it can read specific line ranges.', Icon.FileSearch, {
74
+ super(ReadFileTool.Name, 'ReadFile', `Reads and returns the content of a specified file. If the file is large, the content will be truncated. The tool's response will clearly indicate if truncation has occurred and will provide details on how to read more of the file using the 'offset' and 'limit' parameters. Handles text, images (PNG, JPG, GIF, WEBP, SVG, BMP), and PDF files. For text files, it can read specific line ranges.`, Icon.FileSearch, {
21
75
  properties: {
22
76
  absolute_path: {
23
77
  description: "The absolute path to the file to read (e.g., '/home/user/project/file.txt'). Relative paths are not supported. You must provide an absolute path.",
@@ -63,49 +117,8 @@ export class ReadFileTool extends BaseTool {
63
117
  }
64
118
  return null;
65
119
  }
66
- getDescription(params) {
67
- if (!params ||
68
- typeof params.absolute_path !== 'string' ||
69
- params.absolute_path.trim() === '') {
70
- return `Path unavailable`;
71
- }
72
- const relativePath = makeRelative(params.absolute_path, this.config.getTargetDir());
73
- let description = shortenPath(relativePath);
74
- if (params.offset !== undefined && params.limit !== undefined) {
75
- description += ` (lines ${params.offset + 1}-${params.offset + params.limit})`;
76
- }
77
- else if (params.limit !== undefined) {
78
- description += ` (first ${params.limit} lines)`;
79
- }
80
- return description;
81
- }
82
- toolLocations(params) {
83
- return [{ path: params.absolute_path, line: params.offset }];
84
- }
85
- async execute(params, _signal) {
86
- const validationError = this.validateToolParams(params);
87
- if (validationError) {
88
- return {
89
- llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
90
- returnDisplay: validationError,
91
- };
92
- }
93
- const result = await processSingleFileContent(params.absolute_path, this.config.getTargetDir(), params.offset, params.limit);
94
- if (result.error) {
95
- return {
96
- llmContent: result.error, // The detailed error for LLM
97
- returnDisplay: result.returnDisplay || 'Error reading file', // User-friendly error
98
- };
99
- }
100
- const lines = typeof result.llmContent === 'string'
101
- ? result.llmContent.split('\n').length
102
- : undefined;
103
- const mimetype = getSpecificMimeType(params.absolute_path);
104
- recordFileOperationMetric(this.config, FileOperation.READ, lines, mimetype, path.extname(params.absolute_path));
105
- return {
106
- llmContent: result.llmContent || '',
107
- returnDisplay: result.returnDisplay || '',
108
- };
120
+ createInvocation(params) {
121
+ return new ReadFileToolInvocation(this.config, params);
109
122
  }
110
123
  }
111
124
  //# sourceMappingURL=read-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
@@ -31,169 +31,251 @@ describe('ReadFileTool', () => {
31
31
  await fsp.rm(tempRootDir, { recursive: true, force: true });
32
32
  }
33
33
  });
34
- describe('validateToolParams', () => {
35
- it('should return null for valid params (absolute path within root)', () => {
34
+ describe('build', () => {
35
+ it('should return an invocation for valid params (absolute path within root)', () => {
36
36
  const params = {
37
37
  absolute_path: path.join(tempRootDir, 'test.txt'),
38
38
  };
39
- expect(tool.validateToolParams(params)).toBeNull();
39
+ const result = tool.build(params);
40
+ expect(result).not.toBeTypeOf('string');
41
+ expect(typeof result).toBe('object');
42
+ expect(result.params).toEqual(params);
40
43
  });
41
- it('should return null for valid params with offset and limit', () => {
44
+ it('should return an invocation for valid params with offset and limit', () => {
42
45
  const params = {
43
46
  absolute_path: path.join(tempRootDir, 'test.txt'),
44
47
  offset: 0,
45
48
  limit: 10,
46
49
  };
47
- expect(tool.validateToolParams(params)).toBeNull();
50
+ const result = tool.build(params);
51
+ expect(result).not.toBeTypeOf('string');
48
52
  });
49
- it('should return error for relative path', () => {
53
+ it('should throw error for relative path', () => {
50
54
  const params = { absolute_path: 'test.txt' };
51
- expect(tool.validateToolParams(params)).toBe(`File path must be absolute, but was relative: test.txt. You must provide an absolute path.`);
55
+ expect(() => tool.build(params)).toThrow(`File path must be absolute, but was relative: test.txt. You must provide an absolute path.`);
52
56
  });
53
- it('should return error for path outside root', () => {
57
+ it('should throw error for path outside root', () => {
54
58
  const outsidePath = path.resolve(os.tmpdir(), 'outside-root.txt');
55
59
  const params = { absolute_path: outsidePath };
56
- const error = tool.validateToolParams(params);
57
- expect(error).toContain('File path must be within one of the workspace directories');
60
+ expect(() => tool.build(params)).toThrow('File path must be within one of the workspace directories');
58
61
  });
59
- it('should return error for negative offset', () => {
62
+ it('should throw error for negative offset', () => {
60
63
  const params = {
61
64
  absolute_path: path.join(tempRootDir, 'test.txt'),
62
65
  offset: -1,
63
66
  limit: 10,
64
67
  };
65
- expect(tool.validateToolParams(params)).toBe('Offset must be a non-negative number');
68
+ expect(() => tool.build(params)).toThrow('Offset must be a non-negative number');
66
69
  });
67
- it('should return error for non-positive limit', () => {
70
+ it('should throw error for non-positive limit', () => {
68
71
  const paramsZero = {
69
72
  absolute_path: path.join(tempRootDir, 'test.txt'),
70
73
  offset: 0,
71
74
  limit: 0,
72
75
  };
73
- expect(tool.validateToolParams(paramsZero)).toBe('Limit must be a positive number');
76
+ expect(() => tool.build(paramsZero)).toThrow('Limit must be a positive number');
74
77
  const paramsNegative = {
75
78
  absolute_path: path.join(tempRootDir, 'test.txt'),
76
79
  offset: 0,
77
80
  limit: -5,
78
81
  };
79
- expect(tool.validateToolParams(paramsNegative)).toBe('Limit must be a positive number');
82
+ expect(() => tool.build(paramsNegative)).toThrow('Limit must be a positive number');
80
83
  });
81
- it('should return error for schema validation failure (e.g. missing path)', () => {
84
+ it('should throw error for schema validation failure (e.g. missing path)', () => {
82
85
  const params = { offset: 0 };
83
- expect(tool.validateToolParams(params)).toBe(`params must have required property 'absolute_path'`);
86
+ expect(() => tool.build(params)).toThrow(`params must have required property 'absolute_path'`);
84
87
  });
85
88
  });
86
- describe('getDescription', () => {
87
- it('should return a shortened, relative path', () => {
88
- const filePath = path.join(tempRootDir, 'sub', 'dir', 'file.txt');
89
- const params = { absolute_path: filePath };
90
- expect(tool.getDescription(params)).toBe(path.join('sub', 'dir', 'file.txt'));
91
- });
92
- it('should return . if path is the root directory', () => {
93
- const params = { absolute_path: tempRootDir };
94
- expect(tool.getDescription(params)).toBe('.');
95
- });
96
- });
97
- describe('execute', () => {
98
- it('should return validation error if params are invalid', async () => {
99
- const params = {
100
- absolute_path: 'relative/path.txt',
101
- };
102
- expect(await tool.execute(params, abortSignal)).toEqual({
103
- llmContent: 'Error: Invalid parameters provided. Reason: File path must be absolute, but was relative: relative/path.txt. You must provide an absolute path.',
104
- returnDisplay: 'File path must be absolute, but was relative: relative/path.txt. You must provide an absolute path.',
89
+ describe('ToolInvocation', () => {
90
+ describe('getDescription', () => {
91
+ it('should return a shortened, relative path', () => {
92
+ const filePath = path.join(tempRootDir, 'sub', 'dir', 'file.txt');
93
+ const params = { absolute_path: filePath };
94
+ const invocation = tool.build(params);
95
+ expect(typeof invocation).not.toBe('string');
96
+ expect(invocation.getDescription()).toBe(path.join('sub', 'dir', 'file.txt'));
105
97
  });
106
- });
107
- it('should return error if file does not exist', async () => {
108
- const filePath = path.join(tempRootDir, 'nonexistent.txt');
109
- const params = { absolute_path: filePath };
110
- expect(await tool.execute(params, abortSignal)).toEqual({
111
- llmContent: `File not found: ${filePath}`,
112
- returnDisplay: 'File not found.',
98
+ it('should return . if path is the root directory', () => {
99
+ const params = { absolute_path: tempRootDir };
100
+ const invocation = tool.build(params);
101
+ expect(typeof invocation).not.toBe('string');
102
+ expect(invocation.getDescription()).toBe('.');
113
103
  });
114
104
  });
115
- it('should return success result for a text file', async () => {
116
- const filePath = path.join(tempRootDir, 'textfile.txt');
117
- const fileContent = 'This is a test file.';
118
- await fsp.writeFile(filePath, fileContent, 'utf-8');
119
- const params = { absolute_path: filePath };
120
- expect(await tool.execute(params, abortSignal)).toEqual({
121
- llmContent: fileContent,
122
- returnDisplay: '',
105
+ describe('execute', () => {
106
+ it('should return error if file does not exist', async () => {
107
+ const filePath = path.join(tempRootDir, 'nonexistent.txt');
108
+ const params = { absolute_path: filePath };
109
+ const invocation = tool.build(params);
110
+ expect(await invocation.execute(abortSignal)).toEqual({
111
+ llmContent: `File not found: ${filePath}`,
112
+ returnDisplay: 'File not found.',
113
+ });
123
114
  });
124
- });
125
- it('should return success result for an image file', async () => {
126
- // A minimal 1x1 transparent PNG file.
127
- const pngContent = Buffer.from([
128
- 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0,
129
- 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 10, 73, 68, 65,
130
- 84, 120, 156, 99, 0, 1, 0, 0, 5, 0, 1, 13, 10, 45, 180, 0, 0, 0, 0, 73,
131
- 69, 78, 68, 174, 66, 96, 130,
132
- ]);
133
- const filePath = path.join(tempRootDir, 'image.png');
134
- await fsp.writeFile(filePath, pngContent);
135
- const params = { absolute_path: filePath };
136
- expect(await tool.execute(params, abortSignal)).toEqual({
137
- llmContent: {
138
- inlineData: {
139
- mimeType: 'image/png',
140
- data: pngContent.toString('base64'),
115
+ it('should return success result for a text file', async () => {
116
+ const filePath = path.join(tempRootDir, 'textfile.txt');
117
+ const fileContent = 'This is a test file.';
118
+ await fsp.writeFile(filePath, fileContent, 'utf-8');
119
+ const params = { absolute_path: filePath };
120
+ const invocation = tool.build(params);
121
+ expect(await invocation.execute(abortSignal)).toEqual({
122
+ llmContent: fileContent,
123
+ returnDisplay: '',
124
+ });
125
+ });
126
+ it('should return success result for an image file', async () => {
127
+ // A minimal 1x1 transparent PNG file.
128
+ const pngContent = Buffer.from([
129
+ 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0,
130
+ 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 10, 73, 68,
131
+ 65, 84, 120, 156, 99, 0, 1, 0, 0, 5, 0, 1, 13, 10, 45, 180, 0, 0, 0,
132
+ 0, 73, 69, 78, 68, 174, 66, 96, 130,
133
+ ]);
134
+ const filePath = path.join(tempRootDir, 'image.png');
135
+ await fsp.writeFile(filePath, pngContent);
136
+ const params = { absolute_path: filePath };
137
+ const invocation = tool.build(params);
138
+ expect(await invocation.execute(abortSignal)).toEqual({
139
+ llmContent: {
140
+ inlineData: {
141
+ mimeType: 'image/png',
142
+ data: pngContent.toString('base64'),
143
+ },
141
144
  },
142
- },
143
- returnDisplay: `Read image file: image.png`,
145
+ returnDisplay: `Read image file: image.png`,
146
+ });
144
147
  });
145
- });
146
- it('should treat a non-image file with image extension as an image', async () => {
147
- const filePath = path.join(tempRootDir, 'fake-image.png');
148
- const fileContent = 'This is not a real png.';
149
- await fsp.writeFile(filePath, fileContent, 'utf-8');
150
- const params = { absolute_path: filePath };
151
- expect(await tool.execute(params, abortSignal)).toEqual({
152
- llmContent: {
153
- inlineData: {
154
- mimeType: 'image/png',
155
- data: Buffer.from(fileContent).toString('base64'),
148
+ it('should treat a non-image file with image extension as an image', async () => {
149
+ const filePath = path.join(tempRootDir, 'fake-image.png');
150
+ const fileContent = 'This is not a real png.';
151
+ await fsp.writeFile(filePath, fileContent, 'utf-8');
152
+ const params = { absolute_path: filePath };
153
+ const invocation = tool.build(params);
154
+ expect(await invocation.execute(abortSignal)).toEqual({
155
+ llmContent: {
156
+ inlineData: {
157
+ mimeType: 'image/png',
158
+ data: Buffer.from(fileContent).toString('base64'),
159
+ },
156
160
  },
157
- },
158
- returnDisplay: `Read image file: fake-image.png`,
161
+ returnDisplay: `Read image file: fake-image.png`,
162
+ });
159
163
  });
160
- });
161
- it('should pass offset and limit to read a slice of a text file', async () => {
162
- const filePath = path.join(tempRootDir, 'paginated.txt');
163
- const fileContent = Array.from({ length: 20 }, (_, i) => `Line ${i + 1}`).join('\n');
164
- await fsp.writeFile(filePath, fileContent, 'utf-8');
165
- const params = {
166
- absolute_path: filePath,
167
- offset: 5, // Start from line 6
168
- limit: 3,
169
- };
170
- expect(await tool.execute(params, abortSignal)).toEqual({
171
- llmContent: [
172
- '[File content truncated. Showing lines 6-8 of 20. To read the next chunk, use offset: 8, limit: 3.]',
173
- 'Line 6',
174
- 'Line 7',
175
- 'Line 8',
176
- ].join('\n'),
177
- returnDisplay: 'Read lines 6-8 of 20 from paginated.txt',
164
+ it('should return a structured message when a slice of a text file is read', async () => {
165
+ const filePath = path.join(tempRootDir, 'paginated.txt');
166
+ const fileContent = Array.from({ length: 20 }, (_, i) => `Line ${i + 1}`).join('\n');
167
+ await fsp.writeFile(filePath, fileContent, 'utf-8');
168
+ const params = {
169
+ absolute_path: filePath,
170
+ offset: 5, // Start from line 6
171
+ limit: 3,
172
+ };
173
+ const invocation = tool.build(params);
174
+ const result = await invocation.execute(abortSignal);
175
+ const expectedLlmContent = `
176
+ IMPORTANT: The file content has been truncated.
177
+ Status: Showing lines 6-8 of 20 total lines.
178
+ Action: To read more of the file, you can use the 'offset' and 'limit' parameters in a subsequent 'read_file' call. For example, to read the next section of the file, use offset: 8.
179
+
180
+ --- FILE CONTENT (truncated) ---
181
+ Line 6
182
+ Line 7
183
+ Line 8`;
184
+ expect(result.llmContent).toEqual(expectedLlmContent);
185
+ expect(result.returnDisplay).toBe('Read lines 6-8 of 20 from paginated.txt');
178
186
  });
179
- });
180
- describe('with .llxprtignore', () => {
181
- beforeEach(async () => {
182
- await fsp.writeFile(path.join(tempRootDir, '.llxprtignore'), ['foo.*', 'ignored/'].join('\n'));
187
+ describe('with .llxprtignore', () => {
188
+ beforeEach(async () => {
189
+ await fsp.writeFile(path.join(tempRootDir, '.llxprtignore'), ['foo.*', 'ignored/'].join('\n'));
190
+ });
191
+ it('should throw error if path is ignored by a .llxprtignore pattern', async () => {
192
+ const ignoredFilePath = path.join(tempRootDir, 'foo.bar');
193
+ await fsp.writeFile(ignoredFilePath, 'content', 'utf-8');
194
+ const params = {
195
+ absolute_path: ignoredFilePath,
196
+ };
197
+ const expectedError = `File path '${ignoredFilePath}' is ignored by .llxprtignore pattern(s).`;
198
+ expect(() => tool.build(params)).toThrow(expectedError);
199
+ });
200
+ });
201
+ it('should return success result for a text file', async () => {
202
+ const filePath = path.join(tempRootDir, 'textfile.txt');
203
+ const fileContent = 'This is a test file.';
204
+ await fsp.writeFile(filePath, fileContent, 'utf-8');
205
+ const params = { absolute_path: filePath };
206
+ const invocation = tool.build(params);
207
+ expect(await invocation.execute(abortSignal)).toEqual({
208
+ llmContent: fileContent,
209
+ returnDisplay: '',
210
+ });
183
211
  });
184
- it('should return error if path is ignored by a .llxprtignore pattern', async () => {
185
- const ignoredFilePath = path.join(tempRootDir, 'foo.bar');
186
- await fsp.writeFile(ignoredFilePath, 'content', 'utf-8');
212
+ it('should return success result for an image file', async () => {
213
+ // A minimal 1x1 transparent PNG file.
214
+ const pngContent = Buffer.from([
215
+ 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0,
216
+ 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 10, 73, 68,
217
+ 65, 84, 120, 156, 99, 0, 1, 0, 0, 5, 0, 1, 13, 10, 45, 180, 0, 0, 0,
218
+ 0, 73, 69, 78, 68, 174, 66, 96, 130,
219
+ ]);
220
+ const filePath = path.join(tempRootDir, 'image.png');
221
+ await fsp.writeFile(filePath, pngContent);
222
+ const params = { absolute_path: filePath };
223
+ const invocation = tool.build(params);
224
+ expect(await invocation.execute(abortSignal)).toEqual({
225
+ llmContent: {
226
+ inlineData: {
227
+ mimeType: 'image/png',
228
+ data: pngContent.toString('base64'),
229
+ },
230
+ },
231
+ returnDisplay: `Read image file: image.png`,
232
+ });
233
+ });
234
+ it('should treat a non-image file with image extension as an image', async () => {
235
+ const filePath = path.join(tempRootDir, 'fake-image.png');
236
+ const fileContent = 'This is not a real png.';
237
+ await fsp.writeFile(filePath, fileContent, 'utf-8');
238
+ const params = { absolute_path: filePath };
239
+ const invocation = tool.build(params);
240
+ expect(await invocation.execute(abortSignal)).toEqual({
241
+ llmContent: {
242
+ inlineData: {
243
+ mimeType: 'image/png',
244
+ data: Buffer.from(fileContent).toString('base64'),
245
+ },
246
+ },
247
+ returnDisplay: `Read image file: fake-image.png`,
248
+ });
249
+ });
250
+ it('should pass offset and limit to read a slice of a text file', async () => {
251
+ const filePath = path.join(tempRootDir, 'paginated.txt');
252
+ const fileContent = Array.from({ length: 20 }, (_, i) => `Line ${i + 1}`).join('\n');
253
+ await fsp.writeFile(filePath, fileContent, 'utf-8');
187
254
  const params = {
188
- absolute_path: ignoredFilePath,
255
+ absolute_path: filePath,
256
+ offset: 5, // Start from line 6
257
+ limit: 3,
189
258
  };
190
- const expectedError = `File path '${ignoredFilePath}' is ignored by .llxprtignore pattern(s).`;
191
- expect(await tool.execute(params, abortSignal)).toEqual({
192
- llmContent: `Error: Invalid parameters provided. Reason: ${expectedError}`,
193
- returnDisplay: expectedError,
194
- });
259
+ const invocation = tool.build(params);
260
+ const result = await invocation.execute(abortSignal);
261
+ const expectedLlmContent = `
262
+ IMPORTANT: The file content has been truncated.
263
+ Status: Showing lines 6-8 of 20 total lines.
264
+ Action: To read more of the file, you can use the 'offset' and 'limit' parameters in a subsequent 'read_file' call. For example, to read the next section of the file, use offset: 8.
265
+
266
+ --- FILE CONTENT (truncated) ---
267
+ Line 6
268
+ Line 7
269
+ Line 8`;
270
+ expect(result.llmContent).toEqual(expectedLlmContent);
271
+ expect(result.returnDisplay).toBe('Read lines 6-8 of 20 from paginated.txt');
195
272
  });
196
- it('should return error if path is in an ignored directory', async () => {
273
+ });
274
+ describe('with .llxprtignore for ignored directory', () => {
275
+ beforeEach(async () => {
276
+ await fsp.writeFile(path.join(tempRootDir, '.llxprtignore'), ['foo.*', 'ignored/'].join('\n'));
277
+ });
278
+ it('should throw error if path is in an ignored directory', async () => {
197
279
  const ignoredDirPath = path.join(tempRootDir, 'ignored');
198
280
  await fsp.mkdir(ignoredDirPath);
199
281
  const filePath = path.join(ignoredDirPath, 'somefile.txt');
@@ -202,10 +284,7 @@ describe('ReadFileTool', () => {
202
284
  absolute_path: filePath,
203
285
  };
204
286
  const expectedError = `File path '${filePath}' is ignored by .llxprtignore pattern(s).`;
205
- expect(await tool.execute(params, abortSignal)).toEqual({
206
- llmContent: `Error: Invalid parameters provided. Reason: ${expectedError}`,
207
- returnDisplay: expectedError,
208
- });
287
+ expect(() => tool.build(params)).toThrow(expectedError);
209
288
  });
210
289
  });
211
290
  });
@@ -214,24 +293,20 @@ describe('ReadFileTool', () => {
214
293
  const params = {
215
294
  absolute_path: path.join(tempRootDir, 'file.txt'),
216
295
  };
217
- expect(tool.validateToolParams(params)).toBeNull();
296
+ expect(() => tool.build(params)).not.toThrow();
218
297
  });
219
298
  it('should reject paths outside workspace root', () => {
220
299
  const params = {
221
300
  absolute_path: '/etc/passwd',
222
301
  };
223
- const error = tool.validateToolParams(params);
224
- expect(error).toContain('File path must be within one of the workspace directories');
225
- expect(error).toContain(tempRootDir);
302
+ expect(() => tool.build(params)).toThrow('File path must be within one of the workspace directories');
226
303
  });
227
304
  it('should provide clear error message with workspace directories', () => {
228
305
  const outsidePath = path.join(os.tmpdir(), 'outside-workspace.txt');
229
306
  const params = {
230
307
  absolute_path: outsidePath,
231
308
  };
232
- const error = tool.validateToolParams(params);
233
- expect(error).toContain('File path must be within one of the workspace directories');
234
- expect(error).toContain(tempRootDir);
309
+ expect(() => tool.build(params)).toThrow('File path must be within one of the workspace directories');
235
310
  });
236
311
  });
237
312
  });
@@ -1 +1 @@
1
- {"version":3,"file":"read-file.test.js","sourceRoot":"","sources":["../../../src/tools/read-file.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read-file.test.js","sourceRoot":"","sources":["../../../src/tools/read-file.test.ts"],"names":[],"mappings":"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"}