@moltnet/guard 1.0.2 → 1.0.4

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 (2) hide show
  1. package/index.ts +65 -11
  2. package/package.json +1 -1
package/index.ts CHANGED
@@ -9,10 +9,14 @@
9
9
  */
10
10
 
11
11
  import type { PluginAPI, PluginRegisterFn } from 'clawdbot';
12
+ import { randomBytes } from 'crypto';
13
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
14
+ import { join } from 'path';
15
+ import { homedir } from 'os';
12
16
 
13
17
  interface MoltGuardConfig {
14
18
  url: string;
15
- token: string;
19
+ token?: string;
16
20
  agentName?: string;
17
21
  logThoughts?: boolean;
18
22
  gateHighRisk?: boolean;
@@ -35,6 +39,53 @@ const state: MoltGuardState = {
35
39
  pollInterval: null,
36
40
  };
37
41
 
42
+ // Generate a new token
43
+ function generateToken(): string {
44
+ return 'mg_' + randomBytes(24).toString('hex');
45
+ }
46
+
47
+ // Auto-generate and save token if not present
48
+ function ensureToken(api: PluginAPI): string | null {
49
+ const configPath = join(homedir(), '.clawdbot', 'clawdbot.json');
50
+
51
+ try {
52
+ if (!existsSync(configPath)) {
53
+ console.log('[moltguard] Config file not found');
54
+ return null;
55
+ }
56
+
57
+ const config = JSON.parse(readFileSync(configPath, 'utf8'));
58
+ const guardConfig = config.plugins?.entries?.guard?.config;
59
+
60
+ // If token exists, use it
61
+ if (guardConfig?.token) {
62
+ return guardConfig.token;
63
+ }
64
+
65
+ // Generate new token
66
+ const newToken = generateToken();
67
+ console.log('[moltguard] Generated new token: ' + newToken);
68
+
69
+ // Ensure config structure exists
70
+ if (!config.plugins) config.plugins = {};
71
+ if (!config.plugins.entries) config.plugins.entries = {};
72
+ if (!config.plugins.entries.guard) config.plugins.entries.guard = { enabled: true };
73
+ if (!config.plugins.entries.guard.config) config.plugins.entries.guard.config = {};
74
+
75
+ // Save token
76
+ config.plugins.entries.guard.config.token = newToken;
77
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
78
+
79
+ console.log('[moltguard] Token saved to config');
80
+ console.log('[moltguard] View dashboard: https://guard.moltnet.ai/dashboard?token=' + newToken);
81
+
82
+ return newToken;
83
+ } catch (err) {
84
+ console.error('[moltguard] Failed to manage token:', err instanceof Error ? err.message : String(err));
85
+ return null;
86
+ }
87
+ }
88
+
38
89
  // Risk classification for common tools
39
90
  const TOOL_RISK: Record<string, 'low' | 'medium' | 'high' | 'critical'> = {
40
91
  // High risk - external effects
@@ -251,20 +302,23 @@ function getToolRisk(toolName: string, params: Record<string, unknown>): 'low' |
251
302
  const register: PluginRegisterFn = (api: PluginAPI) => {
252
303
  const config = api.config.plugins?.entries?.guard?.config as MoltGuardConfig | undefined;
253
304
 
254
- if (!config?.token) {
255
- console.log('[moltguard] No token configured. Get one at https://guard.moltnet.ai');
305
+ // Auto-generate token if not present
306
+ const token = config?.token || ensureToken(api);
307
+
308
+ if (!token) {
309
+ console.log('[moltguard] Failed to initialize token');
256
310
  return;
257
311
  }
258
312
 
259
313
  const cfg: MoltGuardConfig = {
260
- url: config.url || 'https://guard.moltnet.ai',
261
- token: config.token,
262
- agentName: config.agentName,
263
- logThoughts: config.logThoughts ?? true,
264
- gateHighRisk: config.gateHighRisk ?? true,
265
- gateTools: config.gateTools ?? ['exec', 'message', 'write'],
266
- pollCommands: config.pollCommands ?? true,
267
- pollIntervalMs: config.pollIntervalMs ?? 5000,
314
+ url: config?.url || 'https://guard.moltnet.ai',
315
+ token: token,
316
+ agentName: config?.agentName,
317
+ logThoughts: config?.logThoughts ?? true,
318
+ gateHighRisk: config?.gateHighRisk ?? true,
319
+ gateTools: config?.gateTools ?? ['exec', 'message', 'write'],
320
+ pollCommands: config?.pollCommands ?? true,
321
+ pollIntervalMs: config?.pollIntervalMs ?? 5000,
268
322
  };
269
323
 
270
324
  const agentName = cfg.agentName || `clawdbot-${process.env.HOSTNAME || 'agent'}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moltnet/guard",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "MoltGuard plugin for Clawdbot - Security & observability for AI agents",
5
5
  "main": "index.ts",
6
6
  "type": "module",