@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,232 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
7
+ /**
8
+ * Base class for hook translators - handles version-specific translation logic
9
+ */
10
+ export class HookTranslator {
11
+ }
12
+ /**
13
+ * Type guard to check if a value has a text property
14
+ */
15
+ function hasTextProperty(value) {
16
+ return (typeof value === 'object' &&
17
+ value !== null &&
18
+ 'text' in value &&
19
+ typeof value.text === 'string');
20
+ }
21
+ /**
22
+ * Type guard to check if content has role and parts properties
23
+ */
24
+ function isContentWithParts(content) {
25
+ return (typeof content === 'object' &&
26
+ content !== null &&
27
+ 'role' in content &&
28
+ 'parts' in content);
29
+ }
30
+ /**
31
+ * Helper to safely extract generation config from SDK request
32
+ * The SDK uses a config field that contains generation parameters
33
+ */
34
+ function extractGenerationConfig(request) {
35
+ // Access the config field which contains generation settings
36
+ // Use type assertion after checking the field exists
37
+ if (request.config && typeof request.config === 'object') {
38
+ const config = request.config;
39
+ return {
40
+ temperature: config.temperature,
41
+ maxOutputTokens: config.maxOutputTokens,
42
+ topP: config.topP,
43
+ topK: config.topK,
44
+ };
45
+ }
46
+ return undefined;
47
+ }
48
+ /**
49
+ * Hook translator for GenAI SDK v1.x
50
+ * Handles translation between GenAI SDK types and stable Hook API types
51
+ */
52
+ export class HookTranslatorGenAIv1 extends HookTranslator {
53
+ /**
54
+ * Convert genai SDK GenerateContentParameters to stable LLMRequest
55
+ *
56
+ * Note: This implementation intentionally extracts only text content from parts.
57
+ * Non-text parts (images, function calls, etc.) are filtered out in v1 to provide
58
+ * a simplified, stable interface for hooks. This allows hooks to focus on text
59
+ * manipulation without needing to handle complex multimodal content.
60
+ * Future versions may expose additional content types if needed.
61
+ */
62
+ toHookLLMRequest(sdkRequest) {
63
+ const messages = [];
64
+ // Convert contents to messages format (simplified)
65
+ if (sdkRequest.contents) {
66
+ const contents = Array.isArray(sdkRequest.contents)
67
+ ? sdkRequest.contents
68
+ : [sdkRequest.contents];
69
+ for (const content of contents) {
70
+ if (typeof content === 'string') {
71
+ messages.push({
72
+ role: 'user',
73
+ content,
74
+ });
75
+ }
76
+ else if (isContentWithParts(content)) {
77
+ const role = content.role === 'model'
78
+ ? 'model'
79
+ : content.role === 'system'
80
+ ? 'system'
81
+ : 'user';
82
+ const parts = Array.isArray(content.parts)
83
+ ? content.parts
84
+ : [content.parts];
85
+ // Extract only text parts - intentionally filtering out non-text content
86
+ const textContent = parts
87
+ .filter(hasTextProperty)
88
+ .map((part) => part.text)
89
+ .join('');
90
+ // Only add message if there's text content
91
+ if (textContent) {
92
+ messages.push({
93
+ role,
94
+ content: textContent,
95
+ });
96
+ }
97
+ }
98
+ }
99
+ }
100
+ // Safely extract generation config using proper type access
101
+ const config = extractGenerationConfig(sdkRequest);
102
+ return {
103
+ model: sdkRequest.model || DEFAULT_GEMINI_FLASH_MODEL,
104
+ messages,
105
+ config: {
106
+ temperature: config?.temperature,
107
+ maxOutputTokens: config?.maxOutputTokens,
108
+ topP: config?.topP,
109
+ topK: config?.topK,
110
+ },
111
+ };
112
+ }
113
+ /**
114
+ * Convert stable LLMRequest to genai SDK GenerateContentParameters
115
+ */
116
+ fromHookLLMRequest(hookRequest, baseRequest) {
117
+ // Convert hook messages back to SDK Content format
118
+ const contents = hookRequest.messages.map((message) => ({
119
+ role: message.role === 'model' ? 'model' : message.role,
120
+ parts: [
121
+ {
122
+ text: typeof message.content === 'string'
123
+ ? message.content
124
+ : String(message.content),
125
+ },
126
+ ],
127
+ }));
128
+ // Build the result with proper typing
129
+ const result = {
130
+ ...baseRequest,
131
+ model: hookRequest.model,
132
+ contents,
133
+ };
134
+ // Add generation config if it exists in the hook request
135
+ if (hookRequest.config) {
136
+ const baseConfig = baseRequest
137
+ ? extractGenerationConfig(baseRequest)
138
+ : undefined;
139
+ result.config = {
140
+ ...baseConfig,
141
+ temperature: hookRequest.config.temperature,
142
+ maxOutputTokens: hookRequest.config.maxOutputTokens,
143
+ topP: hookRequest.config.topP,
144
+ topK: hookRequest.config.topK,
145
+ };
146
+ }
147
+ return result;
148
+ }
149
+ /**
150
+ * Convert genai SDK GenerateContentResponse to stable LLMResponse
151
+ */
152
+ toHookLLMResponse(sdkResponse) {
153
+ return {
154
+ text: sdkResponse.text,
155
+ candidates: (sdkResponse.candidates || []).map((candidate) => {
156
+ // Extract text parts from the candidate
157
+ const textParts = candidate.content?.parts
158
+ ?.filter(hasTextProperty)
159
+ .map((part) => part.text) || [];
160
+ return {
161
+ content: {
162
+ role: 'model',
163
+ parts: textParts,
164
+ },
165
+ finishReason: candidate.finishReason,
166
+ index: candidate.index,
167
+ safetyRatings: candidate.safetyRatings?.map((rating) => ({
168
+ category: String(rating.category || ''),
169
+ probability: String(rating.probability || ''),
170
+ })),
171
+ };
172
+ }),
173
+ usageMetadata: sdkResponse.usageMetadata
174
+ ? {
175
+ promptTokenCount: sdkResponse.usageMetadata.promptTokenCount,
176
+ candidatesTokenCount: sdkResponse.usageMetadata.candidatesTokenCount,
177
+ totalTokenCount: sdkResponse.usageMetadata.totalTokenCount,
178
+ }
179
+ : undefined,
180
+ };
181
+ }
182
+ /**
183
+ * Convert stable LLMResponse to genai SDK GenerateContentResponse
184
+ */
185
+ fromHookLLMResponse(hookResponse) {
186
+ // Build response object with proper structure
187
+ const response = {
188
+ text: hookResponse.text,
189
+ candidates: hookResponse.candidates.map((candidate) => ({
190
+ content: {
191
+ role: 'model',
192
+ parts: candidate.content.parts.map((part) => ({
193
+ text: part,
194
+ })),
195
+ },
196
+ finishReason: candidate.finishReason,
197
+ index: candidate.index,
198
+ safetyRatings: candidate.safetyRatings,
199
+ })),
200
+ usageMetadata: hookResponse.usageMetadata,
201
+ };
202
+ return response;
203
+ }
204
+ /**
205
+ * Convert genai SDK ToolConfig to stable HookToolConfig
206
+ */
207
+ toHookToolConfig(sdkToolConfig) {
208
+ return {
209
+ mode: sdkToolConfig.functionCallingConfig?.mode,
210
+ allowedFunctionNames: sdkToolConfig.functionCallingConfig?.allowedFunctionNames,
211
+ };
212
+ }
213
+ /**
214
+ * Convert stable HookToolConfig to genai SDK ToolConfig
215
+ */
216
+ fromHookToolConfig(hookToolConfig) {
217
+ const functionCallingConfig = hookToolConfig.mode || hookToolConfig.allowedFunctionNames
218
+ ? {
219
+ mode: hookToolConfig.mode,
220
+ allowedFunctionNames: hookToolConfig.allowedFunctionNames,
221
+ }
222
+ : undefined;
223
+ return {
224
+ functionCallingConfig,
225
+ };
226
+ }
227
+ }
228
+ /**
229
+ * Default translator instance for current GenAI SDK version
230
+ */
231
+ export const defaultHookTranslator = new HookTranslatorGenAIv1();
232
+ //# sourceMappingURL=hookTranslator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hookTranslator.js","sourceRoot":"","sources":["../../../src/hooks/hookTranslator.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 {};
@@ -0,0 +1,192 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach } from 'vitest';
7
+ import { HookTranslatorGenAIv1, defaultHookTranslator, } from './hookTranslator.js';
8
+ describe('HookTranslator', () => {
9
+ let translator;
10
+ beforeEach(() => {
11
+ translator = new HookTranslatorGenAIv1();
12
+ });
13
+ describe('defaultHookTranslator', () => {
14
+ it('should be an instance of HookTranslatorGenAIv1', () => {
15
+ expect(defaultHookTranslator).toBeInstanceOf(HookTranslatorGenAIv1);
16
+ });
17
+ });
18
+ describe('LLM Request Translation', () => {
19
+ it('should convert SDK request to hook format', () => {
20
+ const sdkRequest = {
21
+ model: 'gemini-1.5-flash',
22
+ contents: [
23
+ {
24
+ role: 'user',
25
+ parts: [{ text: 'Hello world' }],
26
+ },
27
+ ],
28
+ config: {
29
+ temperature: 0.7,
30
+ maxOutputTokens: 1000,
31
+ },
32
+ };
33
+ const hookRequest = translator.toHookLLMRequest(sdkRequest);
34
+ expect(hookRequest).toEqual({
35
+ model: 'gemini-1.5-flash',
36
+ messages: [
37
+ {
38
+ role: 'user',
39
+ content: 'Hello world',
40
+ },
41
+ ],
42
+ config: {
43
+ temperature: 0.7,
44
+ maxOutputTokens: 1000,
45
+ topP: undefined,
46
+ topK: undefined,
47
+ },
48
+ });
49
+ });
50
+ it('should handle string contents', () => {
51
+ const sdkRequest = {
52
+ model: 'gemini-1.5-flash',
53
+ contents: ['Simple string message'],
54
+ };
55
+ const hookRequest = translator.toHookLLMRequest(sdkRequest);
56
+ expect(hookRequest.messages).toEqual([
57
+ {
58
+ role: 'user',
59
+ content: 'Simple string message',
60
+ },
61
+ ]);
62
+ });
63
+ it('should handle conversion errors gracefully', () => {
64
+ const sdkRequest = {
65
+ model: 'gemini-1.5-flash',
66
+ contents: [null], // Invalid content
67
+ };
68
+ const hookRequest = translator.toHookLLMRequest(sdkRequest);
69
+ // When contents are invalid, the translator skips them and returns empty messages
70
+ expect(hookRequest.messages).toEqual([]);
71
+ expect(hookRequest.model).toBe('gemini-1.5-flash');
72
+ });
73
+ it('should convert hook request back to SDK format', () => {
74
+ const hookRequest = {
75
+ model: 'gemini-1.5-flash',
76
+ messages: [
77
+ {
78
+ role: 'user',
79
+ content: 'Hello world',
80
+ },
81
+ ],
82
+ config: {
83
+ temperature: 0.7,
84
+ maxOutputTokens: 1000,
85
+ },
86
+ };
87
+ const sdkRequest = translator.fromHookLLMRequest(hookRequest);
88
+ expect(sdkRequest.model).toBe('gemini-1.5-flash');
89
+ expect(sdkRequest.contents).toEqual([
90
+ {
91
+ role: 'user',
92
+ parts: [{ text: 'Hello world' }],
93
+ },
94
+ ]);
95
+ });
96
+ });
97
+ describe('LLM Response Translation', () => {
98
+ it('should convert SDK response to hook format', () => {
99
+ const sdkResponse = {
100
+ text: 'Hello response',
101
+ candidates: [
102
+ {
103
+ content: {
104
+ role: 'model',
105
+ parts: [{ text: 'Hello response' }],
106
+ },
107
+ finishReason: 'STOP',
108
+ index: 0,
109
+ },
110
+ ],
111
+ usageMetadata: {
112
+ promptTokenCount: 10,
113
+ candidatesTokenCount: 20,
114
+ totalTokenCount: 30,
115
+ },
116
+ };
117
+ const hookResponse = translator.toHookLLMResponse(sdkResponse);
118
+ expect(hookResponse).toEqual({
119
+ text: 'Hello response',
120
+ candidates: [
121
+ {
122
+ content: {
123
+ role: 'model',
124
+ parts: ['Hello response'],
125
+ },
126
+ finishReason: 'STOP',
127
+ index: 0,
128
+ safetyRatings: undefined,
129
+ },
130
+ ],
131
+ usageMetadata: {
132
+ promptTokenCount: 10,
133
+ candidatesTokenCount: 20,
134
+ totalTokenCount: 30,
135
+ },
136
+ });
137
+ });
138
+ it('should convert hook response back to SDK format', () => {
139
+ const hookResponse = {
140
+ text: 'Hello response',
141
+ candidates: [
142
+ {
143
+ content: {
144
+ role: 'model',
145
+ parts: ['Hello response'],
146
+ },
147
+ finishReason: 'STOP',
148
+ },
149
+ ],
150
+ };
151
+ const sdkResponse = translator.fromHookLLMResponse(hookResponse);
152
+ expect(sdkResponse.text).toBe('Hello response');
153
+ expect(sdkResponse.candidates).toHaveLength(1);
154
+ expect(sdkResponse.candidates?.[0]?.content?.parts?.[0]?.text).toBe('Hello response');
155
+ });
156
+ });
157
+ describe('Tool Config Translation', () => {
158
+ it('should convert SDK tool config to hook format', () => {
159
+ const sdkToolConfig = {
160
+ functionCallingConfig: {
161
+ mode: 'ANY',
162
+ allowedFunctionNames: ['tool1', 'tool2'],
163
+ },
164
+ };
165
+ const hookToolConfig = translator.toHookToolConfig(sdkToolConfig);
166
+ expect(hookToolConfig).toEqual({
167
+ mode: 'ANY',
168
+ allowedFunctionNames: ['tool1', 'tool2'],
169
+ });
170
+ });
171
+ it('should convert hook tool config back to SDK format', () => {
172
+ const hookToolConfig = {
173
+ mode: 'AUTO',
174
+ allowedFunctionNames: ['tool1', 'tool2'],
175
+ };
176
+ const sdkToolConfig = translator.fromHookToolConfig(hookToolConfig);
177
+ expect(sdkToolConfig.functionCallingConfig).toEqual({
178
+ mode: 'AUTO',
179
+ allowedFunctionNames: ['tool1', 'tool2'],
180
+ });
181
+ });
182
+ it('should handle undefined tool config', () => {
183
+ const sdkToolConfig = {};
184
+ const hookToolConfig = translator.toHookToolConfig(sdkToolConfig);
185
+ expect(hookToolConfig).toEqual({
186
+ mode: undefined,
187
+ allowedFunctionNames: undefined,
188
+ });
189
+ });
190
+ });
191
+ });
192
+ //# sourceMappingURL=hookTranslator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hookTranslator.test.js","sourceRoot":"","sources":["../../../src/hooks/hookTranslator.test.ts"],"names":[],"mappings":"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"}