@google/gemini-cli-core 0.8.0-nightly.20250930.ddcbd0c2 → 0.8.0-preview.0

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 (86) hide show
  1. package/dist/src/agents/codebase-investigator.d.ts +11 -0
  2. package/dist/src/agents/codebase-investigator.js +73 -0
  3. package/dist/src/agents/codebase-investigator.js.map +1 -0
  4. package/dist/src/agents/executor.d.ts +88 -0
  5. package/dist/src/agents/executor.js +417 -0
  6. package/dist/src/agents/executor.js.map +1 -0
  7. package/dist/src/agents/executor.test.d.ts +6 -0
  8. package/dist/src/agents/executor.test.js +419 -0
  9. package/dist/src/agents/executor.test.js.map +1 -0
  10. package/dist/src/agents/invocation.d.ts +43 -0
  11. package/dist/src/agents/invocation.js +100 -0
  12. package/dist/src/agents/invocation.js.map +1 -0
  13. package/dist/src/agents/invocation.test.d.ts +6 -0
  14. package/dist/src/agents/invocation.test.js +206 -0
  15. package/dist/src/agents/invocation.test.js.map +1 -0
  16. package/dist/src/agents/registry.d.ts +35 -0
  17. package/dist/src/agents/registry.js +58 -0
  18. package/dist/src/agents/registry.js.map +1 -0
  19. package/dist/src/agents/registry.test.d.ts +6 -0
  20. package/dist/src/agents/registry.test.js +146 -0
  21. package/dist/src/agents/registry.test.js.map +1 -0
  22. package/dist/src/agents/schema-utils.d.ts +39 -0
  23. package/dist/src/agents/schema-utils.js +57 -0
  24. package/dist/src/agents/schema-utils.js.map +1 -0
  25. package/dist/src/agents/schema-utils.test.d.ts +6 -0
  26. package/dist/src/agents/schema-utils.test.js +144 -0
  27. package/dist/src/agents/schema-utils.test.js.map +1 -0
  28. package/dist/src/agents/subagent-tool-wrapper.d.ts +36 -0
  29. package/dist/src/agents/subagent-tool-wrapper.js +47 -0
  30. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -0
  31. package/dist/src/agents/subagent-tool-wrapper.test.d.ts +6 -0
  32. package/dist/src/agents/subagent-tool-wrapper.test.js +105 -0
  33. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -0
  34. package/dist/src/agents/types.d.ts +116 -0
  35. package/dist/src/agents/types.js +17 -0
  36. package/dist/src/agents/types.js.map +1 -0
  37. package/dist/src/agents/utils.d.ts +15 -0
  38. package/dist/src/agents/utils.js +29 -0
  39. package/dist/src/agents/utils.js.map +1 -0
  40. package/dist/src/agents/utils.test.d.ts +6 -0
  41. package/dist/src/agents/utils.test.js +87 -0
  42. package/dist/src/agents/utils.test.js.map +1 -0
  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/ide/detect-ide.d.ts +1 -0
  47. package/dist/src/ide/detect-ide.js +4 -1
  48. package/dist/src/ide/detect-ide.js.map +1 -1
  49. package/dist/src/services/shellExecutionService.d.ts +2 -0
  50. package/dist/src/services/shellExecutionService.js +48 -7
  51. package/dist/src/services/shellExecutionService.js.map +1 -1
  52. package/dist/src/services/shellExecutionService.test.js +13 -4
  53. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  54. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +4 -1
  55. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  56. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +18 -0
  57. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  58. package/dist/src/telemetry/constants.d.ts +0 -24
  59. package/dist/src/telemetry/constants.js +0 -25
  60. package/dist/src/telemetry/constants.js.map +1 -1
  61. package/dist/src/telemetry/loggers.js +42 -9
  62. package/dist/src/telemetry/loggers.js.map +1 -1
  63. package/dist/src/telemetry/loggers.test.js +39 -8
  64. package/dist/src/telemetry/loggers.test.js.map +1 -1
  65. package/dist/src/telemetry/metrics.d.ts +278 -19
  66. package/dist/src/telemetry/metrics.js +303 -235
  67. package/dist/src/telemetry/metrics.js.map +1 -1
  68. package/dist/src/telemetry/metrics.test.js +191 -54
  69. package/dist/src/telemetry/metrics.test.js.map +1 -1
  70. package/dist/src/tools/smart-edit.js +56 -0
  71. package/dist/src/tools/smart-edit.js.map +1 -1
  72. package/dist/src/tools/smart-edit.test.js +19 -0
  73. package/dist/src/tools/smart-edit.test.js.map +1 -1
  74. package/dist/src/utils/llm-edit-fixer.js +10 -1
  75. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  76. package/dist/src/utils/llm-edit-fixer.test.js +81 -0
  77. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
  78. package/dist/src/utils/memoryImportProcessor.js +13 -20
  79. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  80. package/dist/src/utils/memoryImportProcessor.test.js +14 -0
  81. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  82. package/dist/src/utils/terminalSerializer.d.ts +1 -4
  83. package/dist/src/utils/terminalSerializer.js +3 -3
  84. package/dist/src/utils/terminalSerializer.js.map +1 -1
  85. package/dist/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +1 -1
