@google/gemini-cli-core 0.13.0-nightly.20251102.d7243fb8 → 0.13.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 (204) hide show
  1. package/dist/google-gemini-cli-core-0.13.0-nightly.20251031.c89bc30d.tgz +0 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/agents/executor.d.ts +19 -0
  6. package/dist/src/agents/executor.js +226 -32
  7. package/dist/src/agents/executor.js.map +1 -1
  8. package/dist/src/agents/executor.test.js +335 -9
  9. package/dist/src/agents/executor.test.js.map +1 -1
  10. package/dist/src/agents/types.d.ts +2 -1
  11. package/dist/src/agents/types.js +1 -0
  12. package/dist/src/agents/types.js.map +1 -1
  13. package/dist/src/code_assist/experiments/client_metadata.d.ts +12 -0
  14. package/dist/src/code_assist/experiments/client_metadata.js +49 -0
  15. package/dist/src/code_assist/experiments/client_metadata.js.map +1 -0
  16. package/dist/src/code_assist/experiments/experiments.d.ts +17 -0
  17. package/dist/src/code_assist/experiments/experiments.js +36 -0
  18. package/dist/src/code_assist/experiments/experiments.js.map +1 -0
  19. package/dist/src/code_assist/experiments/types.d.ts +35 -0
  20. package/dist/src/code_assist/experiments/types.js +7 -0
  21. package/dist/src/code_assist/experiments/types.js.map +1 -0
  22. package/dist/src/code_assist/server.d.ts +3 -1
  23. package/dist/src/code_assist/server.js +11 -0
  24. package/dist/src/code_assist/server.js.map +1 -1
  25. package/dist/src/code_assist/server.test.js +17 -0
  26. package/dist/src/code_assist/server.test.js.map +1 -1
  27. package/dist/src/code_assist/types.d.ts +1 -1
  28. package/dist/src/code_assist/types.js.map +1 -1
  29. package/dist/src/config/config.d.ts +51 -15
  30. package/dist/src/config/config.js +130 -30
  31. package/dist/src/config/config.js.map +1 -1
  32. package/dist/src/config/config.test.js +231 -1
  33. package/dist/src/config/config.test.js.map +1 -1
  34. package/dist/src/config/models.d.ts +1 -1
  35. package/dist/src/config/models.js +2 -2
  36. package/dist/src/config/models.js.map +1 -1
  37. package/dist/src/config/storage.d.ts +2 -0
  38. package/dist/src/config/storage.js +17 -0
  39. package/dist/src/config/storage.js.map +1 -1
  40. package/dist/src/core/apiKeyCredentialStorage.js +7 -7
  41. package/dist/src/core/apiKeyCredentialStorage.js.map +1 -1
  42. package/dist/src/core/apiKeyCredentialStorage.test.js +5 -0
  43. package/dist/src/core/apiKeyCredentialStorage.test.js.map +1 -1
  44. package/dist/src/core/logger.js +10 -9
  45. package/dist/src/core/logger.js.map +1 -1
  46. package/dist/src/core/prompts.js +104 -55
  47. package/dist/src/core/prompts.js.map +1 -1
  48. package/dist/src/generated/git-commit.d.ts +2 -2
  49. package/dist/src/generated/git-commit.js +2 -2
  50. package/dist/src/generated/git-commit.js.map +1 -1
  51. package/dist/src/hooks/hookPlanner.d.ts +46 -0
  52. package/dist/src/hooks/hookPlanner.js +108 -0
  53. package/dist/src/hooks/hookPlanner.js.map +1 -0
  54. package/dist/src/hooks/hookPlanner.test.d.ts +6 -0
  55. package/dist/src/hooks/hookPlanner.test.js +255 -0
  56. package/dist/src/hooks/hookPlanner.test.js.map +1 -0
  57. package/dist/src/hooks/hookRegistry.d.ts +87 -0
  58. package/dist/src/hooks/hookRegistry.js +198 -0
  59. package/dist/src/hooks/hookRegistry.js.map +1 -0
  60. package/dist/src/hooks/hookRegistry.test.d.ts +6 -0
  61. package/dist/src/hooks/hookRegistry.test.js +341 -0
  62. package/dist/src/hooks/hookRegistry.test.js.map +1 -0
  63. package/dist/src/hooks/hookTranslator.d.ts +113 -0
  64. package/dist/src/hooks/hookTranslator.js +232 -0
  65. package/dist/src/hooks/hookTranslator.js.map +1 -0
  66. package/dist/src/hooks/hookTranslator.test.d.ts +6 -0
  67. package/dist/src/hooks/hookTranslator.test.js +192 -0
  68. package/dist/src/hooks/hookTranslator.test.js.map +1 -0
  69. package/dist/src/hooks/types.d.ts +384 -0
  70. package/dist/src/hooks/types.js +284 -0
  71. package/dist/src/hooks/types.js.map +1 -0
  72. package/dist/src/hooks/types.test.d.ts +6 -0
  73. package/dist/src/hooks/types.test.js +35 -0
  74. package/dist/src/hooks/types.test.js.map +1 -0
  75. package/dist/src/index.d.ts +3 -0
  76. package/dist/src/index.js +4 -0
  77. package/dist/src/index.js.map +1 -1
  78. package/dist/src/mcp/oauth-provider.d.ts +8 -5
  79. package/dist/src/mcp/oauth-provider.js +114 -31
  80. package/dist/src/mcp/oauth-provider.js.map +1 -1
  81. package/dist/src/mcp/oauth-provider.test.js +54 -1
  82. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  83. package/dist/src/mcp/token-storage/file-token-storage.js +1 -1
  84. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  85. package/dist/src/mcp/token-storage/file-token-storage.test.js +7 -5
  86. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
  87. package/dist/src/mcp/token-storage/keychain-token-storage.js +2 -2
  88. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  89. package/dist/src/policy/config.d.ts +31 -0
  90. package/dist/src/policy/config.js +197 -0
  91. package/dist/src/policy/config.js.map +1 -0
  92. package/dist/src/policy/config.test.d.ts +6 -0
  93. package/dist/src/policy/config.test.js +404 -0
  94. package/dist/src/policy/config.test.js.map +1 -0
  95. package/dist/src/policy/index.d.ts +2 -0
  96. package/dist/src/policy/index.js +2 -0
  97. package/dist/src/policy/index.js.map +1 -1
  98. package/dist/src/policy/policies/read-only.toml +56 -0
  99. package/dist/src/policy/policies/write.toml +63 -0
  100. package/dist/src/policy/policies/yolo.toml +31 -0
  101. package/dist/src/policy/toml-loader.d.ts +46 -0
  102. package/dist/src/policy/toml-loader.js +314 -0
  103. package/dist/src/policy/toml-loader.js.map +1 -0
  104. package/dist/src/policy/toml-loader.test.d.ts +6 -0
  105. package/dist/src/policy/toml-loader.test.js +522 -0
  106. package/dist/src/policy/toml-loader.test.js.map +1 -0
  107. package/dist/src/policy/types.d.ts +18 -0
  108. package/dist/src/policy/types.js +6 -0
  109. package/dist/src/policy/types.js.map +1 -1
  110. package/dist/src/services/chatCompressionService.js +2 -1
  111. package/dist/src/services/chatCompressionService.js.map +1 -1
  112. package/dist/src/services/chatRecordingService.js +9 -8
  113. package/dist/src/services/chatRecordingService.js.map +1 -1
  114. package/dist/src/services/loopDetectionService.d.ts +1 -1
  115. package/dist/src/services/loopDetectionService.js +3 -3
  116. package/dist/src/services/loopDetectionService.js.map +1 -1
  117. package/dist/src/services/loopDetectionService.test.js +69 -0
  118. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  119. package/dist/src/services/shellExecutionService.js +18 -4
  120. package/dist/src/services/shellExecutionService.js.map +1 -1
  121. package/dist/src/services/shellExecutionService.test.js +16 -4
  122. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  123. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +3 -1
  124. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +31 -0
  125. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  126. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +4 -1
  127. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +6 -0
  128. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  129. package/dist/src/telemetry/loggers.d.ts +2 -1
  130. package/dist/src/telemetry/loggers.js +13 -1
  131. package/dist/src/telemetry/loggers.js.map +1 -1
  132. package/dist/src/telemetry/loggers.test.js +10 -5
  133. package/dist/src/telemetry/loggers.test.js.map +1 -1
  134. package/dist/src/telemetry/metrics.d.ts +21 -1
  135. package/dist/src/telemetry/metrics.js +34 -0
  136. package/dist/src/telemetry/metrics.js.map +1 -1
  137. package/dist/src/telemetry/metrics.test.js +43 -126
  138. package/dist/src/telemetry/metrics.test.js.map +1 -1
  139. package/dist/src/telemetry/types.d.ts +24 -10
  140. package/dist/src/telemetry/types.js +47 -19
  141. package/dist/src/telemetry/types.js.map +1 -1
  142. package/dist/src/tools/edit.js +1 -1
  143. package/dist/src/tools/edit.js.map +1 -1
  144. package/dist/src/tools/edit.test.js +1 -1
  145. package/dist/src/tools/edit.test.js.map +1 -1
  146. package/dist/src/tools/mcp-client-manager.d.ts +31 -6
  147. package/dist/src/tools/mcp-client-manager.js +111 -41
  148. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  149. package/dist/src/tools/mcp-client-manager.test.js +130 -38
  150. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  151. package/dist/src/tools/mcp-client.d.ts +1 -0
  152. package/dist/src/tools/mcp-client.js +4 -4
  153. package/dist/src/tools/mcp-client.js.map +1 -1
  154. package/dist/src/tools/mcp-client.test.js +49 -0
  155. package/dist/src/tools/mcp-client.test.js.map +1 -1
  156. package/dist/src/tools/shell.js +1 -1
  157. package/dist/src/tools/shell.js.map +1 -1
  158. package/dist/src/tools/smart-edit.d.ts +1 -1
  159. package/dist/src/tools/smart-edit.js +12 -1
  160. package/dist/src/tools/smart-edit.js.map +1 -1
  161. package/dist/src/tools/smart-edit.test.js +2 -1
  162. package/dist/src/tools/smart-edit.test.js.map +1 -1
  163. package/dist/src/tools/tool-registry.d.ts +1 -18
  164. package/dist/src/tools/tool-registry.js +1 -44
  165. package/dist/src/tools/tool-registry.js.map +1 -1
  166. package/dist/src/tools/tool-registry.test.js +2 -24
  167. package/dist/src/tools/tool-registry.test.js.map +1 -1
  168. package/dist/src/tools/web-fetch.js +3 -6
  169. package/dist/src/tools/web-fetch.js.map +1 -1
  170. package/dist/src/tools/web-fetch.test.js +1 -1
  171. package/dist/src/tools/web-fetch.test.js.map +1 -1
  172. package/dist/src/tools/write-file.js +1 -1
  173. package/dist/src/tools/write-file.js.map +1 -1
  174. package/dist/src/tools/write-file.test.js +1 -1
  175. package/dist/src/tools/write-file.test.js.map +1 -1
  176. package/dist/src/utils/channel.d.ts +1 -0
  177. package/dist/src/utils/channel.js +4 -4
  178. package/dist/src/utils/channel.js.map +1 -1
  179. package/dist/src/utils/channel.test.js +35 -1
  180. package/dist/src/utils/channel.test.js.map +1 -1
  181. package/dist/src/utils/events.d.ts +18 -1
  182. package/dist/src/utils/events.js +8 -0
  183. package/dist/src/utils/events.js.map +1 -1
  184. package/dist/src/utils/events.test.js +10 -0
  185. package/dist/src/utils/events.test.js.map +1 -1
  186. package/dist/src/utils/extensionLoader.d.ts +67 -27
  187. package/dist/src/utils/extensionLoader.js +149 -7
  188. package/dist/src/utils/extensionLoader.js.map +1 -1
  189. package/dist/src/utils/extensionLoader.test.d.ts +6 -0
  190. package/dist/src/utils/extensionLoader.test.js +90 -0
  191. package/dist/src/utils/extensionLoader.test.js.map +1 -0
  192. package/dist/src/utils/fetch.js +1 -6
  193. package/dist/src/utils/fetch.js.map +1 -1
  194. package/dist/src/utils/llm-edit-fixer.d.ts +1 -1
  195. package/dist/src/utils/llm-edit-fixer.js +27 -3
  196. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  197. package/dist/src/utils/llm-edit-fixer.test.js +21 -0
  198. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
  199. package/dist/src/utils/shell-utils.js +29 -1
  200. package/dist/src/utils/shell-utils.js.map +1 -1
  201. package/dist/src/utils/shell-utils.test.js +18 -0
  202. package/dist/src/utils/shell-utils.test.js.map +1 -1
  203. package/dist/tsconfig.tsbuildinfo +1 -1
  204. package/package.json +4 -2
