@google/gemini-cli-core 0.26.0-preview.0 → 0.27.0-nightly.20260122.61040d0eb

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 (88) hide show
  1. package/dist/docs/changelogs/index.md +87 -0
  2. package/dist/docs/changelogs/latest.md +355 -150
  3. package/dist/docs/changelogs/preview.md +318 -210
  4. package/dist/docs/cli/commands.md +0 -6
  5. package/dist/docs/cli/keyboard-shortcuts.md +31 -31
  6. package/dist/docs/cli/settings.md +1 -1
  7. package/dist/docs/cli/system-prompt.md +32 -0
  8. package/dist/docs/get-started/configuration.md +3 -3
  9. package/dist/docs/hooks/index.md +2 -2
  10. package/dist/docs/sidebar.json +1 -5
  11. package/dist/google-gemini-cli-core-0.27.0-nightly.20260121.97aac696f.tgz +0 -0
  12. package/dist/src/config/config.d.ts +6 -0
  13. package/dist/src/config/config.js +17 -4
  14. package/dist/src/config/config.js.map +1 -1
  15. package/dist/src/config/config.test.js +2 -2
  16. package/dist/src/config/config.test.js.map +1 -1
  17. package/dist/src/confirmation-bus/types.d.ts +2 -0
  18. package/dist/src/core/client.js +1 -0
  19. package/dist/src/core/client.js.map +1 -1
  20. package/dist/src/core/client.test.js +9 -0
  21. package/dist/src/core/client.test.js.map +1 -1
  22. package/dist/src/core/coreToolHookTriggers.d.ts +1 -29
  23. package/dist/src/core/coreToolHookTriggers.js +7 -70
  24. package/dist/src/core/coreToolHookTriggers.js.map +1 -1
  25. package/dist/src/core/coreToolHookTriggers.test.js +62 -94
  26. package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
  27. package/dist/src/core/coreToolScheduler.test.js +3 -0
  28. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  29. package/dist/src/core/geminiChat.js +1 -0
  30. package/dist/src/core/geminiChat.js.map +1 -1
  31. package/dist/src/core/geminiChat.test.js +21 -0
  32. package/dist/src/core/geminiChat.test.js.map +1 -1
  33. package/dist/src/core/prompts-substitution.test.js +101 -0
  34. package/dist/src/core/prompts-substitution.test.js.map +1 -0
  35. package/dist/src/core/prompts.js +55 -20
  36. package/dist/src/core/prompts.js.map +1 -1
  37. package/dist/src/core/prompts.test.js +16 -0
  38. package/dist/src/core/prompts.test.js.map +1 -1
  39. package/dist/src/generated/git-commit.d.ts +2 -2
  40. package/dist/src/generated/git-commit.js +2 -2
  41. package/dist/src/generated/git-commit.js.map +1 -1
  42. package/dist/src/hooks/hookSystem.d.ts +45 -3
  43. package/dist/src/hooks/hookSystem.js +20 -3
  44. package/dist/src/hooks/hookSystem.js.map +1 -1
  45. package/dist/src/hooks/hookSystem.test.js +19 -8
  46. package/dist/src/hooks/hookSystem.test.js.map +1 -1
  47. package/dist/src/index.d.ts +1 -0
  48. package/dist/src/index.js +1 -0
  49. package/dist/src/index.js.map +1 -1
  50. package/dist/src/scheduler/state-manager.js +4 -0
  51. package/dist/src/scheduler/state-manager.js.map +1 -1
  52. package/dist/src/scheduler/state-manager.test.js +11 -0
  53. package/dist/src/scheduler/state-manager.test.js.map +1 -1
  54. package/dist/src/scheduler/tool-executor.js +2 -4
  55. package/dist/src/scheduler/tool-executor.js.map +1 -1
  56. package/dist/src/scheduler/tool-executor.test.js +1 -1
  57. package/dist/src/scheduler/tool-executor.test.js.map +1 -1
  58. package/dist/src/tools/confirmation-policy.test.js +1 -1
  59. package/dist/src/tools/confirmation-policy.test.js.map +1 -1
  60. package/dist/src/tools/edit.js +1 -1
  61. package/dist/src/tools/edit.js.map +1 -1
  62. package/dist/src/tools/edit.test.js +11 -3
  63. package/dist/src/tools/edit.test.js.map +1 -1
  64. package/dist/src/tools/write-file.test.js +7 -7
  65. package/dist/src/tools/write-file.test.js.map +1 -1
  66. package/dist/src/utils/editCorrector.js +1 -1
  67. package/dist/src/utils/editCorrector.js.map +1 -1
  68. package/dist/src/utils/editor.test.js +2 -0
  69. package/dist/src/utils/editor.test.js.map +1 -1
  70. package/dist/src/utils/memoryImportProcessor.js +7 -24
  71. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  72. package/dist/src/utils/workspaceContext.d.ts +15 -0
  73. package/dist/src/utils/workspaceContext.js +32 -11
  74. package/dist/src/utils/workspaceContext.js.map +1 -1
  75. package/dist/src/utils/workspaceContext.test.js +55 -0
  76. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  77. package/dist/tsconfig.tsbuildinfo +1 -1
  78. package/package.json +1 -1
  79. package/dist/docs/changelogs/releases.md +0 -1543
  80. package/dist/src/core/clientHookTriggers.d.ts +0 -36
  81. package/dist/src/core/clientHookTriggers.js +0 -76
  82. package/dist/src/core/clientHookTriggers.js.map +0 -1
  83. package/dist/src/core/geminiChatHookTriggers.d.ts +0 -68
  84. package/dist/src/core/geminiChatHookTriggers.js +0 -158
  85. package/dist/src/core/geminiChatHookTriggers.js.map +0 -1
  86. package/dist/src/core/geminiChatHookTriggers.test.js +0 -153
  87. package/dist/src/core/geminiChatHookTriggers.test.js.map +0 -1
  88. /package/dist/src/core/{geminiChatHookTriggers.test.d.ts → prompts-substitution.test.d.ts} +0 -0
