@google/gemini-cli-core 0.24.0-nightly.20251231.05049b5ab → 0.24.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/docs/cli/settings.md +1 -0
- package/dist/docs/cli/skills.md +156 -0
- package/dist/docs/cli/telemetry.md +3 -3
- package/dist/docs/cli/tutorials/skills-getting-started.md +124 -0
- package/dist/docs/cli/tutorials.md +4 -0
- package/dist/docs/get-started/configuration.md +32 -11
- package/dist/docs/hooks/best-practices.md +177 -127
- package/dist/docs/hooks/index.md +22 -0
- package/dist/docs/sidebar.json +4 -0
- package/dist/src/agents/a2a-client-manager.d.ts +5 -0
- package/dist/src/agents/a2a-client-manager.js +130 -0
- package/dist/src/agents/a2a-client-manager.js.map +1 -1
- package/dist/src/agents/a2a-client-manager.test.js +27 -1
- package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
- package/dist/src/agents/a2aUtils.d.ts +28 -0
- package/dist/src/agents/a2aUtils.js +111 -0
- package/dist/src/agents/a2aUtils.js.map +1 -0
- package/dist/src/agents/a2aUtils.test.js +147 -0
- package/dist/src/agents/a2aUtils.test.js.map +1 -0
- package/dist/src/agents/delegate-to-agent-tool.d.ts +2 -2
- package/dist/src/agents/delegate-to-agent-tool.js +6 -6
- package/dist/src/agents/delegate-to-agent-tool.js.map +1 -1
- package/dist/src/agents/delegate-to-agent-tool.test.js +37 -7
- package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -1
- package/dist/src/agents/introspection-agent.js +2 -2
- package/dist/src/agents/introspection-agent.js.map +1 -1
- package/dist/src/agents/introspection-agent.test.js +2 -2
- package/dist/src/agents/introspection-agent.test.js.map +1 -1
- package/dist/src/agents/local-executor.js +1 -1
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +2 -2
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.d.ts +2 -2
- package/dist/src/agents/local-invocation.js +3 -3
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +7 -5
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +17 -3
- package/dist/src/agents/remote-invocation.js +104 -6
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/remote-invocation.test.js +184 -18
- package/dist/src/agents/remote-invocation.test.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.d.ts +2 -2
- package/dist/src/agents/subagent-tool-wrapper.js +6 -5
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +17 -10
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +6 -0
- package/dist/src/code_assist/oauth2.js +31 -1
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +75 -3
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +5 -0
- package/dist/src/code_assist/server.js +19 -4
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +19 -0
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/setup.js +6 -4
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +63 -0
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +18 -0
- package/dist/src/config/config.d.ts +20 -6
- package/dist/src/config/config.js +63 -37
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +81 -4
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +13 -0
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/config/models.js +6 -4
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +21 -1
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/core/client.js +39 -7
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +93 -1
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +1 -1
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +1 -1
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.test.js +11 -9
- package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +1 -0
- package/dist/src/core/coreToolScheduler.js +30 -106
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +21 -22
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.js +14 -2
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +0 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +29 -5
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +40 -1
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/sessionHookTriggers.d.ts +3 -2
- package/dist/src/core/sessionHookTriggers.js +8 -1
- package/dist/src/core/sessionHookTriggers.js.map +1 -1
- package/dist/src/core/turn.d.ts +16 -2
- package/dist/src/core/turn.js +2 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +3 -3
- package/dist/src/generated/git-commit.js +3 -3
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.d.ts +6 -2
- package/dist/src/hooks/hookEventHandler.js +24 -3
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.test.js +31 -8
- package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
- package/dist/src/hooks/hookRunner.d.ts +2 -2
- package/dist/src/hooks/hookRunner.js +12 -4
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +33 -0
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/policy/config.js +60 -22
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +21 -0
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/persistence.test.js +1 -1
- package/dist/src/policy/persistence.test.js.map +1 -1
- package/dist/src/policy/policies/write.toml +5 -0
- package/dist/src/policy/policy-engine.d.ts +4 -0
- package/dist/src/policy/policy-engine.js +75 -51
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +272 -1
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/policy-updater.test.js +2 -2
- package/dist/src/policy/policy-updater.test.js.map +1 -1
- package/dist/src/policy/toml-loader.d.ts +0 -8
- package/dist/src/policy/toml-loader.js +7 -70
- package/dist/src/policy/toml-loader.js.map +1 -1
- package/dist/src/policy/toml-loader.test.js +16 -6
- package/dist/src/policy/toml-loader.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +6 -0
- package/dist/src/policy/utils.d.ts +21 -0
- package/dist/src/policy/utils.js +42 -0
- package/dist/src/policy/utils.js.map +1 -0
- package/dist/src/policy/utils.test.js +64 -0
- package/dist/src/policy/utils.test.js.map +1 -0
- package/dist/src/scheduler/tool-executor.d.ts +22 -0
- package/dist/src/scheduler/tool-executor.js +198 -0
- package/dist/src/scheduler/tool-executor.js.map +1 -0
- package/dist/src/scheduler/tool-executor.test.d.ts +6 -0
- package/dist/src/scheduler/tool-executor.test.js +231 -0
- package/dist/src/scheduler/tool-executor.test.js.map +1 -0
- package/dist/src/skills/skillLoader.d.ts +28 -0
- package/dist/src/skills/skillLoader.js +77 -0
- package/dist/src/skills/skillLoader.js.map +1 -0
- package/dist/src/skills/skillLoader.test.d.ts +6 -0
- package/dist/src/skills/skillLoader.test.js +73 -0
- package/dist/src/skills/skillLoader.test.js.map +1 -0
- package/dist/src/{services → skills}/skillManager.d.ts +10 -20
- package/dist/src/skills/skillManager.js +89 -0
- package/dist/src/skills/skillManager.js.map +1 -0
- package/dist/src/skills/skillManager.test.d.ts +6 -0
- package/dist/src/skills/skillManager.test.js +128 -0
- package/dist/src/skills/skillManager.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +5 -5
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +8 -8
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -2
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -4
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +3 -3
- package/dist/src/telemetry/loggers.js +4 -4
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +6 -8
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +7 -7
- package/dist/src/telemetry/types.js +10 -10
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/mock-message-bus.d.ts +1 -0
- package/dist/src/test-utils/mock-message-bus.js +29 -0
- package/dist/src/test-utils/mock-message-bus.js.map +1 -1
- package/dist/src/test-utils/mock-tool.d.ts +5 -3
- package/dist/src/test-utils/mock-tool.js +11 -10
- package/dist/src/test-utils/mock-tool.js.map +1 -1
- package/dist/src/tools/activate-skill.d.ts +27 -0
- package/dist/src/tools/activate-skill.js +120 -0
- package/dist/src/tools/activate-skill.js.map +1 -0
- package/dist/src/tools/activate-skill.test.d.ts +6 -0
- package/dist/src/tools/activate-skill.test.js +95 -0
- package/dist/src/tools/activate-skill.test.js.map +1 -0
- package/dist/src/tools/confirmation-policy.test.js +2 -12
- package/dist/src/tools/confirmation-policy.test.js.map +1 -1
- package/dist/src/tools/edit.d.ts +27 -5
- package/dist/src/tools/edit.js +444 -137
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +257 -525
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/get-internal-docs.d.ts +2 -2
- package/dist/src/tools/get-internal-docs.js +6 -6
- package/dist/src/tools/get-internal-docs.js.map +1 -1
- package/dist/src/tools/get-internal-docs.test.js +2 -1
- package/dist/src/tools/get-internal-docs.test.js.map +1 -1
- package/dist/src/tools/glob.d.ts +2 -2
- package/dist/src/tools/glob.js +1 -1
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +2 -1
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +2 -2
- package/dist/src/tools/grep.js +1 -1
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +5 -4
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.d.ts +2 -2
- package/dist/src/tools/ls.js +2 -2
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +2 -1
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.js +14 -7
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +28 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +2 -2
- package/dist/src/tools/mcp-client.js +2 -1
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +2 -2
- package/dist/src/tools/mcp-tool.js +7 -7
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +11 -6
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +3 -3
- package/dist/src/tools/memoryTool.js +2 -2
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +5 -2
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/message-bus-integration.test.js +10 -37
- package/dist/src/tools/message-bus-integration.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +2 -2
- package/dist/src/tools/read-file.js +1 -1
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +3 -2
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +2 -2
- package/dist/src/tools/read-many-files.js +2 -3
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +3 -2
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +2 -2
- package/dist/src/tools/ripGrep.js +3 -4
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +7 -6
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +3 -6
- package/dist/src/tools/shell.js +15 -48
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +35 -59
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +2 -1
- package/dist/src/tools/tool-names.js +2 -0
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +11 -6
- package/dist/src/tools/tool-registry.js +13 -8
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +14 -10
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +5 -5
- package/dist/src/tools/tools.js +15 -17
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +3 -1
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/web-fetch.d.ts +2 -2
- package/dist/src/tools/web-fetch.js +4 -4
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +17 -19
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +2 -2
- package/dist/src/tools/web-search.js +3 -4
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.js +2 -1
- package/dist/src/tools/web-search.test.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +2 -2
- package/dist/src/tools/write-file.js +3 -3
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +4 -1
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.d.ts +2 -2
- package/dist/src/tools/write-todos.js +5 -4
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/tools/write-todos.test.js +2 -1
- package/dist/src/tools/write-todos.test.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +1 -1
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/events.d.ts +46 -1
- package/dist/src/utils/events.js +21 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/events.test.js +25 -0
- package/dist/src/utils/events.test.js.map +1 -1
- package/dist/src/utils/getFolderStructure.js +6 -1
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/shell-permissions.test.js +27 -0
- package/dist/src/utils/shell-permissions.test.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +6 -0
- package/dist/src/utils/shell-utils.js +72 -8
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +99 -1
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/terminal.d.ts +2 -0
- package/dist/src/utils/terminal.js +6 -0
- package/dist/src/utils/terminal.js.map +1 -1
- package/dist/src/utils/tokenCalculation.js +20 -5
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/utils/tokenCalculation.test.js +11 -2
- package/dist/src/utils/tokenCalculation.test.js.map +1 -1
- package/dist/src/utils/tool-utils.test.js +2 -1
- package/dist/src/utils/tool-utils.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/google-gemini-cli-core-0.24.0-nightly.20251227.37be16243.tgz +0 -0
- package/dist/src/services/skillManager.js +0 -157
- package/dist/src/services/skillManager.js.map +0 -1
- package/dist/src/services/skillManager.test.js +0 -169
- package/dist/src/services/skillManager.test.js.map +0 -1
- package/dist/src/tools/smart-edit.d.ts +0 -78
- package/dist/src/tools/smart-edit.js +0 -722
- package/dist/src/tools/smart-edit.js.map +0 -1
- package/dist/src/tools/smart-edit.test.js +0 -592
- package/dist/src/tools/smart-edit.test.js.map +0 -1
- /package/dist/src/{services/skillManager.test.d.ts → agents/a2aUtils.test.d.ts} +0 -0
- /package/dist/src/{tools/smart-edit.test.d.ts → policy/utils.test.d.ts} +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Escapes a string for use in a regular expression.
|
|
8
|
+
*/
|
|
9
|
+
export declare function escapeRegex(text: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Builds a list of args patterns for policy matching.
|
|
12
|
+
*
|
|
13
|
+
* This function handles the transformation of command prefixes and regexes into
|
|
14
|
+
* the internal argsPattern representation used by the PolicyEngine.
|
|
15
|
+
*
|
|
16
|
+
* @param argsPattern An optional raw regex string for arguments.
|
|
17
|
+
* @param commandPrefix An optional command prefix (or list of prefixes) to allow.
|
|
18
|
+
* @param commandRegex An optional command regex string to allow.
|
|
19
|
+
* @returns An array of string patterns (or undefined) for the PolicyEngine.
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildArgsPatterns(argsPattern?: string, commandPrefix?: string | string[], commandRegex?: string): Array<string | undefined>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Escapes a string for use in a regular expression.
|
|
8
|
+
*/
|
|
9
|
+
export function escapeRegex(text) {
|
|
10
|
+
return text.replace(/[-[\]{}()*+?.,\\^$|#\s"]/g, '\\$&');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Builds a list of args patterns for policy matching.
|
|
14
|
+
*
|
|
15
|
+
* This function handles the transformation of command prefixes and regexes into
|
|
16
|
+
* the internal argsPattern representation used by the PolicyEngine.
|
|
17
|
+
*
|
|
18
|
+
* @param argsPattern An optional raw regex string for arguments.
|
|
19
|
+
* @param commandPrefix An optional command prefix (or list of prefixes) to allow.
|
|
20
|
+
* @param commandRegex An optional command regex string to allow.
|
|
21
|
+
* @returns An array of string patterns (or undefined) for the PolicyEngine.
|
|
22
|
+
*/
|
|
23
|
+
export function buildArgsPatterns(argsPattern, commandPrefix, commandRegex) {
|
|
24
|
+
if (commandPrefix) {
|
|
25
|
+
const prefixes = Array.isArray(commandPrefix)
|
|
26
|
+
? commandPrefix
|
|
27
|
+
: [commandPrefix];
|
|
28
|
+
// Expand command prefixes to multiple patterns.
|
|
29
|
+
// We append [\\s"] to ensure we match whole words only (e.g., "git" but not
|
|
30
|
+
// "github"). Since we match against JSON stringified args, the value is
|
|
31
|
+
// always followed by a space or a closing quote.
|
|
32
|
+
return prefixes.map((prefix) => {
|
|
33
|
+
const jsonPrefix = JSON.stringify(prefix).slice(1, -1);
|
|
34
|
+
return `"command":"${escapeRegex(jsonPrefix)}(?:[\\s"]|$)`;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (commandRegex) {
|
|
38
|
+
return [`"command":"${commandRegex}`];
|
|
39
|
+
}
|
|
40
|
+
return [argsPattern];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/policy/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAoB,EACpB,aAAiC,EACjC,YAAqB;IAErB,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAC3C,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAEpB,gDAAgD;QAChD,4EAA4E;QAC5E,wEAAwE;QACxE,iDAAiD;QACjD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,cAAc,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,cAAc,YAAY,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,WAAW,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { escapeRegex, buildArgsPatterns } from './utils.js';
|
|
8
|
+
describe('policy/utils', () => {
|
|
9
|
+
describe('escapeRegex', () => {
|
|
10
|
+
it('should escape special regex characters', () => {
|
|
11
|
+
const input = '.-*+?^${}()|[]\\ "';
|
|
12
|
+
const escaped = escapeRegex(input);
|
|
13
|
+
expect(escaped).toBe('\\.\\-\\*\\+\\?\\^\\$\\{\\}\\(\\)\\|\\[\\]\\\\\\ \\"');
|
|
14
|
+
});
|
|
15
|
+
it('should return the same string if no special characters are present', () => {
|
|
16
|
+
const input = 'abcABC123';
|
|
17
|
+
expect(escapeRegex(input)).toBe(input);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('buildArgsPatterns', () => {
|
|
21
|
+
it('should return argsPattern if provided and no commandPrefix/regex', () => {
|
|
22
|
+
const result = buildArgsPatterns('my-pattern', undefined, undefined);
|
|
23
|
+
expect(result).toEqual(['my-pattern']);
|
|
24
|
+
});
|
|
25
|
+
it('should build pattern from a single commandPrefix', () => {
|
|
26
|
+
const result = buildArgsPatterns(undefined, 'ls', undefined);
|
|
27
|
+
expect(result).toEqual(['"command":"ls(?:[\\s"]|$)']);
|
|
28
|
+
});
|
|
29
|
+
it('should build patterns from an array of commandPrefixes', () => {
|
|
30
|
+
const result = buildArgsPatterns(undefined, ['ls', 'cd'], undefined);
|
|
31
|
+
expect(result).toEqual([
|
|
32
|
+
'"command":"ls(?:[\\s"]|$)',
|
|
33
|
+
'"command":"cd(?:[\\s"]|$)',
|
|
34
|
+
]);
|
|
35
|
+
});
|
|
36
|
+
it('should build pattern from commandRegex', () => {
|
|
37
|
+
const result = buildArgsPatterns(undefined, undefined, 'rm -rf .*');
|
|
38
|
+
expect(result).toEqual(['"command":"rm -rf .*']);
|
|
39
|
+
});
|
|
40
|
+
it('should prioritize commandPrefix over commandRegex and argsPattern', () => {
|
|
41
|
+
const result = buildArgsPatterns('raw', 'prefix', 'regex');
|
|
42
|
+
expect(result).toEqual(['"command":"prefix(?:[\\s"]|$)']);
|
|
43
|
+
});
|
|
44
|
+
it('should prioritize commandRegex over argsPattern if no commandPrefix', () => {
|
|
45
|
+
const result = buildArgsPatterns('raw', undefined, 'regex');
|
|
46
|
+
expect(result).toEqual(['"command":"regex']);
|
|
47
|
+
});
|
|
48
|
+
it('should escape characters in commandPrefix', () => {
|
|
49
|
+
const result = buildArgsPatterns(undefined, 'git checkout -b', undefined);
|
|
50
|
+
expect(result).toEqual(['"command":"git\\ checkout\\ \\-b(?:[\\s"]|$)']);
|
|
51
|
+
});
|
|
52
|
+
it('should correctly escape quotes in commandPrefix', () => {
|
|
53
|
+
const result = buildArgsPatterns(undefined, 'git "fix"', undefined);
|
|
54
|
+
expect(result).toEqual([
|
|
55
|
+
'"command":"git\\ \\\\\\"fix\\\\\\"(?:[\\s"]|$)',
|
|
56
|
+
]);
|
|
57
|
+
});
|
|
58
|
+
it('should handle undefined correctly when no inputs are provided', () => {
|
|
59
|
+
const result = buildArgsPatterns(undefined, undefined, undefined);
|
|
60
|
+
expect(result).toEqual([undefined]);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../src/policy/utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Config, AnsiOutput } from '../index.js';
|
|
7
|
+
import type { CompletedToolCall, ToolCall } from './types.js';
|
|
8
|
+
export interface ToolExecutionContext {
|
|
9
|
+
call: ToolCall;
|
|
10
|
+
signal: AbortSignal;
|
|
11
|
+
outputUpdateHandler?: (callId: string, output: string | AnsiOutput) => void;
|
|
12
|
+
onUpdateToolCall: (updatedCall: ToolCall) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare class ToolExecutor {
|
|
15
|
+
private readonly config;
|
|
16
|
+
constructor(config: Config);
|
|
17
|
+
execute(context: ToolExecutionContext): Promise<CompletedToolCall>;
|
|
18
|
+
private createCancelledResult;
|
|
19
|
+
private createSuccessResult;
|
|
20
|
+
private createErrorResult;
|
|
21
|
+
private createErrorResponse;
|
|
22
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { ToolErrorType, ToolOutputTruncatedEvent, logToolOutputTruncated, runInDevTraceSpan, } from '../index.js';
|
|
7
|
+
import { SHELL_TOOL_NAME } from '../tools/tool-names.js';
|
|
8
|
+
import { ShellToolInvocation } from '../tools/shell.js';
|
|
9
|
+
import { executeToolWithHooks } from '../core/coreToolHookTriggers.js';
|
|
10
|
+
import { saveTruncatedContent } from '../utils/fileUtils.js';
|
|
11
|
+
import { convertToFunctionResponse } from '../utils/generateContentResponseUtilities.js';
|
|
12
|
+
export class ToolExecutor {
|
|
13
|
+
config;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
async execute(context) {
|
|
18
|
+
const { call, signal, outputUpdateHandler, onUpdateToolCall } = context;
|
|
19
|
+
const { request } = call;
|
|
20
|
+
const toolName = request.name;
|
|
21
|
+
const callId = request.callId;
|
|
22
|
+
if (!('tool' in call) || !call.tool || !('invocation' in call)) {
|
|
23
|
+
throw new Error(`Cannot execute tool call ${callId}: Tool or Invocation missing.`);
|
|
24
|
+
}
|
|
25
|
+
const { tool, invocation } = call;
|
|
26
|
+
// Setup live output handling
|
|
27
|
+
const liveOutputCallback = tool.canUpdateOutput && outputUpdateHandler
|
|
28
|
+
? (outputChunk) => {
|
|
29
|
+
outputUpdateHandler(callId, outputChunk);
|
|
30
|
+
}
|
|
31
|
+
: undefined;
|
|
32
|
+
const shellExecutionConfig = this.config.getShellExecutionConfig();
|
|
33
|
+
const hooksEnabled = this.config.getEnableHooks();
|
|
34
|
+
const messageBus = this.config.getMessageBus();
|
|
35
|
+
return runInDevTraceSpan({
|
|
36
|
+
name: tool.name,
|
|
37
|
+
attributes: { type: 'tool-call' },
|
|
38
|
+
}, async ({ metadata: spanMetadata }) => {
|
|
39
|
+
spanMetadata.input = { request };
|
|
40
|
+
try {
|
|
41
|
+
let promise;
|
|
42
|
+
if (invocation instanceof ShellToolInvocation) {
|
|
43
|
+
const setPidCallback = (pid) => {
|
|
44
|
+
const executingCall = {
|
|
45
|
+
...call,
|
|
46
|
+
status: 'executing',
|
|
47
|
+
tool,
|
|
48
|
+
invocation,
|
|
49
|
+
pid,
|
|
50
|
+
startTime: 'startTime' in call ? call.startTime : undefined,
|
|
51
|
+
};
|
|
52
|
+
onUpdateToolCall(executingCall);
|
|
53
|
+
};
|
|
54
|
+
promise = executeToolWithHooks(invocation, toolName, signal, messageBus, hooksEnabled, tool, liveOutputCallback, shellExecutionConfig, setPidCallback);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
promise = executeToolWithHooks(invocation, toolName, signal, messageBus, hooksEnabled, tool, liveOutputCallback, shellExecutionConfig);
|
|
58
|
+
}
|
|
59
|
+
const toolResult = await promise;
|
|
60
|
+
spanMetadata.output = toolResult;
|
|
61
|
+
if (signal.aborted) {
|
|
62
|
+
return this.createCancelledResult(call, 'User cancelled tool execution.');
|
|
63
|
+
}
|
|
64
|
+
else if (toolResult.error === undefined) {
|
|
65
|
+
return await this.createSuccessResult(call, toolResult);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
return this.createErrorResult(call, new Error(toolResult.error.message), toolResult.error.type);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (executionError) {
|
|
72
|
+
spanMetadata.error = executionError;
|
|
73
|
+
if (signal.aborted) {
|
|
74
|
+
return this.createCancelledResult(call, 'User cancelled tool execution.');
|
|
75
|
+
}
|
|
76
|
+
const error = executionError instanceof Error
|
|
77
|
+
? executionError
|
|
78
|
+
: new Error(String(executionError));
|
|
79
|
+
return this.createErrorResult(call, error, ToolErrorType.UNHANDLED_EXCEPTION);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
createCancelledResult(call, reason) {
|
|
84
|
+
const errorMessage = `[Operation Cancelled] ${reason}`;
|
|
85
|
+
const startTime = 'startTime' in call ? call.startTime : undefined;
|
|
86
|
+
if (!('tool' in call) || !('invocation' in call)) {
|
|
87
|
+
// This should effectively never happen in execution phase, but we handle
|
|
88
|
+
// it safely
|
|
89
|
+
throw new Error('Cancelled tool call missing tool/invocation references');
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
status: 'cancelled',
|
|
93
|
+
request: call.request,
|
|
94
|
+
response: {
|
|
95
|
+
callId: call.request.callId,
|
|
96
|
+
responseParts: [
|
|
97
|
+
{
|
|
98
|
+
functionResponse: {
|
|
99
|
+
id: call.request.callId,
|
|
100
|
+
name: call.request.name,
|
|
101
|
+
response: { error: errorMessage },
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
resultDisplay: undefined,
|
|
106
|
+
error: undefined,
|
|
107
|
+
errorType: undefined,
|
|
108
|
+
contentLength: errorMessage.length,
|
|
109
|
+
},
|
|
110
|
+
tool: call.tool,
|
|
111
|
+
invocation: call.invocation,
|
|
112
|
+
durationMs: startTime ? Date.now() - startTime : undefined,
|
|
113
|
+
outcome: call.outcome,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
async createSuccessResult(call, toolResult) {
|
|
117
|
+
let content = toolResult.llmContent;
|
|
118
|
+
let outputFile;
|
|
119
|
+
const toolName = call.request.name;
|
|
120
|
+
const callId = call.request.callId;
|
|
121
|
+
if (typeof content === 'string' &&
|
|
122
|
+
toolName === SHELL_TOOL_NAME &&
|
|
123
|
+
this.config.getEnableToolOutputTruncation() &&
|
|
124
|
+
this.config.getTruncateToolOutputThreshold() > 0 &&
|
|
125
|
+
this.config.getTruncateToolOutputLines() > 0) {
|
|
126
|
+
const originalContentLength = content.length;
|
|
127
|
+
const threshold = this.config.getTruncateToolOutputThreshold();
|
|
128
|
+
const lines = this.config.getTruncateToolOutputLines();
|
|
129
|
+
const truncatedResult = await saveTruncatedContent(content, callId, this.config.storage.getProjectTempDir(), threshold, lines);
|
|
130
|
+
content = truncatedResult.content;
|
|
131
|
+
outputFile = truncatedResult.outputFile;
|
|
132
|
+
if (outputFile) {
|
|
133
|
+
logToolOutputTruncated(this.config, new ToolOutputTruncatedEvent(call.request.prompt_id, {
|
|
134
|
+
toolName,
|
|
135
|
+
originalContentLength,
|
|
136
|
+
truncatedContentLength: content.length,
|
|
137
|
+
threshold,
|
|
138
|
+
lines,
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const response = convertToFunctionResponse(toolName, callId, content, this.config.getActiveModel());
|
|
143
|
+
const successResponse = {
|
|
144
|
+
callId,
|
|
145
|
+
responseParts: response,
|
|
146
|
+
resultDisplay: toolResult.returnDisplay,
|
|
147
|
+
error: undefined,
|
|
148
|
+
errorType: undefined,
|
|
149
|
+
outputFile,
|
|
150
|
+
contentLength: typeof content === 'string' ? content.length : undefined,
|
|
151
|
+
};
|
|
152
|
+
const startTime = 'startTime' in call ? call.startTime : undefined;
|
|
153
|
+
// Ensure we have tool and invocation
|
|
154
|
+
if (!('tool' in call) || !('invocation' in call)) {
|
|
155
|
+
throw new Error('Successful tool call missing tool or invocation');
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
status: 'success',
|
|
159
|
+
request: call.request,
|
|
160
|
+
tool: call.tool,
|
|
161
|
+
response: successResponse,
|
|
162
|
+
invocation: call.invocation,
|
|
163
|
+
durationMs: startTime ? Date.now() - startTime : undefined,
|
|
164
|
+
outcome: call.outcome,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
createErrorResult(call, error, errorType) {
|
|
168
|
+
const response = this.createErrorResponse(call.request, error, errorType);
|
|
169
|
+
const startTime = 'startTime' in call ? call.startTime : undefined;
|
|
170
|
+
return {
|
|
171
|
+
status: 'error',
|
|
172
|
+
request: call.request,
|
|
173
|
+
response,
|
|
174
|
+
tool: call.tool,
|
|
175
|
+
durationMs: startTime ? Date.now() - startTime : undefined,
|
|
176
|
+
outcome: call.outcome,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
createErrorResponse(request, error, errorType) {
|
|
180
|
+
return {
|
|
181
|
+
callId: request.callId,
|
|
182
|
+
error,
|
|
183
|
+
responseParts: [
|
|
184
|
+
{
|
|
185
|
+
functionResponse: {
|
|
186
|
+
id: request.callId,
|
|
187
|
+
name: request.name,
|
|
188
|
+
response: { error: error.message },
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
resultDisplay: error.message,
|
|
193
|
+
errorType,
|
|
194
|
+
contentLength: error.message.length,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=tool-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-executor.js","sourceRoot":"","sources":["../../../src/scheduler/tool-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
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 { ToolExecutor } from './tool-executor.js';
|
|
8
|
+
import { makeFakeConfig } from '../test-utils/config.js';
|
|
9
|
+
import { MockTool } from '../test-utils/mock-tool.js';
|
|
10
|
+
import { SHELL_TOOL_NAME } from '../tools/tool-names.js';
|
|
11
|
+
import * as fileUtils from '../utils/fileUtils.js';
|
|
12
|
+
import * as coreToolHookTriggers from '../core/coreToolHookTriggers.js';
|
|
13
|
+
import { ShellToolInvocation } from '../tools/shell.js';
|
|
14
|
+
import { createMockMessageBus } from '../test-utils/mock-message-bus.js';
|
|
15
|
+
// Mock file utils
|
|
16
|
+
vi.mock('../utils/fileUtils.js', () => ({
|
|
17
|
+
saveTruncatedContent: vi.fn(),
|
|
18
|
+
}));
|
|
19
|
+
// Mock executeToolWithHooks
|
|
20
|
+
vi.mock('../core/coreToolHookTriggers.js', () => ({
|
|
21
|
+
executeToolWithHooks: vi.fn(),
|
|
22
|
+
}));
|
|
23
|
+
describe('ToolExecutor', () => {
|
|
24
|
+
let config;
|
|
25
|
+
let executor;
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
// Use the standard fake config factory
|
|
28
|
+
config = makeFakeConfig();
|
|
29
|
+
executor = new ToolExecutor(config);
|
|
30
|
+
// Reset mocks
|
|
31
|
+
vi.resetAllMocks();
|
|
32
|
+
// Default mock implementation for saveTruncatedContent
|
|
33
|
+
vi.mocked(fileUtils.saveTruncatedContent).mockImplementation(async (_content, _callId, _tempDir, _threshold, _lines) => ({
|
|
34
|
+
content: 'TruncatedContent...',
|
|
35
|
+
outputFile: '/tmp/truncated_output.txt',
|
|
36
|
+
}));
|
|
37
|
+
});
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
vi.restoreAllMocks();
|
|
40
|
+
});
|
|
41
|
+
it('should execute a tool successfully', async () => {
|
|
42
|
+
const mockTool = new MockTool({
|
|
43
|
+
name: 'testTool',
|
|
44
|
+
execute: async () => ({
|
|
45
|
+
llmContent: 'Tool output',
|
|
46
|
+
returnDisplay: 'Tool output',
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
const invocation = mockTool.build({});
|
|
50
|
+
// Mock executeToolWithHooks to return success
|
|
51
|
+
vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockResolvedValue({
|
|
52
|
+
llmContent: 'Tool output',
|
|
53
|
+
returnDisplay: 'Tool output',
|
|
54
|
+
});
|
|
55
|
+
const scheduledCall = {
|
|
56
|
+
status: 'scheduled',
|
|
57
|
+
request: {
|
|
58
|
+
callId: 'call-1',
|
|
59
|
+
name: 'testTool',
|
|
60
|
+
args: {},
|
|
61
|
+
isClientInitiated: false,
|
|
62
|
+
prompt_id: 'prompt-1',
|
|
63
|
+
},
|
|
64
|
+
tool: mockTool,
|
|
65
|
+
invocation: invocation,
|
|
66
|
+
startTime: Date.now(),
|
|
67
|
+
};
|
|
68
|
+
const onUpdateToolCall = vi.fn();
|
|
69
|
+
const result = await executor.execute({
|
|
70
|
+
call: scheduledCall,
|
|
71
|
+
signal: new AbortController().signal,
|
|
72
|
+
onUpdateToolCall,
|
|
73
|
+
});
|
|
74
|
+
expect(result.status).toBe('success');
|
|
75
|
+
if (result.status === 'success') {
|
|
76
|
+
const response = result.response.responseParts[0]?.functionResponse
|
|
77
|
+
?.response;
|
|
78
|
+
expect(response).toEqual({ output: 'Tool output' });
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
it('should handle execution errors', async () => {
|
|
82
|
+
const mockTool = new MockTool({
|
|
83
|
+
name: 'failTool',
|
|
84
|
+
});
|
|
85
|
+
const invocation = mockTool.build({});
|
|
86
|
+
// Mock executeToolWithHooks to throw
|
|
87
|
+
vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockRejectedValue(new Error('Tool Failed'));
|
|
88
|
+
const scheduledCall = {
|
|
89
|
+
status: 'scheduled',
|
|
90
|
+
request: {
|
|
91
|
+
callId: 'call-2',
|
|
92
|
+
name: 'failTool',
|
|
93
|
+
args: {},
|
|
94
|
+
isClientInitiated: false,
|
|
95
|
+
prompt_id: 'prompt-2',
|
|
96
|
+
},
|
|
97
|
+
tool: mockTool,
|
|
98
|
+
invocation: invocation,
|
|
99
|
+
startTime: Date.now(),
|
|
100
|
+
};
|
|
101
|
+
const result = await executor.execute({
|
|
102
|
+
call: scheduledCall,
|
|
103
|
+
signal: new AbortController().signal,
|
|
104
|
+
onUpdateToolCall: vi.fn(),
|
|
105
|
+
});
|
|
106
|
+
expect(result.status).toBe('error');
|
|
107
|
+
if (result.status === 'error') {
|
|
108
|
+
expect(result.response.error?.message).toBe('Tool Failed');
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
it('should return cancelled result when signal is aborted', async () => {
|
|
112
|
+
const mockTool = new MockTool({
|
|
113
|
+
name: 'slowTool',
|
|
114
|
+
});
|
|
115
|
+
const invocation = mockTool.build({});
|
|
116
|
+
// Mock executeToolWithHooks to simulate slow execution or cancellation check
|
|
117
|
+
vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockImplementation(async () => {
|
|
118
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
119
|
+
return { llmContent: 'Done', returnDisplay: 'Done' };
|
|
120
|
+
});
|
|
121
|
+
const scheduledCall = {
|
|
122
|
+
status: 'scheduled',
|
|
123
|
+
request: {
|
|
124
|
+
callId: 'call-3',
|
|
125
|
+
name: 'slowTool',
|
|
126
|
+
args: {},
|
|
127
|
+
isClientInitiated: false,
|
|
128
|
+
prompt_id: 'prompt-3',
|
|
129
|
+
},
|
|
130
|
+
tool: mockTool,
|
|
131
|
+
invocation: invocation,
|
|
132
|
+
startTime: Date.now(),
|
|
133
|
+
};
|
|
134
|
+
const controller = new AbortController();
|
|
135
|
+
const promise = executor.execute({
|
|
136
|
+
call: scheduledCall,
|
|
137
|
+
signal: controller.signal,
|
|
138
|
+
onUpdateToolCall: vi.fn(),
|
|
139
|
+
});
|
|
140
|
+
controller.abort();
|
|
141
|
+
const result = await promise;
|
|
142
|
+
expect(result.status).toBe('cancelled');
|
|
143
|
+
});
|
|
144
|
+
it('should truncate large shell output', async () => {
|
|
145
|
+
// 1. Setup Config for Truncation
|
|
146
|
+
vi.spyOn(config, 'getEnableToolOutputTruncation').mockReturnValue(true);
|
|
147
|
+
vi.spyOn(config, 'getTruncateToolOutputThreshold').mockReturnValue(10);
|
|
148
|
+
vi.spyOn(config, 'getTruncateToolOutputLines').mockReturnValue(5);
|
|
149
|
+
const mockTool = new MockTool({ name: SHELL_TOOL_NAME });
|
|
150
|
+
const invocation = mockTool.build({});
|
|
151
|
+
const longOutput = 'This is a very long output that should be truncated.';
|
|
152
|
+
// 2. Mock execution returning long content
|
|
153
|
+
vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockResolvedValue({
|
|
154
|
+
llmContent: longOutput,
|
|
155
|
+
returnDisplay: longOutput,
|
|
156
|
+
});
|
|
157
|
+
const scheduledCall = {
|
|
158
|
+
status: 'scheduled',
|
|
159
|
+
request: {
|
|
160
|
+
callId: 'call-trunc',
|
|
161
|
+
name: SHELL_TOOL_NAME,
|
|
162
|
+
args: { command: 'echo long' },
|
|
163
|
+
isClientInitiated: false,
|
|
164
|
+
prompt_id: 'prompt-trunc',
|
|
165
|
+
},
|
|
166
|
+
tool: mockTool,
|
|
167
|
+
invocation: invocation,
|
|
168
|
+
startTime: Date.now(),
|
|
169
|
+
};
|
|
170
|
+
// 3. Execute
|
|
171
|
+
const result = await executor.execute({
|
|
172
|
+
call: scheduledCall,
|
|
173
|
+
signal: new AbortController().signal,
|
|
174
|
+
onUpdateToolCall: vi.fn(),
|
|
175
|
+
});
|
|
176
|
+
// 4. Verify Truncation Logic
|
|
177
|
+
expect(fileUtils.saveTruncatedContent).toHaveBeenCalledWith(longOutput, 'call-trunc', expect.any(String), // temp dir
|
|
178
|
+
10, // threshold
|
|
179
|
+
5);
|
|
180
|
+
expect(result.status).toBe('success');
|
|
181
|
+
if (result.status === 'success') {
|
|
182
|
+
const response = result.response.responseParts[0]?.functionResponse
|
|
183
|
+
?.response;
|
|
184
|
+
// The content should be the *truncated* version returned by the mock saveTruncatedContent
|
|
185
|
+
expect(response).toEqual({ output: 'TruncatedContent...' });
|
|
186
|
+
expect(result.response.outputFile).toBe('/tmp/truncated_output.txt');
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
it('should report PID updates for shell tools', async () => {
|
|
190
|
+
// 1. Setup ShellToolInvocation
|
|
191
|
+
const messageBus = createMockMessageBus();
|
|
192
|
+
const shellInvocation = new ShellToolInvocation(config, { command: 'sleep 10' }, messageBus);
|
|
193
|
+
// We need a dummy tool that matches the invocation just for structure
|
|
194
|
+
const mockTool = new MockTool({ name: SHELL_TOOL_NAME });
|
|
195
|
+
// 2. Mock executeToolWithHooks to trigger the PID callback
|
|
196
|
+
const testPid = 12345;
|
|
197
|
+
vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockImplementation(async (_inv, _name, _sig, _bus, _hooks, _tool, _liveCb, _shellCfg, setPidCallback) => {
|
|
198
|
+
// Simulate the shell tool reporting a PID
|
|
199
|
+
if (setPidCallback) {
|
|
200
|
+
setPidCallback(testPid);
|
|
201
|
+
}
|
|
202
|
+
return { llmContent: 'done', returnDisplay: 'done' };
|
|
203
|
+
});
|
|
204
|
+
const scheduledCall = {
|
|
205
|
+
status: 'scheduled',
|
|
206
|
+
request: {
|
|
207
|
+
callId: 'call-pid',
|
|
208
|
+
name: SHELL_TOOL_NAME,
|
|
209
|
+
args: { command: 'sleep 10' },
|
|
210
|
+
isClientInitiated: false,
|
|
211
|
+
prompt_id: 'prompt-pid',
|
|
212
|
+
},
|
|
213
|
+
tool: mockTool,
|
|
214
|
+
invocation: shellInvocation,
|
|
215
|
+
startTime: Date.now(),
|
|
216
|
+
};
|
|
217
|
+
const onUpdateToolCall = vi.fn();
|
|
218
|
+
// 3. Execute
|
|
219
|
+
await executor.execute({
|
|
220
|
+
call: scheduledCall,
|
|
221
|
+
signal: new AbortController().signal,
|
|
222
|
+
onUpdateToolCall,
|
|
223
|
+
});
|
|
224
|
+
// 4. Verify PID was reported
|
|
225
|
+
expect(onUpdateToolCall).toHaveBeenCalledWith(expect.objectContaining({
|
|
226
|
+
status: 'executing',
|
|
227
|
+
pid: testPid,
|
|
228
|
+
}));
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
//# sourceMappingURL=tool-executor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-executor.test.js","sourceRoot":"","sources":["../../../src/scheduler/tool-executor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Represents the definition of an Agent Skill.
|
|
8
|
+
*/
|
|
9
|
+
export interface SkillDefinition {
|
|
10
|
+
/** The unique name of the skill. */
|
|
11
|
+
name: string;
|
|
12
|
+
/** A concise description of what the skill does. */
|
|
13
|
+
description: string;
|
|
14
|
+
/** The absolute path to the skill's source file on disk. */
|
|
15
|
+
location: string;
|
|
16
|
+
/** The core logic/instructions of the skill. */
|
|
17
|
+
body: string;
|
|
18
|
+
/** Whether the skill is currently disabled. */
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Discovers and loads all skills in the provided directory.
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadSkillsFromDir(dir: string): Promise<SkillDefinition[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Loads a single skill from a SKILL.md file.
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadSkillFromFile(filePath: string): Promise<SkillDefinition | null>;
|