@goplus/agentguard 1.0.1 → 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.
- package/README.md +126 -12
- package/dist/action/detectors/exec.d.ts.map +1 -1
- package/dist/action/detectors/exec.js +36 -1
- package/dist/action/detectors/exec.js.map +1 -1
- package/dist/action/detectors/network.d.ts.map +1 -1
- package/dist/action/detectors/network.js +7 -0
- package/dist/action/detectors/network.js.map +1 -1
- package/dist/action/index.d.ts.map +1 -1
- package/dist/action/index.js +51 -6
- package/dist/action/index.js.map +1 -1
- package/dist/adapters/claude-code.d.ts +16 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +128 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/common.d.ts +40 -0
- package/dist/adapters/common.d.ts.map +1 -0
- package/dist/adapters/common.js +166 -0
- package/dist/adapters/common.js.map +1 -0
- package/dist/adapters/engine.d.ts +9 -0
- package/dist/adapters/engine.d.ts.map +1 -0
- package/dist/adapters/engine.js +93 -0
- package/dist/adapters/engine.js.map +1 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +22 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/openclaw-plugin.d.ts +72 -0
- package/dist/adapters/openclaw-plugin.d.ts.map +1 -0
- package/dist/adapters/openclaw-plugin.js +369 -0
- package/dist/adapters/openclaw-plugin.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +22 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +118 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/types.d.ts +81 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +3 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +45 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/registry/storage.d.ts.map +1 -1
- package/dist/registry/storage.js +3 -2
- package/dist/registry/storage.js.map +1 -1
- package/dist/tests/action.test.js +26 -0
- package/dist/tests/action.test.js.map +1 -1
- package/dist/tests/adapter.test.d.ts +2 -0
- package/dist/tests/adapter.test.d.ts.map +1 -0
- package/dist/tests/adapter.test.js +396 -0
- package/dist/tests/adapter.test.js.map +1 -0
- package/dist/tests/helpers/test-utils.d.ts +23 -0
- package/dist/tests/helpers/test-utils.d.ts.map +1 -0
- package/dist/tests/helpers/test-utils.js +37 -0
- package/dist/tests/helpers/test-utils.js.map +1 -0
- package/dist/tests/integration.test.d.ts +2 -0
- package/dist/tests/integration.test.d.ts.map +1 -0
- package/dist/tests/integration.test.js +229 -0
- package/dist/tests/integration.test.js.map +1 -0
- package/dist/tests/smoke.test.d.ts +2 -0
- package/dist/tests/smoke.test.d.ts.map +1 -0
- package/dist/tests/smoke.test.js +94 -0
- package/dist/tests/smoke.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -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":";;;AAAA,qCAAmE;AAInE;;GAEG;AACH,MAAM,eAAe,GAA2B;IAC9C,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE,iBAAiB;CAC7B,CAAC;AAEF;;;;;GAKG;AACH,MAAa,iBAAiB;IACnB,IAAI,GAAG,aAAa,CAAC;IAE9B,UAAU,CAAC,GAAY;QACrB,MAAM,IAAI,GAAG,GAA8B,CAAC;QAC5C,MAAM,SAAS,GAAI,IAAI,CAAC,eAA0B,IAAI,EAAE,CAAC;QACzD,OAAO;YACL,QAAQ,EAAG,IAAI,CAAC,SAAoB,IAAI,EAAE;YAC1C,SAAS,EAAG,IAAI,CAAC,UAAsC,IAAI,EAAE;YAC7D,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;YACxD,SAAS,EAAE,IAAI,CAAC,UAAgC;YAChD,GAAG,EAAE,IAAI,CAAC,GAAyB;YACnC,GAAG,EAAE,IAAI;SACV,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,QAAgB;QAClC,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IAC3C,CAAC;IAED,aAAa,CAAC,KAAgB,EAAE,eAA+B;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,KAAK,GAAG;YACZ,KAAK,EAAE;gBACL,EAAE,EAAE,eAAe,IAAI,qBAAqB;gBAC5C,MAAM,EAAE,eAAe,IAAI,aAAa;gBACxC,WAAW,EAAE,OAAO;gBACpB,aAAa,EAAE,EAAE;aAClB;SACF,CAAC;QAEF,MAAM,OAAO,GAAG;YACd,UAAU,EAAE,KAAK,CAAC,SAAS,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE;YACnD,YAAY,EAAE,IAAI;YAClB,GAAG,EAAE,MAAe;YACpB,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9B,gBAAgB,EAAE,eAAe,IAAI,SAAS;SAC/C,CAAC;QAEF,kCAAkC;QAClC,IAAI,UAAmC,CAAC;QAExC,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,cAAc;gBACjB,UAAU,GAAG;oBACX,OAAO,EAAG,KAAK,CAAC,SAAS,CAAC,OAAkB,IAAI,EAAE;oBAClD,IAAI,EAAE,EAAE;oBACR,GAAG,EAAE,KAAK,CAAC,GAAG;iBACf,CAAC;gBACF,MAAM;YAER,KAAK,YAAY;gBACf,UAAU,GAAG;oBACX,IAAI,EAAG,KAAK,CAAC,SAAS,CAAC,SAAoB,IAAI,EAAE;iBAClD,CAAC;gBACF,MAAM;YAER,KAAK,iBAAiB;gBACpB,UAAU,GAAG;oBACX,MAAM,EAAE,KAAK;oBACb,GAAG,EAAG,KAAK,CAAC,SAAS,CAAC,GAAc,IAAK,KAAK,CAAC,SAAS,CAAC,KAAgB,IAAI,EAAE;iBAChF,CAAC;gBACF,MAAM;YAER;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO;YACL,KAAK;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE;YAC9C,OAAO;SACqB,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAgB;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,GAA8B,CAAC;QAClD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAqC,CAAC;QAClE,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QAEjC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAA,kBAAQ,EAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,IAAA,mBAAS,EAAC,EAAE,CAAC,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;YACjD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,IAAA,kBAAQ,EAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACxC,IAAA,mBAAS,EAAC,EAAE,CAAC,CAAC;YAEd,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE/C,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;wBAC9E,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;oBAC3B,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC/D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;4BAClC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;gCAC9E,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;4BAC3B,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,iBAAiB;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AApHD,8CAoHC"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.evaluateHook = evaluateHook;
|
|
4
|
+
const common_js_1 = require("./common.js");
|
|
5
|
+
/**
|
|
6
|
+
* Evaluate a hook event using the common AgentGuard decision engine.
|
|
7
|
+
*
|
|
8
|
+
* This is the platform-agnostic core — adapters handle I/O protocol,
|
|
9
|
+
* this function handles security logic.
|
|
10
|
+
*/
|
|
11
|
+
async function evaluateHook(adapter, rawInput, options) {
|
|
12
|
+
const input = adapter.parseInput(rawInput);
|
|
13
|
+
// Post-tool events → audit only
|
|
14
|
+
if (input.eventType === 'post') {
|
|
15
|
+
const skill = await adapter.inferInitiatingSkill(input);
|
|
16
|
+
(0, common_js_1.writeAuditLog)(input, null, skill);
|
|
17
|
+
return { decision: 'allow' };
|
|
18
|
+
}
|
|
19
|
+
// Build envelope
|
|
20
|
+
const initiatingSkill = await adapter.inferInitiatingSkill(input);
|
|
21
|
+
const envelope = adapter.buildEnvelope(input, initiatingSkill);
|
|
22
|
+
if (!envelope) {
|
|
23
|
+
return { decision: 'allow' };
|
|
24
|
+
}
|
|
25
|
+
// Fast check: sensitive file paths (Write/Edit)
|
|
26
|
+
const actionType = adapter.mapToolToActionType(input.toolName);
|
|
27
|
+
if (actionType === 'write_file') {
|
|
28
|
+
const filePath = input.toolInput.file_path ||
|
|
29
|
+
input.toolInput.path || '';
|
|
30
|
+
if ((0, common_js_1.isSensitivePath)(filePath)) {
|
|
31
|
+
const skillTag = initiatingSkill ? ` (via skill: ${initiatingSkill})` : '';
|
|
32
|
+
const reason = `GoPlus AgentGuard: blocked write to sensitive path "${filePath}"${skillTag}`;
|
|
33
|
+
(0, common_js_1.writeAuditLog)(input, { decision: 'deny', risk_level: 'critical', risk_tags: ['SENSITIVE_PATH'] }, initiatingSkill);
|
|
34
|
+
// In permissive mode, ask for user-initiated writes
|
|
35
|
+
if (options.config.level === 'permissive' && !initiatingSkill) {
|
|
36
|
+
return { decision: 'ask', reason, riskLevel: 'critical', riskTags: ['SENSITIVE_PATH'], initiatingSkill };
|
|
37
|
+
}
|
|
38
|
+
return { decision: 'deny', reason, riskLevel: 'critical', riskTags: ['SENSITIVE_PATH'], initiatingSkill };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Full ActionScanner evaluation
|
|
42
|
+
try {
|
|
43
|
+
const decision = await options.agentguard.actionScanner.decide(envelope);
|
|
44
|
+
// Skill trust policy enforcement
|
|
45
|
+
if (initiatingSkill) {
|
|
46
|
+
const policy = await (0, common_js_1.getSkillTrustPolicy)(initiatingSkill, options.agentguard.registry);
|
|
47
|
+
if (!policy.isKnown || policy.trustLevel === 'untrusted') {
|
|
48
|
+
if (!(0, common_js_1.isActionAllowedByCapabilities)(envelope.action.type, { can_exec: false, can_network: false, can_write: false, can_read: true, can_web3: false })) {
|
|
49
|
+
const reason = `GoPlus AgentGuard: untrusted skill "${initiatingSkill}" attempted ${envelope.action.type} — register it with /agentguard trust attest to allow`;
|
|
50
|
+
(0, common_js_1.writeAuditLog)(input, { decision: 'deny', risk_level: 'high', risk_tags: ['UNTRUSTED_SKILL', ...(decision.risk_tags || [])] }, initiatingSkill);
|
|
51
|
+
return { decision: 'ask', reason, riskLevel: 'high', riskTags: ['UNTRUSTED_SKILL'], initiatingSkill };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (policy.isKnown && policy.capabilities) {
|
|
55
|
+
if (!(0, common_js_1.isActionAllowedByCapabilities)(envelope.action.type, policy.capabilities)) {
|
|
56
|
+
const reason = `GoPlus AgentGuard: skill "${initiatingSkill}" is not allowed to ${envelope.action.type} per its trust policy`;
|
|
57
|
+
(0, common_js_1.writeAuditLog)(input, { decision: 'deny', risk_level: 'high', risk_tags: ['CAPABILITY_EXCEEDED', ...(decision.risk_tags || [])] }, initiatingSkill);
|
|
58
|
+
return { decision: 'deny', reason, riskLevel: 'high', riskTags: ['CAPABILITY_EXCEEDED'], initiatingSkill };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Write audit log
|
|
63
|
+
(0, common_js_1.writeAuditLog)(input, decision, initiatingSkill);
|
|
64
|
+
// Apply protection level thresholds
|
|
65
|
+
const skillTag = initiatingSkill ? ` (via skill: ${initiatingSkill})` : '';
|
|
66
|
+
const tags = (decision.risk_tags || []).join(', ');
|
|
67
|
+
if ((0, common_js_1.shouldDenyAtLevel)(decision, options.config)) {
|
|
68
|
+
return {
|
|
69
|
+
decision: 'deny',
|
|
70
|
+
reason: `GoPlus AgentGuard: ${decision.explanation || 'Action blocked'}${skillTag} [${tags}]`,
|
|
71
|
+
riskLevel: decision.risk_level,
|
|
72
|
+
riskTags: decision.risk_tags,
|
|
73
|
+
initiatingSkill,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if ((0, common_js_1.shouldAskAtLevel)(decision, options.config)) {
|
|
77
|
+
return {
|
|
78
|
+
decision: 'ask',
|
|
79
|
+
reason: `GoPlus AgentGuard: ${decision.explanation || 'Action requires confirmation'}${skillTag} [${tags}]`,
|
|
80
|
+
riskLevel: decision.risk_level,
|
|
81
|
+
riskTags: decision.risk_tags,
|
|
82
|
+
initiatingSkill,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return { decision: 'allow', initiatingSkill };
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Engine error → fail open
|
|
89
|
+
(0, common_js_1.writeAuditLog)(input, { decision: 'error', risk_level: 'low', risk_tags: ['ENGINE_ERROR'] }, initiatingSkill);
|
|
90
|
+
return { decision: 'allow' };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/adapters/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { HookAdapter, HookInput, HookOutput, EngineOptions, AgentGuardInstance } from './types.js';
|
|
2
|
+
export { ClaudeCodeAdapter } from './claude-code.js';
|
|
3
|
+
export { OpenClawAdapter } from './openclaw.js';
|
|
4
|
+
export { evaluateHook } from './engine.js';
|
|
5
|
+
export { registerOpenClawPlugin, getPluginIdFromTool, getPluginScanResult, type OpenClawPluginOptions, } from './openclaw-plugin.js';
|
|
6
|
+
export { loadConfig, isSensitivePath, shouldDenyAtLevel, shouldAskAtLevel, writeAuditLog, getSkillTrustPolicy, isActionAllowedByCapabilities, } from './common.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isActionAllowedByCapabilities = exports.getSkillTrustPolicy = exports.writeAuditLog = exports.shouldAskAtLevel = exports.shouldDenyAtLevel = exports.isSensitivePath = exports.loadConfig = exports.getPluginScanResult = exports.getPluginIdFromTool = exports.registerOpenClawPlugin = exports.evaluateHook = exports.OpenClawAdapter = exports.ClaudeCodeAdapter = void 0;
|
|
4
|
+
var claude_code_js_1 = require("./claude-code.js");
|
|
5
|
+
Object.defineProperty(exports, "ClaudeCodeAdapter", { enumerable: true, get: function () { return claude_code_js_1.ClaudeCodeAdapter; } });
|
|
6
|
+
var openclaw_js_1 = require("./openclaw.js");
|
|
7
|
+
Object.defineProperty(exports, "OpenClawAdapter", { enumerable: true, get: function () { return openclaw_js_1.OpenClawAdapter; } });
|
|
8
|
+
var engine_js_1 = require("./engine.js");
|
|
9
|
+
Object.defineProperty(exports, "evaluateHook", { enumerable: true, get: function () { return engine_js_1.evaluateHook; } });
|
|
10
|
+
var openclaw_plugin_js_1 = require("./openclaw-plugin.js");
|
|
11
|
+
Object.defineProperty(exports, "registerOpenClawPlugin", { enumerable: true, get: function () { return openclaw_plugin_js_1.registerOpenClawPlugin; } });
|
|
12
|
+
Object.defineProperty(exports, "getPluginIdFromTool", { enumerable: true, get: function () { return openclaw_plugin_js_1.getPluginIdFromTool; } });
|
|
13
|
+
Object.defineProperty(exports, "getPluginScanResult", { enumerable: true, get: function () { return openclaw_plugin_js_1.getPluginScanResult; } });
|
|
14
|
+
var common_js_1 = require("./common.js");
|
|
15
|
+
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return common_js_1.loadConfig; } });
|
|
16
|
+
Object.defineProperty(exports, "isSensitivePath", { enumerable: true, get: function () { return common_js_1.isSensitivePath; } });
|
|
17
|
+
Object.defineProperty(exports, "shouldDenyAtLevel", { enumerable: true, get: function () { return common_js_1.shouldDenyAtLevel; } });
|
|
18
|
+
Object.defineProperty(exports, "shouldAskAtLevel", { enumerable: true, get: function () { return common_js_1.shouldAskAtLevel; } });
|
|
19
|
+
Object.defineProperty(exports, "writeAuditLog", { enumerable: true, get: function () { return common_js_1.writeAuditLog; } });
|
|
20
|
+
Object.defineProperty(exports, "getSkillTrustPolicy", { enumerable: true, get: function () { return common_js_1.getSkillTrustPolicy; } });
|
|
21
|
+
Object.defineProperty(exports, "isActionAllowedByCapabilities", { enumerable: true, get: function () { return common_js_1.isActionAllowedByCapabilities; } });
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;AACA,mDAAqD;AAA5C,mHAAA,iBAAiB,OAAA;AAC1B,6CAAgD;AAAvC,8GAAA,eAAe,OAAA;AACxB,yCAA2C;AAAlC,yGAAA,YAAY,OAAA;AACrB,2DAK8B;AAJ5B,4HAAA,sBAAsB,OAAA;AACtB,yHAAA,mBAAmB,OAAA;AACnB,yHAAA,mBAAmB,OAAA;AAGrB,yCAQqB;AAPnB,uGAAA,UAAU,OAAA;AACV,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA;AACjB,6GAAA,gBAAgB,OAAA;AAChB,0GAAA,aAAa,OAAA;AACb,gHAAA,mBAAmB,OAAA;AACnB,0HAAA,6BAA6B,OAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GoPlus AgentGuard — OpenClaw Plugin
|
|
3
|
+
*
|
|
4
|
+
* Registers before_tool_call, after_tool_call, and session_start hooks
|
|
5
|
+
* with the OpenClaw plugin API to evaluate tool safety at runtime and
|
|
6
|
+
* auto-scan installed skills on session startup.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Auto-scan all loaded plugins on registration
|
|
10
|
+
* - Auto-scan skill directories (~/.openclaw/skills/, ~/.claude/skills/) on session_start
|
|
11
|
+
* - Auto-register plugins to AgentGuard trust registry
|
|
12
|
+
* - Build toolName → pluginId mapping for initiating skill inference
|
|
13
|
+
*
|
|
14
|
+
* Usage in OpenClaw plugin config:
|
|
15
|
+
* import agentguard from '@goplus/agentguard/openclaw';
|
|
16
|
+
* export default agentguard;
|
|
17
|
+
*
|
|
18
|
+
* Or register manually:
|
|
19
|
+
* import { registerOpenClawPlugin } from '@goplus/agentguard';
|
|
20
|
+
* registerOpenClawPlugin(api);
|
|
21
|
+
*/
|
|
22
|
+
import type { AgentGuardInstance } from './types.js';
|
|
23
|
+
import { SkillScanner } from '../scanner/index.js';
|
|
24
|
+
import { SkillRegistry } from '../registry/index.js';
|
|
25
|
+
/**
|
|
26
|
+
* OpenClaw plugin API interface (subset we use)
|
|
27
|
+
*/
|
|
28
|
+
interface OpenClawPluginApi {
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
source: string;
|
|
32
|
+
on(event: string, handler: (event: unknown, ctx?: unknown) => Promise<unknown>): void;
|
|
33
|
+
on(event: string, options: Record<string, unknown>, handler: (event: unknown, ctx?: unknown) => Promise<unknown>): void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Plugin registration options
|
|
37
|
+
*/
|
|
38
|
+
export interface OpenClawPluginOptions {
|
|
39
|
+
/** Protection level (strict/balanced/permissive) */
|
|
40
|
+
level?: string;
|
|
41
|
+
/** Enable auto-scanning of plugins (default: false — opt-in) */
|
|
42
|
+
skipAutoScan?: boolean;
|
|
43
|
+
/** Custom AgentGuard instance factory */
|
|
44
|
+
agentguardFactory?: () => AgentGuardInstance;
|
|
45
|
+
/** Custom scanner instance */
|
|
46
|
+
scanner?: SkillScanner;
|
|
47
|
+
/** Custom registry instance */
|
|
48
|
+
registry?: SkillRegistry;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get plugin ID from tool name
|
|
52
|
+
*/
|
|
53
|
+
export declare function getPluginIdFromTool(toolName: string): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* Get scan result for a plugin
|
|
56
|
+
*/
|
|
57
|
+
export declare function getPluginScanResult(pluginId: string): {
|
|
58
|
+
riskLevel: string;
|
|
59
|
+
riskTags: string[];
|
|
60
|
+
} | null;
|
|
61
|
+
/**
|
|
62
|
+
* Register AgentGuard hooks with OpenClaw plugin API
|
|
63
|
+
*/
|
|
64
|
+
export declare function registerOpenClawPlugin(api: OpenClawPluginApi, options?: OpenClawPluginOptions): void;
|
|
65
|
+
/**
|
|
66
|
+
* Default export for OpenClaw plugin registration
|
|
67
|
+
*
|
|
68
|
+
* Usage: export default from '@goplus/agentguard/openclaw'
|
|
69
|
+
*/
|
|
70
|
+
export default function register(api: OpenClawPluginApi): void;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=openclaw-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-plugin.d.ts","sourceRoot":"","sources":["../../src/adapters/openclaw-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AASH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA0BrD;;GAEG;AACH,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACtF,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CACzH;AAkGD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,kBAAkB,CAAC;IAC7C,8BAA8B;IAC9B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AA6HD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAEtG;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,iBAAiB,EACtB,OAAO,GAAE,qBAA0B,GAClC,IAAI,CA8GN;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAE7D"}
|