@google/gemini-cli-core 0.10.0-preview.3 → 0.11.0-nightly.20251021.e72c00cf

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 (209) hide show
  1. package/README.md +9 -0
  2. package/dist/google-gemini-cli-core-0.11.0-nightly.20251020.a96f0659.tgz +0 -0
  3. package/dist/src/agents/codebase-investigator.js +2 -5
  4. package/dist/src/agents/codebase-investigator.js.map +1 -1
  5. package/dist/src/agents/executor.js +6 -13
  6. package/dist/src/agents/executor.js.map +1 -1
  7. package/dist/src/agents/executor.test.js +36 -31
  8. package/dist/src/agents/executor.test.js.map +1 -1
  9. package/dist/src/code_assist/converter.d.ts +1 -0
  10. package/dist/src/code_assist/converter.js +1 -0
  11. package/dist/src/code_assist/converter.js.map +1 -1
  12. package/dist/src/code_assist/converter.test.js +19 -0
  13. package/dist/src/code_assist/converter.test.js.map +1 -1
  14. package/dist/src/config/config.d.ts +6 -8
  15. package/dist/src/config/config.js +14 -17
  16. package/dist/src/config/config.js.map +1 -1
  17. package/dist/src/config/config.test.js +0 -4
  18. package/dist/src/config/config.test.js.map +1 -1
  19. package/dist/src/confirmation-bus/message-bus.d.ts +2 -1
  20. package/dist/src/confirmation-bus/message-bus.js +7 -1
  21. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  22. package/dist/src/confirmation-bus/types.d.ts +12 -2
  23. package/dist/src/confirmation-bus/types.js +1 -0
  24. package/dist/src/confirmation-bus/types.js.map +1 -1
  25. package/dist/src/core/client.test.js +0 -1
  26. package/dist/src/core/client.test.js.map +1 -1
  27. package/dist/src/core/coreToolScheduler.d.ts +7 -0
  28. package/dist/src/core/coreToolScheduler.js +46 -10
  29. package/dist/src/core/coreToolScheduler.js.map +1 -1
  30. package/dist/src/core/coreToolScheduler.test.js +124 -3
  31. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  32. package/dist/src/core/geminiChat.js +1 -0
  33. package/dist/src/core/geminiChat.js.map +1 -1
  34. package/dist/src/core/nonInteractiveToolExecutor.test.js +3 -0
  35. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  36. package/dist/src/core/prompts.js +13 -20
  37. package/dist/src/core/prompts.js.map +1 -1
  38. package/dist/src/core/turn.d.ts +2 -0
  39. package/dist/src/core/turn.js +3 -1
  40. package/dist/src/core/turn.js.map +1 -1
  41. package/dist/src/core/turn.test.js +48 -0
  42. package/dist/src/core/turn.test.js.map +1 -1
  43. package/dist/src/generated/git-commit.d.ts +2 -2
  44. package/dist/src/generated/git-commit.js +2 -2
  45. package/dist/src/generated/git-commit.js.map +1 -1
  46. package/dist/src/index.d.ts +4 -0
  47. package/dist/src/index.js +4 -0
  48. package/dist/src/index.js.map +1 -1
  49. package/dist/src/output/stream-json-formatter.d.ts +32 -0
  50. package/dist/src/output/stream-json-formatter.js +52 -0
  51. package/dist/src/output/stream-json-formatter.js.map +1 -0
  52. package/dist/src/output/stream-json-formatter.test.js +479 -0
  53. package/dist/src/output/stream-json-formatter.test.js.map +1 -0
  54. package/dist/src/output/types.d.ts +63 -1
  55. package/dist/src/output/types.js +11 -0
  56. package/dist/src/output/types.js.map +1 -1
  57. package/dist/src/services/shellExecutionService.js +30 -21
  58. package/dist/src/services/shellExecutionService.js.map +1 -1
  59. package/dist/src/services/shellExecutionService.test.js +16 -11
  60. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  61. package/dist/src/telemetry/activity-monitor.d.ts +116 -0
  62. package/dist/src/telemetry/activity-monitor.js +208 -0
  63. package/dist/src/telemetry/activity-monitor.js.map +1 -0
  64. package/dist/src/telemetry/activity-monitor.test.d.ts +6 -0
  65. package/dist/src/telemetry/activity-monitor.test.js +248 -0
  66. package/dist/src/telemetry/activity-monitor.test.js.map +1 -0
  67. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +1 -0
  68. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +7 -7
  69. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  70. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +3 -10
  71. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  72. package/dist/src/telemetry/index.d.ts +2 -1
  73. package/dist/src/telemetry/index.js +2 -1
  74. package/dist/src/telemetry/index.js.map +1 -1
  75. package/dist/src/telemetry/loggers.test.js +0 -1
  76. package/dist/src/telemetry/loggers.test.js.map +1 -1
  77. package/dist/src/tools/edit.js +5 -5
  78. package/dist/src/tools/edit.js.map +1 -1
  79. package/dist/src/tools/edit.test.js +0 -1
  80. package/dist/src/tools/edit.test.js.map +1 -1
  81. package/dist/src/tools/glob.d.ts +3 -2
  82. package/dist/src/tools/glob.js +6 -6
  83. package/dist/src/tools/glob.js.map +1 -1
  84. package/dist/src/tools/grep.d.ts +3 -2
  85. package/dist/src/tools/grep.js +16 -10
  86. package/dist/src/tools/grep.js.map +1 -1
  87. package/dist/src/tools/ls.d.ts +3 -2
  88. package/dist/src/tools/ls.js +8 -7
  89. package/dist/src/tools/ls.js.map +1 -1
  90. package/dist/src/tools/mcp-client-manager.d.ts +2 -9
  91. package/dist/src/tools/mcp-client-manager.js +6 -14
  92. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  93. package/dist/src/tools/mcp-client-manager.test.js +16 -6
  94. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  95. package/dist/src/tools/memoryTool.d.ts +1 -1
  96. package/dist/src/tools/memoryTool.js +3 -2
  97. package/dist/src/tools/memoryTool.js.map +1 -1
  98. package/dist/src/tools/message-bus-integration.test.js +14 -1
  99. package/dist/src/tools/message-bus-integration.test.js.map +1 -1
  100. package/dist/src/tools/read-file.d.ts +4 -3
  101. package/dist/src/tools/read-file.js +9 -8
  102. package/dist/src/tools/read-file.js.map +1 -1
  103. package/dist/src/tools/read-many-files.d.ts +4 -3
  104. package/dist/src/tools/read-many-files.js +11 -8
  105. package/dist/src/tools/read-many-files.js.map +1 -1
  106. package/dist/src/tools/ripGrep.d.ts +3 -2
  107. package/dist/src/tools/ripGrep.js +45 -16
  108. package/dist/src/tools/ripGrep.js.map +1 -1
  109. package/dist/src/tools/ripGrep.test.js +106 -60
  110. package/dist/src/tools/ripGrep.test.js.map +1 -1
  111. package/dist/src/tools/shell.d.ts +1 -1
  112. package/dist/src/tools/shell.js +21 -57
  113. package/dist/src/tools/shell.js.map +1 -1
  114. package/dist/src/tools/shell.test.js +61 -8
  115. package/dist/src/tools/shell.test.js.map +1 -1
  116. package/dist/src/tools/smart-edit.js +4 -4
  117. package/dist/src/tools/smart-edit.js.map +1 -1
  118. package/dist/src/tools/smart-edit.test.js +0 -1
  119. package/dist/src/tools/smart-edit.test.js.map +1 -1
  120. package/dist/src/tools/tool-names.d.ts +8 -0
  121. package/dist/src/tools/tool-names.js +8 -5
  122. package/dist/src/tools/tool-names.js.map +1 -1
  123. package/dist/src/tools/tool-registry.js +1 -1
  124. package/dist/src/tools/tool-registry.js.map +1 -1
  125. package/dist/src/tools/tools.d.ts +15 -9
  126. package/dist/src/tools/tools.js +51 -38
  127. package/dist/src/tools/tools.js.map +1 -1
  128. package/dist/src/tools/web-fetch.d.ts +4 -3
  129. package/dist/src/tools/web-fetch.js +45 -20
  130. package/dist/src/tools/web-fetch.js.map +1 -1
  131. package/dist/src/tools/web-fetch.test.js +261 -0
  132. package/dist/src/tools/web-fetch.test.js.map +1 -1
  133. package/dist/src/tools/web-search.d.ts +4 -3
  134. package/dist/src/tools/web-search.js +8 -6
  135. package/dist/src/tools/web-search.js.map +1 -1
  136. package/dist/src/tools/write-file.d.ts +1 -1
  137. package/dist/src/tools/write-file.js +1 -1
  138. package/dist/src/tools/write-file.js.map +1 -1
  139. package/dist/src/tools/write-file.test.js +0 -1
  140. package/dist/src/tools/write-file.test.js.map +1 -1
  141. package/dist/src/tools/write-todos.d.ts +2 -7
  142. package/dist/src/tools/write-todos.js +1 -1
  143. package/dist/src/tools/write-todos.js.map +1 -1
  144. package/dist/src/tools/write-todos.test.js +2 -2
  145. package/dist/src/tools/write-todos.test.js.map +1 -1
  146. package/dist/src/utils/debugLogger.d.ts +25 -0
  147. package/dist/src/utils/debugLogger.js +33 -0
  148. package/dist/src/utils/debugLogger.js.map +1 -0
  149. package/dist/src/utils/debugLogger.test.d.ts +6 -0
  150. package/dist/src/utils/debugLogger.test.js +67 -0
  151. package/dist/src/utils/debugLogger.test.js.map +1 -0
  152. package/dist/src/utils/delay.d.ts +16 -0
  153. package/dist/src/utils/delay.js +43 -0
  154. package/dist/src/utils/delay.js.map +1 -0
  155. package/dist/src/utils/delay.test.d.ts +6 -0
  156. package/dist/src/utils/delay.test.js +88 -0
  157. package/dist/src/utils/delay.test.js.map +1 -0
  158. package/dist/src/utils/editCorrector.js +5 -9
  159. package/dist/src/utils/editCorrector.js.map +1 -1
  160. package/dist/src/utils/editCorrector.test.js +3 -5
  161. package/dist/src/utils/editCorrector.test.js.map +1 -1
  162. package/dist/src/utils/editor.js +33 -38
  163. package/dist/src/utils/editor.js.map +1 -1
  164. package/dist/src/utils/environmentContext.js +0 -33
  165. package/dist/src/utils/environmentContext.js.map +1 -1
  166. package/dist/src/utils/environmentContext.test.js +0 -34
  167. package/dist/src/utils/environmentContext.test.js.map +1 -1
  168. package/dist/src/utils/fetch.d.ts +1 -0
  169. package/dist/src/utils/fetch.js +9 -0
  170. package/dist/src/utils/fetch.js.map +1 -1
  171. package/dist/src/utils/fileUtils.d.ts +4 -0
  172. package/dist/src/utils/fileUtils.js +31 -0
  173. package/dist/src/utils/fileUtils.js.map +1 -1
  174. package/dist/src/utils/fileUtils.test.js +12 -1
  175. package/dist/src/utils/fileUtils.test.js.map +1 -1
  176. package/dist/src/utils/gitIgnoreParser.js +7 -6
  177. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  178. package/dist/src/utils/gitIgnoreParser.test.js +30 -0
  179. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  180. package/dist/src/utils/memoryDiscovery.d.ts +2 -1
  181. package/dist/src/utils/memoryDiscovery.js +9 -9
  182. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  183. package/dist/src/utils/memoryDiscovery.test.js +39 -17
  184. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  185. package/dist/src/utils/retry.d.ts +1 -0
  186. package/dist/src/utils/retry.js +14 -12
  187. package/dist/src/utils/retry.js.map +1 -1
  188. package/dist/src/utils/retry.test.js +17 -0
  189. package/dist/src/utils/retry.test.js.map +1 -1
  190. package/dist/src/utils/safeJsonStringify.d.ts +4 -4
  191. package/dist/src/utils/safeJsonStringify.js +31 -7
  192. package/dist/src/utils/safeJsonStringify.js.map +1 -1
  193. package/dist/src/utils/shell-utils.d.ts +14 -2
  194. package/dist/src/utils/shell-utils.js +353 -136
  195. package/dist/src/utils/shell-utils.js.map +1 -1
  196. package/dist/src/utils/shell-utils.test.js +154 -60
  197. package/dist/src/utils/shell-utils.test.js.map +1 -1
  198. package/dist/src/utils/tool-utils.d.ts +2 -2
  199. package/dist/src/utils/tool-utils.js +14 -5
  200. package/dist/src/utils/tool-utils.js.map +1 -1
  201. package/dist/tsconfig.tsbuildinfo +1 -1
  202. package/package.json +5 -3
  203. package/dist/google-gemini-cli-core-0.10.0-preview.2.tgz +0 -0
  204. package/dist/src/core/subagent.d.ts +0 -236
  205. package/dist/src/core/subagent.js +0 -482
  206. package/dist/src/core/subagent.js.map +0 -1
  207. package/dist/src/core/subagent.test.js +0 -556
  208. package/dist/src/core/subagent.test.js.map +0 -1
  209. /package/dist/src/{core/subagent.test.d.ts → output/stream-json-formatter.test.d.ts} +0 -0
