@goplus/agentguard 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 (50) hide show
  1. package/README.md +126 -12
  2. package/dist/adapters/claude-code.d.ts +16 -0
  3. package/dist/adapters/claude-code.d.ts.map +1 -0
  4. package/dist/adapters/claude-code.js +128 -0
  5. package/dist/adapters/claude-code.js.map +1 -0
  6. package/dist/adapters/common.d.ts +40 -0
  7. package/dist/adapters/common.d.ts.map +1 -0
  8. package/dist/adapters/common.js +166 -0
  9. package/dist/adapters/common.js.map +1 -0
  10. package/dist/adapters/engine.d.ts +9 -0
  11. package/dist/adapters/engine.d.ts.map +1 -0
  12. package/dist/adapters/engine.js +93 -0
  13. package/dist/adapters/engine.js.map +1 -0
  14. package/dist/adapters/index.d.ts +7 -0
  15. package/dist/adapters/index.d.ts.map +1 -0
  16. package/dist/adapters/index.js +22 -0
  17. package/dist/adapters/index.js.map +1 -0
  18. package/dist/adapters/openclaw-plugin.d.ts +72 -0
  19. package/dist/adapters/openclaw-plugin.d.ts.map +1 -0
  20. package/dist/adapters/openclaw-plugin.js +369 -0
  21. package/dist/adapters/openclaw-plugin.js.map +1 -0
  22. package/dist/adapters/openclaw.d.ts +22 -0
  23. package/dist/adapters/openclaw.d.ts.map +1 -0
  24. package/dist/adapters/openclaw.js +118 -0
  25. package/dist/adapters/openclaw.js.map +1 -0
  26. package/dist/adapters/types.d.ts +81 -0
  27. package/dist/adapters/types.d.ts.map +1 -0
  28. package/dist/adapters/types.js +3 -0
  29. package/dist/adapters/types.js.map +1 -0
  30. package/dist/index.d.ts +1 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +14 -7
  33. package/dist/index.js.map +1 -1
  34. package/dist/tests/adapter.test.d.ts +2 -0
  35. package/dist/tests/adapter.test.d.ts.map +1 -0
  36. package/dist/tests/adapter.test.js +396 -0
  37. package/dist/tests/adapter.test.js.map +1 -0
  38. package/dist/tests/helpers/test-utils.d.ts +23 -0
  39. package/dist/tests/helpers/test-utils.d.ts.map +1 -0
  40. package/dist/tests/helpers/test-utils.js +37 -0
  41. package/dist/tests/helpers/test-utils.js.map +1 -0
  42. package/dist/tests/integration.test.d.ts +2 -0
  43. package/dist/tests/integration.test.d.ts.map +1 -0
  44. package/dist/tests/integration.test.js +229 -0
  45. package/dist/tests/integration.test.js.map +1 -0
  46. package/dist/tests/smoke.test.d.ts +2 -0
  47. package/dist/tests/smoke.test.d.ts.map +1 -0
  48. package/dist/tests/smoke.test.js +94 -0
  49. package/dist/tests/smoke.test.js.map +1 -0
  50. package/package.json +1 -1
package/README.md CHANGED
@@ -67,6 +67,45 @@ cp -r agentguard/skills/agentguard ~/.claude/skills/agentguard
67
67
 
68
68
  </details>
69
69
 
