@google/gemini-cli-core 0.25.0-nightly.20260112.15891721a → 0.25.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/assets/monitoring-dashboard-logs.png +0 -0
- package/dist/docs/assets/monitoring-dashboard-metrics.png +0 -0
- package/dist/docs/assets/monitoring-dashboard-overview.png +0 -0
- package/dist/docs/cli/commands.md +3 -0
- package/dist/docs/cli/keyboard-shortcuts.md +34 -41
- package/dist/docs/cli/settings.md +12 -10
- package/dist/docs/cli/skills.md +35 -3
- package/dist/docs/cli/telemetry.md +20 -0
- package/dist/docs/core/memport.md +2 -0
- package/dist/docs/get-started/configuration.md +26 -2
- package/dist/docs/releases.md +1 -1
- package/dist/docs/tools/shell.md +1 -1
- package/dist/src/agents/a2aUtils.d.ts +3 -2
- package/dist/src/agents/a2aUtils.js +28 -26
- package/dist/src/agents/a2aUtils.js.map +1 -1
- package/dist/src/agents/a2aUtils.test.js +9 -9
- package/dist/src/agents/a2aUtils.test.js.map +1 -1
- package/dist/src/agents/agentLoader.js +7 -5
- package/dist/src/agents/agentLoader.js.map +1 -1
- package/dist/src/agents/agentLoader.test.js +27 -3
- package/dist/src/agents/agentLoader.test.js.map +1 -1
- package/dist/src/agents/cli-help-agent.js +15 -8
- package/dist/src/agents/cli-help-agent.js.map +1 -1
- package/dist/src/agents/codebase-investigator.js +10 -5
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/delegate-to-agent-tool.test.js +8 -2
- package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -1
- package/dist/src/agents/local-executor.js +7 -7
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +17 -11
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +8 -2
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/registry.d.ts +2 -0
- package/dist/src/agents/registry.js +75 -41
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +165 -7
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.js +6 -11
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +8 -2
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +3 -11
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/commands/memory.d.ts +11 -0
- package/dist/src/commands/memory.js +80 -0
- package/dist/src/commands/memory.js.map +1 -0
- package/dist/src/commands/memory.test.d.ts +6 -0
- package/dist/src/commands/memory.test.js +155 -0
- package/dist/src/commands/memory.test.js.map +1 -0
- package/dist/src/config/config.d.ts +24 -1
- package/dist/src/config/config.js +34 -11
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +21 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/client.js +2 -4
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +19 -61
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +27 -8
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +186 -1
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +17 -0
- package/dist/src/core/geminiChat.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 +3 -3
- package/dist/src/hooks/hookSystem.js +4 -2
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/policy/config.test.js +3 -2
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/policy-engine.js +80 -20
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +17 -0
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/shell-safety.test.js +371 -8
- package/dist/src/policy/shell-safety.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +4 -0
- package/dist/src/services/modelConfigService.d.ts +9 -3
- package/dist/src/services/modelConfigService.js +35 -23
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/skills/skillLoader.js +2 -2
- package/dist/src/skills/skillLoader.js.map +1 -1
- package/dist/src/skills/skillManager.d.ts +9 -0
- package/dist/src/skills/skillManager.js +22 -3
- package/dist/src/skills/skillManager.js.map +1 -1
- package/dist/src/skills/skillManager.test.js +47 -1
- package/dist/src/skills/skillManager.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +5 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +48 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +62 -2
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +8 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.js +1 -1
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +7 -0
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/tools/confirmation-policy.test.js +1 -0
- package/dist/src/tools/confirmation-policy.test.js.map +1 -1
- package/dist/src/tools/edit.js +10 -0
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +34 -0
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/write-file.js +2 -2
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +45 -6
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/editCorrector.d.ts +3 -3
- package/dist/src/utils/editCorrector.js +21 -5
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +20 -20
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/editor.d.ts +1 -0
- package/dist/src/utils/editor.js +7 -4
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/events.d.ts +17 -1
- package/dist/src/utils/events.js +7 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/retry.d.ts +1 -0
- package/dist/src/utils/retry.js +14 -2
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +11 -11
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.test.js +1 -1
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/dist/google-gemini-cli-core-0.25.0-nightly.20260107.59a18e710.tgz +0 -0
|
@@ -3,26 +3,98 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
6
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
7
|
+
// Mock shell-utils to avoid relying on tree-sitter WASM which is flaky in CI on Windows
|
|
8
|
+
vi.mock('../utils/shell-utils.js', async (importOriginal) => {
|
|
9
|
+
const actual = await importOriginal();
|
|
10
|
+
// Static map of test commands to their expected subcommands
|
|
11
|
+
// This mirrors what the real parser would output for these specific strings
|
|
12
|
+
const commandMap = {
|
|
13
|
+
'git log': ['git log'],
|
|
14
|
+
'git log --oneline': ['git log --oneline'],
|
|
15
|
+
'git logout': ['git logout'],
|
|
16
|
+
'git log && rm -rf /': ['git log', 'rm -rf /'],
|
|
17
|
+
'git log; rm -rf /': ['git log', 'rm -rf /'],
|
|
18
|
+
'git log || rm -rf /': ['git log', 'rm -rf /'],
|
|
19
|
+
'git log &&& rm -rf /': [], // Simulates parse failure
|
|
20
|
+
'echo $(rm -rf /)': ['echo $(rm -rf /)', 'rm -rf /'],
|
|
21
|
+
'echo $(git log)': ['echo $(git log)', 'git log'],
|
|
22
|
+
'echo `rm -rf /`': ['echo `rm -rf /`', 'rm -rf /'],
|
|
23
|
+
'diff <(git log) <(rm -rf /)': [
|
|
24
|
+
'diff <(git log) <(rm -rf /)',
|
|
25
|
+
'git log',
|
|
26
|
+
'rm -rf /',
|
|
27
|
+
],
|
|
28
|
+
'tee >(rm -rf /)': ['tee >(rm -rf /)', 'rm -rf /'],
|
|
29
|
+
'git log | rm -rf /': ['git log', 'rm -rf /'],
|
|
30
|
+
'git log --format=$(rm -rf /)': [
|
|
31
|
+
'git log --format=$(rm -rf /)',
|
|
32
|
+
'rm -rf /',
|
|
33
|
+
],
|
|
34
|
+
'git log && echo $(git log | rm -rf /)': [
|
|
35
|
+
'git log',
|
|
36
|
+
'echo $(git log | rm -rf /)',
|
|
37
|
+
'git log',
|
|
38
|
+
'rm -rf /',
|
|
39
|
+
],
|
|
40
|
+
'git log && echo $(git log)': ['git log', 'echo $(git log)', 'git log'],
|
|
41
|
+
'git log > /tmp/test': ['git log > /tmp/test'],
|
|
42
|
+
'git log @(Get-Process)': [], // Simulates parse failure (Bash parser vs PowerShell syntax)
|
|
43
|
+
'git commit -m "msg" && git push': ['git commit -m "msg"', 'git push'],
|
|
44
|
+
'git status && unknown_command': ['git status', 'unknown_command'],
|
|
45
|
+
'unknown_command_1 && another_unknown_command': [
|
|
46
|
+
'unknown_command_1',
|
|
47
|
+
'another_unknown_command',
|
|
48
|
+
],
|
|
49
|
+
'known_ask_command_1 && known_ask_command_2': [
|
|
50
|
+
'known_ask_command_1',
|
|
51
|
+
'known_ask_command_2',
|
|
52
|
+
],
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
...actual,
|
|
56
|
+
initializeShellParsers: vi.fn(),
|
|
57
|
+
splitCommands: (command) => {
|
|
58
|
+
if (Object.prototype.hasOwnProperty.call(commandMap, command)) {
|
|
59
|
+
return commandMap[command];
|
|
60
|
+
}
|
|
61
|
+
const known = commandMap[command];
|
|
62
|
+
if (known)
|
|
63
|
+
return known;
|
|
64
|
+
// Default fallback for unmatched simple cases in development, but explicit map is better
|
|
65
|
+
return [command];
|
|
66
|
+
},
|
|
67
|
+
hasRedirection: (command) =>
|
|
68
|
+
// Simple regex check sufficient for testing the policy engine's handling of the *result* of hasRedirection
|
|
69
|
+
/[><]/.test(command),
|
|
70
|
+
};
|
|
71
|
+
});
|
|
7
72
|
import { PolicyEngine } from './policy-engine.js';
|
|
8
73
|
import { PolicyDecision, ApprovalMode } from './types.js';
|
|
74
|
+
import { buildArgsPatterns } from './utils.js';
|
|
9
75
|
describe('Shell Safety Policy', () => {
|
|
10
76
|
let policyEngine;
|
|
11
|
-
|
|
12
|
-
|
|
77
|
+
// Helper to create a policy engine with a simple command prefix rule
|
|
78
|
+
function createPolicyEngineWithPrefix(prefix) {
|
|
79
|
+
const argsPatterns = buildArgsPatterns(undefined, prefix, undefined);
|
|
80
|
+
// Since buildArgsPatterns returns array of patterns (strings), we pick the first one
|
|
81
|
+
// and compile it.
|
|
82
|
+
const argsPattern = new RegExp(argsPatterns[0]);
|
|
83
|
+
return new PolicyEngine({
|
|
13
84
|
rules: [
|
|
14
85
|
{
|
|
15
86
|
toolName: 'run_shell_command',
|
|
16
|
-
|
|
17
|
-
// Regex: "command":"git log(?:[\s"]|$)
|
|
18
|
-
argsPattern: /"command":"git log(?:[\s"]|$)/,
|
|
87
|
+
argsPattern,
|
|
19
88
|
decision: PolicyDecision.ALLOW,
|
|
20
|
-
priority: 1.01,
|
|
89
|
+
priority: 1.01,
|
|
21
90
|
},
|
|
22
91
|
],
|
|
23
92
|
defaultDecision: PolicyDecision.ASK_USER,
|
|
24
93
|
approvalMode: ApprovalMode.DEFAULT,
|
|
25
94
|
});
|
|
95
|
+
}
|
|
96
|
+
beforeEach(() => {
|
|
97
|
+
policyEngine = createPolicyEngineWithPrefix('git log');
|
|
26
98
|
});
|
|
27
99
|
it('SHOULD match "git log" exactly', async () => {
|
|
28
100
|
const toolCall = {
|
|
@@ -61,15 +133,306 @@ describe('Shell Safety Policy', () => {
|
|
|
61
133
|
const result = await policyEngine.check(toolCall, undefined);
|
|
62
134
|
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
63
135
|
});
|
|
136
|
+
it('SHOULD NOT allow "git log; rm -rf /" (semicolon separator)', async () => {
|
|
137
|
+
const toolCall = {
|
|
138
|
+
name: 'run_shell_command',
|
|
139
|
+
args: { command: 'git log; rm -rf /' },
|
|
140
|
+
};
|
|
141
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
142
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
143
|
+
});
|
|
144
|
+
it('SHOULD NOT allow "git log || rm -rf /" (OR separator)', async () => {
|
|
145
|
+
const toolCall = {
|
|
146
|
+
name: 'run_shell_command',
|
|
147
|
+
args: { command: 'git log || rm -rf /' },
|
|
148
|
+
};
|
|
149
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
150
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
151
|
+
});
|
|
64
152
|
it('SHOULD NOT allow "git log &&& rm -rf /" when prefix is "git log" (parse failure)', async () => {
|
|
65
153
|
const toolCall = {
|
|
66
154
|
name: 'run_shell_command',
|
|
67
155
|
args: { command: 'git log &&& rm -rf /' },
|
|
68
156
|
};
|
|
69
157
|
// Desired behavior: Should fail safe (ASK_USER or DENY) because parsing failed.
|
|
70
|
-
// If we let it pass as "single command" that matches prefix, it's dangerous.
|
|
71
158
|
const result = await policyEngine.check(toolCall, undefined);
|
|
72
159
|
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
73
160
|
});
|
|
161
|
+
it('SHOULD NOT allow command substitution $(rm -rf /)', async () => {
|
|
162
|
+
const toolCall = {
|
|
163
|
+
name: 'run_shell_command',
|
|
164
|
+
args: { command: 'echo $(rm -rf /)' },
|
|
165
|
+
};
|
|
166
|
+
// `splitCommands` recursively finds nested commands (e.g., `rm` inside `echo $()`).
|
|
167
|
+
// The policy engine requires ALL extracted commands to be allowed.
|
|
168
|
+
// Since `rm` does not match the allowed prefix, this should result in ASK_USER.
|
|
169
|
+
const echoPolicy = createPolicyEngineWithPrefix('echo');
|
|
170
|
+
const result = await echoPolicy.check(toolCall, undefined);
|
|
171
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
172
|
+
});
|
|
173
|
+
it('SHOULD allow command substitution if inner command is ALSO allowed', async () => {
|
|
174
|
+
// Both `echo` and `git` allowed.
|
|
175
|
+
const argsPatternsEcho = buildArgsPatterns(undefined, 'echo', undefined);
|
|
176
|
+
const argsPatternsGit = buildArgsPatterns(undefined, 'git', undefined); // Allow all git
|
|
177
|
+
const policyEngineWithBoth = new PolicyEngine({
|
|
178
|
+
rules: [
|
|
179
|
+
{
|
|
180
|
+
toolName: 'run_shell_command',
|
|
181
|
+
argsPattern: new RegExp(argsPatternsEcho[0]),
|
|
182
|
+
decision: PolicyDecision.ALLOW,
|
|
183
|
+
priority: 2,
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
toolName: 'run_shell_command',
|
|
187
|
+
argsPattern: new RegExp(argsPatternsGit[0]),
|
|
188
|
+
decision: PolicyDecision.ALLOW,
|
|
189
|
+
priority: 2,
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
defaultDecision: PolicyDecision.ASK_USER,
|
|
193
|
+
});
|
|
194
|
+
const toolCall = {
|
|
195
|
+
name: 'run_shell_command',
|
|
196
|
+
args: { command: 'echo $(git log)' },
|
|
197
|
+
};
|
|
198
|
+
const result = await policyEngineWithBoth.check(toolCall, undefined);
|
|
199
|
+
expect(result.decision).toBe(PolicyDecision.ALLOW);
|
|
200
|
+
});
|
|
201
|
+
it('SHOULD NOT allow command substitution with backticks `rm -rf /`', async () => {
|
|
202
|
+
const toolCall = {
|
|
203
|
+
name: 'run_shell_command',
|
|
204
|
+
args: { command: 'echo `rm -rf /`' },
|
|
205
|
+
};
|
|
206
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
207
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
208
|
+
});
|
|
209
|
+
it('SHOULD NOT allow process substitution <(rm -rf /)', async () => {
|
|
210
|
+
const toolCall = {
|
|
211
|
+
name: 'run_shell_command',
|
|
212
|
+
args: { command: 'diff <(git log) <(rm -rf /)' },
|
|
213
|
+
};
|
|
214
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
215
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
216
|
+
});
|
|
217
|
+
it('SHOULD NOT allow process substitution >(rm -rf /)', async () => {
|
|
218
|
+
// Note: >(...) is output substitution, but syntax is similar.
|
|
219
|
+
const toolCall = {
|
|
220
|
+
name: 'run_shell_command',
|
|
221
|
+
args: { command: 'tee >(rm -rf /)' },
|
|
222
|
+
};
|
|
223
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
224
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
225
|
+
});
|
|
226
|
+
it('SHOULD NOT allow piped commands "git log | rm -rf /"', async () => {
|
|
227
|
+
const toolCall = {
|
|
228
|
+
name: 'run_shell_command',
|
|
229
|
+
args: { command: 'git log | rm -rf /' },
|
|
230
|
+
};
|
|
231
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
232
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
233
|
+
});
|
|
234
|
+
it('SHOULD NOT allow argument injection via --arg=$(rm -rf /)', async () => {
|
|
235
|
+
const toolCall = {
|
|
236
|
+
name: 'run_shell_command',
|
|
237
|
+
args: { command: 'git log --format=$(rm -rf /)' },
|
|
238
|
+
};
|
|
239
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
240
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
241
|
+
});
|
|
242
|
+
it('SHOULD NOT allow complex nested commands "git log && echo $(git log | rm -rf /)"', async () => {
|
|
243
|
+
const toolCall = {
|
|
244
|
+
name: 'run_shell_command',
|
|
245
|
+
args: { command: 'git log && echo $(git log | rm -rf /)' },
|
|
246
|
+
};
|
|
247
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
248
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
249
|
+
});
|
|
250
|
+
it('SHOULD allow complex allowed commands "git log && echo $(git log)"', async () => {
|
|
251
|
+
// Both `echo` and `git` allowed.
|
|
252
|
+
const argsPatternsEcho = buildArgsPatterns(undefined, 'echo', undefined);
|
|
253
|
+
const argsPatternsGit = buildArgsPatterns(undefined, 'git', undefined);
|
|
254
|
+
const policyEngineWithBoth = new PolicyEngine({
|
|
255
|
+
rules: [
|
|
256
|
+
{
|
|
257
|
+
toolName: 'run_shell_command',
|
|
258
|
+
argsPattern: new RegExp(argsPatternsEcho[0]),
|
|
259
|
+
decision: PolicyDecision.ALLOW,
|
|
260
|
+
priority: 2,
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
toolName: 'run_shell_command',
|
|
264
|
+
// Matches "git" at start of *subcommand*
|
|
265
|
+
argsPattern: new RegExp(argsPatternsGit[0]),
|
|
266
|
+
decision: PolicyDecision.ALLOW,
|
|
267
|
+
priority: 2,
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
defaultDecision: PolicyDecision.ASK_USER,
|
|
271
|
+
});
|
|
272
|
+
const toolCall = {
|
|
273
|
+
name: 'run_shell_command',
|
|
274
|
+
args: { command: 'git log && echo $(git log)' },
|
|
275
|
+
};
|
|
276
|
+
const result = await policyEngineWithBoth.check(toolCall, undefined);
|
|
277
|
+
expect(result.decision).toBe(PolicyDecision.ALLOW);
|
|
278
|
+
});
|
|
279
|
+
it('SHOULD NOT allow generic redirection > /tmp/test', async () => {
|
|
280
|
+
// Current logic downgrades ALLOW to ASK_USER for redirections if redirection is not explicitly allowed.
|
|
281
|
+
const toolCall = {
|
|
282
|
+
name: 'run_shell_command',
|
|
283
|
+
args: { command: 'git log > /tmp/test' },
|
|
284
|
+
};
|
|
285
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
286
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
287
|
+
});
|
|
288
|
+
it('SHOULD allow generic redirection > /tmp/test if allowRedirection is true', async () => {
|
|
289
|
+
// If PolicyRule has allowRedirection: true, it should stay ALLOW
|
|
290
|
+
const argsPatternsGitLog = buildArgsPatterns(undefined, 'git log', undefined);
|
|
291
|
+
const policyWithRedirection = new PolicyEngine({
|
|
292
|
+
rules: [
|
|
293
|
+
{
|
|
294
|
+
toolName: 'run_shell_command',
|
|
295
|
+
argsPattern: new RegExp(argsPatternsGitLog[0]),
|
|
296
|
+
decision: PolicyDecision.ALLOW,
|
|
297
|
+
priority: 2,
|
|
298
|
+
allowRedirection: true,
|
|
299
|
+
},
|
|
300
|
+
],
|
|
301
|
+
defaultDecision: PolicyDecision.ASK_USER,
|
|
302
|
+
});
|
|
303
|
+
const toolCall = {
|
|
304
|
+
name: 'run_shell_command',
|
|
305
|
+
args: { command: 'git log > /tmp/test' },
|
|
306
|
+
};
|
|
307
|
+
const result = await policyWithRedirection.check(toolCall, undefined);
|
|
308
|
+
expect(result.decision).toBe(PolicyDecision.ALLOW);
|
|
309
|
+
});
|
|
310
|
+
it('SHOULD NOT allow PowerShell @(...) usage if it implies code execution', async () => {
|
|
311
|
+
// Bash parser fails on PowerShell syntax @(...) (returns empty subcommands).
|
|
312
|
+
// The policy engine correctly identifies this as unparseable and falls back to ASK_USER.
|
|
313
|
+
const toolCall = {
|
|
314
|
+
name: 'run_shell_command',
|
|
315
|
+
args: { command: 'git log @(Get-Process)' },
|
|
316
|
+
};
|
|
317
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
318
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
319
|
+
});
|
|
320
|
+
it('SHOULD match DENY rule even if nested/chained with unknown command', async () => {
|
|
321
|
+
// Scenario:
|
|
322
|
+
// git commit -m "..." (Unknown/No Rule -> ASK_USER)
|
|
323
|
+
// git push (DENY -> DENY)
|
|
324
|
+
// Overall should be DENY.
|
|
325
|
+
const argsPatternsPush = buildArgsPatterns(undefined, 'git push', undefined);
|
|
326
|
+
const denyPushPolicy = new PolicyEngine({
|
|
327
|
+
rules: [
|
|
328
|
+
{
|
|
329
|
+
toolName: 'run_shell_command',
|
|
330
|
+
argsPattern: new RegExp(argsPatternsPush[0]),
|
|
331
|
+
decision: PolicyDecision.DENY,
|
|
332
|
+
priority: 2,
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
defaultDecision: PolicyDecision.ASK_USER,
|
|
336
|
+
});
|
|
337
|
+
const toolCall = {
|
|
338
|
+
name: 'run_shell_command',
|
|
339
|
+
args: { command: 'git commit -m "msg" && git push' },
|
|
340
|
+
};
|
|
341
|
+
const result = await denyPushPolicy.check(toolCall, undefined);
|
|
342
|
+
expect(result.decision).toBe(PolicyDecision.DENY);
|
|
343
|
+
});
|
|
344
|
+
it('SHOULD aggregate ALLOW + ASK_USER to ASK_USER and blame the ASK_USER part', async () => {
|
|
345
|
+
// Scenario:
|
|
346
|
+
// `git status` (ALLOW) && `unknown_command` (ASK_USER by default)
|
|
347
|
+
// Expected: ASK_USER, and the matched rule should be related to the unknown_command
|
|
348
|
+
const argsPatternsGitStatus = buildArgsPatterns(undefined, 'git status', undefined);
|
|
349
|
+
const policyEngine = new PolicyEngine({
|
|
350
|
+
rules: [
|
|
351
|
+
{
|
|
352
|
+
toolName: 'run_shell_command',
|
|
353
|
+
argsPattern: new RegExp(argsPatternsGitStatus[0]),
|
|
354
|
+
decision: PolicyDecision.ALLOW,
|
|
355
|
+
priority: 2,
|
|
356
|
+
name: 'allow_git_status_rule', // Give a name to easily identify
|
|
357
|
+
},
|
|
358
|
+
],
|
|
359
|
+
defaultDecision: PolicyDecision.ASK_USER,
|
|
360
|
+
});
|
|
361
|
+
const toolCall = {
|
|
362
|
+
name: 'run_shell_command',
|
|
363
|
+
args: { command: 'git status && unknown_command' },
|
|
364
|
+
};
|
|
365
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
366
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
367
|
+
// Expect the matched rule to be null/undefined since it's the default decision for 'unknown_command'
|
|
368
|
+
// or the rule that led to the ASK_USER decision. In this case, it should be the rule for 'unknown_command', which is the default decision.
|
|
369
|
+
// The policy engine's `matchedRule` will be the rule that caused the final decision.
|
|
370
|
+
// If it's a default ASK_USER, then `result.rule` should be undefined.
|
|
371
|
+
expect(result.rule).toBeUndefined();
|
|
372
|
+
});
|
|
373
|
+
it('SHOULD aggregate ASK_USER (default) + ASK_USER (rule) to ASK_USER and blame the specific ASK_USER rule', async () => {
|
|
374
|
+
// Scenario:
|
|
375
|
+
// `unknown_command_1` (ASK_USER by default) && `another_unknown_command` (ASK_USER by explicit rule)
|
|
376
|
+
// Expected: ASK_USER, and the matched rule should be the explicit ASK_USER rule
|
|
377
|
+
const argsPatternsAnotherUnknown = buildArgsPatterns(undefined, 'another_unknown_command', undefined);
|
|
378
|
+
const policyEngine = new PolicyEngine({
|
|
379
|
+
rules: [
|
|
380
|
+
{
|
|
381
|
+
toolName: 'run_shell_command',
|
|
382
|
+
argsPattern: new RegExp(argsPatternsAnotherUnknown[0]),
|
|
383
|
+
decision: PolicyDecision.ASK_USER,
|
|
384
|
+
priority: 2,
|
|
385
|
+
name: 'ask_another_unknown_command_rule',
|
|
386
|
+
},
|
|
387
|
+
],
|
|
388
|
+
defaultDecision: PolicyDecision.ASK_USER,
|
|
389
|
+
});
|
|
390
|
+
const toolCall = {
|
|
391
|
+
name: 'run_shell_command',
|
|
392
|
+
args: { command: 'unknown_command_1 && another_unknown_command' },
|
|
393
|
+
};
|
|
394
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
395
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
396
|
+
// The first command triggers default ASK_USER (undefined rule).
|
|
397
|
+
// The second triggers explicit ASK_USER rule.
|
|
398
|
+
// We attribute to the first cause => undefined.
|
|
399
|
+
expect(result.rule).toBeUndefined();
|
|
400
|
+
});
|
|
401
|
+
it('SHOULD aggregate ASK_USER (rule) + ASK_USER (rule) to ASK_USER and blame the first specific ASK_USER rule in subcommands', async () => {
|
|
402
|
+
// Scenario:
|
|
403
|
+
// `known_ask_command_1` (ASK_USER by explicit rule 1) && `known_ask_command_2` (ASK_USER by explicit rule 2)
|
|
404
|
+
// Expected: ASK_USER, and the matched rule should be explicit ASK_USER rule 1.
|
|
405
|
+
// The current implementation prioritizes the rule that changes the decision to ASK_USER, if any.
|
|
406
|
+
// If multiple rules lead to ASK_USER, it takes the first one.
|
|
407
|
+
const argsPatternsAsk1 = buildArgsPatterns(undefined, 'known_ask_command_1', undefined);
|
|
408
|
+
const argsPatternsAsk2 = buildArgsPatterns(undefined, 'known_ask_command_2', undefined);
|
|
409
|
+
const policyEngine = new PolicyEngine({
|
|
410
|
+
rules: [
|
|
411
|
+
{
|
|
412
|
+
toolName: 'run_shell_command',
|
|
413
|
+
argsPattern: new RegExp(argsPatternsAsk1[0]),
|
|
414
|
+
decision: PolicyDecision.ASK_USER,
|
|
415
|
+
priority: 2,
|
|
416
|
+
name: 'ask_rule_1',
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
toolName: 'run_shell_command',
|
|
420
|
+
argsPattern: new RegExp(argsPatternsAsk2[0]),
|
|
421
|
+
decision: PolicyDecision.ASK_USER,
|
|
422
|
+
priority: 2,
|
|
423
|
+
name: 'ask_rule_2',
|
|
424
|
+
},
|
|
425
|
+
],
|
|
426
|
+
defaultDecision: PolicyDecision.ALLOW, // Set default to ALLOW to ensure rules are hit
|
|
427
|
+
});
|
|
428
|
+
const toolCall = {
|
|
429
|
+
name: 'run_shell_command',
|
|
430
|
+
args: { command: 'known_ask_command_1 && known_ask_command_2' },
|
|
431
|
+
};
|
|
432
|
+
const result = await policyEngine.check(toolCall, undefined);
|
|
433
|
+
expect(result.decision).toBe(PolicyDecision.ASK_USER);
|
|
434
|
+
// Expect the rule that first caused ASK_USER to be blamed
|
|
435
|
+
expect(result.rule?.name).toBe('ask_rule_1');
|
|
436
|
+
});
|
|
74
437
|
});
|
|
75
438
|
//# sourceMappingURL=shell-safety.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-safety.test.js","sourceRoot":"","sources":["../../../src/policy/shell-safety.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shell-safety.test.js","sourceRoot":"","sources":["../../../src/policy/shell-safety.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,10 @@ export interface InProcessCheckerConfig {
|
|
|
62
62
|
*/
|
|
63
63
|
export type SafetyCheckerConfig = ExternalCheckerConfig | InProcessCheckerConfig;
|
|
64
64
|
export interface PolicyRule {
|
|
65
|
+
/**
|
|
66
|
+
* A unique name for the policy rule, useful for identification and debugging.
|
|
67
|
+
*/
|
|
68
|
+
name?: string;
|
|
65
69
|
/**
|
|
66
70
|
* The name of the tool this rule applies to.
|
|
67
71
|
* If undefined, the rule applies to all tools.
|
|
@@ -74,7 +74,13 @@ export declare class ModelConfigService {
|
|
|
74
74
|
private findMatchingOverrides;
|
|
75
75
|
private sortOverrides;
|
|
76
76
|
getResolvedConfig(context: ModelConfigKey): ResolvedModelConfig;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
static isObject(item: unknown): item is Record<string, unknown>;
|
|
78
|
+
/**
|
|
79
|
+
* Merges an override `ModelConfig` into a base `ModelConfig`.
|
|
80
|
+
* The override's model name takes precedence if provided.
|
|
81
|
+
* The `generateContentConfig` properties are deeply merged.
|
|
82
|
+
*/
|
|
83
|
+
static merge(base: ModelConfig, override: ModelConfig): ModelConfig;
|
|
84
|
+
static deepMerge(config1: GenerateContentConfig | undefined, config2: GenerateContentConfig | undefined): GenerateContentConfig;
|
|
85
|
+
private static genericDeepMerge;
|
|
80
86
|
}
|
|
@@ -48,9 +48,7 @@ export class ModelConfigService {
|
|
|
48
48
|
...customAliases,
|
|
49
49
|
...this.runtimeAliases,
|
|
50
50
|
};
|
|
51
|
-
const { aliasChain, baseModel
|
|
52
|
-
let baseModel = initialBaseModel;
|
|
53
|
-
let resolvedConfig = initialResolvedConfig;
|
|
51
|
+
const { aliasChain, baseModel, resolvedConfig } = this.resolveAliasChain(context.model, allAliases);
|
|
54
52
|
const modelToLevel = this.buildModelLevelMap(aliasChain, baseModel);
|
|
55
53
|
const allOverrides = [
|
|
56
54
|
...overrides,
|
|
@@ -59,19 +57,19 @@ export class ModelConfigService {
|
|
|
59
57
|
];
|
|
60
58
|
const matches = this.findMatchingOverrides(allOverrides, context, modelToLevel);
|
|
61
59
|
this.sortOverrides(matches);
|
|
60
|
+
let currentConfig = {
|
|
61
|
+
model: baseModel,
|
|
62
|
+
generateContentConfig: resolvedConfig,
|
|
63
|
+
};
|
|
62
64
|
for (const match of matches) {
|
|
63
|
-
|
|
64
|
-
baseModel = match.modelConfig.model;
|
|
65
|
-
}
|
|
66
|
-
if (match.modelConfig.generateContentConfig) {
|
|
67
|
-
resolvedConfig = this.deepMerge(resolvedConfig, match.modelConfig.generateContentConfig);
|
|
68
|
-
}
|
|
65
|
+
currentConfig = ModelConfigService.merge(currentConfig, match.modelConfig);
|
|
69
66
|
}
|
|
70
|
-
return {
|
|
67
|
+
return {
|
|
68
|
+
model: currentConfig.model,
|
|
69
|
+
generateContentConfig: currentConfig.generateContentConfig ?? {},
|
|
70
|
+
};
|
|
71
71
|
}
|
|
72
72
|
resolveAliasChain(requestedModel, allAliases) {
|
|
73
|
-
let baseModel = undefined;
|
|
74
|
-
let resolvedConfig = {};
|
|
75
73
|
const aliasChain = [];
|
|
76
74
|
if (allAliases[requestedModel]) {
|
|
77
75
|
let current = requestedModel;
|
|
@@ -93,14 +91,16 @@ export class ModelConfigService {
|
|
|
93
91
|
}
|
|
94
92
|
// Root-to-Leaf chain for merging and level assignment.
|
|
95
93
|
const reversedChain = [...aliasChain].reverse();
|
|
94
|
+
let resolvedConfig = {};
|
|
96
95
|
for (const aliasName of reversedChain) {
|
|
97
96
|
const alias = allAliases[aliasName];
|
|
98
|
-
|
|
99
|
-
baseModel = alias.modelConfig.model;
|
|
100
|
-
}
|
|
101
|
-
resolvedConfig = this.deepMerge(resolvedConfig, alias.modelConfig.generateContentConfig);
|
|
97
|
+
resolvedConfig = ModelConfigService.merge(resolvedConfig, alias.modelConfig);
|
|
102
98
|
}
|
|
103
|
-
return {
|
|
99
|
+
return {
|
|
100
|
+
aliasChain: reversedChain,
|
|
101
|
+
baseModel: resolvedConfig.model,
|
|
102
|
+
resolvedConfig: resolvedConfig.generateContentConfig ?? {},
|
|
103
|
+
};
|
|
104
104
|
}
|
|
105
105
|
return {
|
|
106
106
|
aliasChain: [requestedModel],
|
|
@@ -170,13 +170,24 @@ export class ModelConfigService {
|
|
|
170
170
|
generateContentConfig: resolved.generateContentConfig,
|
|
171
171
|
};
|
|
172
172
|
}
|
|
173
|
-
isObject(item) {
|
|
173
|
+
static isObject(item) {
|
|
174
174
|
return !!item && typeof item === 'object' && !Array.isArray(item);
|
|
175
175
|
}
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Merges an override `ModelConfig` into a base `ModelConfig`.
|
|
178
|
+
* The override's model name takes precedence if provided.
|
|
179
|
+
* The `generateContentConfig` properties are deeply merged.
|
|
180
|
+
*/
|
|
181
|
+
static merge(base, override) {
|
|
182
|
+
return {
|
|
183
|
+
model: override.model ?? base.model,
|
|
184
|
+
generateContentConfig: ModelConfigService.deepMerge(base.generateContentConfig, override.generateContentConfig),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
static deepMerge(config1, config2) {
|
|
188
|
+
return ModelConfigService.genericDeepMerge(config1, config2);
|
|
178
189
|
}
|
|
179
|
-
genericDeepMerge(...objects) {
|
|
190
|
+
static genericDeepMerge(...objects) {
|
|
180
191
|
return objects.reduce((acc, obj) => {
|
|
181
192
|
if (!obj) {
|
|
182
193
|
return acc;
|
|
@@ -189,8 +200,9 @@ export class ModelConfigService {
|
|
|
189
200
|
// override the base array.
|
|
190
201
|
// TODO(joshualitt): Consider knobs here, i.e. opt-in to deep merging
|
|
191
202
|
// arrays on a case-by-case basis.
|
|
192
|
-
if (
|
|
193
|
-
|
|
203
|
+
if (ModelConfigService.isObject(accValue) &&
|
|
204
|
+
ModelConfigService.isObject(objValue)) {
|
|
205
|
+
acc[key] = ModelConfigService.genericDeepMerge(accValue, objValue);
|
|
194
206
|
}
|
|
195
207
|
else {
|
|
196
208
|
acc[key] = objValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelConfigService.js","sourceRoot":"","sources":["../../../src/services/modelConfigService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoDH,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAWlC,MAAM,OAAO,kBAAkB;IAKA;IAJZ,cAAc,GAAqC,EAAE,CAAC;IACtD,gBAAgB,GAA0B,EAAE,CAAC;IAE9D,gEAAgE;IAChE,YAA6B,MAAgC;QAAhC,WAAM,GAAN,MAAM,CAA0B;IAAG,CAAC;IAEjE,0BAA0B,CAAC,SAAiB,EAAE,KAAuB;QACnE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IACzC,CAAC;IAED,4BAA4B,CAAC,QAA6B;QACxD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACK,yBAAyB,CAAC,OAAuB;QAIvD,MAAM,EACJ,OAAO,GAAG,EAAE,EACZ,aAAa,GAAG,EAAE,EAClB,SAAS,GAAG,EAAE,EACd,eAAe,GAAG,EAAE,GACrB,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG;YACjB,GAAG,OAAO;YACV,GAAG,aAAa;YAChB,GAAG,IAAI,CAAC,cAAc;SACvB,CAAC;QAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"modelConfigService.js","sourceRoot":"","sources":["../../../src/services/modelConfigService.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { glob } from 'glob';
|
|
|
9
9
|
import yaml from 'js-yaml';
|
|
10
10
|
import { debugLogger } from '../utils/debugLogger.js';
|
|
11
11
|
import { coreEvents } from '../utils/events.js';
|
|
12
|
-
export const FRONTMATTER_REGEX = /^---\r?\n([\s\S]*?)\r?\n
|
|
12
|
+
export const FRONTMATTER_REGEX = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n([\s\S]*))?/;
|
|
13
13
|
/**
|
|
14
14
|
* Discovers and loads all skills in the provided directory.
|
|
15
15
|
*/
|
|
@@ -21,7 +21,7 @@ export async function loadSkillsFromDir(dir) {
|
|
|
21
21
|
if (!stats || !stats.isDirectory()) {
|
|
22
22
|
return [];
|
|
23
23
|
}
|
|
24
|
-
const skillFiles = await glob('*/SKILL.md', {
|
|
24
|
+
const skillFiles = await glob(['SKILL.md', '*/SKILL.md'], {
|
|
25
25
|
cwd: absoluteSearchPath,
|
|
26
26
|
absolute: true,
|
|
27
27
|
nodir: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillLoader.js","sourceRoot":"","sources":["../../../src/skills/skillLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAoBhD,MAAM,CAAC,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"skillLoader.js","sourceRoot":"","sources":["../../../src/skills/skillLoader.ts"],"names":[],"mappings":"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"}
|