@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
|
@@ -8,7 +8,7 @@ import { PolicyDecision, getHookSource, ApprovalMode, } from './types.js';
|
|
|
8
8
|
import { stableStringify } from './stable-stringify.js';
|
|
9
9
|
import { debugLogger } from '../utils/debugLogger.js';
|
|
10
10
|
import { SafetyCheckDecision } from '../safety/protocol.js';
|
|
11
|
-
import { SHELL_TOOL_NAMES, initializeShellParsers, splitCommands, } from '../utils/shell-utils.js';
|
|
11
|
+
import { SHELL_TOOL_NAMES, initializeShellParsers, splitCommands, hasRedirection, } from '../utils/shell-utils.js';
|
|
12
12
|
function ruleMatches(rule, toolCall, stringifiedArgs, serverName, currentApprovalMode) {
|
|
13
13
|
// Check if rule applies to current approval mode
|
|
14
14
|
if (rule.modes && rule.modes.length > 0) {
|
|
@@ -96,6 +96,77 @@ export class PolicyEngine {
|
|
|
96
96
|
getApprovalMode() {
|
|
97
97
|
return this.approvalMode;
|
|
98
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if a shell command is allowed.
|
|
101
|
+
*/
|
|
102
|
+
async checkShellCommand(toolName, command, ruleDecision, serverName, dir_path, allowRedirection) {
|
|
103
|
+
if (!command) {
|
|
104
|
+
return this.applyNonInteractiveMode(ruleDecision);
|
|
105
|
+
}
|
|
106
|
+
await initializeShellParsers();
|
|
107
|
+
const subCommands = splitCommands(command);
|
|
108
|
+
if (subCommands.length === 0) {
|
|
109
|
+
debugLogger.debug(`[PolicyEngine.check] Command parsing failed for: ${command}. Falling back to ASK_USER.`);
|
|
110
|
+
return this.applyNonInteractiveMode(PolicyDecision.ASK_USER);
|
|
111
|
+
}
|
|
112
|
+
// If there are multiple parts, or if we just want to validate the single part against DENY rules
|
|
113
|
+
if (subCommands.length > 0) {
|
|
114
|
+
debugLogger.debug(`[PolicyEngine.check] Validating shell command: ${subCommands.length} parts`);
|
|
115
|
+
if (ruleDecision === PolicyDecision.DENY) {
|
|
116
|
+
return PolicyDecision.DENY;
|
|
117
|
+
}
|
|
118
|
+
// Start optimistically. If all parts are ALLOW, the whole is ALLOW.
|
|
119
|
+
// We will downgrade if any part is ASK_USER or DENY.
|
|
120
|
+
let aggregateDecision = PolicyDecision.ALLOW;
|
|
121
|
+
for (const subCmd of subCommands) {
|
|
122
|
+
// Prevent infinite recursion for the root command
|
|
123
|
+
if (subCmd === command) {
|
|
124
|
+
if (!allowRedirection && hasRedirection(subCmd)) {
|
|
125
|
+
debugLogger.debug(`[PolicyEngine.check] Downgrading ALLOW to ASK_USER for redirected command: ${subCmd}`);
|
|
126
|
+
// Redirection always downgrades ALLOW to ASK_USER
|
|
127
|
+
if (aggregateDecision === PolicyDecision.ALLOW) {
|
|
128
|
+
aggregateDecision = PolicyDecision.ASK_USER;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// If the command is atomic (cannot be split further) and didn't
|
|
133
|
+
// trigger infinite recursion checks, we must respect the decision
|
|
134
|
+
// of the rule that triggered this check. If the rule was ASK_USER
|
|
135
|
+
// (e.g. wildcard), we must downgrade.
|
|
136
|
+
if (ruleDecision === PolicyDecision.ASK_USER &&
|
|
137
|
+
aggregateDecision === PolicyDecision.ALLOW) {
|
|
138
|
+
aggregateDecision = PolicyDecision.ASK_USER;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const subResult = await this.check({ name: toolName, args: { command: subCmd, dir_path } }, serverName);
|
|
144
|
+
// subResult.decision is already filtered through applyNonInteractiveMode by this.check()
|
|
145
|
+
const subDecision = subResult.decision;
|
|
146
|
+
// If any part is DENIED, the whole command is DENIED
|
|
147
|
+
if (subDecision === PolicyDecision.DENY) {
|
|
148
|
+
return PolicyDecision.DENY;
|
|
149
|
+
}
|
|
150
|
+
// If any part requires ASK_USER, the whole command requires ASK_USER
|
|
151
|
+
if (subDecision === PolicyDecision.ASK_USER) {
|
|
152
|
+
if (aggregateDecision === PolicyDecision.ALLOW) {
|
|
153
|
+
aggregateDecision = PolicyDecision.ASK_USER;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Check for redirection in allowed sub-commands
|
|
157
|
+
if (subDecision === PolicyDecision.ALLOW &&
|
|
158
|
+
!allowRedirection &&
|
|
159
|
+
hasRedirection(subCmd)) {
|
|
160
|
+
debugLogger.debug(`[PolicyEngine.check] Downgrading ALLOW to ASK_USER for redirected command: ${subCmd}`);
|
|
161
|
+
if (aggregateDecision === PolicyDecision.ALLOW) {
|
|
162
|
+
aggregateDecision = PolicyDecision.ASK_USER;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return this.applyNonInteractiveMode(aggregateDecision);
|
|
167
|
+
}
|
|
168
|
+
return this.applyNonInteractiveMode(ruleDecision);
|
|
169
|
+
}
|
|
99
170
|
/**
|
|
100
171
|
* Check if a tool call is allowed based on the configured policies.
|
|
101
172
|
* Returns the decision and the matching rule (if any).
|
|
@@ -115,56 +186,9 @@ export class PolicyEngine {
|
|
|
115
186
|
for (const rule of this.rules) {
|
|
116
187
|
if (ruleMatches(rule, toolCall, stringifiedArgs, serverName, this.approvalMode)) {
|
|
117
188
|
debugLogger.debug(`[PolicyEngine.check] MATCHED rule: toolName=${rule.toolName}, decision=${rule.decision}, priority=${rule.priority}, argsPattern=${rule.argsPattern?.source || 'none'}`);
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
rule.decision === PolicyDecision.ALLOW) {
|
|
122
|
-
const command = toolCall.args?.command;
|
|
123
|
-
if (command) {
|
|
124
|
-
await initializeShellParsers();
|
|
125
|
-
const subCommands = splitCommands(command);
|
|
126
|
-
// If there are multiple sub-commands, we must verify EACH of them matches an ALLOW rule.
|
|
127
|
-
// If any sub-command results in DENY -> the whole thing is DENY.
|
|
128
|
-
// If any sub-command results in ASK_USER -> the whole thing is ASK_USER (unless one is DENY).
|
|
129
|
-
// Only if ALL sub-commands are ALLOW do we proceed with ALLOW.
|
|
130
|
-
if (subCommands.length === 0) {
|
|
131
|
-
// This case occurs if the command is non-empty but parsing fails.
|
|
132
|
-
// An ALLOW rule for a prefix might have matched, but since the rest of
|
|
133
|
-
// the command is un-parseable, it's unsafe to proceed.
|
|
134
|
-
// Fall back to a safe decision.
|
|
135
|
-
debugLogger.debug(`[PolicyEngine.check] Command parsing failed for: ${command}. Falling back to safe decision because implicit ALLOW is unsafe.`);
|
|
136
|
-
decision = this.applyNonInteractiveMode(PolicyDecision.ASK_USER);
|
|
137
|
-
}
|
|
138
|
-
else if (subCommands.length > 1) {
|
|
139
|
-
debugLogger.debug(`[PolicyEngine.check] Compound command detected: ${subCommands.length} parts`);
|
|
140
|
-
let aggregateDecision = PolicyDecision.ALLOW;
|
|
141
|
-
for (const subCmd of subCommands) {
|
|
142
|
-
// Recursively check each sub-command
|
|
143
|
-
const subCall = {
|
|
144
|
-
name: toolCall.name,
|
|
145
|
-
args: { command: subCmd },
|
|
146
|
-
};
|
|
147
|
-
const subResult = await this.check(subCall, serverName);
|
|
148
|
-
if (subResult.decision === PolicyDecision.DENY) {
|
|
149
|
-
aggregateDecision = PolicyDecision.DENY;
|
|
150
|
-
break; // Fail fast
|
|
151
|
-
}
|
|
152
|
-
else if (subResult.decision === PolicyDecision.ASK_USER) {
|
|
153
|
-
aggregateDecision = PolicyDecision.ASK_USER;
|
|
154
|
-
// efficient: we can only strictly downgrade from ALLOW to ASK_USER,
|
|
155
|
-
// but we must continue looking for DENY.
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
decision = aggregateDecision;
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
// Single command, rule match is valid
|
|
162
|
-
decision = this.applyNonInteractiveMode(rule.decision);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
decision = this.applyNonInteractiveMode(rule.decision);
|
|
167
|
-
}
|
|
189
|
+
if (toolCall.name && SHELL_TOOL_NAMES.includes(toolCall.name)) {
|
|
190
|
+
const args = toolCall.args;
|
|
191
|
+
decision = await this.checkShellCommand(toolCall.name, args?.command, rule.decision, serverName, args?.dir_path, rule.allowRedirection);
|
|
168
192
|
}
|
|
169
193
|
else {
|
|
170
194
|
decision = this.applyNonInteractiveMode(rule.decision);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-engine.js","sourceRoot":"","sources":["../../../src/policy/policy-engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"policy-engine.js","sourceRoot":"","sources":["../../../src/policy/policy-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,13 +3,37 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
6
|
+
import { describe, it, expect, beforeEach, beforeAll, vi } from 'vitest';
|
|
7
7
|
import { PolicyEngine } from './policy-engine.js';
|
|
8
8
|
import { PolicyDecision, InProcessCheckerType, ApprovalMode, } from './types.js';
|
|
9
9
|
import { SafetyCheckDecision } from '../safety/protocol.js';
|
|
10
|
+
import { initializeShellParsers } from '../utils/shell-utils.js';
|
|
11
|
+
import { buildArgsPatterns } from './utils.js';
|
|
12
|
+
// Mock shell-utils to ensure consistent behavior across platforms (especially Windows CI)
|
|
13
|
+
// We want to test PolicyEngine logic, not the shell parser's ability to parse commands
|
|
14
|
+
vi.mock('../utils/shell-utils.js', async (importOriginal) => {
|
|
15
|
+
const actual = await importOriginal();
|
|
16
|
+
return {
|
|
17
|
+
...actual,
|
|
18
|
+
initializeShellParsers: vi.fn().mockResolvedValue(undefined),
|
|
19
|
+
splitCommands: vi.fn().mockImplementation((command) => {
|
|
20
|
+
// Simple mock splitting logic for test cases
|
|
21
|
+
if (command.includes('&&')) {
|
|
22
|
+
return command.split('&&').map((c) => c.trim());
|
|
23
|
+
}
|
|
24
|
+
return [command];
|
|
25
|
+
}),
|
|
26
|
+
hasRedirection: vi.fn().mockImplementation((command) =>
|
|
27
|
+
// Simple mock: true if '>' is present, unless it looks like "-> arrow"
|
|
28
|
+
command.includes('>') && !command.includes('-> arrow')),
|
|
29
|
+
};
|
|
30
|
+
});
|
|
10
31
|
describe('PolicyEngine', () => {
|
|
11
32
|
let engine;
|
|
12
33
|
let mockCheckerRunner;
|
|
34
|
+
beforeAll(async () => {
|
|
35
|
+
await initializeShellParsers();
|
|
36
|
+
});
|
|
13
37
|
beforeEach(() => {
|
|
14
38
|
mockCheckerRunner = {
|
|
15
39
|
runChecker: vi.fn(),
|
|
@@ -308,6 +332,23 @@ describe('PolicyEngine', () => {
|
|
|
308
332
|
// Matches lowest priority rule (not shell)
|
|
309
333
|
expect((await engine.check({ name: 'edit' }, undefined)).decision).toBe(PolicyDecision.DENY);
|
|
310
334
|
});
|
|
335
|
+
it('should correctly match commands with quotes in commandPrefix', async () => {
|
|
336
|
+
const prefix = 'git commit -m "fix"';
|
|
337
|
+
const patterns = buildArgsPatterns(undefined, prefix);
|
|
338
|
+
const rules = [
|
|
339
|
+
{
|
|
340
|
+
toolName: 'run_shell_command',
|
|
341
|
+
argsPattern: new RegExp(patterns[0]),
|
|
342
|
+
decision: PolicyDecision.ALLOW,
|
|
343
|
+
},
|
|
344
|
+
];
|
|
345
|
+
engine = new PolicyEngine({ rules });
|
|
346
|
+
const result = await engine.check({
|
|
347
|
+
name: 'run_shell_command',
|
|
348
|
+
args: { command: 'git commit -m "fix"' },
|
|
349
|
+
}, undefined);
|
|
350
|
+
expect(result.decision).toBe(PolicyDecision.ALLOW);
|
|
351
|
+
});
|
|
311
352
|
it('should handle tools with no args', async () => {
|
|
312
353
|
const rules = [
|
|
313
354
|
{
|
|
@@ -592,6 +633,236 @@ describe('PolicyEngine', () => {
|
|
|
592
633
|
// Should fall back to regular object serialization when toJSON throws
|
|
593
634
|
expect((await engine.check({ name: 'test', args }, undefined)).decision).toBe(PolicyDecision.ALLOW);
|
|
594
635
|
});
|
|
636
|
+
it('should downgrade ALLOW to ASK_USER for redirected shell commands', async () => {
|
|
637
|
+
const rules = [
|
|
638
|
+
{
|
|
639
|
+
toolName: 'run_shell_command',
|
|
640
|
+
// Matches "echo" prefix
|
|
641
|
+
argsPattern: /"command":"echo/,
|
|
642
|
+
decision: PolicyDecision.ALLOW,
|
|
643
|
+
},
|
|
644
|
+
];
|
|
645
|
+
engine = new PolicyEngine({ rules });
|
|
646
|
+
// Safe command should be allowed
|
|
647
|
+
expect((await engine.check({ name: 'run_shell_command', args: { command: 'echo "hello"' } }, undefined)).decision).toBe(PolicyDecision.ALLOW);
|
|
648
|
+
// Redirected command should be downgraded to ASK_USER
|
|
649
|
+
expect((await engine.check({
|
|
650
|
+
name: 'run_shell_command',
|
|
651
|
+
args: { command: 'echo "hello" > file.txt' },
|
|
652
|
+
}, undefined)).decision).toBe(PolicyDecision.ASK_USER);
|
|
653
|
+
});
|
|
654
|
+
it('should allow redirected shell commands when allowRedirection is true', async () => {
|
|
655
|
+
const rules = [
|
|
656
|
+
{
|
|
657
|
+
toolName: 'run_shell_command',
|
|
658
|
+
// Matches "echo" prefix
|
|
659
|
+
argsPattern: /"command":"echo/,
|
|
660
|
+
decision: PolicyDecision.ALLOW,
|
|
661
|
+
allowRedirection: true,
|
|
662
|
+
},
|
|
663
|
+
];
|
|
664
|
+
engine = new PolicyEngine({ rules });
|
|
665
|
+
// Redirected command should stay ALLOW
|
|
666
|
+
expect((await engine.check({
|
|
667
|
+
name: 'run_shell_command',
|
|
668
|
+
args: { command: 'echo "hello" > file.txt' },
|
|
669
|
+
}, undefined)).decision).toBe(PolicyDecision.ALLOW);
|
|
670
|
+
});
|
|
671
|
+
it('should NOT downgrade ALLOW to ASK_USER for quoted redirection chars', async () => {
|
|
672
|
+
const rules = [
|
|
673
|
+
{
|
|
674
|
+
toolName: 'run_shell_command',
|
|
675
|
+
argsPattern: /"command":"echo/,
|
|
676
|
+
decision: PolicyDecision.ALLOW,
|
|
677
|
+
},
|
|
678
|
+
];
|
|
679
|
+
engine = new PolicyEngine({ rules });
|
|
680
|
+
// Should remain ALLOW because it's not a real redirection
|
|
681
|
+
expect((await engine.check({
|
|
682
|
+
name: 'run_shell_command',
|
|
683
|
+
args: { command: 'echo "-> arrow"' },
|
|
684
|
+
}, undefined)).decision).toBe(PolicyDecision.ALLOW);
|
|
685
|
+
});
|
|
686
|
+
it('should preserve dir_path during recursive shell command checks', async () => {
|
|
687
|
+
const rules = [
|
|
688
|
+
{
|
|
689
|
+
toolName: 'run_shell_command',
|
|
690
|
+
// Rule that only allows echo in a specific directory
|
|
691
|
+
// Note: stableStringify sorts keys alphabetically and has no spaces: {"command":"echo hello","dir_path":"/safe/path"}
|
|
692
|
+
argsPattern: /"command":"echo hello".*"dir_path":"\/safe\/path"/,
|
|
693
|
+
decision: PolicyDecision.ALLOW,
|
|
694
|
+
},
|
|
695
|
+
{
|
|
696
|
+
// Catch-all ALLOW for shell but with low priority
|
|
697
|
+
toolName: 'run_shell_command',
|
|
698
|
+
decision: PolicyDecision.ALLOW,
|
|
699
|
+
priority: -100,
|
|
700
|
+
},
|
|
701
|
+
];
|
|
702
|
+
engine = new PolicyEngine({ rules });
|
|
703
|
+
// Compound command. The decomposition will call check() for "echo hello"
|
|
704
|
+
// which should match our specific high-priority rule IF dir_path is preserved.
|
|
705
|
+
const result = await engine.check({
|
|
706
|
+
name: 'run_shell_command',
|
|
707
|
+
args: { command: 'echo hello && pwd', dir_path: '/safe/path' },
|
|
708
|
+
}, undefined);
|
|
709
|
+
expect(result.decision).toBe(PolicyDecision.ALLOW);
|
|
710
|
+
});
|
|
711
|
+
it('should upgrade ASK_USER to ALLOW if all sub-commands are allowed', async () => {
|
|
712
|
+
const rules = [
|
|
713
|
+
{
|
|
714
|
+
toolName: 'run_shell_command',
|
|
715
|
+
argsPattern: /"command":"git status/,
|
|
716
|
+
decision: PolicyDecision.ALLOW,
|
|
717
|
+
priority: 20,
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
toolName: 'run_shell_command',
|
|
721
|
+
argsPattern: /"command":"ls/,
|
|
722
|
+
decision: PolicyDecision.ALLOW,
|
|
723
|
+
priority: 20,
|
|
724
|
+
},
|
|
725
|
+
{
|
|
726
|
+
// Catch-all ASK_USER for shell
|
|
727
|
+
toolName: 'run_shell_command',
|
|
728
|
+
decision: PolicyDecision.ASK_USER,
|
|
729
|
+
priority: 10,
|
|
730
|
+
},
|
|
731
|
+
];
|
|
732
|
+
engine = new PolicyEngine({ rules });
|
|
733
|
+
// "git status && ls" matches the catch-all ASK_USER rule initially.
|
|
734
|
+
// But since both parts are explicitly ALLOWed, the result should be upgraded to ALLOW.
|
|
735
|
+
const result = await engine.check({
|
|
736
|
+
name: 'run_shell_command',
|
|
737
|
+
args: { command: 'git status && ls' },
|
|
738
|
+
}, undefined);
|
|
739
|
+
expect(result.decision).toBe(PolicyDecision.ALLOW);
|
|
740
|
+
});
|
|
741
|
+
it('should respect explicit DENY for compound commands even if parts are allowed', async () => {
|
|
742
|
+
const rules = [
|
|
743
|
+
{
|
|
744
|
+
// Explicitly DENY the compound command
|
|
745
|
+
toolName: 'run_shell_command',
|
|
746
|
+
argsPattern: /"command":"git status && ls"/,
|
|
747
|
+
decision: PolicyDecision.DENY,
|
|
748
|
+
priority: 30,
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
toolName: 'run_shell_command',
|
|
752
|
+
argsPattern: /"command":"git status/,
|
|
753
|
+
decision: PolicyDecision.ALLOW,
|
|
754
|
+
priority: 20,
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
toolName: 'run_shell_command',
|
|
758
|
+
argsPattern: /"command":"ls/,
|
|
759
|
+
decision: PolicyDecision.ALLOW,
|
|
760
|
+
priority: 20,
|
|
761
|
+
},
|
|
762
|
+
];
|
|
763
|
+
engine = new PolicyEngine({ rules });
|
|
764
|
+
const result = await engine.check({
|
|
765
|
+
name: 'run_shell_command',
|
|
766
|
+
args: { command: 'git status && ls' },
|
|
767
|
+
}, undefined);
|
|
768
|
+
expect(result.decision).toBe(PolicyDecision.DENY);
|
|
769
|
+
});
|
|
770
|
+
it('should propagate DENY from any sub-command', async () => {
|
|
771
|
+
const rules = [
|
|
772
|
+
{
|
|
773
|
+
toolName: 'run_shell_command',
|
|
774
|
+
argsPattern: /"command":"rm/,
|
|
775
|
+
decision: PolicyDecision.DENY,
|
|
776
|
+
priority: 20,
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
toolName: 'run_shell_command',
|
|
780
|
+
argsPattern: /"command":"echo/,
|
|
781
|
+
decision: PolicyDecision.ALLOW,
|
|
782
|
+
priority: 20,
|
|
783
|
+
},
|
|
784
|
+
{
|
|
785
|
+
toolName: 'run_shell_command',
|
|
786
|
+
decision: PolicyDecision.ASK_USER,
|
|
787
|
+
priority: 10,
|
|
788
|
+
},
|
|
789
|
+
];
|
|
790
|
+
engine = new PolicyEngine({ rules });
|
|
791
|
+
// "echo hello && rm -rf /" -> echo is ALLOW, rm is DENY -> Result DENY
|
|
792
|
+
const result = await engine.check({
|
|
793
|
+
name: 'run_shell_command',
|
|
794
|
+
args: { command: 'echo hello && rm -rf /' },
|
|
795
|
+
}, undefined);
|
|
796
|
+
expect(result.decision).toBe(PolicyDecision.DENY);
|
|
797
|
+
});
|
|
798
|
+
it('should DENY redirected shell commands in non-interactive mode', async () => {
|
|
799
|
+
const config = {
|
|
800
|
+
nonInteractive: true,
|
|
801
|
+
rules: [
|
|
802
|
+
{
|
|
803
|
+
toolName: 'run_shell_command',
|
|
804
|
+
decision: PolicyDecision.ALLOW,
|
|
805
|
+
},
|
|
806
|
+
],
|
|
807
|
+
};
|
|
808
|
+
engine = new PolicyEngine(config);
|
|
809
|
+
// Redirected command should be DENIED in non-interactive mode
|
|
810
|
+
// (Normally ASK_USER, but ASK_USER -> DENY in non-interactive)
|
|
811
|
+
expect((await engine.check({
|
|
812
|
+
name: 'run_shell_command',
|
|
813
|
+
args: { command: 'echo "hello" > file.txt' },
|
|
814
|
+
}, undefined)).decision).toBe(PolicyDecision.DENY);
|
|
815
|
+
});
|
|
816
|
+
it('should default to ASK_USER for atomic commands when matching a wildcard ASK_USER rule', async () => {
|
|
817
|
+
// Regression test: atomic commands were auto-allowing because of optimistic initialization
|
|
818
|
+
const rules = [
|
|
819
|
+
{
|
|
820
|
+
toolName: 'run_shell_command',
|
|
821
|
+
decision: PolicyDecision.ASK_USER,
|
|
822
|
+
},
|
|
823
|
+
];
|
|
824
|
+
engine = new PolicyEngine({ rules });
|
|
825
|
+
// Atomic command "whoami" matches the wildcard rule (ASK_USER).
|
|
826
|
+
// It should NOT be upgraded to ALLOW.
|
|
827
|
+
expect((await engine.check({
|
|
828
|
+
name: 'run_shell_command',
|
|
829
|
+
args: { command: 'whoami' },
|
|
830
|
+
}, undefined)).decision).toBe(PolicyDecision.ASK_USER);
|
|
831
|
+
});
|
|
832
|
+
it('should allow redirected shell commands in non-interactive mode if allowRedirection is true', async () => {
|
|
833
|
+
const config = {
|
|
834
|
+
nonInteractive: true,
|
|
835
|
+
rules: [
|
|
836
|
+
{
|
|
837
|
+
toolName: 'run_shell_command',
|
|
838
|
+
decision: PolicyDecision.ALLOW,
|
|
839
|
+
allowRedirection: true,
|
|
840
|
+
},
|
|
841
|
+
],
|
|
842
|
+
};
|
|
843
|
+
engine = new PolicyEngine(config);
|
|
844
|
+
// Redirected command should stay ALLOW even in non-interactive mode
|
|
845
|
+
expect((await engine.check({
|
|
846
|
+
name: 'run_shell_command',
|
|
847
|
+
args: { command: 'echo "hello" > file.txt' },
|
|
848
|
+
}, undefined)).decision).toBe(PolicyDecision.ALLOW);
|
|
849
|
+
});
|
|
850
|
+
it('should avoid infinite recursion for commands with substitution', async () => {
|
|
851
|
+
const rules = [
|
|
852
|
+
{
|
|
853
|
+
toolName: 'run_shell_command',
|
|
854
|
+
decision: PolicyDecision.ALLOW,
|
|
855
|
+
},
|
|
856
|
+
];
|
|
857
|
+
engine = new PolicyEngine({ rules });
|
|
858
|
+
// Command with substitution triggers splitCommands returning the same command as its first element.
|
|
859
|
+
// This verifies the fix for the infinite recursion bug.
|
|
860
|
+
const result = await engine.check({
|
|
861
|
+
name: 'run_shell_command',
|
|
862
|
+
args: { command: 'echo $(ls)' },
|
|
863
|
+
}, undefined);
|
|
864
|
+
expect(result.decision).toBe(PolicyDecision.ALLOW);
|
|
865
|
+
});
|
|
595
866
|
});
|
|
596
867
|
describe('safety checker integration', () => {
|
|
597
868
|
it('should call checker when rule allows and has safety_checker', async () => {
|