70
+ <details>
71
+ <summary><b>OpenClaw plugin install</b></summary>
72
+
73
+ ```bash
74
+ npm install @goplus/agentguard
75
+ ```
76
+
77
+ Register in your OpenClaw plugin config:
78
+
79
+ ```typescript
80
+ import register from '@goplus/agentguard/openclaw';
81
+ export default register;
82
+ ```
83
+
84
+ Or register manually with options:
85
+
86
+ ```typescript
87
+ import { registerOpenClawPlugin } from '@goplus/agentguard';
88
+
89
+ export default function setup(api) {
90
+ registerOpenClawPlugin(api, {
91
+ level: 'balanced', // Protection level: strict | balanced | permissive
92
+ skipAutoScan: false, // Set true to disable auto-scanning of plugins
93
+ });
94
+ };
95
+ ```
96
+
97
+ **What happens on registration:**
98
+
99
+ 1. **Auto-scans all loaded plugins** — Static analysis of each plugin's source code
100
+ 2. **Determines trust level** — Based on scan results (critical findings → untrusted)
101
+ 3. **Infers capabilities** — Based on registered tools and scan risk level
102
+ 4. **Registers to trust registry** — Auto-attests each plugin with appropriate permissions
103
+ 5. **Builds tool mapping** — Maps `toolName → pluginId` for initiating skill tracking
104
+
105
+ AgentGuard hooks into OpenClaw's `before_tool_call` / `after_tool_call` events to block dangerous actions and log audit events.
106
+
107
+ </details>
108
+
70
109
  Then use `/agentguard` in your agent:
71
110
 
