@renxqoo/renx-code 0.0.4 → 0.0.6
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/README.md +82 -51
- package/bin/renx.cjs +16 -0
- package/package.json +2 -45
- package/src/agent/runtime/runtime.context-usage.test.ts +4 -5
- package/src/agent/runtime/runtime.error-handling.test.ts +4 -5
- package/src/agent/runtime/runtime.test.ts +7 -4
- package/src/agent/runtime/runtime.ts +3 -9
- package/src/agent/runtime/runtime.usage-forwarding.test.ts +4 -5
- package/src/agent/runtime/source-modules.test.ts +16 -35
- package/src/agent/runtime/source-modules.ts +17 -0
- package/vendor/agent-root/src/agent/ENTERPRISE_ACCEPTANCE_CHECKLIST.md +95 -0
- package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.html +1345 -0
- package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.md +1353 -0
- package/vendor/agent-root/src/agent/ERROR_CONTRACT.md +60 -0
- package/vendor/agent-root/src/agent/TEST_COVERAGE_ANALYSIS.md +278 -0
- package/vendor/agent-root/src/agent/__test__/error-contract.test.ts +72 -0
- package/vendor/agent-root/src/agent/__test__/types.test.ts +137 -0
- package/vendor/agent-root/src/agent/agent/__test__/abort-runtime.test.ts +83 -0
- package/vendor/agent-root/src/agent/agent/__test__/callback-safety.test.ts +34 -0
- package/vendor/agent-root/src/agent/agent/__test__/compaction.test.ts +323 -0
- package/vendor/agent-root/src/agent/agent/__test__/concurrency.test.ts +290 -0
- package/vendor/agent-root/src/agent/agent/__test__/error-normalizer.test.ts +377 -0
- package/vendor/agent-root/src/agent/agent/__test__/error.test.ts +212 -0
- package/vendor/agent-root/src/agent/agent/__test__/fault-injection.test.ts +295 -0
- package/vendor/agent-root/src/agent/agent/__test__/index.test.ts +3607 -0
- package/vendor/agent-root/src/agent/agent/__test__/logger.test.ts +35 -0
- package/vendor/agent-root/src/agent/agent/__test__/message-utils.test.ts +517 -0
- package/vendor/agent-root/src/agent/agent/__test__/telemetry.test.ts +97 -0
- package/vendor/agent-root/src/agent/agent/__test__/timeout-budget.test.ts +479 -0
- package/vendor/agent-root/src/agent/agent/__test__/tool-call-merge.test.ts +80 -0
- package/vendor/agent-root/src/agent/agent/__test__/tool-execution-ledger.test.ts +76 -0
- package/vendor/agent-root/src/agent/agent/__test__/write-buffer.test.ts +173 -0
- package/vendor/agent-root/src/agent/agent/__test__/write-file-session.test.ts +109 -0
- package/vendor/agent-root/src/agent/agent/abort-runtime.ts +71 -0
- package/vendor/agent-root/src/agent/agent/callback-safety.ts +33 -0
- package/vendor/agent-root/src/agent/agent/compaction.ts +291 -0
- package/vendor/agent-root/src/agent/agent/concurrency.ts +103 -0
- package/vendor/agent-root/src/agent/agent/error-normalizer.ts +190 -0
- package/vendor/agent-root/src/agent/agent/error.ts +198 -0
- package/vendor/agent-root/src/agent/agent/index.ts +1772 -0
- package/vendor/agent-root/src/agent/agent/logger.ts +65 -0
- package/vendor/agent-root/src/agent/agent/message-utils.ts +101 -0
- package/vendor/agent-root/src/agent/agent/stream-events.ts +61 -0
- package/vendor/agent-root/src/agent/agent/telemetry.ts +123 -0
- package/vendor/agent-root/src/agent/agent/timeout-budget.ts +227 -0
- package/vendor/agent-root/src/agent/agent/tool-call-merge.ts +111 -0
- package/vendor/agent-root/src/agent/agent/tool-execution-ledger.ts +164 -0
- package/vendor/agent-root/src/agent/agent/write-buffer.ts +188 -0
- package/vendor/agent-root/src/agent/agent/write-file-session.ts +238 -0
- package/vendor/agent-root/src/agent/app/__test__/agent-app-service.test.ts +1053 -0
- package/vendor/agent-root/src/agent/app/__test__/minimal-agent-application.test.ts +158 -0
- package/vendor/agent-root/src/agent/app/__test__/sqlite-agent-app-store.test.ts +437 -0
- package/vendor/agent-root/src/agent/app/agent-app-service.ts +748 -0
- package/vendor/agent-root/src/agent/app/contracts.ts +109 -0
- package/vendor/agent-root/src/agent/app/index.ts +5 -0
- package/vendor/agent-root/src/agent/app/minimal-agent-application.ts +151 -0
- package/vendor/agent-root/src/agent/app/ports.ts +72 -0
- package/vendor/agent-root/src/agent/app/sqlite-agent-app-store.ts +1182 -0
- package/vendor/agent-root/src/agent/app/sqlite-client.ts +177 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/00-README.md +36 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/01-scope-and-goals.md +33 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/02-architecture-overview.md +40 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/03-domain-model-and-contracts.md +91 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/04-ports-and-interfaces.md +116 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/05-run-orchestration-and-state-machine.md +52 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/06-cli-commands-and-ux.md +53 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/07-storage-design-local.md +52 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/08-error-and-observability.md +40 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/09-security-and-policy-boundary.md +19 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/10-test-plan-and-acceptance.md +28 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/11-implementation-phases.md +26 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/12-open-questions-and-risks.md +30 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/13-sqlite-schema-fields-and-rationale.md +567 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/14-project-flow-mermaid.md +583 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/15-openclaw-style-project-blueprint.md +972 -0
- package/vendor/agent-root/src/agent/error-contract.ts +154 -0
- package/vendor/agent-root/src/agent/prompts/system.ts +246 -0
- package/vendor/agent-root/src/agent/prompts/system1.ts +208 -0
- package/vendor/agent-root/src/agent/storage/__test__/file-history-store.test.ts +98 -0
- package/vendor/agent-root/src/agent/storage/file-history-store.ts +313 -0
- package/vendor/agent-root/src/agent/storage/file-storage-config.ts +94 -0
- package/vendor/agent-root/src/agent/storage/file-system.ts +31 -0
- package/vendor/agent-root/src/agent/storage/file-write-service.ts +21 -0
- package/vendor/agent-root/src/agent/tool/__test__/base-tool.test.ts +413 -0
- package/vendor/agent-root/src/agent/tool/__test__/bash-policy.test.ts +356 -0
- package/vendor/agent-root/src/agent/tool/__test__/bash.mocked-coverage.test.ts +375 -0
- package/vendor/agent-root/src/agent/tool/__test__/bash.test.ts +372 -0
- package/vendor/agent-root/src/agent/tool/__test__/error.test.ts +108 -0
- package/vendor/agent-root/src/agent/tool/__test__/file-edit-tool.test.ts +258 -0
- package/vendor/agent-root/src/agent/tool/__test__/file-history-tools.test.ts +121 -0
- package/vendor/agent-root/src/agent/tool/__test__/file-read-tool.test.ts +210 -0
- package/vendor/agent-root/src/agent/tool/__test__/glob.test.ts +139 -0
- package/vendor/agent-root/src/agent/tool/__test__/grep.mocked-coverage.test.ts +456 -0
- package/vendor/agent-root/src/agent/tool/__test__/grep.test.ts +192 -0
- package/vendor/agent-root/src/agent/tool/__test__/lsp.test.ts +300 -0
- package/vendor/agent-root/src/agent/tool/__test__/outside-workspace-confirmation.test.ts +214 -0
- package/vendor/agent-root/src/agent/tool/__test__/path-security.test.ts +336 -0
- package/vendor/agent-root/src/agent/tool/__test__/skill-loader.test.ts +494 -0
- package/vendor/agent-root/src/agent/tool/__test__/skill-parser.test.ts +543 -0
- package/vendor/agent-root/src/agent/tool/__test__/skill-tool.test.ts +172 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-concurrency-and-version.test.ts +116 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-create-get-list-update.test.ts +267 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-create.test.ts +519 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-errors.test.ts +225 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-output-blocking.test.ts +223 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-output.test.ts +184 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-parent-abort.test.ts +287 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-real-runner-adapter.test.ts +190 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-run-lifecycle.test.ts +352 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-store-runner-branches.test.ts +395 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-store.test.ts +391 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config-integration.test.ts +176 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config.test.ts +68 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-tools-core-edges.test.ts +630 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-tools-runtime-edges.test.ts +732 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-types.test.ts +494 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-utils-branches.test.ts +175 -0
- package/vendor/agent-root/src/agent/tool/__test__/tool-manager.test.ts +505 -0
- package/vendor/agent-root/src/agent/tool/__test__/types.test.ts +55 -0
- package/vendor/agent-root/src/agent/tool/__test__/web-fetch.test.ts +244 -0
- package/vendor/agent-root/src/agent/tool/__test__/web-search.test.ts +290 -0
- package/vendor/agent-root/src/agent/tool/__test__/write-file.test.ts +368 -0
- package/vendor/agent-root/src/agent/tool/base-tool.ts +345 -0
- package/vendor/agent-root/src/agent/tool/bash-policy.ts +636 -0
- package/vendor/agent-root/src/agent/tool/bash.ts +688 -0
- package/vendor/agent-root/src/agent/tool/error.ts +131 -0
- package/vendor/agent-root/src/agent/tool/file-edit-tool.ts +264 -0
- package/vendor/agent-root/src/agent/tool/file-history-list.ts +103 -0
- package/vendor/agent-root/src/agent/tool/file-history-restore.ts +149 -0
- package/vendor/agent-root/src/agent/tool/file-read-tool.ts +211 -0
- package/vendor/agent-root/src/agent/tool/glob.ts +171 -0
- package/vendor/agent-root/src/agent/tool/grep.ts +496 -0
- package/vendor/agent-root/src/agent/tool/lsp.ts +481 -0
- package/vendor/agent-root/src/agent/tool/path-security.ts +117 -0
- package/vendor/agent-root/src/agent/tool/search/common.ts +153 -0
- package/vendor/agent-root/src/agent/tool/skill/index.ts +13 -0
- package/vendor/agent-root/src/agent/tool/skill/loader.ts +229 -0
- package/vendor/agent-root/src/agent/tool/skill/parser.ts +124 -0
- package/vendor/agent-root/src/agent/tool/skill/types.ts +27 -0
- package/vendor/agent-root/src/agent/tool/skill-tool.ts +143 -0
- package/vendor/agent-root/src/agent/tool/task-create.ts +186 -0
- package/vendor/agent-root/src/agent/tool/task-errors.ts +42 -0
- package/vendor/agent-root/src/agent/tool/task-get.ts +116 -0
- package/vendor/agent-root/src/agent/tool/task-graph.ts +78 -0
- package/vendor/agent-root/src/agent/tool/task-list.ts +141 -0
- package/vendor/agent-root/src/agent/tool/task-mock-runner-adapter.ts +232 -0
- package/vendor/agent-root/src/agent/tool/task-output.ts +223 -0
- package/vendor/agent-root/src/agent/tool/task-parent-abort.ts +115 -0
- package/vendor/agent-root/src/agent/tool/task-real-runner-adapter.ts +336 -0
- package/vendor/agent-root/src/agent/tool/task-runner-adapter.ts +55 -0
- package/vendor/agent-root/src/agent/tool/task-stop.ts +187 -0
- package/vendor/agent-root/src/agent/tool/task-store.ts +217 -0
- package/vendor/agent-root/src/agent/tool/task-subagent-config.ts +149 -0
- package/vendor/agent-root/src/agent/tool/task-types.ts +264 -0
- package/vendor/agent-root/src/agent/tool/task-update.ts +315 -0
- package/vendor/agent-root/src/agent/tool/task.ts +209 -0
- package/vendor/agent-root/src/agent/tool/tool-manager.ts +362 -0
- package/vendor/agent-root/src/agent/tool/tool-prompts.ts +242 -0
- package/vendor/agent-root/src/agent/tool/types.ts +116 -0
- package/vendor/agent-root/src/agent/tool/web-fetch.ts +227 -0
- package/vendor/agent-root/src/agent/tool/web-search.ts +208 -0
- package/vendor/agent-root/src/agent/tool/write-file.ts +497 -0
- package/vendor/agent-root/src/agent/types.ts +232 -0
- package/vendor/agent-root/src/agent/utils/__tests__/index.test.ts +18 -0
- package/vendor/agent-root/src/agent/utils/__tests__/message-utils.test.ts +610 -0
- package/vendor/agent-root/src/agent/utils/__tests__/message.test.ts +223 -0
- package/vendor/agent-root/src/agent/utils/__tests__/token.test.ts +42 -0
- package/vendor/agent-root/src/agent/utils/index.ts +16 -0
- package/vendor/agent-root/src/agent/utils/message.ts +171 -0
- package/vendor/agent-root/src/agent/utils/token.ts +28 -0
- package/vendor/agent-root/src/config/__tests__/load-config-to-env.test.ts +129 -0
- package/vendor/agent-root/src/config/__tests__/loader.test.ts +247 -0
- package/vendor/agent-root/src/config/__tests__/runtime.test.ts +88 -0
- package/vendor/agent-root/src/config/index.ts +54 -0
- package/vendor/agent-root/src/config/loader.ts +431 -0
- package/vendor/agent-root/src/config/paths.ts +30 -0
- package/vendor/agent-root/src/config/runtime.ts +163 -0
- package/vendor/agent-root/src/config/types.ts +70 -0
- package/vendor/agent-root/src/logger/index.ts +57 -0
- package/vendor/agent-root/src/logger/logger.ts +819 -0
- package/vendor/agent-root/src/logger/types.ts +150 -0
- package/vendor/agent-root/src/providers/__tests__/errors.test.ts +441 -0
- package/vendor/agent-root/src/providers/__tests__/index.test.ts +16 -0
- package/vendor/agent-root/src/providers/__tests__/openai-compatible.options.test.ts +318 -0
- package/vendor/agent-root/src/providers/__tests__/openai-compatible.test.ts +600 -0
- package/vendor/agent-root/src/providers/__tests__/registry.test.ts +449 -0
- package/vendor/agent-root/src/providers/__tests__/responses-adapter.test.ts +298 -0
- package/vendor/agent-root/src/providers/adapters/__tests__/anthropic.test.ts +354 -0
- package/vendor/agent-root/src/providers/adapters/__tests__/kimi.test.ts +58 -0
- package/vendor/agent-root/src/providers/adapters/__tests__/standard.test.ts +261 -0
- package/vendor/agent-root/src/providers/adapters/anthropic.ts +572 -0
- package/vendor/agent-root/src/providers/adapters/base.ts +131 -0
- package/vendor/agent-root/src/providers/adapters/kimi.ts +48 -0
- package/vendor/agent-root/src/providers/adapters/responses.ts +732 -0
- package/vendor/agent-root/src/providers/adapters/standard.ts +120 -0
- package/vendor/agent-root/src/providers/http/__tests__/client.timeout.test.ts +313 -0
- package/vendor/agent-root/src/providers/http/client.ts +289 -0
- package/vendor/agent-root/src/providers/http/stream-parser.ts +109 -0
- package/vendor/agent-root/src/providers/index.ts +76 -0
- package/vendor/agent-root/src/providers/kimi-headers.ts +177 -0
- package/vendor/agent-root/src/providers/openai-compatible.ts +387 -0
- package/vendor/agent-root/src/providers/registry/model-config.ts +230 -0
- package/vendor/agent-root/src/providers/registry/provider-factory.ts +123 -0
- package/vendor/agent-root/src/providers/registry.ts +135 -0
- package/vendor/agent-root/src/providers/types/api.ts +284 -0
- package/vendor/agent-root/src/providers/types/config.ts +58 -0
- package/vendor/agent-root/src/providers/types/errors.ts +323 -0
- package/vendor/agent-root/src/providers/types/index.ts +72 -0
- package/vendor/agent-root/src/providers/types/provider.ts +45 -0
- package/vendor/agent-root/src/providers/types/registry.ts +88 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
evaluateBashPolicy,
|
|
4
|
+
extractSegmentCommands,
|
|
5
|
+
getBashDangerousCommands,
|
|
6
|
+
getBashDangerousPatterns,
|
|
7
|
+
} from '../bash-policy';
|
|
8
|
+
|
|
9
|
+
describe('extractSegmentCommands', () => {
|
|
10
|
+
it('extracts single command', () => {
|
|
11
|
+
const result = extractSegmentCommands('ls -la');
|
|
12
|
+
expect(result).toEqual(['ls']);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('extracts multiple commands with pipes', () => {
|
|
16
|
+
const result = extractSegmentCommands('ls -la | grep test');
|
|
17
|
+
expect(result).toEqual(['ls', 'grep']);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('extracts commands with semicolons', () => {
|
|
21
|
+
const result = extractSegmentCommands('ls; cd /tmp; pwd');
|
|
22
|
+
expect(result).toEqual(['ls', 'cd', 'pwd']);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('extracts commands with && and ||', () => {
|
|
26
|
+
const result = extractSegmentCommands('ls && cd /tmp || pwd');
|
|
27
|
+
expect(result).toEqual(['ls', 'cd', 'pwd']);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('handles commands with paths', () => {
|
|
31
|
+
const result = extractSegmentCommands('/usr/bin/ls -la');
|
|
32
|
+
// Commands are normalized to lowercase basename
|
|
33
|
+
expect(result).toEqual(['ls']);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('handles commands with environment variables', () => {
|
|
37
|
+
const result = extractSegmentCommands('VAR=value ls -la');
|
|
38
|
+
expect(result).toEqual(['ls']);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('handles empty command', () => {
|
|
42
|
+
const result = extractSegmentCommands('');
|
|
43
|
+
expect(result).toEqual([]);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('handles command with only whitespace', () => {
|
|
47
|
+
const result = extractSegmentCommands(' ');
|
|
48
|
+
expect(result).toEqual([]);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('handles complex command with subshells', () => {
|
|
52
|
+
const result = extractSegmentCommands('$(echo ls) -la');
|
|
53
|
+
// extractSegmentCommands extracts $ as a token
|
|
54
|
+
expect(result).toEqual(['$']);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('handles command with quotes', () => {
|
|
58
|
+
const result = extractSegmentCommands('echo "hello world"');
|
|
59
|
+
expect(result).toEqual(['echo']);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('getBashDangerousCommands', () => {
|
|
64
|
+
it('returns Set of dangerous commands', () => {
|
|
65
|
+
const commands = getBashDangerousCommands();
|
|
66
|
+
expect(commands).toBeInstanceOf(Set);
|
|
67
|
+
expect(commands.size).toBeGreaterThan(0);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('contains expected dangerous commands', () => {
|
|
71
|
+
const commands = getBashDangerousCommands();
|
|
72
|
+
// Commands are stored in lowercase
|
|
73
|
+
expect(commands.has('sudo')).toBe(true);
|
|
74
|
+
expect(commands.has('su')).toBe(true);
|
|
75
|
+
expect(commands.has('rm')).toBe(false); // rm is not in the dangerous commands set
|
|
76
|
+
expect(commands.has('mkfs')).toBe(true);
|
|
77
|
+
expect(commands.has('fdisk')).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('does not contain safe commands', () => {
|
|
81
|
+
const commands = getBashDangerousCommands();
|
|
82
|
+
expect(commands.has('ls')).toBe(false);
|
|
83
|
+
expect(commands.has('cat')).toBe(false);
|
|
84
|
+
expect(commands.has('echo')).toBe(false);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('includes platform-specific dangerous commands', () => {
|
|
88
|
+
const linuxCommands = getBashDangerousCommands('linux');
|
|
89
|
+
const darwinCommands = getBashDangerousCommands('darwin');
|
|
90
|
+
const win32Commands = getBashDangerousCommands('win32');
|
|
91
|
+
|
|
92
|
+
// All platforms should have common dangerous commands
|
|
93
|
+
expect(linuxCommands.has('sudo')).toBe(true);
|
|
94
|
+
expect(darwinCommands.has('sudo')).toBe(true);
|
|
95
|
+
expect(win32Commands.has('sudo')).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe('getBashDangerousPatterns', () => {
|
|
100
|
+
it('returns array of dangerous patterns', () => {
|
|
101
|
+
const patterns = getBashDangerousPatterns();
|
|
102
|
+
expect(Array.isArray(patterns)).toBe(true);
|
|
103
|
+
expect(patterns.length).toBeGreaterThan(0);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('each pattern has pattern and reason', () => {
|
|
107
|
+
const patterns = getBashDangerousPatterns();
|
|
108
|
+
patterns.forEach((p) => {
|
|
109
|
+
expect(p).toHaveProperty('pattern');
|
|
110
|
+
expect(p).toHaveProperty('reason');
|
|
111
|
+
expect(p.pattern).toBeInstanceOf(RegExp);
|
|
112
|
+
expect(typeof p.reason).toBe('string');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('includes rm -rf pattern', () => {
|
|
117
|
+
const patterns = getBashDangerousPatterns();
|
|
118
|
+
const rmPattern = patterns.find((p) => p.reason.toLowerCase().includes('deletion'));
|
|
119
|
+
expect(rmPattern).toBeDefined();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('includes fork bomb pattern', () => {
|
|
123
|
+
const patterns = getBashDangerousPatterns();
|
|
124
|
+
const forkBomb = patterns.find((p) => p.reason.toLowerCase().includes('fork'));
|
|
125
|
+
expect(forkBomb).toBeDefined();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('returns platform-specific patterns', () => {
|
|
129
|
+
const linuxPatterns = getBashDangerousPatterns('linux');
|
|
130
|
+
const darwinPatterns = getBashDangerousPatterns('darwin');
|
|
131
|
+
const win32Patterns = getBashDangerousPatterns('win32');
|
|
132
|
+
|
|
133
|
+
// All platforms should have common patterns
|
|
134
|
+
expect(linuxPatterns.length).toBeGreaterThan(0);
|
|
135
|
+
expect(darwinPatterns.length).toBeGreaterThan(0);
|
|
136
|
+
expect(win32Patterns.length).toBeGreaterThan(0);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe('evaluateBashPolicy', () => {
|
|
141
|
+
it('allows safe commands in permissive mode', () => {
|
|
142
|
+
const result = evaluateBashPolicy('ls -la', {
|
|
143
|
+
mode: 'permissive',
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
expect(result.effect).toBe('allow');
|
|
147
|
+
expect(result.commands).toEqual(['ls']);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('denies dangerous commands in permissive mode', () => {
|
|
151
|
+
const result = evaluateBashPolicy('sudo ls', {
|
|
152
|
+
mode: 'permissive',
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// In permissive mode, dangerous commands should still be denied
|
|
156
|
+
expect(result.effect).toBe('deny');
|
|
157
|
+
expect(result.reason).toContain('sudo');
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it('denies dangerous commands in guarded mode', () => {
|
|
161
|
+
const result = evaluateBashPolicy('sudo ls', {
|
|
162
|
+
mode: 'guarded',
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
expect(result.effect).toBe('deny');
|
|
166
|
+
expect(result.reason).toContain('sudo');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('allows safe commands in guarded mode', () => {
|
|
170
|
+
const result = evaluateBashPolicy('ls -la', {
|
|
171
|
+
mode: 'guarded',
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
expect(result.effect).toBe('allow');
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('handles multiple dangerous commands', () => {
|
|
178
|
+
const result = evaluateBashPolicy('sudo rm -rf /', {
|
|
179
|
+
mode: 'guarded',
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
expect(result.effect).toBe('deny');
|
|
183
|
+
// When a dangerous pattern is matched, commands array is empty
|
|
184
|
+
expect(result.commands).toEqual([]);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('handles commands with pipes', () => {
|
|
188
|
+
const result = evaluateBashPolicy('ls | grep test', {
|
|
189
|
+
mode: 'guarded',
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
expect(result.effect).toBe('allow');
|
|
193
|
+
expect(result.commands).toEqual(['ls', 'grep']);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it('handles empty command', () => {
|
|
197
|
+
const result = evaluateBashPolicy('', {
|
|
198
|
+
mode: 'guarded',
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
expect(result.effect).toBe('allow');
|
|
202
|
+
expect(result.commands).toEqual([]);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('handles command with only whitespace', () => {
|
|
206
|
+
const result = evaluateBashPolicy(' ', {
|
|
207
|
+
mode: 'guarded',
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
expect(result.effect).toBe('allow');
|
|
211
|
+
expect(result.commands).toEqual([]);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('uses allowlistMissEffect when provided', () => {
|
|
215
|
+
const result = evaluateBashPolicy('unknown-command', {
|
|
216
|
+
mode: 'guarded',
|
|
217
|
+
allowlistMissEffect: 'deny',
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
expect(result.effect).toBe('deny');
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('uses allowlistMissReason when provided', () => {
|
|
224
|
+
const result = evaluateBashPolicy('unknown-command', {
|
|
225
|
+
mode: 'guarded',
|
|
226
|
+
allowlistMissEffect: 'deny',
|
|
227
|
+
allowlistMissReason: (cmd) => `Command ${cmd} is not allowed`,
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
expect(result.reason).toContain('unknown-command');
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it('handles allowlistBypassed flag', () => {
|
|
234
|
+
const result = evaluateBashPolicy('sudo ls', {
|
|
235
|
+
mode: 'guarded',
|
|
236
|
+
allowlistBypassed: true,
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// When allowlist is bypassed, dangerous commands should still be denied
|
|
240
|
+
expect(result.effect).toBe('deny');
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
it('handles platform-specific commands', () => {
|
|
244
|
+
const result = evaluateBashPolicy('diskutil list', {
|
|
245
|
+
mode: 'guarded',
|
|
246
|
+
platform: 'darwin',
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
expect(result.effect).toBe('deny');
|
|
250
|
+
expect(result.reason).toContain('diskutil');
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it('handles Windows-specific commands', () => {
|
|
254
|
+
const result = evaluateBashPolicy('format C:', {
|
|
255
|
+
mode: 'guarded',
|
|
256
|
+
platform: 'win32',
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
expect(result.effect).toBe('deny');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
it('handles Linux-specific commands', () => {
|
|
263
|
+
const result = evaluateBashPolicy('systemctl start service', {
|
|
264
|
+
mode: 'guarded',
|
|
265
|
+
platform: 'linux',
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
expect(result.effect).toBe('deny');
|
|
269
|
+
expect(result.reason).toContain('systemctl');
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it('handles command with redirection', () => {
|
|
273
|
+
const result = evaluateBashPolicy('echo "test" > /etc/passwd', {
|
|
274
|
+
mode: 'guarded',
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
expect(result.effect).toBe('deny');
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it('handles command with background process', () => {
|
|
281
|
+
const result = evaluateBashPolicy('sleep 10 &', {
|
|
282
|
+
mode: 'guarded',
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
// sleep is not in the allowed commands list
|
|
286
|
+
expect(result.effect).toBe('deny');
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
it('handles command with command substitution', () => {
|
|
290
|
+
const result = evaluateBashPolicy('$(rm -rf /)', {
|
|
291
|
+
mode: 'guarded',
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
expect(result.effect).toBe('deny');
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it('handles command with variable assignment', () => {
|
|
298
|
+
const result = evaluateBashPolicy('VAR=value ls', {
|
|
299
|
+
mode: 'guarded',
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
expect(result.effect).toBe('allow');
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
it('handles command with multiple statements', () => {
|
|
306
|
+
const result = evaluateBashPolicy('ls; cd /tmp; pwd', {
|
|
307
|
+
mode: 'guarded',
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
expect(result.effect).toBe('allow');
|
|
311
|
+
expect(result.commands).toEqual(['ls', 'cd', 'pwd']);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it('handles command with conditional execution', () => {
|
|
315
|
+
const result = evaluateBashPolicy('ls && cd /tmp || pwd', {
|
|
316
|
+
mode: 'guarded',
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
expect(result.effect).toBe('allow');
|
|
320
|
+
expect(result.commands).toEqual(['ls', 'cd', 'pwd']);
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it('handles command with subshell', () => {
|
|
324
|
+
const result = evaluateBashPolicy('(ls -la)', {
|
|
325
|
+
mode: 'guarded',
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
expect(result.effect).toBe('allow');
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('handles command with function definition', () => {
|
|
332
|
+
const result = evaluateBashPolicy('function test() { ls; }', {
|
|
333
|
+
mode: 'guarded',
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
// function is not in the allowed commands list
|
|
337
|
+
expect(result.effect).toBe('deny');
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
it('handles command with here document', () => {
|
|
341
|
+
const result = evaluateBashPolicy('cat << EOF\nhello\nEOF', {
|
|
342
|
+
mode: 'guarded',
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
expect(result.effect).toBe('allow');
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it('handles command with process substitution', () => {
|
|
349
|
+
const result = evaluateBashPolicy('diff <(ls dir1) <(ls dir2)', {
|
|
350
|
+
mode: 'guarded',
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
// diff is not in the allowed commands list
|
|
354
|
+
expect(result.effect).toBe('deny');
|
|
355
|
+
});
|
|
356
|
+
});
|