@@ -0,0 +1,419 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
7
+ import { AgentExecutor } from './executor.js';
8
+ import { AgentTerminateMode } from './types.js';
9
+ import { makeFakeConfig } from '../test-utils/config.js';
10
+ import { ToolRegistry } from '../tools/tool-registry.js';
11
+ import { LSTool } from '../tools/ls.js';
12
+ import { ReadFileTool } from '../tools/read-file.js';
13
+ import { GeminiChat, StreamEventType, } from '../core/geminiChat.js';
14
+ import { MockTool } from '../test-utils/mock-tool.js';
15
+ import { getDirectoryContextString } from '../utils/environmentContext.js';
16
+ const { mockSendMessageStream, mockExecuteToolCall } = vi.hoisted(() => ({
17
+ mockSendMessageStream: vi.fn(),
18
+ mockExecuteToolCall: vi.fn(),
19
+ }));
20
+ vi.mock('../core/geminiChat.js', async (importOriginal) => {
21
+ const actual = await importOriginal();
22
+ return {
23
+ ...actual,
24
+ GeminiChat: vi.fn().mockImplementation(() => ({
25
+ sendMessageStream: mockSendMessageStream,
26
+ })),
27
+ };
28
+ });
29
+ vi.mock('../core/nonInteractiveToolExecutor.js', () => ({
30
+ executeToolCall: mockExecuteToolCall,
31
+ }));
32
+ vi.mock('../utils/environmentContext.js');
33
+ const MockedGeminiChat = GeminiChat;
34
+ // A mock tool that is NOT on the NON_INTERACTIVE_TOOL_ALLOWLIST
35
+ const MOCK_TOOL_NOT_ALLOWED = new MockTool({ name: 'write_file' });
36
+ const createMockResponseChunk = (parts, functionCalls) => ({
37
+ candidates: [{ index: 0, content: { role: 'model', parts } }],
38
+ functionCalls,
39
+ });
40
+ const mockModelResponse = (functionCalls, thought, text) => {
41
+ const parts = [];
42
+ if (thought) {
43
+ parts.push({
44
+ text: `**${thought}** This is the reasoning part.`,
45
+ thought: true,
46
+ });
47
+ }
48
+ if (text)
49
+ parts.push({ text });
50
+ const responseChunk = createMockResponseChunk(parts,
51
+ // Ensure functionCalls is undefined if the array is empty, matching API behavior
52
+ functionCalls.length > 0 ? functionCalls : undefined);
53
+ mockSendMessageStream.mockImplementationOnce(async () => (async function* () {
54
+ yield {
55
+ type: StreamEventType.CHUNK,
56
+ value: responseChunk,
57
+ };
58
+ })());
59
+ };
60
+ let mockConfig;
61
+ let parentToolRegistry;
62
+ const createTestDefinition = (tools = [LSTool.Name], runConfigOverrides = {}, outputConfigOverrides = {}) => ({
63
+ name: 'TestAgent',
64
+ description: 'An agent for testing.',
65
+ inputConfig: {
66
+ inputs: { goal: { type: 'string', required: true, description: 'goal' } },
67
+ },
68
+ modelConfig: { model: 'gemini-test-model', temp: 0, top_p: 1 },
69
+ runConfig: { max_time_minutes: 5, max_turns: 5, ...runConfigOverrides },
70
+ promptConfig: { systemPrompt: 'Achieve the goal: ${goal}.' },
71
+ toolConfig: { tools },
72
+ outputConfig: { description: 'The final result.', ...outputConfigOverrides },
73
+ });
74
+ describe('AgentExecutor', () => {
75
+ let activities;
76
+ let onActivity;
77
+ let abortController;
78
+ let signal;
79
+ beforeEach(async () => {
80
+ mockSendMessageStream.mockClear();
81
+ mockExecuteToolCall.mockClear();
82
+ vi.clearAllMocks();
83
+ // Use fake timers for timeout and concurrency testing
84
+ vi.useFakeTimers();
85
+ mockConfig = makeFakeConfig();
86
+ parentToolRegistry = new ToolRegistry(mockConfig);
87
+ parentToolRegistry.registerTool(new LSTool(mockConfig));
88
+ parentToolRegistry.registerTool(new ReadFileTool(mockConfig));
89
+ parentToolRegistry.registerTool(MOCK_TOOL_NOT_ALLOWED);
90
+ vi.spyOn(mockConfig, 'getToolRegistry').mockResolvedValue(parentToolRegistry);
91
+ vi.mocked(getDirectoryContextString).mockResolvedValue('Mocked Environment Context');
92
+ activities = [];
93
+ onActivity = (activity) => activities.push(activity);
94
+ abortController = new AbortController();
95
+ signal = abortController.signal;
96
+ });
97
+ afterEach(() => {
98
+ vi.useRealTimers();
99
+ });
100
+ describe('create (Initialization and Validation)', () => {
101
+ it('should create successfully with allowed tools', async () => {
102
+ const definition = createTestDefinition([LSTool.Name]);
103
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
104
+ expect(executor).toBeInstanceOf(AgentExecutor);
105
+ });
106
+ it('SECURITY: should throw if a tool is not on the non-interactive allowlist', async () => {
107
+ const definition = createTestDefinition([MOCK_TOOL_NOT_ALLOWED.name]);
108
+ await expect(AgentExecutor.create(definition, mockConfig, onActivity)).rejects.toThrow(`Tool "${MOCK_TOOL_NOT_ALLOWED.name}" is not on the allow-list for non-interactive execution`);
109
+ });
110
+ it('should create an isolated ToolRegistry for the agent', async () => {
111
+ const definition = createTestDefinition([LSTool.Name, ReadFileTool.Name]);
112
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
113
+ // @ts-expect-error - accessing private property for test validation
114
+ const agentRegistry = executor.toolRegistry;
115
+ expect(agentRegistry).not.toBe(parentToolRegistry);
116
+ expect(agentRegistry.getAllToolNames()).toEqual(expect.arrayContaining([LSTool.Name, ReadFileTool.Name]));
117
+ expect(agentRegistry.getAllToolNames()).toHaveLength(2);
118
+ expect(agentRegistry.getTool(MOCK_TOOL_NOT_ALLOWED.name)).toBeUndefined();
119
+ });
120
+ });
121
+ describe('run (Execution Loop and Logic)', () => {
122
+ it('should execute a successful work and extraction phase (Happy Path) and emit activities', async () => {
123
+ const definition = createTestDefinition();
124
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
125
+ const inputs = { goal: 'Find files' };
126
+ // Turn 1: Model calls ls
127
+ mockModelResponse([{ name: LSTool.Name, args: { path: '.' }, id: 'call1' }], 'T1: Listing');
128
+ mockExecuteToolCall.mockResolvedValueOnce({
129
+ callId: 'call1',
130
+ resultDisplay: 'file1.txt',
131
+ responseParts: [
132
+ {
133
+ functionResponse: {
134
+ name: LSTool.Name,
135
+ response: { result: 'file1.txt' },
136
+ id: 'call1',
137
+ },
138
+ },
139
+ ],
140
+ error: undefined,
141
+ });
142
+ // Turn 2: Model stops
143
+ mockModelResponse([], 'T2: Done');
144
+ // Extraction Phase
145
+ mockModelResponse([], undefined, 'Result: file1.txt.');
146
+ const output = await executor.run(inputs, signal);
147
+ expect(mockSendMessageStream).toHaveBeenCalledTimes(3);
148
+ expect(mockExecuteToolCall).toHaveBeenCalledTimes(1);
149
+ // Verify System Prompt Templating
150
+ const chatConstructorArgs = MockedGeminiChat.mock.calls[0];
151
+ const chatConfig = chatConstructorArgs[1];
152
+ expect(chatConfig?.systemInstruction).toContain('Achieve the goal: Find files.');
153
+ // Verify environment context is appended
154
+ expect(chatConfig?.systemInstruction).toContain('# Environment Context\nMocked Environment Context');
155
+ // Verify standard rules are appended
156
+ expect(chatConfig?.systemInstruction).toContain('You are running in a non-interactive mode.');
157
+ // Verify absolute path rule is appended
158
+ expect(chatConfig?.systemInstruction).toContain('Always use absolute paths for file operations.');
159
+ // Verify Extraction Phase Call (Specific arguments)
160
+ expect(mockSendMessageStream).toHaveBeenCalledWith('gemini-test-model', expect.objectContaining({
161
+ // Extraction message should be based on outputConfig.description
162
+ message: expect.arrayContaining([
163
+ {
164
+ text: expect.stringContaining('Based on your work so far, provide: The final result.'),
165
+ },
166
+ ]),
167
+ config: expect.objectContaining({ tools: undefined }), // No tools in extraction
168
+ }), expect.stringContaining('#extraction'));
169
+ expect(output.result).toBe('Result: file1.txt.');
170
+ expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
171
+ // Verify Activity Stream (Observability)
172
+ expect(activities).toEqual(expect.arrayContaining([
173
+ // Thought subjects are extracted by the executor (parseThought)
174
+ expect.objectContaining({
175
+ type: 'THOUGHT_CHUNK',
176
+ data: { text: 'T1: Listing' },
177
+ }),
178
+ expect.objectContaining({
179
+ type: 'TOOL_CALL_START',
180
+ data: { name: LSTool.Name, args: { path: '.' } },
181
+ }),
182
+ expect.objectContaining({
183
+ type: 'TOOL_CALL_END',
184
+ data: { name: LSTool.Name, output: 'file1.txt' },
185
+ }),
186
+ expect.objectContaining({
187
+ type: 'THOUGHT_CHUNK',
188
+ data: { text: 'T2: Done' },
189
+ }),
190
+ ]));
191
+ });
192
+ it('should execute parallel tool calls concurrently', async () => {
193
+ const definition = createTestDefinition([LSTool.Name, ReadFileTool.Name]);
194
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
195
+ const call1 = {
196
+ name: LSTool.Name,
197
+ args: { path: '/dir1' },
198
+ id: 'call1',
199
+ };
200
+ // Using LSTool twice for simplicity in mocking standardized responses.
201
+ const call2 = {
202
+ name: LSTool.Name,
203
+ args: { path: '/dir2' },
204
+ id: 'call2',
205
+ };
206
+ // Turn 1: Model calls two tools simultaneously
207
+ mockModelResponse([call1, call2], 'T1: Listing both');
208
+ // Use concurrency tracking to ensure parallelism
209
+ let activeCalls = 0;
210
+ let maxActiveCalls = 0;
211
+ mockExecuteToolCall.mockImplementation(async (_ctx, reqInfo) => {
212
+ activeCalls++;
213
+ maxActiveCalls = Math.max(maxActiveCalls, activeCalls);
214
+ // Simulate latency. We must advance the fake timers for this to resolve.
215
+ await new Promise((resolve) => setTimeout(resolve, 100));
216
+ activeCalls--;
217
+ return {
218
+ callId: reqInfo.callId,
219
+ resultDisplay: `Result for ${reqInfo.name}`,
220
+ responseParts: [
221
+ {
222
+ functionResponse: {
223
+ name: reqInfo.name,
224
+ response: {},
225
+ id: reqInfo.callId,
226
+ },
227
+ },
228
+ ],
229
+ error: undefined,
230
+ };
231
+ });
232
+ // Turn 2: Model stops
233
+ mockModelResponse([]);
234
+ // Extraction
235
+ mockModelResponse([], undefined, 'Done.');
236
+ const runPromise = executor.run({ goal: 'Parallel test' }, signal);
237
+ // Advance timers while the parallel calls (Promise.all + setTimeout) are running
238
+ await vi.advanceTimersByTimeAsync(150);
239
+ await runPromise;
240
+ expect(mockExecuteToolCall).toHaveBeenCalledTimes(2);
241
+ expect(maxActiveCalls).toBe(2);
242
+ // Verify the input to the next model call (Turn 2) contains both responses
243
+ // sendMessageStream calls: [0] Turn 1, [1] Turn 2, [2] Extraction
244
+ const turn2Input = mockSendMessageStream.mock.calls[1][1];
245
+ const turn2Parts = turn2Input.message;
246
+ // Promise.all preserves the order of the input array.
247
+ expect(turn2Parts.length).toBe(2);
248
+ expect(turn2Parts[0]).toEqual(expect.objectContaining({
249
+ functionResponse: expect.objectContaining({ id: 'call1' }),
250
+ }));
251
+ expect(turn2Parts[1]).toEqual(expect.objectContaining({
252
+ functionResponse: expect.objectContaining({ id: 'call2' }),
253
+ }));
254
+ });
255
+ it('should handle tool execution failure gracefully and report error', async () => {
256
+ const definition = createTestDefinition([LSTool.Name]);
257
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
258
+ // Turn 1: Model calls ls, but it fails
259
+ mockModelResponse([
260
+ { name: LSTool.Name, args: { path: '/invalid' }, id: 'call1' },
261
+ ]);
262
+ const errorMessage = 'Internal failure.';
263
+ mockExecuteToolCall.mockResolvedValueOnce({
264
+ callId: 'call1',
265
+ resultDisplay: `Error: ${errorMessage}`,
266
+ responseParts: undefined, // Failed tools might return undefined parts
267
+ error: { message: errorMessage },
268
+ });
269
+ // Turn 2: Model stops
270
+ mockModelResponse([]);
271
+ mockModelResponse([], undefined, 'Failed.');
272
+ await executor.run({ goal: 'Failure test' }, signal);
273
+ // Verify that the error was reported in the activity stream
274
+ expect(activities).toContainEqual(expect.objectContaining({
275
+ type: 'ERROR',
276
+ data: {
277
+ error: errorMessage,
278
+ context: 'tool_call',
279
+ name: LSTool.Name,
280
+ },
281
+ }));
282
+ // Verify the input to the next model call (Turn 2) contains the fallback error message
283
+ const turn2Input = mockSendMessageStream.mock.calls[1][1];
284
+ const turn2Parts = turn2Input.message;
285
+ expect(turn2Parts).toEqual([
286
+ {
287
+ text: 'All tool calls failed. Please analyze the errors and try an alternative approach.',
288
+ },
289
+ ]);
290
+ });
291
+ it('SECURITY: should block calls to tools not registered for the agent at runtime', async () => {
292
+ // Agent definition only includes LSTool
293
+ const definition = createTestDefinition([LSTool.Name]);
294
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
295
+ // Turn 1: Model hallucinates a call to ReadFileTool
296
+ // (ReadFileTool exists in the parent registry but not the agent's isolated registry)
297
+ mockModelResponse([
298
+ {
299
+ name: ReadFileTool.Name,
300
+ args: { path: 'config.txt' },
301
+ id: 'call_blocked',
302
+ },
303
+ ]);
304
+ // Turn 2: Model stops
305
+ mockModelResponse([]);
306
+ // Extraction
307
+ mockModelResponse([], undefined, 'Done.');
308
+ const consoleWarnSpy = vi
309
+ .spyOn(console, 'warn')
310
+ .mockImplementation(() => { });
311
+ await executor.run({ goal: 'Security test' }, signal);
312
+ // Verify executeToolCall was NEVER called because the tool was unauthorized
313
+ expect(mockExecuteToolCall).not.toHaveBeenCalled();
314
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining(`attempted to call unauthorized tool '${ReadFileTool.Name}'`));
315
+ consoleWarnSpy.mockRestore();
316
+ // Verify the input to the next model call (Turn 2) indicates failure (as the only call was blocked)
317
+ const turn2Input = mockSendMessageStream.mock.calls[1][1];
318
+ const turn2Parts = turn2Input.message;
319
+ expect(turn2Parts[0].text).toContain('All tool calls failed');
320
+ });
321
+ it('should use OutputConfig completion_criteria in the extraction message', async () => {
322
+ const definition = createTestDefinition([LSTool.Name], {}, {
323
+ description: 'A summary.',
324
+ completion_criteria: ['Must include file names', 'Must be concise'],
325
+ });
326
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
327
+ // Turn 1: Model stops immediately
328
+ mockModelResponse([]);
329
+ // Extraction Phase
330
+ mockModelResponse([], undefined, 'Result: Done.');
331
+ await executor.run({ goal: 'Extraction test' }, signal);
332
+ // Verify the extraction call (the second call)
333
+ const extractionCallArgs = mockSendMessageStream.mock.calls[1][1];
334
+ const extractionMessageParts = extractionCallArgs.message;
335
+ const extractionText = extractionMessageParts[0].text;
336
+ expect(extractionText).toContain('Based on your work so far, provide: A summary.');
337
+ expect(extractionText).toContain('Be sure you have addressed:');
338
+ expect(extractionText).toContain('- Must include file names');
339
+ expect(extractionText).toContain('- Must be concise');
340
+ });
341
+ });
342
+ describe('run (Termination Conditions)', () => {
343
+ const mockKeepAliveResponse = () => {
344
+ mockModelResponse([{ name: LSTool.Name, args: { path: '.' }, id: 'loop' }], 'Looping');
345
+ mockExecuteToolCall.mockResolvedValue({
346
+ callId: 'loop',
347
+ resultDisplay: 'ok',
348
+ responseParts: [
349
+ { functionResponse: { name: LSTool.Name, response: {}, id: 'loop' } },
350
+ ],
351
+ error: undefined,
352
+ });
353
+ };
354
+ it('should terminate when max_turns is reached', async () => {
355
+ const MAX_TURNS = 2;
356
+ const definition = createTestDefinition([LSTool.Name], {
357
+ max_turns: MAX_TURNS,
358
+ });
359
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
360
+ // Turn 1
361
+ mockKeepAliveResponse();
362
+ // Turn 2
363
+ mockKeepAliveResponse();
364
+ const output = await executor.run({ goal: 'Termination test' }, signal);
365
+ expect(output.terminate_reason).toBe(AgentTerminateMode.MAX_TURNS);
366
+ expect(mockSendMessageStream).toHaveBeenCalledTimes(MAX_TURNS);
367
+ // Extraction phase should be skipped when termination is forced
368
+ expect(mockSendMessageStream).not.toHaveBeenCalledWith(expect.any(String), expect.any(Object), expect.stringContaining('#extraction'));
369
+ });
370
+ it('should terminate if timeout is reached', async () => {
371
+ const definition = createTestDefinition([LSTool.Name], {
372
+ max_time_minutes: 5,
373
+ max_turns: 100,
374
+ });
375
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
376
+ // Turn 1 setup
377
+ mockModelResponse([{ name: LSTool.Name, args: { path: '.' }, id: 'loop' }], 'Looping');
378
+ // Mock a tool call that takes a long time, causing the overall timeout
379
+ mockExecuteToolCall.mockImplementation(async () => {
380
+ // Advance time past the 5-minute limit during the tool call execution
381
+ await vi.advanceTimersByTimeAsync(5 * 60 * 1000 + 1);
382
+ return {
383
+ callId: 'loop',
384
+ resultDisplay: 'ok',
385
+ responseParts: [
386
+ {
387
+ functionResponse: { name: LSTool.Name, response: {}, id: 'loop' },
388
+ },
389
+ ],
390
+ error: undefined,
391
+ };
392
+ });
393
+ const output = await executor.run({ goal: 'Termination test' }, signal);
394
+ expect(output.terminate_reason).toBe(AgentTerminateMode.TIMEOUT);
395
+ // Should only have called the model once before the timeout check stopped it
396
+ expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
397
+ });
398
+ it('should terminate when AbortSignal is triggered mid-stream', async () => {
399
+ const definition = createTestDefinition();
400
+ const executor = await AgentExecutor.create(definition, mockConfig, onActivity);
401
+ // Mock the model response stream
402
+ mockSendMessageStream.mockImplementation(async () => (async function* () {
403
+ // Yield the first chunk
404
+ yield {
405
+ type: StreamEventType.CHUNK,
406
+ value: createMockResponseChunk([
407
+ { text: '**Thinking** Step 1', thought: true },
408
+ ]),
409
+ };
410
+ // Simulate abort happening mid-stream
411
+ abortController.abort();
412
+ // The loop in callModel should break immediately due to signal check.
413
+ })());
414
+ const output = await executor.run({ goal: 'Termination test' }, signal);
415
+ expect(output.terminate_reason).toBe(AgentTerminateMode.ABORTED);
416
+ });
417
+ });
418
+ });
419
+ //# sourceMappingURL=executor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.test.js","sourceRoot":"","sources":["../../../src/agents/executor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Config } from '../config/config.js';
7
+ import type { AnsiOutput } from '../utils/terminalSerializer.js';
8
+ import { BaseToolInvocation, type ToolResult } from '../tools/tools.js';
9
+ import type { AgentDefinition, AgentInputs } from './types.js';
10
+ /**
11
+ * Represents a validated, executable instance of a subagent tool.
12
+ *
13
+ * This class orchestrates the execution of a defined agent by:
14
+ * 1. Initializing the {@link AgentExecutor}.
15
+ * 2. Running the agent's execution loop.
16
+ * 3. Bridging the agent's streaming activity (e.g., thoughts) to the tool's
17
+ * live output stream.
18
+ * 4. Formatting the final result into a {@link ToolResult}.
19
+ */
20
+ export declare class SubagentInvocation extends BaseToolInvocation<AgentInputs, ToolResult> {
21
+ private readonly definition;
22
+ private readonly config;
23
+ /**
24
+ * @param params The validated input parameters for the agent.
25
+ * @param definition The definition object that configures the agent.
26
+ * @param config The global runtime configuration.
27
+ */
28
+ constructor(params: AgentInputs, definition: AgentDefinition, config: Config);
29
+ /**
30
+ * Returns a concise, human-readable description of the invocation.
31
+ * Used for logging and display purposes.
32
+ */
33
+ getDescription(): string;
34
+ /**
35
+ * Executes the subagent.
36
+ *
37
+ * @param signal An `AbortSignal` to cancel the agent's execution.
38
+ * @param updateOutput A callback to stream intermediate output, such as the
39
+ * agent's thoughts, to the user interface.
40
+ * @returns A `Promise` that resolves with the final `ToolResult`.
41
+ */
42
+ execute(signal: AbortSignal, updateOutput?: (output: string | AnsiOutput) => void): Promise<ToolResult>;
43
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AgentExecutor } from './executor.js';
7
+ import { BaseToolInvocation } from '../tools/tools.js';
8
+ import { ToolErrorType } from '../tools/tool-error.js';
9
+ const INPUT_PREVIEW_MAX_LENGTH = 50;
10
+ const DESCRIPTION_MAX_LENGTH = 200;
11
+ /**
12
+ * Represents a validated, executable instance of a subagent tool.
13
+ *
14
+ * This class orchestrates the execution of a defined agent by:
15
+ * 1. Initializing the {@link AgentExecutor}.
16
+ * 2. Running the agent's execution loop.
17
+ * 3. Bridging the agent's streaming activity (e.g., thoughts) to the tool's
18
+ * live output stream.
19
+ * 4. Formatting the final result into a {@link ToolResult}.
20
+ */
21
+ export class SubagentInvocation extends BaseToolInvocation {
22
+ definition;
23
+ config;
24
+ /**
25
+ * @param params The validated input parameters for the agent.
26
+ * @param definition The definition object that configures the agent.
27
+ * @param config The global runtime configuration.
28
+ */
29
+ constructor(params, definition, config) {
30
+ super(params);
31
+ this.definition = definition;
32
+ this.config = config;
33
+ }
34
+ /**
35
+ * Returns a concise, human-readable description of the invocation.
36
+ * Used for logging and display purposes.
37
+ */
38
+ getDescription() {
39
+ const inputSummary = Object.entries(this.params)
40
+ .map(([key, value]) => `${key}: ${String(value).slice(0, INPUT_PREVIEW_MAX_LENGTH)}`)
41
+ .join(', ');
42
+ const description = `Running subagent '${this.definition.name}' with inputs: { ${inputSummary} }`;
43
+ return description.slice(0, DESCRIPTION_MAX_LENGTH);
44
+ }
45
+ /**
46
+ * Executes the subagent.
47
+ *
48
+ * @param signal An `AbortSignal` to cancel the agent's execution.
49
+ * @param updateOutput A callback to stream intermediate output, such as the
50
+ * agent's thoughts, to the user interface.
51
+ * @returns A `Promise` that resolves with the final `ToolResult`.
52
+ */
53
+ async execute(signal, updateOutput) {
54
+ try {
55
+ if (updateOutput) {
56
+ updateOutput('Subagent starting...\n');
57
+ }
58
+ // Create an activity callback to bridge the executor's events to the
59
+ // tool's streaming output.
60
+ const onActivity = (activity) => {
61
+ if (!updateOutput)
62
+ return;
63
+ if (activity.type === 'THOUGHT_CHUNK' &&
64
+ typeof activity.data['text'] === 'string') {
65
+ updateOutput(`🤖💭 ${activity.data['text']}`);
66
+ }
67
+ };
68
+ const executor = await AgentExecutor.create(this.definition, this.config, onActivity);
69
+ const output = await executor.run(this.params, signal);
70
+ const resultContent = `Subagent '${this.definition.name}' finished.
71
+ Termination Reason: ${output.terminate_reason}
72
+ Result:
73
+ ${output.result}`;
74
+ const displayContent = `
75
+ Subagent ${this.definition.name} Finished
76
+
77
+ Termination Reason:\n ${output.terminate_reason}
78
+
79
+ Result:
80
+ ${output.result}
81
+ `;
82
+ return {
83
+ llmContent: [{ text: resultContent }],
84
+ returnDisplay: displayContent,
85
+ };
86
+ }
87
+ catch (error) {
88
+ const errorMessage = error instanceof Error ? error.message : String(error);
89
+ return {
90
+ llmContent: `Subagent '${this.definition.name}' failed. Error: ${errorMessage}`,
91
+ returnDisplay: `Subagent Failed: ${this.definition.name}\nError: ${errorMessage}`,
92
+ error: {
93
+ message: errorMessage,
94
+ type: ToolErrorType.EXECUTION_FAILED,
95
+ },
96
+ };
97
+ }
98
+ }
99
+ }
100
+ //# sourceMappingURL=invocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invocation.js","sourceRoot":"","sources":["../../../src/agents/invocation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};