@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 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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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"}
@@ -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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"}
@@ -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"}