@vybestack/llxprt-code-core 0.1.14 → 0.1.15

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 (206) hide show
  1. package/README.md +53 -0
  2. package/dist/src/code_assist/oauth2.test.d.ts +1 -1
  3. package/dist/src/code_assist/oauth2.test.js +15 -15
  4. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  5. package/dist/src/config/config.d.ts +15 -1
  6. package/dist/src/config/config.js +27 -5
  7. package/dist/src/config/config.js.map +1 -1
  8. package/dist/src/config/config.test.js +5 -0
  9. package/dist/src/config/config.test.js.map +1 -1
  10. package/dist/src/config/flashFallback.test.js +12 -46
  11. package/dist/src/config/flashFallback.test.js.map +1 -1
  12. package/dist/src/config/models.d.ts +1 -0
  13. package/dist/src/config/models.js +1 -0
  14. package/dist/src/config/models.js.map +1 -1
  15. package/dist/src/core/client.d.ts +4 -0
  16. package/dist/src/core/client.js +75 -15
  17. package/dist/src/core/client.js.map +1 -1
  18. package/dist/src/core/client.test.d.ts +1 -1
  19. package/dist/src/core/client.test.js +204 -22
  20. package/dist/src/core/client.test.js.map +1 -1
  21. package/dist/src/core/contentGenerator.js +2 -7
  22. package/dist/src/core/contentGenerator.js.map +1 -1
  23. package/dist/src/core/contentGenerator.test.js +6 -2
  24. package/dist/src/core/contentGenerator.test.js.map +1 -1
  25. package/dist/src/core/coreToolScheduler.d.ts +1 -3
  26. package/dist/src/core/coreToolScheduler.js +9 -4
  27. package/dist/src/core/coreToolScheduler.js.map +1 -1
  28. package/dist/src/core/coreToolScheduler.test.js +76 -1
  29. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  30. package/dist/src/core/geminiChat.js +1 -0
  31. package/dist/src/core/geminiChat.js.map +1 -1
  32. package/dist/src/core/googleGenAIWrapper.d.ts +21 -0
  33. package/dist/src/core/googleGenAIWrapper.js +36 -0
  34. package/dist/src/core/googleGenAIWrapper.js.map +1 -0
  35. package/dist/src/core/googleGenAIWrapper.test.d.ts +6 -0
  36. package/dist/src/core/googleGenAIWrapper.test.js +104 -0
  37. package/dist/src/core/googleGenAIWrapper.test.js.map +1 -0
  38. package/dist/src/core/logger.d.ts +1 -0
  39. package/dist/src/core/logger.js +22 -8
  40. package/dist/src/core/logger.js.map +1 -1
  41. package/dist/src/core/logger.test.js +60 -9
  42. package/dist/src/core/logger.test.js.map +1 -1
  43. package/dist/src/core/nonInteractiveToolExecutor.js +8 -1
  44. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  45. package/dist/src/core/nonInteractiveToolExecutor.test.js +3 -1
  46. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  47. package/dist/src/core/prompts.js +1 -1
  48. package/dist/src/core/tokenLimits.js +1 -0
  49. package/dist/src/core/tokenLimits.js.map +1 -1
  50. package/dist/src/core/turn.d.ts +2 -1
  51. package/dist/src/core/turn.js +4 -2
  52. package/dist/src/core/turn.js.map +1 -1
  53. package/dist/src/core/turn.test.js +2 -2
  54. package/dist/src/core/turn.test.js.map +1 -1
  55. package/dist/src/ide/ide-client.d.ts +8 -6
  56. package/dist/src/ide/ide-client.js +73 -36
  57. package/dist/src/ide/ide-client.js.map +1 -1
  58. package/dist/src/ide/ideContext.d.ts +212 -107
  59. package/dist/src/ide/ideContext.js +45 -44
  60. package/dist/src/ide/ideContext.js.map +1 -1
  61. package/dist/src/ide/ideContext.test.js +254 -100
  62. package/dist/src/ide/ideContext.test.js.map +1 -1
  63. package/dist/src/index.d.ts +7 -0
  64. package/dist/src/index.js +9 -0
  65. package/dist/src/index.js.map +1 -1
  66. package/dist/src/integration-tests/todo-system.test.d.ts +6 -0
  67. package/dist/src/integration-tests/todo-system.test.js +610 -0
  68. package/dist/src/integration-tests/todo-system.test.js.map +1 -0
  69. package/dist/src/mcp/oauth-provider.d.ts +5 -1
  70. package/dist/src/mcp/oauth-provider.js +36 -11
  71. package/dist/src/mcp/oauth-provider.js.map +1 -1
  72. package/dist/src/mcp/oauth-provider.test.js +2 -2
  73. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  74. package/dist/src/mcp/oauth-token-storage.d.ts +3 -1
  75. package/dist/src/mcp/oauth-token-storage.js +3 -1
  76. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  77. package/dist/src/mcp/oauth-utils.js +2 -2
  78. package/dist/src/mcp/oauth-utils.js.map +1 -1
  79. package/dist/src/mcp/oauth-utils.test.js +1 -1
  80. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  81. package/dist/src/prompts/mcp-prompts.d.ts +8 -0
  82. package/dist/src/prompts/mcp-prompts.js +13 -0
  83. package/dist/src/prompts/mcp-prompts.js.map +1 -0
  84. package/dist/src/prompts/prompt-registry.d.ts +26 -0
  85. package/dist/src/prompts/prompt-registry.js +47 -0
  86. package/dist/src/prompts/prompt-registry.js.map +1 -0
  87. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +24 -9
  88. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +1 -1
  89. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +1 -1
  90. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +1 -1
  91. package/dist/src/providers/gemini/GeminiProvider.js +8 -16
  92. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  93. package/dist/src/providers/openai/OpenAIProvider.js +54 -6
  94. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  95. package/dist/src/services/complexity-analyzer.d.ts +92 -0
  96. package/dist/src/services/complexity-analyzer.js +287 -0
  97. package/dist/src/services/complexity-analyzer.js.map +1 -0
  98. package/dist/src/services/fileDiscoveryService.test.js +101 -60
  99. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  100. package/dist/src/services/gitService.test.d.ts +1 -1
  101. package/dist/src/services/gitService.test.js +65 -102
  102. package/dist/src/services/gitService.test.js.map +1 -1
  103. package/dist/src/services/index.d.ts +9 -0
  104. package/dist/src/services/index.js +8 -0
  105. package/dist/src/services/index.js.map +1 -0
  106. package/dist/src/services/loopDetectionService.d.ts +3 -0
  107. package/dist/src/services/loopDetectionService.js +18 -0
  108. package/dist/src/services/loopDetectionService.js.map +1 -1
  109. package/dist/src/services/loopDetectionService.test.js +90 -11
  110. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  111. package/dist/src/services/shellExecutionService.d.ts +70 -0
  112. package/dist/src/services/shellExecutionService.js +152 -0
  113. package/dist/src/services/shellExecutionService.js.map +1 -0
  114. package/dist/src/services/shellExecutionService.test.d.ts +6 -0
  115. package/dist/src/services/shellExecutionService.test.js +258 -0
  116. package/dist/src/services/shellExecutionService.test.js.map +1 -0
  117. package/dist/src/services/todo-reminder-service.d.ts +42 -0
  118. package/dist/src/services/todo-reminder-service.js +77 -0
  119. package/dist/src/services/todo-reminder-service.js.map +1 -0
  120. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -1
  121. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +59 -31
  122. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  123. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +3 -1
  124. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +7 -0
  125. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  126. package/dist/src/telemetry/constants.d.ts +1 -0
  127. package/dist/src/telemetry/constants.js +1 -0
  128. package/dist/src/telemetry/constants.js.map +1 -1
  129. package/dist/src/telemetry/index.d.ts +2 -2
  130. package/dist/src/telemetry/index.js +2 -2
  131. package/dist/src/telemetry/index.js.map +1 -1
  132. package/dist/src/telemetry/loggers.d.ts +2 -1
  133. package/dist/src/telemetry/loggers.js +18 -1
  134. package/dist/src/telemetry/loggers.js.map +1 -1
  135. package/dist/src/telemetry/loggers.test.js +5 -0
  136. package/dist/src/telemetry/loggers.test.js.map +1 -1
  137. package/dist/src/telemetry/types.d.ts +8 -1
  138. package/dist/src/telemetry/types.js +12 -0
  139. package/dist/src/telemetry/types.js.map +1 -1
  140. package/dist/src/tools/edit.js +2 -1
  141. package/dist/src/tools/edit.js.map +1 -1
  142. package/dist/src/tools/glob.test.js +7 -4
  143. package/dist/src/tools/glob.test.js.map +1 -1
  144. package/dist/src/tools/grep.test.js +4 -4
  145. package/dist/src/tools/grep.test.js.map +1 -1
  146. package/dist/src/tools/mcp-client.d.ts +26 -2
  147. package/dist/src/tools/mcp-client.js +64 -21
  148. package/dist/src/tools/mcp-client.js.map +1 -1
  149. package/dist/src/tools/mcp-client.test.js +53 -1
  150. package/dist/src/tools/mcp-client.test.js.map +1 -1
  151. package/dist/src/tools/modifiable-tool.test.js +51 -62
  152. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  153. package/dist/src/tools/shell.d.ts +8 -3
  154. package/dist/src/tools/shell.js +169 -114
  155. package/dist/src/tools/shell.js.map +1 -1
  156. package/dist/src/tools/shell.test.d.ts +1 -1
  157. package/dist/src/tools/shell.test.js +298 -145
  158. package/dist/src/tools/shell.test.js.map +1 -1
  159. package/dist/src/tools/todo-read.d.ts +4 -1
  160. package/dist/src/tools/todo-read.js +136 -20
  161. package/dist/src/tools/todo-read.js.map +1 -1
  162. package/dist/src/tools/todo-read.test.js +10 -6
  163. package/dist/src/tools/todo-read.test.js.map +1 -1
  164. package/dist/src/tools/todo-schemas.d.ts +4 -4
  165. package/dist/src/tools/todo-write.d.ts +3 -0
  166. package/dist/src/tools/todo-write.js +96 -9
  167. package/dist/src/tools/todo-write.js.map +1 -1
  168. package/dist/src/tools/todo-write.test.js +17 -13
  169. package/dist/src/tools/todo-write.test.js.map +1 -1
  170. package/dist/src/tools/tool-context.d.ts +14 -0
  171. package/dist/src/tools/tool-context.js +7 -0
  172. package/dist/src/tools/tool-context.js.map +1 -0
  173. package/dist/src/tools/tool-registry.d.ts +4 -1
  174. package/dist/src/tools/tool-registry.js +14 -5
  175. package/dist/src/tools/tool-registry.js.map +1 -1
  176. package/dist/src/tools/tool-registry.test.js +2 -2
  177. package/dist/src/tools/tool-registry.test.js.map +1 -1
  178. package/dist/src/tools/tools.d.ts +8 -1
  179. package/dist/src/tools/tools.js +2 -0
  180. package/dist/src/tools/tools.js.map +1 -1
  181. package/dist/src/tools/web-fetch.js +18 -4
  182. package/dist/src/tools/web-fetch.js.map +1 -1
  183. package/dist/src/utils/bfsFileSearch.js +51 -27
  184. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  185. package/dist/src/utils/bfsFileSearch.test.js +57 -0
  186. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  187. package/dist/src/utils/formatters.d.ts +6 -0
  188. package/dist/src/utils/formatters.js +16 -0
  189. package/dist/src/utils/formatters.js.map +1 -0
  190. package/dist/src/utils/nextSpeakerChecker.js +2 -2
  191. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  192. package/dist/src/utils/nextSpeakerChecker.test.js +2 -2
  193. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  194. package/dist/src/utils/retry.d.ts +3 -0
  195. package/dist/src/utils/retry.js.map +1 -1
  196. package/dist/src/utils/retry.test.js.map +1 -1
  197. package/dist/src/utils/shell-utils.d.ts +37 -3
  198. package/dist/src/utils/shell-utils.js +110 -47
  199. package/dist/src/utils/shell-utils.js.map +1 -1
  200. package/dist/src/utils/shell-utils.test.js +146 -396
  201. package/dist/src/utils/shell-utils.test.js.map +1 -1
  202. package/dist/src/utils/textUtils.d.ts +13 -0
  203. package/dist/src/utils/textUtils.js +28 -0
  204. package/dist/src/utils/textUtils.js.map +1 -0
  205. package/package.json +2 -2
  206. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,162 +1,315 @@
