@stanchat/clawguard 2.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 +95 -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 +288 -0
- package/dist/cli.js.map +1 -0
- package/dist/consent.d.ts +13 -0
- package/dist/consent.d.ts.map +1 -0
- package/dist/consent.js +178 -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 +351 -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 +229 -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 +82 -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,95 @@
|
|
|
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
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -g clawguard
|
|
23
|
+
clawguard start
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Your dashboard opens at `http://localhost:4321/clawguard`
|
|
27
|
+
|
|
28
|
+
## How It Works
|
|
29
|
+
|
|
30
|
+
### Show Mode (First Run)
|
|
31
|
+
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.
|
|
32
|
+
|
|
33
|
+
After 10 actions, you'll be prompted to enable full protection.
|
|
34
|
+
|
|
35
|
+
### Protection Levels
|
|
36
|
+
|
|
37
|
+
| Level | Description |
|
|
38
|
+
|-------|-------------|
|
|
39
|
+
| 😊 **Relaxed** | Only block the really dangerous stuff |
|
|
40
|
+
| ⚖️ **Balanced** | Ask before risky actions (recommended) |
|
|
41
|
+
| 🔒 **Strict** | Approve everything important |
|
|
42
|
+
|
|
43
|
+
## Commands
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Check status
|
|
47
|
+
openclaw clawguard status
|
|
48
|
+
|
|
49
|
+
# Open dashboard
|
|
50
|
+
openclaw clawguard dashboard
|
|
51
|
+
|
|
52
|
+
# Enable/disable protection
|
|
53
|
+
openclaw clawguard enable
|
|
54
|
+
openclaw clawguard disable
|
|
55
|
+
|
|
56
|
+
# Change protection level
|
|
57
|
+
openclaw clawguard level strict
|
|
58
|
+
|
|
59
|
+
# View recent activity
|
|
60
|
+
openclaw clawguard logs
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Dashboard
|
|
64
|
+
|
|
65
|
+
The Clawguard dashboard shows:
|
|
66
|
+
- Real-time action monitoring
|
|
67
|
+
- Blocked action history
|
|
68
|
+
- Approval requests
|
|
69
|
+
- Protection score
|
|
70
|
+
|
|
71
|
+
Access at: `http://127.0.0.1:4321/clawguard`
|
|
72
|
+
|
|
73
|
+
## Configuration
|
|
74
|
+
|
|
75
|
+
Config file: `~/.clawguard/config.json`
|
|
76
|
+
Logs: `~/.clawguard/logs/`
|
|
77
|
+
Custom policy: `~/.clawguard/policy.json`
|
|
78
|
+
|
|
79
|
+
## Transparency
|
|
80
|
+
|
|
81
|
+
Clawguard is:
|
|
82
|
+
- ✅ Open source
|
|
83
|
+
- ✅ Local-only (no cloud)
|
|
84
|
+
- ✅ No data collection
|
|
85
|
+
- ✅ Can be disabled anytime
|
|
86
|
+
|
|
87
|
+
## Support
|
|
88
|
+
|
|
89
|
+
- Issues: [github.com/averecion/clawguard](https://github.com/averecion/clawguard)
|
|
90
|
+
- Docs: [clawguard.dev](https://clawguard.dev)
|
|
91
|
+
- Full governance platform: [averecion.com](https://averecion.com)
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
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,288 @@
|
|
|
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 () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const consent_1 = require("./consent");
|
|
38
|
+
const hooks_1 = require("./hooks");
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const LOG_DIR = path.join(os.homedir(), ".clawguard", "logs");
|
|
44
|
+
const args = process.argv.slice(2);
|
|
45
|
+
const command = args[0];
|
|
46
|
+
function printStatus() {
|
|
47
|
+
const config = (0, consent_1.loadConfig)();
|
|
48
|
+
console.log(`
|
|
49
|
+
\x1b[31m🦞 Clawguard Status\x1b[0m
|
|
50
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
51
|
+
|
|
52
|
+
Monitoring: ${config.enabled ? "\x1b[32mActive\x1b[0m" : "\x1b[31mOff\x1b[0m"}
|
|
53
|
+
Alert Level: \x1b[1m${config.protectionLevel}\x1b[0m
|
|
54
|
+
Show Mode: ${config.showMode ? `\x1b[33mActive (${config.showModeActionsRemaining} actions left)\x1b[0m` : "\x1b[32mComplete\x1b[0m"}
|
|
55
|
+
Configured: ${config.consented ? `\x1b[32mYes\x1b[0m (${config.consentedAt})` : "\x1b[31mNo\x1b[0m"}
|
|
56
|
+
`);
|
|
57
|
+
// Show recent activity
|
|
58
|
+
const today = new Date().toISOString().split("T")[0];
|
|
59
|
+
const logFile = path.join(LOG_DIR, `${today}.jsonl`);
|
|
60
|
+
if (fs.existsSync(logFile)) {
|
|
61
|
+
const lines = fs.readFileSync(logFile, "utf-8").trim().split("\n");
|
|
62
|
+
const recentCount = lines.length;
|
|
63
|
+
const flagged = lines.filter(l => {
|
|
64
|
+
try {
|
|
65
|
+
return !JSON.parse(l).allowed;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}).length;
|
|
71
|
+
console.log(`Today's Activity:
|
|
72
|
+
Total actions: ${recentCount}
|
|
73
|
+
Flagged: ${flagged}
|
|
74
|
+
`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log("Today's Activity: No actions logged yet.\n");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function enableMonitoring() {
|
|
81
|
+
const config = (0, consent_1.loadConfig)();
|
|
82
|
+
config.enabled = true;
|
|
83
|
+
config.showMode = false;
|
|
84
|
+
(0, consent_1.saveConfig)(config);
|
|
85
|
+
console.log("\x1b[32m✓ Clawguard monitoring enabled!\x1b[0m");
|
|
86
|
+
}
|
|
87
|
+
function disableMonitoring() {
|
|
88
|
+
const config = (0, consent_1.loadConfig)();
|
|
89
|
+
config.enabled = false;
|
|
90
|
+
(0, consent_1.saveConfig)(config);
|
|
91
|
+
console.log("\x1b[33m⚠ Clawguard monitoring disabled.\x1b[0m");
|
|
92
|
+
console.log("Run 'openclaw clawguard enable' to re-enable.");
|
|
93
|
+
}
|
|
94
|
+
function startServer() {
|
|
95
|
+
const port = 4321;
|
|
96
|
+
console.log(`
|
|
97
|
+
\x1b[31m🦞 Clawguard\x1b[0m - Starting monitoring server...
|
|
98
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
99
|
+
|
|
100
|
+
Dashboard: http://localhost:${port}/clawguard
|
|
101
|
+
Log files: ~/.clawguard/logs/
|
|
102
|
+
|
|
103
|
+
Press Ctrl+C to stop.
|
|
104
|
+
`);
|
|
105
|
+
// Start the server in foreground
|
|
106
|
+
const server = (0, child_process_1.spawn)("node", [require.resolve("averecion-lite/dist/server.js")], {
|
|
107
|
+
stdio: "inherit",
|
|
108
|
+
env: {
|
|
109
|
+
...process.env,
|
|
110
|
+
PORT: String(port),
|
|
111
|
+
LITE_ADAPTER_SECRET: process.env.CLAWGUARD_SECRET || "clawguard-local"
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
server.on("error", (err) => {
|
|
115
|
+
console.log(`\x1b[31mError starting server: ${err.message}\x1b[0m`);
|
|
116
|
+
console.log("Try running: npm install -g averecion-lite");
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function openDashboard() {
|
|
120
|
+
const port = 4321;
|
|
121
|
+
console.log(`\x1b[36m🦞 Opening Clawguard dashboard...\x1b[0m`);
|
|
122
|
+
console.log(` http://127.0.0.1:${port}/clawguard\n`);
|
|
123
|
+
// Try to start the dashboard server if not running
|
|
124
|
+
try {
|
|
125
|
+
const lite = (0, child_process_1.spawn)("npx", ["averecion-lite", "start"], {
|
|
126
|
+
detached: true,
|
|
127
|
+
stdio: "ignore",
|
|
128
|
+
env: {
|
|
129
|
+
...process.env,
|
|
130
|
+
LITE_ADAPTER_SECRET: process.env.CLAWGUARD_SECRET || "clawguard-local"
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
lite.unref();
|
|
134
|
+
}
|
|
135
|
+
catch { }
|
|
136
|
+
// Open browser
|
|
137
|
+
const platform = process.platform;
|
|
138
|
+
const openCmd = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
|
|
139
|
+
(0, child_process_1.spawn)(openCmd, [`http://127.0.0.1:${port}/clawguard`], {
|
|
140
|
+
detached: true,
|
|
141
|
+
stdio: "ignore"
|
|
142
|
+
}).unref();
|
|
143
|
+
}
|
|
144
|
+
function setAlertLevel(level) {
|
|
145
|
+
if (!["relaxed", "balanced", "strict"].includes(level)) {
|
|
146
|
+
console.log("\x1b[31mError: Level must be 'relaxed', 'balanced', or 'strict'\x1b[0m");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const config = (0, consent_1.loadConfig)();
|
|
150
|
+
config.protectionLevel = level;
|
|
151
|
+
(0, consent_1.saveConfig)(config);
|
|
152
|
+
console.log(`\x1b[32m✓ Alert level set to: ${level}\x1b[0m`);
|
|
153
|
+
}
|
|
154
|
+
function showLogs(count = 20) {
|
|
155
|
+
const today = new Date().toISOString().split("T")[0];
|
|
156
|
+
const logFile = path.join(LOG_DIR, `${today}.jsonl`);
|
|
157
|
+
if (!fs.existsSync(logFile)) {
|
|
158
|
+
console.log("No logs for today.");
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const lines = fs.readFileSync(logFile, "utf-8").trim().split("\n").slice(-count);
|
|
162
|
+
console.log(`\x1b[1mRecent Activity (last ${lines.length} entries):\x1b[0m\n`);
|
|
163
|
+
for (const line of lines) {
|
|
164
|
+
try {
|
|
165
|
+
const entry = JSON.parse(line);
|
|
166
|
+
const icon = entry.allowed ? "\x1b[32m✓\x1b[0m" : "\x1b[31m✗\x1b[0m";
|
|
167
|
+
const time = entry.ts.split("T")[1].split(".")[0];
|
|
168
|
+
console.log(`${icon} [${time}] ${entry.tool} - ${entry.reason}`);
|
|
169
|
+
}
|
|
170
|
+
catch { }
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function showFlagged() {
|
|
174
|
+
const pending = (0, hooks_1.listPendingApprovals)();
|
|
175
|
+
if (pending.length === 0) {
|
|
176
|
+
console.log("\x1b[32m✓ No flagged actions to review\x1b[0m");
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
console.log(`\x1b[1mFlagged Actions (${pending.length}):\x1b[0m\n`);
|
|
180
|
+
for (const p of pending) {
|
|
181
|
+
const time = p.createdAt.split("T")[1].split(".")[0];
|
|
182
|
+
console.log(` \x1b[33m${p.id}\x1b[0m`);
|
|
183
|
+
console.log(` Tool: ${p.tool}`);
|
|
184
|
+
console.log(` Reason: ${p.reason}`);
|
|
185
|
+
console.log(` Time: ${time}`);
|
|
186
|
+
console.log("");
|
|
187
|
+
}
|
|
188
|
+
console.log("To mark reviewed: openclaw clawguard ack <id>");
|
|
189
|
+
console.log("To investigate: openclaw clawguard investigate <id>");
|
|
190
|
+
}
|
|
191
|
+
function handleAck(id) {
|
|
192
|
+
if (!id) {
|
|
193
|
+
console.log("\x1b[31mError: Please provide a flagged action ID\x1b[0m");
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if ((0, hooks_1.approveAction)(id)) {
|
|
197
|
+
console.log(`\x1b[32m✓ Acknowledged: ${id}\x1b[0m`);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
console.log(`\x1b[31mError: Could not find flagged action ${id}\x1b[0m`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function handleInvestigate(id) {
|
|
204
|
+
if (!id) {
|
|
205
|
+
console.log("\x1b[31mError: Please provide a flagged action ID\x1b[0m");
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if ((0, hooks_1.denyAction)(id)) {
|
|
209
|
+
console.log(`\x1b[33m🔍 Marked for investigation: ${id}\x1b[0m`);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
console.log(`\x1b[31mError: Could not find flagged action ${id}\x1b[0m`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function printHelp() {
|
|
216
|
+
console.log(`
|
|
217
|
+
\x1b[31m🦞 Clawguard\x1b[0m - AI Safety for OpenClaw
|
|
218
|
+
|
|
219
|
+
\x1b[1mUsage:\x1b[0m
|
|
220
|
+
openclaw clawguard <command>
|
|
221
|
+
|
|
222
|
+
\x1b[1mCommands:\x1b[0m
|
|
223
|
+
start Start the monitoring server
|
|
224
|
+
status Show current monitoring status
|
|
225
|
+
dashboard Open the dashboard in browser
|
|
226
|
+
level <level> Set alert sensitivity (relaxed|balanced|strict)
|
|
227
|
+
logs [count] Show recent activity logs
|
|
228
|
+
flagged Show flagged actions awaiting review
|
|
229
|
+
ack <id> Mark a flagged action as reviewed
|
|
230
|
+
investigate <id> Mark an action for investigation
|
|
231
|
+
setup Re-run the setup wizard
|
|
232
|
+
help Show this help message
|
|
233
|
+
|
|
234
|
+
\x1b[1mExamples:\x1b[0m
|
|
235
|
+
clawguard start
|
|
236
|
+
clawguard status
|
|
237
|
+
clawguard logs 50
|
|
238
|
+
`);
|
|
239
|
+
}
|
|
240
|
+
async function main() {
|
|
241
|
+
switch (command) {
|
|
242
|
+
case "start":
|
|
243
|
+
startServer();
|
|
244
|
+
break;
|
|
245
|
+
case "status":
|
|
246
|
+
printStatus();
|
|
247
|
+
break;
|
|
248
|
+
case "enable":
|
|
249
|
+
enableMonitoring();
|
|
250
|
+
break;
|
|
251
|
+
case "disable":
|
|
252
|
+
disableMonitoring();
|
|
253
|
+
break;
|
|
254
|
+
case "dashboard":
|
|
255
|
+
openDashboard();
|
|
256
|
+
break;
|
|
257
|
+
case "level":
|
|
258
|
+
setAlertLevel(args[1]);
|
|
259
|
+
break;
|
|
260
|
+
case "logs":
|
|
261
|
+
showLogs(parseInt(args[1]) || 20);
|
|
262
|
+
break;
|
|
263
|
+
case "pending":
|
|
264
|
+
case "flagged":
|
|
265
|
+
showFlagged();
|
|
266
|
+
break;
|
|
267
|
+
case "approve":
|
|
268
|
+
case "ack":
|
|
269
|
+
handleAck(args[1]);
|
|
270
|
+
break;
|
|
271
|
+
case "deny":
|
|
272
|
+
case "investigate":
|
|
273
|
+
handleInvestigate(args[1]);
|
|
274
|
+
break;
|
|
275
|
+
case "setup":
|
|
276
|
+
await (0, consent_1.runConsentFlow)();
|
|
277
|
+
break;
|
|
278
|
+
case "help":
|
|
279
|
+
case "--help":
|
|
280
|
+
case "-h":
|
|
281
|
+
printHelp();
|
|
282
|
+
break;
|
|
283
|
+
default:
|
|
284
|
+
printHelp();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
main();
|
|
288
|
+
//# 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,13 @@
|
|
|
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
|
+
}
|
|
9
|
+
export declare function loadConfig(): ClawguardConfig;
|
|
10
|
+
export declare function saveConfig(config: ClawguardConfig): void;
|
|
11
|
+
export declare function runConsentFlow(): Promise<boolean>;
|
|
12
|
+
export {};
|
|
13
|
+
//# 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;CAClB;AAaD,wBAAgB,UAAU,IAAI,eAAe,CAO5C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAKxD;AAyED,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CA4CvD"}
|
package/dist/consent.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.loadConfig = loadConfig;
|
|
37
|
+
exports.saveConfig = saveConfig;
|
|
38
|
+
exports.runConsentFlow = runConsentFlow;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const readline = __importStar(require("readline"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const CONFIG_DIR = path.join(os.homedir(), ".clawguard");
|
|
44
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
|
|
45
|
+
function getDefaultConfig() {
|
|
46
|
+
return {
|
|
47
|
+
consented: false,
|
|
48
|
+
consentedAt: null,
|
|
49
|
+
showMode: true,
|
|
50
|
+
showModeActionsRemaining: 10,
|
|
51
|
+
protectionLevel: "balanced",
|
|
52
|
+
enabled: true
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function loadConfig() {
|
|
56
|
+
try {
|
|
57
|
+
if (fs.existsSync(CONFIG_FILE)) {
|
|
58
|
+
return JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8"));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch { }
|
|
62
|
+
return getDefaultConfig();
|
|
63
|
+
}
|
|
64
|
+
function saveConfig(config) {
|
|
65
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
66
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
67
|
+
}
|
|
68
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
69
|
+
}
|
|
70
|
+
function printBanner() {
|
|
71
|
+
console.log(`
|
|
72
|
+
\x1b[31m🦞 Clawguard\x1b[0m - AI Safety for OpenClaw
|
|
73
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
74
|
+
|
|
75
|
+
Clawguard monitors your agent's actions in real-time.
|
|
76
|
+
Before installing, please review what it does:
|
|
77
|
+
|
|
78
|
+
\x1b[32m✓ What Clawguard WILL do:\x1b[0m
|
|
79
|
+
• Watch your agent's tool calls as they happen
|
|
80
|
+
• Detect dangerous commands (rm -rf, credential theft, etc.)
|
|
81
|
+
• Flag prompt injection attempts
|
|
82
|
+
• Log everything locally (viewable in dashboard)
|
|
83
|
+
|
|
84
|
+
\x1b[31m✗ What Clawguard will NOT do:\x1b[0m
|
|
85
|
+
• Send data to external servers
|
|
86
|
+
• Modify your agent's behavior
|
|
87
|
+
• Store data outside your machine
|
|
88
|
+
|
|
89
|
+
\x1b[33m📊 Show Mode (First Run):\x1b[0m
|
|
90
|
+
Clawguard starts in "Show Mode" - observing and logging
|
|
91
|
+
without sending alerts. After 10 actions, you can
|
|
92
|
+
enable full monitoring with alerts.
|
|
93
|
+
|
|
94
|
+
\x1b[36m🔓 You can disable Clawguard anytime with:\x1b[0m
|
|
95
|
+
openclaw clawguard disable
|
|
96
|
+
|
|
97
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
98
|
+
`);
|
|
99
|
+
}
|
|
100
|
+
async function askConsent() {
|
|
101
|
+
const rl = readline.createInterface({
|
|
102
|
+
input: process.stdin,
|
|
103
|
+
output: process.stdout
|
|
104
|
+
});
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
rl.question("\x1b[1mDo you consent to install Clawguard? [Y/n] \x1b[0m", (answer) => {
|
|
107
|
+
rl.close();
|
|
108
|
+
const normalized = answer.trim().toLowerCase();
|
|
109
|
+
resolve(normalized === "" || normalized === "y" || normalized === "yes");
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async function chooseProtectionLevel() {
|
|
114
|
+
const rl = readline.createInterface({
|
|
115
|
+
input: process.stdin,
|
|
116
|
+
output: process.stdout
|
|
117
|
+
});
|
|
118
|
+
console.log(`
|
|
119
|
+
\x1b[1mChoose your alert sensitivity:\x1b[0m
|
|
120
|
+
|
|
121
|
+
\x1b[32m1) Relaxed\x1b[0m - Flag only critical threats
|
|
122
|
+
\x1b[33m2) Balanced\x1b[0m - Flag risky actions for review (recommended)
|
|
123
|
+
\x1b[31m3) Strict\x1b[0m - Flag everything for full visibility
|
|
124
|
+
`);
|
|
125
|
+
return new Promise((resolve) => {
|
|
126
|
+
rl.question("Enter 1, 2, or 3 [default: 2]: ", (answer) => {
|
|
127
|
+
rl.close();
|
|
128
|
+
const choice = answer.trim();
|
|
129
|
+
if (choice === "1")
|
|
130
|
+
return resolve("relaxed");
|
|
131
|
+
if (choice === "3")
|
|
132
|
+
return resolve("strict");
|
|
133
|
+
return resolve("balanced");
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async function runConsentFlow() {
|
|
138
|
+
const config = loadConfig();
|
|
139
|
+
if (config.consented) {
|
|
140
|
+
console.log("\x1b[32m✓ Clawguard already configured.\x1b[0m");
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
printBanner();
|
|
144
|
+
const consented = await askConsent();
|
|
145
|
+
if (!consented) {
|
|
146
|
+
console.log("\n\x1b[33mInstallation cancelled. You can run this again anytime.\x1b[0m\n");
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
const level = await chooseProtectionLevel();
|
|
150
|
+
config.consented = true;
|
|
151
|
+
config.consentedAt = new Date().toISOString();
|
|
152
|
+
config.protectionLevel = level;
|
|
153
|
+
config.showMode = true;
|
|
154
|
+
config.showModeActionsRemaining = 10;
|
|
155
|
+
config.enabled = true;
|
|
156
|
+
saveConfig(config);
|
|
157
|
+
console.log(`
|
|
158
|
+
\x1b[32m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
159
|
+
✓ Clawguard installed successfully!
|
|
160
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m
|
|
161
|
+
|
|
162
|
+
Protection level: \x1b[1m${level}\x1b[0m
|
|
163
|
+
Mode: \x1b[33mShow Mode\x1b[0m (observing first 10 actions)
|
|
164
|
+
|
|
165
|
+
\x1b[36mView your dashboard:\x1b[0m
|
|
166
|
+
openclaw clawguard dashboard
|
|
167
|
+
|
|
168
|
+
\x1b[36mCheck status:\x1b[0m
|
|
169
|
+
openclaw clawguard status
|
|
170
|
+
`);
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
if (require.main === module) {
|
|
174
|
+
runConsentFlow().then((success) => {
|
|
175
|
+
process.exit(success ? 0 : 1);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=consent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent.js","sourceRoot":"","sources":["../src/consent.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
interface ToolCallContext {
|
|
2
|
+
tool: string;
|
|
3
|
+
args: Record<string, unknown>;
|
|
4
|
+
sessionId?: string;
|
|
5
|
+
agentId?: string;
|
|
6
|
+
}
|
|
7
|
+
interface ToolCallResult {
|
|
8
|
+
allowed: boolean;
|
|
9
|
+
reason: string;
|
|
10
|
+
showModeNotice?: string;
|
|
11
|
+
pendingApprovalId?: string;
|
|
12
|
+
}
|
|
13
|
+
interface PendingApproval {
|
|
14
|
+
id: string;
|
|
15
|
+
tool: string;
|
|
16
|
+
args: Record<string, unknown>;
|
|
17
|
+
reason: string;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
status: "pending" | "approved" | "denied";
|
|
20
|
+
resolvedAt?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function approveAction(id: string): boolean;
|
|
23
|
+
export declare function denyAction(id: string): boolean;
|
|
24
|
+
export declare function listPendingApprovals(): PendingApproval[];
|
|
25
|
+
export declare function beforeToolCall(context: ToolCallContext): Promise<ToolCallResult>;
|
|
26
|
+
export declare function afterToolCall(context: ToolCallContext, result: unknown): Promise<void>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAUA,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,cAAc;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuJD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAYjD;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAY9C;AAED,wBAAgB,oBAAoB,IAAI,eAAe,EAAE,CAgBxD;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAgHtF;AA2BD,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5F"}
|