@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.
- package/dist/google-gemini-cli-core-0.13.0-nightly.20251031.c89bc30d.tgz +0 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/src/agents/executor.d.ts +19 -0
- package/dist/src/agents/executor.js +226 -32
- package/dist/src/agents/executor.js.map +1 -1
- package/dist/src/agents/executor.test.js +335 -9
- package/dist/src/agents/executor.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +2 -1
- package/dist/src/agents/types.js +1 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/code_assist/experiments/client_metadata.d.ts +12 -0
- package/dist/src/code_assist/experiments/client_metadata.js +49 -0
- package/dist/src/code_assist/experiments/client_metadata.js.map +1 -0
- package/dist/src/code_assist/experiments/experiments.d.ts +17 -0
- package/dist/src/code_assist/experiments/experiments.js +36 -0
- package/dist/src/code_assist/experiments/experiments.js.map +1 -0
- package/dist/src/code_assist/experiments/types.d.ts +35 -0
- package/dist/src/code_assist/experiments/types.js +7 -0
- package/dist/src/code_assist/experiments/types.js.map +1 -0
- package/dist/src/code_assist/server.d.ts +3 -1
- package/dist/src/code_assist/server.js +11 -0
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +17 -0
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +1 -1
- package/dist/src/code_assist/types.js.map +1 -1
- package/dist/src/config/config.d.ts +51 -15
- package/dist/src/config/config.js +130 -30
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +231 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/models.d.ts +1 -1
- package/dist/src/config/models.js +2 -2
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/storage.d.ts +2 -0
- package/dist/src/config/storage.js +17 -0
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/core/apiKeyCredentialStorage.js +7 -7
- package/dist/src/core/apiKeyCredentialStorage.js.map +1 -1
- package/dist/src/core/apiKeyCredentialStorage.test.js +5 -0
- package/dist/src/core/apiKeyCredentialStorage.test.js.map +1 -1
- package/dist/src/core/logger.js +10 -9
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/prompts.js +104 -55
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/hooks/hookPlanner.d.ts +46 -0
- package/dist/src/hooks/hookPlanner.js +108 -0
- package/dist/src/hooks/hookPlanner.js.map +1 -0
- package/dist/src/hooks/hookPlanner.test.d.ts +6 -0
- package/dist/src/hooks/hookPlanner.test.js +255 -0
- package/dist/src/hooks/hookPlanner.test.js.map +1 -0
- package/dist/src/hooks/hookRegistry.d.ts +87 -0
- package/dist/src/hooks/hookRegistry.js +198 -0
- package/dist/src/hooks/hookRegistry.js.map +1 -0
- package/dist/src/hooks/hookRegistry.test.d.ts +6 -0
- package/dist/src/hooks/hookRegistry.test.js +341 -0
- package/dist/src/hooks/hookRegistry.test.js.map +1 -0
- package/dist/src/hooks/hookTranslator.d.ts +113 -0
- package/dist/src/hooks/hookTranslator.js +232 -0
- package/dist/src/hooks/hookTranslator.js.map +1 -0
- package/dist/src/hooks/hookTranslator.test.d.ts +6 -0
- package/dist/src/hooks/hookTranslator.test.js +192 -0
- package/dist/src/hooks/hookTranslator.test.js.map +1 -0
- package/dist/src/hooks/types.d.ts +384 -0
- package/dist/src/hooks/types.js +284 -0
- package/dist/src/hooks/types.js.map +1 -0
- package/dist/src/hooks/types.test.d.ts +6 -0
- package/dist/src/hooks/types.test.js +35 -0
- package/dist/src/hooks/types.test.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +8 -5
- package/dist/src/mcp/oauth-provider.js +114 -31
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +54 -1
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/token-storage/file-token-storage.js +1 -1
- package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/file-token-storage.test.js +7 -5
- package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.js +2 -2
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/policy/config.d.ts +31 -0
- package/dist/src/policy/config.js +197 -0
- package/dist/src/policy/config.js.map +1 -0
- package/dist/src/policy/config.test.d.ts +6 -0
- package/dist/src/policy/config.test.js +404 -0
- package/dist/src/policy/config.test.js.map +1 -0
- package/dist/src/policy/index.d.ts +2 -0
- package/dist/src/policy/index.js +2 -0
- package/dist/src/policy/index.js.map +1 -1
- package/dist/src/policy/policies/read-only.toml +56 -0
- package/dist/src/policy/policies/write.toml +63 -0
- package/dist/src/policy/policies/yolo.toml +31 -0
- package/dist/src/policy/toml-loader.d.ts +46 -0
- package/dist/src/policy/toml-loader.js +314 -0
- package/dist/src/policy/toml-loader.js.map +1 -0
- package/dist/src/policy/toml-loader.test.d.ts +6 -0
- package/dist/src/policy/toml-loader.test.js +522 -0
- package/dist/src/policy/toml-loader.test.js.map +1 -0
- package/dist/src/policy/types.d.ts +18 -0
- package/dist/src/policy/types.js +6 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/services/chatCompressionService.js +2 -1
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/chatRecordingService.js +9 -8
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/loopDetectionService.d.ts +1 -1
- package/dist/src/services/loopDetectionService.js +3 -3
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +69 -0
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +18 -4
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +16 -4
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +3 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +31 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +4 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +6 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +13 -1
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +10 -5
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +21 -1
- package/dist/src/telemetry/metrics.js +34 -0
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +43 -126
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +24 -10
- package/dist/src/telemetry/types.js +47 -19
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/tools/edit.js +1 -1
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +1 -1
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.d.ts +31 -6
- package/dist/src/tools/mcp-client-manager.js +111 -41
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +130 -38
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +1 -0
- package/dist/src/tools/mcp-client.js +4 -4
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +49 -0
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/shell.js +1 -1
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/smart-edit.d.ts +1 -1
- package/dist/src/tools/smart-edit.js +12 -1
- package/dist/src/tools/smart-edit.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js +2 -1
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +1 -18
- package/dist/src/tools/tool-registry.js +1 -44
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +2 -24
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/web-fetch.js +3 -6
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +1 -1
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/write-file.js +1 -1
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +1 -1
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/channel.d.ts +1 -0
- package/dist/src/utils/channel.js +4 -4
- package/dist/src/utils/channel.js.map +1 -1
- package/dist/src/utils/channel.test.js +35 -1
- package/dist/src/utils/channel.test.js.map +1 -1
- package/dist/src/utils/events.d.ts +18 -1
- package/dist/src/utils/events.js +8 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/events.test.js +10 -0
- package/dist/src/utils/events.test.js.map +1 -1
- package/dist/src/utils/extensionLoader.d.ts +67 -27
- package/dist/src/utils/extensionLoader.js +149 -7
- package/dist/src/utils/extensionLoader.js.map +1 -1
- package/dist/src/utils/extensionLoader.test.d.ts +6 -0
- package/dist/src/utils/extensionLoader.test.js +90 -0
- package/dist/src/utils/extensionLoader.test.js.map +1 -0
- package/dist/src/utils/fetch.js +1 -6
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/llm-edit-fixer.d.ts +1 -1
- package/dist/src/utils/llm-edit-fixer.js +27 -3
- package/dist/src/utils/llm-edit-fixer.js.map +1 -1
- package/dist/src/utils/llm-edit-fixer.test.js +21 -0
- package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
- package/dist/src/utils/shell-utils.js +29 -1
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +18 -0
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- 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;
|