1
1
  /**
2
2
  * @license
3
- * Copyright 2025 Google LLC
3
+ * Copyright 2025 Vybestack LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { expect, describe, it, vi, beforeEach } from 'vitest';
6
+ import { vi, describe, it, expect, beforeEach, afterEach, } from 'vitest';
7
+ const mockShellExecutionService = vi.hoisted(() => vi.fn());
8
+ vi.mock('../services/shellExecutionService.js', () => ({
9
+ ShellExecutionService: { execute: mockShellExecutionService },
10
+ }));
11
+ vi.mock('fs');
12
+ vi.mock('os');
13
+ vi.mock('crypto');
14
+ vi.mock('../utils/summarizer.js');
15
+ import { isCommandAllowed } from '../utils/shell-utils.js';
7
16
  import { ShellTool } from './shell.js';
17
+ import * as fs from 'fs';
18
+ import * as os from 'os';
19
+ import * as path from 'path';
20
+ import * as crypto from 'crypto';
8
21
  import * as summarizer from '../utils/summarizer.js';
9
- import os from 'os';
10
- // Mock execa module
11
- vi.mock('execa', () => ({
12
- execaCommandSync: vi.fn((command) => {
13
- // The shell.ts wraps commands in a specific format with pwd capture
14
- // Extract the actual command from the wrapped format
15
- let actualCommand = command;
16
- // Check if it's the wrapped format used by shell.ts
17
- const wrappedMatch = command.match(/bash\s+-c\s+'{\s*(.+?)\s*};\s*__code=\$\?;/);
18
- if (wrappedMatch) {
19
- actualCommand = wrappedMatch[1];
20
- }
21
- // Parse the command to extract the actual command being run
22
- if (actualCommand.includes('echo hello') ||
23
- actualCommand.includes('echo "hello"')) {
24
- return {
25
- stdout: 'hello\n',
26
- stderr: '',
27
- all: 'hello\n',
28
- exitCode: 0,
29
- command,
30
- };
31
- }
32
- if (actualCommand.includes('echo $GEMINI_CLI') ||
33
- actualCommand.includes('echo "$GEMINI_CLI"')) {
34
- return {
35
- stdout: '1\n',
36
- stderr: '',
37
- all: '1\n',
38
- exitCode: 0,
39
- command,
40
- };
41
- }
42
- // Default case for unknown commands
43
- throw Object.assign(new Error(`Command failed with exit code 127: ${command}`), {
44
- exitCode: 127,
45
- stdout: '',
46
- stderr: 'bash: command not found',
47
- all: 'bash: command not found',
48
- command,
49
- });
50
- }),
51
- }));
52
- describe('ShellTool Bug Reproduction', () => {
22
+ import { OUTPUT_UPDATE_INTERVAL_MS } from './shell.js';
23
+ describe('ShellTool', () => {
53
24
  let shellTool;
54
- let config;
25
+ let mockConfig;
26
+ let mockShellOutputCallback;
27
+ let resolveExecutionPromise;
55
28
  beforeEach(() => {
56
- config = {
57
- getCoreTools: () => undefined,
58
- getExcludeTools: () => undefined,
59
- getDebugMode: () => false,
60
- getGeminiClient: () => ({}),
61
- getTargetDir: () => '.',
62
- getSummarizeToolOutputConfig: () => ({
63
- [shellTool.name]: {},
64
- }),
65
- };
66
- shellTool = new ShellTool(config);
67
- });
68
- it('should not let the summarizer override the return display', async () => {
69
- const summarizeSpy = vi
70
- .spyOn(summarizer, 'summarizeToolOutput')
71
- .mockResolvedValue('summarized output');
72
- const abortSignal = new AbortController().signal;
73
- const result = await shellTool.execute({ command: 'echo hello' }, abortSignal);
74
- expect(result.returnDisplay).toBe('hello' + os.EOL);
75
- expect(result.llmContent).toBe('summarized output');
76
- expect(summarizeSpy).toHaveBeenCalled();
77
- });
78
- it('should not call summarizer if disabled in config', async () => {
79
- config = {
80
- getCoreTools: () => undefined,
81
- getExcludeTools: () => undefined,
82
- getDebugMode: () => false,
83
- getGeminiClient: () => ({}),
84
- getTargetDir: () => '.',
85
- getSummarizeToolOutputConfig: () => ({}),
29
+ vi.clearAllMocks();
30
+ mockConfig = {
31
+ getCoreTools: vi.fn().mockReturnValue([]),
32
+ getExcludeTools: vi.fn().mockReturnValue([]),
33
+ getDebugMode: vi.fn().mockReturnValue(false),
34
+ getTargetDir: vi.fn().mockReturnValue('/test/dir'),
35
+ getSummarizeToolOutputConfig: vi.fn().mockReturnValue(undefined),
36
+ getGeminiClient: vi.fn(),
86
37
  };
87
- shellTool = new ShellTool(config);
88
- const summarizeSpy = vi
89
- .spyOn(summarizer, 'summarizeToolOutput')
90
- .mockResolvedValue('summarized output');
91
- const abortSignal = new AbortController().signal;
92
- const result = await shellTool.execute({ command: 'echo hello' }, abortSignal);
93
- expect(result.returnDisplay).toBe('hello' + os.EOL);
94
- expect(result.llmContent).not.toBe('summarized output');
95
- expect(summarizeSpy).not.toHaveBeenCalled();
38
+ shellTool = new ShellTool(mockConfig);
39
+ vi.mocked(os.platform).mockReturnValue('linux');
40
+ vi.mocked(os.tmpdir).mockReturnValue('/tmp');
41
+ vi.mocked(crypto.randomBytes).mockReturnValue(Buffer.from('abcdef', 'hex'));
42
+ // Capture the output callback to simulate streaming events from the service
43
+ mockShellExecutionService.mockImplementation((_cmd, _cwd, callback) => {
44
+ mockShellOutputCallback = callback;
45
+ return {
46
+ pid: 12345,
47
+ result: new Promise((resolve) => {
48
+ resolveExecutionPromise = resolve;
49
+ }),
50
+ };
51
+ });
96
52
  });
97
- it('should pass token budget to summarizer', async () => {
98
- config = {
99
- getCoreTools: () => undefined,
100
- getExcludeTools: () => undefined,
101
- getDebugMode: () => false,
102
- getGeminiClient: () => ({}),
103
- getTargetDir: () => '.',
104
- getSummarizeToolOutputConfig: () => ({
105
- [shellTool.name]: { tokenBudget: 1000 },
106
- }),
107
- };
108
- shellTool = new ShellTool(config);
109
- const summarizeSpy = vi
110
- .spyOn(summarizer, 'summarizeToolOutput')
111
- .mockResolvedValue('summarized output');
112
- const abortSignal = new AbortController().signal;
113
- await shellTool.execute({ command: 'echo "hello"' }, abortSignal);
114
- expect(summarizeSpy).toHaveBeenCalledWith(expect.any(String), expect.any(Object), expect.any(Object), 1000);
53
+ describe('isCommandAllowed', () => {
54
+ it('should allow a command if no restrictions are provided', () => {
55
+ mockConfig.getCoreTools.mockReturnValue(undefined);
56
+ mockConfig.getExcludeTools.mockReturnValue(undefined);
57
+ expect(isCommandAllowed('ls -l', mockConfig).allowed).toBe(true);
58
+ });
59
+ it('should block a command with command substitution using $()', () => {
60
+ expect(isCommandAllowed('echo $(rm -rf /)', mockConfig).allowed).toBe(false);
61
+ });
115
62
  });
116
- it('should use default token budget if not specified', async () => {
117
- config = {
118
- getCoreTools: () => undefined,
119
- getExcludeTools: () => undefined,
120
- getDebugMode: () => false,
121
- getGeminiClient: () => ({}),
122
- getTargetDir: () => '.',
123
- getSummarizeToolOutputConfig: () => ({
124
- [shellTool.name]: {},
125
- }),
126
- };
127
- shellTool = new ShellTool(config);
128
- const summarizeSpy = vi
129
- .spyOn(summarizer, 'summarizeToolOutput')
130
- .mockResolvedValue('summarized output');
131
- const abortSignal = new AbortController().signal;
132
- await shellTool.execute({ command: 'echo "hello"' }, abortSignal);
133
- expect(summarizeSpy).toHaveBeenCalledWith(expect.any(String), expect.any(Object), expect.any(Object), undefined);
63
+ describe('validateToolParams', () => {
64
+ it('should return null for a valid command', () => {
65
+ expect(shellTool.validateToolParams({ command: 'ls -l' })).toBeNull();
66
+ });
67
+ it('should return an error for an empty command', () => {
68
+ expect(shellTool.validateToolParams({ command: ' ' })).toBe('Command cannot be empty.');
69
+ });
70
+ it('should not return an error for a non-existent directory', () => {
71
+ vi.mocked(fs.existsSync).mockReturnValue(false);
72
+ expect(shellTool.validateToolParams({ command: 'ls', directory: 'rel/path' })).toBeNull();
73
+ });
134
74
  });
135
- it('should pass GEMINI_CLI environment variable to executed commands', async () => {
136
- config = {
137
- getCoreTools: () => undefined,
138
- getExcludeTools: () => undefined,
139
- getDebugMode: () => false,
140
- getGeminiClient: () => ({}),
141
- getTargetDir: () => '.',
142
- getSummarizeToolOutputConfig: () => ({}),
75
+ describe('execute', () => {
76
+ const mockAbortSignal = new AbortController().signal;
77
+ const resolveShellExecution = (result = {}) => {
78
+ const fullResult = {
79
+ rawOutput: Buffer.from(result.output || ''),
80
+ output: 'Success',
81
+ stdout: 'Success',
82
+ stderr: '',
83
+ exitCode: 0,
84
+ signal: null,
85
+ error: null,
86
+ aborted: false,
87
+ pid: 12345,
88
+ ...result,
89
+ };
90
+ resolveExecutionPromise(fullResult);
143
91
  };
144
- shellTool = new ShellTool(config);
145
- const abortSignal = new AbortController().signal;
146
- const result = await shellTool.execute({ command: 'echo "$GEMINI_CLI"' }, abortSignal);
147
- expect(result.returnDisplay).toBe('1' + os.EOL);
92
+ it('should wrap command on linux and parse pgrep output', async () => {
93
+ const promise = shellTool.execute({ command: 'my-command &' }, mockAbortSignal);
94
+ resolveShellExecution({ pid: 54321 });
95
+ vi.mocked(fs.existsSync).mockReturnValue(true);
96
+ vi.mocked(fs.readFileSync).mockReturnValue('54321\n54322\n'); // Service PID and background PID
97
+ const result = await promise;
98
+ const tmpFile = path.join(os.tmpdir(), 'shell_pgrep_abcdef.tmp');
99
+ const wrappedCommand = `{ my-command & }; __code=$?; pgrep -g 0 >${tmpFile} 2>&1; exit $__code;`;
100
+ expect(mockShellExecutionService).toHaveBeenCalledWith(wrappedCommand, expect.any(String), expect.any(Function), mockAbortSignal);
101
+ expect(result.llmContent).toContain('Background PIDs: 54322');
102
+ expect(vi.mocked(fs.unlinkSync)).toHaveBeenCalledWith(tmpFile);
103
+ });
104
+ it('should not wrap command on windows', async () => {
105
+ vi.mocked(os.platform).mockReturnValue('win32');
106
+ const promise = shellTool.execute({ command: 'dir' }, mockAbortSignal);
107
+ resolveExecutionPromise({
108
+ rawOutput: Buffer.from(''),
109
+ output: '',
110
+ stdout: '',
111
+ stderr: '',
112
+ exitCode: 0,
113
+ signal: null,
114
+ error: null,
115
+ aborted: false,
116
+ pid: 12345,
117
+ });
118
+ await promise;
119
+ expect(mockShellExecutionService).toHaveBeenCalledWith('dir', expect.any(String), expect.any(Function), mockAbortSignal);
120
+ });
121
+ it('should format error messages correctly', async () => {
122
+ const error = new Error('wrapped command failed');
123
+ const promise = shellTool.execute({ command: 'user-command' }, mockAbortSignal);
124
+ resolveShellExecution({
125
+ error,
126
+ exitCode: 1,
127
+ output: 'err',
128
+ stderr: 'err',
129
+ rawOutput: Buffer.from('err'),
130
+ stdout: '',
131
+ signal: null,
132
+ aborted: false,
133
+ pid: 12345,
134
+ });
135
+ const result = await promise;
136
+ // The final llmContent should contain the user's command, not the wrapper
137
+ expect(result.llmContent).toContain('Error: wrapped command failed');
138
+ expect(result.llmContent).not.toContain('pgrep');
139
+ });
140
+ it('should summarize output when configured', async () => {
141
+ mockConfig.getSummarizeToolOutputConfig.mockReturnValue({
142
+ [shellTool.name]: { tokenBudget: 1000 },
143
+ });
144
+ vi.mocked(summarizer.summarizeToolOutput).mockResolvedValue('summarized output');
145
+ const promise = shellTool.execute({ command: 'ls' }, mockAbortSignal);
146
+ resolveExecutionPromise({
147
+ output: 'long output',
148
+ rawOutput: Buffer.from('long output'),
149
+ stdout: 'long output',
150
+ stderr: '',
151
+ exitCode: 0,
152
+ signal: null,
153
+ error: null,
154
+ aborted: false,
155
+ pid: 12345,
156
+ });
157
+ const result = await promise;
158
+ expect(summarizer.summarizeToolOutput).toHaveBeenCalledWith(expect.any(String), mockConfig.getGeminiClient(), mockAbortSignal, 1000);
159
+ expect(result.llmContent).toBe('summarized output');
160
+ expect(result.returnDisplay).toBe('long output');
161
+ });
162
+ it('should clean up the temp file on synchronous execution error', async () => {
163
+ const error = new Error('sync spawn error');
164
+ mockShellExecutionService.mockImplementation(() => {
165
+ throw error;
166
+ });
167
+ vi.mocked(fs.existsSync).mockReturnValue(true); // Pretend the file exists
168
+ await expect(shellTool.execute({ command: 'a-command' }, mockAbortSignal)).rejects.toThrow(error);
169
+ const tmpFile = path.join(os.tmpdir(), 'shell_pgrep_abcdef.tmp');
170
+ expect(vi.mocked(fs.unlinkSync)).toHaveBeenCalledWith(tmpFile);
171
+ });
172
+ describe('Streaming to `updateOutput`', () => {
173
+ let updateOutputMock;
174
+ beforeEach(() => {
175
+ vi.useFakeTimers({ toFake: ['Date'] });
176
+ updateOutputMock = vi.fn();
177
+ });
178
+ afterEach(() => {
179
+ vi.useRealTimers();
180
+ });
181
+ it('should throttle text output updates', async () => {
182
+ const promise = shellTool.execute({ command: 'stream' }, mockAbortSignal, updateOutputMock);
183
+ // First chunk, should be throttled.
184
+ mockShellOutputCallback({
185
+ type: 'data',
186
+ stream: 'stdout',
187
+ chunk: 'hello ',
188
+ });
189
+ expect(updateOutputMock).not.toHaveBeenCalled();
190
+ // Advance time past the throttle interval.
191
+ await vi.advanceTimersByTimeAsync(OUTPUT_UPDATE_INTERVAL_MS + 1);
192
+ // Send a second chunk. THIS event triggers the update with the CUMULATIVE content.
193
+ mockShellOutputCallback({
194
+ type: 'data',
195
+ stream: 'stderr',
196
+ chunk: 'world',
197
+ });
198
+ // It should have been called once now with the combined output.
199
+ expect(updateOutputMock).toHaveBeenCalledOnce();
200
+ expect(updateOutputMock).toHaveBeenCalledWith('hello \nworld');
201
+ resolveExecutionPromise({
202
+ rawOutput: Buffer.from(''),
203
+ output: '',
204
+ stdout: '',
205
+ stderr: '',
206
+ exitCode: 0,
207
+ signal: null,
208
+ error: null,
209
+ aborted: false,
210
+ pid: 12345,
211
+ });
212
+ await promise;
213
+ });
214
+ it('should immediately show binary detection message and throttle progress', async () => {
215
+ const promise = shellTool.execute({ command: 'cat img' }, mockAbortSignal, updateOutputMock);
216
+ mockShellOutputCallback({ type: 'binary_detected' });
217
+ expect(updateOutputMock).toHaveBeenCalledOnce();
218
+ expect(updateOutputMock).toHaveBeenCalledWith('[Binary output detected. Halting stream...]');
219
+ mockShellOutputCallback({
220
+ type: 'binary_progress',
221
+ bytesReceived: 1024,
222
+ });
223
+ expect(updateOutputMock).toHaveBeenCalledOnce();
224
+ // Advance time past the throttle interval.
225
+ await vi.advanceTimersByTimeAsync(OUTPUT_UPDATE_INTERVAL_MS + 1);
226
+ // Send a SECOND progress event. This one will trigger the flush.
227
+ mockShellOutputCallback({
228
+ type: 'binary_progress',
229
+ bytesReceived: 2048,
230
+ });
231
+ // Now it should be called a second time with the latest progress.
232
+ expect(updateOutputMock).toHaveBeenCalledTimes(2);
233
+ expect(updateOutputMock).toHaveBeenLastCalledWith('[Receiving binary output... 2.0 KB received]');
234
+ resolveExecutionPromise({
235
+ rawOutput: Buffer.from(''),
236
+ output: '',
237
+ stdout: '',
238
+ stderr: '',
239
+ exitCode: 0,
240
+ signal: null,
241
+ error: null,
242
+ aborted: false,
243
+ pid: 12345,
244
+ });
245
+ await promise;
246
+ });
247
+ });
148
248
  });
149
- });
150
- describe('shouldConfirmExecute', () => {
151
- it('should de-duplicate command roots before asking for confirmation', async () => {
152
- const shellTool = new ShellTool({
153
- getCoreTools: () => ['run_shell_command'],
154
- getExcludeTools: () => [],
155
- });
156
- const result = (await shellTool.shouldConfirmExecute({
157
- command: 'git status && git log',
158
- }));
159
- expect(result.rootCommand).toEqual('git');
249
+ describe('shouldConfirmExecute', () => {
250
+ it('should always request confirmation for commands', async () => {
251
+ const params = { command: 'npm install' };
252
+ const confirmation = await shellTool.shouldConfirmExecute(params);
253
+ expect(confirmation).not.toBe(false);
254
+ expect(confirmation && confirmation.type).toBe('exec');
255
+ // Even after confirming, the tool will still request confirmation for new commands
256
+ // This is the current behavior - no whitelist is implemented
257
+ const secondConfirmation = await shellTool.shouldConfirmExecute({
258
+ command: 'npm test',
259
+ });
260
+ expect(secondConfirmation).not.toBe(false);
261
+ expect(secondConfirmation && secondConfirmation.type).toBe('exec');
262
+ });
263
+ it('should request confirmation even for empty commands', async () => {
264
+ const confirmation = await shellTool.shouldConfirmExecute({
265
+ command: '',
266
+ });
267
+ expect(confirmation).not.toBe(false);
268
+ expect(confirmation && confirmation.type).toBe('exec');
269
+ });
270
+ it('should pass LLXPRT_CLI environment variable to executed commands', async () => {
271
+ const testConfig = {
272
+ getCoreTools: () => undefined,
273
+ getExcludeTools: () => undefined,
274
+ getDebugMode: () => false,
275
+ getGeminiClient: () => ({}),
276
+ getTargetDir: () => '.',
277
+ getSummarizeToolOutputConfig: () => ({}),
278
+ };
279
+ const testShellTool = new ShellTool(testConfig);
280
+ // Mock shell execution for this specific test
281
+ mockShellExecutionService.mockImplementationOnce(() => ({
282
+ pid: 12345,
283
+ result: Promise.resolve({
284
+ rawOutput: Buffer.from('1\n'),
285
+ output: '1\n',
286
+ stdout: '1\n',
287
+ stderr: '',
288
+ exitCode: 0,
289
+ signal: null,
290
+ error: null,
291
+ aborted: false,
292
+ pid: 12345,
293
+ }),
294
+ }));
295
+ const abortSignal = new AbortController().signal;
296
+ const command = os.platform() === 'win32' ? 'echo %LLXPRT_CLI%' : 'echo "$LLXPRT_CLI"';
297
+ const result = await testShellTool.execute({ command }, abortSignal);
298
+ expect(result.returnDisplay).toContain('1');
299
+ });
300
+ it('should de-duplicate command roots before asking for confirmation', async () => {
301
+ const testShellTool = new ShellTool({
302
+ getCoreTools: () => ['run_shell_command'],
303
+ getExcludeTools: () => [],
304
+ });
305
+ const result = await testShellTool.shouldConfirmExecute({
306
+ command: 'git status && git log',
307
+ });
308
+ expect(result).not.toBe(false);
309
+ if (result && typeof result === 'object' && 'rootCommand' in result) {
310
+ expect(result.rootCommand).toEqual('git');
311
+ }
312
+ });
160
313
  });
161
314
  });
162
315
  //# sourceMappingURL=shell.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.test.js","sourceRoot":"","sources":["../../../src/tools/shell.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.test.js","sourceRoot":"","sources":["../../../src/tools/shell.test.ts"],"names":[],"mappings":"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"}
@@ -7,9 +7,12 @@ import { BaseTool, ToolResult } from './tools.js';
7
7
  export type TodoReadParams = Record<string, never>;
8
8
  export declare class TodoRead extends BaseTool<TodoReadParams, ToolResult> {
9
9
  static readonly Name = "todo_read";
10
+ private reminderService;
10
11
  constructor();
11
12
  getDescription(_params: TodoReadParams): string;
12
13
  execute(_params: TodoReadParams, _signal: AbortSignal, _updateOutput?: (output: string) => void): Promise<ToolResult>;
13
- private sortTodos;
14
+ private groupTodosByStatus;
14
15
  private formatTodos;
16
+ private calculateStatistics;
17
+ private determineSuggestedAction;
15
18
  }