@@ -0,0 +1,341 @@
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 * as fs from 'node:fs';
8
+ import { HookRegistry, ConfigSource, HookRegistryNotInitializedError, } from './hookRegistry.js';
9
+ import { HookEventName, HookType } from './types.js';
10
+ // Mock fs
11
+ vi.mock('fs', () => ({
12
+ existsSync: vi.fn(),
13
+ readFileSync: vi.fn(),
14
+ }));
15
+ // Mock debugLogger using vi.hoisted
16
+ const mockDebugLogger = vi.hoisted(() => ({
17
+ log: vi.fn(),
18
+ warn: vi.fn(),
19
+ error: vi.fn(),
20
+ debug: vi.fn(),
21
+ }));
22
+ vi.mock('../utils/debugLogger.js', () => ({
23
+ debugLogger: mockDebugLogger,
24
+ }));
25
+ describe('HookRegistry', () => {
26
+ let hookRegistry;
27
+ let mockConfig;
28
+ let mockStorage;
29
+ beforeEach(() => {
30
+ vi.resetAllMocks();
31
+ mockStorage = {
32
+ getGeminiDir: vi.fn().mockReturnValue('/project/.gemini'),
33
+ };
34
+ mockConfig = {
35
+ storage: mockStorage,
36
+ getExtensions: vi.fn().mockReturnValue([]),
37
+ getHooks: vi.fn().mockReturnValue({}),
38
+ };
39
+ hookRegistry = new HookRegistry(mockConfig);
40
+ });
41
+ afterEach(() => {
42
+ vi.restoreAllMocks();
43
+ });
44
+ describe('initialize', () => {
45
+ it('should initialize successfully with no hooks', async () => {
46
+ vi.mocked(fs.existsSync).mockReturnValue(false);
47
+ await hookRegistry.initialize();
48
+ expect(hookRegistry.getAllHooks()).toHaveLength(0);
49
+ expect(mockDebugLogger.log).toHaveBeenCalledWith('Hook registry initialized with 0 hook entries');
50
+ });
51
+ it('should load hooks from project configuration', async () => {
52
+ const mockHooksConfig = {
53
+ BeforeTool: [
54
+ {
55
+ matcher: 'EditTool',
56
+ hooks: [
57
+ {
58
+ type: 'command',
59
+ command: './hooks/check_style.sh',
60
+ timeout: 60,
61
+ },
62
+ ],
63
+ },
64
+ ],
65
+ };
66
+ // Update mock to return the hooks configuration
67
+ vi.mocked(mockConfig.getHooks).mockReturnValue(mockHooksConfig);
68
+ await hookRegistry.initialize();
69
+ const hooks = hookRegistry.getAllHooks();
70
+ expect(hooks).toHaveLength(1);
71
+ expect(hooks[0].eventName).toBe(HookEventName.BeforeTool);
72
+ expect(hooks[0].config.type).toBe(HookType.Command);
73
+ expect(hooks[0].config.command).toBe('./hooks/check_style.sh');
74
+ expect(hooks[0].matcher).toBe('EditTool');
75
+ expect(hooks[0].source).toBe(ConfigSource.Project);
76
+ });
77
+ it('should load plugin hooks', async () => {
78
+ const mockHooksConfig = {
79
+ AfterTool: [
80
+ {
81
+ hooks: [
82
+ {
83
+ type: 'command',
84
+ command: './hooks/after-tool.sh',
85
+ timeout: 30,
86
+ },
87
+ ],
88
+ },
89
+ ],
90
+ };
91
+ // Update mock to return the hooks configuration
92
+ vi.mocked(mockConfig.getHooks).mockReturnValue(mockHooksConfig);
93
+ await hookRegistry.initialize();
94
+ const hooks = hookRegistry.getAllHooks();
95
+ expect(hooks).toHaveLength(1);
96
+ expect(hooks[0].eventName).toBe(HookEventName.AfterTool);
97
+ expect(hooks[0].config.type).toBe(HookType.Command);
98
+ expect(hooks[0].config.command).toBe('./hooks/after-tool.sh');
99
+ });
100
+ it('should handle invalid configuration gracefully', async () => {
101
+ const invalidHooksConfig = {
102
+ BeforeTool: [
103
+ {
104
+ hooks: [
105
+ {
106
+ type: 'invalid-type', // Invalid hook type
107
+ command: './hooks/test.sh',
108
+ },
109
+ ],
110
+ },
111
+ ],
112
+ };
113
+ // Update mock to return invalid configuration
114
+ vi.mocked(mockConfig.getHooks).mockReturnValue(invalidHooksConfig);
115
+ await hookRegistry.initialize();
116
+ expect(hookRegistry.getAllHooks()).toHaveLength(0);
117
+ expect(mockDebugLogger.warn).toHaveBeenCalled();
118
+ });
119
+ it('should validate hook configurations', async () => {
120
+ const mockHooksConfig = {
121
+ BeforeTool: [
122
+ {
123
+ hooks: [
124
+ {
125
+ type: 'invalid',
126
+ command: './hooks/test.sh',
127
+ },
128
+ {
129
+ type: 'command',
130
+ // Missing command field
131
+ },
132
+ ],
133
+ },
134
+ ],
135
+ };
136
+ // Update mock to return invalid configuration
137
+ vi.mocked(mockConfig.getHooks).mockReturnValue(mockHooksConfig);
138
+ await hookRegistry.initialize();
139
+ expect(hookRegistry.getAllHooks()).toHaveLength(0);
140
+ expect(mockDebugLogger.warn).toHaveBeenCalled(); // At least some warnings should be logged
141
+ });
142
+ });
143
+ describe('getHooksForEvent', () => {
144
+ beforeEach(async () => {
145
+ const mockHooksConfig = {
146
+ BeforeTool: [
147
+ {
148
+ matcher: 'EditTool',
149
+ hooks: [
150
+ {
151
+ type: 'command',
152
+ command: './hooks/edit_check.sh',
153
+ },
154
+ ],
155
+ },
156
+ {
157
+ hooks: [
158
+ {
159
+ type: 'command',
160
+ command: './hooks/general_check.sh',
161
+ },
162
+ ],
163
+ },
164
+ ],
165
+ AfterTool: [
166
+ {
167
+ hooks: [
168
+ {
169
+ type: 'command',
170
+ command: './hooks/after-tool.sh',
171
+ },
172
+ ],
173
+ },
174
+ ],
175
+ };
176
+ // Update mock to return the hooks configuration
177
+ vi.mocked(mockConfig.getHooks).mockReturnValue(mockHooksConfig);
178
+ await hookRegistry.initialize();
179
+ });
180
+ it('should return hooks for specific event', () => {
181
+ const beforeToolHooks = hookRegistry.getHooksForEvent(HookEventName.BeforeTool);
182
+ expect(beforeToolHooks).toHaveLength(2);
183
+ const afterToolHooks = hookRegistry.getHooksForEvent(HookEventName.AfterTool);
184
+ expect(afterToolHooks).toHaveLength(1);
185
+ });
186
+ it('should return empty array for events with no hooks', () => {
187
+ const notificationHooks = hookRegistry.getHooksForEvent(HookEventName.Notification);
188
+ expect(notificationHooks).toHaveLength(0);
189
+ });
190
+ it('should throw error if not initialized', () => {
191
+ const uninitializedRegistry = new HookRegistry(mockConfig);
192
+ expect(() => {
193
+ uninitializedRegistry.getHooksForEvent(HookEventName.BeforeTool);
194
+ }).toThrow(HookRegistryNotInitializedError);
195
+ });
196
+ });
197
+ describe('setHookEnabled', () => {
198
+ beforeEach(async () => {
199
+ const mockHooksConfig = {
200
+ BeforeTool: [
201
+ {
202
+ hooks: [
203
+ {
204
+ type: 'command',
205
+ command: './hooks/test.sh',
206
+ },
207
+ ],
208
+ },
209
+ ],
210
+ };
211
+ // Update mock to return the hooks configuration
212
+ vi.mocked(mockConfig.getHooks).mockReturnValue(mockHooksConfig);
213
+ await hookRegistry.initialize();
214
+ });
215
+ it('should enable and disable hooks', () => {
216
+ const hookName = './hooks/test.sh';
217
+ // Initially enabled
218
+ let hooks = hookRegistry.getHooksForEvent(HookEventName.BeforeTool);
219
+ expect(hooks).toHaveLength(1);
220
+ // Disable
221
+ hookRegistry.setHookEnabled(hookName, false);
222
+ hooks = hookRegistry.getHooksForEvent(HookEventName.BeforeTool);
223
+ expect(hooks).toHaveLength(0);
224
+ // Re-enable
225
+ hookRegistry.setHookEnabled(hookName, true);
226
+ hooks = hookRegistry.getHooksForEvent(HookEventName.BeforeTool);
227
+ expect(hooks).toHaveLength(1);
228
+ });
229
+ it('should warn when hook not found', () => {
230
+ hookRegistry.setHookEnabled('non-existent-hook', false);
231
+ expect(mockDebugLogger.warn).toHaveBeenCalledWith('No hooks found matching "non-existent-hook"');
232
+ });
233
+ });
234
+ describe('malformed configuration handling', () => {
235
+ it('should handle non-array definitions gracefully', async () => {
236
+ const malformedConfig = {
237
+ BeforeTool: 'not-an-array', // Should be an array of HookDefinition
238
+ };
239
+ vi.mocked(mockConfig.getHooks).mockReturnValue(malformedConfig);
240
+ await hookRegistry.initialize();
241
+ expect(hookRegistry.getAllHooks()).toHaveLength(0);
242
+ expect(mockDebugLogger.warn).toHaveBeenCalledWith(expect.stringContaining('is not an array'));
243
+ });
244
+ it('should handle object instead of array for definitions', async () => {
245
+ const malformedConfig = {
246
+ AfterTool: { hooks: [] }, // Should be an array, not a single object
247
+ };
248
+ vi.mocked(mockConfig.getHooks).mockReturnValue(malformedConfig);
249
+ await hookRegistry.initialize();
250
+ expect(hookRegistry.getAllHooks()).toHaveLength(0);
251
+ expect(mockDebugLogger.warn).toHaveBeenCalledWith(expect.stringContaining('is not an array'));
252
+ });
253
+ it('should handle null definition gracefully', async () => {
254
+ const malformedConfig = {
255
+ BeforeTool: [null], // Invalid: null definition
256
+ };
257
+ vi.mocked(mockConfig.getHooks).mockReturnValue(malformedConfig);
258
+ await hookRegistry.initialize();
259
+ expect(hookRegistry.getAllHooks()).toHaveLength(0);
260
+ expect(mockDebugLogger.warn).toHaveBeenCalledWith(expect.stringContaining('Discarding invalid hook definition'), null);
261
+ });
262
+ it('should handle definition without hooks array', async () => {
263
+ const malformedConfig = {
264
+ BeforeTool: [
265
+ {
266
+ matcher: 'EditTool',
267
+ // Missing hooks array
268
+ },
269
+ ],
270
+ };
271
+ vi.mocked(mockConfig.getHooks).mockReturnValue(malformedConfig);
272
+ await hookRegistry.initialize();
273
+ expect(hookRegistry.getAllHooks()).toHaveLength(0);
274
+ expect(mockDebugLogger.warn).toHaveBeenCalledWith(expect.stringContaining('Discarding invalid hook definition'), expect.objectContaining({ matcher: 'EditTool' }));
275
+ });
276
+ it('should handle non-array hooks property', async () => {
277
+ const malformedConfig = {
278
+ BeforeTool: [
279
+ {
280
+ matcher: 'EditTool',
281
+ hooks: 'not-an-array', // Should be an array
282
+ },
283
+ ],
284
+ };
285
+ vi.mocked(mockConfig.getHooks).mockReturnValue(malformedConfig);
286
+ await hookRegistry.initialize();
287
+ expect(hookRegistry.getAllHooks()).toHaveLength(0);
288
+ expect(mockDebugLogger.warn).toHaveBeenCalledWith(expect.stringContaining('Discarding invalid hook definition'), expect.objectContaining({ hooks: 'not-an-array', matcher: 'EditTool' }));
289
+ });
290
+ it('should handle non-object hookConfig in hooks array', async () => {
291
+ const malformedConfig = {
292
+ BeforeTool: [
293
+ {
294
+ hooks: [
295
+ 'not-an-object', // Should be an object
296
+ 42, // Should be an object
297
+ null, // Should be an object
298
+ ],
299
+ },
300
+ ],
301
+ };
302
+ vi.mocked(mockConfig.getHooks).mockReturnValue(malformedConfig);
303
+ await hookRegistry.initialize();
304
+ expect(hookRegistry.getAllHooks()).toHaveLength(0);
305
+ expect(mockDebugLogger.warn).toHaveBeenCalledTimes(3); // One warning for each invalid hookConfig
306
+ });
307
+ it('should handle mixed valid and invalid hook configurations', async () => {
308
+ const mixedConfig = {
309
+ BeforeTool: [
310
+ {
311
+ hooks: [
312
+ {
313
+ type: 'command',
314
+ command: './valid-hook.sh',
315
+ },
316
+ 'invalid-string',
317
+ {
318
+ type: 'invalid-type',
319
+ command: './invalid-type.sh',
320
+ },
321
+ ],
322
+ },
323
+ ],
324
+ };
325
+ vi.mocked(mockConfig.getHooks).mockReturnValue(mixedConfig);
326
+ await hookRegistry.initialize();
327
+ // Should only load the valid hook
328
+ const hooks = hookRegistry.getAllHooks();
329
+ expect(hooks).toHaveLength(1);
330
+ expect(hooks[0].config.command).toBe('./valid-hook.sh');
331
+ // Verify the warnings for invalid configurations
332
+ // 1st warning: non-object hookConfig ('invalid-string')
333
+ expect(mockDebugLogger.warn).toHaveBeenCalledWith(expect.stringContaining('Discarding invalid hook configuration'), 'invalid-string');
334
+ // 2nd warning: validateHookConfig logs invalid type
335
+ expect(mockDebugLogger.warn).toHaveBeenCalledWith(expect.stringContaining('Invalid hook BeforeTool from project type'));
336
+ // 3rd warning: processHookDefinition logs the failed hookConfig
337
+ expect(mockDebugLogger.warn).toHaveBeenCalledWith(expect.stringContaining('Discarding invalid hook configuration'), expect.objectContaining({ type: 'invalid-type' }));
338
+ });
339
+ });
340
+ });
341
+ //# sourceMappingURL=hookRegistry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hookRegistry.test.js","sourceRoot":"","sources":["../../../src/hooks/hookRegistry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { GenerateContentResponse, GenerateContentParameters, ToolConfig } from '@google/genai';
7
+ /**
8
+ * Decoupled LLM request format - stable across Gemini CLI versions
9
+ */
10
+ export interface LLMRequest {
11
+ model: string;
12
+ messages: Array<{
13
+ role: 'user' | 'model' | 'system';
14
+ content: string | Array<{
15
+ type: string;
16
+ [key: string]: unknown;
17
+ }>;
18
+ }>;
19
+ config?: {
20
+ temperature?: number;
21
+ maxOutputTokens?: number;
22
+ topP?: number;
23
+ topK?: number;
24
+ stopSequences?: string[];
25
+ candidateCount?: number;
26
+ presencePenalty?: number;
27
+ frequencyPenalty?: number;
28
+ [key: string]: unknown;
29
+ };
30
+ toolConfig?: HookToolConfig;
31
+ }
32
+ /**
33
+ * Decoupled LLM response format - stable across Gemini CLI versions
34
+ */
35
+ export interface LLMResponse {
36
+ text?: string;
37
+ candidates: Array<{
38
+ content: {
39
+ role: 'model';
40
+ parts: string[];
41
+ };
42
+ finishReason?: 'STOP' | 'MAX_TOKENS' | 'SAFETY' | 'RECITATION' | 'OTHER';
43
+ index?: number;
44
+ safetyRatings?: Array<{
45
+ category: string;
46
+ probability: string;
47
+ blocked?: boolean;
48
+ }>;
49
+ }>;
50
+ usageMetadata?: {
51
+ promptTokenCount?: number;
52
+ candidatesTokenCount?: number;
53
+ totalTokenCount?: number;
54
+ };
55
+ }
56
+ /**
57
+ * Decoupled tool configuration - stable across Gemini CLI versions
58
+ */
59
+ export interface HookToolConfig {
60
+ mode?: 'AUTO' | 'ANY' | 'NONE';
61
+ allowedFunctionNames?: string[];
62
+ }
63
+ /**
64
+ * Base class for hook translators - handles version-specific translation logic
65
+ */
66
+ export declare abstract class HookTranslator {
67
+ abstract toHookLLMRequest(sdkRequest: GenerateContentParameters): LLMRequest;
68
+ abstract fromHookLLMRequest(hookRequest: LLMRequest, baseRequest?: GenerateContentParameters): GenerateContentParameters;
69
+ abstract toHookLLMResponse(sdkResponse: GenerateContentResponse): LLMResponse;
70
+ abstract fromHookLLMResponse(hookResponse: LLMResponse): GenerateContentResponse;
71
+ abstract toHookToolConfig(sdkToolConfig: ToolConfig): HookToolConfig;
72
+ abstract fromHookToolConfig(hookToolConfig: HookToolConfig): ToolConfig;
73
+ }
74
+ /**
75
+ * Hook translator for GenAI SDK v1.x
76
+ * Handles translation between GenAI SDK types and stable Hook API types
77
+ */
78
+ export declare class HookTranslatorGenAIv1 extends HookTranslator {
79
+ /**
80
+ * Convert genai SDK GenerateContentParameters to stable LLMRequest
81
+ *
82
+ * Note: This implementation intentionally extracts only text content from parts.
83
+ * Non-text parts (images, function calls, etc.) are filtered out in v1 to provide
84
+ * a simplified, stable interface for hooks. This allows hooks to focus on text
85
+ * manipulation without needing to handle complex multimodal content.
86
+ * Future versions may expose additional content types if needed.
87
+ */
88
+ toHookLLMRequest(sdkRequest: GenerateContentParameters): LLMRequest;
89
+ /**
90
+ * Convert stable LLMRequest to genai SDK GenerateContentParameters
91
+ */
92
+ fromHookLLMRequest(hookRequest: LLMRequest, baseRequest?: GenerateContentParameters): GenerateContentParameters;
93
+ /**
94
+ * Convert genai SDK GenerateContentResponse to stable LLMResponse
95
+ */
96
+ toHookLLMResponse(sdkResponse: GenerateContentResponse): LLMResponse;
97
+ /**
98
+ * Convert stable LLMResponse to genai SDK GenerateContentResponse
99
+ */
100
+ fromHookLLMResponse(hookResponse: LLMResponse): GenerateContentResponse;
101
+ /**
102
+ * Convert genai SDK ToolConfig to stable HookToolConfig
103
+ */
104
+ toHookToolConfig(sdkToolConfig: ToolConfig): HookToolConfig;
105
+ /**
106
+ * Convert stable HookToolConfig to genai SDK ToolConfig
107
+ */
108
+ fromHookToolConfig(hookToolConfig: HookToolConfig): ToolConfig;
109
+ }
110
+ /**
111
+ * Default translator instance for current GenAI SDK version
112
+ */
113
+ export declare const defaultHookTranslator: HookTranslatorGenAIv1;