@clawdstrike/openclaw 0.1.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/README.md +7 -0
- package/dist/audit/store.d.ts +26 -0
- package/dist/audit/store.d.ts.map +1 -0
- package/dist/audit/store.js +59 -0
- package/dist/audit/store.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +5 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +19 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +93 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/policy.d.ts +11 -0
- package/dist/cli/commands/policy.d.ts.map +1 -0
- package/dist/cli/commands/policy.js +101 -0
- package/dist/cli/commands/policy.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +91 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +88 -0
- package/dist/config.js.map +1 -0
- package/dist/e2e/openclaw-e2e.d.ts +2 -0
- package/dist/e2e/openclaw-e2e.d.ts.map +1 -0
- package/dist/e2e/openclaw-e2e.js +129 -0
- package/dist/e2e/openclaw-e2e.js.map +1 -0
- package/dist/guards/egress.d.ts +25 -0
- package/dist/guards/egress.d.ts.map +1 -0
- package/dist/guards/egress.js +146 -0
- package/dist/guards/egress.js.map +1 -0
- package/dist/guards/forbidden-path.d.ts +22 -0
- package/dist/guards/forbidden-path.d.ts.map +1 -0
- package/dist/guards/forbidden-path.js +132 -0
- package/dist/guards/forbidden-path.js.map +1 -0
- package/dist/guards/index.d.ts +12 -0
- package/dist/guards/index.d.ts.map +1 -0
- package/dist/guards/index.js +11 -0
- package/dist/guards/index.js.map +1 -0
- package/dist/guards/patch-integrity.d.ts +27 -0
- package/dist/guards/patch-integrity.d.ts.map +1 -0
- package/dist/guards/patch-integrity.js +219 -0
- package/dist/guards/patch-integrity.js.map +1 -0
- package/dist/guards/secret-leak.d.ts +31 -0
- package/dist/guards/secret-leak.d.ts.map +1 -0
- package/dist/guards/secret-leak.js +235 -0
- package/dist/guards/secret-leak.js.map +1 -0
- package/dist/guards/types.d.ts +46 -0
- package/dist/guards/types.d.ts.map +1 -0
- package/dist/guards/types.js +36 -0
- package/dist/guards/types.js.map +1 -0
- package/dist/hooks/agent-bootstrap/handler.d.ts +10 -0
- package/dist/hooks/agent-bootstrap/handler.d.ts.map +1 -0
- package/dist/hooks/agent-bootstrap/handler.js +35 -0
- package/dist/hooks/agent-bootstrap/handler.js.map +1 -0
- package/dist/hooks/audit-logger/handler.d.ts +16 -0
- package/dist/hooks/audit-logger/handler.d.ts.map +1 -0
- package/dist/hooks/audit-logger/handler.js +70 -0
- package/dist/hooks/audit-logger/handler.js.map +1 -0
- package/dist/hooks/tool-guard/handler.d.ts +16 -0
- package/dist/hooks/tool-guard/handler.d.ts.map +1 -0
- package/dist/hooks/tool-guard/handler.js +335 -0
- package/dist/hooks/tool-guard/handler.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +11 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +234 -0
- package/dist/plugin.js.map +1 -0
- package/dist/policy/engine.d.ts +31 -0
- package/dist/policy/engine.d.ts.map +1 -0
- package/dist/policy/engine.js +282 -0
- package/dist/policy/engine.js.map +1 -0
- package/dist/policy/index.d.ts +4 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +4 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/loader.d.ts +10 -0
- package/dist/policy/loader.d.ts.map +1 -0
- package/dist/policy/loader.js +262 -0
- package/dist/policy/loader.js.map +1 -0
- package/dist/policy/validator.d.ts +4 -0
- package/dist/policy/validator.d.ts.map +1 -0
- package/dist/policy/validator.js +409 -0
- package/dist/policy/validator.js.map +1 -0
- package/dist/sanitizer/output-sanitizer.d.ts +15 -0
- package/dist/sanitizer/output-sanitizer.d.ts.map +1 -0
- package/dist/sanitizer/output-sanitizer.js +47 -0
- package/dist/sanitizer/output-sanitizer.js.map +1 -0
- package/dist/security-prompt.d.ts +3 -0
- package/dist/security-prompt.d.ts.map +1 -0
- package/dist/security-prompt.js +70 -0
- package/dist/security-prompt.js.map +1 -0
- package/dist/tools/policy-check.d.ts +10 -0
- package/dist/tools/policy-check.d.ts.map +1 -0
- package/dist/tools/policy-check.js +141 -0
- package/dist/tools/policy-check.js.map +1 -0
- package/dist/types.d.ts +413 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +85 -0
- package/rulesets/ai-agent-minimal.yaml +42 -0
- package/rulesets/ai-agent.yaml +70 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { validatePolicy as validateCanonicalPolicy } from '@clawdstrike/policy';
|
|
2
|
+
export const POLICY_SCHEMA_VERSION = 'clawdstrike-v1.0';
|
|
3
|
+
const SUPPORTED_CANONICAL_VERSIONS = new Set(['1.1.0', '1.2.0']);
|
|
4
|
+
const VALID_EGRESS_MODES = new Set(['allowlist', 'denylist', 'open', 'deny_all']);
|
|
5
|
+
const VALID_VIOLATION_ACTIONS = new Set(['cancel', 'warn', 'isolate', 'escalate']);
|
|
6
|
+
const VALID_TIMEOUT_BEHAVIORS = new Set(['allow', 'deny', 'warn', 'defer']);
|
|
7
|
+
const VALID_EXECUTION_MODES = new Set(['parallel', 'sequential', 'background']);
|
|
8
|
+
const PLACEHOLDER_RE = /\$\{([^}]+)\}/g;
|
|
9
|
+
const RESERVED_PACKAGES = new Set([
|
|
10
|
+
'clawdstrike-virustotal',
|
|
11
|
+
'clawdstrike-safe-browsing',
|
|
12
|
+
'clawdstrike-snyk',
|
|
13
|
+
]);
|
|
14
|
+
const POLICY_KEYS = new Set([
|
|
15
|
+
'version',
|
|
16
|
+
'extends',
|
|
17
|
+
'egress',
|
|
18
|
+
'filesystem',
|
|
19
|
+
'execution',
|
|
20
|
+
'tools',
|
|
21
|
+
'limits',
|
|
22
|
+
'guards',
|
|
23
|
+
'on_violation',
|
|
24
|
+
]);
|
|
25
|
+
const EGRESS_KEYS = new Set(['mode', 'allowed_domains', 'allowed_cidrs', 'denied_domains']);
|
|
26
|
+
const FILESYSTEM_KEYS = new Set(['allowed_write_roots', 'allowed_read_paths', 'forbidden_paths']);
|
|
27
|
+
const EXECUTION_KEYS = new Set(['allowed_commands', 'denied_patterns']);
|
|
28
|
+
const TOOLS_KEYS = new Set(['allowed', 'denied']);
|
|
29
|
+
const LIMITS_KEYS = new Set(['max_execution_seconds', 'max_memory_mb', 'max_output_bytes']);
|
|
30
|
+
const GUARDS_KEYS = new Set(['forbidden_path', 'egress', 'secret_leak', 'patch_integrity', 'mcp_tool', 'custom']);
|
|
31
|
+
function isPlainObject(value) {
|
|
32
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
function ensureAllowedKeys(obj, field, allowed, errors) {
|
|
35
|
+
for (const key of Object.keys(obj)) {
|
|
36
|
+
if (!allowed.has(key)) {
|
|
37
|
+
errors.push(`${field} contains unknown field: ${key}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function ensureBoolean(value, field, errors) {
|
|
42
|
+
if (value === undefined)
|
|
43
|
+
return;
|
|
44
|
+
if (typeof value !== 'boolean') {
|
|
45
|
+
errors.push(`${field} must be a boolean`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function ensureStringArray(value, field, errors, warnings) {
|
|
49
|
+
if (value === undefined)
|
|
50
|
+
return undefined;
|
|
51
|
+
if (!Array.isArray(value)) {
|
|
52
|
+
errors.push(`${field} must be an array of strings`);
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const out = [];
|
|
56
|
+
for (let i = 0; i < value.length; i++) {
|
|
57
|
+
const item = value[i];
|
|
58
|
+
if (typeof item !== 'string') {
|
|
59
|
+
errors.push(`${field}[${i}] must be a string`);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (item.includes('\u0000')) {
|
|
63
|
+
errors.push(`${field}[${i}] contains a null byte`);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
out.push(item);
|
|
67
|
+
}
|
|
68
|
+
if (warnings && out.length === 0) {
|
|
69
|
+
warnings.push(`${field} is empty`);
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
function ensurePositiveNumber(value, field, errors) {
|
|
74
|
+
if (value === undefined)
|
|
75
|
+
return;
|
|
76
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
|
|
77
|
+
errors.push(`${field} must be a positive number`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function validatePolicy(policy) {
|
|
81
|
+
const errors = [];
|
|
82
|
+
const warnings = [];
|
|
83
|
+
if (!isPlainObject(policy)) {
|
|
84
|
+
return { valid: false, errors: ['Policy must be an object'], warnings: [] };
|
|
85
|
+
}
|
|
86
|
+
ensureAllowedKeys(policy, 'policy', POLICY_KEYS, errors);
|
|
87
|
+
const p = policy;
|
|
88
|
+
if (p.version === undefined) {
|
|
89
|
+
errors.push(`version is required (expected: ${POLICY_SCHEMA_VERSION})`);
|
|
90
|
+
}
|
|
91
|
+
else if (typeof p.version !== 'string') {
|
|
92
|
+
errors.push('version must be a string');
|
|
93
|
+
}
|
|
94
|
+
else if (SUPPORTED_CANONICAL_VERSIONS.has(p.version)) {
|
|
95
|
+
const canonical = validateCanonicalPolicy(policy);
|
|
96
|
+
return {
|
|
97
|
+
valid: canonical.valid,
|
|
98
|
+
errors: canonical.errors,
|
|
99
|
+
warnings: canonical.warnings,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
else if (p.version !== POLICY_SCHEMA_VERSION) {
|
|
103
|
+
errors.push(`unsupported policy version: ${p.version} (supported: ${POLICY_SCHEMA_VERSION}, 1.1.0, 1.2.0)`);
|
|
104
|
+
}
|
|
105
|
+
if (p.extends !== undefined && typeof p.extends !== 'string') {
|
|
106
|
+
errors.push('extends must be a string');
|
|
107
|
+
}
|
|
108
|
+
// Egress validation
|
|
109
|
+
if (p.egress !== undefined) {
|
|
110
|
+
if (!isPlainObject(p.egress)) {
|
|
111
|
+
errors.push('egress must be an object');
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
ensureAllowedKeys(p.egress, 'egress', EGRESS_KEYS, errors);
|
|
115
|
+
const mode = p.egress.mode;
|
|
116
|
+
if (mode !== undefined && (!VALID_EGRESS_MODES.has(mode) || typeof mode !== 'string')) {
|
|
117
|
+
errors.push(`egress.mode must be one of: ${[...VALID_EGRESS_MODES].join(', ')}`);
|
|
118
|
+
}
|
|
119
|
+
const allowed = ensureStringArray(p.egress.allowed_domains, 'egress.allowed_domains', errors);
|
|
120
|
+
if (mode === 'allowlist' && allowed && allowed.length === 0) {
|
|
121
|
+
warnings.push('egress.allowlist with empty allowed_domains will deny all egress');
|
|
122
|
+
}
|
|
123
|
+
ensureStringArray(p.egress.denied_domains, 'egress.denied_domains', errors);
|
|
124
|
+
ensureStringArray(p.egress.allowed_cidrs, 'egress.allowed_cidrs', errors);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Filesystem validation
|
|
128
|
+
if (p.filesystem !== undefined) {
|
|
129
|
+
if (!isPlainObject(p.filesystem)) {
|
|
130
|
+
errors.push('filesystem must be an object');
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
ensureAllowedKeys(p.filesystem, 'filesystem', FILESYSTEM_KEYS, errors);
|
|
134
|
+
ensureStringArray(p.filesystem.allowed_write_roots, 'filesystem.allowed_write_roots', errors);
|
|
135
|
+
ensureStringArray(p.filesystem.allowed_read_paths, 'filesystem.allowed_read_paths', errors);
|
|
136
|
+
ensureStringArray(p.filesystem.forbidden_paths, 'filesystem.forbidden_paths', errors, warnings);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Execution validation
|
|
140
|
+
if (p.execution !== undefined) {
|
|
141
|
+
if (!isPlainObject(p.execution)) {
|
|
142
|
+
errors.push('execution must be an object');
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
ensureAllowedKeys(p.execution, 'execution', EXECUTION_KEYS, errors);
|
|
146
|
+
ensureStringArray(p.execution.allowed_commands, 'execution.allowed_commands', errors);
|
|
147
|
+
const patterns = ensureStringArray(p.execution.denied_patterns, 'execution.denied_patterns', errors);
|
|
148
|
+
if (patterns) {
|
|
149
|
+
for (const pattern of patterns) {
|
|
150
|
+
try {
|
|
151
|
+
// eslint-disable-next-line no-new
|
|
152
|
+
new RegExp(pattern);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
errors.push(`execution.denied_patterns contains invalid regex: ${pattern}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Tool policy validation
|
|
162
|
+
if (p.tools !== undefined) {
|
|
163
|
+
if (!isPlainObject(p.tools)) {
|
|
164
|
+
errors.push('tools must be an object');
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
ensureAllowedKeys(p.tools, 'tools', TOOLS_KEYS, errors);
|
|
168
|
+
ensureStringArray(p.tools.allowed, 'tools.allowed', errors);
|
|
169
|
+
ensureStringArray(p.tools.denied, 'tools.denied', errors);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Limits validation
|
|
173
|
+
if (p.limits !== undefined) {
|
|
174
|
+
if (!isPlainObject(p.limits)) {
|
|
175
|
+
errors.push('limits must be an object');
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
ensureAllowedKeys(p.limits, 'limits', LIMITS_KEYS, errors);
|
|
179
|
+
ensurePositiveNumber(p.limits.max_execution_seconds, 'limits.max_execution_seconds', errors);
|
|
180
|
+
ensurePositiveNumber(p.limits.max_memory_mb, 'limits.max_memory_mb', errors);
|
|
181
|
+
ensurePositiveNumber(p.limits.max_output_bytes, 'limits.max_output_bytes', errors);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Guard toggles validation
|
|
185
|
+
if (p.guards !== undefined) {
|
|
186
|
+
if (!isPlainObject(p.guards)) {
|
|
187
|
+
errors.push('guards must be an object');
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
ensureAllowedKeys(p.guards, 'guards', GUARDS_KEYS, errors);
|
|
191
|
+
ensureBoolean(p.guards.forbidden_path, 'guards.forbidden_path', errors);
|
|
192
|
+
ensureBoolean(p.guards.egress, 'guards.egress', errors);
|
|
193
|
+
ensureBoolean(p.guards.secret_leak, 'guards.secret_leak', errors);
|
|
194
|
+
ensureBoolean(p.guards.patch_integrity, 'guards.patch_integrity', errors);
|
|
195
|
+
ensureBoolean(p.guards.mcp_tool, 'guards.mcp_tool', errors);
|
|
196
|
+
const custom = p.guards.custom;
|
|
197
|
+
if (custom !== undefined) {
|
|
198
|
+
if (!Array.isArray(custom)) {
|
|
199
|
+
errors.push('guards.custom must be an array');
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
for (let i = 0; i < custom.length; i++) {
|
|
203
|
+
validateCustomGuardSpec(custom[i], `guards.custom[${i}]`, errors);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Validate placeholders across the entire policy tree (fail closed on missing env).
|
|
210
|
+
validatePlaceholders(policy, 'policy', errors);
|
|
211
|
+
// on_violation validation
|
|
212
|
+
if (p.on_violation !== undefined) {
|
|
213
|
+
if (typeof p.on_violation !== 'string' || !VALID_VIOLATION_ACTIONS.has(p.on_violation)) {
|
|
214
|
+
errors.push(`on_violation must be one of: ${[...VALID_VIOLATION_ACTIONS].join(', ')}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
218
|
+
}
|
|
219
|
+
function validateCustomGuardSpec(value, base, errors) {
|
|
220
|
+
if (!isPlainObject(value)) {
|
|
221
|
+
errors.push(`${base} must be an object`);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const pkg = value.package;
|
|
225
|
+
if (typeof pkg !== 'string' || pkg.trim() === '') {
|
|
226
|
+
errors.push(`${base}.package must be a non-empty string`);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (!RESERVED_PACKAGES.has(pkg)) {
|
|
230
|
+
errors.push(`${base}.package unsupported custom guard package: ${pkg}`);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const enabled = value.enabled;
|
|
234
|
+
if (enabled !== undefined && typeof enabled !== 'boolean') {
|
|
235
|
+
errors.push(`${base}.enabled must be a boolean`);
|
|
236
|
+
}
|
|
237
|
+
const config = value.config;
|
|
238
|
+
if (config !== undefined && !isPlainObject(config)) {
|
|
239
|
+
errors.push(`${base}.config must be an object`);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const cfg = (isPlainObject(config) ? config : {});
|
|
243
|
+
if (pkg === 'clawdstrike-virustotal') {
|
|
244
|
+
requireString(cfg, `${base}.config.api_key`, errors);
|
|
245
|
+
}
|
|
246
|
+
else if (pkg === 'clawdstrike-safe-browsing') {
|
|
247
|
+
requireString(cfg, `${base}.config.api_key`, errors);
|
|
248
|
+
requireString(cfg, `${base}.config.client_id`, errors);
|
|
249
|
+
}
|
|
250
|
+
else if (pkg === 'clawdstrike-snyk') {
|
|
251
|
+
requireString(cfg, `${base}.config.api_token`, errors);
|
|
252
|
+
requireString(cfg, `${base}.config.org_id`, errors);
|
|
253
|
+
}
|
|
254
|
+
const asyncCfg = value.async;
|
|
255
|
+
if (asyncCfg !== undefined) {
|
|
256
|
+
validateAsyncConfig(asyncCfg, `${base}.async`, errors);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function validateAsyncConfig(value, base, errors) {
|
|
260
|
+
if (!isPlainObject(value)) {
|
|
261
|
+
errors.push(`${base} must be an object`);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const timeoutMs = value.timeout_ms;
|
|
265
|
+
if (timeoutMs !== undefined && (!isFiniteNumber(timeoutMs) || timeoutMs < 100 || timeoutMs > 300_000)) {
|
|
266
|
+
errors.push(`${base}.timeout_ms must be between 100 and 300000`);
|
|
267
|
+
}
|
|
268
|
+
const onTimeout = value.on_timeout;
|
|
269
|
+
if (onTimeout !== undefined && (typeof onTimeout !== 'string' || !VALID_TIMEOUT_BEHAVIORS.has(onTimeout))) {
|
|
270
|
+
errors.push(`${base}.on_timeout must be one of: ${[...VALID_TIMEOUT_BEHAVIORS].join(', ')}`);
|
|
271
|
+
}
|
|
272
|
+
const mode = value.execution_mode;
|
|
273
|
+
if (mode !== undefined && (typeof mode !== 'string' || !VALID_EXECUTION_MODES.has(mode))) {
|
|
274
|
+
errors.push(`${base}.execution_mode must be one of: ${[...VALID_EXECUTION_MODES].join(', ')}`);
|
|
275
|
+
}
|
|
276
|
+
if (value.rate_limit !== undefined) {
|
|
277
|
+
if (!isPlainObject(value.rate_limit)) {
|
|
278
|
+
errors.push(`${base}.rate_limit must be an object`);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
const rl = value.rate_limit;
|
|
282
|
+
const rps = rl.requests_per_second;
|
|
283
|
+
const rpm = rl.requests_per_minute;
|
|
284
|
+
if (rps !== undefined && (!isFiniteNumber(rps) || rps <= 0)) {
|
|
285
|
+
errors.push(`${base}.rate_limit.requests_per_second must be > 0`);
|
|
286
|
+
}
|
|
287
|
+
if (rpm !== undefined && (!isFiniteNumber(rpm) || rpm <= 0)) {
|
|
288
|
+
errors.push(`${base}.rate_limit.requests_per_minute must be > 0`);
|
|
289
|
+
}
|
|
290
|
+
if (rps !== undefined && rpm !== undefined) {
|
|
291
|
+
errors.push(`${base}.rate_limit must specify only one of requests_per_second or requests_per_minute`);
|
|
292
|
+
}
|
|
293
|
+
const burst = rl.burst;
|
|
294
|
+
if (burst !== undefined && (typeof burst !== 'number' || !Number.isInteger(burst) || burst < 1)) {
|
|
295
|
+
errors.push(`${base}.rate_limit.burst must be >= 1`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (value.cache !== undefined) {
|
|
300
|
+
if (!isPlainObject(value.cache)) {
|
|
301
|
+
errors.push(`${base}.cache must be an object`);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
const cache = value.cache;
|
|
305
|
+
const ttl = cache.ttl_seconds;
|
|
306
|
+
if (ttl !== undefined && (typeof ttl !== 'number' || !Number.isInteger(ttl) || ttl < 1)) {
|
|
307
|
+
errors.push(`${base}.cache.ttl_seconds must be >= 1`);
|
|
308
|
+
}
|
|
309
|
+
const max = cache.max_size_mb;
|
|
310
|
+
if (max !== undefined && (typeof max !== 'number' || !Number.isInteger(max) || max < 1)) {
|
|
311
|
+
errors.push(`${base}.cache.max_size_mb must be >= 1`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (value.circuit_breaker !== undefined) {
|
|
316
|
+
if (!isPlainObject(value.circuit_breaker)) {
|
|
317
|
+
errors.push(`${base}.circuit_breaker must be an object`);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
const cb = value.circuit_breaker;
|
|
321
|
+
const f = cb.failure_threshold;
|
|
322
|
+
if (f !== undefined && (typeof f !== 'number' || !Number.isInteger(f) || f < 1)) {
|
|
323
|
+
errors.push(`${base}.circuit_breaker.failure_threshold must be >= 1`);
|
|
324
|
+
}
|
|
325
|
+
const reset = cb.reset_timeout_ms;
|
|
326
|
+
if (reset !== undefined && (typeof reset !== 'number' || !Number.isInteger(reset) || reset < 1000)) {
|
|
327
|
+
errors.push(`${base}.circuit_breaker.reset_timeout_ms must be >= 1000`);
|
|
328
|
+
}
|
|
329
|
+
const s = cb.success_threshold;
|
|
330
|
+
if (s !== undefined && (typeof s !== 'number' || !Number.isInteger(s) || s < 1)) {
|
|
331
|
+
errors.push(`${base}.circuit_breaker.success_threshold must be >= 1`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (value.retry !== undefined) {
|
|
336
|
+
if (!isPlainObject(value.retry)) {
|
|
337
|
+
errors.push(`${base}.retry must be an object`);
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
const retry = value.retry;
|
|
341
|
+
const mult = retry.multiplier;
|
|
342
|
+
if (mult !== undefined && (!isFiniteNumber(mult) || mult < 1)) {
|
|
343
|
+
errors.push(`${base}.retry.multiplier must be >= 1`);
|
|
344
|
+
}
|
|
345
|
+
const init = retry.initial_backoff_ms;
|
|
346
|
+
if (init !== undefined && (typeof init !== 'number' || !Number.isInteger(init) || init < 100)) {
|
|
347
|
+
errors.push(`${base}.retry.initial_backoff_ms must be >= 100`);
|
|
348
|
+
}
|
|
349
|
+
const max = retry.max_backoff_ms;
|
|
350
|
+
if (max !== undefined && (typeof max !== 'number' || !Number.isInteger(max) || max < 100)) {
|
|
351
|
+
errors.push(`${base}.retry.max_backoff_ms must be >= 100`);
|
|
352
|
+
}
|
|
353
|
+
if (typeof init === 'number' && typeof max === 'number' && max < init) {
|
|
354
|
+
errors.push(`${base}.retry.max_backoff_ms must be >= initial_backoff_ms`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function requireString(obj, field, errors) {
|
|
360
|
+
const key = field.split('.').slice(-1)[0] ?? '';
|
|
361
|
+
const value = obj[key];
|
|
362
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
363
|
+
errors.push(`${field} missing/invalid required string`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function validatePlaceholders(value, base, errors) {
|
|
367
|
+
if (typeof value === 'string') {
|
|
368
|
+
for (const match of value.matchAll(PLACEHOLDER_RE)) {
|
|
369
|
+
const raw = match[1] ?? '';
|
|
370
|
+
const envName = envVarForPlaceholder(raw);
|
|
371
|
+
if (!envName.ok) {
|
|
372
|
+
errors.push(`${base}: ${envName.error}`);
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
if (process.env[envName.value] === undefined) {
|
|
376
|
+
errors.push(`${base}: missing environment variable ${envName.value}`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (Array.isArray(value)) {
|
|
382
|
+
for (let i = 0; i < value.length; i++) {
|
|
383
|
+
validatePlaceholders(value[i], `${base}[${i}]`, errors);
|
|
384
|
+
}
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
if (isPlainObject(value)) {
|
|
388
|
+
for (const [k, v] of Object.entries(value)) {
|
|
389
|
+
validatePlaceholders(v, `${base}.${k}`, errors);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
function envVarForPlaceholder(raw) {
|
|
394
|
+
if (raw.startsWith('secrets.')) {
|
|
395
|
+
const name = raw.slice('secrets.'.length);
|
|
396
|
+
if (!name) {
|
|
397
|
+
return { ok: false, error: 'placeholder ${secrets.} is invalid' };
|
|
398
|
+
}
|
|
399
|
+
return { ok: true, value: name };
|
|
400
|
+
}
|
|
401
|
+
if (!raw) {
|
|
402
|
+
return { ok: false, error: 'placeholder ${} is invalid' };
|
|
403
|
+
}
|
|
404
|
+
return { ok: true, value: raw };
|
|
405
|
+
}
|
|
406
|
+
function isFiniteNumber(value) {
|
|
407
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/policy/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output sanitization (secrets + PII) for OpenClaw tool results.
|
|
3
|
+
*
|
|
4
|
+
* This is intentionally conservative and designed to be safe for logs/UI:
|
|
5
|
+
* - Never returns raw match text
|
|
6
|
+
* - Uses stable placeholder labels
|
|
7
|
+
*/
|
|
8
|
+
export type SanitizationFindingId = 'pii_email' | 'pii_phone' | 'pii_ssn' | 'pii_credit_card';
|
|
9
|
+
export interface SanitizationResult {
|
|
10
|
+
sanitized: string;
|
|
11
|
+
redacted: boolean;
|
|
12
|
+
findings: SanitizationFindingId[];
|
|
13
|
+
}
|
|
14
|
+
export declare function sanitizeOutputText(text: string): SanitizationResult;
|
|
15
|
+
//# sourceMappingURL=output-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-sanitizer.d.ts","sourceRoot":"","sources":["../../src/sanitizer/output-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,WAAW,GACX,SAAS,GACT,iBAAiB,CAAC;AAEtB,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAiBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAyBnE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output sanitization (secrets + PII) for OpenClaw tool results.
|
|
3
|
+
*
|
|
4
|
+
* This is intentionally conservative and designed to be safe for logs/UI:
|
|
5
|
+
* - Never returns raw match text
|
|
6
|
+
* - Uses stable placeholder labels
|
|
7
|
+
*/
|
|
8
|
+
const EMAIL_RE = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi;
|
|
9
|
+
const PHONE_RE = /\b(?:\+?1[\s.-]?)?\(?(?:[2-9][0-9]{2})\)?[\s.-]?[0-9]{3}[\s.-]?[0-9]{4}\b/g;
|
|
10
|
+
const SSN_RE = /\b[0-9]{3}-[0-9]{2}-[0-9]{4}\b/g;
|
|
11
|
+
const CREDIT_CARD_RE = /\b(?:[0-9][ -]*?){13,19}\b/g;
|
|
12
|
+
function redactAll(re, input, replacement) {
|
|
13
|
+
re.lastIndex = 0;
|
|
14
|
+
const hit = re.test(input);
|
|
15
|
+
re.lastIndex = 0;
|
|
16
|
+
if (!hit)
|
|
17
|
+
return { out: input, hit: false };
|
|
18
|
+
const out = input.replace(re, replacement);
|
|
19
|
+
re.lastIndex = 0;
|
|
20
|
+
return { out, hit: true };
|
|
21
|
+
}
|
|
22
|
+
export function sanitizeOutputText(text) {
|
|
23
|
+
let out = text;
|
|
24
|
+
const findings = [];
|
|
25
|
+
const email = redactAll(EMAIL_RE, out, '[REDACTED:email]');
|
|
26
|
+
out = email.out;
|
|
27
|
+
if (email.hit)
|
|
28
|
+
findings.push('pii_email');
|
|
29
|
+
const phone = redactAll(PHONE_RE, out, '[REDACTED:phone]');
|
|
30
|
+
out = phone.out;
|
|
31
|
+
if (phone.hit)
|
|
32
|
+
findings.push('pii_phone');
|
|
33
|
+
const ssn = redactAll(SSN_RE, out, '[REDACTED:ssn]');
|
|
34
|
+
out = ssn.out;
|
|
35
|
+
if (ssn.hit)
|
|
36
|
+
findings.push('pii_ssn');
|
|
37
|
+
const cc = redactAll(CREDIT_CARD_RE, out, '[REDACTED:credit_card]');
|
|
38
|
+
out = cc.out;
|
|
39
|
+
if (cc.hit)
|
|
40
|
+
findings.push('pii_credit_card');
|
|
41
|
+
return {
|
|
42
|
+
sanitized: out,
|
|
43
|
+
redacted: findings.length > 0,
|
|
44
|
+
findings,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=output-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-sanitizer.js","sourceRoot":"","sources":["../../src/sanitizer/output-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,QAAQ,GAAG,6CAA6C,CAAC;AAC/D,MAAM,QAAQ,GAAG,4EAA4E,CAAC;AAC9F,MAAM,MAAM,GAAG,iCAAiC,CAAC;AACjD,MAAM,cAAc,GAAG,6BAA6B,CAAC;AAErD,SAAS,SAAS,CAAC,EAAU,EAAE,KAAa,EAAE,WAAmB;IAC/D,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC3C,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;IACjB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAE7C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC3D,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IAChB,IAAI,KAAK,CAAC,GAAG;QAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE1C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC3D,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IAChB,IAAI,KAAK,CAAC,GAAG;QAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE1C,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACrD,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACd,IAAI,GAAG,CAAC,GAAG;QAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEtC,MAAM,EAAE,GAAG,SAAS,CAAC,cAAc,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC;IACpE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;IACb,IAAI,EAAE,CAAC,GAAG;QAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE7C,OAAO;QACL,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC7B,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-prompt.d.ts","sourceRoot":"","sources":["../src/security-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4E7D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export function generateSecurityPrompt(policy) {
|
|
2
|
+
const sections = [];
|
|
3
|
+
sections.push(`# Security Policy
|
|
4
|
+
|
|
5
|
+
Your tool use is subject to clawdstrike guardrails at the tool boundary (not an OS sandbox). The following constraints apply:`);
|
|
6
|
+
// Network Access section
|
|
7
|
+
sections.push(`
|
|
8
|
+
## Network Access`);
|
|
9
|
+
if (policy.egress?.mode === 'allowlist' && policy.egress.allowed_domains?.length) {
|
|
10
|
+
sections.push(`- Only these domains are allowed: ${policy.egress.allowed_domains.join(', ')}`);
|
|
11
|
+
}
|
|
12
|
+
else if (policy.egress?.mode === 'denylist' && policy.egress.denied_domains?.length) {
|
|
13
|
+
sections.push(`- These domains are blocked: ${policy.egress.denied_domains.join(', ')}`);
|
|
14
|
+
}
|
|
15
|
+
else if (policy.egress?.mode === 'deny_all') {
|
|
16
|
+
sections.push(`- All network access is BLOCKED`);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
sections.push(`- Network access follows default policy`);
|
|
20
|
+
}
|
|
21
|
+
// Forbidden Paths section
|
|
22
|
+
sections.push(`
|
|
23
|
+
## Forbidden Paths`);
|
|
24
|
+
if (policy.filesystem?.forbidden_paths?.length) {
|
|
25
|
+
sections.push(`- These paths are FORBIDDEN and will be blocked:`);
|
|
26
|
+
for (const path of policy.filesystem.forbidden_paths) {
|
|
27
|
+
sections.push(` - ${path}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
sections.push(`- Default protected paths: ~/.ssh, ~/.aws, ~/.gnupg, .env files`);
|
|
32
|
+
}
|
|
33
|
+
if (policy.filesystem?.allowed_write_roots?.length) {
|
|
34
|
+
sections.push(`- Writes are only allowed in: ${policy.filesystem.allowed_write_roots.join(', ')}`);
|
|
35
|
+
}
|
|
36
|
+
// Security Tools section
|
|
37
|
+
sections.push(`
|
|
38
|
+
## Security Tools
|
|
39
|
+
You have access to the \`policy_check\` tool. Use it BEFORE attempting:
|
|
40
|
+
- File operations on unfamiliar paths
|
|
41
|
+
- Network requests to unfamiliar domains
|
|
42
|
+
- Execution of shell commands
|
|
43
|
+
|
|
44
|
+
Example:
|
|
45
|
+
\`\`\`
|
|
46
|
+
policy_check({ action: "file_write", resource: "/etc/passwd" })
|
|
47
|
+
-> { allowed: false, denied: true, warn: false, guard: "forbidden_path", message: "Denied by forbidden_path: …" }
|
|
48
|
+
\`\`\``);
|
|
49
|
+
// Violation Handling section
|
|
50
|
+
const blockAction = policy.on_violation === 'cancel' ? 'BLOCKED' :
|
|
51
|
+
policy.on_violation === 'warn' ? 'logged with a warning' :
|
|
52
|
+
policy.on_violation === 'isolate' ? 'ISOLATED' :
|
|
53
|
+
policy.on_violation === 'escalate' ? 'ESCALATED' :
|
|
54
|
+
'logged';
|
|
55
|
+
sections.push(`
|
|
56
|
+
## Violation Handling
|
|
57
|
+
When a security violation occurs:
|
|
58
|
+
1. The operation will be ${blockAction}
|
|
59
|
+
2. You will see an error message explaining why
|
|
60
|
+
3. Try an alternative approach that respects the policy`);
|
|
61
|
+
// Tips section
|
|
62
|
+
sections.push(`
|
|
63
|
+
## Tips
|
|
64
|
+
- Prefer working within /workspace or /tmp
|
|
65
|
+
- Use known package registries (npm, pypi, crates.io)
|
|
66
|
+
- Never attempt to access credentials or keys
|
|
67
|
+
- When unsure, use \`policy_check\` first`);
|
|
68
|
+
return sections.join('\n');
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=security-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-prompt.js","sourceRoot":"","sources":["../src/security-prompt.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC;;8HAE8G,CAAC,CAAC;IAE9H,yBAAyB;IACzB,QAAQ,CAAC,IAAI,CAAC;kBACE,CAAC,CAAC;IAElB,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QACjF,QAAQ,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;QACtF,QAAQ,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC3D,CAAC;IAED,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,CAAC;mBACG,CAAC,CAAC;IAEnB,IAAI,MAAM,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAClE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,yBAAyB;IACzB,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;OAWT,CAAC,CAAC;IAEP,6BAA6B;IAC7B,MAAM,WAAW,GACf,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;YACxD,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC9C,MAAM,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;oBAChD,QAAQ,CAAC;IAEnB,QAAQ,CAAC,IAAI,CAAC;;;2BAGW,WAAW;;wDAEkB,CAAC,CAAC;IAExD,eAAe;IACf,QAAQ,CAAC,IAAI,CAAC;;;;;0CAK0B,CAAC,CAAC;IAE1C,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Decision, ClawdstrikeConfig, ToolDefinition } from '../types.js';
|
|
2
|
+
import { PolicyEngine } from '../policy/engine.js';
|
|
3
|
+
export type PolicyCheckAction = 'file_read' | 'file_write' | 'network' | 'network_egress' | 'command' | 'command_exec' | 'tool_call';
|
|
4
|
+
export interface PolicyCheckResult extends Decision {
|
|
5
|
+
message: string;
|
|
6
|
+
suggestion?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function checkPolicy(config: ClawdstrikeConfig, action: PolicyCheckAction, resource: string): Promise<PolicyCheckResult>;
|
|
9
|
+
export declare function policyCheckTool(engine: PolicyEngine): ToolDefinition;
|
|
10
|
+
//# sourceMappingURL=policy-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-check.d.ts","sourceRoot":"","sources":["../../src/tools/policy-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,YAAY,GACZ,SAAS,GACT,gBAAgB,GAChB,SAAS,GACT,cAAc,GACd,WAAW,CAAC;AAEhB,MAAM,WAAW,iBAAkB,SAAQ,QAAQ;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0FD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CAM5B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CA+BpE"}
|