@google/gemini-cli 0.18.0-preview.1 → 0.19.0-nightly.20251122.42c2e1b21

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 (203) hide show
  1. package/dist/google-gemini-cli-0.19.0-nightly.20251120.8e531dc02.tgz +0 -0
  2. package/dist/index.js +8 -6
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +3 -3
  5. package/dist/src/commands/extensions/examples/mcp-server/package.json +1 -1
  6. package/dist/src/config/auth.js +4 -0
  7. package/dist/src/config/auth.js.map +1 -1
  8. package/dist/src/config/auth.test.js +61 -37
  9. package/dist/src/config/auth.test.js.map +1 -1
  10. package/dist/src/config/config.integration.test.js +81 -198
  11. package/dist/src/config/config.integration.test.js.map +1 -1
  12. package/dist/src/config/config.js +2 -6
  13. package/dist/src/config/config.js.map +1 -1
  14. package/dist/src/config/config.test.js +196 -299
  15. package/dist/src/config/config.test.js.map +1 -1
  16. package/dist/src/config/extension.test.js +109 -133
  17. package/dist/src/config/extension.test.js.map +1 -1
  18. package/dist/src/config/extensions/consent.test.js +152 -0
  19. package/dist/src/config/extensions/consent.test.js.map +1 -0
  20. package/dist/src/config/extensions/extensionEnablement.test.js +82 -15
  21. package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -1
  22. package/dist/src/config/extensions/extensionSettings.test.js +105 -1
  23. package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
  24. package/dist/src/config/extensions/github.d.ts +1 -0
  25. package/dist/src/config/extensions/github.js +1 -1
  26. package/dist/src/config/extensions/github.js.map +1 -1
  27. package/dist/src/config/extensions/github.test.js +197 -318
  28. package/dist/src/config/extensions/github.test.js.map +1 -1
  29. package/dist/src/config/extensions/storage.test.d.ts +6 -0
  30. package/dist/src/config/extensions/storage.test.js +64 -0
  31. package/dist/src/config/extensions/storage.test.js.map +1 -0
  32. package/dist/src/config/extensions/update.test.js +154 -263
  33. package/dist/src/config/extensions/update.test.js.map +1 -1
  34. package/dist/src/config/extensions/variables.test.js +87 -1
  35. package/dist/src/config/extensions/variables.test.js.map +1 -1
  36. package/dist/src/config/sandboxConfig.d.ts +1 -1
  37. package/dist/src/config/sandboxConfig.js.map +1 -1
  38. package/dist/src/config/sandboxConfig.test.d.ts +6 -0
  39. package/dist/src/config/sandboxConfig.test.js +178 -0
  40. package/dist/src/config/sandboxConfig.test.js.map +1 -0
  41. package/dist/src/config/settingPaths.test.d.ts +6 -0
  42. package/dist/src/config/settingPaths.test.js +22 -0
  43. package/dist/src/config/settingPaths.test.js.map +1 -0
  44. package/dist/src/config/settings.test.js +164 -226
  45. package/dist/src/config/settings.test.js.map +1 -1
  46. package/dist/src/config/settingsSchema.d.ts +10 -10
  47. package/dist/src/config/settingsSchema.js +10 -10
  48. package/dist/src/config/settingsSchema.js.map +1 -1
  49. package/dist/src/config/settingsSchema.test.js +0 -6
  50. package/dist/src/config/settingsSchema.test.js.map +1 -1
  51. package/dist/src/gemini.d.ts +1 -1
  52. package/dist/src/gemini.js +5 -7
  53. package/dist/src/gemini.js.map +1 -1
  54. package/dist/src/gemini.test.js +18 -21
  55. package/dist/src/gemini.test.js.map +1 -1
  56. package/dist/src/generated/git-commit.d.ts +2 -2
  57. package/dist/src/generated/git-commit.js +2 -2
  58. package/dist/src/generated/git-commit.js.map +1 -1
  59. package/dist/src/services/BuiltinCommandLoader.js +1 -1
  60. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  61. package/dist/src/services/BuiltinCommandLoader.test.js +0 -22
  62. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  63. package/dist/src/test-utils/mockCommandContext.js +1 -1
  64. package/dist/src/test-utils/render.js +1 -1
  65. package/dist/src/test-utils/render.js.map +1 -1
  66. package/dist/src/ui/AppContainer.js +13 -11
  67. package/dist/src/ui/AppContainer.js.map +1 -1
  68. package/dist/src/ui/AppContainer.test.js +10 -16
  69. package/dist/src/ui/AppContainer.test.js.map +1 -1
  70. package/dist/src/ui/auth/AuthDialog.js +17 -10
  71. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  72. package/dist/src/ui/auth/AuthDialog.test.js +5 -2
  73. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  74. package/dist/src/ui/components/AppHeader.js +3 -17
  75. package/dist/src/ui/components/AppHeader.js.map +1 -1
  76. package/dist/src/ui/components/AppHeader.test.js +10 -4
  77. package/dist/src/ui/components/AppHeader.test.js.map +1 -1
  78. package/dist/src/ui/components/DebugProfiler.js +1 -1
  79. package/dist/src/ui/components/DebugProfiler.js.map +1 -1
  80. package/dist/src/ui/components/DialogManager.js +6 -1
  81. package/dist/src/ui/components/DialogManager.js.map +1 -1
  82. package/dist/src/ui/components/InputPrompt.js +1 -1
  83. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  84. package/dist/src/ui/components/LoadingIndicator.js +6 -1
  85. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  86. package/dist/src/ui/components/ModelDialog.test.js +1 -1
  87. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  88. package/dist/src/ui/components/SessionBrowser.d.ts +98 -0
  89. package/dist/src/ui/components/SessionBrowser.js +457 -0
  90. package/dist/src/ui/components/SessionBrowser.js.map +1 -0
  91. package/dist/src/ui/components/SessionBrowser.test.d.ts +6 -0
  92. package/dist/src/ui/components/SessionBrowser.test.js +245 -0
  93. package/dist/src/ui/components/SessionBrowser.test.js.map +1 -0
  94. package/dist/src/ui/components/messages/ShellToolMessage.js +2 -2
  95. package/dist/src/ui/components/messages/ShellToolMessage.js.map +1 -1
  96. package/dist/src/ui/components/messages/ToolMessage.d.ts +5 -0
  97. package/dist/src/ui/components/messages/ToolMessage.js +32 -3
  98. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  99. package/dist/src/ui/components/shared/text-buffer.js +20 -4
  100. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  101. package/dist/src/ui/components/shared/text-buffer.test.js +20 -0
  102. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  103. package/dist/src/ui/constants.d.ts +1 -0
  104. package/dist/src/ui/constants.js +1 -0
  105. package/dist/src/ui/constants.js.map +1 -1
  106. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -0
  107. package/dist/src/ui/hooks/shellCommandProcessor.js +3 -1
  108. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  109. package/dist/src/ui/hooks/useAlternateBuffer.js +1 -1
  110. package/dist/src/ui/hooks/useAlternateBuffer.js.map +1 -1
  111. package/dist/src/ui/hooks/useBanner.d.ts +14 -0
  112. package/dist/src/ui/hooks/useBanner.js +48 -0
  113. package/dist/src/ui/hooks/useBanner.js.map +1 -0
  114. package/dist/src/ui/hooks/useBanner.test.d.ts +6 -0
  115. package/dist/src/ui/hooks/useBanner.test.js +92 -0
  116. package/dist/src/ui/hooks/useBanner.test.js.map +1 -0
  117. package/dist/src/ui/hooks/useBracketedPaste.js +3 -5
  118. package/dist/src/ui/hooks/useBracketedPaste.js.map +1 -1
  119. package/dist/src/ui/hooks/useGeminiStream.d.ts +1 -0
  120. package/dist/src/ui/hooks/useGeminiStream.js +6 -4
  121. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  122. package/dist/src/ui/hooks/useGeminiStream.test.js +1 -1
  123. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  124. package/dist/src/ui/hooks/useInactivityTimer.d.ts +14 -0
  125. package/dist/src/ui/hooks/useInactivityTimer.js +30 -0
  126. package/dist/src/ui/hooks/useInactivityTimer.js.map +1 -0
  127. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  128. package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
  129. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  130. package/dist/src/ui/hooks/useLoadingIndicator.test.js +16 -5
  131. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  132. package/dist/src/ui/hooks/usePhraseCycler.d.ts +4 -1
  133. package/dist/src/ui/hooks/usePhraseCycler.js +52 -43
  134. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  135. package/dist/src/ui/hooks/usePhraseCycler.test.js +52 -3
  136. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
  137. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +2 -1
  138. package/dist/src/ui/hooks/useReactToolScheduler.js +3 -0
  139. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  140. package/dist/src/ui/hooks/useSessionBrowser.d.ts +18 -1
  141. package/dist/src/ui/hooks/useSessionBrowser.js +59 -0
  142. package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
  143. package/dist/src/ui/hooks/useSessionBrowser.test.js +154 -526
  144. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +1 -1
  145. package/dist/src/ui/hooks/useSlashCompletion.test.js +1 -1
  146. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  147. package/dist/src/ui/hooks/useToolScheduler.test.js +1 -1
  148. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  149. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.d.ts +6 -0
  150. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js +121 -0
  151. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js.map +1 -0
  152. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.d.ts +6 -0
  153. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js +34 -0
  154. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js.map +1 -0
  155. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.d.ts +6 -0
  156. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js +34 -0
  157. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js.map +1 -0
  158. package/dist/src/ui/privacy/PrivacyNotice.test.d.ts +6 -0
  159. package/dist/src/ui/privacy/PrivacyNotice.test.js +62 -0
  160. package/dist/src/ui/privacy/PrivacyNotice.test.js.map +1 -0
  161. package/dist/src/ui/types.js +1 -1
  162. package/dist/src/ui/utils/bracketedPaste.d.ts +7 -0
  163. package/dist/src/ui/utils/bracketedPaste.js +15 -0
  164. package/dist/src/ui/utils/bracketedPaste.js.map +1 -0
  165. package/dist/src/ui/utils/kittyProtocolDetector.js +3 -4
  166. package/dist/src/ui/utils/kittyProtocolDetector.js.map +1 -1
  167. package/dist/src/ui/utils/mouse.d.ts +2 -2
  168. package/dist/src/ui/utils/mouse.js +2 -11
  169. package/dist/src/ui/utils/mouse.js.map +1 -1
  170. package/dist/src/utils/persistentState.d.ts +1 -1
  171. package/dist/src/utils/sessionCleanup.test.js +38 -0
  172. package/dist/src/utils/sessionCleanup.test.js.map +1 -1
  173. package/dist/src/utils/sessionUtils.d.ts +49 -4
  174. package/dist/src/utils/sessionUtils.js +100 -25
  175. package/dist/src/utils/sessionUtils.js.map +1 -1
  176. package/dist/src/utils/sessionUtils.test.js +46 -3
  177. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  178. package/dist/src/utils/sessions.js +4 -1
  179. package/dist/src/utils/sessions.js.map +1 -1
  180. package/dist/src/utils/sessions.test.js +42 -0
  181. package/dist/src/utils/sessions.test.js.map +1 -1
  182. package/dist/src/zed-integration/connection.test.d.ts +6 -0
  183. package/dist/src/zed-integration/connection.test.js +175 -0
  184. package/dist/src/zed-integration/connection.test.js.map +1 -0
  185. package/dist/src/zed-integration/fileSystemService.test.d.ts +6 -0
  186. package/dist/src/zed-integration/fileSystemService.test.js +98 -0
  187. package/dist/src/zed-integration/fileSystemService.test.js.map +1 -0
  188. package/dist/src/zed-integration/schema.d.ts +30 -30
  189. package/dist/src/zed-integration/zedIntegration.d.ts +31 -1
  190. package/dist/src/zed-integration/zedIntegration.js +5 -2
  191. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  192. package/dist/src/zed-integration/zedIntegration.test.d.ts +6 -0
  193. package/dist/src/zed-integration/zedIntegration.test.js +619 -0
  194. package/dist/src/zed-integration/zedIntegration.test.js.map +1 -0
  195. package/dist/tsconfig.tsbuildinfo +1 -1
  196. package/package.json +4 -4
  197. package/dist/google-gemini-cli-0.18.0-preview.0.tgz +0 -0
  198. package/dist/src/utils/stdio.d.ts +0 -32
  199. package/dist/src/utils/stdio.js +0 -85
  200. package/dist/src/utils/stdio.js.map +0 -1
  201. package/dist/src/utils/stdio.test.js +0 -47
  202. package/dist/src/utils/stdio.test.js.map +0 -1
  203. /package/dist/src/{utils/stdio.test.d.ts → config/extensions/consent.test.d.ts} +0 -0
