@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.
- package/dist/docs/changelogs/index.md +87 -0
- package/dist/docs/changelogs/latest.md +355 -150
- package/dist/docs/changelogs/preview.md +318 -210
- package/dist/docs/cli/commands.md +0 -6
- package/dist/docs/cli/keyboard-shortcuts.md +31 -31
- package/dist/docs/cli/settings.md +1 -1
- package/dist/docs/cli/system-prompt.md +32 -0
- package/dist/docs/get-started/configuration.md +3 -3
- package/dist/docs/hooks/index.md +2 -2
- package/dist/docs/sidebar.json +1 -5
- package/dist/google-gemini-cli-core-0.27.0-nightly.20260121.97aac696f.tgz +0 -0
- package/dist/src/config/config.d.ts +6 -0
- package/dist/src/config/config.js +17 -4
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +2 -2
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +2 -0
- package/dist/src/core/client.js +1 -0
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +9 -0
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.d.ts +1 -29
- package/dist/src/core/coreToolHookTriggers.js +7 -70
- package/dist/src/core/coreToolHookTriggers.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.test.js +62 -94
- package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +3 -0
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +1 -0
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +21 -0
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/prompts-substitution.test.js +101 -0
- package/dist/src/core/prompts-substitution.test.js.map +1 -0
- package/dist/src/core/prompts.js +55 -20
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +16 -0
- package/dist/src/core/prompts.test.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/hookSystem.d.ts +45 -3
- package/dist/src/hooks/hookSystem.js +20 -3
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/hooks/hookSystem.test.js +19 -8
- package/dist/src/hooks/hookSystem.test.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/scheduler/state-manager.js +4 -0
- package/dist/src/scheduler/state-manager.js.map +1 -1
- package/dist/src/scheduler/state-manager.test.js +11 -0
- package/dist/src/scheduler/state-manager.test.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +2 -4
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/scheduler/tool-executor.test.js +1 -1
- package/dist/src/scheduler/tool-executor.test.js.map +1 -1
- package/dist/src/tools/confirmation-policy.test.js +1 -1
- package/dist/src/tools/confirmation-policy.test.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 +11 -3
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/write-file.test.js +7 -7
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/editCorrector.js +1 -1
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editor.test.js +2 -0
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +7 -24
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +15 -0
- package/dist/src/utils/workspaceContext.js +32 -11
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/src/utils/workspaceContext.test.js +55 -0
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/docs/changelogs/releases.md +0 -1543
- package/dist/src/core/clientHookTriggers.d.ts +0 -36
- package/dist/src/core/clientHookTriggers.js +0 -76
- package/dist/src/core/clientHookTriggers.js.map +0 -1
- package/dist/src/core/geminiChatHookTriggers.d.ts +0 -68
- package/dist/src/core/geminiChatHookTriggers.js +0 -158
- package/dist/src/core/geminiChatHookTriggers.js.map +0 -1
- package/dist/src/core/geminiChatHookTriggers.test.js +0 -153
- package/dist/src/core/geminiChatHookTriggers.test.js.map +0 -1
- /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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"}
|
|
File without changes
|