@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.
Files changed (108) hide show
  1. package/README.md +7 -0
  2. package/dist/audit/store.d.ts +26 -0
  3. package/dist/audit/store.d.ts.map +1 -0
  4. package/dist/audit/store.js +59 -0
  5. package/dist/audit/store.js.map +1 -0
  6. package/dist/cli/bin.d.ts +3 -0
  7. package/dist/cli/bin.d.ts.map +1 -0
  8. package/dist/cli/bin.js +5 -0
  9. package/dist/cli/bin.js.map +1 -0
  10. package/dist/cli/commands/audit.d.ts +19 -0
  11. package/dist/cli/commands/audit.d.ts.map +1 -0
  12. package/dist/cli/commands/audit.js +93 -0
  13. package/dist/cli/commands/audit.js.map +1 -0
  14. package/dist/cli/commands/policy.d.ts +11 -0
  15. package/dist/cli/commands/policy.d.ts.map +1 -0
  16. package/dist/cli/commands/policy.js +101 -0
  17. package/dist/cli/commands/policy.js.map +1 -0
  18. package/dist/cli/index.d.ts +4 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +91 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/config.d.ts +27 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +88 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/e2e/openclaw-e2e.d.ts +2 -0
  27. package/dist/e2e/openclaw-e2e.d.ts.map +1 -0
  28. package/dist/e2e/openclaw-e2e.js +129 -0
  29. package/dist/e2e/openclaw-e2e.js.map +1 -0
  30. package/dist/guards/egress.d.ts +25 -0
  31. package/dist/guards/egress.d.ts.map +1 -0
  32. package/dist/guards/egress.js +146 -0
  33. package/dist/guards/egress.js.map +1 -0
  34. package/dist/guards/forbidden-path.d.ts +22 -0
  35. package/dist/guards/forbidden-path.d.ts.map +1 -0
  36. package/dist/guards/forbidden-path.js +132 -0
  37. package/dist/guards/forbidden-path.js.map +1 -0
  38. package/dist/guards/index.d.ts +12 -0
  39. package/dist/guards/index.d.ts.map +1 -0
  40. package/dist/guards/index.js +11 -0
  41. package/dist/guards/index.js.map +1 -0
  42. package/dist/guards/patch-integrity.d.ts +27 -0
  43. package/dist/guards/patch-integrity.d.ts.map +1 -0
  44. package/dist/guards/patch-integrity.js +219 -0
  45. package/dist/guards/patch-integrity.js.map +1 -0
  46. package/dist/guards/secret-leak.d.ts +31 -0
  47. package/dist/guards/secret-leak.d.ts.map +1 -0
  48. package/dist/guards/secret-leak.js +235 -0
  49. package/dist/guards/secret-leak.js.map +1 -0
  50. package/dist/guards/types.d.ts +46 -0
  51. package/dist/guards/types.d.ts.map +1 -0
  52. package/dist/guards/types.js +36 -0
  53. package/dist/guards/types.js.map +1 -0
  54. package/dist/hooks/agent-bootstrap/handler.d.ts +10 -0
  55. package/dist/hooks/agent-bootstrap/handler.d.ts.map +1 -0
  56. package/dist/hooks/agent-bootstrap/handler.js +35 -0
  57. package/dist/hooks/agent-bootstrap/handler.js.map +1 -0
  58. package/dist/hooks/audit-logger/handler.d.ts +16 -0
  59. package/dist/hooks/audit-logger/handler.d.ts.map +1 -0
  60. package/dist/hooks/audit-logger/handler.js +70 -0
  61. package/dist/hooks/audit-logger/handler.js.map +1 -0
  62. package/dist/hooks/tool-guard/handler.d.ts +16 -0
  63. package/dist/hooks/tool-guard/handler.d.ts.map +1 -0
  64. package/dist/hooks/tool-guard/handler.js +335 -0
  65. package/dist/hooks/tool-guard/handler.js.map +1 -0
  66. package/dist/index.d.ts +10 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +15 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/plugin.d.ts +11 -0
  71. package/dist/plugin.d.ts.map +1 -0
  72. package/dist/plugin.js +234 -0
  73. package/dist/plugin.js.map +1 -0
  74. package/dist/policy/engine.d.ts +31 -0
  75. package/dist/policy/engine.d.ts.map +1 -0
  76. package/dist/policy/engine.js +282 -0
  77. package/dist/policy/engine.js.map +1 -0
  78. package/dist/policy/index.d.ts +4 -0
  79. package/dist/policy/index.d.ts.map +1 -0
  80. package/dist/policy/index.js +4 -0
  81. package/dist/policy/index.js.map +1 -0
  82. package/dist/policy/loader.d.ts +10 -0
  83. package/dist/policy/loader.d.ts.map +1 -0
  84. package/dist/policy/loader.js +262 -0
  85. package/dist/policy/loader.js.map +1 -0
  86. package/dist/policy/validator.d.ts +4 -0
  87. package/dist/policy/validator.d.ts.map +1 -0
  88. package/dist/policy/validator.js +409 -0
  89. package/dist/policy/validator.js.map +1 -0
  90. package/dist/sanitizer/output-sanitizer.d.ts +15 -0
  91. package/dist/sanitizer/output-sanitizer.d.ts.map +1 -0
  92. package/dist/sanitizer/output-sanitizer.js +47 -0
  93. package/dist/sanitizer/output-sanitizer.js.map +1 -0
  94. package/dist/security-prompt.d.ts +3 -0
  95. package/dist/security-prompt.d.ts.map +1 -0
  96. package/dist/security-prompt.js +70 -0
  97. package/dist/security-prompt.js.map +1 -0
  98. package/dist/tools/policy-check.d.ts +10 -0
  99. package/dist/tools/policy-check.d.ts.map +1 -0
  100. package/dist/tools/policy-check.js +141 -0
  101. package/dist/tools/policy-check.js.map +1 -0
  102. package/dist/types.d.ts +413 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +7 -0
  105. package/dist/types.js.map +1 -0
  106. package/package.json +85 -0
  107. package/rulesets/ai-agent-minimal.yaml +42 -0
  108. 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,3 @@
1
+ import type { Policy } from './types.js';
2
+ export declare function generateSecurityPrompt(policy: Policy): string;
3
+ //# sourceMappingURL=security-prompt.d.ts.map
@@ -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"}