@@ -0,0 +1,619 @@
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 { GeminiAgent, Session } from './zedIntegration.js';
8
+ import * as acp from './acp.js';
9
+ import { AuthType, ToolConfirmationOutcome, StreamEventType, isWithinRoot, ReadManyFilesTool, } from '@google/gemini-cli-core';
10
+ import { SettingScope } from '../config/settings.js';
11
+ import { loadCliConfig } from '../config/config.js';
12
+ import * as fs from 'node:fs/promises';
13
+ import * as path from 'node:path';
14
+ vi.mock('../config/config.js', () => ({
15
+ loadCliConfig: vi.fn(),
16
+ }));
17
+ vi.mock('node:crypto', () => ({
18
+ randomUUID: () => 'test-session-id',
19
+ }));
20
+ vi.mock('node:fs/promises');
21
+ vi.mock('node:path', async (importOriginal) => {
22
+ const actual = await importOriginal();
23
+ return {
24
+ ...actual,
25
+ resolve: vi.fn(),
26
+ };
27
+ });
28
+ // Mock ReadManyFilesTool
29
+ vi.mock('@google/gemini-cli-core', async (importOriginal) => {
30
+ const actual = await importOriginal();
31
+ return {
32
+ ...actual,
33
+ ReadManyFilesTool: vi.fn().mockImplementation(() => ({
34
+ name: 'read_many_files',
35
+ kind: 'native',
36
+ build: vi.fn().mockReturnValue({
37
+ getDescription: () => 'Read files',
38
+ toolLocations: () => [],
39
+ execute: vi.fn().mockResolvedValue({
40
+ llmContent: ['--- file.txt ---\n\nFile content\n\n'],
41
+ }),
42
+ }),
43
+ })),
44
+ logToolCall: vi.fn(),
45
+ isWithinRoot: vi.fn().mockReturnValue(true),
46
+ };
47
+ });
48
+ // Helper to create mock streams
49
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
+ async function* createMockStream(items) {
51
+ for (const item of items) {
52
+ yield item;
53
+ }
54
+ }
55
+ describe('GeminiAgent', () => {
56
+ let mockConfig;
57
+ let mockSettings;
58
+ let mockArgv;
59
+ let mockClient;
60
+ let agent;
61
+ beforeEach(() => {
62
+ mockConfig = {
63
+ refreshAuth: vi.fn(),
64
+ initialize: vi.fn(),
65
+ getFileSystemService: vi.fn(),
66
+ setFileSystemService: vi.fn(),
67
+ getGeminiClient: vi.fn().mockReturnValue({
68
+ startChat: vi.fn().mockResolvedValue({}),
69
+ }),
70
+ };
71
+ mockSettings = {
72
+ merged: {
73
+ security: { auth: { selectedType: 'login_with_google' } },
74
+ mcpServers: {},
75
+ },
76
+ setValue: vi.fn(),
77
+ };
78
+ mockArgv = {};
79
+ mockClient = {
80
+ sessionUpdate: vi.fn(),
81
+ };
82
+ loadCliConfig.mockResolvedValue(mockConfig);
83
+ agent = new GeminiAgent(mockConfig, mockSettings, mockArgv, mockClient);
84
+ });
85
+ it('should initialize correctly', async () => {
86
+ const response = await agent.initialize({
87
+ clientCapabilities: { fs: { readTextFile: true, writeTextFile: true } },
88
+ protocolVersion: 1,
89
+ });
90
+ expect(response.protocolVersion).toBe(acp.PROTOCOL_VERSION);
91
+ expect(response.authMethods).toHaveLength(3);
92
+ expect(response.agentCapabilities.loadSession).toBe(false);
93
+ });
94
+ it('should authenticate correctly', async () => {
95
+ await agent.authenticate({
96
+ methodId: AuthType.LOGIN_WITH_GOOGLE,
97
+ authMethod: {
98
+ id: AuthType.LOGIN_WITH_GOOGLE,
99
+ name: 'Log in with Google',
100
+ description: null,
101
+ },
102
+ });
103
+ expect(mockConfig.refreshAuth).toHaveBeenCalledWith(AuthType.LOGIN_WITH_GOOGLE);
104
+ expect(mockSettings.setValue).toHaveBeenCalledWith(SettingScope.User, 'security.auth.selectedType', AuthType.LOGIN_WITH_GOOGLE);
105
+ });
106
+ it('should create a new session', async () => {
107
+ const response = await agent.newSession({
108
+ cwd: '/tmp',
109
+ mcpServers: [],
110
+ });
111
+ expect(response.sessionId).toBe('test-session-id');
112
+ expect(loadCliConfig).toHaveBeenCalled();
113
+ expect(mockConfig.initialize).toHaveBeenCalled();
114
+ expect(mockConfig.getGeminiClient).toHaveBeenCalled();
115
+ });
116
+ it('should create a new session with mcp servers', async () => {
117
+ const mcpServers = [
118
+ {
119
+ name: 'test-server',
120
+ command: 'node',
121
+ args: ['server.js'],
122
+ env: [{ name: 'KEY', value: 'VALUE' }],
123
+ },
124
+ ];
125
+ await agent.newSession({
126
+ cwd: '/tmp',
127
+ mcpServers,
128
+ });
129
+ expect(loadCliConfig).toHaveBeenCalledWith(expect.objectContaining({
130
+ mcpServers: expect.objectContaining({
131
+ 'test-server': expect.objectContaining({
132
+ command: 'node',
133
+ args: ['server.js'],
134
+ env: { KEY: 'VALUE' },
135
+ }),
136
+ }),
137
+ }), 'test-session-id', mockArgv, '/tmp');
138
+ });
139
+ it('should handle authentication failure gracefully', async () => {
140
+ mockConfig.refreshAuth.mockRejectedValue(new Error('Auth failed'));
141
+ const debugSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
142
+ // Should throw RequestError.authRequired()
143
+ await expect(agent.newSession({
144
+ cwd: '/tmp',
145
+ mcpServers: [],
146
+ })).rejects.toMatchObject({
147
+ message: 'Authentication required',
148
+ });
149
+ debugSpy.mockRestore();
150
+ });
151
+ it('should initialize file system service if client supports it', async () => {
152
+ agent = new GeminiAgent(mockConfig, mockSettings, mockArgv, mockClient);
153
+ await agent.initialize({
154
+ clientCapabilities: { fs: { readTextFile: true, writeTextFile: true } },
155
+ protocolVersion: 1,
156
+ });
157
+ await agent.newSession({
158
+ cwd: '/tmp',
159
+ mcpServers: [],
160
+ });
161
+ expect(mockConfig.setFileSystemService).toHaveBeenCalled();
162
+ });
163
+ it('should cancel a session', async () => {
164
+ await agent.newSession({ cwd: '/tmp', mcpServers: [] });
165
+ // Mock the session's cancelPendingPrompt
166
+ const session = agent.sessions.get('test-session-id');
167
+ if (!session)
168
+ throw new Error('Session not found');
169
+ session.cancelPendingPrompt = vi.fn();
170
+ await agent.cancel({ sessionId: 'test-session-id' });
171
+ expect(session.cancelPendingPrompt).toHaveBeenCalled();
172
+ });
173
+ it('should throw error when cancelling non-existent session', async () => {
174
+ await expect(agent.cancel({ sessionId: 'unknown' })).rejects.toThrow('Session not found');
175
+ });
176
+ it('should delegate prompt to session', async () => {
177
+ await agent.newSession({ cwd: '/tmp', mcpServers: [] });
178
+ const session = agent.sessions.get('test-session-id');
179
+ if (!session)
180
+ throw new Error('Session not found');
181
+ session.prompt = vi.fn().mockResolvedValue({ stopReason: 'end_turn' });
182
+ const result = await agent.prompt({
183
+ sessionId: 'test-session-id',
184
+ prompt: [],
185
+ });
186
+ expect(session.prompt).toHaveBeenCalled();
187
+ expect(result).toEqual({ stopReason: 'end_turn' });
188
+ });
189
+ });
190
+ describe('Session', () => {
191
+ let mockChat;
192
+ let mockConfig;
193
+ let mockClient;
194
+ let session;
195
+ let mockToolRegistry;
196
+ let mockTool;
197
+ beforeEach(() => {
198
+ mockChat = {
199
+ sendMessageStream: vi.fn(),
200
+ addHistory: vi.fn(),
201
+ };
202
+ mockTool = {
203
+ kind: 'native',
204
+ build: vi.fn().mockReturnValue({
205
+ getDescription: () => 'Test Tool',
206
+ toolLocations: () => [],
207
+ shouldConfirmExecute: vi.fn().mockResolvedValue(null),
208
+ execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
209
+ }),
210
+ };
211
+ mockToolRegistry = {
212
+ getTool: vi.fn().mockReturnValue(mockTool),
213
+ };
214
+ mockConfig = {
215
+ isInFallbackMode: vi.fn().mockReturnValue(false),
216
+ getModel: vi.fn().mockReturnValue('gemini-pro'),
217
+ getPreviewFeatures: vi.fn().mockReturnValue({}),
218
+ getToolRegistry: vi.fn().mockReturnValue(mockToolRegistry),
219
+ getFileService: vi.fn().mockReturnValue({
220
+ shouldIgnoreFile: vi.fn().mockReturnValue(false),
221
+ }),
222
+ getFileFilteringOptions: vi.fn().mockReturnValue({}),
223
+ getTargetDir: vi.fn().mockReturnValue('/tmp'),
224
+ getEnableRecursiveFileSearch: vi.fn().mockReturnValue(false),
225
+ getDebugMode: vi.fn().mockReturnValue(false),
226
+ };
227
+ mockClient = {
228
+ sessionUpdate: vi.fn(),
229
+ requestPermission: vi.fn(),
230
+ sendNotification: vi.fn(),
231
+ };
232
+ session = new Session('session-1', mockChat, mockConfig, mockClient);
233
+ });
234
+ afterEach(() => {
235
+ vi.clearAllMocks();
236
+ });
237
+ it('should handle prompt with text response', async () => {
238
+ const stream = createMockStream([
239
+ {
240
+ type: StreamEventType.CHUNK,
241
+ value: {
242
+ candidates: [{ content: { parts: [{ text: 'Hello' }] } }],
243
+ },
244
+ },
245
+ ]);
246
+ mockChat.sendMessageStream.mockResolvedValue(stream);
247
+ const result = await session.prompt({
248
+ sessionId: 'session-1',
249
+ prompt: [{ type: 'text', text: 'Hi' }],
250
+ });
251
+ expect(mockChat.sendMessageStream).toHaveBeenCalled();
252
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
253
+ sessionId: 'session-1',
254
+ update: {
255
+ sessionUpdate: 'agent_message_chunk',
256
+ content: { type: 'text', text: 'Hello' },
257
+ },
258
+ });
259
+ expect(result).toEqual({ stopReason: 'end_turn' });
260
+ });
261
+ it('should handle tool calls', async () => {
262
+ const stream1 = createMockStream([
263
+ {
264
+ type: StreamEventType.CHUNK,
265
+ value: {
266
+ functionCalls: [{ name: 'test_tool', args: { foo: 'bar' } }],
267
+ },
268
+ },
269
+ ]);
270
+ const stream2 = createMockStream([
271
+ {
272
+ type: StreamEventType.CHUNK,
273
+ value: {
274
+ candidates: [{ content: { parts: [{ text: 'Result' }] } }],
275
+ },
276
+ },
277
+ ]);
278
+ mockChat.sendMessageStream
279
+ .mockResolvedValueOnce(stream1)
280
+ .mockResolvedValueOnce(stream2);
281
+ const result = await session.prompt({
282
+ sessionId: 'session-1',
283
+ prompt: [{ type: 'text', text: 'Call tool' }],
284
+ });
285
+ expect(mockToolRegistry.getTool).toHaveBeenCalledWith('test_tool');
286
+ expect(mockTool.build).toHaveBeenCalledWith({ foo: 'bar' });
287
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith(expect.objectContaining({
288
+ update: expect.objectContaining({
289
+ sessionUpdate: 'tool_call',
290
+ status: 'in_progress',
291
+ }),
292
+ }));
293
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith(expect.objectContaining({
294
+ update: expect.objectContaining({
295
+ sessionUpdate: 'tool_call_update',
296
+ status: 'completed',
297
+ }),
298
+ }));
299
+ expect(result).toEqual({ stopReason: 'end_turn' });
300
+ });
301
+ it('should handle tool call permission request', async () => {
302
+ const confirmationDetails = {
303
+ type: 'info',
304
+ onConfirm: vi.fn(),
305
+ };
306
+ mockTool.build.mockReturnValue({
307
+ getDescription: () => 'Test Tool',
308
+ toolLocations: () => [],
309
+ shouldConfirmExecute: vi.fn().mockResolvedValue(confirmationDetails),
310
+ execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
311
+ });
312
+ mockClient.requestPermission.mockResolvedValue({
313
+ outcome: {
314
+ outcome: 'selected',
315
+ optionId: ToolConfirmationOutcome.ProceedOnce,
316
+ },
317
+ });
318
+ const stream1 = createMockStream([
319
+ {
320
+ type: StreamEventType.CHUNK,
321
+ value: {
322
+ functionCalls: [{ name: 'test_tool', args: {} }],
323
+ },
324
+ },
325
+ ]);
326
+ const stream2 = createMockStream([
327
+ {
328
+ type: StreamEventType.CHUNK,
329
+ value: { candidates: [] },
330
+ },
331
+ ]);
332
+ mockChat.sendMessageStream
333
+ .mockResolvedValueOnce(stream1)
334
+ .mockResolvedValueOnce(stream2);
335
+ await session.prompt({
336
+ sessionId: 'session-1',
337
+ prompt: [{ type: 'text', text: 'Call tool' }],
338
+ });
339
+ expect(mockClient.requestPermission).toHaveBeenCalled();
340
+ expect(confirmationDetails.onConfirm).toHaveBeenCalledWith(ToolConfirmationOutcome.ProceedOnce);
341
+ });
342
+ it('should handle tool call cancellation by user', async () => {
343
+ const confirmationDetails = {
344
+ type: 'info',
345
+ onConfirm: vi.fn(),
346
+ };
347
+ mockTool.build.mockReturnValue({
348
+ getDescription: () => 'Test Tool',
349
+ toolLocations: () => [],
350
+ shouldConfirmExecute: vi.fn().mockResolvedValue(confirmationDetails),
351
+ execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
352
+ });
353
+ mockClient.requestPermission.mockResolvedValue({
354
+ outcome: { outcome: 'cancelled' },
355
+ });
356
+ const stream1 = createMockStream([
357
+ {
358
+ type: StreamEventType.CHUNK,
359
+ value: {
360
+ functionCalls: [{ name: 'test_tool', args: {} }],
361
+ },
362
+ },
363
+ ]);
364
+ const stream2 = createMockStream([
365
+ {
366
+ type: StreamEventType.CHUNK,
367
+ value: { candidates: [] },
368
+ },
369
+ ]);
370
+ mockChat.sendMessageStream
371
+ .mockResolvedValueOnce(stream1)
372
+ .mockResolvedValueOnce(stream2);
373
+ await session.prompt({
374
+ sessionId: 'session-1',
375
+ prompt: [{ type: 'text', text: 'Call tool' }],
376
+ });
377
+ // When cancelled, it sends an error response to the model
378
+ // We can verify that the second call to sendMessageStream contains the error
379
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(2);
380
+ const secondCallArgs = mockChat.sendMessageStream.mock.calls[1];
381
+ const parts = secondCallArgs[1]; // parts
382
+ expect(parts).toEqual(expect.arrayContaining([
383
+ expect.objectContaining({
384
+ functionResponse: expect.objectContaining({
385
+ response: {
386
+ error: expect.stringContaining('canceled by the user'),
387
+ },
388
+ }),
389
+ }),
390
+ ]));
391
+ });
392
+ it('should handle @path resolution', async () => {
393
+ path.resolve.mockReturnValue('/tmp/file.txt');
394
+ fs.stat.mockResolvedValue({
395
+ isDirectory: () => false,
396
+ });
397
+ isWithinRoot.mockReturnValue(true);
398
+ const stream = createMockStream([
399
+ {
400
+ type: StreamEventType.CHUNK,
401
+ value: { candidates: [] },
402
+ },
403
+ ]);
404
+ mockChat.sendMessageStream.mockResolvedValue(stream);
405
+ await session.prompt({
406
+ sessionId: 'session-1',
407
+ prompt: [
408
+ { type: 'text', text: 'Read' },
409
+ {
410
+ type: 'resource_link',
411
+ uri: 'file://file.txt',
412
+ mimeType: 'text/plain',
413
+ name: 'file.txt',
414
+ },
415
+ ],
416
+ });
417
+ expect(path.resolve).toHaveBeenCalled();
418
+ expect(fs.stat).toHaveBeenCalled();
419
+ // Verify ReadManyFilesTool was used (implicitly by checking if sendMessageStream was called with resolved content)
420
+ // Since we mocked ReadManyFilesTool to return specific content, we can check the args passed to sendMessageStream
421
+ expect(mockChat.sendMessageStream).toHaveBeenCalledWith(expect.anything(), expect.arrayContaining([
422
+ expect.objectContaining({
423
+ text: expect.stringContaining('Content from @file.txt'),
424
+ }),
425
+ ]), expect.anything(), expect.anything());
426
+ });
427
+ it('should handle cancellation during prompt', async () => {
428
+ let streamController;
429
+ const stream = new ReadableStream({
430
+ start(controller) {
431
+ streamController = controller;
432
+ },
433
+ });
434
+ let streamStarted;
435
+ const streamStartedPromise = new Promise((resolve) => {
436
+ streamStarted = resolve;
437
+ });
438
+ // Adapt web stream to async iterable
439
+ async function* asyncStream() {
440
+ process.stdout.write('TEST: asyncStream started\n');
441
+ streamStarted(true);
442
+ const reader = stream.getReader();
443
+ try {
444
+ while (true) {
445
+ process.stdout.write('TEST: waiting for read\n');
446
+ const { done, value } = await reader.read();
447
+ process.stdout.write(`TEST: read returned done=${done}\n`);
448
+ if (done)
449
+ break;
450
+ yield value;
451
+ }
452
+ }
453
+ finally {
454
+ process.stdout.write('TEST: releasing lock\n');
455
+ reader.releaseLock();
456
+ }
457
+ }
458
+ mockChat.sendMessageStream.mockResolvedValue(asyncStream());
459
+ process.stdout.write('TEST: calling prompt\n');
460
+ const promptPromise = session.prompt({
461
+ sessionId: 'session-1',
462
+ prompt: [{ type: 'text', text: 'Hi' }],
463
+ });
464
+ process.stdout.write('TEST: waiting for streamStarted\n');
465
+ await streamStartedPromise;
466
+ process.stdout.write('TEST: streamStarted\n');
467
+ await session.cancelPendingPrompt();
468
+ process.stdout.write('TEST: cancelled\n');
469
+ // Close the stream to allow prompt loop to continue and check aborted signal
470
+ streamController.close();
471
+ process.stdout.write('TEST: stream closed\n');
472
+ const result = await promptPromise;
473
+ process.stdout.write(`TEST: result received ${JSON.stringify(result)}\n`);
474
+ expect(result).toEqual({ stopReason: 'cancelled' });
475
+ });
476
+ it('should handle rate limit error', async () => {
477
+ const error = new Error('Rate limit');
478
+ error.status = 429;
479
+ mockChat.sendMessageStream.mockRejectedValue(error);
480
+ await expect(session.prompt({
481
+ sessionId: 'session-1',
482
+ prompt: [{ type: 'text', text: 'Hi' }],
483
+ })).rejects.toMatchObject({
484
+ code: 429,
485
+ message: 'Rate limit exceeded. Try again later.',
486
+ });
487
+ });
488
+ it('should handle tool execution error', async () => {
489
+ mockTool.build.mockReturnValue({
490
+ getDescription: () => 'Test Tool',
491
+ toolLocations: () => [],
492
+ shouldConfirmExecute: vi.fn().mockResolvedValue(null),
493
+ execute: vi.fn().mockRejectedValue(new Error('Tool failed')),
494
+ });
495
+ const stream1 = createMockStream([
496
+ {
497
+ type: StreamEventType.CHUNK,
498
+ value: {
499
+ functionCalls: [{ name: 'test_tool', args: {} }],
500
+ },
501
+ },
502
+ ]);
503
+ const stream2 = createMockStream([
504
+ {
505
+ type: StreamEventType.CHUNK,
506
+ value: { candidates: [] },
507
+ },
508
+ ]);
509
+ mockChat.sendMessageStream
510
+ .mockResolvedValueOnce(stream1)
511
+ .mockResolvedValueOnce(stream2);
512
+ await session.prompt({
513
+ sessionId: 'session-1',
514
+ prompt: [{ type: 'text', text: 'Call tool' }],
515
+ });
516
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith(expect.objectContaining({
517
+ update: expect.objectContaining({
518
+ sessionUpdate: 'tool_call_update',
519
+ status: 'failed',
520
+ content: expect.arrayContaining([
521
+ expect.objectContaining({
522
+ content: expect.objectContaining({ text: 'Tool failed' }),
523
+ }),
524
+ ]),
525
+ }),
526
+ }));
527
+ });
528
+ it('should handle missing tool', async () => {
529
+ mockToolRegistry.getTool.mockReturnValue(undefined);
530
+ const stream1 = createMockStream([
531
+ {
532
+ type: StreamEventType.CHUNK,
533
+ value: {
534
+ functionCalls: [{ name: 'unknown_tool', args: {} }],
535
+ },
536
+ },
537
+ ]);
538
+ const stream2 = createMockStream([
539
+ {
540
+ type: StreamEventType.CHUNK,
541
+ value: { candidates: [] },
542
+ },
543
+ ]);
544
+ mockChat.sendMessageStream
545
+ .mockResolvedValueOnce(stream1)
546
+ .mockResolvedValueOnce(stream2);
547
+ await session.prompt({
548
+ sessionId: 'session-1',
549
+ prompt: [{ type: 'text', text: 'Call tool' }],
550
+ });
551
+ // Should send error response to model
552
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(2);
553
+ const secondCallArgs = mockChat.sendMessageStream.mock.calls[1];
554
+ const parts = secondCallArgs[1];
555
+ expect(parts).toEqual(expect.arrayContaining([
556
+ expect.objectContaining({
557
+ functionResponse: expect.objectContaining({
558
+ response: {
559
+ error: expect.stringContaining('not found in registry'),
560
+ },
561
+ }),
562
+ }),
563
+ ]));
564
+ });
565
+ it('should ignore files based on configuration', async () => {
566
+ mockConfig.getFileService().shouldIgnoreFile.mockReturnValue(true);
567
+ const stream = createMockStream([
568
+ {
569
+ type: StreamEventType.CHUNK,
570
+ value: { candidates: [] },
571
+ },
572
+ ]);
573
+ mockChat.sendMessageStream.mockResolvedValue(stream);
574
+ await session.prompt({
575
+ sessionId: 'session-1',
576
+ prompt: [
577
+ {
578
+ type: 'resource_link',
579
+ uri: 'file://ignored.txt',
580
+ mimeType: 'text/plain',
581
+ name: 'ignored.txt',
582
+ },
583
+ ],
584
+ });
585
+ // Should not read file
586
+ expect(mockToolRegistry.getTool).not.toHaveBeenCalledWith('read_many_files');
587
+ });
588
+ it('should handle directory resolution with glob', async () => {
589
+ path.resolve.mockReturnValue('/tmp/dir');
590
+ fs.stat.mockResolvedValue({
591
+ isDirectory: () => true,
592
+ });
593
+ isWithinRoot.mockReturnValue(true);
594
+ const stream = createMockStream([
595
+ {
596
+ type: StreamEventType.CHUNK,
597
+ value: { candidates: [] },
598
+ },
599
+ ]);
600
+ mockChat.sendMessageStream.mockResolvedValue(stream);
601
+ await session.prompt({
602
+ sessionId: 'session-1',
603
+ prompt: [
604
+ {
605
+ type: 'resource_link',
606
+ uri: 'file://dir',
607
+ mimeType: 'text/plain',
608
+ name: 'dir',
609
+ },
610
+ ],
611
+ });
612
+ // Should use glob
613
+ // ReadManyFilesTool is instantiated directly, so we check if the mock instance's build method was called
614
+ const MockReadManyFilesTool = ReadManyFilesTool;
615
+ const mockInstance = MockReadManyFilesTool.mock.results[MockReadManyFilesTool.mock.results.length - 1].value;
616
+ expect(mockInstance.build).toHaveBeenCalled();
617
+ });
618
+ });
619
+ //# sourceMappingURL=zedIntegration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zedIntegration.test.js","sourceRoot":"","sources":["../../../src/zed-integration/zedIntegration.test.ts"],"names":[],"mappings":"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"}