@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
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @backbay/clawdstrike-security
2
+
3
+ Clawdstrike security plugin for OpenClaw.
4
+
5
+ ## Getting started
6
+
7
+ See `packages/adapters/clawdstrike-openclaw/docs/getting-started.md`.
@@ -0,0 +1,26 @@
1
+ export interface AuditEvent {
2
+ id: string;
3
+ timestamp: number;
4
+ type: string;
5
+ resource: string;
6
+ decision: 'allowed' | 'denied';
7
+ guard?: string;
8
+ reason?: string;
9
+ runId?: string;
10
+ }
11
+ export declare class AuditStore {
12
+ private path;
13
+ private events;
14
+ constructor(path?: string);
15
+ private load;
16
+ append(event: Omit<AuditEvent, 'id' | 'timestamp'>): AuditEvent;
17
+ query(options?: {
18
+ since?: number;
19
+ guard?: string;
20
+ denied?: boolean;
21
+ limit?: number;
22
+ }): AuditEvent[];
23
+ getById(id: string): AuditEvent | undefined;
24
+ clear(): void;
25
+ }
26
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/audit/store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,IAAI,GAAE,MAA4B;IAK9C,OAAO,CAAC,IAAI;IAUZ,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,UAAU;IAiB/D,KAAK,CAAC,OAAO,GAAE;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,UAAU,EAAE;IAmBrB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI3C,KAAK,IAAI,IAAI;CAMd"}
@@ -0,0 +1,59 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
2
+ import { dirname } from 'path';
3
+ export class AuditStore {
4
+ path;
5
+ events = [];
6
+ constructor(path = '.hush/audit.jsonl') {
7
+ this.path = path;
8
+ this.load();
9
+ }
10
+ load() {
11
+ if (existsSync(this.path)) {
12
+ const content = readFileSync(this.path, 'utf-8');
13
+ this.events = content
14
+ .split('\n')
15
+ .filter(line => line.trim())
16
+ .map(line => JSON.parse(line));
17
+ }
18
+ }
19
+ append(event) {
20
+ const fullEvent = {
21
+ ...event,
22
+ id: `evt-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
23
+ timestamp: Date.now(),
24
+ };
25
+ this.events.push(fullEvent);
26
+ const dir = dirname(this.path);
27
+ if (!existsSync(dir)) {
28
+ mkdirSync(dir, { recursive: true });
29
+ }
30
+ writeFileSync(this.path, this.events.map(e => JSON.stringify(e)).join('\n') + '\n');
31
+ return fullEvent;
32
+ }
33
+ query(options = {}) {
34
+ let results = [...this.events];
35
+ if (options.since) {
36
+ results = results.filter(e => e.timestamp >= options.since);
37
+ }
38
+ if (options.guard) {
39
+ results = results.filter(e => e.guard === options.guard);
40
+ }
41
+ if (options.denied) {
42
+ results = results.filter(e => e.decision === 'denied');
43
+ }
44
+ if (options.limit) {
45
+ results = results.slice(-options.limit);
46
+ }
47
+ return results;
48
+ }
49
+ getById(id) {
50
+ return this.events.find(e => e.id === id);
51
+ }
52
+ clear() {
53
+ this.events = [];
54
+ if (existsSync(this.path)) {
55
+ writeFileSync(this.path, '');
56
+ }
57
+ }
58
+ }
59
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/audit/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { createCli } from './index.js';
3
+ const program = createCli();
4
+ program.parse();
5
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;AAC5B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ interface QueryOptions {
2
+ since?: string;
3
+ guard?: string;
4
+ denied?: boolean;
5
+ auditPath?: string;
6
+ }
7
+ interface ExplainOptions {
8
+ auditPath?: string;
9
+ }
10
+ interface ExportOptions {
11
+ auditPath?: string;
12
+ }
13
+ export declare const auditCommands: {
14
+ query(options?: QueryOptions): Promise<void>;
15
+ explain(eventId: string, options?: ExplainOptions): Promise<void>;
16
+ export(file: string, options?: ExportOptions): Promise<void>;
17
+ };
18
+ export {};
19
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"AAGA,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,aAAa;oBACH,YAAY,GAAQ,OAAO,CAAC,IAAI,CAAC;qBAwC/B,MAAM,YAAW,cAAc,GAAQ,OAAO,CAAC,IAAI,CAAC;iBAyDxD,MAAM,YAAW,aAAa,GAAQ,OAAO,CAAC,IAAI,CAAC;CAOvE,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { writeFileSync } from 'fs';
2
+ import { AuditStore } from '../../audit/store.js';
3
+ export const auditCommands = {
4
+ async query(options = {}) {
5
+ const store = new AuditStore(options.auditPath || '.hush/audit.jsonl');
6
+ const queryOptions = {
7
+ limit: 50,
8
+ };
9
+ if (options.since) {
10
+ const sinceDate = new Date(options.since);
11
+ queryOptions.since = sinceDate.getTime();
12
+ }
13
+ if (options.guard) {
14
+ queryOptions.guard = options.guard;
15
+ }
16
+ if (options.denied) {
17
+ queryOptions.denied = true;
18
+ }
19
+ const events = store.query(queryOptions);
20
+ if (events.length === 0) {
21
+ console.log('No audit events found');
22
+ return;
23
+ }
24
+ console.log('Audit Events:');
25
+ console.log('=============');
26
+ for (const event of events) {
27
+ const date = new Date(event.timestamp).toISOString();
28
+ const status = event.decision === 'allowed' ? 'ALLOWED' : 'DENIED';
29
+ console.log(`\n[${date}] ${event.id}`);
30
+ console.log(` Action: ${event.type}`);
31
+ console.log(` Resource: ${event.resource}`);
32
+ console.log(` Decision: ${status}`);
33
+ if (event.guard)
34
+ console.log(` Guard: ${event.guard}`);
35
+ if (event.reason)
36
+ console.log(` Reason: ${event.reason}`);
37
+ }
38
+ },
39
+ async explain(eventId, options = {}) {
40
+ const store = new AuditStore(options.auditPath || '.hush/audit.jsonl');
41
+ const event = store.getById(eventId);
42
+ if (!event) {
43
+ console.log(`Event ${eventId} not found`);
44
+ return;
45
+ }
46
+ console.log('Event Details');
47
+ console.log('=============');
48
+ console.log(`\nEvent ID: ${event.id}`);
49
+ console.log(`Timestamp: ${new Date(event.timestamp).toISOString()}`);
50
+ console.log(`Action: ${event.type}`);
51
+ console.log(`Resource: ${event.resource}`);
52
+ console.log(`Decision: ${event.decision === 'allowed' ? 'ALLOWED' : 'DENIED'}`);
53
+ if (event.guard) {
54
+ console.log(`\nGuard: ${event.guard}`);
55
+ }
56
+ if (event.reason) {
57
+ console.log(`Reason: ${event.reason}`);
58
+ }
59
+ if (event.decision === 'denied') {
60
+ console.log('\nRemediation:');
61
+ console.log('------------');
62
+ const guard = (event.guard || '').trim();
63
+ if (guard === 'forbidden_path' || guard === 'ForbiddenPathGuard') {
64
+ console.log('This path is protected by the forbidden_path guard.');
65
+ console.log('To allow access, remove it from filesystem.forbidden_paths in your policy.');
66
+ return;
67
+ }
68
+ if (guard === 'egress' || guard === 'EgressAllowlistGuard') {
69
+ console.log('This domain is blocked by the egress policy.');
70
+ console.log('To allow access, add it to egress.allowed_domains (or change egress.mode) in your policy.');
71
+ return;
72
+ }
73
+ if (guard === 'secret_leak' || guard === 'SecretLeakGuard') {
74
+ console.log('Tool output contained a value that looks like a secret.');
75
+ console.log('Remove/redact secrets from tool output or adjust your workflow to avoid printing credentials.');
76
+ return;
77
+ }
78
+ if (guard === 'patch_integrity' || guard === 'PatchIntegrityGuard') {
79
+ console.log('The patch/command matched a dangerous pattern.');
80
+ console.log('Avoid unsafe commands/patterns (e.g., curl|bash, rm -rf /) or update execution.denied_patterns.');
81
+ return;
82
+ }
83
+ console.log('Review your policy configuration to understand why this was blocked.');
84
+ }
85
+ },
86
+ async export(file, options = {}) {
87
+ const store = new AuditStore(options.auditPath || '.hush/audit.jsonl');
88
+ const events = store.query({});
89
+ writeFileSync(file, JSON.stringify(events, null, 2));
90
+ console.log(`Exported ${events.length} events to ${file}`);
91
+ },
92
+ };
93
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const policyCommands: {
2
+ lint(file: string): Promise<void>;
3
+ show(options?: {
4
+ policy?: string;
5
+ }): Promise<void>;
6
+ test(eventFile: string, options?: {
7
+ policy?: string;
8
+ }): Promise<void>;
9
+ diff(file1: string, file2: string): Promise<void>;
10
+ };
11
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/policy.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc;eACR,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;mBA4BnB;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAQ,OAAO,CAAC,IAAI,CAAC;oBAatC,MAAM,YAAW;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAQ,OAAO,CAAC,IAAI,CAAC;gBAmB7D,MAAM,SAAS,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsCxD,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { readFileSync } from 'fs';
2
+ import { loadPolicy, loadPolicyFromString } from '../../policy/loader.js';
3
+ import { validatePolicy } from '../../policy/validator.js';
4
+ import { PolicyEngine } from '../../policy/engine.js';
5
+ export const policyCommands = {
6
+ async lint(file) {
7
+ try {
8
+ const content = readFileSync(file, 'utf-8');
9
+ const policy = loadPolicyFromString(content);
10
+ const result = validatePolicy(policy);
11
+ if (result.valid) {
12
+ console.log('Policy is valid');
13
+ console.log(` Version: ${policy.version || 'unspecified'}`);
14
+ const guards = Object.keys(policy).filter(k => !['version', 'on_violation', 'extends'].includes(k));
15
+ console.log(` Guards: ${guards.join(', ') || 'none'}`);
16
+ if (result.warnings.length > 0) {
17
+ console.log('\nWarnings:');
18
+ result.warnings.forEach(w => console.log(` - ${w}`));
19
+ }
20
+ }
21
+ else {
22
+ console.log('Policy validation failed:');
23
+ result.errors.forEach(err => console.log(` - ${err}`));
24
+ process.exit(1);
25
+ }
26
+ }
27
+ catch (err) {
28
+ const message = err instanceof Error ? err.message : String(err);
29
+ console.log(`Failed to read policy file: ${message}`);
30
+ process.exit(1);
31
+ }
32
+ },
33
+ async show(options = {}) {
34
+ try {
35
+ const policyPath = options.policy || '.hush/policy.yaml';
36
+ const policy = loadPolicy(policyPath);
37
+ console.log('Current policy:');
38
+ console.log(JSON.stringify(policy, null, 2));
39
+ }
40
+ catch (err) {
41
+ const message = err instanceof Error ? err.message : String(err);
42
+ console.log(`Failed to load policy: ${message}`);
43
+ process.exit(1);
44
+ }
45
+ },
46
+ async test(eventFile, options = {}) {
47
+ try {
48
+ const policyPath = options.policy || '.hush/policy.yaml';
49
+ const event = JSON.parse(readFileSync(eventFile, 'utf-8'));
50
+ const engine = new PolicyEngine({ policy: policyPath });
51
+ const decision = await engine.evaluate(event);
52
+ console.log('Decision:', decision.allowed ? 'ALLOWED' : 'DENIED');
53
+ if (decision.reason)
54
+ console.log('Reason:', decision.reason);
55
+ if (decision.guard)
56
+ console.log('Guard:', decision.guard);
57
+ if (decision.severity)
58
+ console.log('Severity:', decision.severity);
59
+ }
60
+ catch (err) {
61
+ const message = err instanceof Error ? err.message : String(err);
62
+ console.log(`Failed to test event: ${message}`);
63
+ process.exit(1);
64
+ }
65
+ },
66
+ async diff(file1, file2) {
67
+ try {
68
+ const p1 = loadPolicy(file1);
69
+ const p2 = loadPolicy(file2);
70
+ console.log('Policy Diff:');
71
+ console.log('============');
72
+ // Compare egress
73
+ if (JSON.stringify(p1.egress) !== JSON.stringify(p2.egress)) {
74
+ console.log('\nEgress:');
75
+ console.log(' File 1:', JSON.stringify(p1.egress || {}));
76
+ console.log(' File 2:', JSON.stringify(p2.egress || {}));
77
+ }
78
+ // Compare filesystem
79
+ if (JSON.stringify(p1.filesystem) !== JSON.stringify(p2.filesystem)) {
80
+ console.log('\nFilesystem:');
81
+ console.log(' File 1:', JSON.stringify(p1.filesystem || {}));
82
+ console.log(' File 2:', JSON.stringify(p2.filesystem || {}));
83
+ }
84
+ // Compare on_violation
85
+ if (p1.on_violation !== p2.on_violation) {
86
+ console.log('\nOn Violation:');
87
+ console.log(' File 1:', p1.on_violation || 'default');
88
+ console.log(' File 2:', p2.on_violation || 'default');
89
+ }
90
+ if (JSON.stringify(p1) === JSON.stringify(p2)) {
91
+ console.log('Policies are identical');
92
+ }
93
+ }
94
+ catch (err) {
95
+ const message = err instanceof Error ? err.message : String(err);
96
+ console.log(`Failed to diff policies: ${message}`);
97
+ process.exit(1);
98
+ }
99
+ },
100
+ };
101
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/cli/commands/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCli(program: Command): void;
3
+ export declare function createCli(): Command;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmDlD;AAED,wBAAgB,SAAS,IAAI,OAAO,CAqDnC"}
@@ -0,0 +1,91 @@
1
+ import { Command } from 'commander';
2
+ import { policyCommands } from './commands/policy.js';
3
+ import { auditCommands } from './commands/audit.js';
4
+ export function registerCli(program) {
5
+ const clawdstrike = program
6
+ .command('clawdstrike')
7
+ .description('Clawdstrike security management');
8
+ // Policy commands
9
+ const policy = clawdstrike.command('policy').description('Policy management');
10
+ policy
11
+ .command('lint <file>')
12
+ .description('Validate a policy file')
13
+ .action(policyCommands.lint);
14
+ policy
15
+ .command('show')
16
+ .option('-p, --policy <path>', 'Policy file path')
17
+ .description('Show the current effective policy')
18
+ .action((options) => policyCommands.show(options));
19
+ policy
20
+ .command('test <event-file>')
21
+ .option('-p, --policy <path>', 'Policy file path')
22
+ .description('Test an event against the current policy')
23
+ .action((eventFile, options) => policyCommands.test(eventFile, options));
24
+ policy
25
+ .command('diff <file1> <file2>')
26
+ .description('Compare two policy files')
27
+ .action(policyCommands.diff);
28
+ // Audit commands
29
+ const audit = clawdstrike.command('audit').description('Audit log management');
30
+ audit
31
+ .command('query')
32
+ .option('-s, --since <time>', 'Start time (ISO format)')
33
+ .option('-g, --guard <name>', 'Filter by guard')
34
+ .option('-d, --denied', 'Only show denied events')
35
+ .description('Query the audit log')
36
+ .action((options) => auditCommands.query(options));
37
+ audit
38
+ .command('export <file>')
39
+ .description('Export audit log to file')
40
+ .action((file, options) => auditCommands.export(file, options));
41
+ // Quick commands
42
+ clawdstrike
43
+ .command('why <event-id>')
44
+ .description('Explain why an event was blocked')
45
+ .action((eventId, options) => auditCommands.explain(eventId, options));
46
+ }
47
+ export function createCli() {
48
+ const program = new Command();
49
+ program
50
+ .name('clawdstrike')
51
+ .description('Clawdstrike security CLI')
52
+ .version('0.1.0');
53
+ // Register commands directly on root
54
+ const policy = program.command('policy').description('Policy management');
55
+ policy
56
+ .command('lint <file>')
57
+ .description('Validate a policy file')
58
+ .action(policyCommands.lint);
59
+ policy
60
+ .command('show')
61
+ .option('-p, --policy <path>', 'Policy file path')
62
+ .description('Show the current effective policy')
63
+ .action((options) => policyCommands.show(options));
64
+ policy
65
+ .command('test <event-file>')
66
+ .option('-p, --policy <path>', 'Policy file path')
67
+ .description('Test an event against the current policy')
68
+ .action((eventFile, options) => policyCommands.test(eventFile, options));
69
+ policy
70
+ .command('diff <file1> <file2>')
71
+ .description('Compare two policy files')
72
+ .action(policyCommands.diff);
73
+ const audit = program.command('audit').description('Audit log management');
74
+ audit
75
+ .command('query')
76
+ .option('-s, --since <time>', 'Start time')
77
+ .option('-g, --guard <name>', 'Filter by guard')
78
+ .option('-d, --denied', 'Only show denied events')
79
+ .description('Query the audit log')
80
+ .action((options) => auditCommands.query(options));
81
+ audit
82
+ .command('export <file>')
83
+ .description('Export audit log to file')
84
+ .action((file, options) => auditCommands.export(file, options));
85
+ program
86
+ .command('why <event-id>')
87
+ .description('Explain why an event was blocked')
88
+ .action((eventId, options) => auditCommands.explain(eventId, options));
89
+ return program;
90
+ }
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @clawdstrike/openclaw - Configuration
3
+ *
4
+ * Configuration handling and defaults for the Clawdstrike plugin.
5
+ */
6
+ import type { ClawdstrikeConfig } from './types.js';
7
+ /**
8
+ * Default configuration values
9
+ */
10
+ export declare const DEFAULT_CONFIG: Required<ClawdstrikeConfig>;
11
+ /**
12
+ * Merge user config with defaults
13
+ */
14
+ export declare function mergeConfig(userConfig?: ClawdstrikeConfig): Required<ClawdstrikeConfig>;
15
+ /**
16
+ * Validate configuration values
17
+ */
18
+ export declare function validateConfig(config: ClawdstrikeConfig): string[];
19
+ /**
20
+ * Resolve built-in policy name to file path
21
+ */
22
+ export declare function resolveBuiltinPolicy(name: string): string | null;
23
+ /**
24
+ * Check if a policy name is a built-in policy
25
+ */
26
+ export declare function isBuiltinPolicy(name: string): boolean;
27
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,iBAAiB,CAWtD,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,GAAE,iBAAsB,GACjC,QAAQ,CAAC,iBAAiB,CAAC,CAO7B;AAmBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAYlE;AAgBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD"}
package/dist/config.js ADDED
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @clawdstrike/openclaw - Configuration
3
+ *
4
+ * Configuration handling and defaults for the Clawdstrike plugin.
5
+ */
6
+ /**
7
+ * Default configuration values
8
+ */
9
+ export const DEFAULT_CONFIG = {
10
+ policy: 'clawdstrike:ai-agent-minimal',
11
+ mode: 'deterministic',
12
+ logLevel: 'info',
13
+ guards: {
14
+ forbidden_path: true,
15
+ egress: true,
16
+ secret_leak: true,
17
+ patch_integrity: true,
18
+ mcp_tool: false,
19
+ },
20
+ };
21
+ /**
22
+ * Merge user config with defaults
23
+ */
24
+ export function mergeConfig(userConfig = {}) {
25
+ return {
26
+ policy: userConfig.policy ?? DEFAULT_CONFIG.policy,
27
+ mode: userConfig.mode ?? DEFAULT_CONFIG.mode,
28
+ logLevel: userConfig.logLevel ?? DEFAULT_CONFIG.logLevel,
29
+ guards: mergeGuardToggles(userConfig.guards),
30
+ };
31
+ }
32
+ /**
33
+ * Merge guard toggles with defaults
34
+ */
35
+ function mergeGuardToggles(userGuards = {}) {
36
+ const d = DEFAULT_CONFIG.guards;
37
+ const u = userGuards;
38
+ return {
39
+ forbidden_path: u.forbidden_path ?? d.forbidden_path ?? true,
40
+ egress: u.egress ?? d.egress ?? true,
41
+ secret_leak: u.secret_leak ?? d.secret_leak ?? true,
42
+ patch_integrity: u.patch_integrity ?? d.patch_integrity ?? true,
43
+ mcp_tool: u.mcp_tool ?? d.mcp_tool ?? false,
44
+ };
45
+ }
46
+ /**
47
+ * Validate configuration values
48
+ */
49
+ export function validateConfig(config) {
50
+ const errors = [];
51
+ if (config.mode && !isValidMode(config.mode)) {
52
+ errors.push(`Invalid mode: ${config.mode}. Must be one of: deterministic, advisory, audit`);
53
+ }
54
+ if (config.logLevel && !isValidLogLevel(config.logLevel)) {
55
+ errors.push(`Invalid logLevel: ${config.logLevel}. Must be one of: debug, info, warn, error`);
56
+ }
57
+ return errors;
58
+ }
59
+ /**
60
+ * Type guard for EvaluationMode
61
+ */
62
+ function isValidMode(mode) {
63
+ return ['deterministic', 'advisory', 'audit'].includes(mode);
64
+ }
65
+ /**
66
+ * Type guard for LogLevel
67
+ */
68
+ function isValidLogLevel(level) {
69
+ return ['debug', 'info', 'warn', 'error'].includes(level);
70
+ }
71
+ /**
72
+ * Resolve built-in policy name to file path
73
+ */
74
+ export function resolveBuiltinPolicy(name) {
75
+ const builtinPolicies = {
76
+ 'clawdstrike:ai-agent-minimal': 'ai-agent-minimal.yaml',
77
+ 'clawdstrike:ai-agent': 'ai-agent.yaml',
78
+ 'clawdstrike:default': 'ai-agent.yaml',
79
+ };
80
+ return builtinPolicies[name] ?? null;
81
+ }
82
+ /**
83
+ * Check if a policy name is a built-in policy
84
+ */
85
+ export function isBuiltinPolicy(name) {
86
+ return name.startsWith('clawdstrike:');
87
+ }
88
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAgC;IACzD,MAAM,EAAE,8BAA8B;IACtC,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE;QACN,cAAc,EAAE,IAAI;QACpB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,KAAK;KAChB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,aAAgC,EAAE;IAElC,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM;QAClD,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,cAAc,CAAC,IAAI;QAC5C,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ;QACxD,MAAM,EAAE,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,aAA2B,EAAE;IAE7B,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;IAChC,MAAM,CAAC,GAAG,UAAU,CAAC;IACrB,OAAO;QACL,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,cAAc,IAAI,IAAI;QAC5D,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI;QACpC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI;QACnD,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,eAAe,IAAI,IAAI;QAC/D,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK;KAC5C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,kDAAkD,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,QAAQ,4CAA4C,CAAC,CAAC;IAChG,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,CAAC,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,eAAe,GAA2B;QAC9C,8BAA8B,EAAE,uBAAuB;QACvD,sBAAsB,EAAE,eAAe;QACvC,qBAAqB,EAAE,eAAe;KACvC,CAAC;IAEF,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=openclaw-e2e.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-e2e.d.ts","sourceRoot":"","sources":["../../src/e2e/openclaw-e2e.ts"],"names":[],"mappings":""}