72
111
  ```
@@ -110,24 +149,30 @@ Expected output: **CRITICAL** risk level with detection hits across JavaScript,
110
149
 
111
150
  GoPlus AgentGuard follows the [Agent Skills](https://agentskills.io) open standard:
112
151
 
113
- | Platform | Support |
114
- |----------|---------|
115
- | **Claude Code** | Full (skill + hooks auto-guard) |
116
- | **OpenAI Codex CLI** | Skill (scan/action/trust commands) |
117
- | **Gemini CLI** | Skill |
118
- | **Cursor** | Skill |
119
- | **GitHub Copilot** | Skill |
152
+ | Platform | Support | Features |
153
+ |----------|---------|----------|
154
+ | **Claude Code** | Full | Skill + hooks auto-guard, transcript-based skill tracking |
155
+ | **OpenClaw** | Full | Plugin hooks + **auto-scan on load** + tool→plugin mapping |
156
+ | **OpenAI Codex CLI** | Skill | Scan/action/trust commands |
157
+ | **Gemini CLI** | Skill | Scan/action/trust commands |
158
+ | **Cursor** | Skill | Scan/action/trust commands |
159
+ | **GitHub Copilot** | Skill | Scan/action/trust commands |
120
160
 
121
- > Hooks-based auto-guard (Layer 1) is specific to Claude Code's plugin system. The skill commands (Layer 2) work on any Agent Skills-compatible platform.
161
+ > **Hooks-based auto-guard (Layer 1)** works on Claude Code (PreToolUse/PostToolUse) and OpenClaw (before_tool_call/after_tool_call). Both platforms share the same decision engine via a unified adapter abstraction layer.
162
+ >
163
+ > **OpenClaw exclusive**: Auto-scans all loaded plugins at registration time and automatically registers them to the trust registry with appropriate trust levels and capabilities.
122
164
 
123
165
  ## Hook Limitations
124
166
 
125
167
  The auto-guard hooks (Layer 1) have the following constraints:
126
168
 
127
- - **Platform-specific**: Hooks rely on Claude Code's `PreToolUse` / `PostToolUse` / `SessionStart` events. Other platforms do not yet support this hook system.
169
+ - **Platform-specific**: Hooks rely on Claude Code's `PreToolUse` / `PostToolUse` events or OpenClaw's `before_tool_call` / `after_tool_call` plugin hooks. Both share the same decision engine via the adapter abstraction layer.
128
170
  - **Default-deny policy**: First-time use may trigger confirmation prompts for certain commands. A built-in safe-command allowlist (`ls`, `echo`, `pwd`, `git status`, etc.) reduces false positives.
129
- - **Skill source tracking is heuristic**: AgentGuard infers which skill initiated an action by analyzing the conversation transcript. This is not 100% precise in all cases.
171
+ - **Skill source tracking**:
172
+ - *Claude Code*: Infers which skill initiated an action by analyzing the conversation transcript (heuristic, not 100% precise)
173
+ - *OpenClaw*: Uses tool→plugin mapping built at registration time (more reliable)
130
174
  - **Cannot intercept skill installation itself**: Hooks can only intercept tool calls (Bash, Write, WebFetch, etc.) that a skill makes *after* loading — they cannot block the Skill tool invocation itself.
175
+ - **OpenClaw auto-scan timing**: Plugins are scanned asynchronously after AgentGuard registration completes. Very fast tool calls immediately after startup may execute before scan completes.
131
176
 
132
177
  ## Roadmap
133
178
 
@@ -139,8 +184,12 @@ The auto-guard hooks (Layer 1) have the following constraints:
139
184
  - [x] Plugin manifest (`.claude-plugin/`) for one-step install
140
185
 
141
186
  ### v2.0 — Multi-Platform
142
- - [ ] OpenClaw gateway plugin integration
143
- - [ ] `before_tool_call` / `after_tool_call` hook wiring
187
+ - [x] OpenClaw gateway plugin integration
188
+ - [x] `before_tool_call` / `after_tool_call` hook wiring
189
+ - [x] Multi-platform adapter abstraction layer (Claude Code + OpenClaw)
190
+ - [x] Auto-scan plugins on OpenClaw registration
191
+ - [x] Tool→plugin mapping for initiating skill tracking
192
+ - [x] Auto-register scanned plugins to trust registry
144
193
  - [ ] OpenAI Codex CLI sandbox adapter
145
194
  - [ ] Federated trust registry across platforms
146
195
 
@@ -150,8 +199,73 @@ The auto-guard hooks (Layer 1) have the following constraints:
150
199
  - [ ] VS Code extension for IDE-native security
151
200
  - [ ] Community rule contributions (open rule format)
152
201
 
202
+ ## OpenClaw Integration
203
+
204
+ AgentGuard provides deep integration with OpenClaw through automatic plugin scanning and trust management.
205
+
206
+ <details>
207
+ <summary><b>How it works</b></summary>
208
+
209
+ When AgentGuard registers as an OpenClaw plugin:
210
+
211
+ ```
212
+ ┌─────────────────────────────────────────────────────────────────┐
213
+ │ OpenClaw loads AgentGuard plugin │
214
+ └─────────────────────────────────────────────────────────────────┘
215
+
216
+
217
+ ┌─────────────────────────────────────────────────────────────────┐
218
+ │ AgentGuard scans all loaded plugins (async, non-blocking) │
219
+ │ • Reads plugin source from registry │
220
+ │ • Runs 24 static analysis rules │
221
+ │ • Calculates artifact hash │
222
+ └─────────────────────────────────────────────────────────────────┘
223
+
224
+
225
+ ┌─────────────────────────────────────────────────────────────────┐
226
+ │ For each plugin: │
227
+ │ • Determine trust level (untrusted/restricted/trusted) │
228
+ │ • Infer capabilities from tools + scan results │
229
+ │ • Register to AgentGuard trust registry │
230
+ │ • Map tool names → plugin ID │
231
+ └─────────────────────────────────────────────────────────────────┘
232
+
233
+
234
+ ┌─────────────────────────────────────────────────────────────────┐
235
+ │ On every tool call: │
236
+ │ • Look up plugin from tool name │
237
+ │ • Check plugin trust level & capabilities │
238
+ │ • Evaluate action against security policies │
239
+ │ • Allow / Deny / Log │
240
+ └─────────────────────────────────────────────────────────────────┘
241
+ ```
242
+
243
+ </details>
244
+
245
+ <details>
246
+ <summary><b>Exported utilities for OpenClaw</b></summary>
247
+
248
+ ```typescript
249
+ import {
250
+ registerOpenClawPlugin,
251
+ getPluginIdFromTool,
252
+ getPluginScanResult,
253
+ } from '@goplus/agentguard';
254
+
255
+ // Get which plugin registered a tool
256
+ const pluginId = getPluginIdFromTool('browser');
257
+ // → 'my-browser-plugin'
258
+
259
+ // Get cached scan result
260
+ const scanResult = getPluginScanResult('my-browser-plugin');
261
+ // → { riskLevel: 'low', riskTags: [] }
262
+ ```
263
+
264
+ </details>
265
+
153
266
  ## Documentation
154
267
 
268
+ - [Security Policy](docs/SECURITY-POLICY.md) — Unified security rules and policies reference
155
269
  - [MCP Server Setup](docs/mcp-server.md) — Run as a Model Context Protocol server
156
270
  - [SDK Usage](docs/sdk.md) — Use as a TypeScript/JavaScript library
157
271
  - [Trust Management](docs/trust-cli.md) — Manage skill trust levels and capability presets
@@ -0,0 +1,16 @@
1
+ import type { ActionEnvelope } from '../types/action.js';
2
+ import type { HookAdapter, HookInput } from './types.js';
3
+ /**
4
+ * Claude Code hook adapter
5
+ *
6
+ * Bridges Claude Code's PreToolUse/PostToolUse stdin/stdout protocol
7
+ * to the common AgentGuard decision engine.
8
+ */
9
+ export declare class ClaudeCodeAdapter implements HookAdapter {
10
+ readonly name = "claude-code";
11
+ parseInput(raw: unknown): HookInput;
12
+ mapToolToActionType(toolName: string): string | null;
13
+ buildEnvelope(input: HookInput, initiatingSkill?: string | null): ActionEnvelope | null;
14
+ inferInitiatingSkill(input: HookInput): Promise<string | null>;
15
+ }
16
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAazD;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,iBAAiB;IAE9B,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS;IAanC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIpD,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI;IAyDjF,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAuCrE"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClaudeCodeAdapter = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ /**
6
+ * Tool name → action type mapping for Claude Code
7
+ */
8
+ const TOOL_ACTION_MAP = {
9
+ Bash: 'exec_command',
10
+ Write: 'write_file',
11
+ Edit: 'write_file',
12
+ WebFetch: 'network_request',
13
+ WebSearch: 'network_request',
14
+ };
15
+ /**
16
+ * Claude Code hook adapter
17
+ *
18
+ * Bridges Claude Code's PreToolUse/PostToolUse stdin/stdout protocol
19
+ * to the common AgentGuard decision engine.
20
+ */
21
+ class ClaudeCodeAdapter {
22
+ name = 'claude-code';
23
+ parseInput(raw) {
24
+ const data = raw;
25
+ const hookEvent = data.hook_event_name || '';
26
+ return {
27
+ toolName: data.tool_name || '',
28
+ toolInput: data.tool_input || {},
29
+ eventType: hookEvent.startsWith('Post') ? 'post' : 'pre',
30
+ sessionId: data.session_id,
31
+ cwd: data.cwd,
32
+ raw: data,
33
+ };
34
+ }
35
+ mapToolToActionType(toolName) {
36
+ return TOOL_ACTION_MAP[toolName] || null;
37
+ }
38
+ buildEnvelope(input, initiatingSkill) {
39
+ const actionType = this.mapToolToActionType(input.toolName);
40
+ if (!actionType)
41
+ return null;
42
+ const actor = {
43
+ skill: {
44
+ id: initiatingSkill || 'claude-code-session',
45
+ source: initiatingSkill || 'claude-code',
46
+ version_ref: '0.0.0',
47
+ artifact_hash: '',
48
+ },
49
+ };
50
+ const context = {
51
+ session_id: input.sessionId || `hook-${Date.now()}`,
52
+ user_present: true,
53
+ env: 'prod',
54
+ time: new Date().toISOString(),
55
+ initiating_skill: initiatingSkill || undefined,
56
+ };
57
+ // Build action data based on type
58
+ let actionData;
59
+ switch (actionType) {
60
+ case 'exec_command':
61
+ actionData = {
62
+ command: input.toolInput.command || '',
63
+ args: [],
64
+ cwd: input.cwd,
65
+ };
66
+ break;
67
+ case 'write_file':
68
+ actionData = {
69
+ path: input.toolInput.file_path || '',
70
+ };
71
+ break;
72
+ case 'network_request':
73
+ actionData = {
74
+ method: 'GET',
75
+ url: input.toolInput.url || input.toolInput.query || '',
76
+ };
77
+ break;
78
+ default:
79
+ return null;
80
+ }
81
+ return {
82
+ actor,
83
+ action: { type: actionType, data: actionData },
84
+ context,
85
+ };
86
+ }
87
+ async inferInitiatingSkill(input) {
88
+ const data = input.raw;
89
+ const transcriptPath = data.transcript_path;
90
+ if (!transcriptPath)
91
+ return null;
92
+ try {
93
+ const fd = (0, node_fs_1.openSync)(transcriptPath, 'r');
94
+ const stat = (0, node_fs_1.fstatSync)(fd);
95
+ const TAIL_SIZE = 4096;
96
+ const start = Math.max(0, stat.size - TAIL_SIZE);
97
+ const buf = Buffer.alloc(Math.min(TAIL_SIZE, stat.size));
98
+ (0, node_fs_1.readSync)(fd, buf, 0, buf.length, start);
99
+ (0, node_fs_1.closeSync)(fd);
100
+ const tail = buf.toString('utf-8');
101
+ const lines = tail.split('\n').filter(Boolean);
102
+ for (let i = lines.length - 1; i >= 0; i--) {
103
+ try {
104
+ const entry = JSON.parse(lines[i]);
105
+ if (entry.type === 'tool_use' && entry.name === 'Skill' && entry.input?.skill) {
106
+ return entry.input.skill;
107
+ }
108
+ if (entry.role === 'assistant' && Array.isArray(entry.content)) {
109
+ for (const block of entry.content) {
110
+ if (block.type === 'tool_use' && block.name === 'Skill' && block.input?.skill) {
111
+ return block.input.skill;
112
+ }
113
+ }
114
+ }
115
+ }
116
+ catch {
117
+ // Not valid JSON
118
+ }
119
+ }
120
+ }
121
+ catch {
122
+ // Can't read transcript
123
+ }
124
+ return null;
125
+ }
126
+ }
127
+ exports.ClaudeCodeAdapter = ClaudeCodeAdapter;
128
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { HookInput } from './types.js';
2
+ export declare function loadConfig(): {
3
+ level: string;
4
+ };
5
+ export declare function isSensitivePath(filePath: string): boolean;
6
+ export declare function shouldDenyAtLevel(decision: {
7
+ decision: string;
8
+ risk_level?: string;
9
+ }, config: {
10
+ level?: string;
11
+ }): boolean;
12
+ export declare function shouldAskAtLevel(decision: {
13
+ decision: string;
14
+ risk_level?: string;
15
+ }, config: {
16
+ level?: string;
17
+ }): boolean;
18
+ export declare function writeAuditLog(input: HookInput, decision: {
19
+ decision?: string;
20
+ risk_level?: string;
21
+ risk_tags?: string[];
22
+ } | null, initiatingSkill?: string | null): void;
23
+ export declare function getSkillTrustPolicy(skillId: string, registry: {
24
+ lookup: (s: {
25
+ id: string;
26
+ source: string;
27
+ version_ref: string;
28
+ artifact_hash: string;
29
+ }) => Promise<{
30
+ effective_trust_level: string;
31
+ effective_capabilities: Record<string, unknown>;
32
+ record: unknown | null;
33
+ }>;
34
+ }): Promise<{
35
+ trustLevel: string | null;
36
+ capabilities: Record<string, unknown> | null;
37
+ isKnown: boolean;
38
+ }>;
39
+ export declare function isActionAllowedByCapabilities(actionType: string, capabilities: Record<string, unknown>): boolean;
40
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/adapters/common.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,YAAY,CAAC;AAoBxD,wBAAgB,UAAU,IAAI;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAM9C;AAeD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMzD;AAMD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAgBT;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAoBT;AAMD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,EACjF,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B,IAAI,CAkBN;AAqBD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,qBAAqB,EAAE,MAAM,CAAC;QAAC,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;CAAE,GAC3N,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAmBxG;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CAiBT"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadConfig = loadConfig;
4
+ exports.isSensitivePath = isSensitivePath;
5
+ exports.shouldDenyAtLevel = shouldDenyAtLevel;
6
+ exports.shouldAskAtLevel = shouldAskAtLevel;
7
+ exports.writeAuditLog = writeAuditLog;
8
+ exports.getSkillTrustPolicy = getSkillTrustPolicy;
9
+ exports.isActionAllowedByCapabilities = isActionAllowedByCapabilities;
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = require("node:path");
12
+ const node_os_1 = require("node:os");
13
+ // ---------------------------------------------------------------------------
14
+ // Paths
15
+ // ---------------------------------------------------------------------------
16
+ const AGENTGUARD_DIR = process.env.AGENTGUARD_HOME || (0, node_path_1.join)((0, node_os_1.homedir)(), '.agentguard');
17
+ const CONFIG_PATH = (0, node_path_1.join)(AGENTGUARD_DIR, 'config.json');
18
+ const AUDIT_PATH = (0, node_path_1.join)(AGENTGUARD_DIR, 'audit.jsonl');
19
+ function ensureDir() {
20
+ if (!(0, node_fs_1.existsSync)(AGENTGUARD_DIR)) {
21
+ (0, node_fs_1.mkdirSync)(AGENTGUARD_DIR, { recursive: true });
22
+ }
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // Config
26
+ // ---------------------------------------------------------------------------
27
+ function loadConfig() {
28
+ try {
29
+ return JSON.parse((0, node_fs_1.readFileSync)(CONFIG_PATH, 'utf-8'));
30
+ }
31
+ catch {
32
+ return { level: 'balanced' };
33
+ }
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Sensitive path detection
37
+ // ---------------------------------------------------------------------------
38
+ const SENSITIVE_PATHS = [
39
+ '.env', '.env.local', '.env.production',
40
+ '.ssh/', 'id_rsa', 'id_ed25519',
41
+ '.aws/credentials', '.aws/config',
42
+ '.npmrc', '.netrc',
43
+ 'credentials.json', 'serviceAccountKey.json',
44
+ '.kube/config',
45
+ ];
46
+ function isSensitivePath(filePath) {
47
+ if (!filePath)
48
+ return false;
49
+ const normalized = filePath.replace(/\\/g, '/');
50
+ return SENSITIVE_PATHS.some((p) => normalized.includes(`/${p}`) || normalized.endsWith(p));
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // Protection level thresholds
54
+ // ---------------------------------------------------------------------------
55
+ function shouldDenyAtLevel(decision, config) {
56
+ const level = config.level || 'balanced';
57
+ if (level === 'strict') {
58
+ return decision.decision === 'deny' || decision.decision === 'confirm';
59
+ }
60
+ if (level === 'balanced') {
61
+ return decision.decision === 'deny';
62
+ }
63
+ if (level === 'permissive') {
64
+ return decision.decision === 'deny' && decision.risk_level === 'critical';
65
+ }
66
+ return decision.decision === 'deny';
67
+ }
68
+ function shouldAskAtLevel(decision, config) {
69
+ const level = config.level || 'balanced';
70
+ if (level === 'strict') {
71
+ return false;
72
+ }
73
+ if (level === 'balanced') {
74
+ return decision.decision === 'confirm';
75
+ }
76
+ if (level === 'permissive') {
77
+ return ((decision.decision === 'deny' && decision.risk_level !== 'critical') ||
78
+ (decision.decision === 'confirm' &&
79
+ (decision.risk_level === 'high' || decision.risk_level === 'critical')));
80
+ }
81
+ return decision.decision === 'confirm';
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Audit logging
85
+ // ---------------------------------------------------------------------------
86
+ function writeAuditLog(input, decision, initiatingSkill) {
87
+ try {
88
+ ensureDir();
89
+ const entry = {
90
+ timestamp: new Date().toISOString(),
91
+ tool_name: input.toolName,
92
+ tool_input_summary: summarizeToolInput(input),
93
+ decision: decision?.decision || 'allow',
94
+ risk_level: decision?.risk_level || 'low',
95
+ risk_tags: decision?.risk_tags || [],
96
+ };
97
+ if (initiatingSkill) {
98
+ entry.initiating_skill = initiatingSkill;
99
+ }
100
+ (0, node_fs_1.appendFileSync)(AUDIT_PATH, JSON.stringify(entry) + '\n');
101
+ }
102
+ catch {
103
+ // Non-critical
104
+ }
105
+ }
106
+ function summarizeToolInput(input) {
107
+ const toolInput = input.toolInput;
108
+ if (typeof toolInput === 'object' && toolInput !== null) {
109
+ const cmd = toolInput.command;
110
+ if (typeof cmd === 'string')
111
+ return cmd.slice(0, 200);
112
+ const fp = toolInput.file_path ||
113
+ toolInput.path;
114
+ if (typeof fp === 'string')
115
+ return fp;
116
+ const url = toolInput.url ||
117
+ toolInput.query;
118
+ if (typeof url === 'string')
119
+ return url;
120
+ }
121
+ return JSON.stringify(toolInput).slice(0, 200);
122
+ }
123
+ // ---------------------------------------------------------------------------
124
+ // Skill trust policy helpers
125
+ // ---------------------------------------------------------------------------
126
+ async function getSkillTrustPolicy(skillId, registry) {
127
+ if (!skillId) {
128
+ return { trustLevel: null, capabilities: null, isKnown: false };
129
+ }
130
+ try {
131
+ const result = await registry.lookup({
132
+ id: skillId,
133
+ source: skillId,
134
+ version_ref: '0.0.0',
135
+ artifact_hash: '',
136
+ });
137
+ return {
138
+ trustLevel: result.effective_trust_level,
139
+ capabilities: result.effective_capabilities,
140
+ isKnown: result.record !== null,
141
+ };
142
+ }
143
+ catch {
144
+ return { trustLevel: null, capabilities: null, isKnown: false };
145
+ }
146
+ }
147
+ function isActionAllowedByCapabilities(actionType, capabilities) {
148
+ if (!capabilities)
149
+ return true;
150
+ switch (actionType) {
151
+ case 'exec_command':
152
+ return capabilities.can_exec !== false;
153
+ case 'network_request':
154
+ return capabilities.can_network !== false;
155
+ case 'write_file':
156
+ return capabilities.can_write !== false;
157
+ case 'read_file':
158
+ return capabilities.can_read !== false;
159
+ case 'web3_tx':
160
+ case 'web3_sign':
161
+ return capabilities.can_web3 !== false;
162
+ default:
163
+ return true;
164
+ }
165
+ }
166
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/adapters/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { HookAdapter, HookOutput, EngineOptions } from './types.js';
2
+ /**
3
+ * Evaluate a hook event using the common AgentGuard decision engine.
4
+ *
5
+ * This is the platform-agnostic core — adapters handle I/O protocol,
6
+ * this function handles security logic.
7
+ */
8
+ export declare function evaluateHook(adapter: HookAdapter, rawInput: unknown, options: EngineOptions): Promise<HookOutput>;
9
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/adapters/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAa,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAUpF;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,UAAU,CAAC,CAiGrB"}