averecion-clawguard 2.7.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 +105 -0
- package/clawdbot.plugin.json +34 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +316 -0
- package/dist/cli.js.map +1 -0
- package/dist/consent.d.ts +14 -0
- package/dist/consent.d.ts.map +1 -0
- package/dist/consent.js +176 -0
- package/dist/consent.js.map +1 -0
- package/dist/hooks.d.ts +28 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +341 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +24 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +219 -0
- package/dist/plugin.js.map +1 -0
- package/dist/postinstall.d.ts +3 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +72 -0
- package/dist/postinstall.js.map +1 -0
- package/hooks/before-tool-call/HOOK.md +22 -0
- package/hooks/before-tool-call/handler.ts +285 -0
- package/hooks/clawguard/HOOK.md +53 -0
- package/hooks/clawguard/handler.d.ts +17 -0
- package/hooks/clawguard/handler.d.ts.map +1 -0
- package/hooks/clawguard/handler.js +271 -0
- package/hooks/clawguard/handler.js.map +1 -0
- package/hooks/clawguard/handler.ts +326 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# 🦞 Clawguard - Real-Time AI Agent Monitoring
|
|
2
|
+
|
|
3
|
+
Clawguard monitors your AI agent's activity in real-time. See everything your agent does, detect dangerous commands and prompt injection attacks.
|
|
4
|
+
|
|
5
|
+
## What Clawguard Does
|
|
6
|
+
|
|
7
|
+
**✓ Monitors:**
|
|
8
|
+
- Shell commands (rm, chmod, curl piped to bash, etc.)
|
|
9
|
+
- File writes and deletions
|
|
10
|
+
- Network requests
|
|
11
|
+
- Credential/environment access
|
|
12
|
+
- Prompt injection attempts
|
|
13
|
+
|
|
14
|
+
**✗ Clawguard does NOT:**
|
|
15
|
+
- Send data to external servers
|
|
16
|
+
- Modify your agent's core behavior
|
|
17
|
+
- Store data outside your machine
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
Just run:
|
|
22
|
+
```bash
|
|
23
|
+
npx averecion-clawguard start
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Your dashboard opens at `http://localhost:4321/clawguard`
|
|
27
|
+
|
|
28
|
+
Works on Windows, Mac, and Linux - no install needed!
|
|
29
|
+
|
|
30
|
+
### Optional: Install Globally
|
|
31
|
+
|
|
32
|
+
For frequent use, install globally:
|
|
33
|
+
```bash
|
|
34
|
+
npm install -g averecion-clawguard # add sudo on Mac/Linux if needed
|
|
35
|
+
clawguard start
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## How It Works
|
|
39
|
+
|
|
40
|
+
### Show Mode (First Run)
|
|
41
|
+
When first installed, Clawguard runs in "Show Mode" - it logs what it WOULD block but doesn't actually block anything. This lets you see how it works without disruption.
|
|
42
|
+
|
|
43
|
+
After 10 actions, you'll be prompted to enable full protection.
|
|
44
|
+
|
|
45
|
+
### Protection Levels
|
|
46
|
+
|
|
47
|
+
| Level | Description |
|
|
48
|
+
|-------|-------------|
|
|
49
|
+
| 😊 **Relaxed** | Only block the really dangerous stuff |
|
|
50
|
+
| ⚖️ **Balanced** | Ask before risky actions (recommended) |
|
|
51
|
+
| 🔒 **Strict** | Approve everything important |
|
|
52
|
+
|
|
53
|
+
## Commands
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Check status
|
|
57
|
+
openclaw clawguard status
|
|
58
|
+
|
|
59
|
+
# Open dashboard
|
|
60
|
+
openclaw clawguard dashboard
|
|
61
|
+
|
|
62
|
+
# Enable/disable protection
|
|
63
|
+
openclaw clawguard enable
|
|
64
|
+
openclaw clawguard disable
|
|
65
|
+
|
|
66
|
+
# Change protection level
|
|
67
|
+
openclaw clawguard level strict
|
|
68
|
+
|
|
69
|
+
# View recent activity
|
|
70
|
+
openclaw clawguard logs
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Dashboard
|
|
74
|
+
|
|
75
|
+
The Clawguard dashboard shows:
|
|
76
|
+
- Real-time action monitoring
|
|
77
|
+
- Blocked action history
|
|
78
|
+
- Approval requests
|
|
79
|
+
- Protection score
|
|
80
|
+
|
|
81
|
+
Access at: `http://127.0.0.1:4321/clawguard`
|
|
82
|
+
|
|
83
|
+
## Configuration
|
|
84
|
+
|
|
85
|
+
Config file: `~/.clawguard/config.json`
|
|
86
|
+
Logs: `~/.clawguard/logs/`
|
|
87
|
+
Custom policy: `~/.clawguard/policy.json`
|
|
88
|
+
|
|
89
|
+
## Transparency
|
|
90
|
+
|
|
91
|
+
Clawguard is:
|
|
92
|
+
- ✅ Open source
|
|
93
|
+
- ✅ Local-only (no cloud)
|
|
94
|
+
- ✅ No data collection
|
|
95
|
+
- ✅ Can be disabled anytime
|
|
96
|
+
|
|
97
|
+
## Support
|
|
98
|
+
|
|
99
|
+
- Issues: [github.com/averecion/clawguard](https://github.com/averecion/clawguard)
|
|
100
|
+
- Docs: [clawguard.dev](https://clawguard.dev)
|
|
101
|
+
- Full governance platform: [averecion.com](https://averecion.com)
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
Made with 🦞 by [Averecion](https://averecion.com)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "clawguard",
|
|
3
|
+
"name": "Clawguard",
|
|
4
|
+
"version": "2.0.3",
|
|
5
|
+
"description": "AI safety guardrails - monitors actions, blocks dangerous commands, requires approval for risky operations",
|
|
6
|
+
"homepage": "https://github.com/averecion/clawguard",
|
|
7
|
+
"author": "Averecion",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"configSchema": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"additionalProperties": false,
|
|
12
|
+
"properties": {
|
|
13
|
+
"protectionLevel": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"enum": ["relaxed", "balanced", "strict"],
|
|
16
|
+
"default": "balanced"
|
|
17
|
+
},
|
|
18
|
+
"dashboardPort": {
|
|
19
|
+
"type": "number",
|
|
20
|
+
"default": 4321
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"uiHints": {
|
|
25
|
+
"protectionLevel": {
|
|
26
|
+
"label": "Protection Level",
|
|
27
|
+
"placeholder": "balanced"
|
|
28
|
+
},
|
|
29
|
+
"dashboardPort": {
|
|
30
|
+
"label": "Dashboard Port",
|
|
31
|
+
"placeholder": "4321"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
20
|
+
if (mod && mod.__esModule) return mod;
|
|
21
|
+
var result = {};
|
|
22
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
23
|
+
__setModuleDefault(result, mod);
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
const consent_1 = require("./consent");
|
|
28
|
+
const hooks_1 = require("./hooks");
|
|
29
|
+
const child_process_1 = require("child_process");
|
|
30
|
+
const fs = __importStar(require("fs"));
|
|
31
|
+
const path = __importStar(require("path"));
|
|
32
|
+
const os = __importStar(require("os"));
|
|
33
|
+
const https = __importStar(require("https"));
|
|
34
|
+
const LOG_DIR = path.join(os.homedir(), ".clawguard", "logs");
|
|
35
|
+
const PACKAGE_NAME = "averecion-clawguard";
|
|
36
|
+
const CURRENT_VERSION = "2.7.0";
|
|
37
|
+
function checkForUpdates() {
|
|
38
|
+
const url = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
39
|
+
const req = https.get(url, { timeout: 3000 }, (res) => {
|
|
40
|
+
let data = "";
|
|
41
|
+
res.on("data", (chunk) => { data += chunk; });
|
|
42
|
+
res.on("end", () => {
|
|
43
|
+
try {
|
|
44
|
+
const latest = JSON.parse(data).version;
|
|
45
|
+
if (latest && latest !== CURRENT_VERSION) {
|
|
46
|
+
const parts = (v) => v.split(".").map(Number);
|
|
47
|
+
const cur = parts(CURRENT_VERSION);
|
|
48
|
+
const lat = parts(latest);
|
|
49
|
+
const isNewer = lat[0] > cur[0] || (lat[0] === cur[0] && lat[1] > cur[1]) || (lat[0] === cur[0] && lat[1] === cur[1] && lat[2] > cur[2]);
|
|
50
|
+
if (isNewer) {
|
|
51
|
+
console.log(`\x1b[33m ⬆ Update available: v${CURRENT_VERSION} → v${latest}\x1b[0m`);
|
|
52
|
+
console.log(`\x1b[33m Run: npx averecion-clawguard@latest start\x1b[0m\n`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch { }
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
req.on("error", () => { });
|
|
60
|
+
req.end();
|
|
61
|
+
}
|
|
62
|
+
const args = process.argv.slice(2);
|
|
63
|
+
const command = args[0];
|
|
64
|
+
function printStatus() {
|
|
65
|
+
const config = (0, consent_1.loadConfig)();
|
|
66
|
+
console.log(`
|
|
67
|
+
\x1b[31m🦞 Clawguard v${CURRENT_VERSION}\x1b[0m - Status
|
|
68
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
69
|
+
|
|
70
|
+
Monitoring: ${config.enabled ? "\x1b[32mActive\x1b[0m" : "\x1b[31mOff\x1b[0m"}
|
|
71
|
+
Alert Level: \x1b[1m${config.protectionLevel}\x1b[0m
|
|
72
|
+
Show Mode: ${config.showMode ? `\x1b[33mActive (${config.showModeActionsRemaining} actions left)\x1b[0m` : "\x1b[32mComplete\x1b[0m"}
|
|
73
|
+
Configured: ${config.consented ? `\x1b[32mYes\x1b[0m (${config.consentedAt})` : "\x1b[31mNo\x1b[0m"}
|
|
74
|
+
`);
|
|
75
|
+
// Show recent activity
|
|
76
|
+
const today = new Date().toISOString().split("T")[0];
|
|
77
|
+
const logFile = path.join(LOG_DIR, `${today}.jsonl`);
|
|
78
|
+
if (fs.existsSync(logFile)) {
|
|
79
|
+
const lines = fs.readFileSync(logFile, "utf-8").trim().split("\n");
|
|
80
|
+
const recentCount = lines.length;
|
|
81
|
+
const flagged = lines.filter(l => {
|
|
82
|
+
try {
|
|
83
|
+
return !JSON.parse(l).allowed;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}).length;
|
|
89
|
+
console.log(`Today's Activity:
|
|
90
|
+
Total actions: ${recentCount}
|
|
91
|
+
Flagged: ${flagged}
|
|
92
|
+
`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.log("Today's Activity: No actions logged yet.\n");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function enableMonitoring() {
|
|
99
|
+
const config = (0, consent_1.loadConfig)();
|
|
100
|
+
config.enabled = true;
|
|
101
|
+
config.showMode = false;
|
|
102
|
+
(0, consent_1.saveConfig)(config);
|
|
103
|
+
console.log("\x1b[32m✓ Clawguard monitoring enabled!\x1b[0m");
|
|
104
|
+
}
|
|
105
|
+
function disableMonitoring() {
|
|
106
|
+
const config = (0, consent_1.loadConfig)();
|
|
107
|
+
config.enabled = false;
|
|
108
|
+
(0, consent_1.saveConfig)(config);
|
|
109
|
+
console.log("\x1b[33m⚠ Clawguard monitoring disabled.\x1b[0m");
|
|
110
|
+
console.log("Run 'openclaw clawguard enable' to re-enable.");
|
|
111
|
+
}
|
|
112
|
+
async function startServer() {
|
|
113
|
+
let config = (0, consent_1.loadConfig)();
|
|
114
|
+
// Run onboarding if user hasn't consented yet
|
|
115
|
+
if (!config.consented) {
|
|
116
|
+
console.log("\n\x1b[36m👋 Welcome to Clawguard! Let's set things up first.\x1b[0m\n");
|
|
117
|
+
await (0, consent_1.runConsentFlow)();
|
|
118
|
+
// Reload config after consent flow saves it
|
|
119
|
+
config = (0, consent_1.loadConfig)();
|
|
120
|
+
}
|
|
121
|
+
const port = 4321;
|
|
122
|
+
// Set the secret before importing - use config secret, env override, or default
|
|
123
|
+
const secret = process.env.CLAWGUARD_SECRET || config.secret || "clawguard-local";
|
|
124
|
+
process.env.LITE_ADAPTER_SECRET = secret;
|
|
125
|
+
process.env.PORT = String(port);
|
|
126
|
+
console.log(`
|
|
127
|
+
\x1b[31m🦞 Clawguard v${CURRENT_VERSION}\x1b[0m - Starting monitoring server...
|
|
128
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
129
|
+
|
|
130
|
+
Dashboard: http://localhost:${port}/clawguard
|
|
131
|
+
Log files: ~/.clawguard/logs/
|
|
132
|
+
|
|
133
|
+
Press Ctrl+C to stop.
|
|
134
|
+
`);
|
|
135
|
+
checkForUpdates();
|
|
136
|
+
try {
|
|
137
|
+
// Import and start the server properly
|
|
138
|
+
// @ts-ignore - dynamic import at runtime
|
|
139
|
+
const serverModule = require("averecion-lite/dist/server.js");
|
|
140
|
+
await serverModule.startServer(port, "0.0.0.0");
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
console.log(`\x1b[31mError starting server: ${err.message}\x1b[0m`);
|
|
144
|
+
console.log("Try running: npm install -g averecion-lite");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function openDashboard() {
|
|
148
|
+
const port = 4321;
|
|
149
|
+
console.log(`\x1b[36m🦞 Opening Clawguard dashboard...\x1b[0m`);
|
|
150
|
+
console.log(` http://127.0.0.1:${port}/clawguard\n`);
|
|
151
|
+
// Try to start the dashboard server if not running
|
|
152
|
+
try {
|
|
153
|
+
const lite = (0, child_process_1.spawn)("npx", ["averecion-lite", "start"], {
|
|
154
|
+
detached: true,
|
|
155
|
+
stdio: "ignore",
|
|
156
|
+
env: {
|
|
157
|
+
...process.env,
|
|
158
|
+
LITE_ADAPTER_SECRET: process.env.CLAWGUARD_SECRET || "clawguard-local"
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
lite.unref();
|
|
162
|
+
}
|
|
163
|
+
catch { }
|
|
164
|
+
// Open browser
|
|
165
|
+
const platform = process.platform;
|
|
166
|
+
const openCmd = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
|
|
167
|
+
(0, child_process_1.spawn)(openCmd, [`http://127.0.0.1:${port}/clawguard`], {
|
|
168
|
+
detached: true,
|
|
169
|
+
stdio: "ignore"
|
|
170
|
+
}).unref();
|
|
171
|
+
}
|
|
172
|
+
function setAlertLevel(level) {
|
|
173
|
+
if (!["relaxed", "balanced", "strict"].includes(level)) {
|
|
174
|
+
console.log("\x1b[31mError: Level must be 'relaxed', 'balanced', or 'strict'\x1b[0m");
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const config = (0, consent_1.loadConfig)();
|
|
178
|
+
config.protectionLevel = level;
|
|
179
|
+
(0, consent_1.saveConfig)(config);
|
|
180
|
+
console.log(`\x1b[32m✓ Alert level set to: ${level}\x1b[0m`);
|
|
181
|
+
}
|
|
182
|
+
function showLogs(count = 20) {
|
|
183
|
+
const today = new Date().toISOString().split("T")[0];
|
|
184
|
+
const logFile = path.join(LOG_DIR, `${today}.jsonl`);
|
|
185
|
+
if (!fs.existsSync(logFile)) {
|
|
186
|
+
console.log("No logs for today.");
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const lines = fs.readFileSync(logFile, "utf-8").trim().split("\n").slice(-count);
|
|
190
|
+
console.log(`\x1b[1mRecent Activity (last ${lines.length} entries):\x1b[0m\n`);
|
|
191
|
+
for (const line of lines) {
|
|
192
|
+
try {
|
|
193
|
+
const entry = JSON.parse(line);
|
|
194
|
+
const icon = entry.allowed ? "\x1b[32m✓\x1b[0m" : "\x1b[31m✗\x1b[0m";
|
|
195
|
+
const time = entry.ts.split("T")[1].split(".")[0];
|
|
196
|
+
console.log(`${icon} [${time}] ${entry.tool} - ${entry.reason}`);
|
|
197
|
+
}
|
|
198
|
+
catch { }
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function showFlagged() {
|
|
202
|
+
const pending = (0, hooks_1.listPendingApprovals)();
|
|
203
|
+
if (pending.length === 0) {
|
|
204
|
+
console.log("\x1b[32m✓ No flagged actions to review\x1b[0m");
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
console.log(`\x1b[1mFlagged Actions (${pending.length}):\x1b[0m\n`);
|
|
208
|
+
for (const p of pending) {
|
|
209
|
+
const time = p.createdAt.split("T")[1].split(".")[0];
|
|
210
|
+
console.log(` \x1b[33m${p.id}\x1b[0m`);
|
|
211
|
+
console.log(` Tool: ${p.tool}`);
|
|
212
|
+
console.log(` Reason: ${p.reason}`);
|
|
213
|
+
console.log(` Time: ${time}`);
|
|
214
|
+
console.log("");
|
|
215
|
+
}
|
|
216
|
+
console.log("To mark reviewed: openclaw clawguard ack <id>");
|
|
217
|
+
console.log("To investigate: openclaw clawguard investigate <id>");
|
|
218
|
+
}
|
|
219
|
+
function handleAck(id) {
|
|
220
|
+
if (!id) {
|
|
221
|
+
console.log("\x1b[31mError: Please provide a flagged action ID\x1b[0m");
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if ((0, hooks_1.approveAction)(id)) {
|
|
225
|
+
console.log(`\x1b[32m✓ Acknowledged: ${id}\x1b[0m`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.log(`\x1b[31mError: Could not find flagged action ${id}\x1b[0m`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function handleInvestigate(id) {
|
|
232
|
+
if (!id) {
|
|
233
|
+
console.log("\x1b[31mError: Please provide a flagged action ID\x1b[0m");
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if ((0, hooks_1.denyAction)(id)) {
|
|
237
|
+
console.log(`\x1b[33m🔍 Marked for investigation: ${id}\x1b[0m`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
console.log(`\x1b[31mError: Could not find flagged action ${id}\x1b[0m`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function printHelp() {
|
|
244
|
+
console.log(`
|
|
245
|
+
\x1b[31m🦞 Clawguard\x1b[0m - AI Safety for OpenClaw
|
|
246
|
+
|
|
247
|
+
\x1b[1mUsage:\x1b[0m
|
|
248
|
+
openclaw clawguard <command>
|
|
249
|
+
|
|
250
|
+
\x1b[1mCommands:\x1b[0m
|
|
251
|
+
start Start the monitoring server
|
|
252
|
+
status Show current monitoring status
|
|
253
|
+
dashboard Open the dashboard in browser
|
|
254
|
+
level <level> Set alert sensitivity (relaxed|balanced|strict)
|
|
255
|
+
logs [count] Show recent activity logs
|
|
256
|
+
flagged Show flagged actions awaiting review
|
|
257
|
+
ack <id> Mark a flagged action as reviewed
|
|
258
|
+
investigate <id> Mark an action for investigation
|
|
259
|
+
setup Re-run the setup wizard
|
|
260
|
+
help Show this help message
|
|
261
|
+
|
|
262
|
+
\x1b[1mExamples:\x1b[0m
|
|
263
|
+
clawguard start
|
|
264
|
+
clawguard status
|
|
265
|
+
clawguard logs 50
|
|
266
|
+
`);
|
|
267
|
+
}
|
|
268
|
+
async function main() {
|
|
269
|
+
switch (command) {
|
|
270
|
+
case "start":
|
|
271
|
+
await startServer();
|
|
272
|
+
break;
|
|
273
|
+
case "status":
|
|
274
|
+
printStatus();
|
|
275
|
+
break;
|
|
276
|
+
case "enable":
|
|
277
|
+
enableMonitoring();
|
|
278
|
+
break;
|
|
279
|
+
case "disable":
|
|
280
|
+
disableMonitoring();
|
|
281
|
+
break;
|
|
282
|
+
case "dashboard":
|
|
283
|
+
openDashboard();
|
|
284
|
+
break;
|
|
285
|
+
case "level":
|
|
286
|
+
setAlertLevel(args[1]);
|
|
287
|
+
break;
|
|
288
|
+
case "logs":
|
|
289
|
+
showLogs(parseInt(args[1]) || 20);
|
|
290
|
+
break;
|
|
291
|
+
case "pending":
|
|
292
|
+
case "flagged":
|
|
293
|
+
showFlagged();
|
|
294
|
+
break;
|
|
295
|
+
case "approve":
|
|
296
|
+
case "ack":
|
|
297
|
+
handleAck(args[1]);
|
|
298
|
+
break;
|
|
299
|
+
case "deny":
|
|
300
|
+
case "investigate":
|
|
301
|
+
handleInvestigate(args[1]);
|
|
302
|
+
break;
|
|
303
|
+
case "setup":
|
|
304
|
+
await (0, consent_1.runConsentFlow)();
|
|
305
|
+
break;
|
|
306
|
+
case "help":
|
|
307
|
+
case "--help":
|
|
308
|
+
case "-h":
|
|
309
|
+
printHelp();
|
|
310
|
+
break;
|
|
311
|
+
default:
|
|
312
|
+
printHelp();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
main();
|
|
316
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface ClawguardConfig {
|
|
2
|
+
consented: boolean;
|
|
3
|
+
consentedAt: string | null;
|
|
4
|
+
showMode: boolean;
|
|
5
|
+
showModeActionsRemaining: number;
|
|
6
|
+
protectionLevel: "relaxed" | "balanced" | "strict";
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
secret: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function loadConfig(): ClawguardConfig;
|
|
11
|
+
export declare function saveConfig(config: ClawguardConfig): void;
|
|
12
|
+
export declare function runConsentFlow(): Promise<boolean>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=consent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../src/consent.ts"],"names":[],"mappings":"AAQA,UAAU,eAAe;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;IACjC,eAAe,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAgBD,wBAAgB,UAAU,IAAI,eAAe,CAY5C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAKxD;AAyED,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CA6CvD"}
|
package/dist/consent.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.loadConfig = loadConfig;
|
|
27
|
+
exports.saveConfig = saveConfig;
|
|
28
|
+
exports.runConsentFlow = runConsentFlow;
|
|
29
|
+
const fs = __importStar(require("fs"));
|
|
30
|
+
const path = __importStar(require("path"));
|
|
31
|
+
const readline = __importStar(require("readline"));
|
|
32
|
+
const os = __importStar(require("os"));
|
|
33
|
+
const CONFIG_DIR = path.join(os.homedir(), ".clawguard");
|
|
34
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
|
|
35
|
+
const DEFAULT_SECRET = "clawguard-local";
|
|
36
|
+
function getDefaultConfig() {
|
|
37
|
+
return {
|
|
38
|
+
consented: false,
|
|
39
|
+
consentedAt: null,
|
|
40
|
+
showMode: true,
|
|
41
|
+
showModeActionsRemaining: 10,
|
|
42
|
+
protectionLevel: "balanced",
|
|
43
|
+
enabled: true,
|
|
44
|
+
secret: DEFAULT_SECRET
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function loadConfig() {
|
|
48
|
+
try {
|
|
49
|
+
if (fs.existsSync(CONFIG_FILE)) {
|
|
50
|
+
const config = JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8"));
|
|
51
|
+
// Ensure secret field exists for backwards compatibility
|
|
52
|
+
if (!config.secret) {
|
|
53
|
+
config.secret = DEFAULT_SECRET;
|
|
54
|
+
}
|
|
55
|
+
return config;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch { }
|
|
59
|
+
return getDefaultConfig();
|
|
60
|
+
}
|
|
61
|
+
function saveConfig(config) {
|
|
62
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
63
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
66
|
+
}
|
|
67
|
+
function printBanner() {
|
|
68
|
+
console.log(`
|
|
69
|
+
\x1b[31m🦞 Clawguard\x1b[0m - AI Safety for OpenClaw
|
|
70
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
71
|
+
|
|
72
|
+
Clawguard monitors your agent's actions in real-time.
|
|
73
|
+
Before installing, please review what it does:
|
|
74
|
+
|
|
75
|
+
\x1b[32m✓ What Clawguard WILL do:\x1b[0m
|
|
76
|
+
• Watch your agent's tool calls as they happen
|
|
77
|
+
• Detect dangerous commands (rm -rf, credential theft, etc.)
|
|
78
|
+
• Flag prompt injection attempts
|
|
79
|
+
• Log everything locally (viewable in dashboard)
|
|
80
|
+
|
|
81
|
+
\x1b[31m✗ What Clawguard will NOT do:\x1b[0m
|
|
82
|
+
• Send data to external servers
|
|
83
|
+
• Modify your agent's behavior
|
|
84
|
+
• Store data outside your machine
|
|
85
|
+
|
|
86
|
+
\x1b[33m📊 Show Mode (First Run):\x1b[0m
|
|
87
|
+
Clawguard starts in "Show Mode" - observing and logging
|
|
88
|
+
without sending alerts. After 10 actions, you can
|
|
89
|
+
enable full monitoring with alerts.
|
|
90
|
+
|
|
91
|
+
\x1b[36m🔓 You can disable Clawguard anytime with:\x1b[0m
|
|
92
|
+
openclaw clawguard disable
|
|
93
|
+
|
|
94
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
95
|
+
`);
|
|
96
|
+
}
|
|
97
|
+
async function askConsent() {
|
|
98
|
+
const rl = readline.createInterface({
|
|
99
|
+
input: process.stdin,
|
|
100
|
+
output: process.stdout
|
|
101
|
+
});
|
|
102
|
+
return new Promise((resolve) => {
|
|
103
|
+
rl.question("\x1b[1mDo you consent to install Clawguard? [Y/n] \x1b[0m", (answer) => {
|
|
104
|
+
rl.close();
|
|
105
|
+
const normalized = answer.trim().toLowerCase();
|
|
106
|
+
resolve(normalized === "" || normalized === "y" || normalized === "yes");
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async function chooseProtectionLevel() {
|
|
111
|
+
const rl = readline.createInterface({
|
|
112
|
+
input: process.stdin,
|
|
113
|
+
output: process.stdout
|
|
114
|
+
});
|
|
115
|
+
console.log(`
|
|
116
|
+
\x1b[1mChoose your alert sensitivity:\x1b[0m
|
|
117
|
+
|
|
118
|
+
\x1b[32m1) Relaxed\x1b[0m - Flag only critical threats
|
|
119
|
+
\x1b[33m2) Balanced\x1b[0m - Flag risky actions for review (recommended)
|
|
120
|
+
\x1b[31m3) Strict\x1b[0m - Flag everything for full visibility
|
|
121
|
+
`);
|
|
122
|
+
return new Promise((resolve) => {
|
|
123
|
+
rl.question("Enter 1, 2, or 3 [default: 2]: ", (answer) => {
|
|
124
|
+
rl.close();
|
|
125
|
+
const choice = answer.trim();
|
|
126
|
+
if (choice === "1")
|
|
127
|
+
return resolve("relaxed");
|
|
128
|
+
if (choice === "3")
|
|
129
|
+
return resolve("strict");
|
|
130
|
+
return resolve("balanced");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
async function runConsentFlow() {
|
|
135
|
+
const config = loadConfig();
|
|
136
|
+
if (config.consented) {
|
|
137
|
+
console.log("\x1b[32m✓ Clawguard already configured.\x1b[0m");
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
printBanner();
|
|
141
|
+
const consented = await askConsent();
|
|
142
|
+
if (!consented) {
|
|
143
|
+
console.log("\n\x1b[33mInstallation cancelled. You can run this again anytime.\x1b[0m\n");
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
const level = await chooseProtectionLevel();
|
|
147
|
+
config.consented = true;
|
|
148
|
+
config.consentedAt = new Date().toISOString();
|
|
149
|
+
config.protectionLevel = level;
|
|
150
|
+
config.showMode = true;
|
|
151
|
+
config.showModeActionsRemaining = 10;
|
|
152
|
+
config.enabled = true;
|
|
153
|
+
config.secret = DEFAULT_SECRET;
|
|
154
|
+
saveConfig(config);
|
|
155
|
+
console.log(`
|
|
156
|
+
\x1b[32m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
157
|
+
✓ Clawguard installed successfully!
|
|
158
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m
|
|
159
|
+
|
|
160
|
+
Protection level: \x1b[1m${level}\x1b[0m
|
|
161
|
+
Mode: \x1b[33mShow Mode\x1b[0m (observing first 10 actions)
|
|
162
|
+
|
|
163
|
+
\x1b[36mView your dashboard:\x1b[0m
|
|
164
|
+
openclaw clawguard dashboard
|
|
165
|
+
|
|
166
|
+
\x1b[36mCheck status:\x1b[0m
|
|
167
|
+
openclaw clawguard status
|
|
168
|
+
`);
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
if (require.main === module) {
|
|
172
|
+
runConsentFlow().then((success) => {
|
|
173
|
+
process.exit(success ? 0 : 1);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=consent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent.js","sourceRoot":"","sources":["../src/consent.ts"],"names":[],"mappings":"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"}
|