@@ -1,556 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
7
- import { ContextState, SubAgentScope, SubagentTerminateMode, } from './subagent.js';
8
- import { Config } from '../config/config.js';
9
- import { GeminiChat, StreamEventType } from './geminiChat.js';
10
- import { createContentGenerator } from './contentGenerator.js';
11
- import { getEnvironmentContext } from '../utils/environmentContext.js';
12
- import { executeToolCall } from './nonInteractiveToolExecutor.js';
13
- import { DEFAULT_GEMINI_MODEL } from '../config/models.js';
14
- import { Type } from '@google/genai';
15
- import { ToolErrorType } from '../tools/tool-error.js';
16
- vi.mock('./geminiChat.js');
17
- vi.mock('./contentGenerator.js');
18
- vi.mock('../utils/environmentContext.js');
19
- vi.mock('./nonInteractiveToolExecutor.js');
20
- vi.mock('../ide/ide-client.js');
21
- async function createMockConfig(toolRegistryMocks = {}, configParameters = {}) {
22
- const configParams = {
23
- sessionId: 'test-session',
24
- model: DEFAULT_GEMINI_MODEL,
25
- targetDir: '.',
26
- debugMode: false,
27
- cwd: process.cwd(),
28
- enableShellOutputEfficiency: false,
29
- ...configParameters,
30
- };
31
- const config = new Config(configParams);
32
- await config.initialize();
33
- // Mock ToolRegistry
34
- const mockToolRegistry = {
35
- getTool: vi.fn(),
36
- getFunctionDeclarationsFiltered: vi.fn().mockReturnValue([]),
37
- ...toolRegistryMocks,
38
- };
39
- vi.spyOn(config, 'getToolRegistry').mockReturnValue(mockToolRegistry);
40
- return { config, toolRegistry: mockToolRegistry };
41
- }
42
- // Helper to simulate LLM responses (sequence of tool calls over multiple turns)
43
- const createMockStream = (functionCallsList) => {
44
- let index = 0;
45
- // This mock now returns a Promise that resolves to the async generator,
46
- // matching the new signature for sendMessageStream.
47
- return vi.fn().mockImplementation(async () => {
48
- const response = functionCallsList[index] || 'stop';
49
- index++;
50
- return (async function* () {
51
- let mockResponseValue;
52
- if (response === 'stop' || response.length === 0) {
53
- // Simulate a text response for stop/empty conditions.
54
- mockResponseValue = {
55
- candidates: [{ content: { parts: [{ text: 'Done.' }] } }],
56
- };
57
- }
58
- else {
59
- // Simulate a tool call response.
60
- mockResponseValue = {
61
- candidates: [], // Good practice to include for safety.
62
- functionCalls: response,
63
- };
64
- }
65
- // The stream must now yield a StreamEvent object of type CHUNK.
66
- yield {
67
- type: StreamEventType.CHUNK,
68
- value: mockResponseValue,
69
- };
70
- })();
71
- });
72
- };
73
- describe('subagent.ts', () => {
74
- describe('ContextState', () => {
75
- it('should set and get values correctly', () => {
76
- const context = new ContextState();
77
- context.set('key1', 'value1');
78
- context.set('key2', 123);
79
- expect(context.get('key1')).toBe('value1');
80
- expect(context.get('key2')).toBe(123);
81
- expect(context.get_keys()).toEqual(['key1', 'key2']);
82
- });
83
- it('should return undefined for missing keys', () => {
84
- const context = new ContextState();
85
- expect(context.get('missing')).toBeUndefined();
86
- });
87
- });
88
- describe('SubAgentScope', () => {
89
- let mockSendMessageStream;
90
- const defaultModelConfig = {
91
- model: 'gemini-1.5-flash-latest',
92
- temp: 0.5, // Specific temp to test override
93
- top_p: 1,
94
- };
95
- const defaultRunConfig = {
96
- max_time_minutes: 5,
97
- max_turns: 10,
98
- };
99
- beforeEach(async () => {
100
- vi.clearAllMocks();
101
- vi.mocked(getEnvironmentContext).mockResolvedValue([
102
- { text: 'Env Context' },
103
- ]);
104
- vi.mocked(createContentGenerator).mockResolvedValue({
105
- getGenerativeModel: vi.fn(),
106
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
- });
108
- mockSendMessageStream = vi.fn();
109
- // We mock the implementation of the constructor.
110
- vi.mocked(GeminiChat).mockImplementation(() => ({
111
- sendMessageStream: mockSendMessageStream,
112
- }));
113
- });
114
- afterEach(() => {
115
- vi.restoreAllMocks();
116
- });
117
- // Helper to safely access generationConfig from mock calls
118
- const getGenerationConfigFromMock = (callIndex = 0) => {
119
- const callArgs = vi.mocked(GeminiChat).mock.calls[callIndex];
120
- const generationConfig = callArgs?.[1];
121
- // Ensure it's defined before proceeding
122
- expect(generationConfig).toBeDefined();
123
- if (!generationConfig)
124
- throw new Error('generationConfig is undefined');
125
- return generationConfig;
126
- };
127
- describe('create (Tool Validation)', () => {
128
- const promptConfig = { systemPrompt: 'Test prompt' };
129
- it('should create a SubAgentScope successfully with minimal config', async () => {
130
- const { config } = await createMockConfig();
131
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
132
- expect(scope).toBeInstanceOf(SubAgentScope);
133
- });
134
- it('should throw an error if a tool requires confirmation', async () => {
135
- const mockTool = {
136
- name: 'risky_tool',
137
- schema: { parametersJsonSchema: { type: 'object', properties: {} } },
138
- build: vi.fn().mockReturnValue({
139
- shouldConfirmExecute: vi.fn().mockResolvedValue({
140
- type: 'exec',
141
- title: 'Confirm',
142
- command: 'rm -rf /',
143
- }),
144
- }),
145
- };
146
- const { config } = await createMockConfig({
147
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
148
- getTool: vi.fn().mockReturnValue(mockTool),
149
- });
150
- const toolConfig = { tools: ['risky_tool'] };
151
- const options = { toolConfig };
152
- await expect(SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, options)).rejects.toThrow('Tool "risky_tool" requires user confirmation and cannot be used in a non-interactive subagent.');
153
- });
154
- it('should succeed if tools do not require confirmation', async () => {
155
- const mockTool = {
156
- name: 'safe_tool',
157
- schema: { parametersJsonSchema: { type: 'object', properties: {} } },
158
- build: vi.fn().mockReturnValue({
159
- shouldConfirmExecute: vi.fn().mockResolvedValue(null),
160
- }),
161
- };
162
- const { config } = await createMockConfig({
163
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
164
- getTool: vi.fn().mockReturnValue(mockTool),
165
- });
166
- const toolConfig = { tools: ['safe_tool'] };
167
- const options = { toolConfig };
168
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, options);
169
- expect(scope).toBeInstanceOf(SubAgentScope);
170
- });
171
- it('should skip interactivity check and warn for tools with required parameters', async () => {
172
- const consoleWarnSpy = vi
173
- .spyOn(console, 'warn')
174
- .mockImplementation(() => { });
175
- const mockToolWithParams = {
176
- name: 'tool_with_params',
177
- schema: {
178
- parametersJsonSchema: {
179
- type: 'object',
180
- properties: {
181
- path: { type: 'string' },
182
- },
183
- required: ['path'],
184
- },
185
- },
186
- // build should not be called, but we mock it to be safe
187
- build: vi.fn(),
188
- };
189
- const { config } = await createMockConfig({
190
- getTool: vi.fn().mockReturnValue(mockToolWithParams),
191
- getAllTools: vi.fn().mockReturnValue([mockToolWithParams]),
192
- });
193
- const toolConfig = { tools: ['tool_with_params'] };
194
- const options = { toolConfig };
195
- // The creation should succeed without throwing
196
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, options);
197
- expect(scope).toBeInstanceOf(SubAgentScope);
198
- // Check that the warning was logged
199
- expect(consoleWarnSpy).toHaveBeenCalledWith('Cannot check tool "tool_with_params" for interactivity because it requires parameters. Assuming it is safe for non-interactive use.');
200
- // Ensure build was never called
201
- expect(mockToolWithParams.build).not.toHaveBeenCalled();
202
- consoleWarnSpy.mockRestore();
203
- });
204
- });
205
- describe('runNonInteractive - Initialization and Prompting', () => {
206
- it('should correctly template the system prompt and initialize GeminiChat', async () => {
207
- const { config } = await createMockConfig();
208
- vi.mocked(GeminiChat).mockClear();
209
- const promptConfig = {
210
- systemPrompt: 'Hello ${name}, your task is ${task}.',
211
- };
212
- const context = new ContextState();
213
- context.set('name', 'Agent');
214
- context.set('task', 'Testing');
215
- // Model stops immediately
216
- mockSendMessageStream.mockImplementation(createMockStream(['stop']));
217
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
218
- await scope.runNonInteractive(context);
219
- // Check if GeminiChat was initialized correctly by the subagent
220
- expect(GeminiChat).toHaveBeenCalledTimes(1);
221
- const callArgs = vi.mocked(GeminiChat).mock.calls[0];
222
- // Check Generation Config
223
- const generationConfig = getGenerationConfigFromMock();
224
- // Check temperature override
225
- expect(generationConfig.temperature).toBe(defaultModelConfig.temp);
226
- expect(generationConfig.systemInstruction).toContain('Hello Agent, your task is Testing.');
227
- expect(generationConfig.systemInstruction).toContain('Important Rules:');
228
- // Check History (should include environment context)
229
- const history = callArgs[2];
230
- expect(history).toEqual([
231
- { role: 'user', parts: [{ text: 'Env Context' }] },
232
- {
233
- role: 'model',
234
- parts: [{ text: 'Got it. Thanks for the context!' }],
235
- },
236
- ]);
237
- });
238
- it('should include output instructions in the system prompt when outputs are defined', async () => {
239
- const { config } = await createMockConfig();
240
- vi.mocked(GeminiChat).mockClear();
241
- const promptConfig = { systemPrompt: 'Do the task.' };
242
- const outputConfig = {
243
- outputs: {
244
- result1: 'The first result',
245
- },
246
- };
247
- const context = new ContextState();
248
- // Model stops immediately
249
- mockSendMessageStream.mockImplementation(createMockStream(['stop']));
250
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { outputConfig });
251
- await scope.runNonInteractive(context);
252
- const generationConfig = getGenerationConfigFromMock();
253
- const systemInstruction = generationConfig.systemInstruction;
254
- expect(systemInstruction).toContain('Do the task.');
255
- expect(systemInstruction).toContain('you MUST emit the required output variables');
256
- expect(systemInstruction).toContain("Use 'self.emitvalue' to emit the 'result1' key");
257
- });
258
- it('should use initialMessages instead of systemPrompt if provided', async () => {
259
- const { config } = await createMockConfig();
260
- vi.mocked(GeminiChat).mockClear();
261
- const initialMessages = [
262
- { role: 'user', parts: [{ text: 'Hi' }] },
263
- ];
264
- const promptConfig = { initialMessages };
265
- const context = new ContextState();
266
- // Model stops immediately
267
- mockSendMessageStream.mockImplementation(createMockStream(['stop']));
268
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
269
- await scope.runNonInteractive(context);
270
- const callArgs = vi.mocked(GeminiChat).mock.calls[0];
271
- const generationConfig = getGenerationConfigFromMock();
272
- const history = callArgs[2];
273
- expect(generationConfig.systemInstruction).toBeUndefined();
274
- expect(history).toEqual([
275
- { role: 'user', parts: [{ text: 'Env Context' }] },
276
- {
277
- role: 'model',
278
- parts: [{ text: 'Got it. Thanks for the context!' }],
279
- },
280
- ...initialMessages,
281
- ]);
282
- });
283
- it('should throw an error if template variables are missing', async () => {
284
- const { config } = await createMockConfig();
285
- const promptConfig = {
286
- systemPrompt: 'Hello ${name}, you are missing ${missing}.',
287
- };
288
- const context = new ContextState();
289
- context.set('name', 'Agent');
290
- // 'missing' is not set
291
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
292
- // The error from templating causes the runNonInteractive to reject and the terminate_reason to be ERROR.
293
- await expect(scope.runNonInteractive(context)).rejects.toThrow('Missing context values for the following keys: missing');
294
- expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.ERROR);
295
- });
296
- it('should validate that systemPrompt and initialMessages are mutually exclusive', async () => {
297
- const { config } = await createMockConfig();
298
- const promptConfig = {
299
- systemPrompt: 'System',
300
- initialMessages: [{ role: 'user', parts: [{ text: 'Hi' }] }],
301
- };
302
- const context = new ContextState();
303
- const agent = await SubAgentScope.create('TestAgent', config, promptConfig, defaultModelConfig, defaultRunConfig);
304
- await expect(agent.runNonInteractive(context)).rejects.toThrow('PromptConfig cannot have both `systemPrompt` and `initialMessages` defined.');
305
- expect(agent.output.terminate_reason).toBe(SubagentTerminateMode.ERROR);
306
- });
307
- });
308
- describe('runNonInteractive - Execution and Tool Use', () => {
309
- const promptConfig = { systemPrompt: 'Execute task.' };
310
- it('should terminate with GOAL if no outputs are expected and model stops', async () => {
311
- const { config } = await createMockConfig();
312
- // Model stops immediately
313
- mockSendMessageStream.mockImplementation(createMockStream(['stop']));
314
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
315
- await scope.runNonInteractive(new ContextState());
316
- expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.GOAL);
317
- expect(scope.output.emitted_vars).toEqual({});
318
- expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
319
- // Check the initial message
320
- expect(mockSendMessageStream.mock.calls[0][1].message).toEqual([
321
- { text: 'Get Started!' },
322
- ]);
323
- });
324
- it('should handle self.emitvalue and terminate with GOAL when outputs are met', async () => {
325
- const { config } = await createMockConfig();
326
- const outputConfig = {
327
- outputs: { result: 'The final result' },
328
- };
329
- // Turn 1: Model responds with emitvalue call
330
- // Turn 2: Model stops after receiving the tool response
331
- mockSendMessageStream.mockImplementation(createMockStream([
332
- [
333
- {
334
- name: 'self.emitvalue',
335
- args: {
336
- emit_variable_name: 'result',
337
- emit_variable_value: 'Success!',
338
- },
339
- },
340
- ],
341
- 'stop',
342
- ]));
343
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { outputConfig });
344
- await scope.runNonInteractive(new ContextState());
345
- expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.GOAL);
346
- expect(scope.output.emitted_vars).toEqual({ result: 'Success!' });
347
- expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
348
- // Check the tool response sent back in the second call
349
- const secondCallArgs = mockSendMessageStream.mock.calls[0][1];
350
- expect(secondCallArgs.message).toEqual([{ text: 'Get Started!' }]);
351
- });
352
- it('should execute external tools and provide the response to the model', async () => {
353
- const listFilesToolDef = {
354
- name: 'list_files',
355
- description: 'Lists files',
356
- parameters: { type: Type.OBJECT, properties: {} },
357
- };
358
- const { config } = await createMockConfig({
359
- getFunctionDeclarationsFiltered: vi
360
- .fn()
361
- .mockReturnValue([listFilesToolDef]),
362
- getTool: vi.fn().mockReturnValue(undefined),
363
- });
364
- const toolConfig = { tools: ['list_files'] };
365
- // Turn 1: Model calls the external tool
366
- // Turn 2: Model stops
367
- mockSendMessageStream.mockImplementation(createMockStream([
368
- [
369
- {
370
- id: 'call_1',
371
- name: 'list_files',
372
- args: { path: '.' },
373
- },
374
- ],
375
- 'stop',
376
- ]));
377
- // Mock the tool execution result - must return CompletedToolCall
378
- vi.mocked(executeToolCall).mockResolvedValue({
379
- status: 'success',
380
- request: {
381
- callId: 'call_1',
382
- name: 'list_files',
383
- args: { path: '.' },
384
- isClientInitiated: false,
385
- prompt_id: 'prompt-id-1',
386
- },
387
- tool: {},
388
- invocation: {},
389
- response: {
390
- callId: 'call_1',
391
- responseParts: [{ text: 'file1.txt\nfile2.ts' }],
392
- resultDisplay: 'Listed 2 files',
393
- error: undefined,
394
- errorType: undefined,
395
- contentLength: undefined,
396
- },
397
- });
398
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { toolConfig });
399
- await scope.runNonInteractive(new ContextState());
400
- // Check tool execution
401
- expect(executeToolCall).toHaveBeenCalledWith(config, expect.objectContaining({ name: 'list_files', args: { path: '.' } }), expect.any(AbortSignal));
402
- // Check the response sent back to the model
403
- const secondCallArgs = mockSendMessageStream.mock.calls[1][1];
404
- expect(secondCallArgs.message).toEqual([
405
- { text: 'file1.txt\nfile2.ts' },
406
- ]);
407
- expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.GOAL);
408
- });
409
- it('should provide specific tool error responses to the model', async () => {
410
- const { config } = await createMockConfig();
411
- const toolConfig = { tools: ['failing_tool'] };
412
- // Turn 1: Model calls the failing tool
413
- // Turn 2: Model stops after receiving the error response
414
- mockSendMessageStream.mockImplementation(createMockStream([
415
- [
416
- {
417
- id: 'call_fail',
418
- name: 'failing_tool',
419
- args: {},
420
- },
421
- ],
422
- 'stop',
423
- ]));
424
- // Mock the tool execution failure - must return CompletedToolCall
425
- vi.mocked(executeToolCall).mockResolvedValue({
426
- status: 'error',
427
- request: {
428
- callId: 'call_fail',
429
- name: 'failing_tool',
430
- args: {},
431
- isClientInitiated: false,
432
- prompt_id: 'prompt-id-fail',
433
- },
434
- tool: {},
435
- response: {
436
- callId: 'call_fail',
437
- responseParts: [{ text: 'ERROR: Tool failed catastrophically' }], // This should be sent to the model
438
- resultDisplay: 'Tool failed catastrophically',
439
- error: new Error('Failure'),
440
- errorType: ToolErrorType.INVALID_TOOL_PARAMS,
441
- contentLength: undefined,
442
- },
443
- });
444
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { toolConfig });
445
- await scope.runNonInteractive(new ContextState());
446
- // The agent should send the specific error message from responseParts.
447
- const secondCallArgs = mockSendMessageStream.mock.calls[1][1];
448
- expect(secondCallArgs.message).toEqual([
449
- {
450
- text: 'ERROR: Tool failed catastrophically',
451
- },
452
- ]);
453
- });
454
- it('should nudge the model if it stops before emitting all required variables', async () => {
455
- const { config } = await createMockConfig();
456
- const outputConfig = {
457
- outputs: { required_var: 'Must be present' },
458
- };
459
- // Turn 1: Model stops prematurely
460
- // Turn 2: Model responds to the nudge and emits the variable
461
- // Turn 3: Model stops
462
- mockSendMessageStream.mockImplementation(createMockStream([
463
- 'stop',
464
- [
465
- {
466
- name: 'self.emitvalue',
467
- args: {
468
- emit_variable_name: 'required_var',
469
- emit_variable_value: 'Here it is',
470
- },
471
- },
472
- ],
473
- 'stop',
474
- ]));
475
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { outputConfig });
476
- await scope.runNonInteractive(new ContextState());
477
- // Check the nudge message sent in Turn 2
478
- const secondCallArgs = mockSendMessageStream.mock.calls[1][1];
479
- // We check that the message contains the required variable name and the nudge phrasing.
480
- expect(secondCallArgs.message[0].text).toContain('required_var');
481
- expect(secondCallArgs.message[0].text).toContain('You have stopped calling tools');
482
- expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.GOAL);
483
- expect(scope.output.emitted_vars).toEqual({
484
- required_var: 'Here it is',
485
- });
486
- expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
487
- });
488
- });
489
- describe('runNonInteractive - Termination and Recovery', () => {
490
- const promptConfig = { systemPrompt: 'Execute task.' };
491
- it('should terminate with MAX_TURNS if the limit is reached', async () => {
492
- const { config } = await createMockConfig();
493
- const runConfig = { ...defaultRunConfig, max_turns: 2 };
494
- // Model keeps looping by calling emitvalue repeatedly
495
- mockSendMessageStream.mockImplementation(createMockStream([
496
- [
497
- {
498
- name: 'self.emitvalue',
499
- args: { emit_variable_name: 'loop', emit_variable_value: 'v1' },
500
- },
501
- ],
502
- [
503
- {
504
- name: 'self.emitvalue',
505
- args: { emit_variable_name: 'loop', emit_variable_value: 'v2' },
506
- },
507
- ],
508
- // This turn should not happen
509
- [
510
- {
511
- name: 'self.emitvalue',
512
- args: { emit_variable_name: 'loop', emit_variable_value: 'v3' },
513
- },
514
- ],
515
- ]));
516
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, runConfig);
517
- await scope.runNonInteractive(new ContextState());
518
- expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
519
- expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.MAX_TURNS);
520
- });
521
- it('should terminate with TIMEOUT if the time limit is reached during an LLM call', async () => {
522
- // Use fake timers to reliably test timeouts
523
- vi.useFakeTimers();
524
- const { config } = await createMockConfig({}, { useRipgrep: false });
525
- const runConfig = { max_time_minutes: 5, max_turns: 100 };
526
- // We need to control the resolution of the sendMessageStream promise to advance the timer during execution.
527
- let resolveStream;
528
- const streamPromise = new Promise((resolve) => {
529
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
530
- resolveStream = resolve;
531
- });
532
- // The LLM call will hang until we resolve the promise.
533
- mockSendMessageStream.mockReturnValue(streamPromise);
534
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, runConfig);
535
- const runPromise = scope.runNonInteractive(new ContextState());
536
- // Advance time beyond the limit (6 minutes) while the agent is awaiting the LLM response.
537
- await vi.advanceTimersByTimeAsync(6 * 60 * 1000);
538
- // Now resolve the stream. The model returns 'stop'.
539
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
540
- resolveStream(createMockStream(['stop'])());
541
- await runPromise;
542
- expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.TIMEOUT);
543
- expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
544
- vi.useRealTimers();
545
- });
546
- it('should terminate with ERROR if the model call throws', async () => {
547
- const { config } = await createMockConfig({}, { useRipgrep: false });
548
- mockSendMessageStream.mockRejectedValue(new Error('API Failure'));
549
- const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
550
- await expect(scope.runNonInteractive(new ContextState())).rejects.toThrow('API Failure');
551
- expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.ERROR);
552
- });
553
- });
554
- });
555
- });
556
- //# sourceMappingURL=subagent.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent.test.js","sourceRoot":"","sources":["../../../src/core/subagent.test.ts"],"names":[],"mappings":"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"}