@@ -1,36 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import type { PartListUnion } from '@google/genai';
7
- import type { MessageBus } from '../confirmation-bus/message-bus.js';
8
- import { type DefaultHookOutput } from '../hooks/types.js';
9
- /**
10
- * Fires the BeforeAgent hook and returns the hook output.
11
- * This should be called before processing a user prompt.
12
- *
13
- * The caller can use the returned DefaultHookOutput methods:
14
- * - isBlockingDecision() / shouldStopExecution() to check if blocked
15
- * - getEffectiveReason() to get the blocking reason
16
- * - getAdditionalContext() to get additional context to add
17
- *
18
- * @param messageBus The message bus to use for hook communication
19
- * @param request The user's request (prompt)
20
- * @returns The hook output, or undefined if no hook was executed or on error
21
- */
22
- export declare function fireBeforeAgentHook(messageBus: MessageBus, request: PartListUnion): Promise<DefaultHookOutput | undefined>;
23
- /**
24
- * Fires the AfterAgent hook and returns the hook output.
25
- * This should be called after the agent has generated a response.
26
- *
27
- * The caller can use the returned DefaultHookOutput methods:
28
- * - isBlockingDecision() / shouldStopExecution() to check if continuation is requested
29
- * - getEffectiveReason() to get the continuation reason
30
- *
31
- * @param messageBus The message bus to use for hook communication
32
- * @param request The original user's request (prompt)
33
- * @param responseText The agent's response text
34
- * @returns The hook output, or undefined if no hook was executed or on error
35
- */
36
- export declare function fireAfterAgentHook(messageBus: MessageBus, request: PartListUnion, responseText: string): Promise<DefaultHookOutput | undefined>;
@@ -1,76 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { MessageBusType, } from '../confirmation-bus/types.js';
7
- import { createHookOutput } from '../hooks/types.js';
8
- import { partToString } from '../utils/partUtils.js';
9
- import { debugLogger } from '../utils/debugLogger.js';
10
- /**
11
- * Fires the BeforeAgent hook and returns the hook output.
12
- * This should be called before processing a user prompt.
13
- *
14
- * The caller can use the returned DefaultHookOutput methods:
15
- * - isBlockingDecision() / shouldStopExecution() to check if blocked
16
- * - getEffectiveReason() to get the blocking reason
17
- * - getAdditionalContext() to get additional context to add
18
- *
19
- * @param messageBus The message bus to use for hook communication
20
- * @param request The user's request (prompt)
21
- * @returns The hook output, or undefined if no hook was executed or on error
22
- */
23
- export async function fireBeforeAgentHook(messageBus, request) {
24
- try {
25
- const promptText = partToString(request);
26
- const response = await messageBus.request({
27
- type: MessageBusType.HOOK_EXECUTION_REQUEST,
28
- eventName: 'BeforeAgent',
29
- input: {
30
- prompt: promptText,
31
- },
32
- }, MessageBusType.HOOK_EXECUTION_RESPONSE);
33
- return response.output
34
- ? createHookOutput('BeforeAgent', response.output)
35
- : undefined;
36
- }
37
- catch (error) {
38
- debugLogger.debug(`BeforeAgent hook failed: ${error}`);
39
- return undefined;
40
- }
41
- }
42
- /**
43
- * Fires the AfterAgent hook and returns the hook output.
44
- * This should be called after the agent has generated a response.
45
- *
46
- * The caller can use the returned DefaultHookOutput methods:
47
- * - isBlockingDecision() / shouldStopExecution() to check if continuation is requested
48
- * - getEffectiveReason() to get the continuation reason
49
- *
50
- * @param messageBus The message bus to use for hook communication
51
- * @param request The original user's request (prompt)
52
- * @param responseText The agent's response text
53
- * @returns The hook output, or undefined if no hook was executed or on error
54
- */
55
- export async function fireAfterAgentHook(messageBus, request, responseText) {
56
- try {
57
- const promptText = partToString(request);
58
- const response = await messageBus.request({
59
- type: MessageBusType.HOOK_EXECUTION_REQUEST,
60
- eventName: 'AfterAgent',
61
- input: {
62
- prompt: promptText,
63
- prompt_response: responseText,
64
- stop_hook_active: false,
65
- },
66
- }, MessageBusType.HOOK_EXECUTION_RESPONSE);
67
- return response.output
68
- ? createHookOutput('AfterAgent', response.output)
69
- : undefined;
70
- }
71
- catch (error) {
72
- debugLogger.debug(`AfterAgent hook failed: ${error}`);
73
- return undefined;
74
- }
75
- }
76
- //# sourceMappingURL=clientHookTriggers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clientHookTriggers.js","sourceRoot":"","sources":["../../../src/core/clientHookTriggers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,cAAc,GAGf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAA0B,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAsB,EACtB,OAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAIvC;YACE,IAAI,EAAE,cAAc,CAAC,sBAAsB;YAC3C,SAAS,EAAE,aAAa;YACxB,KAAK,EAAE;gBACL,MAAM,EAAE,UAAU;aACnB;SACF,EACD,cAAc,CAAC,uBAAuB,CACvC,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM;YACpB,CAAC,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC;YAClD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAsB,EACtB,OAAsB,EACtB,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAIvC;YACE,IAAI,EAAE,cAAc,CAAC,sBAAsB;YAC3C,SAAS,EAAE,YAAY;YACvB,KAAK,EAAE;gBACL,MAAM,EAAE,UAAU;gBAClB,eAAe,EAAE,YAAY;gBAC7B,gBAAgB,EAAE,KAAK;aACxB;SACF,EACD,cAAc,CAAC,uBAAuB,CACvC,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM;YACpB,CAAC,CAAC,gBAAgB,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC;YACjD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -1,68 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import type { GenerateContentResponse, GenerateContentParameters, GenerateContentConfig, ContentListUnion, ToolConfig, ToolListUnion } from '@google/genai';
7
- import type { MessageBus } from '../confirmation-bus/message-bus.js';
8
- /**
9
- * Result from firing the BeforeModel hook.
10
- */
11
- export interface BeforeModelHookResult {
12
- /** Whether the model call was blocked */
13
- blocked: boolean;
14
- /** Whether the execution should be stopped entirely */
15
- stopped?: boolean;
16
- /** Reason for blocking (if blocked) */
17
- reason?: string;
18
- /** Synthetic response to return instead of calling the model (if blocked) */
19
- syntheticResponse?: GenerateContentResponse;
20
- /** Modified config (if not blocked) */
21
- modifiedConfig?: GenerateContentConfig;
22
- /** Modified contents (if not blocked) */
23
- modifiedContents?: ContentListUnion;
24
- }
25
- /**
26
- * Result from firing the BeforeToolSelection hook.
27
- */
28
- export interface BeforeToolSelectionHookResult {
29
- /** Modified tool config */
30
- toolConfig?: ToolConfig;
31
- /** Modified tools */
32
- tools?: ToolListUnion;
33
- }
34
- /**
35
- * Result from firing the AfterModel hook.
36
- * Contains either a modified response or indicates to use the original chunk.
37
- */
38
- export interface AfterModelHookResult {
39
- /** The response to yield (either modified or original) */
40
- response: GenerateContentResponse;
41
- /** Whether the execution should be stopped entirely */
42
- stopped?: boolean;
43
- /** Whether the model call was blocked */
44
- blocked?: boolean;
45
- /** Reason for blocking or stopping */
46
- reason?: string;
47
- }
48
- /**
49
- * Fires the BeforeModel hook and returns the result.
50
- */
51
- export declare function fireBeforeModelHook(messageBus: MessageBus, llmRequest: GenerateContentParameters): Promise<BeforeModelHookResult>;
52
- /**
53
- * Fires the BeforeToolSelection hook and returns the result.
54
- *
55
- * @param messageBus The message bus to use for hook communication
56
- * @param llmRequest The LLM request parameters
57
- * @returns The hook result with tool configuration modifications
58
- */
59
- export declare function fireBeforeToolSelectionHook(messageBus: MessageBus, llmRequest: GenerateContentParameters): Promise<BeforeToolSelectionHookResult>;
60
- /**
61
- * Fires the AfterModel hook and returns the result.
62
- *
63
- * @param messageBus The message bus to use for hook communication
64
- * @param originalRequest The original LLM request parameters
65
- * @param chunk The current response chunk from the model
66
- * @returns The hook result containing the response to yield
67
- */
68
- export declare function fireAfterModelHook(messageBus: MessageBus, originalRequest: GenerateContentParameters, chunk: GenerateContentResponse): Promise<AfterModelHookResult>;
@@ -1,158 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { MessageBusType, } from '../confirmation-bus/types.js';
7
- import { createHookOutput, } from '../hooks/types.js';
8
- import { debugLogger } from '../utils/debugLogger.js';
9
- /**
10
- * Fires the BeforeModel hook and returns the result.
11
- */
12
- export async function fireBeforeModelHook(messageBus, llmRequest) {
13
- try {
14
- const response = await messageBus.request({
15
- type: MessageBusType.HOOK_EXECUTION_REQUEST,
16
- eventName: 'BeforeModel',
17
- input: {
18
- llm_request: llmRequest,
19
- },
20
- }, MessageBusType.HOOK_EXECUTION_RESPONSE);
21
- // Reconstruct result from response
22
- const beforeResultFinalOutput = response.output
23
- ? createHookOutput('BeforeModel', response.output)
24
- : undefined;
25
- const hookOutput = beforeResultFinalOutput;
26
- // Check if hook requested to stop execution
27
- if (hookOutput?.shouldStopExecution()) {
28
- return {
29
- blocked: true,
30
- stopped: true,
31
- reason: hookOutput.getEffectiveReason(),
32
- };
33
- }
34
- // Check if hook blocked the model call
35
- const blockingError = hookOutput?.getBlockingError();
36
- if (blockingError?.blocked) {
37
- const beforeModelOutput = hookOutput;
38
- const syntheticResponse = beforeModelOutput.getSyntheticResponse();
39
- const reason = hookOutput?.getEffectiveReason() || 'Model call blocked by hook';
40
- return {
41
- blocked: true,
42
- reason,
43
- syntheticResponse,
44
- };
45
- }
46
- // Apply modifications from hook
47
- if (hookOutput) {
48
- const beforeModelOutput = hookOutput;
49
- const modifiedRequest = beforeModelOutput.applyLLMRequestModifications(llmRequest);
50
- return {
51
- blocked: false,
52
- modifiedConfig: modifiedRequest.config,
53
- modifiedContents: modifiedRequest.contents,
54
- };
55
- }
56
- return { blocked: false };
57
- }
58
- catch (error) {
59
- debugLogger.debug(`BeforeModel hook failed:`, error);
60
- return { blocked: false };
61
- }
62
- }
63
- /**
64
- * Fires the BeforeToolSelection hook and returns the result.
65
- *
66
- * @param messageBus The message bus to use for hook communication
67
- * @param llmRequest The LLM request parameters
68
- * @returns The hook result with tool configuration modifications
69
- */
70
- export async function fireBeforeToolSelectionHook(messageBus, llmRequest) {
71
- try {
72
- const response = await messageBus.request({
73
- type: MessageBusType.HOOK_EXECUTION_REQUEST,
74
- eventName: 'BeforeToolSelection',
75
- input: {
76
- llm_request: llmRequest,
77
- },
78
- }, MessageBusType.HOOK_EXECUTION_RESPONSE);
79
- // Reconstruct result from response
80
- const toolSelectionResultFinalOutput = response.output
81
- ? createHookOutput('BeforeToolSelection', response.output)
82
- : undefined;
83
- // Apply tool configuration modifications
84
- if (toolSelectionResultFinalOutput) {
85
- const beforeToolSelectionOutput = toolSelectionResultFinalOutput;
86
- const modifiedConfig = beforeToolSelectionOutput.applyToolConfigModifications({
87
- toolConfig: llmRequest.config?.toolConfig,
88
- tools: llmRequest.config?.tools,
89
- });
90
- return {
91
- toolConfig: modifiedConfig.toolConfig,
92
- tools: modifiedConfig.tools,
93
- };
94
- }
95
- return {};
96
- }
97
- catch (error) {
98
- debugLogger.debug(`BeforeToolSelection hook failed:`, error);
99
- return {};
100
- }
101
- }
102
- /**
103
- * Fires the AfterModel hook and returns the result.
104
- *
105
- * @param messageBus The message bus to use for hook communication
106
- * @param originalRequest The original LLM request parameters
107
- * @param chunk The current response chunk from the model
108
- * @returns The hook result containing the response to yield
109
- */
110
- export async function fireAfterModelHook(messageBus, originalRequest, chunk) {
111
- try {
112
- const response = await messageBus.request({
113
- type: MessageBusType.HOOK_EXECUTION_REQUEST,
114
- eventName: 'AfterModel',
115
- input: {
116
- llm_request: originalRequest,
117
- llm_response: chunk,
118
- },
119
- }, MessageBusType.HOOK_EXECUTION_RESPONSE);
120
- // Reconstruct result from response
121
- const afterResultFinalOutput = response.output
122
- ? createHookOutput('AfterModel', response.output)
123
- : undefined;
124
- const hookOutput = afterResultFinalOutput;
125
- // Check if hook requested to stop execution
126
- if (hookOutput?.shouldStopExecution()) {
127
- return {
128
- response: chunk,
129
- stopped: true,
130
- reason: hookOutput.getEffectiveReason(),
131
- };
132
- }
133
- // Check if hook blocked the model call
134
- const blockingError = hookOutput?.getBlockingError();
135
- if (blockingError?.blocked) {
136
- return {
137
- response: chunk,
138
- blocked: true,
139
- reason: hookOutput?.getEffectiveReason(),
140
- };
141
- }
142
- // Apply modifications from hook
143
- if (hookOutput) {
144
- const afterModelOutput = hookOutput;
145
- const modifiedResponse = afterModelOutput.getModifiedResponse();
146
- if (modifiedResponse) {
147
- return { response: modifiedResponse };
148
- }
149
- }
150
- return { response: chunk };
151
- }
152
- catch (error) {
153
- debugLogger.debug(`AfterModel hook failed:`, error);
154
- // On error, return original chunk to avoid interrupting the stream.
155
- return { response: chunk };
156
- }
157
- }
158
- //# sourceMappingURL=geminiChatHookTriggers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"geminiChatHookTriggers.js","sourceRoot":"","sources":["../../../src/core/geminiChatHookTriggers.ts"],"names":[],"mappings":"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"}
@@ -1,153 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { describe, it, expect, vi, beforeEach } from 'vitest';
7
- import { fireBeforeModelHook, fireAfterModelHook, } from './geminiChatHookTriggers.js';
8
- // Mock dependencies
9
- const mockRequest = vi.fn();
10
- const mockMessageBus = {
11
- request: mockRequest,
12
- };
13
- // Mock hook types
14
- vi.mock('../hooks/types.js', async () => {
15
- const actual = await vi.importActual('../hooks/types.js');
16
- return {
17
- ...actual,
18
- createHookOutput: vi.fn(),
19
- };
20
- });
21
- import { createHookOutput } from '../hooks/types.js';
22
- describe('Gemini Chat Hook Triggers', () => {
23
- beforeEach(() => {
24
- vi.clearAllMocks();
25
- });
26
- describe('fireBeforeModelHook', () => {
27
- const llmRequest = {
28
- model: 'gemini-pro',
29
- contents: [{ parts: [{ text: 'test' }] }],
30
- };
31
- it('should return stopped: true when hook requests stop execution', async () => {
32
- mockRequest.mockResolvedValue({
33
- output: { continue: false, stopReason: 'stopped by hook' },
34
- });
35
- vi.mocked(createHookOutput).mockReturnValue({
36
- shouldStopExecution: () => true,
37
- getEffectiveReason: () => 'stopped by hook',
38
- getBlockingError: () => ({ blocked: false, reason: '' }),
39
- });
40
- const result = await fireBeforeModelHook(mockMessageBus, llmRequest);
41
- expect(result).toEqual({
42
- blocked: true,
43
- stopped: true,
44
- reason: 'stopped by hook',
45
- });
46
- });
47
- it('should return blocked: true when hook blocks execution', async () => {
48
- mockRequest.mockResolvedValue({
49
- output: { decision: 'block', reason: 'blocked by hook' },
50
- });
51
- vi.mocked(createHookOutput).mockReturnValue({
52
- shouldStopExecution: () => false,
53
- getBlockingError: () => ({ blocked: true, reason: 'blocked by hook' }),
54
- getEffectiveReason: () => 'blocked by hook',
55
- getSyntheticResponse: () => undefined,
56
- });
57
- const result = await fireBeforeModelHook(mockMessageBus, llmRequest);
58
- expect(result).toEqual({
59
- blocked: true,
60
- reason: 'blocked by hook',
61
- syntheticResponse: undefined,
62
- });
63
- });
64
- it('should return modifications when hook allows execution', async () => {
65
- mockRequest.mockResolvedValue({
66
- output: { decision: 'allow' },
67
- });
68
- vi.mocked(createHookOutput).mockReturnValue({
69
- shouldStopExecution: () => false,
70
- getBlockingError: () => ({ blocked: false, reason: '' }),
71
- applyLLMRequestModifications: (req) => req,
72
- });
73
- const result = await fireBeforeModelHook(mockMessageBus, llmRequest);
74
- expect(result).toEqual({
75
- blocked: false,
76
- modifiedConfig: undefined,
77
- modifiedContents: llmRequest.contents,
78
- });
79
- });
80
- });
81
- describe('fireAfterModelHook', () => {
82
- const llmRequest = {
83
- model: 'gemini-pro',
84
- contents: [],
85
- };
86
- const llmResponse = {
87
- candidates: [
88
- { content: { role: 'model', parts: [{ text: 'response' }] } },
89
- ],
90
- };
91
- it('should return stopped: true when hook requests stop execution', async () => {
92
- mockRequest.mockResolvedValue({
93
- output: { continue: false, stopReason: 'stopped by hook' },
94
- });
95
- vi.mocked(createHookOutput).mockReturnValue({
96
- shouldStopExecution: () => true,
97
- getEffectiveReason: () => 'stopped by hook',
98
- });
99
- const result = await fireAfterModelHook(mockMessageBus, llmRequest, llmResponse);
100
- expect(result).toEqual({
101
- response: llmResponse,
102
- stopped: true,
103
- reason: 'stopped by hook',
104
- });
105
- });
106
- it('should return blocked: true when hook blocks execution', async () => {
107
- mockRequest.mockResolvedValue({
108
- output: { decision: 'block', reason: 'blocked by hook' },
109
- });
110
- vi.mocked(createHookOutput).mockReturnValue({
111
- shouldStopExecution: () => false,
112
- getBlockingError: () => ({ blocked: true, reason: 'blocked by hook' }),
113
- getEffectiveReason: () => 'blocked by hook',
114
- });
115
- const result = await fireAfterModelHook(mockMessageBus, llmRequest, llmResponse);
116
- expect(result).toEqual({
117
- response: llmResponse,
118
- blocked: true,
119
- reason: 'blocked by hook',
120
- });
121
- });
122
- it('should return modified response when hook modifies response', async () => {
123
- const modifiedResponse = { ...llmResponse, text: 'modified' };
124
- mockRequest.mockResolvedValue({
125
- output: { hookSpecificOutput: { llm_response: {} } },
126
- });
127
- vi.mocked(createHookOutput).mockReturnValue({
128
- shouldStopExecution: () => false,
129
- getBlockingError: () => ({ blocked: false, reason: '' }),
130
- getModifiedResponse: () => modifiedResponse,
131
- });
132
- const result = await fireAfterModelHook(mockMessageBus, llmRequest, llmResponse);
133
- expect(result).toEqual({
134
- response: modifiedResponse,
135
- });
136
- });
137
- it('should return original response when hook has no effect', async () => {
138
- mockRequest.mockResolvedValue({
139
- output: {},
140
- });
141
- vi.mocked(createHookOutput).mockReturnValue({
142
- shouldStopExecution: () => false,
143
- getBlockingError: () => ({ blocked: false, reason: '' }),
144
- getModifiedResponse: () => undefined,
145
- });
146
- const result = await fireAfterModelHook(mockMessageBus, llmRequest, llmResponse);
147
- expect(result).toEqual({
148
- response: llmResponse,
149
- });
150
- });
151
- });
152
- });
153
- //# sourceMappingURL=geminiChatHookTriggers.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"geminiChatHookTriggers.test.js","sourceRoot":"","sources":["../../../src/core/geminiChatHookTriggers.test.ts"],"names":[],"mappings":"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"}